From a1942c84621a72445f2f62eafdc99b415135d2e4 Mon Sep 17 00:00:00 2001 From: irsbeyer Date: Thu, 15 Jul 2021 17:27:51 +0200 Subject: [PATCH 001/495] New: Radiation module with new parallezation concept --- CMakeLists.txt | 6 +- src/init/define_parameters_init.f90 | 8 + src/init/piclas_init.f90 | 9 + .../radiation_solver/exportspectrum.f90 | 94 ++ .../radiation_solver/radiation_atoms.f90 | 513 +++++++ .../radiation_solver/radiation_continuum.f90 | 389 +++++ .../radiation_solver/radiation_excitation.f90 | 168 +++ .../radiation_solver/radiation_init.f90 | 336 +++++ .../radiation_instrbroadening.f90 | 152 ++ .../radiation_solver/radiation_main.f90 | 143 ++ .../radiation_solver/radiation_molecules.f90 | 1267 +++++++++++++++++ .../radiation_solver/radiation_readin.f90 | 303 ++++ .../radiation_solver/radiation_vars.f90 | 106 ++ .../radiative_transfer/radtrans_init.f90 | 431 ++++++ .../radiative_transfer/radtrans_vars.f90 | 60 + src/timedisc/timedisc.f90 | 2 + src/timedisc/timedisc_TimeStep_Radiation.f90 | 50 + src/timedisc/timedisc_init.f90 | 4 +- 18 files changed, 4039 insertions(+), 2 deletions(-) create mode 100644 src/radiation/radiation_solver/exportspectrum.f90 create mode 100644 src/radiation/radiation_solver/radiation_atoms.f90 create mode 100644 src/radiation/radiation_solver/radiation_continuum.f90 create mode 100644 src/radiation/radiation_solver/radiation_excitation.f90 create mode 100644 src/radiation/radiation_solver/radiation_init.f90 create mode 100644 src/radiation/radiation_solver/radiation_instrbroadening.f90 create mode 100644 src/radiation/radiation_solver/radiation_main.f90 create mode 100644 src/radiation/radiation_solver/radiation_molecules.f90 create mode 100644 src/radiation/radiation_solver/radiation_readin.f90 create mode 100644 src/radiation/radiation_solver/radiation_vars.f90 create mode 100644 src/radiation/radiative_transfer/radtrans_init.f90 create mode 100644 src/radiation/radiative_transfer/radtrans_vars.f90 create mode 100644 src/timedisc/timedisc_TimeStep_Radiation.f90 diff --git a/CMakeLists.txt b/CMakeLists.txt index 56bf22eb0..4ecb0c242 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -146,7 +146,8 @@ SET_PROPERTY(CACHE PICLAS_TIMEDISCMETHOD PROPERTY STRINGS Euler-Explicit ROS3 ROS4 ROS46 - ROS6) + ROS6 + Radiation) # Get environment variable SET(PICLAS_SPLIT_TYPE "$ENV{PICLAS_SPLIT_TYPE}") @@ -366,6 +367,9 @@ ELSEIF(PICLAS_TIMEDISCMETHOD STREQUAL "FP-Flow") ELSEIF(PICLAS_TIMEDISCMETHOD STREQUAL "BGK-Flow") FILE(GLOB timediscF90 ${CMAKE_CURRENT_SOURCE_DIR}/src/timedisc/timedisc_TimeStep_BGK.f90) ADD_DEFINITIONS(-DPP_TimeDiscMethod=400) +ELSEIF(PICLAS_TIMEDISCMETHOD STREQUAL "Radiation") + FILE(GLOB timediscF90 ${CMAKE_CURRENT_SOURCE_DIR}/src/timedisc/timedisc_TimeStep_Radiation.f90) + ADD_DEFINITIONS(-DPP_TimeDiscMethod=600) ELSE() MESSAGE(SEND_ERROR "Unknown time discretization method.") ENDIF() diff --git a/src/init/define_parameters_init.f90 b/src/init/define_parameters_init.f90 index 89f54fb68..3f7ff9fcd 100644 --- a/src/init/define_parameters_init.f90 +++ b/src/init/define_parameters_init.f90 @@ -81,6 +81,10 @@ SUBROUTINE InitDefineParameters() USE MOD_DSMC_Symmetry ,ONLY: DefineParametersParticleSymmetry USE MOD_SuperB_Init ,ONLY: DefineParametersSuperB #endif +#if (PP_TimeDiscMethod==600) +USE MOD_RadiationTrans_Init ,ONLY: DefineParametersRadiationTransport +USE MOD_Radiation_Init ,ONLY: DefineParametersRadiation +#endif !----------------------------------------------------------------------------------------------------------------------------------! ! Insert modules here !----------------------------------------------------------------------------------------------------------------------------------! @@ -141,6 +145,10 @@ SUBROUTINE InitDefineParameters() #if (PP_TimeDiscMethod==400) CALL DefineParametersBGK() #endif +#if (PP_TimeDiscMethod==600) +CALL DefineParametersRadiation() +CALL DefineParametersRadiationTrans() +#endif CALL DefineParametersSurfModel() CALL DefineParametersSurfModelAnalyze() #ifdef MPI diff --git a/src/init/piclas_init.f90 b/src/init/piclas_init.f90 index 7a3fc6323..11b029ded 100644 --- a/src/init/piclas_init.f90 +++ b/src/init/piclas_init.f90 @@ -105,6 +105,10 @@ SUBROUTINE InitPiclas(IsLoadBalance) #if USE_HDG USE MOD_HDG ,ONLY: InitHDG #endif +#if (PP_TimeDiscMethod==600) +USE MOD_RadiationTrans_Init ,ONLY: InitRadiationTransport +USE MOD_Radiation_Init ,ONLY: InitRadiation +#endif USE MOD_Interfaces ,ONLY: InitInterfaces USE MOD_ReadInTools ,ONLY: GETLOGICAL,GETREALARRAY,GETINT USE MOD_TimeDisc_Vars ,ONLY: TEnd @@ -210,6 +214,11 @@ SUBROUTINE InitPiclas(IsLoadBalance) CALL InitHDG() ! Hybridizable Discontinuous Galerkin Method (HDGSEM) #endif +#if (PP_TimeDiscMethod==600) +CALL InitRadiation() +CALL InitRadiationTransport() +#endif + #ifdef PARTICLES ! Old IMD format CALL InitTTM() ! FD grid based data from a Two-Temperature Model (TTM) from Molecular Dynamics (MD) Code IMD diff --git a/src/radiation/radiation_solver/exportspectrum.f90 b/src/radiation/radiation_solver/exportspectrum.f90 new file mode 100644 index 000000000..c4e5f8244 --- /dev/null +++ b/src/radiation/radiation_solver/exportspectrum.f90 @@ -0,0 +1,94 @@ +!================================================================================================================================== +! Copyright (c) 2010 - 2019 Prof. Claus-Dieter Munz and Prof. Stefanos Fasoulas +! +! This file is part of PICLas (gitlab.com/piclas/piclas). PICLas is free software: you can redistribute it and/or modify +! it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 +! of the License, or (at your option) any later version. +! +! PICLas is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty +! of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License v3.0 for more details. +! +! You should have received a copy of the GNU General Public License along with PICLas. If not, see . +!================================================================================================================================== +#include "piclas.h" + +MODULE MOD_Radiation_ExportSpectrum +!=================================================================================================================================== +! Module for Radiation +!=================================================================================================================================== +! MODULES +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +PRIVATE + +INTERFACE radiation_exportspectrum + MODULE PROCEDURE radiation_exportspectrum +END INTERFACE + +!----------------------------------------------------------------------------------------------------------------------------------- +! GLOBAL VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! Private Part --------------------------------------------------------------------------------------------------------------------- +! Public Part ---------------------------------------------------------------------------------------------------------------------- +PUBLIC :: radiation_exportspectrum +!=================================================================================================================================== + +CONTAINS + + +SUBROUTINE radiation_exportspectrum(iElement, output_format) +!=================================================================================================================================== +! exports spectral emission and absorption to *.dat-files +! +! Radiation_Emission_Absorption_xx_iGlobalElement(:,3) -> wavelength, emission (W/m3/str/m), absorption (1/m)) +! +! further formats can be added to output_format, currently available: +! 1: gnuplot +! 2: tikz +!=================================================================================================================================== +! MODULES + USE MOD_Radiation_Vars, ONLY: RadiationParameter, Radiation_Emission_spec, Radiation_Absorption_spec + USE MOD_Mesh_Vars, ONLY: offsetElem +! IMPLICIT VARIABLE HANDLING + IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES + INTEGER, INTENT(IN) :: iElement, output_format +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES + INTEGER :: w, io_error, iGlobalElement,m + CHARACTER(32) :: hilf +!=================================================================================================================================== + + iGlobalElement = iElement + offsetElem + WRITE(UNIT=hilf,FMT='(I0)') iGlobalElement + + SELECT CASE(output_format) + + CASE(1) !Output for gnuplot + OPEN(unit=20,file='Radiation_Emission_Absorption_'//TRIM(hilf)//'.dat', status='replace',action='write',iostat=io_error) + DO w=1, RadiationParameter%WaveLenDiscr + WRITE(20,*) RadiationParameter%WaveLen(w)*1.E10, Radiation_Emission_spec(w,iElement), Radiation_Absorption_spec(w,iElement) + END DO + CLOSE(unit=20) + + CASE(2)!Output for pgfplots + OPEN(unit=20,file='Radiation_Emission_Absorption_tikz_'//TRIM(hilf)//'.dat', status='replace',action='write',iostat=io_error) + WRITE(20,*) 'x,y1,y2' + DO w=1, RadiationParameter%WaveLenDiscr + WRITE(20,*) RadiationParameter%WaveLen(w)*1.E10,',',Radiation_Emission_spec(w,iElement),',', & + Radiation_Absorption_spec(w,iElement) + END DO + CLOSE(unit=20) + + CASE DEFAULT + WRITE(*,*) 'output format is not defined' + + END SELECT + +END SUBROUTINE radiation_exportspectrum + + +END MODULE MOD_Radiation_ExportSpectrum diff --git a/src/radiation/radiation_solver/radiation_atoms.f90 b/src/radiation/radiation_solver/radiation_atoms.f90 new file mode 100644 index 000000000..1a6cea3b6 --- /dev/null +++ b/src/radiation/radiation_solver/radiation_atoms.f90 @@ -0,0 +1,513 @@ +!================================================================================================================================== +! Copyright (c) 2010 - 2019 Prof. Claus-Dieter Munz and Prof. Stefanos Fasoulas +! +! This file is part of PICLas (gitlab.com/piclas/piclas). PICLas is free software: you can redistribute it and/or modify +! it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 +! of the License, or (at your option) any later version. +! +! PICLas is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty +! of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License v3.0 for more details. +! +! You should have received a copy of the GNU General Public License along with PICLas. If not, see . +!================================================================================================================================== +#include "piclas.h" + +MODULE MOD_Radiation_Atoms +!=================================================================================================================================== +! Module for Radiation +!=================================================================================================================================== +! MODULES +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +PRIVATE + +INTERFACE radiation_atoms + MODULE PROCEDURE radiation_atoms +END INTERFACE + +!----------------------------------------------------------------------------------------------------------------------------------- +! GLOBAL VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! Private Part --------------------------------------------------------------------------------------------------------------------- +! Public Part ---------------------------------------------------------------------------------------------------------------------- +PUBLIC :: radiation_atoms +!=================================================================================================================================== + +CONTAINS + + +SUBROUTINE radiation_atoms(iElem, em_atom) +!=================================================================================================================================== +! Main routine of atom radiation calculation +!=================================================================================================================================== +! MODULES + USE MOD_Globals + USE MOD_Globals_Vars, ONLY : BoltzmannConst, PlanckConst, ElementaryCharge + USE MOD_Radiation_Vars, ONLY : RadiationInput, RadiationParameter, SpeciesRadiation, & + Radiation_Emission_spec, Radiation_Absorption_spec, & + NumDensElectrons, Radiation_ElemEnergy_Species + USE MOD_Particle_Vars, ONLY : nSpecies + USE MOD_Equation_Vars, ONLY : c + USE MOD_Globals_Vars, ONLY : Pi + USE MOD_DSMC_Vars, ONLY : SpecDSMC +!USE MOD_Radiation_Excitation, ONLY : low_IonizationPot + +! IMPLICIT VARIABLE HANDLING + IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES + REAL, INTENT(INOUT) :: em_atom + INTEGER, INTENT(IN) :: iElem +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES + + REAL :: c_emi, c_abs, c_dopp + REAL :: rho, ntot !in ini + REAL :: sigma_ij, coll_freq_ij, T_mean + INTEGER :: i, k, l, iSpec, jSpec, iWave!, hilf, w + INTEGER :: nLines_considered !number of calculated transition lines + REAL :: etot, abstot + REAL, ALLOCATABLE :: epsilon_at(:), epsilon_iSpec(:), abs_iSpec(:) + REAL :: cwav + REAL :: Dlaml, Dlamd, Dlamn, Dlamp, Dlams, Dlamr, Dlamvw !line broadening mechanisms + + REAL :: low_IonizationPot !from excitation + REAL, ALLOCATABLE :: lamnu(:) + REAL :: wrange, wleft, wright + REAL :: dpar, beta, rpar, Dlamv + INTEGER, PARAMETER:: Voigt_int_nmax = 1001 + REAL, PARAMETER :: Voigt_mult_discr = 25. + REAL :: Voigt_int(-Voigt_int_nmax:Voigt_int_nmax), Voigt_int_step, Voigt + REAL :: Voigt_var1, Voigt_const1, Voigt_const2, Voigt_int_distmax, Voigt_arg_dimless, Voigt_int_NormEnergy + INTEGER :: iVoigt + REAL :: Voigt_dist1, Voigt_dist2, Voigt_dist225 + REAL, ALLOCATABLE :: Radiation_Profile(:) + REAL :: TempOut_Em, TempOut_Abs +!=================================================================================================================================== + +! --- initialize emission coefficient + ALLOCATE(epsilon_at(RadiationParameter%WaveLenDiscr)) + ALLOCATE(epsilon_iSpec(RadiationParameter%WaveLenDiscr)) + ALLOCATE(abs_iSpec(RadiationParameter%WaveLenDiscr)) + ALLOCATE(Radiation_Profile(RadiationParameter%WaveLenDiscr)) + DO iWave=1, RadiationParameter%WaveLenDiscr + epsilon_at(iWave) = 0.0 !Radiation_Emission_spec(iWave,iElem) + END DO + +! --- loop for ntot and rho over all atoms + rho = 0.0 + ntot = 0.0 + + DO jSpec = 1, nSpecies + rho = rho + RadiationInput(jSpec)%NumDens * RadiationInput(jSpec)%Mass + ntot = ntot + RadiationInput(jSpec)%NumDens + END DO + +! --- calculation of constants + c_emi = PlanckConst * c / (4.*Pi) + c_abs = 1. / (8.*Pi*c) + c_dopp = SQRT(8.*BoltzmannConst*0.69315)/c + + + DO iSpec = 1, nSpecies + IF((SpecDSMC(iSpec)%InterID .NE. 1) .AND. (SpecDSMC(iSpec)%InterID .NE. 10)) CYCLE + IF (RadiationInput(iSpec)%Telec.LE.0.0) CYCLE + ALLOCATE(lamnu(SpeciesRadiation(iSpec)%nLines)) + + lamnu = 0.0 + Radiation_Profile = 0.0 + epsilon_iSpec = 0.0 + abs_iSpec = 0.0 + + IF ((SpeciesRadiation(iSpec)%nLevels.NE.0) .OR. (SpeciesRadiation(iSpec)%nLines.NE.0)) THEN + + DO l=1,SpeciesRadiation(iSpec)%nLines + lamnu(NINT(SpeciesRadiation(iSpec)%Level(SpeciesRadiation(iSpec)%LinesInt(l,2),3))) & + = lamnu(NINT(SpeciesRadiation(iSpec)%Level(SpeciesRadiation(iSpec)%LinesInt(l,2),3))) & + + SpeciesRadiation(iSpec)%LinesReal(l,2) + END DO + + low_IonizationPot = 2.9E-8*SQRT(NumDensElectrons/1.E6/MAX(1.,RadiationInput(iSpec)%Telec))*ElementaryCharge + + ! --- total collisional frequency for phase broadening + coll_freq_ij=0.0 + DO jSpec = 1, nSpecies + sigma_ij = Pi*(RadiationInput(iSpec)%Radius + RadiationInput(jSpec)%Radius)**2 + T_mean = (RadiationInput(iSpec)%Mass*RadiationInput(iSpec)%NumDens*RadiationInput(iSpec)%Ttrans(4)+ & + RadiationInput(jSpec)%Mass*RadiationInput(jSpec)%NumDens*RadiationInput(jSpec)%Ttrans(4)) / & + (RadiationInput(iSpec)%Mass*RadiationInput(iSpec)%NumDens+RadiationInput(jSpec)%Mass*RadiationInput(jSpec)%NumDens) + coll_freq_ij = coll_freq_ij + 2.0 * RadiationInput(iSpec)%NumDens * RadiationInput(jSpec)%NumDens * sigma_ij & + * SQRT(2*BoltzmannConst * T_mean * (RadiationInput(iSpec)%Mass + RadiationInput(jSpec)%Mass) & + / (Pi*RadiationInput(iSpec)%Mass*RadiationInput(jSpec)%Mass)) + ! coll_freq_ij = coll_freq_ij + 2.0 * RadiationInput(iSpec)%NumDens * RadiationInput(iSpec)%NumDens * sigma_ij & + ! * SQRT(2*BoltzmannConst* RadiationInput(iSpec)%Ttrans(4) * (RadiationInput(iSpec)%Mass + RadiationInput(jSpec)%Mass) & + ! / (Pi*RadiationInput(iSpec)%Mass*RadiationInput(jSpec)%Mass)) + END DO + + nLines_considered = 0 + + ! --- loop over all transition lines + DO k=1,SpeciesRadiation(iSpec)%nLines + + IF (SpeciesRadiation(iSpec)%Level(NINT(SpeciesRadiation(iSpec)%Level(SpeciesRadiation(iSpec)%LinesInt(k,2),3)),2) & + .LE. (RadiationInput(iSpec)%IonizationEn - low_IonizationPot)) THEN + + ! --- local emission and absorption coefficients + etot = c_emi * REAL(SpeciesRadiation(iSpec)%LinesInt(k,4)) & + / SpeciesRadiation(iSpec)%Level(NINT(SpeciesRadiation(iSpec)%Level(SpeciesRadiation(iSpec)%LinesInt(k,2),3)),1) & + * SpeciesRadiation(iSpec)%NumDensExc(NINT(SpeciesRadiation(iSpec)%Level(SpeciesRadiation(iSpec)%LinesInt(k,2),3))) & + * SpeciesRadiation(iSpec)%LinesReal(k,2) / (SpeciesRadiation(iSpec)%LinesReal(k,1)) + abstot = c_abs * (SpeciesRadiation(iSpec)%LinesReal(k,1))**4 * SpeciesRadiation(iSpec)%LinesReal(k,2) & + * (REAL(SpeciesRadiation(iSpec)%LinesInt(k,4)) & + / SpeciesRadiation(iSpec)%Level(NINT(SpeciesRadiation(iSpec)%Level(SpeciesRadiation(iSpec)%LinesInt(k,1),3)),1) & + * SpeciesRadiation(iSpec)%NumDensExc(NINT(SpeciesRadiation(iSpec)%Level(SpeciesRadiation(iSpec)%LinesInt(k,1),3))) & + - REAL(SpeciesRadiation(iSpec)%LinesInt(k,4)) & + / SpeciesRadiation(iSpec)%Level(NINT(SpeciesRadiation(iSpec)%Level(SpeciesRadiation(iSpec)%LinesInt(k,2),3)),1) & + * SpeciesRadiation(iSpec)%NumDensExc(NINT(SpeciesRadiation(iSpec)%Level(SpeciesRadiation(iSpec)%LinesInt(k,2),3))) ) + + ! --- broadening mechanisms + cwav = ((SpeciesRadiation(iSpec)%LinesReal(k,1))**2) / c + + ! --- Stark broadening + Dlams = 2.*RadiationInput(iSpec)%NumDens*SpeciesRadiation(iSpec)%LinesReal(k,3) & + * (RadiationInput(iSpec)%Telec*1.E-4)**RadiationInput(iSpec)%Starkex*1.E-32 + + ! --- Van der Waals broadening + Dlamvw = 20.0 * cwav * 4.5214D-18 * ntot * (3.* BoltzmannConst* RadiationInput(iSpec)%Ttrans(4)*ntot/rho)**.3 + + ! --- natural broadening + Dlamn = cwav * (lamnu(NINT(SpeciesRadiation(iSpec)%Level(SpeciesRadiation(iSpec)%LinesInt(k,2),3))) & + + lamnu(NINT(SpeciesRadiation(iSpec)%Level(SpeciesRadiation(iSpec)%LinesInt(k,1),3)))) + + ! --- Lorentz (phase) broadening + Dlamp = 2.0 * cwav * coll_freq_ij / RadiationInput(iSpec)%NumDens + + ! --- Resonance broadening (NEQAIR) + Dlamr = 1.03*1.E-11 * SQRT( REAL(SpeciesRadiation(iSpec)%LinesInt(k,4))/REAL(SpeciesRadiation(iSpec)%LinesInt(k,3)) ) & + * (SpeciesRadiation(iSpec)%LinesReal(k,1))**5 * SpeciesRadiation(iSpec)%LinesReal(k,2) & + * SpeciesRadiation(iSpec)%NumDensExc(NINT(SpeciesRadiation(iSpec)%Level(SpeciesRadiation(iSpec)%LinesInt(k,1),3))) + + ! --- Total Lorentz width + Dlaml = Dlams + Dlamvw + Dlamn + Dlamp + Dlamr + + ! --- Doppler broadening + Dlamd = c_dopp*SpeciesRadiation(iSpec)%LinesReal(k,1)*SQRT(RadiationInput(iSpec)%Ttrans(4)/RadiationInput(iSpec)%Mass ) + + ! --- determine actual wavelength range to be calculated + wrange = 100. * MAX(Dlaml,Dlamd) + wleft = MAX(RadiationParameter%WaveLen(1), SpeciesRadiation(iSpec)%LinesReal(k,1) - wrange ) + wright = MIN(RadiationParameter%WaveLen(RadiationParameter%WaveLenDiscr), SpeciesRadiation(iSpec)%LinesReal(k,1) + wrange) + + ! --- check if line is within range + IF ( wright .GE. RadiationParameter%WaveLen(1) & + .AND. wleft .LE. RadiationParameter%WaveLen(RadiationParameter%WaveLenDiscr)) THEN + + nLines_considered = nLines_considered + 1 + + ! --- parameters for Voigt line profiles + dpar = (Dlaml-Dlamd) / (Dlaml+Dlamd) + beta = 0.023665 * EXP(0.6*dpar) + 0.00418 * EXP(-1.9*dpar) + rpar = 1. - 0.18121 * (1.-dpar**2) - beta * SIN(Pi*dpar) + Dlamv = rpar*(Dlaml+Dlamd) + + ! --- generate Voigt line profile + Voigt_int(-Voigt_int_nmax) = 0. !initialize Voigt profile + Voigt_int( Voigt_int_nmax) = 1. + + Voigt_int_distmax = Voigt_mult_discr * Dlamv !determine discretised interval + Voigt_arg_dimless = Dlaml/Dlamv + Voigt_var1 = 1./((1.065 + (0.447 + 0.058 * Voigt_arg_dimless) * Voigt_arg_dimless) * Dlamv) + Voigt_const2 = Voigt_arg_dimless * Voigt_var1 + Voigt_const1 = Voigt_var1 - Voigt_const2 + Voigt_int_step = Voigt_int_distmax / (Voigt_int_nmax-1) !step width + + DO iVoigt = -(Voigt_int_nmax-1), 0 !determine lower half of Voigt profile + Voigt_dist1 = REAL(ABS(iVoigt)) * Voigt_int_step / (Dlamv) + Voigt_dist2 = Voigt_dist1**2 + Voigt_dist225 = Voigt_dist2 * SQRT(SQRT(Voigt_dist1)) + + Voigt = Voigt_const1 * EXP(-2.772*Voigt_dist2) + Voigt_const2 / (1.+4.*Voigt_dist2) & + + 0.016 * Voigt_const2 * (1.-Voigt_arg_dimless) * (EXP(-0.4*Voigt_dist225) & + - 10. / (10. + Voigt_dist225)) + + Voigt_int(iVoigt) = Voigt_int(iVoigt-1) + Voigt * Voigt_int_step + END DO + + DO iVoigt = 1, (Voigt_int_nmax-1) ! determine upper half of Voigt profile + Voigt_int(iVoigt) = 2. * Voigt_int(0) - Voigt_int(-iVoigt) + END DO + + Voigt_int_NormEnergy = 1./ Voigt_int(Voigt_int_nmax-1) + + DO iVoigt = -(Voigt_int_nmax-1), (Voigt_int_nmax-1) ! normalize profiles that energy below the Voigt profile function is 1 (integrated profiles are normed to 1) + Voigt_int(iVoigt) = Voigt_int(iVoigt) * Voigt_int_NormEnergy + END DO + + ! IF(eps .GE. 1.0E-25) THEN + CALL Radiation_Atomic_Transition_Line_Profile(Radiation_Profile, SpeciesRadiation(iSpec)%LinesReal(k,1), Voigt_int, Voigt_int_distmax, & + Dlaml, Dlamv, epsilon_at, epsilon_iSpec, etot, Radiation_Absorption_spec, abs_iSpec, abstot, iElem) + ! END IF + + END IF + + END IF + + END DO + +! hilf = LEN_TRIM(RadiationInput(iSpec)%RadiationSpectraFileName) +! RadiationInput(iSpec)%RadiationSpectraFileName = RadiationInput(iSpec)%RadiationSpectraFileName(1:hilf-4) +! WRITE(*,*) 'calculated ',nLines_considered,' bound-bound lines of ', TRIM(RadiationInput(iSpec)%RadiationSpectraFileName) + + END IF + + TempOut_Em = 0.0 + TempOut_Abs = 0.0 + DO iWave=1, RadiationParameter%WaveLenDiscr + TempOut_Em = TempOut_Em + 4.*Pi*epsilon_iSpec(iWave)*RadiationParameter%WaveLenIncr + TempOut_Abs = TempOut_Abs + abs_iSpec(iWave)*RadiationParameter%WaveLenIncr + END DO + Radiation_ElemEnergy_Species(iSpec,iElem,1) = TempOut_Em + Radiation_ElemEnergy_Species(iSpec,iElem,2) = TempOut_Abs + + DEALLOCATE(lamnu) + + END DO + + DO iWave = 1, RadiationParameter%WaveLenDiscr + Radiation_Emission_spec(iWave,iElem) = Radiation_Emission_spec(iWave,iElem) + epsilon_at(iWave) + END DO + +! --- add contribution to total emission + em_atom = epsilon_at(1) * RadiationParameter%WaveLenIncr + DO i=2, RadiationParameter%WaveLenDiscr + em_atom = em_atom + epsilon_at(i) * RadiationParameter%WaveLenIncr + END DO + + ! WRITE(*,*) '*** ATOMIC BOUND-BOUND RADIATION SUCCESSFULLY DONE ***' + ! WRITE(*,*) '' + +END SUBROUTINE radiation_atoms + + + + +SUBROUTINE Radiation_Atomic_Transition_Line_Profile(Radiation_Profile, wavelength, Voigt_int, Voigt_int_distmax, DlamL, DlamV, & + epsilon_mol, epsilon_iSpec, eps, Radiation_Absorption_spec, abs_iSpec, abstot, iElem) +!=================================================================================================================================== +! calculates emission profile functions and adds radiative energy to emission array +!=================================================================================================================================== +! MODULES + USE MOD_Globals + USE MOD_Radiation_Vars, ONLY : RadiationParameter + USE MOD_Globals_Vars, ONLY : Pi +! IMPLICIT VARIABLE HANDLING + IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES + REAL, INTENT(INOUT) :: Radiation_Profile(:), epsilon_mol(:), epsilon_iSpec(:), Radiation_Absorption_spec(:,:), & + abs_iSpec(:) + REAL, INTENT(IN) :: wavelength, Voigt_int_distmax, Dlaml, Dlamv, eps, abstot, Voigt_int(-1001:1001) + INTEGER, INTENT(IN) :: iElem +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES + INTEGER :: startwavelength_int, endwavelength_int, i, iVoigt + LOGICAL :: add_radline + REAL :: line_energy_fraction, Voigt_int_value, Voigt_int_value_old, hilf +!=================================================================================================================================== + ! --- determination of indices for first and last entry of Voigt-profiles on wavelength axis + startwavelength_int = INT(MAX(1.0 & + , (((wavelength - Voigt_int_distmax - RadiationParameter%MinWaveLen) / RadiationParameter%WaveLenIncr) + 1.0))) + endwavelength_int = INT(MIN(REAL(RadiationParameter%WaveLenDiscr) & + , (((wavelength + Voigt_int_distmax - RadiationParameter%MinWaveLen) / RadiationParameter%WaveLenIncr) + 1.0))) + +! startwavelength_int = MAX(1, INT((wavelength - Voigt_int_distmax & +! - RadiationParameter%MinWaveLen) / RadiationParameter%WaveLenIncr) + 1) +! endwavelength_int = MIN(RadiationParameter%WaveLenDiscr, INT((wavelength & +! + Voigt_int_distmax - RadiationParameter%MinWaveLen) / RadiationParameter%WaveLenIncr) + 1) + + add_radline = .FALSE. + line_energy_fraction = 0. + + IF ( (startwavelength_int .LT. endwavelength_int) .AND. & + ((wavelength+Voigt_int_distmax) .GT. RadiationParameter%MinWaveLen) .AND. & + ((wavelength-Voigt_int_distmax) .LT. RadiationParameter%MaxWaveLen) ) THEN + + add_radline = .TRUE. + + ! --- check whether line is dispersive +! IF(Dlaml/Dlamv .GE. 0.9) THEN + +! ! --- simplified computation of line profile if line is dispersive +! Voigt_int_value_old = 1. / Pi * ATAN(2./(DlamV) & +! * (RadiationParameter%WaveLen(startwavelength_int-1)-wavelength)) + +! line_energy_fraction = - Voigt_int_value_old + +! DO iVoigt = (startwavelength_int-1), (endwavelength_int-1) +! Voigt_int_value = 1. / Pi * ATAN(2./(Dlamv) & +! * (RadiationParameter%WaveLen(iVoigt)-wavelength)) +! Radiation_Profile(iVoigt+1) = Voigt_int_value - Voigt_int_value_old +! Voigt_int_value_old = Voigt_int_value +! END DO + +! line_energy_fraction = line_energy_fraction + Voigt_int_value + +! DO iVoigt=(startwavelength_int-1), (endwavelength_int-1) +! Radiation_Profile(iVoigt+1) = Radiation_Profile(iVoigt+1) / RadiationParameter%WaveLenIncr +! END DO + +! ELSE + + ! --- determine transition lines of previous computed Voigt-profiles + CALL Radiation_Voigt_wavelength_interpolation(Voigt_int, Voigt_int_distmax, wavelength, & + Radiation_Profile, line_energy_fraction, startwavelength_int, endwavelength_int) + +! END IF + + IF (add_radline) THEN + + ! --- add radiative energy to emission + DO i=0 , (endwavelength_int-startwavelength_int + 0) + epsilon_iSpec(startwavelength_int+i) & + = epsilon_iSpec(startwavelength_int+i) + MAX(0.0,eps) * Radiation_Profile(startwavelength_int+i) + epsilon_mol(startwavelength_int+i) & + = epsilon_mol(startwavelength_int+i) + MAX(0.0,eps) * Radiation_Profile(startwavelength_int+i) + abs_iSpec(startwavelength_int+i) & + = abs_iSpec(startwavelength_int+i)+MAX(0.0,abstot)*Radiation_Profile(startwavelength_int+i) + Radiation_Absorption_spec(startwavelength_int+i,iElem) & + = Radiation_Absorption_spec(startwavelength_int+i,iElem)+MAX(0.0,abstot)*Radiation_Profile(startwavelength_int+i) + END DO + +!! ! --- add contribution to total emission +!! em_atom = em_atom + line_energy_fraction * etot + +!! ! --- add radiative energy to emission +!! DO i=0 , (endwavelength_int-startwavelength_int + 0) +!! Radiation_Emission_spec(startwavelength_int+i,iElem) & +!! = Radiation_Emission_spec(startwavelength_int+i,iElem) & +!! + etot * Radiation_Profile(startwavelength_int+i) +!! Radiation_Absorption_spec(startwavelength_int+i,iElem) & +!! = Radiation_Absorption_spec(startwavelength_int+i,iElem) & +!! + abstot * Radiation_Profile(startwavelength_int+i) +!! END DO + + END IF + + END IF + +END SUBROUTINE Radiation_Atomic_Transition_Line_Profile + + + + +SUBROUTINE Radiation_Voigt_wavelength_interpolation(Voigt_int, Voigt_int_distmax, centerwavelength, & + Radiation_Profile, line_energy_fraction, startwavelength_int, endwavelength_int) +!=================================================================================================================================== +! distributes transition lines with precomputed integrated Voigt-profiles (Voigt_int) +!=================================================================================================================================== +! MODULES + USE MOD_Globals + USE MOD_Globals + USE MOD_Radiation_Vars, ONLY : RadiationParameter +! IMPLICIT VARIABLE HANDLING + IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES + REAL, INTENT(IN) :: Voigt_int(-1001:1001), centerwavelength, Voigt_int_distmax + ! TODO Voigt_int_nmax in Voigt_int(:) + REAL, INTENT(INOUT) :: Radiation_Profile(:), line_energy_fraction + INTEGER, INTENT(INOUT) :: startwavelength_int, endwavelength_int +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES + INTEGER, PARAMETER :: Voigt_int_nmax = 1001 + INTEGER :: i!, width_int + REAL :: startvalue, Voigt_int_value, Voigt_int_value_old + REAL :: weighting_int_left, weighting_int_right + INTEGER :: index_left,index_right + !REAL, ALLOCATABLE :: help_Radiation_Profile(:) +!=================================================================================================================================== + +! --- extrapolation of left point + startvalue = Voigt_int(-Voigt_int_nmax) & + - (Voigt_int(-Voigt_int_nmax+1)-Voigt_int(-Voigt_int_nmax))/RadiationParameter%WaveLenIncr & + * (centerwavelength - Voigt_int_distmax - RadiationParameter%WaveLen(startwavelength_int)) + IF (startvalue .LT. 0.0) startvalue = 0.0 + +! --- determination of number of wavelength array indices within the corresponding Voigt profile width +! width_int = endwavelength_int - startwavelength_int + +! IF (width_int .EQ. 0.0) THEN +! WRITE(*,'(A,F8.4,A)') 'Warning: line at ', centerwavelength*1.E9, & +! 'nm is neglected due to a too small wavelength discretization' +! END IF + +! --- determination of transition lines + Radiation_Profile(startwavelength_int) = startvalue +! Radiation_Profile(endwavelength_int+1) = 1.0 + + Voigt_int_value_old = 0.0!startvalue !TODO: check! + Voigt_int_value = 0.0 + +!line_energy_fraction = - Voigt_int_value_old + + DO i=1, (endwavelength_int-startwavelength_int) + + index_left = INT(SIGN(ABS((RadiationParameter%WaveLen(startwavelength_int+i)-centerwavelength)) & + / (Voigt_int_distmax/REAL(Voigt_int_nmax)), & + RadiationParameter%WaveLen(startwavelength_int+i)-centerwavelength)) + + IF ((RadiationParameter%WaveLen(startwavelength_int+i)-centerwavelength).LT.0.0) THEN + index_right = index_left + index_left = index_left - 1 + ELSE + index_right = index_left + 1 + END IF + + IF(index_right.GT.Voigt_int_nmax) CYCLE +! IF(index_left.LT.(-Voigt_int_nmax)) CYCLE + + weighting_int_left = 1. - ABS(REAL(index_left)-((RadiationParameter%WaveLen(startwavelength_int+i)-centerwavelength) & + / (Voigt_int_distmax/REAL(Voigt_int_nmax)))) + weighting_int_right = 1. - weighting_int_left + + Voigt_int_value = weighting_int_left * Voigt_int(index_left) + weighting_int_right * Voigt_int(index_right) + + Radiation_Profile(startwavelength_int + i) = Voigt_int_value - Voigt_int_value_old + + Voigt_int_value_old = Voigt_int_value + + END DO + +! line_energy_fraction = line_energy_fraction + Voigt_int_value + + DO i=1, (endwavelength_int-startwavelength_int) + Radiation_Profile(startwavelength_int+i) = Radiation_Profile(startwavelength_int+i) / RadiationParameter%WaveLenIncr + END DO + +! ALLOCATE(help_Radiation_Profile(RadiationParameter%WaveLenDiscr)) !2nd order integration, but not better for tested lines +! help_Radiation_Profile = Radiation_Profile +! Radiation_Profile = 0.0 +! DO i=0, width_int+1 +! IF(i .EQ. 0) THEN +! Radiation_Profile(startwavelength_int+i) = (help_Radiation_Profile(startwavelength_int+i) & +! + help_Radiation_Profile(startwavelength_int+i+2)) / (2.*RadiationParameter%WaveLenIncr) +! ELSE IF(i .EQ. (width_int+1)) THEN +! Radiation_Profile(startwavelength_int+i) = (help_Radiation_Profile(startwavelength_int+i) & +! + help_Radiation_Profile(startwavelength_int+i-2)) / (2.*RadiationParameter%WaveLenIncr) +! ELSE +! Radiation_Profile(startwavelength_int+i) = (help_Radiation_Profile(startwavelength_int+i-1) & +! + help_Radiation_Profile(startwavelength_int+i+1)) / (2.*RadiationParameter%WaveLenIncr) +! END IF +! END DO + + +END SUBROUTINE Radiation_Voigt_wavelength_interpolation + + +END MODULE MOD_Radiation_Atoms diff --git a/src/radiation/radiation_solver/radiation_continuum.f90 b/src/radiation/radiation_solver/radiation_continuum.f90 new file mode 100644 index 000000000..8e8b75acc --- /dev/null +++ b/src/radiation/radiation_solver/radiation_continuum.f90 @@ -0,0 +1,389 @@ +!================================================================================================================================== +! Copyright (c) 2010 - 2019 Prof. Claus-Dieter Munz and Prof. Stefanos Fasoulas +! +! This file is part of PICLas (gitlab.com/piclas/piclas). PICLas is free software: you can redistribute it and/or modify +! it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 +! of the License, or (at your option) any later version. +! +! PICLas is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty +! of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License v3.0 for more details. +! +! You should have received a copy of the GNU General Public License along with PICLas. If not, see . +!================================================================================================================================== +#include "piclas.h" + +MODULE MOD_Radiation_Continuum +!=================================================================================================================================== +! Module for Radiation +!=================================================================================================================================== +! MODULES +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +PRIVATE + +INTERFACE radiation_continuum + MODULE PROCEDURE radiation_continuum +END INTERFACE + +!----------------------------------------------------------------------------------------------------------------------------------- +! GLOBAL VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! Private Part --------------------------------------------------------------------------------------------------------------------- +! Public Part ---------------------------------------------------------------------------------------------------------------------- +PUBLIC :: radiation_continuum +!=================================================================================================================================== + +CONTAINS + + +SUBROUTINE radiation_continuum(iElem, em_cont) +!=================================================================================================================================== +! Main routine of continuum radiation calculation +!=================================================================================================================================== +! MODULES + USE MOD_Globals_Vars, ONLY : PlanckConst + USE MOD_Radiation_Vars, ONLY : RadiationInput, RadiationParameter, Radiation_Emission_spec, RadiationSwitches + USE MOD_PARTICLE_Vars, ONLY : nSpecies + +! IMPLICIT VARIABLE HANDLING + IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES + REAL, INTENT(INOUT) :: em_cont + INTEGER, INTENT(IN) :: iElem +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES + + REAL :: n_atom, n_ion + INTEGER :: jSpec, i + REAL, ALLOCATABLE :: epsilon_cont(:) + +!=================================================================================================================================== + + ALLOCATE(epsilon_cont(RadiationParameter%WaveLenDiscr)) + + n_atom = 0.0 + n_ion = 0.0 + + DO jSpec = 1, nSpecies + IF (RadiationInput(jSpec)%NuclCharge .EQ. 1) n_atom = n_atom + RadiationInput(jSpec)%NumDens + IF (RadiationInput(jSpec)%NuclCharge .EQ. 2) n_ion = n_ion + RadiationInput(jSpec)%NumDens + END DO + +! --- initialize emission coefficient + DO i=1, RadiationParameter%WaveLenDiscr + epsilon_cont(i) = Radiation_Emission_spec(i,iElem) ! TODO: or 0.0? + END DO + +! --- free-free emission + IF (RadiationSwitches%ff) THEN +! --- free-free emission due to neutrals + CALL Radiation_continuum_ff(n_atom, 1, iElem) +! --- free-free emission due to ions + CALL Radiation_continuum_ff(n_ion, 2, iElem) + ! WRITE(*,*) '*** FREE-FREE CONTINUUM RADIATION SUCCESSFULLY DONE ***' + ! WRITE(*,*) '' + END IF + +! --- bound-free emission + IF (RadiationSwitches%bf) THEN + CALL Radiation_continuum_bf(iElem) + ! WRITE(*,*) '*** BOUND-FREE CONTINUUM RADIATION SUCCESSFULLY DONE ***' + ! WRITE(*,*) '' + END IF + + +! --- calculate emission due to continuum radiation + DO i = 1, RadiationParameter%WaveLenDiscr + epsilon_cont(i) = Radiation_Emission_spec(i,iElem) - epsilon_cont(i) + END DO + +! --- determine total volumetric emission for continua + CALL Radiation_continuum_total(epsilon_cont, em_cont) + + +END SUBROUTINE radiation_continuum + + + + + + + + + +SUBROUTINE Radiation_continuum_ff(n, z, iElem) +!=================================================================================================================================== +! determines free-free (ff) continuum radiation (bremsstrahlung) +! T_elec needs to be changed with PIC interface!!! +!=================================================================================================================================== +! MODULES + USE MOD_Globals_Vars, ONLY : BoltzmannConst, PlanckConst + USE MOD_Radiation_Vars, ONLY : RadiationInput, RadiationParameter, Radiation_Emission_spec, Radiation_Absorption_spec + USE MOD_Equation_Vars, ONLY : c + +! IMPLICIT VARIABLE HANDLING + IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES + REAL, INTENT(IN) :: n + INTEGER, INTENT(IN) :: z, iElem +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES + REAL, PARAMETER :: gaunt_ff = 1.!0.8 ! Gaunt factor for free-free radiation + REAL :: kbTe, em_brems_const, expon, em_brems ! kbTe, frequency independent factor, exponent, free-free emission coefficient at particular wavelength + REAL :: B_lambda ! Planck's function formulated for per wavelength + INTEGER :: i +!=================================================================================================================================== + + kbTe = BoltzmannConst * RadiationInput(1)%Telec + em_brems_const = 5.443e-52*(z-1)**2*RadiationInput(1)%NumDens*n/sqrt(RadiationInput(1)%Telec) + + DO i=1, RadiationParameter%WaveLenDiscr + expon = MIN(700., PlanckConst*c/(RadiationParameter%WaveLen(i)*kbTe)) + em_brems = gaunt_ff*em_brems_const/(RadiationParameter%WaveLen(i)**2/c)*EXP(-expon) + +! B_lambda = 2.*PlanckConst*(c/RadiationParameter%WaveLen(i))**3/(c**2)/(RadiationParameter%WaveLen(i)**2/c)/(EXP(expon)-1.) + B_lambda = 2.*PlanckConst*c**2/(RadiationParameter%WaveLen(i)**5)/(EXP(expon)-1.) + + Radiation_Emission_spec(i,iElem) = Radiation_Emission_spec(i,iElem) + em_brems + Radiation_Absorption_spec(i,iElem) = Radiation_Absorption_spec(i,iElem) + em_brems/B_lambda + END DO + + +END SUBROUTINE Radiation_continuum_ff + + + + + + + + + +SUBROUTINE Radiation_continuum_bf(iElem) +!=================================================================================================================================== +! determines bound-free (bf) continuum radiation due to recombination/photoionization +!=================================================================================================================================== +! MODULES + USE MOD_Globals_Vars, ONLY : BoltzmannConst, PlanckConst, ElementaryCharge, ElectronMass, BohrRadius, Pi + USE MOD_Particle_Vars, ONLY : nSpecies + USE MOD_Radiation_Vars, ONLY : RadiationInput, SpeciesRadiation, RadiationParameter, & + Radiation_Emission_spec, Radiation_Absorption_spec, NumDensElectrons + USE MOD_Equation_Vars, ONLY : c + USE MOD_DSMC_Vars, ONLY : SpecDSMC + +! IMPLICIT VARIABLE HANDLING + IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES + INTEGER, INTENT(IN) :: iElem +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES + REAL :: kbTe, nue ! kbTe, nue + REAL :: AdvanceSeriesLimits ! Advance of series limits + REAL :: NumDensIon, geIon + INTEGER :: iAtom, jAtom, iIon, iLevel, iWave ! counter for loop over all atoms, ions, Levels, wavelength increments + INTEGER :: LevelsConsidered ! number of considered energy levels + REAL :: gaunt_bf ! Gaunt factor for bound-free radiation + REAL :: low_IonizationPot ! lowering of ionization Potenzial [J] + REAL :: ActualIonizationEn ! lowered ionization energy due to photo-ionization edge shift + REAL :: kappaBFFactor, epsilonBFFactor ! Factor for the calculation of emission and absorption coefficients (constant for each atom) + REAL :: epsilonBF, kappaBF + REAL, PARAMETER :: Ryd = 13.59983 ! [eV] + REAL :: tau, s, sigmaN, sigma +!=================================================================================================================================== + + kbTe = BoltzmannConst * RadiationInput(1)%Telec + +! --- loop over all atoms + DO iAtom = 1, nSpecies + IF((SpecDSMC(iAtom)%InterID .NE. 1) .AND. (SpecDSMC(iAtom)%InterID .NE. 10)) CYCLE + +! IF (RadiationInput(iAtom)%NuclCharge .GT. 1) CYCLE !approach only for neutral atoms + iIon = iAtom +! --- determine ionized species + DO jAtom = 1, nSpecies ! TODO nAtoms instead of nSpecies + IF((SpecDSMC(jAtom)%InterID .NE. 1) .AND. (SpecDSMC(jAtom)%InterID .NE. 10)) CYCLE + IF((RadiationInput(iAtom)%Mass .EQ. RadiationInput(jAtom)%Mass) & + .AND. (RadiationInput(iAtom)%NuclCharge+1 .EQ. RadiationInput(jAtom)%NuclCharge) ) THEN + iIon = jAtom + END IF + END DO + +! --- INITIALIZE LEVEL INDEPENDENT VARIABLES +! --- advance of series limits (Griem 5-47 E_H -> E_Ion) + AdvanceSeriesLimits = 4. * RadiationInput(iAtom)%NuclCharge**(4./5.) * (BohrRadius**3. * NumDensElectrons)**(4./15.) & + * RadiationInput(iAtom)%IonizationEn + low_IonizationPot = 2.9E-8*SQRT(NumDensElectrons/1.E6/RadiationInput(iAtom)%Telec)*ElementaryCharge ! TODO correct indices -> To electrons + ActualIonizationEn = RadiationInput(iAtom)%IonizationEn - low_IonizationPot + ActualIonizationEn = MIN(ActualIonizationEn, RadiationInput(iAtom)%IonizationEn-AdvanceSeriesLimits) + +! --- determination of levels to be considered + DO iLevel = 1, SpeciesRadiation(iAtom)%nLevels + IF(SpeciesRadiation(iAtom)%Level(iLevel,2) .GT. ActualIonizationEn) THEN + LevelsConsidered = iLevel - 1 + EXIT + END IF + END DO + + + IF (iIon .NE. iAtom) THEN + geIon = SpeciesRadiation(iIon)%Level(1,1) ! values for ion in ground state + NumDensIon = SpeciesRadiation(iIon)%NumDensExc(1) + ! PRINT*,'bound-free continuum is calculated using ionized species: ', & + ! TRIM(RadiationInput(iAtom)%RadiationSpectraFileName) + ELSE +! --- assumed degeneracy of the ion + geIon = 1.0d0 +! --- equilibrium ground state ion number density + NumDensIon = ((RadiationInput(iAtom)%Mass-ElectronMass) * 2. * Pi * BoltzmannConst/PlanckConst**2. * ElectronMass & + * RadiationInput(1)%Telec / RadiationInput(iAtom)%Mass)**1.5d0 * geIon / SpeciesRadiation(iAtom)%Level(1,1) & + * EXP(-ActualIonizationEn/kbTe) * SpeciesRadiation(iAtom)%NumDensExc(1) / MAX(1.0d0, NumDensElectrons) + ! PRINT*,'bound-free continuum is approximated using equilibrium considerations! (missing data file for ionized species): ', & + ! TRIM(RadiationInput(iAtom)%RadiationSpectraFileName) + END IF + + +! --- emission coefficient formula is valid for photorecombination from the ion ground state only! + epsilonBFFactor = 1.719236e-46 * NumDensElectrons * NumDensIon * RadiationInput(iAtom)%NuclCharge**4. / geIon & + / c * ( RadiationInput(iAtom)%Mass/((RadiationInput(iAtom)%Mass-ElectronMass) * MAX(250., RadiationInput(iAtom)%Telec) ))**1.5 + kappaBFFactor = 2.815401e25 * RadiationInput(iAtom)%NuclCharge**4. + + DO iWave = 1, RadiationParameter%WaveLenDiscr + + nue = c / RadiationParameter%WaveLen(iWave) + + epsilonBF = 0. + kappaBF = 0. + + DO iLevel = 1, LevelsConsidered + IF(PlanckConst*nue .GE. ActualIonizationEn-SpeciesRadiation(iAtom)%Level(iLevel,2)) THEN + ! gaunt factors using L.G. D'yachkov - Simple formula for the average Gaunt factor Eq. 9 + IF((SpeciesRadiation(iAtom)%Level(iLevel,5) .LT. 0.0) .OR. (SpeciesRadiation(iAtom)%Level(iLevel,5) .GT. 1.0)) THEN + tau = kbTe/(RadiationInput(iAtom)%NuclCharge**2.*Ryd) + s = 0.5+0.5*tau**(0.5) + sigmaN = 2.*MIN(SpeciesRadiation(iAtom)%Level(iLevel,2), RadiationInput(iAtom)%IonizationEn) & + / (RadiationInput(iAtom)%NuclCharge**2.*Ryd) + sigma = SpeciesRadiation(iAtom)%Level(iLevel,2)/(RadiationInput(iAtom)%NuclCharge**2.*Ryd) + gaunt_bf = 1. + 0.347/sigma**(2./3.)*(tau+s*sigma-sigmaN/(1.-EXP(-sigmaN/tau))) & + - 0.0331/sigma**(4./3.)*(2.*tau*(tau+s*sigma)+(s*sigma)**2. & + - sigmaN*(2.*tau+2.*s*sigma-sigmaN)/(1.-EXP(-sigmaN/tau))) + SpeciesRadiation(iAtom)%Level(iLevel,5) = gaunt_bf + PRINT*, 'Gaunt-factor for bound-free radiation calculated' + END IF + kappaBF = kappaBF + SpeciesRadiation(iAtom)%Level(iLevel,5) * SpeciesRadiation(iAtom)%NumDensExc(iLevel) & + / (nue**3. * SpeciesRadiation(iAtom)%Level(iLevel,4)**5.) + epsilonBF = epsilonBF + SpeciesRadiation(iAtom)%Level(iLevel,5) * EXP(-SpeciesRadiation(iAtom)%Level(iLevel,2)/kbTe) & + * nue**2. / SpeciesRadiation(iAtom)%Level(iLevel,4)**5. * SpeciesRadiation(iAtom)%Level(iLevel,1) + END IF + END DO + + kappaBF = kappaBF * kappaBFFactor * (1.d0 - EXP(-PlanckConst*nue/kbTe)) + epsilonBF = epsilonBF * epsilonBFFactor * EXP(MIN((ActualIonizationEn-PlanckConst*nue)/kbTe, 7.d2)) + +! PRINT*, kappaBF, epsilonBF + + Radiation_Emission_spec(iWave,iElem) = Radiation_Emission_spec(iWave,iElem) + epsilonBF + Radiation_Absorption_spec(iWave,iElem) = Radiation_Absorption_spec(iWave,iElem) + kappaBF + + END DO + + ! PRINT*, 'calculated ', LevelsConsidered, 'bound-free levels of ', TRIM(RadiationInput(iAtom)%RadiationSpectraFileName) + + END DO + + +END SUBROUTINE Radiation_continuum_bf + + + + + + + + + +SUBROUTINE Radiation_continuum_total(epsilon_cont, em_cont) +!=================================================================================================================================== +! determines the total emission by numerical 2nd order integration of given epsilon with a Lagrange polynom +!=================================================================================================================================== +! MODULES + USE MOD_Radiation_Vars, ONLY : RadiationParameter + USE MOD_Globals +! IMPLICIT VARIABLE HANDLING + IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES + REAL, INTENT(IN) :: epsilon_cont(:) + REAL, INTENT(INOUT) :: em_cont +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES + REAL :: x1, x2, x3, y1, y2, y3, f1, f2, f3, a, b, c, dr_t, dr_l, dr_l2, dr, x0, y0, left, right + INTEGER :: i + +!=================================================================================================================================== + !!!!!!!!!TODO!!!!!!!! + dr_l2=0.0; y0=0.0; y1=0.0; x0=0.0 + DO i=1, RadiationParameter%WaveLenDiscr-2 + + x1 = RadiationParameter%WaveLen(i) + x2 = RadiationParameter%WaveLen(i+1) + x3 = RadiationParameter%WaveLen(i+2) + + y1 = epsilon_cont(i) + y2 = epsilon_cont(i+1) + y3 = epsilon_cont(i+2) + + f1 = y1/(x1-x2)/(x1-x3) + f2 = y2/(x2-x1)/(x2-x3) + f3 = y3/(x3-x1)/(x3-x2) + + a = f1 + f2 + f3 + b = -(x2+x3)*f1 - (x1+x3)*f2 - (x1+x2)*f3 + c = x2*x3*f1 + x1*x3*f2 + x1*x2*f3 + + left = x1 + right = x2 + dr_l = a/3.*(right**3.-left**3.) + b/2.*(right**2.-left**2.) + c*(right-left) + dr_t = 0.5 * (y1+y2) * (x2-x1) + + IF( ( dr_l .LT. MIN(y1,y2)*(x2-x1) ) .OR. ( dr_l .GT. MAX(y1,y2)*(x2-x1) ) ) THEN + dr = dr_t + ELSE + dr = dr_l + END IF + + IF( (i .GT. 1) .AND. (dr_l2 .GT. MIN(y0,y1)*(x1-x0)) .AND. (dr_l2 .LT. MAX(y0,y1)*(x1-x0) ) ) THEN + dr = 0.5 * (dr + dr_l2) + END IF + + em_cont = em_cont + dr + + left = x2 + right = x3 + dr_l2 = a/3.*(right**3.-left**3.) + b/2.*(right**2.-left**2.) + c*(right-left) + x0 = x1 + y0 = y1 + + END DO + + i = RadiationParameter%WaveLenDiscr-1 + dr_t = 0.5 * (epsilon_cont(i)+epsilon_cont(i+1)) * (RadiationParameter%WaveLen(i+1)-RadiationParameter%WaveLen(i)) + + em_cont = em_cont + dr_t + + +END SUBROUTINE Radiation_continuum_total + + + +END MODULE MOD_Radiation_Continuum diff --git a/src/radiation/radiation_solver/radiation_excitation.f90 b/src/radiation/radiation_solver/radiation_excitation.f90 new file mode 100644 index 000000000..3a6b27292 --- /dev/null +++ b/src/radiation/radiation_solver/radiation_excitation.f90 @@ -0,0 +1,168 @@ +!================================================================================================================================== +! Copyright (c) 2010 - 2019 Prof. Claus-Dieter Munz and Prof. Stefanos Fasoulas +! +! This file is part of PICLas (gitlab.com/piclas/piclas). PICLas is free software: you can redistribute it and/or modify +! it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 +! of the License, or (at your option) any later version. +! +! PICLas is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty +! of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License v3.0 for more details. +! +! You should have received a copy of the GNU General Public License along with PICLas. If not, see . +!================================================================================================================================== +#include "piclas.h" + +MODULE MOD_Radiation_Excitation +!=================================================================================================================================== +! Module for calculation of the excited state density for radiation transitions +!=================================================================================================================================== +! MODULES +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +PRIVATE + +INTERFACE radiation_excitation + MODULE PROCEDURE radiation_excitation +END INTERFACE + +!----------------------------------------------------------------------------------------------------------------------------------- +! GLOBAL VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! Private Part --------------------------------------------------------------------------------------------------------------------- +! Public Part ---------------------------------------------------------------------------------------------------------------------- +PUBLIC :: radiation_excitation +!=================================================================================================================================== + +CONTAINS + + +SUBROUTINE radiation_excitation() +!=================================================================================================================================== +! Main routine of populating the excited state +!=================================================================================================================================== +! MODULES +USE MOD_Globals +USE MOD_Globals_Vars, ONLY : PlanckConst, ElementaryCharge, BoltzmannConst +USE MOD_Radiation_Vars, ONLY : RadiationInput, SpeciesRadiation, NumDensElectrons +USE MOD_PARTICLE_Vars, ONLY : nSpecies +USE MOD_DSMC_Vars, ONLY : SpecDSMC + +! IMPLICIT VARIABLE HANDLING + IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES + + REAL :: low_IonizationPot !lowering of ionization Potenzial [J] +! REAL :: ElectronicPartFunc !Partition function for Maxwell distribution of excited state + INTEGER :: iLevel, iLevel_considered ! loop indices + INTEGER :: nLevels_considered ! actual number of considered levels + INTEGER :: iSpec + REAL :: BoltzmannFactor ! degeneracy*EXP(-E/kB T) + REAL :: RotVibPartFunc ! combined rotational-vibrational partition function + REAL :: Gvib, Gvib_prev ! normalized vibrational energy (G=Delta EVib / hc) + INTEGER :: v ! vibrational quantum number [-] + REAL :: deltaqv +!=================================================================================================================================== + + DO iSpec = 1, nSpecies + +! --- atoms (1) and atomic ions (10) + IF((SpecDSMC(iSpec)%InterID .EQ. 1) .OR. (SpecDSMC(iSpec)%InterID .EQ. 10)) THEN + IF (RadiationInput(iSpec)%Telec.LE.0.0) CYCLE + IF (SpeciesRadiation(iSpec)%nLevels.EQ.0) CYCLE + low_IonizationPot = 2.9E-8*SQRT(NumDensElectrons/1.E6/MAX(1.,RadiationInput(iSpec)%Telec))*ElementaryCharge + + nLevels_considered = SpeciesRadiation(1)%nLevels + + IF (low_IonizationPot .NE. 0.0) THEN + DO iLevel_considered = 1, SpeciesRadiation(iSpec)%nLevels + IF ( SpeciesRadiation(iSpec)%Level(iLevel_considered,2) .LT. (RadiationInput(iSpec)%IonizationEn-low_IonizationPot) ) THEN + nLevels_considered = iLevel_considered + END IF + END DO + END IF + + SpeciesRadiation(iSpec)%PartFunc = 0.0 + + DO iLevel = 1, nLevels_considered !SpeciesRadiation(1)%nLevels + SpeciesRadiation(iSpec)%PartFunc = SpeciesRadiation(iSpec)%PartFunc + SpeciesRadiation(iSpec)%Level(iLevel,1) & + * EXP(-SpeciesRadiation(iSpec)%Level(iLevel,2)/(BoltzmannConst*RadiationInput(iSpec)%Telec)) + END DO + + DO iLevel = 1, nLevels_considered !SpeciesRadiation(1)%nLevels + SpeciesRadiation(iSpec)%NumDensExc(iLevel) = RadiationInput(iSpec)%NumDens*SpeciesRadiation(iSpec)%Level(iLevel,1) & + * EXP(-SpeciesRadiation(iSpec)%Level(iLevel,2)/(BoltzmannConst*RadiationInput(iSpec)%Telec))& + /SpeciesRadiation(iSpec)%PartFunc + END DO + +! --- diatomic molecules (2) and diatomic molecular ions (20) + ELSEIF((SpecDSMC(iSpec)%InterID .EQ. 2) .OR. (SpecDSMC(iSpec)%InterID .EQ. 20)) THEN + +!! --- Initialization + SpeciesRadiation(iSpec)%PartFunc = 0.0 + IF ((RadiationInput(iSpec)%Telec.LE.0.0).OR.(RadiationInput(iSpec)%Tvib.LE.0.0))CYCLE !!!!!!!TODO!!! + DO iLevel = 1, SpeciesRadiation(iSpec)%nLevels +! --- Initialization + Gvib_prev = 0.0 + v = 0 + RotVibPartFunc = 0.0 + +! --- calculation of Boltzmann Factor (ge*EXP(-E/kBT)) + BoltzmannFactor = SpeciesRadiation(iSpec)%EnergyLevelProperties(iLevel,1) & + * EXP(MIN(7.d2, -SpeciesRadiation(iSpec)%EnergyLevelProperties(iLevel,2) / (BoltzmannConst*RadiationInput(iSpec)%Telec))) + + DO !WHILE (.TRUE.) +! --- vibrational energy of quantum number v, powers of the vibrational quantum number + .5 +! --- G = omega_w(v+1/2) - omega_w x_e(v+1/2)**2 + omega_w y_e(v+1/2)**3 + omega_w z_e(v+1/2)**4 + ... + Gvib = SpeciesRadiation(iSpec)%EnergyLevelProperties(iLevel,4) * (REAL(v)+0.5) & + - SpeciesRadiation(iSpec)%EnergyLevelProperties(iLevel,5) * (REAL(v)+0.5)**2 & + + SpeciesRadiation(iSpec)%EnergyLevelProperties(iLevel,6) * (REAL(v)+0.5)**3 & + + SpeciesRadiation(iSpec)%EnergyLevelProperties(iLevel,7) * (REAL(v)+0.5)**4 + +! --- contribution of vibrational quantum number v to the partition function + deltaqv = EXP(-Gvib/(BoltzmannConst*RadiationInput(iSpec)%Tvib)) + +! --- cutoff criteria + IF(Gvib .GT. SpeciesRadiation(iSpec)%EnergyLevelProperties(iLevel,3)) THEN + EXIT !Vibrational energy exceeds dissociation energy + ELSEIF(Gvib .LT. Gvib_prev) THEN + EXIT !Vibrational energy reached fictitious peak? + END IF + +! --- contribution of rotational excitation + IF((SpeciesRadiation(iSpec)%EnergyLevelProperties(iLevel,8) & + - SpeciesRadiation(iSpec)%EnergyLevelProperties(iLevel,9)*(REAL(v)+0.5) ) .GT. 0.0) THEN + +! --- Analytic expression with cutoff at dissociation energy + RotVibPartFunc = RotVibPartFunc + RadiationInput(iSpec)%Trot * deltaqv & + / ( 1.0 / BoltzmannConst * ( SpeciesRadiation(iSpec)%EnergyLevelProperties(iLevel,8) & + - SpeciesRadiation(iSpec)%EnergyLevelProperties(iLevel,9)*(REAL(v)+0.5) ) ) & ! + gamma_e*(REAL(v)+0.5)**2 + * ( 1.d0 - exp( ( Gvib - SpeciesRadiation(iSpec)%EnergyLevelProperties(iLevel,3) ) & + / BoltzmannConst / RadiationInput(iSpec)%Trot) ) + + END IF + + Gvib_prev = Gvib + v=v+1 + + END DO + + SpeciesRadiation(iSpec)%PartFunc = SpeciesRadiation(iSpec)%PartFunc + BoltzmannFactor * RotVibPartFunc + + END DO + + ELSE + + CYCLE + + END IF + + END DO + +END SUBROUTINE radiation_excitation + +END MODULE MOD_Radiation_Excitation diff --git a/src/radiation/radiation_solver/radiation_init.f90 b/src/radiation/radiation_solver/radiation_init.f90 new file mode 100644 index 000000000..894396a4e --- /dev/null +++ b/src/radiation/radiation_solver/radiation_init.f90 @@ -0,0 +1,336 @@ +!================================================================================================================================== +! Copyright (c) 2010 - 2019 Prof. Claus-Dieter Munz and Prof. Stefanos Fasoulas +! +! This file is part of PICLas (gitlab.com/piclas/piclas). PICLas is free software: you can redistribute it and/or modify +! it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 +! of the License, or (at your option) any later version. +! +! PICLas is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty +! of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License v3.0 for more details. +! +! You should have received a copy of the GNU General Public License along with PICLas. If not, see . +!================================================================================================================================== +#include "piclas.h" + +MODULE MOD_Radiation_Init +!=================================================================================================================================== +! Initialization of DSMC +!=================================================================================================================================== +! MODULES +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +PRIVATE + +INTERFACE InitRadiation + MODULE PROCEDURE InitRadiation +END INTERFACE + +INTERFACE FinalizeRadiation + MODULE PROCEDURE FinalizeRadiation +END INTERFACE + +!----------------------------------------------------------------------------------------------------------------------------------- +! GLOBAL VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! Private Part --------------------------------------------------------------------------------------------------------------------- +! Public Part ---------------------------------------------------------------------------------------------------------------------- +PUBLIC :: InitRadiation, FinalizeRadiation, DefineParametersRadiation +!=================================================================================================================================== + +CONTAINS + + + + +SUBROUTINE DefineParametersRadiation() +!================================================================================================================================== +! Define parameters for Radiation +!================================================================================================================================== +! MODULES +USE MOD_ReadInTools ,ONLY: prms,addStrListEntry +IMPLICIT NONE +!================================================================================================================================== +CALL prms%SetSection("Radiation") + +CALL prms%CreateRealOption( 'Part-Species[$]-RadiationTtrans', 'Translational temperature, K', '0.0', numberedmulti=.TRUE.) +CALL prms%CreateRealOption( 'Part-Species[$]-RadiationTelec', 'Electronic excitation temperature, K', '0.0', & + numberedmulti=.TRUE.) +CALL prms%CreateRealOption( 'Part-Species[$]-RadiationNumDens', 'Number density, 1/cm3', '0.0', numberedmulti=.TRUE.) +CALL prms%CreateRealOption( 'Part-Species[$]-RadiationTvib', 'Vibrational temperature, K', '0.0', numberedmulti=.TRUE.) +CALL prms%CreateRealOption( 'Part-Species[$]-RadiationTrot', 'Rotational temperature, K', '0.0', numberedmulti=.TRUE.) +CALL prms%CreateRealOption( 'Part-Species[$]-RadiationIonizationEn', 'Ionization Energy, 1/cm', '0.0', numberedmulti=.TRUE.) +CALL prms%CreateRealOption( 'Part-Species[$]-RadiationMass_u', 'Molar mass, kg/kmol', '0.0', numberedmulti=.TRUE.) +CALL prms%CreateRealOption( 'Part-Species[$]-RadiationRadius_A', 'Species radius, A', '0.0', numberedmulti=.TRUE.) +CALL prms%CreateRealOption( 'Part-Species[$]-Starkex', 'Exponent for the determination of Stark broadening', & + '0.0', numberedmulti=.TRUE.) +CALL prms%CreateIntOption( 'Part-Species[$]-NuclCharge', 'Nuclear charge:\n'//& + '1: neutral atom\n'//& + '2: singly ionized atom', '1', numberedmulti=.TRUE.) +CALL prms%CreateRealOption( 'Radiation-MinWaveLen', 'Lower wavelength limit for radiation calculation', '0.0') +CALL prms%CreateRealOption( 'Radiation-MaxWaveLen', 'Upper wavelength limit for radiation calculation','1000.0') +CALL prms%CreateIntOption( 'Radiation-WaveLenDiscr', 'Number of discretization points', '10000') +CALL prms%CreateIntOption( 'Radiation-RadType', 'Select radiation type:\n'//& + '1: particle radiation\n'//& + '2: black body radiation', '2') +CALL prms%CreateLogicalOption('Radiation-ff', 'Enable free-free radiation', '.FALSE.') +CALL prms%CreateLogicalOption('Radiation-bf', 'Enable bound-free radiation (only atomic)', '.FALSE.') +CALL prms%CreateLogicalOption('Radiation-bb-atoms', 'Enable atomic bound-bound radiation', '.FALSE.') +CALL prms%CreateLogicalOption('Radiation-bb-molecules', 'Enable molecular bound-bound radiation', '.FALSE.') +CALL prms%CreateLogicalOption('Radiation-MacroRadInput', 'Reading in flow field data as radiation input', '.FALSE.') +CALL prms%CreateRealOption( 'Radiation-NumDensElectrons', 'Electron number density, 1/cm3', '0.0') +CALL prms%CreateRealOption( 'Radiation-TElectrons', 'Electron temperature, K', '0.0') +CALL prms%CreateStringOption( 'Radiation-Species[$]-SpectraFileName', 'File name of data file', 'none', numberedmulti=.TRUE.) +CALL prms%CreateStringOption( 'Radiation-MacroInput-Filename', & + 'TO-DO') +END SUBROUTINE DefineParametersRadiation + + + + +SUBROUTINE InitRadiation() +!=================================================================================================================================== +! Init of DSMC Vars +!=================================================================================================================================== +! MODULES +USE MOD_Globals +USE MOD_Globals_Vars, ONLY : PlanckConst +USE MOD_Mesh_Vars, ONLY : nElems +USE MOD_Particle_Mesh_Vars, ONLY : nTotalElems +USE MOD_ReadInTools +USE MOD_PARTICLE_Vars, ONLY : nSpecies +USE MOD_Radiation_Vars +USE MOD_DSMC_Vars, ONLY : SpecDSMC +USE MOD_Radiation_ReadIn, ONLY : Radiation_readin_atoms, Radiation_readin_molecules +USE MOD_Equation_Vars, ONLY : c +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES + CHARACTER(32) :: hilf + INTEGER :: iSpec, iWaveLen +!=================================================================================================================================== +SWRITE(UNIT_stdOut,'(A)') ' INIT RADIATION SOLVER...' + +RadiationSwitches%RadType = GETINT('Radiation-RadType', '2') +ALLOCATE(RadiationInput(nSpecies)) +ALLOCATE(SpeciesRadiation(nSpecies)) +SpeciesRadiation(:)%nLevels = 0 +SpeciesRadiation(:)%nLines = 0 + +IF (RadiationSwitches%RadType.NE.2) THEN + DO iSpec = 1, nSpecies + WRITE(UNIT=hilf,FMT='(I0)') iSpec + RadiationInput(iSpec)%Ttrans(4) = GETREAL('Part-Species'//TRIM(hilf)//'-RadiationTtrans','0.0') + RadiationInput(iSpec)%Telec = GETREAL('Part-Species'//TRIM(hilf)//'-RadiationTelec','0.0') + RadiationInput(iSpec)%NumDens = GETREAL('Part-Species'//TRIM(hilf)//'-RadiationNumDens','0.0') + IF(SpecDSMC(iSpec)%InterID.EQ.2) THEN + RadiationInput(iSpec)%Tvib = GETREAL('Part-Species'//TRIM(hilf)//'-RadiationTvib','0.0') + RadiationInput(iSpec)%Trot = GETREAL('Part-Species'//TRIM(hilf)//'-RadiationTrot','0.0') + END IF + RadiationInput(iSpec)%IonizationEn = GETREAL('Part-Species'//TRIM(hilf)//'-RadiationIonizationEn','0.0') + RadiationInput(iSpec)%IonizationEn = RadiationInput(iSpec)%IonizationEn *PlanckConst*c*100. + RadiationInput(iSpec)%Mass = GETREAL('Part-Species'//TRIM(hilf)//'-RadiationMass_u','0.0') + RadiationInput(iSpec)%Mass = RadiationInput(iSpec)%Mass*1.660539040E-27 + + IF((SpecDSMC(iSpec)%InterID .EQ. 1) .OR. (SpecDSMC(iSpec)%InterID .EQ. 10)) THEN !Only for atoms (1) and atomic ions (10) + CALL Radiation_readin_atoms(iSpec) + RadiationInput(iSpec)%Radius = GETREAL('Part-Species'//TRIM(hilf)//'-RadiationRadius_A','0.0') + RadiationInput(iSpec)%Radius = RadiationInput(iSpec)%Radius *1.0E-10 + RadiationInput(iSpec)%Starkex = GETREAL('Part-Species'//TRIM(hilf)//'-Starkex','0.0') + RadiationInput(iSpec)%NuclCharge = GETINT('Part-Species'//TRIM(hilf)//'-NuclCharge','1') + END IF + + IF((SpecDSMC(iSpec)%InterID .EQ. 2) .OR. (SpecDSMC(iSpec)%InterID .EQ. 20)) THEN !Only for molecules (2) and molecular ions (20) + CALL Radiation_readin_molecules(iSpec) + END IF + END DO +END IF + +RadiationParameter%MinWaveLen = GETREAL('Radiation-MinWaveLen','0.0') +RadiationParameter%MinWaveLen = RadiationParameter%MinWaveLen*1.E-9 +RadiationParameter%MaxWaveLen = GETREAL('Radiation-MaxWaveLen','1000.0') +RadiationParameter%MaxWaveLen = RadiationParameter%MaxWaveLen*1.E-9 +RadiationParameter%WaveLenDiscr = GETINT('Radiation-WaveLenDiscr','10000') +IF(RadiationParameter%MinWaveLen.GE.RadiationParameter%MaxWaveLen) THEN + CALL abort(& + __STAMP__& + ,' ERROR: Radiation - maximum wavelength is smaller than minimum wavelength') +END IF +IF(RadiationParameter%WaveLenDiscr.LT.100) THEN + CALL abort(& + __STAMP__& + ,' ERROR: Radiation - number of wavelength discretization points is to small') +END IF +RadiationParameter%WaveLenIncr = (RadiationParameter%MaxWaveLen - RadiationParameter%MinWaveLen) & + / (RadiationParameter%WaveLenDiscr-1) + +ALLOCATE(RadiationParameter%WaveLen(RadiationParameter%WaveLenDiscr)) +RadiationParameter%WaveLen = 0.0 + +DO iWaveLen = 1, RadiationParameter%WaveLenDiscr + RadiationParameter%WaveLen(iWaveLen) = RadiationParameter%MinWaveLen + (iWaveLen-1) * RadiationParameter%WaveLenIncr +END DO + +RadiationSwitches%ff = GETLOGICAL('Radiation-ff', '.FALSE.') +RadiationSwitches%bf = GETLOGICAL('Radiation-bf', '.FALSE.') +RadiationSwitches%bb_at = GETLOGICAL('Radiation-bb-atoms', '.FALSE.') +RadiationSwitches%bb_mol = GETLOGICAL('Radiation-bb-molecules', '.FALSE.') +RadiationSwitches%MacroRadInput = GETLOGICAL('Radiation-MacroRadInput', '.FALSE.') + +IF (RadiationSwitches%MacroRadInput) CALL MacroscopicRadiationInput() + +NumDensElectrons = GETREAL('Radiation-NumDensElectrons','0.0') +TElectrons = GETREAL('Radiation-TElectrons', '0.0') + +#if USE_MPI + ! allocate shared array for ElemInfo + MPISharedSize = INT((RadiationParameter%WaveLenDiscr)*nComputeNodeElems,MPI_ADDRESS_KIND)*MPI_ADDRESS_KIND + CALL Allocate_Shared(MPISharedSize,(/RadiationParameter%WaveLenDiscr,nComputeNodeElems/), & +Radiation_Emission_Spec_Shared_Win,Radiation_Emission_Spec_Shared) + CALL MPI_WIN_LOCK_ALL(0,Radiation_Emission_Spec_Shared_Win,IERROR) + + MPISharedSize = INT((RadiationParameter%WaveLenDiscr)*nGlobalElems,MPI_ADDRESS_KIND)*MPI_ADDRESS_KIND + CALL Allocate_Shared(MPISharedSize,(/RadiationParameter%WaveLenDiscr,nGlobalElems/), & +Radiation_Absorption_Spec_Shared_Win,Radiation_Absorption_Spec_Shared) + CALL MPI_WIN_LOCK_ALL(0,Radiation_Absorption_Spec_Shared_Win,IERROR) + +Radiation_Emission_spec => Radiation_Emission_spec_Shared +Radiation_Absorption_spec => Radiation_Absorption_spec_Shared +#else +! allocate local array for ElemInfo +ALLOCATE(Radiation_Emission_spec(RadiationParameter%WaveLenDiscr,nElems)) +ALLOCATE(Radiation_Absorption_spec(RadiationParameter%WaveLenDiscr,nElems)) +#endif /*USE_MPI*/ + +ALLOCATE(Radiation_ElemEnergy_Species(nSpecies,nElems,2)) +Radiation_Emission_spec = 0.0 +Radiation_Absorption_spec = 0.0 +Radiation_ElemEnergy_Species = 0.0 + + +SWRITE(UNIT_stdOut,'(A)') ' INIT RADIATION SOLVER DONE!' + +END SUBROUTINE InitRadiation + + +SUBROUTINE MacroscopicRadiationInput() + !=================================================================================================================================== + !> + !=================================================================================================================================== + ! MODULES + USE MOD_Globals + USE MOD_PreProc + USE MOD_io_hdf5 + USE MOD_HDF5_Input ,ONLY: OpenDataFile,CloseDataFile,DatasetExists,ReadArray,GetDataProps + USE MOD_Mesh_Vars ,ONLY: offsetElem, nElems + USE MOD_Particle_Vars ,ONLY: nSpecies + USE MOD_Radiation_Vars ,ONLY: MacroRadInputParameters + USE MOD_ReadInTools + USE MOD_Utils ,ONLY: BubbleSortID +! USE MOD_Particle_Mesh_Vars ,ONLY: GEO !Laux + ! IMPLICIT VARIABLE HANDLING + IMPLICIT NONE + !----------------------------------------------------------------------------------------------------------------------------------- + ! INPUT VARIABLES + !----------------------------------------------------------------------------------------------------------------------------------- + ! OUTPUT VARIABLES + !----------------------------------------------------------------------------------------------------------------------------------- + ! LOCAL VARIABLES + INTEGER :: nVar_HDF5, N_HDF5, nElems_HDF5, iVar, iSpec, iElem + REAL, ALLOCATABLE :: ElemData_HDF5(:,:) + CHARACTER(LEN=300) :: MacroRadiationInputFile +! INTEGER, ALLOCATABLE :: SortElemInd(:) !Laux +! REAL, ALLOCATABLE :: SortElemYPos(:) !Laux + !=================================================================================================================================== + + MacroRadiationInputFile = GETSTR('Radiation-MacroInput-Filename') + CALL OpenDataFile(MacroRadiationInputFile,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_WORLD) + + CALL GetDataProps('ElemData',nVar_HDF5,N_HDF5,nElems_HDF5) + + ALLOCATE(MacroRadInputParameters(1:nElems,1:nSpecies,1:5)) + MacroRadInputParameters = 0. + + ALLOCATE(ElemData_HDF5(1:nVar_HDF5,1:nElems)) + ! Associate construct for integer KIND=8 possibility + ASSOCIATE (& + nVar_HDF5 => INT(nVar_HDF5,IK) ,& + offsetElem => INT(offsetElem,IK),& + nElems => INT(nElems,IK) ) + CALL ReadArray('ElemData',2,(/nVar_HDF5,nElems/),offsetElem,2,RealArray=ElemData_HDF5(:,:)) + END ASSOCIATE + + +! --- uncomment for Laux Test Case ---------------------------------------------------------------- +! reanrrages Elem IDs for 1xnElemsx1 meshes (for 3D and 2D rotationally symmetric meshes) + +! ALLOCATE(SortElemInd(nElems), SortElemYPos(nElems)) +! DO iElem = 1, nElems +! SortElemInd(iElem) = iElem +! END DO +! SortElemYPos(:) = -GEO%ElemMidPoint(2,:) +! CALL BubbleSortID(SortElemYPos, SortElemInd, nElems) + + +! iVar = 1 +! DO iSpec = 1, nSpecies +! DO iElem = 1, nElems +! MacroRadInputParameters(SortElemInd(iElem),iSpec,1) = ElemData_HDF5(iVar+ 6,iElem) density +! MacroRadInputParameters(SortElemInd(iElem),iSpec,2) = ElemData_HDF5(iVar+ 7,iElem) T_vib +! MacroRadInputParameters(SortElemInd(iElem),iSpec,3) = ElemData_HDF5(iVar+ 8,iElem) T_rot +! MacroRadInputParameters(SortElemInd(iElem),iSpec,4) = ElemData_HDF5(iVar+ 9,iElem) T_elec +! MacroRadInputParameters(SortElemInd(iElem),iSpec,5) = ElemData_HDF5(iVar+11,iElem) T_mean +! END DO +! iVar = iVar + DSMC_NVARS +! END DO +! ------------------------------------------------------------------------------------------------- + + iVar = 1 + DO iSpec = 1, nSpecies + DO iElem = 1, nElems + MacroRadInputParameters(iElem,iSpec,1) = ElemData_HDF5(iVar+ 6,iElem) !density + MacroRadInputParameters(iElem,iSpec,2) = ElemData_HDF5(iVar+ 7,iElem) !T_vib + MacroRadInputParameters(iElem,iSpec,3) = ElemData_HDF5(iVar+ 8,iElem) !T_rot + MacroRadInputParameters(iElem,iSpec,4) = ElemData_HDF5(iVar+ 9,iElem) !T_elec + MacroRadInputParameters(iElem,iSpec,5) = ElemData_HDF5(iVar+11,iElem) !T_mean + END DO + iVar = iVar + DSMC_NVARS + END DO + + DEALLOCATE(ElemData_HDF5) + +END SUBROUTINE MacroscopicRadiationInput + + +SUBROUTINE FinalizeRadiation() +!=================================================================================================================================== +!> Deallocating radiation variables +!=================================================================================================================================== +! MODULES +USE MOD_Radiation_Vars +!----------------------------------------------------------------------------------------------------------------------------------- +IMPLICIT NONE +! INPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +!=================================================================================================================================== + +SDEALLOCATE(RadiationInput) +SDEALLOCATE(SpeciesRadiation) +SDEALLOCATE(RadiationParameter%WaveLen) +SDEALLOCATE(Radiation_Emission_spec) +SDEALLOCATE(Radiation_Absorption_spec) +SDEALLOCATE(Radiation_ElemEnergy_Species) + +END SUBROUTINE FinalizeRadiation + + + + +END MODULE MOD_Radiation_Init diff --git a/src/radiation/radiation_solver/radiation_instrbroadening.f90 b/src/radiation/radiation_solver/radiation_instrbroadening.f90 new file mode 100644 index 000000000..cfd9e8813 --- /dev/null +++ b/src/radiation/radiation_solver/radiation_instrbroadening.f90 @@ -0,0 +1,152 @@ +!================================================================================================================================== +! Copyright (c) 2010 - 2019 Prof. Claus-Dieter Munz and Prof. Stefanos Fasoulas +! +! This file is part of PICLas (gitlab.com/piclas/piclas). PICLas is free software: you can redistribute it and/or modify +! it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 +! of the License, or (at your option) any later version. +! +! PICLas is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty +! of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License v3.0 for more details. +! +! You should have received a copy of the GNU General Public License along with PICLas. If not, see . +!================================================================================================================================== +#include "piclas.h" + +MODULE MOD_Radiation_InstrBroadening +!=================================================================================================================================== +! Module for Radiation +!=================================================================================================================================== +! MODULES +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +PRIVATE + +INTERFACE radiation_instrbroadening + MODULE PROCEDURE radiation_instrbroadening +END INTERFACE + +!----------------------------------------------------------------------------------------------------------------------------------- +! GLOBAL VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! Private Part --------------------------------------------------------------------------------------------------------------------- +! Public Part ---------------------------------------------------------------------------------------------------------------------- +PUBLIC :: radiation_instrbroadening +!=================================================================================================================================== + +CONTAINS + + +SUBROUTINE radiation_instrbroadening(iElem) +!=================================================================================================================================== +! Accounting for trapezoidal slit-function (instrumental broadening) +!=================================================================================================================================== +! MODULES +USE MOD_Globals +USE MOD_Radiation_Vars, ONLY : RadiationParameter, Radiation_Emission_spec +! IMPLICIT VARIABLE HANDLING + IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES + INTEGER, INTENT(IN) :: iElem +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES + + REAL, PARAMETER :: basewidth = 3.42E-10*5. + REAL, PARAMETER :: topwidth = 1.79E-10*5. + REAL :: basewidth_half, topwidth_half, slope + REAL :: wavelength_min_base, wavelength_max_base, wavelength_min_top, wavelength_max_top + INTEGER :: io_error, w + INTEGER :: iWave, iWave_min, i + REAL, ALLOCATABLE :: Radiation_Emission_spec_conv(:) + REAL :: fractionl, fractionr, delta_base, delta_top + +!=================================================================================================================================== + + ALLOCATE(Radiation_Emission_spec_conv(RadiationParameter%WaveLenDiscr)) + + iWave_min = 1!0 + + basewidth_half = 0.5 * basewidth + topwidth_half = 0.5 * topwidth + slope = 1. / (basewidth_half-topwidth_half) + + DO iWave=1, RadiationParameter%WaveLenDiscr + wavelength_min_base = RadiationParameter%WaveLen(iWave) - basewidth_half + wavelength_max_base = RadiationParameter%WaveLen(iWave) + basewidth_half + wavelength_min_top = RadiationParameter%WaveLen(iWave) - topwidth_half + wavelength_max_top = RadiationParameter%WaveLen(iWave) + topwidth_half + +! --- start index determination + DO WHILE(RadiationParameter%WaveLen(iWave_min+1) .LT. wavelength_min_base) + iWave_min = iWave_min + 1 + END DO + +! --- slit function + DO i = iWave_min, RadiationParameter%WaveLenDiscr-1 + IF(RadiationParameter%WaveLen(i) .LT. wavelength_min_base) THEN + fractionl = 0. + IF(RadiationParameter%WaveLen(i+1) .GT. wavelength_min_top) THEN + STOP 'slit function: step width is too big!' + END IF + fractionr = slope * (RadiationParameter%WaveLen(i+1) - RadiationParameter%WaveLen(iWave) + basewidth_half) + delta_base = RadiationParameter%WaveLen(i+1) - wavelength_min_base + delta_top = 0. + ELSEIF(RadiationParameter%WaveLen(i+1) .LT. wavelength_min_top) THEN + fractionl = slope * (RadiationParameter%WaveLen(i ) - RadiationParameter%WaveLen(iWave) + basewidth_half) + fractionr = slope * (RadiationParameter%WaveLen(i+1) - RadiationParameter%WaveLen(iWave) + basewidth_half) + delta_base = RadiationParameter%WaveLenIncr + delta_top = 0. + ELSEIF(RadiationParameter%WaveLen(i ) .LT. wavelength_min_top) THEN + fractionl = slope * (RadiationParameter%WaveLen(i ) - RadiationParameter%WaveLen(iWave) + basewidth_half) + fractionr = 1. + delta_base = wavelength_min_top - RadiationParameter%WaveLen(i) + delta_top = RadiationParameter%WaveLen(i+1) - wavelength_min_top + ELSEIF(RadiationParameter%WaveLen(i+1) .LT. wavelength_max_top) THEN + delta_base = 0. + delta_top = RadiationParameter%WaveLenIncr + ELSEIF(RadiationParameter%WaveLen(i ) .LT. wavelength_max_top) THEN + fractionl = 1. + fractionr = - slope * (RadiationParameter%WaveLen(i+1) - RadiationParameter%WaveLen(iWave) - basewidth_half) + delta_base = RadiationParameter%WaveLen(i+1) - wavelength_max_top + delta_top = wavelength_max_top - RadiationParameter%WaveLen(i) + ELSEIF(RadiationParameter%WaveLen(i+1) .LT. wavelength_max_base) THEN + fractionl = - slope * (RadiationParameter%WaveLen(i ) - RadiationParameter%WaveLen(iWave) - basewidth_half) + fractionr = - slope * (RadiationParameter%WaveLen(i+1) - RadiationParameter%WaveLen(iWave) - basewidth_half) + delta_base = RadiationParameter%WaveLenIncr + delta_top = 0. + ELSEIF(RadiationParameter%WaveLen(i) .LT. wavelength_max_base) THEN + fractionl = - slope * (RadiationParameter%WaveLen(i ) - RadiationParameter%WaveLen(iWave) - basewidth_half) + fractionr = 0. + delta_base = wavelength_max_base - RadiationParameter%WaveLen(i) + delta_top = 0. + ELSE + EXIT + END IF + + Radiation_Emission_spec_conv(iWave) = Radiation_Emission_spec_conv(iWave) & + + ((fractionl+fractionr)*.5*delta_base+delta_top) & + * Radiation_Emission_spec(i+1,iElem) + + + END DO + +! --- transformation to Laux's units +! Radiation_Emission_spec_conv(iWave) = Radiation_Emission_spec_conv(iWave)/1.D11 + + END DO + + OPEN(unit=30,file='Broadening.dat',status='replace',action='write', iostat=io_error) + DO w=1, RadiationParameter%WaveLenDiscr + WRITE(30,*) RadiationParameter%WaveLen(w)*1.E10 , Radiation_Emission_spec_conv(w)!*1.E10!/3.E12 + END DO + CLOSE(unit=30) + + WRITE(*,*) '*** INSTRUMENTAL BROADENING SUCCESSFULLY DONE ***' + WRITE(*,*) '' + +END SUBROUTINE radiation_instrbroadening + + +END MODULE MOD_Radiation_InstrBroadening diff --git a/src/radiation/radiation_solver/radiation_main.f90 b/src/radiation/radiation_solver/radiation_main.f90 new file mode 100644 index 000000000..dd3b33bda --- /dev/null +++ b/src/radiation/radiation_solver/radiation_main.f90 @@ -0,0 +1,143 @@ +!================================================================================================================================== +! Copyright (c) 2010 - 2019 Prof. Claus-Dieter Munz and Prof. Stefanos Fasoulas +! +! This file is part of PICLas (gitlab.com/piclas/piclas). PICLas is free software: you can redistribute it and/or modify +! it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 +! of the License, or (at your option) any later version. +! +! PICLas is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty +! of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License v3.0 for more details. +! +! You should have received a copy of the GNU General Public License along with PICLas. If not, see . +!================================================================================================================================== +#include "piclas.h" + +MODULE MOD_Radiation +!=================================================================================================================================== +! Module for Radiation +!=================================================================================================================================== +! MODULES +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +PRIVATE + +INTERFACE radiation_main + MODULE PROCEDURE radiation_main +END INTERFACE + +!----------------------------------------------------------------------------------------------------------------------------------- +! GLOBAL VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! Private Part --------------------------------------------------------------------------------------------------------------------- +! Public Part ---------------------------------------------------------------------------------------------------------------------- +PUBLIC :: radiation_main +!=================================================================================================================================== + +CONTAINS + + +SUBROUTINE radiation_main(iElem) +!=================================================================================================================================== +! Main routine of radiation solver +!=================================================================================================================================== +! MODULES +USE MOD_Globals +USE MOD_Globals_Vars, ONLY : Pi +USE MOD_Radiation_Vars, ONLY : RadiationInput, RadiationSwitches, MacroRadInputParameters, & + Radiation_Emission_spec, Radiation_Absorption_spec, RadiationParameter +USE MOD_Radiation_Excitation, ONLY : radiation_excitation +USE MOD_Radiation_Atoms, ONLY : radiation_atoms +USE MOD_Radiation_Molecules, ONLY : radiation_molecules +USE MOD_Radiation_Continuum, ONLY : radiation_continuum +USE MOD_Radiation_InstrBroadening, ONLY : radiation_instrbroadening +USE MOD_PARTICLE_Vars, ONLY : nSpecies +USE MOD_Mesh_Vars, ONLY: offsetElem +USE MOD_Radiation_ExportSpectrum +! IMPLICIT VARIABLE HANDLING + IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES + INTEGER, INTENT(IN) :: iElem +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES + INTEGER :: iSpec, w, io_error +! REAL :: currentWave, iRan + REAL :: em_tot, em_atom, em_mol, em_cont +!=================================================================================================================================== + +!------- initialize total emission variables + em_atom = 0.0 + em_mol = 0.0 + em_cont = 0.0 + em_tot = 0.0 + +!IF ( ((iElem+offsetElem).NE.208) .AND. ((iElem+offsetElem).NE.228) .AND. ((iElem+offsetElem).NE.3492) & +!.AND. ((iElem+offsetElem).NE.4743) .AND. ((iElem+offsetElem).NE.6541)) RETURN + + IF (RadiationSwitches%MacroRadInput) THEN + DO iSpec = 1, nSpecies + RadiationInput(iSpec)%NumDens = MacroRadInputParameters(iElem,iSpec,1) + RadiationInput(iSpec)%Tvib = MacroRadInputParameters(iElem,iSpec,2) + RadiationInput(iSpec)%Trot = MacroRadInputParameters(iElem,iSpec,3) + RadiationInput(iSpec)%Telec = MacroRadInputParameters(iElem,iSpec,4) + RadiationInput(iSpec)%Ttrans(4) = MacroRadInputParameters(iElem,iSpec,5) + END DO + END IF + + CALL radiation_excitation() + + IF (RadiationSwitches%bb_at) THEN + CALL radiation_atoms(iElem, em_atom) + END IF + + IF (RadiationSwitches%bb_mol) THEN + CALL radiation_molecules(iElem, em_mol) + END IF + + CALL radiation_continuum(iElem, em_cont) + + em_atom = em_atom * 4. * Pi + em_mol = em_mol * 4. * Pi + em_cont = em_cont * 4. * Pi + em_tot = em_atom + em_mol + em_cont + + ! WRITE(*,*) 'atomic emission : ', em_atom, '[w/m³]' + ! WRITE(*,*) 'molecular emission : ', em_mol, '[w/m³]' + ! WRITE(*,*) 'continuum emission : ', em_cont, '[w/m³]' + ! WRITE(*,*) 'total emission : ', em_tot, '[w/m³]' + ! WRITE(*,*) '' + + ! READ* + + OPEN(unit=20,file='Radiation_Emission_Absorption.dat',status='replace',action='write', iostat=io_error) + DO w=1, RadiationParameter%WaveLenDiscr + WRITE(20,*) RadiationParameter%WaveLen(w)*1.E9, Radiation_Emission_spec(w,1), Radiation_Absorption_spec(w,1) + END DO + CLOSE(unit=20) + +!------- Write output .dat-file including spectrally resolved emission and absorption for chosen cells +! --- FIRE II Front --- +! IF( ((iElem+offsetElem).EQ.208) .OR. ((iElem+offsetElem).EQ.228) .OR. ((iElem+offsetElem).EQ.3492) & +! .OR. ((iElem+offsetElem).EQ.4743) .OR. ((iElem+offsetElem).EQ.6541)) THEN +! CALL radiation_exportspectrum(iElem, 1) +! CALL radiation_exportspectrum(iElem, 2) +! END IF + + +! --- HEARTED --- +! IF( ((iElem+offsetElem).EQ.145) .OR. ((iElem+offsetElem).EQ.170) .OR. ((iElem+offsetElem).EQ.3597) & +! .OR. ((iElem+offsetElem).EQ.5228) ) THEN +! ! CALL radiation_exportspectrum(iElem, 1) +! CALL radiation_exportspectrum(iElem, 2) +! END IF + +!------- use slit function +!IF ((iElem+offsetElem).EQ.4743) THEN +! CALL radiation_instrbroadening(iElem) +!END IF + +END SUBROUTINE radiation_main + +END MODULE MOD_Radiation diff --git a/src/radiation/radiation_solver/radiation_molecules.f90 b/src/radiation/radiation_solver/radiation_molecules.f90 new file mode 100644 index 000000000..d662c9027 --- /dev/null +++ b/src/radiation/radiation_solver/radiation_molecules.f90 @@ -0,0 +1,1267 @@ +!================================================================================================================================== +! Copyright (c) 2010 - 2019 Prof. Claus-Dieter Munz and Prof. Stefanos Fasoulas +! +! This file is part of PICLas (gitlab.com/piclas/piclas). PICLas is free software: you can redistribute it and/or modify +! it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 +! of the License, or (at your option) any later version. +! +! PICLas is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty +! of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License v3.0 for more details. +! +! You should have received a copy of the GNU General Public License along with PICLas. If not, see . +!================================================================================================================================== +#include "piclas.h" + +MODULE MOD_Radiation_Molecules +!=================================================================================================================================== +! Module for Radiation +!=================================================================================================================================== +! MODULES +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +PRIVATE + +INTERFACE radiation_molecules + MODULE PROCEDURE radiation_molecules +END INTERFACE + +!----------------------------------------------------------------------------------------------------------------------------------- +! GLOBAL VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! Private Part --------------------------------------------------------------------------------------------------------------------- +! Public Part ---------------------------------------------------------------------------------------------------------------------- +PUBLIC :: radiation_molecules +!=================================================================================================================================== + +CONTAINS + + +SUBROUTINE radiation_molecules(iElem, em_mol) +!=================================================================================================================================== +! Main routine of atom radiation calculation +!=================================================================================================================================== +! MODULES + USE MOD_Globals + USE MOD_Globals_Vars, ONLY : BoltzmannConst, PlanckConst, ElementaryCharge, AtomicMassUnit, Pi + USE MOD_Radiation_Vars, ONLY : RadiationInput, RadiationParameter, SpeciesRadiation, & + Radiation_Emission_spec, Radiation_Absorption_spec, NumDensElectrons, TElectrons, & + Radiation_ElemEnergy_Species + USE MOD_Particle_Vars, ONLY : nSpecies + USE MOD_Equation_Vars, ONLY : c + USE MOD_DSMC_Vars, ONLY : SpecDSMC + +! IMPLICIT VARIABLE HANDLING + IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES + REAL, INTENT(INOUT) :: em_mol + INTEGER, INTENT(IN) :: iElem +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES + + INTEGER :: iSpec, iWave, iBand, iTrans, i, hilf + REAL :: rho, ptot !in ini !density [kg/m**3], pressure [Pa], number density + REAL, ALLOCATABLE :: epsilon_mol(:), epsilon_iSpec(:), abs_iSpec(:) + INTEGER :: istart, iend + REAL :: v_upper, v_lower ! vibrational quantum number of upper/lower state + REAL :: ElecTransMoment_squared ! squared electronic transition moment Re(r_{v_upper,v_lower})^2 + REAL :: Bv_upper, Bv_lower ! rotational constants for the vibrational level v_upper/lower, cm^-1 + REAL :: Dv_upper, Dv_lower ! rotational constants for the vibrational level v_upper/lower, cm^-1 + REAL :: G_upper, G_lower ! G(v) = we(v+0.5) - wexe(v+0.5)**2 + weye(v+0.5)**3 + weze(v+0.5)**4 + REAL :: cint1, cint2, nubar0, r1 ! TODO: RENAME, nubar0 [cm**-1] + INTEGER :: kmax ! TODO: RENAME maximum rotational quantum number (NEQAIR85 determines the maximum rotational quantum number by determining approximately 0.01 of the maximum radiation. This approach is not longer followed since the combination of the radiating band to more transitions had the effect that no rotational lines were computed for higher vibrational levels. Now, the maximum rotational quantum number is determined from the dissociation energy (only bvu is used, since otherwise an iterative procedure would be necessary) mf 2007/07/18) + REAL :: DlamG, DlamL, DlamV ! Gaussian, Lorentzian and Voigt width_int [m] + REAL :: DlamL1, DlamL2, DlamL3, DlamL4 ! 1: collisions with molecules, 2: collisions with all other, 3: natural, 4: Stark [m] + REAL, PARAMETER :: Stark = 0.3 ! Stark width at NumDensElectrons=1.E16 and TElectrons = 10000 + REAL :: NumDensForeignGas,MolWeightForeignGas! number density and average molecular weight of foreign gas + + INTEGER, PARAMETER:: Voigt_int_nmax = 1001 + REAL, PARAMETER :: Voigt_mult_discr = 25. + REAL :: Voigt_int(-Voigt_int_nmax:Voigt_int_nmax), Voigt_int_step, Voigt + REAL :: Voigt_var1, Voigt_const1, Voigt_const2, Voigt_int_distmax, Voigt_arg_dimless, Voigt_int_NormEnergy + INTEGER :: iVoigt + REAL :: Voigt_dist1, Voigt_dist2, Voigt_dist225 + + REAL :: j_upper, j_lower, j_transition + REAL :: k_upper, k_lower + INTEGER :: k, iBranch + REAL :: HoenlLondon_3p3p(0:500,8), HoenlLondon_2p2p(500,12), HoenlLondon_2s2s(0:500,6) !hoenl-london compution + + INTEGER, PARAMETER:: Deltak_upper_3p3p(8) = [1,-1,1,-0,-1,1,0,-1] + INTEGER, PARAMETER:: Deltak_lower_3p3p(8) = [0, 0,0,0, 0,0,0, 0] + INTEGER, PARAMETER:: Deltak_upper_2p2p(12) = [-1,0,1, 0,0,1,-1,0,1,-1,0,1] + INTEGER, PARAMETER:: Deltak_lower_2p2p(12) = [0, 0,0,-1,0,0, 0,0,0, 0,0,0] + INTEGER, PARAMETER:: Deltak_upper_2s2s(6) = [1,1,-1,-1,1,-1] + INTEGER, PARAMETER:: Deltak_lower_2s2s(6) = [0,0, 0, 0,0, 0] + + REAL :: Lambda_upper, Lambda_lower ! Bahndrehimpulsquantenzahl + REAL :: Y_upper, Y_lower,Y_transition ! Y = A/Bv + REAL :: F_upper, F_lower + REAL :: Z1_upper, Z1_lower, Z2_upper, Z2_lower + REAL :: nubar, r2!, lambda ! wavenumber [cm**-1], , wavelength [m] + + REAL :: etot, abstot, eps + REAL, PARAMETER :: a0e = 2.5415785E-18 + REAL :: AlternationFactor ! alternation factor for homocuclear molecules + REAL :: HoenlLondon, u + + REAL, ALLOCATABLE :: Radiation_Profile(:) + REAL :: TempOut_Em, TempOut_Abs +!=================================================================================================================================== + +! --- loop for ptot and rho over all atoms and molecules, additionally electrons + rho = 0.0 + ptot = 0.0 + + DO iSpec = 1, nSpecies + rho = rho + RadiationInput(iSpec)%NumDens * RadiationInput(iSpec)%Mass + ptot = ptot + RadiationInput(iSpec)%NumDens * BoltzmannConst * RadiationInput(iSpec)%Ttrans(4) + END DO + ptot = ptot + NumDensElectrons * BoltzmannConst * TElectrons ! TODO: isp -> should be electrons? Radiation: NumDens(N2), Telec + +! --- initialize emission coefficient + ALLOCATE(epsilon_mol(RadiationParameter%WaveLenDiscr)) + ALLOCATE(epsilon_iSpec(RadiationParameter%WaveLenDiscr)) + ALLOCATE(abs_iSpec(RadiationParameter%WaveLenDiscr)) + ALLOCATE(Radiation_Profile(RadiationParameter%WaveLenDiscr)) + DO iWave=1, RadiationParameter%WaveLenDiscr + epsilon_mol(iWave) = 0.0 !Radiation_Emission_spec(iWave,iElem) + END DO + + istart = RadiationParameter%WaveLenDiscr + iend = 1 + + DO iSpec = 1, nSpecies + IF((SpecDSMC(iSpec)%InterID .NE. 2) .AND. (SpecDSMC(iSpec)%InterID .NE. 20)) CYCLE + Radiation_Profile = 0.0 + IF ((RadiationInput(iSpec)%Telec.LE.0.0).OR.(RadiationInput(iSpec)%Tvib.LE.0.0))CYCLE + epsilon_iSpec = 0.0 + abs_iSpec = 0.0 + + IF(SpeciesRadiation(iSpec)%nBands.NE.0) THEN + +! --- determine number density and average weight of foreign gas + NumDensForeignGas = 1.0E10 + IF (ptot .GT. 1.0E-16) & + NumDensForeignGas = MAX(ptot/(RadiationInput(iSpec)%Ttrans(4)*BoltzmannConst) - RadiationInput(iSpec)%NumDens , & + 1.0D-40*ptot/(RadiationInput(iSpec)%Ttrans(4)*BoltzmannConst)) + + MolWeightForeignGas = 20. * AtomicMassUnit + IF(rho .GT. 1.0E-16) MolWeightForeignGas = (rho - RadiationInput(iSpec)%Mass*RadiationInput(iSpec)%NumDens) / NumDensForeignGas + MolWeightForeignGas = MolWeightForeignGas / (AtomicMassUnit * 1.0E-3) + IF(MolWeightForeignGas .LT. 10.*1.0E-3*AtomicMassUnit) MolWeightForeignGas = 10. * 1.0E-3 * AtomicMassUnit + IF(MolWeightForeignGas .GT. 28.85*1.0E-3*AtomicMassUnit) MolWeightForeignGas = 28.85* 1.0E-3 * AtomicMassUnit + + DO iBand = 1,SpeciesRadiation(iSpec)%nBands + ! WRITE(*,*) TRIM(SpeciesRadiation(iSpec)%BandName(iBand)) + + !! TODO : IF ( 2 .EQ. 2) diatomic molecule + ! ----------------------------------------------------------------------------------------------------------------------------------- + ! ------------------------------------------------- diatomic molecule calculation --------------------------------------------------- + ! ----------------------------------------------------------------------------------------------------------------------------------- + + ! --- cycle over all transitions of electronic bands + DO iTrans = 1, SpeciesRadiation(iSpec)%NumMolecularTransitions(iBand) + v_upper = SpeciesRadiation(iSpec)%Bands(iBand)%MolTransLines(iTrans,1) + v_lower = SpeciesRadiation(iSpec)%Bands(iBand)%MolTransLines(iTrans,2) + ElecTransMoment_squared = SpeciesRadiation(iSpec)%Bands(iBand)%MolTransLines(iTrans,3) & + * REAL(SpeciesRadiation(iSpec)%BandProperties(iBand,4)) + ! --- rotational constants for this band + Bv_upper = SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,1), 8) & + - SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,1), 9) * (v_upper+0.5) + Bv_lower = SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,2), 8) & + - SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,2), 9) * (v_lower+0.5) + Dv_upper = SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,1),13) & + + SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,1),14) * (v_upper+0.5) + Dv_lower = SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,2),13) & + + SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,2),14) * (v_lower+0.5) + + ! --- constants for intensity equation in rotational structure + G_upper =SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,1) ,4) * (v_upper+0.5) & + - SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,1) ,5) * (v_upper+0.5)**2 & + + SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,1) ,6) * (v_upper+0.5)**3 & + + SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,1) ,7) * (v_upper+0.5)**4 + G_lower =SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,2) ,4) * (v_lower+0.5) & + - SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,2) ,5) * (v_lower+0.5)**2 & + + SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,2) ,6) * (v_lower+0.5)**3 & + + SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,2) ,7) * (v_lower+0.5)**4 + + cint1 = SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,1),2) & + / RadiationInput(iSpec)%Telec + G_upper / RadiationInput(iSpec)%Tvib + cint2 = (16.0E-5*c* RadiationInput(iSpec)%NumDens * 1.0E-6 * SpeciesRadiation(iSpec)%Bands(iBand)%MolTransLines(iTrans,4) & + * ElecTransMoment_squared * Pi**3) / (3.0 * SpeciesRadiation(iSpec)%PartFunc) + + kmax = INT( SQRT( MAX(0.D0, & + 0.25 + ( SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,2),3) & + - G_lower ) / Bv_lower ) + 1. ) ) + + ! --- band origin + nubar0 = (( SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,1),2) & + - SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,2),2) ) & + + (G_upper - G_lower)) / (100.*PlanckConst*c) ! energy conversion J -> cm**-1 + + r1 = EXP( ( SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,1),2) & + - SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,2),2) ) & + / (BoltzmannConst * RadiationInput(iSpec)%Telec) + (G_upper-G_lower) / (BoltzmannConst * RadiationInput(iSpec)%Tvib) ) + + ! --- check if transition is in considered wavelength interval + IF( (2.0/(100.*nubar0)) .LT. RadiationParameter%WaveLen(1) ) CYCLE + IF( (0.5/(100.*nubar0)) .GT. RadiationParameter%WaveLen(RadiationParameter%WaveLenDiscr) ) CYCLE + + ! --- widths + DlamG = 7.16E-7 / (100.*nubar0) * SQRT(RadiationInput(iSpec)%Ttrans(4)/(RadiationInput(iSpec)%Mass/AtomicMassUnit)) + + DlamL1 = 1.33E-29 * SQRT(2.0/(RadiationInput(iSpec)%Mass/AtomicMassUnit)) & + * (0.01/nubar0)**2 * SQRT(RadiationInput(iSpec)%Ttrans(4)) * RadiationInput(iSpec)%NumDens * 1.0E-6 * 10. * 1.0E10 + DlamL2 = 5.85E-30 * SQRT(1.0/(RadiationInput(iSpec)%Mass/AtomicMassUnit)+1./(MolWeightForeignGas/(AtomicMassUnit*1.0E-3))) & + * (0.01/nubar0)**2 * SQRT(RadiationInput(iSpec)%Ttrans(4)) * NumDensForeignGas * 1.0E-6 * 10. * 1.0E10 + DlamL3 = 1.18E-4 * 1.0E-10 + DlamL4 = 1.0E-8 * Stark * (1.0E-22 * MAX(NumDensElectrons, 1.E-6))**0.6 * (0.01/nubar0)**2 * 1.0E10 + DlamL = DlamL1 + DlamL2 + DlamL3 + DlamL4 + + ! --- Voigt-line width at half maximum + DlamV = Dlaml/2.0 + SQRT( Dlaml**2/4.0 + Dlamg**2 ) + + ! --- generate Voigt line profile + Voigt_int(-Voigt_int_nmax) = 0. !initialize Voigt profile + Voigt_int( Voigt_int_nmax) = 1. + + Voigt_int_distmax = Voigt_mult_discr * DlamV !determine discretised interval + Voigt_arg_dimless = DlamL/DlamV + Voigt_var1 = 1./((1.065 + (0.447 + 0.058 * Voigt_arg_dimless) * Voigt_arg_dimless) * DlamV) + Voigt_const2 = Voigt_arg_dimless * Voigt_var1 + Voigt_const1 = Voigt_var1 - Voigt_const2 + Voigt_int_step = Voigt_int_distmax / (Voigt_int_nmax-1) !step width + + DO iVoigt = -(Voigt_int_nmax-1), 0 !determine lower half of Voigt profile + Voigt_dist1 = REAL(ABS(iVoigt)) * Voigt_int_step / (DlamV) + Voigt_dist2 = Voigt_dist1**2 + Voigt_dist225 = Voigt_dist2 * SQRT(SQRT(Voigt_dist1)) + + Voigt = Voigt_const1 * EXP(-2.772*Voigt_dist2) + Voigt_const2 / (1.+4.*Voigt_dist2) & + + 0.016 * Voigt_const2 * (1.-Voigt_arg_dimless) * (EXP(-0.4*Voigt_dist225) & + - 10. / (10. + Voigt_dist225)) + + Voigt_int(iVoigt) = Voigt_int(iVoigt-1) + Voigt * Voigt_int_step + END DO + + DO iVoigt = 1, (Voigt_int_nmax-1) ! determine upper half of Voigt profile + Voigt_int(iVoigt) = 2. * Voigt_int(0) - Voigt_int(-iVoigt) + END DO + + Voigt_int_NormEnergy = 1./ Voigt_int(Voigt_int_nmax-1) + + DO iVoigt = -(Voigt_int_nmax-1), (Voigt_int_nmax-1) ! normalize profiles that energy below the Voigt profile function is 1 (integrated profiles are normed to 1) + Voigt_int(iVoigt) = Voigt_int(iVoigt) * Voigt_int_NormEnergy + END DO + + + ! --- different radiating systems + SELECT CASE (SpeciesRadiation(iSpec)%BandProperties(iBand,3)) + + CASE(1) ! parallel transition, Delta Lambda = 0 + + etot = 0.0 + + ! --- set constants to determine wavelength of center line for triplets (Herzberg p.235) + Lambda_upper = SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,1),17) + Lambda_lower = SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,2),17) + Y_upper = SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,1),16) / Bv_upper + Y_lower = SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,2),16) / Bv_lower + + DO iBranch = 1,2 + + SELECT CASE(iBranch) + CASE(1) !set quantum numbers for P branch (+1) + k_upper = 0.0 + k_lower = k_upper + 1.0 + CASE(2) !set quantum numbers for R branch (-1) + k_upper = 0.0 + k_lower = k_upper - 1.0 + CASE DEFAULT + WRITE(*,*) 'branch not found' + END SELECT + + ! --- compute and distribute the integrated integrated intensity due to spontaneous emission of all specified rotational lines for the appropriate branch + DO k = 0, kmax + + Z1_upper = Lambda_upper**2 * Y_upper * (Y_upper - 4.) + 4./3. + 4. * k_upper * (k_upper + 1.) + Z1_lower = Lambda_lower**2 * Y_lower * (Y_lower - 4.) + 4./3. + 4. * k_lower * (k_lower + 1.) + + IF(Lambda_upper .EQ. 0.0) THEN + IF(SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,1),1) .NE. 3.0) THEN + Z2_upper = 0.0 + Z2_lower = 0.0 + ELSE + Z2_upper = (Lambda_upper**2 * Y_upper * (Y_upper-1.) - 4./9. - 2. * k_upper * (k_upper+1.)) / (3.*Z1_upper) ! TODO: + or - 4/9? + Z2_lower = (Lambda_lower**2 * Y_lower * (Y_lower-1.) - 4./9. - 2. * k_lower * (k_lower+1.)) / (3.*Z1_lower) ! TODO: + or - 4/9? + END IF + ELSE + IF((SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,1),1)/2.0) & + .NE. 3.0) THEN + Z2_upper = 0.0 + Z2_lower = 0.0 + ELSE + Z2_upper = (Lambda_upper**2 * Y_upper * (Y_upper-1.) - 4./9. - 2. * k_upper * (k_upper+1.)) / (3.*Z1_upper) ! TODO: + or - 4/9? + Z2_lower = (Lambda_lower**2 * Y_lower * (Y_lower-1.) - 4./9. - 2. * k_lower * (k_lower+1.)) / (3.*Z1_lower) ! TODO: + or - 4/9? + END IF + END IF + + ! --- compute wavelength of line center + F_upper = Bv_upper * (k_upper * (k_upper + 1.) + 4. * Z2_upper) - Dv_upper * (k_upper + 0.5)**4 + F_lower = Bv_lower * (k_lower * (k_lower + 1.) + 4. * Z2_lower) - Dv_lower * (k_lower + 0.5)**4 + nubar = nubar0 + (F_upper - F_lower) / (100.*PlanckConst*c) + r2 = EXP( (F_upper-F_lower) / (BoltzmannConst*RadiationInput(iSpec)%Trot) ) * r1 + + SELECT CASE(iBranch) + CASE(1) !set HLF for P branch (+1) + HoenlLondon = k_upper + 1.0 + CASE(2) !set HLF for R branch (-1) + HoenlLondon = k_upper + END SELECT + + ! --- evaluate the alternation factor for homocuclear molecules + IF(SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,1),12) .EQ. 0.0) THEN + AlternationFactor = 1.0 + ELSE + AlternationFactor = 1.0 + (-1.0)**NINT(k_lower & + + SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,1),12)) & + / (2.0*SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,2),11) + 1.0) !Radiation: kexp=INT(jl+altnat(uplev)+0.1) + END IF + + ! --- find integrated line intensity due to spontaneous emission (etot) and sum of absorption and stimulated emission (abstot) + eps = 1.0E16 * AlternationFactor * HoenlLondon * (nubar**2 * a0e)**2 * cint2 & + * EXP(-(cint1 + (Bv_upper * k_upper * (k_upper + 1.)) / RadiationInput(iSpec)%Trot) / BoltzmannConst) + abstot = (nubar**(-5)) * (r2 - 1.0) * eps / (2.E10 * PlanckConst * c**2) +! abstot = c*c/(8.*Pi*nubar*nubar) & +! * 16.*Pi**3*nubar**3/(3.*8.8541878128E-12*PlanckConst*c**3) & +! * SpeciesRadiation(iSpec)%Bands(iBand)%MolTransLines(iTrans,4)*ElecTransMoment_squared*HoenlLondon/(2.*J+1.) & +! * (RadiationInput(iSpec)%NumDens / SpeciesRadiation(iSpec)%PartFunc & +! * SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,2),2) & +! * EXP(-(SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,1),2) & +! / RadiationInput(iSpec)%Telec + G_upper / RadiationInput(iSpec)%Tvib +! + (Bv_upper * k_upper * (k_upper + 1.)) / RadiationInput(iSpec)%Trot) / BoltzmannConst) & +! * SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,2),1) & +! / SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,2),2) & +! - (RadiationInput(iSpec)%NumDens / SpeciesRadiation(iSpec)%PartFunc & +! * SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,2),1) & +! * EXP(-(SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,1),2) & +! / RadiationInput(iSpec)%Telec + G_lower / RadiationInput(iSpec)%Tvib +! + (Bv_lower * k_lower * (k_lower + 1.)) / RadiationInput(iSpec)%Trot) / BoltzmannConst) ) + +! abstot = 2.*Pi*Pi*nubar/(3.*8.8541878128E-12*PlanckConst*c) & +! * SpeciesRadiation(iSpec)%Bands(iBand)%MolTransLines(iTrans,4)*ElecTransMoment_squared*HoenlLondon/(2.*J+1.) & +! * (RadiationInput(iSpec)%NumDens / SpeciesRadiation(iSpec)%PartFunc & +! * SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,2),2) & +! * EXP(-(SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,1),2) & +! / RadiationInput(iSpec)%Telec + G_upper / RadiationInput(iSpec)%Tvib +! + (Bv_upper * k_upper * (k_upper + 1.)) / RadiationInput(iSpec)%Trot) / BoltzmannConst) & +! * SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,2),1) & +! / SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,2),2) & +! - (RadiationInput(iSpec)%NumDens / SpeciesRadiation(iSpec)%PartFunc & +! * SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,2),1) & +! * EXP(-(SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,1),2) & +! / RadiationInput(iSpec)%Telec + G_lower / RadiationInput(iSpec)%Tvib +! + (Bv_lower * k_lower * (k_lower + 1.)) / RadiationInput(iSpec)%Trot) / BoltzmannConst) ) + etot = etot + eps + + ! --- calculate line profile and add radiative energy to emission + IF(eps .GE. 1.0E-25) THEN + CALL Radiation_Molecular_Transition_Line_Profile(Radiation_Profile, nubar, Voigt_int, Voigt_int_distmax, & + DlamL, DlamV, epsilon_mol, epsilon_iSpec, eps, Radiation_Absorption_spec, abs_iSpec, abstot, iElem) + END IF + + k_lower = k_lower + 1.0 + k_upper = k_upper + 1.0 + + END DO !k + END DO !iBranch + + CASE(2) ! perpendicular transition, Delta Lambda = +-1 + + ! --- adjust factor used in intesity equation to correct partcc for lambda doubling + IF(SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,1),17) .GE. 0.5) & + cint2 = cint2 / 2.0 + + etot = 0.0 + + DO iBranch = 1,3 + + SELECT CASE(iBranch) + CASE(1) !set quantum numbers for P branch (+1) + k_upper = 1.0 + k_lower = k_upper + 1.0 + CASE(2) !set quantum numbers for Q branch ( 0) + k_upper = 1.0 + k_lower = k_upper + CASE(3) !set quantum numbers for R branch (-1) + k_upper = 1.0 + k_lower = k_upper - 1.0 + CASE DEFAULT + WRITE(*,*) 'branch not found' + END SELECT + + ! --- compute and distribute the integrated intensity due to spontaneous emission of all specified rotational lines + DO k = 1, kmax + ! --- compute line center + F_upper = Bv_upper * (k_upper * (k_upper + 1.0)) - Dv_upper * (k_upper + 0.5)**4 + F_lower = Bv_lower * (k_lower * (k_lower + 1.0)) - Dv_lower * (k_lower + 0.5)**4 + nubar = nubar0 + (F_upper - F_lower) / (100.*PlanckConst*c) + ! lambda = 1./(100.*nubar) + r2 = EXP( (F_upper-F_lower) / (BoltzmannConst*RadiationInput(iSpec)%Trot) ) * r1 + + ! --- strength factor, set sign of Lambda used in strength equations, appropriate to the sigh of Delta Lambda (Johnson p.150) + IF(SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,1),17) .LT. & + SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,2),17)) THEN + SELECT CASE(iBranch) + CASE(1) + HoenlLondon = (k_upper + 1.0 & + + SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,1),17)) & + * (k_upper + 2.0 & + + SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,1),17)) & + / (k_upper + 1.0) + CASE(2) + HoenlLondon = (k_upper & + - SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,1),17)) & + * (2.0 * k_upper + 1.0) & + * (k_upper + 1.0 & + + SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,1),17)) & + / (k_upper * (k_upper + 1.0)) + CASE(3) + HoenlLondon = (k_upper & + - SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,1),17)) & + * (k_upper - 1.0 & + - SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,1),17)) & + / k_upper + END SELECT + ELSE + SELECT CASE(iBranch) + CASE(1) + HoenlLondon = (k_upper + 1.0 & + - SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,1),17)) & + * (k_upper + 2.0 & + - SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,1),17)) & + / (k_upper + 1.0) + CASE(2) + HoenlLondon = (k_upper & + + SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,1),17)) & + * (2.0 * k_upper + 1.0) & + * (k_upper + 1.0 & + - SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,1),17)) & + / (k_upper * (k_upper + 1.0)) + CASE(3) + HoenlLondon = (k_upper & + + SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,1),17)) & + * (k_upper - 1.0 & + + SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,1),17)) & + / k_upper + END SELECT + END IF + + ! --- determine if lines alternate in intesity -> evaluate the alternation factor for homocuclear molecules + IF(SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,1),12) .EQ. 0.0) THEN + AlternationFactor = 1.0 + ELSE + AlternationFactor = 1.0 + (-1.0)**NINT(k_lower & + + SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,1),12)) & + / (2.0*SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,2),11) + 1.0) !Radiation: kexp=INT(jl+altnat(uplev)+0.1) + END IF + + eps = 1.0E16 * AlternationFactor * HoenlLondon * (nubar**2 * a0e)**2 * cint2 & + * EXP(-(cint1 + (Bv_upper * k_upper * (k_upper + 1.)) / RadiationInput(iSpec)%Trot) / BoltzmannConst) + abstot = (nubar**(-5)) * (r2 - 1.0) * eps / (2.E10 * PlanckConst * c**2) + etot = etot + eps + + ! --- calculate line profile and add radiative energy to emission + IF(eps .GE. 1.0E-25) THEN + CALL Radiation_Molecular_Transition_Line_Profile(Radiation_Profile, nubar, Voigt_int, Voigt_int_distmax, & + DlamL, DlamV, epsilon_mol, epsilon_iSpec, eps, Radiation_Absorption_spec, abs_iSpec, abstot, iElem) + END IF + + k_lower = k_lower + 1.0 + k_upper = k_upper + 1.0 + + END DO !k + END DO ! iBranch + + CASE(3) ! 2Sigma -> 2Pi + + Lambda_upper = SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,1),17) + Lambda_lower = SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,2),17) + Y_upper = SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,1),16) / Bv_upper + Y_lower = SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,2),16) / Bv_lower + + ! --- set Y_transition depending on direction of transition + IF(Lambda_upper .GT. Lambda_lower) THEN !Pi -> Sigma transition + Y_transition = Y_upper + ELSE !Sigma -> Pi transition + Y_transition = Y_lower + END IF + + etot = 0.0 + + DO iBranch = 1,8 + + ! --- Pi -> Sigma transition + IF(Lambda_upper .GT. Lambda_lower) THEN + SELECT CASE(iBranch) + CASE(1) !set quantum numbers for P2 branch + j_upper = 1.5 + j_lower = j_upper + 1.0 + CASE(2) !set quantum numbers for R1 branch + j_upper = 2.5 + j_lower = j_upper - 1.0 + CASE(3) !set quantum numbers for R21 branch + j_upper = 1.5 + j_lower = j_upper - 1.0 + CASE(4) !set quantum numbers for OP12 branch + j_upper = 2.5 + j_lower = j_upper + 1.0 + CASE(5) !set quantum numbers for Q2/QP21 branch + j_upper = 1.5 + j_lower = j_upper + CASE(6) !set quantum numbers for Q1/QR12 branch + j_upper = 2.5 + j_lower = j_upper + CASE(7) !set quantum numbers for R2/RQ21 branch + j_upper = 1.5 + j_lower = j_upper - 1.0 + CASE(8) !set quantum numbers for P1/PQ12 branch + j_upper = 2.5 + j_lower = j_upper + 1.0 + CASE DEFAULT + WRITE(*,*) 'branch not found' + END SELECT + ! --- Sigma -> Pi transition + ELSE + SELECT CASE(iBranch) + CASE(1) !set quantum numbers for R2 branch + j_upper = 1.5 + j_lower = j_upper - 1.0 + CASE(2) !set quantum numbers for P1 branch + j_upper = 2.5 + j_lower = j_upper + 1.0 + CASE(3) !set quantum numbers for SR21 branch + j_upper = 1.5 + j_lower = j_upper - 1.0 + CASE(4) !set quantum numbers for OP12 branch + j_upper = 2.5 + j_lower = j_upper + 1.0 + CASE(5) !set quantum numbers for Q2/QR12 branch + j_upper = 1.5 + j_lower = j_upper + CASE(6) !set quantum numbers for Q1/QP21 branch + j_upper = 2.5 + j_lower = j_upper + CASE(7) !set quantum numbers for P2/PQ12 branch + j_upper = 1.5 + j_lower = j_upper + 1.0 + CASE(8) !set quantum numbers for R1/RQ21 branch + j_upper = 2.5 + j_lower = j_upper - 1.0 + CASE DEFAULT + WRITE(*,*) 'branch not found' + END SELECT + END IF + + ! --- set j_transition depending on direction of transition, j is the rotational quatum number of the Pi state (reference by Earls) + IF(Lambda_upper .GT. Lambda_lower) THEN !Pi -> Sigma transition + j_transition = j_upper + ELSE !Sigma -> Pi transition + j_transition = j_lower + END IF + + DO k = 2, kmax + + IF((iBranch .EQ. 1) .OR. (iBranch .EQ. 5) .OR. (iBranch .EQ. 7)) THEN + F_upper = Bv_upper * ( (j_upper+0.5)**2 - Lambda_upper**2 + .5 * SQRT(4. * (j_upper+0.5)**2 & + - 4. * Y_upper * Lambda_upper**2 + (Y_upper * Lambda_upper)**2 )) + F_lower = Bv_lower * ( (j_lower+0.5)**2 - Lambda_lower**2 + .5 * SQRT(4. * (j_lower+0.5)**2 & + - 4. * Y_lower * Lambda_lower**2 + (Y_lower * Lambda_lower)**2 )) + ELSEIF ((iBranch .EQ. 2) .OR. (iBranch .EQ. 6) .OR. (iBranch .EQ. 8)) THEN + F_upper = Bv_upper * ( (j_upper+0.5)**2 - Lambda_upper**2 - .5 * SQRT(4. * (j_upper+0.5)**2 & + - 4. * Y_upper * Lambda_upper**2 + (Y_upper * Lambda_upper)**2 )) + F_lower = Bv_lower * ( (j_lower+0.5)**2 - Lambda_lower**2 - .5 * SQRT(4. * (j_lower+0.5)**2 & + - 4. * Y_lower * Lambda_lower**2 + (Y_lower * Lambda_lower)**2 )) + ELSEIF (iBranch .EQ. 3) THEN + F_upper = Bv_upper * ( (j_upper+0.5)**2 - Lambda_upper**2 + .5 * SQRT(4. * (j_upper+0.5)**2 & + - 4. * Y_upper * Lambda_upper**2 + (Y_upper * Lambda_upper)**2 )) + F_lower = Bv_lower * ( (j_lower+0.5)**2 - Lambda_lower**2 - .5 * SQRT(4. * (j_lower+0.5)**2 & + - 4. * Y_lower * Lambda_lower**2 + (Y_lower * Lambda_lower)**2 )) + ELSEIF (iBranch .EQ. 4) THEN + F_upper = Bv_upper * ( (j_upper+0.5)**2 - Lambda_upper**2 - .5 * SQRT(4. * (j_upper+0.5)**2 & + - 4. * Y_upper * Lambda_upper**2 + (Y_upper * Lambda_upper)**2 )) + F_lower = Bv_lower * ( (j_lower+0.5)**2 - Lambda_lower**2 + .5 * SQRT(4. * (j_lower+0.5)**2 & + - 4. * Y_lower * Lambda_lower**2 + (Y_lower * Lambda_lower)**2 )) + END IF + + nubar = nubar0 + (F_upper - F_lower) / (100.*PlanckConst*c) + r2 = EXP( (F_upper-F_lower) / (BoltzmannConst*RadiationInput(iSpec)%Trot) ) * r1 + + ! --- set strength factor for different branches + u = 1. / SQRT(Y_transition**2 - 4. * Y_transition + (2.*j_transition+1.)**2) + SELECT CASE(iBranch) + CASE(1) + HoenlLondon = ((2. * j_transition + 1.)**2 + (2.*j_transition+1.) * u & + * (4.*j_transition**2 + 4.*j_transition + 1. - 2.*Y_transition) ) / (32. * (j_transition+1.)) + CASE(2) + HoenlLondon = ((2. * j_transition + 1.)**2 + (2.*j_transition+1.) * u & + * (4.*j_transition**2 + 4.*j_transition + 1. - 2.*Y_transition) ) / (32. * (j_transition+0.)) + CASE(3) + HoenlLondon = ((2. * j_transition + 1.)**2 - (2.*j_transition+1.) * u & + * (4.*j_transition**2 + 4.*j_transition + 1. - 2.*Y_transition) ) / (32. * (j_transition+1.)) + CASE(4) + HoenlLondon = ((2. * j_transition + 1.)**2 - (2.*j_transition+1.) * u & + * (4.*j_transition**2 + 4.*j_transition + 1. - 2.*Y_transition) ) / (32. * (j_transition+0.)) + + CASE(5) !double branch + HoenlLondon = ((2. * j_transition + 1.)**2 - (2.*j_transition+1.) * u & + * (4.*j_transition**2 + 4.*j_transition - 7. + 2.*Y_transition) ) / (32. * (j_transition+1.)) + HoenlLondon = HoenlLondon & + + (2. * j_transition + 1.) * ((4.*j_transition**2 + 4.*j_transition - 1.) + u & + * (8.*j_transition**3 + 12.*j_transition**2 - 2.*j_transition + 1. - 2.*Y_transition)) & + / (32. * j_transition * (j_transition+1.)) + CASE(6) !double branch + HoenlLondon = ((2. * j_transition + 1.)**2 - (2.*j_transition+1.) * u & + * (4.*j_transition**2 + 4.*j_transition - 7. + 2.*Y_transition) ) / (32. * (j_transition+0.)) + HoenlLondon = HoenlLondon & + + (2. * j_transition + 1.) * ((4.*j_transition**2 + 4.*j_transition - 1.) + u & + * (8.*j_transition**3 + 12.*j_transition**2 - 2.*j_transition - 7. + 2.*Y_transition)) & + / (32. * j_transition * (j_transition+1.)) + CASE(7) !double branch + HoenlLondon = ((2. * j_transition + 1.)**2 + (2.*j_transition+1.) * u & + * (4.*j_transition**2 + 4.*j_transition - 7. + 2.*Y_transition) ) / (32. * (j_transition+0.)) + HoenlLondon = HoenlLondon & + + (2. * j_transition + 1.) * ((4.*j_transition**2 + 4.*j_transition - 1.) - u & + * (8.*j_transition**3 + 12.*j_transition**2 - 2.*j_transition - 7. + 2.*Y_transition)) & + / (32. * j_transition * (j_transition+1.)) + CASE(8) !double branch + HoenlLondon = ((2. * j_transition + 1.)**2 + (2.*j_transition+1.) * u & + * (4.*j_transition**2 + 4.*j_transition - 7. + 2.*Y_transition) ) / (32. * (j_transition+1.)) + HoenlLondon = HoenlLondon & + + (2. * j_transition + 1.) * ((4.*j_transition**2 + 4.*j_transition - 1.) - u & + * (8.*j_transition**3 + 12.*j_transition**2 - 2.*j_transition + 1. - 2.*Y_transition)) & + / (32. * j_transition * (j_transition+1.)) + END SELECT + + ! --- determine if lines alternate in intesity -> evaluate the alternation factor for homocuclear molecules + IF(SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,1),12) .EQ. 0.0) THEN + AlternationFactor = 1.0 + ELSE + AlternationFactor = 1.0 + (-1.0)**NINT(k_lower & + + SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,1),12)) & + / (2.0*SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,2),11) + 1.0) !Radiation: kexp=INT(jl+altnat(uplev)+0.1) + END IF + + eps = 1.0E16 * AlternationFactor * MAX(0.,HoenlLondon) * (nubar**2 * a0e)**2 * cint2 & + * EXP(-(cint1 + (Bv_upper * j_upper * (j_upper + 1.)) / RadiationInput(iSpec)%Trot) / BoltzmannConst) + abstot = (nubar**(-5)) * (r2 - 1.0) * eps / (2.E10 * PlanckConst * c**2) + etot = etot + eps + + ! --- calculate line profile and add radiative energy to emission + IF(eps .GE. 1.0E-25) THEN + CALL Radiation_Molecular_Transition_Line_Profile(Radiation_Profile, nubar, Voigt_int, Voigt_int_distmax, & + DlamL, DlamV, epsilon_mol, epsilon_iSpec, eps, Radiation_Absorption_spec, abs_iSpec, abstot, iElem) + END IF + + j_lower = j_lower + 1.0 + j_upper = j_upper + 1.0 + j_transition = j_transition + 1.0 + + END DO !k + END DO !iBranch + + CASE(4) ! 2Sigma -> 2Sigma + + ! --- computing Hoenl-London factors for 2Sigma->2Sigma transitions for diatomic molecules + DO k = 0, 500 + ! --- Branch 01: R1 branch + j_upper = REAL(k + 1.) + j_lower = REAL(k ) + HoenlLondon_2s2s(k,1) = (j_lower + 1.) * (j_lower + 2.) / (2. * j_lower + 3.) + ! --- Branch 02: R2 branch + j_upper = REAL(k + 1.) + j_lower = REAL(k ) + HoenlLondon_2s2s(k,2) = j_lower * (j_lower + 1.) / (2. * j_lower + 1.) + ! --- Branch 03: P1 branch + j_upper = REAL(k - 1.) + j_lower = REAL(k ) + HoenlLondon_2s2s(k,3) = j_lower * (j_lower - 1.) / (2. * j_lower - 1.) + ! --- Branch 04: P2 branch + j_upper = REAL(k - 1.) + j_lower = REAL(k ) + HoenlLondon_2s2s(k,4) = j_lower * (j_lower + 1.) / (2. * j_lower + 1.) + ! --- Branch 05: RG21 branch + j_upper = REAL(k + 1.) + j_lower = REAL(k ) + HoenlLondon_2s2s(k,5) = j_lower / ( (2. * j_lower - 1.) * (2. * j_lower + 1.) ) + ! --- Branch 06: RQ21 Satelliten-Zweig + j_upper = REAL(k - 1.) + j_lower = REAL(k ) + HoenlLondon_2s2s(k,6) = (j_lower + 1.) / ( (2. * j_lower + 1.) * (2. * j_lower + 3.) ) + END DO + + Lambda_upper = SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,1),17) + Lambda_lower = SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,2),17) + Y_upper = SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,1),16) / Bv_upper + Y_lower = SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,2),16) / Bv_lower + + etot = 0.0 + !PRINT*, kmax + DO iBranch = 1, 6 + DO k = 0, kmax + j_upper = REAL(k + Deltak_upper_2s2s(iBranch)) + j_lower = REAL(k + Deltak_lower_2s2s(iBranch)) + + IF((iBranch .EQ. 1) .OR. (iBranch .EQ. 3)) THEN + F_upper = Bv_upper * ( (j_upper+0.5)**2 - Lambda_upper**2 - .5 * SQRT(4. * (j_upper+0.5)**2 & + + Y_upper * (Y_upper-4.) * Lambda_upper**2) ) - Dv_upper * (j_upper + 0.)**4 + F_lower = Bv_lower * ( (j_lower+0.5)**2 - Lambda_lower**2 - .5 * SQRT(4. * (j_lower+0.5)**2 & + + Y_lower * (Y_lower-4.) * Lambda_lower**2) ) - Dv_lower * (j_lower + 0.)**4 + ELSEIF ((iBranch .EQ. 2) .OR. (iBranch .EQ. 4)) THEN + F_upper = Bv_upper * ( (j_upper+0.5)**2 - Lambda_upper**2 + .5 * SQRT(4. * (j_upper+0.5)**2 & + + Y_upper * (Y_upper-4.) * Lambda_upper**2) ) - Dv_upper * (j_upper + 1.)**4 + F_lower = Bv_lower * ( (j_lower+0.5)**2 - Lambda_lower**2 + .5 * SQRT(4. * (j_lower+0.5)**2 & + + Y_lower * (Y_lower-4.) * Lambda_lower**2) ) - Dv_lower * (j_lower + 1.)**4 + ELSEIF (iBranch .EQ. 5) THEN + F_upper = Bv_upper * ( (j_upper+0.5)**2 - Lambda_upper**2 + .5 * SQRT(4. * (j_upper+0.5)**2 & + + Y_upper * (Y_upper-4.) * Lambda_upper**2) ) - Dv_upper * (j_upper + 1.)**4 + F_lower = Bv_lower * ( (j_lower+0.5)**2 - Lambda_lower**2 - .5 * SQRT(4. * (j_lower+0.5)**2 & + + Y_lower * (Y_lower-4.) * Lambda_lower**2) ) - Dv_lower * (j_lower + 0.)**4 + ELSEIF (iBranch .EQ. 6) THEN + F_upper = Bv_upper * ( (j_upper+0.5)**2 - Lambda_upper**2 - .5 * SQRT(4. * (j_upper+0.5)**2 & + + Y_upper * (Y_upper-4.) * Lambda_upper**2) ) - Dv_upper * (j_upper + 0.)**4 + F_lower = Bv_lower * ( (j_lower+0.5)**2 - Lambda_lower**2 + .5 * SQRT(4. * (j_lower+0.5)**2 & + + Y_lower * (Y_lower-4.) * Lambda_lower**2) ) - Dv_lower * (j_lower + 1.)**4 + END IF + + nubar = nubar0 + (F_upper - F_lower) / (100.*PlanckConst*c) + r2 = EXP( (F_upper-F_lower) / (BoltzmannConst*RadiationInput(iSpec)%Trot) ) * r1 + + ! --- evaluate the alternation factor for homocuclear molecules + IF(SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,1),12) .EQ. 0.0) THEN + AlternationFactor = 1.0 + ELSE + AlternationFactor = 1.0 + (-1.0)**NINT(j_lower & + + SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,1),12)) & + / (2.0*SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,2),11) + 1.0) !Radiation: kexp=INT(jl+altnat(uplev)+0.1) + END IF + + eps = 1.0E16 * AlternationFactor * HoenlLondon_2s2s(k,iBranch) * (nubar**2 * a0e)**2 * cint2 & + * EXP(-(cint1 + (Bv_upper * j_upper * (j_upper + 1.)) / RadiationInput(iSpec)%Trot) / BoltzmannConst) + abstot = (nubar**(-5)) * (r2 - 1.0) * eps / (2.E10 * PlanckConst * c**2) + etot = etot + eps + + ! --- calculate line profile and add radiative energy to emission + IF(eps .GE. 1.0E-25) THEN + CALL Radiation_Molecular_Transition_Line_Profile(Radiation_Profile, nubar, Voigt_int, Voigt_int_distmax, & + DlamL, DlamV, epsilon_mol, epsilon_iSpec, eps, Radiation_Absorption_spec, abs_iSpec, abstot, iElem) + END IF + END DO ! k + END DO ! iBranch + + CASE(5) ! 2Pi -> 2Pi + + ! --- computing Hoenl-London factors for 2Pi->2Pi transitions for diatomic molecules + DO k = 3, 500 + ! --- Branch 01: P1 branch + j_upper = REAL(k - 1.) + .5 + j_lower = REAL(k ) + .5 + HoenlLondon_2p2p(k,1) = (j_lower-1.5) * (j_lower+1.5) / (4.*j_lower*ckovacs(j_upper-1.0,+1.0) & + * ckovacs(j_lower,+1.) ) * (ukovacs(j_upper-1.,+1.) * ukovacs(j_lower,+1.) + 4. * (j_lower-.5) * (j_lower+.5 ) ) + ! --- Branch 02: Q1 branch + j_upper = REAL(k ) + .5 + j_lower = REAL(k ) + .5 + HoenlLondon_2p2p(k,2) = (j_lower+.5) / (2. * j_lower*(j_lower+1.) * ckovacs(j_upper,+1.) * ckovacs(j_lower,+1.) ) & + * ( 1.5 * ukovacs(j_upper,+1.) * ukovacs(j_lower,+1.) + 2.*(j_lower-0.5 ) * (j_lower+1.5) )**2 + ! --- Branch 03: R1 branch + j_upper = REAL(k + 1.) + .5 + j_lower = REAL(k ) + .5 + HoenlLondon_2p2p(k,3) = (j_lower-.5) * (j_lower+2.5) / (4. * (j_lower+1.) * ckovacs(j_upper+1.,+1.) & + * ckovacs(j_lower,+1.) ) * (ukovacs(j_upper+1.,+1.) * ukovacs(j_lower,+1.) + 4. * (j_lower+.5) * (j_lower+1.5) )**2 + ! --- Branch 04: QP21 branch + j_upper = REAL(k ) + .5 + j_lower = REAL(k - 1.) + .5 + HoenlLondon_2p2p(k,4) = (j_lower-1.5) * (j_lower+1.5) / (4. * j_lower * ckovacs(j_upper-1.,-1.) & + * ckovacs(j_lower,+1.) ) * (ukovacs(j_upper-1.,-1.) * ukovacs(j_lower,+1.) - 4. * (j_lower-0.5) * (j_lower+0.5) )**2 + ! --- Branch 05: RQ21 branch + j_upper = REAL(k ) + .5 + j_lower = REAL(k ) + .5 + HoenlLondon_2p2p(k,5) = (j_lower + 0.5) / (2. * j_lower * (j_lower+1.) * ckovacs(j_upper,-1.) & + * ckovacs(j_lower,+1.) ) * (1.5*ukovacs(j_upper,-1.) * ukovacs(j_lower,+1.) - 2. * (j_lower-.5) * (j_lower+1.5) )**2 + ! --- Branch 06: SR21 branch + j_upper = REAL(k + 1.) + .5 + j_lower = REAL(k ) + .5 + HoenlLondon_2p2p(k,6) = (j_lower-.5) * (j_lower+2.5) / (4. * (j_lower+1.) * ckovacs(j_upper+1.,-1.) & + * ckovacs(j_lower,+1.) ) * (ukovacs(j_upper+1.,-1.) * ukovacs(j_lower,+1.) - 4. * (j_lower+0.5) * (j_lower+1.5) )**2 + ! --- Branch 07: OP12 branch + j_upper = REAL(k - 1.) + .5 + j_lower = REAL(k ) + .5 + HoenlLondon_2p2p(k,7) = (j_lower-1.5) * (j_lower+1.5) / (4. * j_lower* ckovacs(j_upper-1.,+1.) & + * ckovacs(j_lower,-1.) ) * (ukovacs(j_upper-1.,+1.) * ukovacs(j_lower,-1.) - 4. * (j_lower-0.5) * (j_lower+0.5) )**2 + ! --- Branch 08: PQ12 branch + j_upper = REAL(k ) + .5 + j_lower = REAL(k ) + .5 + HoenlLondon_2p2p(k,8) = (j_lower+0.5) / (2. * j_lower * (j_lower+1.) * ckovacs(j_upper,+1.) * ckovacs(j_lower,-1.) ) & + * (1.5 * ukovacs(j_upper,+1.) * ukovacs(j_lower,-1.) - 2. * (j_lower-.5) * (j_lower+ 1.5) )**2 + ! --- Branch 09: RQ12 branch + j_upper = REAL(k + 1.) + .5 + j_lower = REAL(k ) + .5 + HoenlLondon_2p2p(k,9) = (j_lower-.5) * (j_lower+2.5) / (4. * (j_lower+1.) * ckovacs(j_upper+1.,+1.) & + * ckovacs(j_lower,-1.) ) * (ukovacs(j_upper+1.,+1.) * ukovacs(j_lower,-1.)- 4. * (j_lower+.5) * (j_lower+1.5) )**2 + ! --- Branch 10: P2 branch + j_upper = REAL(k - 1.) + .5 + j_lower = REAL(k ) + .5 + HoenlLondon_2p2p(k,10) = (j_lower-1.5) * (j_lower+1.5) / (4. * j_lower * ckovacs(j_upper-1.,-1.) & + * ckovacs(j_lower,-1.) ) * (ukovacs(j_upper-1.,-1.) * ukovacs(j_lower,-1.) + 4. * (j_lower-.5) * (j_lower+.5) )**2 + ! --- Branch 11: Q2 branch + j_upper = REAL(k ) + .5 + j_lower = REAL(k ) + .5 + HoenlLondon_2p2p(k,11) = (j_lower+.5) / (2. * j_lower * (j_lower+1.) * ckovacs(j_upper,-1.) * ckovacs(j_lower,-1.) ) & + * (1.5 * ukovacs(j_upper,-1.) * ukovacs(j_lower,-1.) + 2. * (j_lower-.5) * (j_lower+1.5) )**2 + ! --- Branch 12: R2 branch + j_upper = REAL(k + 1.) + .5 + j_lower = REAL(k ) + .5 + HoenlLondon_2p2p(k,12) = (j_lower-.5) * (j_lower+2.5) / (4. * (j_lower+1.) * ckovacs(j_upper+1.,-1.) & + * ckovacs(j_lower,-1.) ) * (ukovacs(j_upper+1.,-1.) * ukovacs(j_lower,-1.) + 4. * (j_lower-.5) * (j_lower+1.5) )**2 + END DO + + Lambda_upper = SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,1),17) + Lambda_lower = SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,2),17) + Y_upper = SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,1),16) / Bv_upper + Y_lower = SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,2),16) / Bv_lower + + etot = 0.0 + + DO iBranch = 1, 12 + DO k = 3, kmax + j_upper = REAL(k + Deltak_upper_2p2p(iBranch)) + .5 + j_lower = REAL(k + Deltak_lower_2p2p(iBranch)) + .5 + + IF((iBranch .EQ. 1) .OR. (iBranch .EQ. 2) .OR. (iBranch .EQ. 3)) THEN + F_upper = Bv_upper * ( (j_upper+0.5)**2 - Lambda_upper**2 - 0.5 * SQRT(4. * (j_upper+0.5)**2 & + + Y_upper * (Y_upper-4.) * Lambda_upper**2) ) - Dv_upper * (j_upper + 0.)**4 + F_lower = Bv_lower * ( (j_lower+0.5)**2 - Lambda_lower**2 - 0.5 * SQRT(4. * (j_lower+0.5)**2 & + + Y_lower * (Y_lower-4.) * Lambda_lower**2) ) - Dv_lower * (j_lower + 0.)**4 + ELSEIF ((iBranch .EQ. 4) .OR. (iBranch .EQ. 5) .OR. (iBranch .EQ. 6)) THEN + F_upper = Bv_upper * ( (j_upper+0.5)**2 - Lambda_upper**2 + 0.5 * SQRT(4. * (j_upper+0.5)**2 & + + Y_upper * (Y_upper-4.) * Lambda_upper**2) ) - Dv_upper * (j_upper + 1.)**4 + F_lower = Bv_lower * ( (j_lower+0.5)**2 - Lambda_lower**2 - 0.5 * SQRT(4. * (j_lower+0.5)**2 & + + Y_lower * (Y_lower-4.) * Lambda_lower**2) ) - Dv_lower * (j_lower + 0.)**4 + ELSEIF ((iBranch .EQ. 7) .OR. (iBranch .EQ. 8) .OR. (iBranch .EQ. 9)) THEN + F_upper = Bv_upper * ( (j_upper+0.5)**2 - Lambda_upper**2 - 0.5 * SQRT(4. * (j_upper+0.5)**2 & + + Y_upper * (Y_upper-4.) * Lambda_upper**2) ) - Dv_upper * (j_upper + 0.)**4 + F_lower = Bv_lower * ( (j_lower+0.5)**2 - Lambda_lower**2 + 0.5 * SQRT(4. * (j_lower+0.5)**2 & + + Y_lower * (Y_lower-4.) * Lambda_lower**2) ) - Dv_lower * (j_lower + 1.)**4 + ELSEIF ((iBranch .EQ. 10) .OR. (iBranch .EQ. 11) .OR. (iBranch .EQ. 12)) THEN + F_upper = Bv_upper * ( (j_upper+0.5)**2 - Lambda_upper**2 + 0.5 * SQRT(4. * (j_upper+0.5)**2 & + + Y_upper * (Y_upper-4.) * Lambda_upper**2) ) - Dv_upper * (j_upper + 1.)**4 + F_lower = Bv_lower * ( (j_lower+0.5)**2 - Lambda_lower**2 + 0.5 * SQRT(4. * (j_lower+0.5)**2 & + + Y_lower * (Y_lower-4.) * Lambda_lower**2) ) - Dv_lower * (j_lower + 1.)**4 + END IF + + nubar = nubar0 + (F_upper - F_lower) / (100.*PlanckConst*c) + r2 = EXP( (F_upper-F_lower) / (BoltzmannConst*RadiationInput(iSpec)%Trot) ) * r1 + + ! --- evaluate the alternation factor for homocuclear molecules + IF(SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,1),12) .EQ. 0.0) THEN + AlternationFactor = 1.0 + ELSE + AlternationFactor = 1.0 + (-1.0)**NINT(j_lower & + + SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,1),12)) & + / (2.0*SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,2),11) + 1.0) !Radiation: kexp=INT(jl+altnat(uplev)+0.1) + END IF + + eps = 1.0E16 * AlternationFactor * HoenlLondon_2p2p(k,iBranch) * (nubar**2 * a0e)**2 * cint2 & + * EXP(-(cint1 + (Bv_upper * j_upper * (j_upper + 1.)) / RadiationInput(iSpec)%Trot) / BoltzmannConst) * 0.66 ! TODO: y 0.66? + abstot = (nubar**(-5)) * (r2 - 1.0) * eps / (2.E10 * PlanckConst * c**2) + etot = etot + eps + + ! --- calculate line profile and add radiative energy to emission + IF(eps .GE. 1.0E-25) THEN + CALL Radiation_Molecular_Transition_Line_Profile(Radiation_Profile, nubar, Voigt_int, Voigt_int_distmax, & + DlamL, DlamV, epsilon_mol, epsilon_iSpec, eps, Radiation_Absorption_spec, abs_iSpec, abstot, iElem) + END IF + END DO ! k + END DO ! iBranch + + CASE(6) ! 3Pi -> 3Pi + + ! --- computing Hoenl-London factors for 3Pi->3Pi transitions for diatomic molecules + DO k = 0, 500 + ! --- Branch 01: R1 branch + j_upper = REAL(k + 1.) + 1. + j_lower = REAL(k ) + 1. + HoenlLondon_3p3p(k,1) = (j_lower + 1.) * (j_lower - 1.) / (3. * j_lower) + ! --- Branch 02: P1 branch + j_upper = REAL(k - 1.) + 1. + j_lower = REAL(k ) + 1. + HoenlLondon_3p3p(k,2) = j_lower * (j_lower + 2.) / (3. * (j_lower + 1.)) + ! --- Branch 03: R2 branch + j_upper = REAL(k + 1.) + 1. + j_lower = REAL(k ) + 1. + HoenlLondon_3p3p(k,3) = (j_lower + 1.) * (j_lower - 1.) / (3. * j_lower) + ! --- Branch 04: Q2 branch + j_upper = REAL(k ) + 1. + j_lower = REAL(k ) + 1. + HoenlLondon_3p3p(k,4) = (2. * j_lower + 1.) / (3. * j_lower * (j_lower + 1.)) + ! --- Branch 05: P2 branch + j_upper = REAL(k - 1.) + 1. + j_lower = REAL(k ) + 1. + HoenlLondon_3p3p(k,5) = j_lower * (j_lower + 2.) / (3. * (j_lower + 1.)) + ! --- Branch 06: R3 branch + j_upper = REAL(k + 1.) + 1. + j_lower = REAL(k ) + 1. + HoenlLondon_3p3p(k,6) = (j_lower + 1.) * (j_lower - 1.) / (3. * j_lower) + ! --- Branch 07: Q3 branch + j_upper = REAL(k ) + 1. + j_lower = REAL(k ) + 1. + HoenlLondon_3p3p(k,7) = (2. * j_lower + 1.) / (3. * j_lower * (j_lower + 1.)) + ! --- Branch 08: P3 branch + j_upper = REAL(k - 1.) + 1. + j_lower = REAL(k ) + 1. + HoenlLondon_3p3p(k,8) = j_lower * (j_lower + 2.) / (3. * (j_lower + 1.)) + END DO + + Lambda_upper = SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,1),17) + Lambda_lower = SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,2),17) + Y_upper = SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,1),16) / Bv_upper + Y_lower = SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,2),16) / Bv_lower + + etot = 0.0 + + DO iBranch = 1, 8 + DO k = 0, kmax + j_upper = REAL(k + Deltak_upper_3p3p(iBranch)) + 1. + j_lower = REAL(k + Deltak_lower_3p3p(iBranch)) + 1. + Z1_upper = Lambda_upper**2 * Y_upper * (Y_upper-4.) + 4./3. + 4. * j_upper * (j_upper + 1.) + Z1_lower = Lambda_lower**2 * Y_lower * (Y_lower-4.) + 4./3. + 4. * j_lower * (j_lower + 1.) + Z2_upper = (Lambda_upper**2 * Y_upper * (Y_upper-1.) - 4./9. - 2. * j_upper * (j_upper + 1.)) / (3.*Z1_upper) ! TODO: + or - 4/9? + Z2_lower = (Lambda_lower**2 * Y_lower * (Y_lower-1.) - 4./9. - 2. * j_lower * (j_lower + 1.)) / (3.*Z1_lower) ! TODO: + or - 4/9? + + IF((iBranch .EQ. 1) .OR. (iBranch .EQ. 2)) THEN + F_upper = Bv_upper * (j_upper * (j_upper + 1.) - SQRT(Z1_upper) - 2. * Z2_upper) - Dv_upper * (j_upper - 0.5)**4 + F_lower = Bv_lower * (j_lower * (j_lower + 1.) - SQRT(Z1_lower) - 2. * Z2_lower) - Dv_lower * (j_lower - 0.5)**4 + ELSEIF ((iBranch .EQ. 3) .OR. (iBranch .EQ. 4) .OR. (iBranch .EQ. 5)) THEN + F_upper = Bv_upper * (j_upper * (j_upper + 1.) + 4. * Z2_upper) - Dv_upper * (j_upper + 0.5)**4 + F_lower = Bv_lower * (j_lower * (j_lower + 1.) + 4. * Z2_lower) - Dv_lower * (j_lower + 0.5)**4 + ELSEIF ((iBranch .EQ. 6) .OR. (iBranch .EQ. 7) .OR. (iBranch .EQ. 8)) THEN + F_upper = Bv_upper * (j_upper * (j_upper + 1.) + SQRT(Z1_upper) - 2. * Z2_upper) - Dv_upper * (j_upper + 1.5)**4 + F_lower = Bv_lower * (j_lower * (j_lower + 1.) + SQRT(Z1_lower) - 2. * Z2_lower) - Dv_lower * (j_lower + 1.5)**4 + END IF + nubar = nubar0 + (F_upper - F_lower) / (100.*PlanckConst*c) + r2 = EXP( (F_upper-F_lower) / (BoltzmannConst*RadiationInput(iSpec)%Trot) ) * r1 + + ! --- evaluate the alternation factor for homocuclear molecules + IF(SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,1),12) .EQ. 0.0) THEN + AlternationFactor = 1.0 + ELSE + AlternationFactor = 1.0 + (-1.0)**NINT(j_lower & + + SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,1),12)) & + / (2.0*SpeciesRadiation(iSpec)%EnergyLevelProperties(SpeciesRadiation(iSpec)%BandProperties(iBand,2),11) + 1.0) !Radiation: kexp=INT(jl+altnat(uplev)+0.1) + END IF + + eps = 1.0E16 * AlternationFactor * HoenlLondon_3p3p(k,iBranch) * (nubar**2 * a0e)**2 * cint2 & + * EXP(-(cint1 + (Bv_upper * j_upper * (j_upper + 1.)) / RadiationInput(iSpec)%Trot) / BoltzmannConst) + abstot = (nubar**(-5)) * (r2 - 1.0) * eps / (2.E10 * PlanckConst * c**2) + + etot = etot + eps + + ! --- calculate line profile and add radiative energy to emission + IF(eps .GE. 1.0E-25) THEN + CALL Radiation_Molecular_Transition_Line_Profile(Radiation_Profile, nubar, Voigt_int, Voigt_int_distmax, & + DlamL, DlamV, epsilon_mol, epsilon_iSpec, eps, Radiation_Absorption_spec, abs_iSpec, abstot, iElem) + END IF + + END DO !k + + END DO ! iBranch + + CASE DEFAULT + CALL abort(& + __STAMP__& + ,' ERROR: Radiation transition type is not implemented! (unknown case)') + END SELECT + + END DO + + END DO + + ! hilf = LEN_TRIM(RadiationInput(iSpec)%RadiationSpectraFileName) + ! RadiationInput(iSpec)%RadiationSpectraFileName = RadiationInput(iSpec)%RadiationSpectraFileName(1:hilf-4) + ! WRITE(*,*) '*** CALCULATED ', TRIM(RadiationInput(iSpec)%RadiationSpectraFileName), ' ***' + END IF + + TempOut_Em = 0.0 + TempOut_Abs = 0.0 + DO iWave=1, RadiationParameter%WaveLenDiscr + TempOut_Em = TempOut_Em + 4.*Pi*epsilon_iSpec(iWave)*RadiationParameter%WaveLenIncr + TempOut_Abs = TempOut_Abs + abs_iSpec(iWave)*RadiationParameter%WaveLenIncr + END DO + Radiation_ElemEnergy_Species(iSpec,iElem,1) = TempOut_Em + Radiation_ElemEnergy_Species(iSpec,iElem,2) = TempOut_Abs + + END DO + + DO iWave = 1, RadiationParameter%WaveLenDiscr + Radiation_Emission_spec(iWave,iElem) = Radiation_Emission_spec(iWave,iElem) + epsilon_mol(iWave) + END DO + +! --- add contribution to total emission + em_mol = epsilon_mol(1) * RadiationParameter%WaveLenIncr + DO i=2, RadiationParameter%WaveLenDiscr + em_mol = em_mol + epsilon_mol(i) * RadiationParameter%WaveLenIncr + END DO + + + ! WRITE(*,*) '*** MOLECULAR BOUND-BOUND RADIATION SUCCESSFULLY DONE***' + ! WRITE(*,*) '' + +END SUBROUTINE radiation_molecules + + + + +REAL FUNCTION ukovacs(rj, dlam) +!=================================================================================================================================== +! function of kovacs to derive the Hoenl-London factors +!=================================================================================================================================== +! MODULES + +! IMPLICIT VARIABLE HANDLING + IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES + REAL, INTENT(IN) :: rj, dlam +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +!=================================================================================================================================== + + ukovacs = 2. * (rj + dlam + .5) + RETURN + +END FUNCTION ukovacs + + + + +REAL FUNCTION ckovacs(rj, dlam) +!=================================================================================================================================== +! function of kovacs to derive the Hoenl-London factors +!=================================================================================================================================== +! MODULES + +! IMPLICIT VARIABLE HANDLING + IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES + REAL, INTENT(IN) :: rj, dlam +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +!=================================================================================================================================== + + ckovacs = 4. * (rj + .5) * (rj + dlam + .5) + RETURN + +END FUNCTION ckovacs + + + + +SUBROUTINE Radiation_Molecular_Transition_Line_Profile(Radiation_Profile, nubar, Voigt_int, Voigt_int_distmax, DlamL, DlamV, & + epsilon_mol, epsilon_iSpec, eps, Radiation_Absorption_spec, abs_iSpec, abstot, iElem) +!=================================================================================================================================== +! calculates emission profile functions and adds radiative energy to emission array +!=================================================================================================================================== +! MODULES + USE MOD_Globals + USE MOD_Radiation_Vars, ONLY : RadiationParameter + USE MOD_Globals_Vars, ONLY : Pi +! IMPLICIT VARIABLE HANDLING + IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES + REAL, INTENT(INOUT) :: Radiation_Profile(:), epsilon_mol(:), epsilon_iSpec(:), Radiation_Absorption_spec(:,:), & + abs_iSpec(:) + REAL, INTENT(IN) :: nubar, Voigt_int_distmax, DlamL, DlamV, eps, abstot,Voigt_int(-1001:1001) + INTEGER, INTENT(IN) :: iElem +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES + INTEGER :: startwavelength_int, endwavelength_int, i, iVoigt + LOGICAL :: add_radline + REAL :: line_energy_fraction, Voigt_int_value, Voigt_int_value_old +!=================================================================================================================================== + +! --- determination of indices for first and last entry of Voigt-profiles on wavelength axis + startwavelength_int = MAX(1, INT(((1./(100.*nubar)) - Voigt_int_distmax - RadiationParameter%MinWaveLen) & + / RadiationParameter%WaveLenIncr) + 1) + endwavelength_int = MIN(RadiationParameter%WaveLenDiscr, INT(((1./(100.*nubar)) + Voigt_int_distmax & + - RadiationParameter%MinWaveLen) / RadiationParameter%WaveLenIncr) + 1) + + add_radline = .FALSE. +! line_energy_fraction = 0. + + IF ( (startwavelength_int .LT. endwavelength_int) .AND. & + (((1./(100.*nubar))+Voigt_int_distmax) .GT. RadiationParameter%MinWaveLen) .AND. & + (((1./(100.*nubar))-Voigt_int_distmax) .LT. RadiationParameter%MaxWaveLen)) THEN +! IF ( (startwavelength_int .LT. endwavelength_int) .AND. & +! (((1./(100.*nubar))+Voigt_int_distmax) .GT. RadiationParameter%MinWaveLen) ) THEN + + add_radline = .TRUE. + +! IF( (DlamL/DlamV) .GE. 0.9) THEN + +! ! --- simplified computation of line profile if line is dispersive +! Voigt_int_value_old = 1. / Pi * ATAN(2./(DlamV) & +! * (RadiationParameter%WaveLen(startwavelength_int-1)-(1./(100.*nubar)))) + +! line_energy_fraction = - Voigt_int_value_old + +! DO iVoigt = (startwavelength_int-1), (endwavelength_int-1) +! Voigt_int_value = 1. / Pi * ATAN(2./(DlamV) & +! * (RadiationParameter%WaveLen(iVoigt)-(1./(100.*nubar)))) +! Radiation_Profile(iVoigt+1) = Voigt_int_value - Voigt_int_value_old +! Voigt_int_value_old = Voigt_int_value +! END DO + +! line_energy_fraction = line_energy_fraction + Voigt_int_value + +! DO iVoigt=(startwavelength_int-1), (endwavelength_int-1) +! Radiation_Profile(iVoigt+1) = Radiation_Profile(iVoigt+1) / RadiationParameter%WaveLenIncr +! END DO + +! ELSE + + ! --- determine transition lines of previous computed Voigt-profiles + CALL Radiation_Voigt_wavelength_interpolation(Voigt_int, Voigt_int_distmax, (1./(100.*nubar)), & + Radiation_Profile, line_energy_fraction, startwavelength_int, endwavelength_int) + +! END IF + + IF (add_radline) THEN + +! istart = MIN(istart,startwavelength_int) ! TODO: ??? +! iend = MAX(iend, endwavelength_int) + + ! --- add radiative energy to emission + DO i=0 , (endwavelength_int-startwavelength_int + 0) + epsilon_iSpec(startwavelength_int+i) & + = epsilon_iSpec(startwavelength_int+i) + MAX(0.0,eps)/1.E10 * Radiation_Profile(startwavelength_int+i) + epsilon_mol(startwavelength_int+i) & + = epsilon_mol(startwavelength_int+i) + MAX(0.0,eps)/1.E10 * Radiation_Profile(startwavelength_int+i) + abs_iSpec(startwavelength_int+i) & + = abs_iSpec(startwavelength_int+i)+MAX(0.0,abstot)/1.E10*Radiation_Profile(startwavelength_int+i) + Radiation_Absorption_spec(startwavelength_int+i,iElem) & + = Radiation_Absorption_spec(startwavelength_int+i,iElem)+MAX(0.0,abstot)/1.E10*Radiation_Profile(startwavelength_int+i) + END DO + + END IF + + END IF + +END SUBROUTINE Radiation_Molecular_Transition_Line_Profile + + + + +SUBROUTINE Radiation_Voigt_wavelength_interpolation(Voigt_int, Voigt_int_distmax, centerwavelength, & + Radiation_Profile, line_energy_fraction, startwavelength_int, endwavelength_int) +!=================================================================================================================================== +! distributes transition lines with precomputed integrated Voigt-profiles (Voigt_int) +!=================================================================================================================================== +! MODULES + USE MOD_Globals + USE MOD_Radiation_Vars, ONLY : RadiationParameter +! IMPLICIT VARIABLE HANDLING + IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES + REAL, INTENT(IN) :: Voigt_int(-1001:1001), centerwavelength, Voigt_int_distmax + ! TODO Voigt_int_nmax in Voigt_int(:) + REAL, INTENT(INOUT) :: Radiation_Profile(:), line_energy_fraction + INTEGER, INTENT(INOUT) :: startwavelength_int, endwavelength_int +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES + INTEGER, PARAMETER :: Voigt_int_nmax = 1001 + INTEGER :: i!, width_int + REAL :: startvalue, Voigt_int_value, Voigt_int_value_old + REAL :: weighting_int_left, weighting_int_right + INTEGER :: index_left,index_right + !REAL, ALLOCATABLE :: help_Radiation_Profile(:) +!=================================================================================================================================== + +! --- extrapolation of left point + startvalue = Voigt_int(-Voigt_int_nmax) & + - (Voigt_int(-Voigt_int_nmax+1)-Voigt_int(-Voigt_int_nmax))/RadiationParameter%WaveLenIncr & + * (centerwavelength - Voigt_int_distmax - RadiationParameter%WaveLen(startwavelength_int)) + IF (startvalue .LT. 0.0) startvalue = 0.0 + + +! --- determination of number of wavelength array indices within the corresponding Voigt profile width + +! width_int = endwavelength_int - startwavelength_int + +! IF (width_int .EQ. 0.0) THEN +! WRITE(*,'(A,F8.4,A)') 'Warning: line at ', centerwavelength*1.E9, & +! 'nm is neglected due to a too small wavelength discretization' +! END IF + +! --- determination of transition lines + + Radiation_Profile(startwavelength_int) = startvalue +! Radiation_Profile(endwavelength_int+1) = 1.0 + + Voigt_int_value_old = 0.0!startvalue + Voigt_int_value = 0.0 + + DO i=1, (endwavelength_int-startwavelength_int) + + index_left = INT(SIGN(ABS((RadiationParameter%WaveLen(startwavelength_int+i)-centerwavelength)) & + / (Voigt_int_distmax/REAL(Voigt_int_nmax)), & + RadiationParameter%WaveLen(startwavelength_int+i)-centerwavelength)) + + IF ((RadiationParameter%WaveLen(startwavelength_int+i)-centerwavelength).LT.0.0) THEN + index_right = index_left + index_left = index_left - 1 + ELSE + index_right = index_left + 1 + END IF + + IF(index_right.GT.Voigt_int_nmax) CYCLE +! IF(index_left.LT.(-Voigt_int_nmax)) CYCLE + + weighting_int_left = 1. - ABS(REAL(index_left)-((RadiationParameter%WaveLen(startwavelength_int+i)-centerwavelength) & + / (Voigt_int_distmax/REAL(Voigt_int_nmax)))) + weighting_int_right = 1. - weighting_int_left + + Voigt_int_value = weighting_int_left * Voigt_int(index_left) + weighting_int_right * Voigt_int(index_right) + + Radiation_Profile(startwavelength_int + i) = Voigt_int_value - Voigt_int_value_old + + Voigt_int_value_old = Voigt_int_value + + END DO + +! line_energy_fraction = line_energy_fraction + Voigt_int_value + +! DO i=1, width_int+1 + DO i=1, (endwavelength_int-startwavelength_int) + Radiation_Profile(startwavelength_int+i) = Radiation_Profile(startwavelength_int+i) / RadiationParameter%WaveLenIncr + END DO + +END SUBROUTINE Radiation_Voigt_wavelength_interpolation + + + + +END MODULE MOD_Radiation_Molecules diff --git a/src/radiation/radiation_solver/radiation_readin.f90 b/src/radiation/radiation_solver/radiation_readin.f90 new file mode 100644 index 000000000..bf397f315 --- /dev/null +++ b/src/radiation/radiation_solver/radiation_readin.f90 @@ -0,0 +1,303 @@ +!================================================================================================================================== +! Copyright (c) 2010 - 2019 Prof. Claus-Dieter Munz and Prof. Stefanos Fasoulas +! +! This file is part of PICLas (gitlab.com/piclas/piclas). PICLas is free software: you can redistribute it and/or modify +! it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 +! of the License, or (at your option) any later version. +! +! PICLas is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty +! of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License v3.0 for more details. +! +! You should have received a copy of the GNU General Public License along with PICLas. If not, see . +!================================================================================================================================== +#include "piclas.h" + +MODULE MOD_Radiation_ReadIn +!=================================================================================================================================== +! Module for FPFLOW +!=================================================================================================================================== +! MODULES +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +PRIVATE + +INTERFACE Radiation_readin_atoms + MODULE PROCEDURE Radiation_readin_atoms +END INTERFACE + +INTERFACE Radiation_readin_molecules + MODULE PROCEDURE Radiation_readin_molecules +END INTERFACE + +!----------------------------------------------------------------------------------------------------------------------------------- +! GLOBAL VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! Private Part --------------------------------------------------------------------------------------------------------------------- +! Public Part ---------------------------------------------------------------------------------------------------------------------- +PUBLIC :: Radiation_readin_atoms, Radiation_readin_molecules +!=================================================================================================================================== + +CONTAINS + + +SUBROUTINE Radiation_readin_atoms(iSpec) +!=================================================================================================================================== +! Performs FP Momentum Evaluation +!=================================================================================================================================== +! MODULES +USE MOD_Globals +USE MOD_Globals_Vars, ONLY : PlanckConst +USE MOD_Radiation_Vars, ONLY : SpeciesRadiation, RadiationInput +USE MOD_Equation_Vars, ONLY : c +USE MOD_ReadInTools +! IMPLICIT VARIABLE HANDLING + IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES + INTEGER, INTENT(IN) :: iSpec +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES + CHARACTER(32) :: hilf + INTEGER :: errtemp, iLine, iLevel, EnLevelIndex, NumOfLevels + REAL :: dump +!=================================================================================================================================== + WRITE(UNIT=hilf,FMT='(I0)') iSpec + RadiationInput(iSpec)%RadiationSpectraFileName = GETSTR('Radiation-Species'//TRIM(hilf)//'-SpectraFileName','none') + IF (RadiationInput(iSpec)%RadiationSpectraFileName.EQ.'none') THEN + SpeciesRadiation(iSpec)%nLevels = 0 + SpeciesRadiation(iSpec)%nLines = 0 + ! STOP + END IF + + IF (RadiationInput(iSpec)%RadiationSpectraFileName.NE.'none') THEN + OPEN( UNIT= 42, file = RadiationInput(iSpec)%RadiationSpectraFileName, status = 'old', form = 'formatted') + errtemp=0 + READ(42,*,IOSTAT = errtemp) SpeciesRadiation(iSpec)%nLevels + ! ALLOCATE(SpeciesRadiation(iSpec)%Level(SpeciesRadiation(iSpec)%nLevels,5)) + NumOfLevels= 0 + DO iLevel =1, SpeciesRadiation(iSpec)%nLevels + READ(42,*,IOSTAT = errtemp) dump,dump, EnLevelIndex, dump, dump + NumOfLevels = MAX(NumOfLevels, EnLevelIndex) + END DO + REWIND(42) + READ(42,*,IOSTAT = errtemp) dump + ALLOCATE(SpeciesRadiation(iSpec)%Level(NumOfLevels,5)) ! TODO change to max no of energy levels + SpeciesRadiation(iSpec)%Level = 0.0 + ALLOCATE(SpeciesRadiation(iSpec)%NumDensExc(SpeciesRadiation(iSpec)%nLevels)) + DO iLevel =1, SpeciesRadiation(iSpec)%nLevels + READ(42,*,IOSTAT = errtemp) SpeciesRadiation(iSpec)%Level(iLevel,1), SpeciesRadiation(iSpec)%Level(iLevel,2), & + EnLevelIndex, SpeciesRadiation(iSpec)%Level(iLevel,4), SpeciesRadiation(iSpec)%Level(iLevel,5) + SpeciesRadiation(iSpec)%Level(iLevel,2) = SpeciesRadiation(iSpec)%Level(iLevel,2)*PlanckConst*c*100. + SpeciesRadiation(iSpec)%Level(EnLevelIndex,3) = iLevel + IF (SpeciesRadiation(iSpec)%Level(iLevel,4) .EQ. 0.) SpeciesRadiation(iSpec)%Level(iLevel,4) = 3. + END DO + SWRITE(*,'(A6,I6,A17)') ' Found ',SpeciesRadiation(iSpec)%nLevels,' Level entries in File:' + SWRITE(*,*) RadiationInput(iSpec)%RadiationSpectraFileName + + READ(42,*,IOSTAT = errtemp) SpeciesRadiation(iSpec)%nLines + ALLOCATE(SpeciesRadiation(iSpec)%LinesReal(SpeciesRadiation(iSpec)%nLines,3)) + ALLOCATE(SpeciesRadiation(iSpec)%LinesInt(SpeciesRadiation(iSpec)%nLines,4)) + DO iLine =1, SpeciesRadiation(iSpec)%nLines + READ(42,*,IOSTAT = errtemp) SpeciesRadiation(iSpec)%LinesReal(iLine,1), SpeciesRadiation(iSpec)%LinesInt(iLine,1),& + SpeciesRadiation(iSpec)%LinesInt(iLine,2),& + SpeciesRadiation(iSpec)%LinesInt(iLine,3),SpeciesRadiation(iSpec)%LinesInt(iLine,4), & + SpeciesRadiation(iSpec)%LinesReal(iLine,2), & + SpeciesRadiation(iSpec)%LinesReal(iLine,3), dump + SpeciesRadiation(iSpec)%LinesReal(iLine,1) = SpeciesRadiation(iSpec)%LinesReal(iLine,1)*1.E-10 !in m instead of Angstrom + END DO + SWRITE(*,'(A6,I6,A17)') ' Found ',SpeciesRadiation(iSpec)%nLines,' Line entries in File:' + SWRITE(*,*) RadiationInput(iSpec)%RadiationSpectraFileName + + CLOSE(unit=42) +END IF + +END SUBROUTINE Radiation_readin_atoms + + + + + +SUBROUTINE Radiation_readin_molecules(iSpec) +!=================================================================================================================================== +! Performs FP Momentum Evaluation +!=================================================================================================================================== +! MODULES +USE MOD_Globals +USE MOD_Globals_Vars, ONLY : PlanckConst +USE MOD_Radiation_Vars, ONLY : SpeciesRadiation, RadiationInput +USE MOD_Equation_Vars, ONLY : c +USE MOD_ReadInTools +! IMPLICIT VARIABLE HANDLING + IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES + INTEGER, INTENT(IN) :: iSpec +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES + CHARACTER(66) :: hilf + INTEGER :: dump, length, errtemp, iLoop, i, charlen, numLines + REAL :: realdump +!=================================================================================================================================== + + WRITE(UNIT=hilf,FMT='(I0)') iSpec + RadiationInput(iSpec)%RadiationSpectraFileName = GETSTR('Radiation-Species'//TRIM(hilf)//'-SpectraFileName','none') + IF (RadiationInput(iSpec)%RadiationSpectraFileName.EQ.'none') THEN + SpeciesRadiation(iSpec)%nBands = 0 + print*, 'Nope' + ! STOP + END IF + + IF (RadiationInput(iSpec)%RadiationSpectraFileName.NE.'none') THEN + OPEN( UNIT= 304, file = RadiationInput(iSpec)%RadiationSpectraFileName, status = 'old', form = 'formatted') + errtemp=0 + + SpeciesRadiation(iSpec)%nBands = 0 + DO + READ(304,*,IOSTAT = errtemp) hilf + IF (errtemp.NE.0) EXIT + IF (hilf(1:5).EQ.'[band') SpeciesRadiation(iSpec)%nBands = SpeciesRadiation(iSpec)%nBands + 1 + END DO + REWIND(304) + ALLOCATE(SpeciesRadiation(iSpec)%BandName(SpeciesRadiation(iSpec)%nBands)) + ALLOCATE(SpeciesRadiation(iSpec)%NumMolecularTransitions(SpeciesRadiation(iSpec)%nBands)) + + READ(304,*,IOSTAT = errtemp) hilf + DO WHILE (hilf(1:7) .NE. '[Energy') + READ(304,*,IOSTAT = errtemp) hilf + END DO + READ(304,*,IOSTAT = errtemp) length, dump, dump, dump, dump + ALLOCATE(SpeciesRadiation(iSpec)%EnergyLevelName(length)) + DO iLoop=1, length + READ(304,*,IOSTAT = errtemp) hilf + DO WHILE (hilf(1:1).EQ.'c ') + READ(304,*,IOSTAT = errtemp) hilf + END DO + SpeciesRadiation(iSpec)%EnergyLevelName(iLoop) = TRIM(hilf) + END DO + + ALLOCATE(SpeciesRadiation(iSpec)%BandProperties(SpeciesRadiation(iSpec)%nBands,4)) + DO iLoop=1, SpeciesRadiation(iSpec)%nBands + DO WHILE (hilf(1:5).NE.'[band') + READ(304,*,IOSTAT = errtemp) hilf + END DO + charlen = LEN_TRIM(hilf) + hilf = TRIM(hilf(1:charlen-1)) + hilf = TRIM(hilf(7:charlen-1)) + SpeciesRadiation(iSpec)%BandName(iLoop) = hilf + + READ(304,*,IOSTAT = errtemp) hilf + + READ(304,*,IOSTAT = errtemp) hilf + DO WHILE (hilf(1:1).EQ.'c') + READ(304,*,IOSTAT = errtemp) hilf + END DO + BACKSPACE(304) + READ(304,*,IOSTAT = errtemp) SpeciesRadiation(iSpec)%BandProperties(iLoop,1), & + SpeciesRadiation(iSpec)%BandProperties(iLoop,2), & + SpeciesRadiation(iSpec)%BandProperties(iLoop,3), realdump + SpeciesRadiation(iSpec)%BandProperties(iLoop,4) = NINT(realdump) + END DO + + ALLOCATE(SpeciesRadiation(iSpec)%EnergyLevelProperties(length,17)) + DO iLoop=1, length + REWIND(304) + DO WHILE (hilf .NE. '['//TRIM(SpeciesRadiation(iSpec)%EnergyLevelName(iLoop))//']') + READ(304,*,IOSTAT = errtemp) hilf + END DO + READ(304,*,IOSTAT = errtemp) hilf + i=0 + DO WHILE (i.NE.17) + READ(304,*,IOSTAT = errtemp) hilf + IF (hilf(1:1).EQ.'c') CYCLE + BACKSPACE(304) + i = i + 1 + READ(304,*,IOSTAT = errtemp) SpeciesRadiation(iSpec)%EnergyLevelProperties(iLoop,i) + END DO + END DO + + DO iLoop=1, length + SpeciesRadiation(iSpec)%EnergyLevelProperties(iLoop,15)=SpeciesRadiation(iSpec)%EnergyLevelProperties(iLoop,15)*0.01 + SpeciesRadiation(iSpec)%EnergyLevelProperties(iLoop,2)=SpeciesRadiation(iSpec)%EnergyLevelProperties(iLoop,2)*PlanckConst*c*100. + SpeciesRadiation(iSpec)%EnergyLevelProperties(iLoop,3)=SpeciesRadiation(iSpec)%EnergyLevelProperties(iLoop,3)*PlanckConst*c*100. + SpeciesRadiation(iSpec)%EnergyLevelProperties(iLoop,4)=SpeciesRadiation(iSpec)%EnergyLevelProperties(iLoop,4)*PlanckConst*c*100. + SpeciesRadiation(iSpec)%EnergyLevelProperties(iLoop,5)=SpeciesRadiation(iSpec)%EnergyLevelProperties(iLoop,5)*PlanckConst*c*100. + SpeciesRadiation(iSpec)%EnergyLevelProperties(iLoop,6)=SpeciesRadiation(iSpec)%EnergyLevelProperties(iLoop,6)*PlanckConst*c*100. + SpeciesRadiation(iSpec)%EnergyLevelProperties(iLoop,7)=SpeciesRadiation(iSpec)%EnergyLevelProperties(iLoop,7)*PlanckConst*c*100. + SpeciesRadiation(iSpec)%EnergyLevelProperties(iLoop,8)=SpeciesRadiation(iSpec)%EnergyLevelProperties(iLoop,8)*PlanckConst*c*100. + SpeciesRadiation(iSpec)%EnergyLevelProperties(iLoop,9)=SpeciesRadiation(iSpec)%EnergyLevelProperties(iLoop,9)*PlanckConst*c*100. + SpeciesRadiation(iSpec)%EnergyLevelProperties(iLoop,13)=SpeciesRadiation(iSpec)%EnergyLevelProperties(iLoop,13) & + * PlanckConst*c*100. + SpeciesRadiation(iSpec)%EnergyLevelProperties(iLoop,14)=SpeciesRadiation(iSpec)%EnergyLevelProperties(iLoop,14) & + * PlanckConst*c*100. + + SpeciesRadiation(iSpec)%EnergyLevelProperties(iLoop,16)=SpeciesRadiation(iSpec)%EnergyLevelProperties(iLoop,16) & + * PlanckConst*c*100. + END DO + + ALLOCATE(SpeciesRadiation(iSpec)%Bands(SpeciesRadiation(iSpec)%nBands)) + DO iLoop=1, SpeciesRadiation(iSpec)%nBands + REWIND(304) + DO WHILE (hilf .NE. '[transition-'//TRIM(SpeciesRadiation(iSpec)%BandName(iLoop))//']') + READ(304,*,IOSTAT = errtemp) hilf + END DO + READ(304,*,IOSTAT = errtemp) numLines, dump, dump, dump, dump + SpeciesRadiation(iSpec)%NumMolecularTransitions(iLoop) = numLines + ALLOCATE(SpeciesRadiation(iSpec)%Bands(iLoop)%MolTransLines(numLines,5)) + READ(304,*,IOSTAT = errtemp) hilf + DO i = 1, numLines + READ(304,*,IOSTAT = errtemp) SpeciesRadiation(iSpec)%Bands(iLoop)%MolTransLines(i,1), & + SpeciesRadiation(iSpec)%Bands(iLoop)%MolTransLines(i,2), SpeciesRadiation(iSpec)%Bands(iLoop)%MolTransLines(i,3), & + SpeciesRadiation(iSpec)%Bands(iLoop)%MolTransLines(i,4) + ! PRINT*, SpeciesRadiation(iSpec)%Bands(iLoop)%MolTransLines(i,1), & + ! SpeciesRadiation(iSpec)%Bands(iLoop)%MolTransLines(i,2), SpeciesRadiation(iSpec)%Bands(iLoop)%MolTransLines(i,3), & + ! SpeciesRadiation(iSpec)%Bands(iLoop)%MolTransLines(i,4)!, SpeciesRadiation(iSpec)%Bands(iLoop)%MolTransLines(i,5) + END DO + END DO + + SpeciesRadiation(iSpec)%nLevels = length ! TODO: check! + + SWRITE(*,'(A6,I6,A17)') ' Found ',length,' energy levels in File:' + SWRITE(*,*) TRIM(RadiationInput(iSpec)%RadiationSpectraFileName) + DO iLoop = 1,length + SWRITE(*,*) TRIM(SpeciesRadiation(iSpec)%EnergyLevelName(iLoop)) + END DO + + SWRITE(*,'(A6,I6,A17)') ' Found ',SpeciesRadiation(iSpec)%nBands,' transition bands in File:' + SWRITE(*,*) TRIM(RadiationInput(iSpec)%RadiationSpectraFileName) + DO iLoop = 1,SpeciesRadiation(iSpec)%nBands + SWRITE(*,*) TRIM(SpeciesRadiation(iSpec)%BandName(iLoop)), ' (', & + SpeciesRadiation(iSpec)%NumMolecularTransitions(iLoop), 'lines)' + END DO + + CLOSE(unit=304) + END IF +END SUBROUTINE Radiation_readin_molecules + + + +!FUNCTION Test_Comment(hilf) +!!=================================================================================================================================== +!!=================================================================================================================================== +!! MODULES +!! IMPLICIT VARIABLE HANDLING +!IMPLICIT NONE +!!----------------------------------------------------------------------------------------------------------------------------------- +!! INPUT VARIABLES +!CHARACTER,INTENT(IN) :: hilf +!!----------------------------------------------------------------------------------------------------------------------------------- +!! OUTPUT VARIABLES +!LOGICAL :: Test_Comment +!!----------------------------------------------------------------------------------------------------------------------------------- +!! LOCAL VARIABLES +!!=================================================================================================================================== +!Test_Comment = .false. +! if (( hilf(1:1) .eq. 'c' ) .or. (hilf(1:1) .eq. '!' )) Test_Comment = .true. +! return +!PRINT*, Test_Comment +!END FUNCTION Test_Comment + +END MODULE MOD_Radiation_ReadIn diff --git a/src/radiation/radiation_solver/radiation_vars.f90 b/src/radiation/radiation_solver/radiation_vars.f90 new file mode 100644 index 000000000..4c9c5a7ae --- /dev/null +++ b/src/radiation/radiation_solver/radiation_vars.f90 @@ -0,0 +1,106 @@ +!================================================================================================================================== +! Copyright (c) 2010 - 2019 Prof. Claus-Dieter Munz and Prof. Stefanos Fasoulas +! +! This file is part of PICLas (gitlab.com/piclas/piclas). PICLas is free software: you can redistribute it and/or modify +! it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 +! of the License, or (at your option) any later version. +! +! PICLas is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty +! of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License v3.0 for more details. +! +! You should have received a copy of the GNU General Public License along with PICLas. If not, see . +!================================================================================================================================== +MODULE MOD_Radiation_Vars +!=================================================================================================================================== +! Contains the FP Flow variables +!=================================================================================================================================== +! MODULES +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +PUBLIC +SAVE +!----------------------------------------------------------------------------------------------------------------------------------- +! GLOBAL VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +TYPE tRadiationInput ! DSMC output + REAL :: Ttrans(4) ! Temperature (Tx, Ty, Tz, Tt) + REAL :: NumDens ! Particle density + REAL :: Tvib ! Vibrational Temp + REAL :: Trot ! Rotational Temp + REAL :: Telec ! Electronic Temp + REAL :: IonizationEn ! ionization energy [1/cm] + REAL :: Mass + REAL :: Radius + REAL :: Starkex ! Exponent for Stark broadening + INTEGER :: NuclCharge ! nuclear charge (0: atom, 1: single-ionized atom, ...) + CHARACTER(LEN=256) :: RadiationSpectraFileName +END TYPE + +TYPE(tRadiationInput), ALLOCATABLE :: RadiationInput(:) + +REAL, ALLOCATABLE :: MacroRadInputParameters(:,:,:) ! DSMC Output file (iElem, iSpec, 5 (density, Tvib, Trot, Telec, Ttrans_mean)) + +REAL :: NumDensElectrons ! Electron Density +REAL :: TElectrons ! Electron Temperature + +TYPE tRadiationParameter ! Radiation Wavelength Parameter + REAL :: MinWaveLen ! minimum spectral wavelength + REAL :: MaxWaveLen ! maximum spectral wavelength + INTEGER :: WaveLenDiscr ! number of points in calculated spectrum + REAL :: WaveLenIncr ! wavelength increments + REAL, ALLOCATABLE :: WaveLen(:) ! wavelength array +END TYPE tRadiationParameter + +TYPE(tRadiationParameter) :: RadiationParameter + +TYPE tRadiationSwitches ! Radiation types and mechanisms + INTEGER :: RadType ! 1: particle radiation, 2: black body radiation + LOGICAL :: ff ! Switch for free-free radiation + LOGICAL :: bf ! Switch for bound-free radiation + LOGICAL :: bb_at ! Switch for atomic line radiation + LOGICAL :: bb_mol ! Switch for molecular band radiation + LOGICAL :: MacroRadInput ! Switch for input of DSMC files +END TYPE tRadiationSwitches + +TYPE(tRadiationSwitches) :: RadiationSwitches + +TYPE tMolecBands ! Radiation Wavelength Parameter + REAL,ALLOCATABLE :: MolTransLines(:,:) ! (no transition lines, (vu, vl, sumre/fcf, Franck-Condon-Factor, SRe2)) +END TYPE tMolecBands + +TYPE tSpeciesRadiation + TYPE(tMolecBands),ALLOCATABLE :: Bands(:) + REAL, ALLOCATABLE :: Level(:,:) ! (length, (degeneracy ge, level energy, Energy level index , quant num of released elec, Gaunt fac)) + REAL, ALLOCATABLE :: LinesReal(:,:) ! (length, (center wl, A_ul, stark HW)) + INTEGER, ALLOCATABLE :: LinesInt(:,:) ! (length, (lower level, upper level, degeneracy lower level, degeneracy upper level)) + REAL, ALLOCATABLE :: NumDensExc(:) ! (nLevels) + REAL :: PartFunc ! PartitionFunction + INTEGER :: nLevels + INTEGER :: nLines + INTEGER :: nBands !number of Bands + CHARACTER(LEN=256) :: RadiationSpectraFileName + CHARACTER(LEN=256),ALLOCATABLE :: EnergyLevelName(:) + CHARACTER(LEN=256),ALLOCATABLE :: BandName(:) + INTEGER, ALLOCATABLE :: BandProperties(:,:) !(numBands)(up level, low level, Type Index, smf) + REAL, ALLOCATABLE :: EnergyLevelProperties(:,:) !(numEnergyLevel)(degen, te(elev_mol/eterm), D0, we, wexe, weye, weze, be, alpha, mu, nuspin, altnat, de, betae, re, A, Lambda) + INTEGER, ALLOCATABLE :: NumMolecularTransitions(:) ! number of transitions(numBands) +END TYPE tSpeciesRadiation + +TYPE(tSpeciesRadiation), ALLOCATABLE :: SpeciesRadiation(:) ! (nSpec) + +REAL, ALLOCATABLE :: Radiation_NumDens +REAL, ALLOCATABLE :: Radiation_ElemEnergy_Species(:,:,:)! (number of species, number of mesh elements, 2(Emission,Absorption)) + + + + +REAL,ALLOCPOINT :: Radiation_Emission_spec(:,:) ! (WaveLen(:), number of mesh elements) +REAL,ALLOCPOINT :: Radiation_Absorption_spec(:,:) ! (WaveLen(:), number of mesh elements) +#if USE_MPI +INTEGER :: Radiation_Emission_Spec_Shared_Win +REAL,ALLOCPOINT :: Radiation_Emission_Spec_Shared(:,:) +INTEGER :: Radiation_Absorption_Spec_Shared_Win +REAL,ALLOCPOINT :: Radiation_Absorption_Spec_Shared(:,:) +#endif +!=================================================================================================================================== +END MODULE MOD_Radiation_Vars diff --git a/src/radiation/radiative_transfer/radtrans_init.f90 b/src/radiation/radiative_transfer/radtrans_init.f90 new file mode 100644 index 000000000..b54e3a281 --- /dev/null +++ b/src/radiation/radiative_transfer/radtrans_init.f90 @@ -0,0 +1,431 @@ +!================================================================================================================================== +! Copyright (c) 2018 - 2019 Marcel Pfeiffer +! +! This file is part of PICLas (gitlab.com/piclas/piclas). PICLas is free software: you can redistribute it and/or modify +! it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 +! of the License, or (at your option) any later version. +! +! PICLas is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty +! of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License v3.0 for more details. +! +! You should have received a copy of the GNU General Public License along with PICLas. If not, see . +!================================================================================================================================== +#include "piclas.h" + +MODULE MOD_RadiationTrans_Init +!=================================================================================================================================== +! Initialization of Radiation Transport +!=================================================================================================================================== +! MODULES +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +PRIVATE + +INTERFACE InitRadiationTransport + MODULE PROCEDURE InitRadiationTransport +END INTERFACE + +!INTERFACE FinalizeRadiationTransport +! MODULE PROCEDURE FinalizeRadiationTransport +!END INTERFACE + +PUBLIC::InitRadiationTransport, DefineParametersRadiationTrans, HALTON +!=================================================================================================================================== + +CONTAINS + +!================================================================================================================================== +!> Define parameters for FP-Flow +!================================================================================================================================== +SUBROUTINE DefineParametersRadiationTrans() +! MODULES +USE MOD_ReadInTools ,ONLY: prms,addStrListEntry +IMPLICIT NONE +!================================================================================================================================== +CALL prms%SetSection("Radiation Transport") + +CALL prms%CreateLogicalOption('Radiation-AdaptivePhotonNumEmission', 'HM','.FALSE.') +CALL prms%CreateIntOption( 'Radiation-DirectionModel', 'HM','1') +CALL prms%CreateIntOption( 'Radiation-NumPhotonsPerCell', 'HM','1') +CALL prms%CreateIntOption( 'Radiation-AbsorptionModel', 'HM','1') +CALL prms%CreateIntOption( 'Radiation-PhotonPosModel', 'HM','1') + +END SUBROUTINE DefineParametersRadiationTrans + +SUBROUTINE InitRadiationTransport() +!=================================================================================================================================== +! Initialization of the radiation transport solver +!=================================================================================================================================== +! MODULES +USE MOD_Globals +USE MOD_Globals_Vars, ONLY : Pi +USE MOD_ReadInTools +USE MOD_RadiationTrans_Vars +USE MOD_Mesh_Vars, ONLY : nElems, nGlobalElems +USE MOD_Particle_Mesh_Vars, ONLY : GEO, nTotalElems +USE MOD_Globals_Vars, ONLY : BoltzmannConst, PlanckConst +USE MOD_Particle_Boundary_Sampling, ONLY : InitParticleBoundarySampling +USE MOD_Particle_Boundary_Vars, ONLY : SurfMesh +USE MOD_Equation_Vars, ONLY : c +USE MOD_Radiation_Vars, ONLY : RadiationParameter, Radiation_Emission_spec, Radiation_Absorption_spec, RadiationSwitches +USE MOD_Radiation, ONLY : radiation_main +USE MOD_DSMC_Vars, ONLY: RadialWeighting +! IMPLICIT VARIABLE HANDLING + IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +INTEGER :: iWave, iElem, iNode +REAL :: LocTemp +!=================================================================================================================================== +!SWRITE(UNIT_StdOut,'(132("-"))') +!SWRITE(UNIT_stdOut,'(A)') ' INIT RADIATION TRANSPORT SOLVER ...' + +!ALLOCATE(RadiationElemEnergy(1:2,1:nTotalElems)) +!RadiationElemEnergy=0.0 + +!RadiationDirectionModel = GETINT('Radiation-DirectionModel','1') +!RadTrans%NumPhotonsPerCell = GETINT('Radiation-NumPhotonsPerCell','1') +!RadiationAbsorptionModel = GETINT('Radiation-AbsorptionModel','1') +!RadiationPhotonPosModel = GETINT('Radiation-PhotonPosModel','1') +!RadEmiAdaptPhotonNum = GETLOGICAL('Radiation-AdaptivePhotonNumEmission','.FALSE.') + +ALLOCATE(Radiation_Emission_Spec_Total(nElems), RadTrans%PhotPerCell(nElems)) +Radiation_Emission_Spec_Total=0.0 +!RadTrans%PhotPerCell=0.0 + +!SELECT CASE(RadiationSwitches%RadType) +!CASE(1) !calls radition solver module +! DO iElem = 1, nElems +! ! CALL radiation_main(1) +! CALL radiation_main(iElem) +!! DO iWave = 1, RadiationParameter%WaveLenDiscr +!! Radiation_Emission_Spec_Total(iElem) = Radiation_Emission_Spec_Total(iElem) & +!! + 4.*Pi*Radiation_Emission_Spec(iWave, iElem) * RadiationParameter%WaveLenIncr +!! END DO +! END DO + +!CASE(2) ! Black body radiation +! DO iElem = 1, nElems +! IF (GEO%ElemMidPoint(1,iElem).LT.1) THEN +! LocTemp = 10000. !GEO%ElemMidPoint(2,iElem)/GEO%ymaxglob*10000. +! ELSE +! LocTemp = 10000. !GEO%ElemMidPoint(2,iElem)/GEO%ymaxglob*10000 +! END IF +! DO iWave = 1, RadiationParameter%WaveLenDiscr +! IF (LocTemp.GT.0.0) Radiation_Emission_Spec(iWave, iElem) = 2.*PlanckConst*c*c/(RadiationParameter%WaveLen(iWave)**5. & +! *(EXP(PlanckConst*c/(RadiationParameter%WaveLen(iWave)*BoltzmannConst*LocTemp))-1.) ) +! ! Radiation_Emission_Spec(iWave, iElem) = 8.*pi*PlanckConst*c/(RadiationParameter%WaveLen(iWave)**5. & +! ! *(EXP(PlanckConst*c/(RadiationParameter%WaveLen(iWave)*BoltzmannConst*LocTemp))-1.) ) +! Radiation_Emission_Spec_Total(iElem) = Radiation_Emission_Spec_Total(iElem) & +! + 4.*Pi*Radiation_Emission_Spec(iWave, iElem) * RadiationParameter%WaveLenIncr +! END DO +! END DO +! DO iElem = 1, nTotalElems +! DO iWave = 1, RadiationParameter%WaveLenDiscr +! Radiation_Absorption_Spec(iWave, iElem) = 1. +! END DO +! END DO + +!CASE(3) !only radiation + ALLOCATE(Radiation_Absorption_Spec_Total(nElems)) + Radiation_Absorption_Spec_Total = 0.0 + DO iElem = 1, nElems + CALL radiation_main(iElem) + DO iWave = 1, RadiationParameter%WaveLenDiscr + Radiation_Emission_Spec_Total(iElem) = Radiation_Emission_Spec_Total(iElem) & + + 4.*Pi*Radiation_Emission_Spec(iWave, iElem) * RadiationParameter%WaveLenIncr + Radiation_Absorption_Spec_Total(iElem) = Radiation_Absorption_Spec_Total(iElem) & + + Radiation_Absorption_Spec(iWave, iElem) * RadiationParameter%WaveLenIncr + END DO + + END DO +!CASE DEFAULT +! CALL abort(& +! __STAMP__& +! ,' ERROR: Radiation type is not implemented! (unknown case)') +!END SELECT + +! RadTrans%GlobalRadiationPower = 0.0 +! RadTrans%ScaledGlobalRadiationPower = 0.0 +! DO iElem = 1, nElems +! RadTrans%GlobalRadiationPower = RadTrans%GlobalRadiationPower + Radiation_Emission_Spec_Total(iElem)*GEO%Volume(iElem) +! IF (RadialWeighting%DoRadialWeighting) THEN +! RadTrans%ScaledGlobalRadiationPower = RadTrans%ScaledGlobalRadiationPower & +! + Radiation_Emission_Spec_Total(iElem)*GEO%Volume(iElem) & +! /(1. + GEO%ElemMidPoint(2,iElem)/GEO%ymaxglob*(RadialWeighting%PartScaleFactor-1.)) +! END IF +! END DO +!#if USE_MPI +! CALL MPI_ALLREDUCE(MPI_IN_PLACE,RadTrans%GlobalRadiationPower,1,MPI_DOUBLE_PRECISION,MPI_SUM,MPI_COMM_WORLD,iError) +! IF (RadialWeighting%DoRadialWeighting) THEN +! CALL MPI_ALLREDUCE(MPI_IN_PLACE,RadTrans%ScaledGlobalRadiationPower,1,MPI_DOUBLE_PRECISION,MPI_SUM,MPI_COMM_WORLD,iError) +! END IF +!#endif /*USE_MPI*/ +! RadTrans%GlobalPhotonNum = RadTrans%NumPhotonsPerCell * nGlobalElems + +!IF (.NOT.ALLOCATED(SurfMesh%SideIDToSurfID)) CALL InitParticleBoundarySampling() +!ALLOCATE(PhotonSampWall(2,1:SurfMesh%nTotalSides)) +!PhotonSampWall=0.0 + +!SWRITE(UNIT_stdOut,'(A)')' INIT RADIATION TRANSPORT SOLVER DONE!' +!SWRITE(UNIT_StdOut,'(132("-"))') +END SUBROUTINE InitRadiationTransport + + +!SUBROUTINE HALTON( ind, dims, rand ) +!!=================================================================================================================================== +!! modified particle emmission for LD case +!!=================================================================================================================================== +!! MODULES +!! IMPLICIT VARIABLE HANDLING +!IMPLICIT NONE +!!----------------------------------------------------------------------------------------------------------------------------------- +!! INPUT VARIABLES +!!----------------------------------------------------------------------------------------------------------------------------------- +!! INOUTPUT VARIABLES +!INTEGER, INTENT(IN) :: ind, dims +!REAL, INTENT(OUT) :: rand(dims) +!!----------------------------------------------------------------------------------------------------------------------------------- +!! LOCAL VARIABLES +!INTEGER :: t(dims),j, i1, d +!REAL :: primeinv(dims) +!!=================================================================================================================================== +! t(1:dims) = ABS(ind) +! DO i1 = 1, dims +! primeinv(i1) = 1.0/REAL(PRIME(i1)) +! END DO +! rand = 0.0 + +! DO WHILE (ANY(t(1:dims).NE.0)) +! do j = 1, dims +! d = MOD(t(j), PRIME(j)) +! rand(j) = rand(j) + REAL(d) * primeinv(j) +! primeinv(j) = primeinv(j) / REAL(PRIME( j )) +! t(j) = ( t(j) / PRIME ( j ) ) +! END DO +! END DO + +! RETURN +!END SUBROUTINE HALTON + +!INTEGER FUNCTION PRIME(n) +!!=================================================================================================================================== +!! modified particle emmission for LD case +!!=================================================================================================================================== +!! MODULES +!! IMPLICIT VARIABLE HANDLING +!IMPLICIT NONE +!!----------------------------------------------------------------------------------------------------------------------------------- +!! INPUT VARIABLES +!!----------------------------------------------------------------------------------------------------------------------------------- +!! INOUTPUT VARIABLES +!!----------------------------------------------------------------------------------------------------------------------------------- +!! OUTPUT VARIABLES +!!----------------------------------------------------------------------------------------------------------------------------------- +!! LOCAL VARIABLES +!INTEGER, PARAMETER :: prime_max=1600 +!INTEGER, SAVE :: icall = 0, npvec(prime_max) +!INTEGER, INTENT(IN) :: n +!!=================================================================================================================================== +! IF (icall.EQ.0) THEN +! icall = 1 +! npvec(1:100) = (/ & +! 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, & +! 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, & +! 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, & +! 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, & +! 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, & +! 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, & +! 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, & +! 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, & +! 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, & +! 467, 479, 487, 491, 499, 503, 509, 521, 523, 541 /) +! npvec(101:200) = (/ & +! 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, & +! 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, & +! 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, & +! 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, & +! 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, & +! 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, & +! 947, 953, 967, 971, 977, 983, 991, 997, 1009, 1013, & +! 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, & +! 1087, 1091, 1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151, & +! 1153, 1163, 1171, 1181, 1187, 1193, 1201, 1213, 1217, 1223 /) +! npvec(201:300) = (/ & +! 1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283, 1289, 1291, & +! 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367, 1373, & +! 1381, 1399, 1409, 1423, 1427, 1429, 1433, 1439, 1447, 1451, & +! 1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499, 1511, & +! 1523, 1531, 1543, 1549, 1553, 1559, 1567, 1571, 1579, 1583, & +! 1597, 1601, 1607, 1609, 1613, 1619, 1621, 1627, 1637, 1657, & +! 1663, 1667, 1669, 1693, 1697, 1699, 1709, 1721, 1723, 1733, & +! 1741, 1747, 1753, 1759, 1777, 1783, 1787, 1789, 1801, 1811, & +! 1823, 1831, 1847, 1861, 1867, 1871, 1873, 1877, 1879, 1889, & +! 1901, 1907, 1913, 1931, 1933, 1949, 1951, 1973, 1979, 1987 /) +! npvec(301:400) = (/ & +! 1993, 1997, 1999, 2003, 2011, 2017, 2027, 2029, 2039, 2053, & +! 2063, 2069, 2081, 2083, 2087, 2089, 2099, 2111, 2113, 2129, & +! 2131, 2137, 2141, 2143, 2153, 2161, 2179, 2203, 2207, 2213, & +! 2221, 2237, 2239, 2243, 2251, 2267, 2269, 2273, 2281, 2287, & +! 2293, 2297, 2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357, & +! 2371, 2377, 2381, 2383, 2389, 2393, 2399, 2411, 2417, 2423, & +! 2437, 2441, 2447, 2459, 2467, 2473, 2477, 2503, 2521, 2531, & +! 2539, 2543, 2549, 2551, 2557, 2579, 2591, 2593, 2609, 2617, & +! 2621, 2633, 2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687, & +! 2689, 2693, 2699, 2707, 2711, 2713, 2719, 2729, 2731, 2741 /) +! npvec(401:500) = (/ & +! 2749, 2753, 2767, 2777, 2789, 2791, 2797, 2801, 2803, 2819, & +! 2833, 2837, 2843, 2851, 2857, 2861, 2879, 2887, 2897, 2903, & +! 2909, 2917, 2927, 2939, 2953, 2957, 2963, 2969, 2971, 2999, & +! 3001, 3011, 3019, 3023, 3037, 3041, 3049, 3061, 3067, 3079, & +! 3083, 3089, 3109, 3119, 3121, 3137, 3163, 3167, 3169, 3181, & +! 3187, 3191, 3203, 3209, 3217, 3221, 3229, 3251, 3253, 3257, & +! 3259, 3271, 3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331, & +! 3343, 3347, 3359, 3361, 3371, 3373, 3389, 3391, 3407, 3413, & +! 3433, 3449, 3457, 3461, 3463, 3467, 3469, 3491, 3499, 3511, & +! 3517, 3527, 3529, 3533, 3539, 3541, 3547, 3557, 3559, 3571 /) +! npvec(501:600) = (/ & +! 3581, 3583, 3593, 3607, 3613, 3617, 3623, 3631, 3637, 3643, & +! 3659, 3671, 3673, 3677, 3691, 3697, 3701, 3709, 3719, 3727, & +! 3733, 3739, 3761, 3767, 3769, 3779, 3793, 3797, 3803, 3821, & +! 3823, 3833, 3847, 3851, 3853, 3863, 3877, 3881, 3889, 3907, & +! 3911, 3917, 3919, 3923, 3929, 3931, 3943, 3947, 3967, 3989, & +! 4001, 4003, 4007, 4013, 4019, 4021, 4027, 4049, 4051, 4057, & +! 4073, 4079, 4091, 4093, 4099, 4111, 4127, 4129, 4133, 4139, & +! 4153, 4157, 4159, 4177, 4201, 4211, 4217, 4219, 4229, 4231, & +! 4241, 4243, 4253, 4259, 4261, 4271, 4273, 4283, 4289, 4297, & +! 4327, 4337, 4339, 4349, 4357, 4363, 4373, 4391, 4397, 4409 /) +! npvec(601:700) = (/ & +! 4421, 4423, 4441, 4447, 4451, 4457, 4463, 4481, 4483, 4493, & +! 4507, 4513, 4517, 4519, 4523, 4547, 4549, 4561, 4567, 4583, & +! 4591, 4597, 4603, 4621, 4637, 4639, 4643, 4649, 4651, 4657, & +! 4663, 4673, 4679, 4691, 4703, 4721, 4723, 4729, 4733, 4751, & +! 4759, 4783, 4787, 4789, 4793, 4799, 4801, 4813, 4817, 4831, & +! 4861, 4871, 4877, 4889, 4903, 4909, 4919, 4931, 4933, 4937, & +! 4943, 4951, 4957, 4967, 4969, 4973, 4987, 4993, 4999, 5003, & +! 5009, 5011, 5021, 5023, 5039, 5051, 5059, 5077, 5081, 5087, & +! 5099, 5101, 5107, 5113, 5119, 5147, 5153, 5167, 5171, 5179, & +! 5189, 5197, 5209, 5227, 5231, 5233, 5237, 5261, 5273, 5279 /) +! npvec(701:800) = (/ & +! 5281, 5297, 5303, 5309, 5323, 5333, 5347, 5351, 5381, 5387, & +! 5393, 5399, 5407, 5413, 5417, 5419, 5431, 5437, 5441, 5443, & +! 5449, 5471, 5477, 5479, 5483, 5501, 5503, 5507, 5519, 5521, & +! 5527, 5531, 5557, 5563, 5569, 5573, 5581, 5591, 5623, 5639, & +! 5641, 5647, 5651, 5653, 5657, 5659, 5669, 5683, 5689, 5693, & +! 5701, 5711, 5717, 5737, 5741, 5743, 5749, 5779, 5783, 5791, & +! 5801, 5807, 5813, 5821, 5827, 5839, 5843, 5849, 5851, 5857, & +! 5861, 5867, 5869, 5879, 5881, 5897, 5903, 5923, 5927, 5939, & +! 5953, 5981, 5987, 6007, 6011, 6029, 6037, 6043, 6047, 6053, & +! 6067, 6073, 6079, 6089, 6091, 6101, 6113, 6121, 6131, 6133 /) +! npvec(801:900) = (/ & +! 6143, 6151, 6163, 6173, 6197, 6199, 6203, 6211, 6217, 6221, & +! 6229, 6247, 6257, 6263, 6269, 6271, 6277, 6287, 6299, 6301, & +! 6311, 6317, 6323, 6329, 6337, 6343, 6353, 6359, 6361, 6367, & +! 6373, 6379, 6389, 6397, 6421, 6427, 6449, 6451, 6469, 6473, & +! 6481, 6491, 6521, 6529, 6547, 6551, 6553, 6563, 6569, 6571, & +! 6577, 6581, 6599, 6607, 6619, 6637, 6653, 6659, 6661, 6673, & +! 6679, 6689, 6691, 6701, 6703, 6709, 6719, 6733, 6737, 6761, & +! 6763, 6779, 6781, 6791, 6793, 6803, 6823, 6827, 6829, 6833, & +! 6841, 6857, 6863, 6869, 6871, 6883, 6899, 6907, 6911, 6917, & +! 6947, 6949, 6959, 6961, 6967, 6971, 6977, 6983, 6991, 6997 /) +! npvec(901:1000) = (/ & +! 7001, 7013, 7019, 7027, 7039, 7043, 7057, 7069, 7079, 7103, & +! 7109, 7121, 7127, 7129, 7151, 7159, 7177, 7187, 7193, 7207, & +! 7211, 7213, 7219, 7229, 7237, 7243, 7247, 7253, 7283, 7297, & +! 7307, 7309, 7321, 7331, 7333, 7349, 7351, 7369, 7393, 7411, & +! 7417, 7433, 7451, 7457, 7459, 7477, 7481, 7487, 7489, 7499, & +! 7507, 7517, 7523, 7529, 7537, 7541, 7547, 7549, 7559, 7561, & +! 7573, 7577, 7583, 7589, 7591, 7603, 7607, 7621, 7639, 7643, & +! 7649, 7669, 7673, 7681, 7687, 7691, 7699, 7703, 7717, 7723, & +! 7727, 7741, 7753, 7757, 7759, 7789, 7793, 7817, 7823, 7829, & +! 7841, 7853, 7867, 7873, 7877, 7879, 7883, 7901, 7907, 7919 /) +! npvec(1001:1100) = (/ & +! 7927, 7933, 7937, 7949, 7951, 7963, 7993, 8009, 8011, 8017, & +! 8039, 8053, 8059, 8069, 8081, 8087, 8089, 8093, 8101, 8111, & +! 8117, 8123, 8147, 8161, 8167, 8171, 8179, 8191, 8209, 8219, & +! 8221, 8231, 8233, 8237, 8243, 8263, 8269, 8273, 8287, 8291, & +! 8293, 8297, 8311, 8317, 8329, 8353, 8363, 8369, 8377, 8387, & +! 8389, 8419, 8423, 8429, 8431, 8443, 8447, 8461, 8467, 8501, & +! 8513, 8521, 8527, 8537, 8539, 8543, 8563, 8573, 8581, 8597, & +! 8599, 8609, 8623, 8627, 8629, 8641, 8647, 8663, 8669, 8677, & +! 8681, 8689, 8693, 8699, 8707, 8713, 8719, 8731, 8737, 8741, & +! 8747, 8753, 8761, 8779, 8783, 8803, 8807, 8819, 8821, 8831 /) +! npvec(1101:1200) = (/ & +! 8837, 8839, 8849, 8861, 8863, 8867, 8887, 8893, 8923, 8929, & +! 8933, 8941, 8951, 8963, 8969, 8971, 8999, 9001, 9007, 9011, & +! 9013, 9029, 9041, 9043, 9049, 9059, 9067, 9091, 9103, 9109, & +! 9127, 9133, 9137, 9151, 9157, 9161, 9173, 9181, 9187, 9199, & +! 9203, 9209, 9221, 9227, 9239, 9241, 9257, 9277, 9281, 9283, & +! 9293, 9311, 9319, 9323, 9337, 9341, 9343, 9349, 9371, 9377, & +! 9391, 9397, 9403, 9413, 9419, 9421, 9431, 9433, 9437, 9439, & +! 9461, 9463, 9467, 9473, 9479, 9491, 9497, 9511, 9521, 9533, & +! 9539, 9547, 9551, 9587, 9601, 9613, 9619, 9623, 9629, 9631, & +! 9643, 9649, 9661, 9677, 9679, 9689, 9697, 9719, 9721, 9733 /) +! npvec(1201:1300) = (/ & +! 9739, 9743, 9749, 9767, 9769, 9781, 9787, 9791, 9803, 9811, & +! 9817, 9829, 9833, 9839, 9851, 9857, 9859, 9871, 9883, 9887, & +! 9901, 9907, 9923, 9929, 9931, 9941, 9949, 9967, 9973,10007, & +! 10009,10037,10039,10061,10067,10069,10079,10091,10093,10099, & +! 10103,10111,10133,10139,10141,10151,10159,10163,10169,10177, & +! 10181,10193,10211,10223,10243,10247,10253,10259,10267,10271, & +! 10273,10289,10301,10303,10313,10321,10331,10333,10337,10343, & +! 10357,10369,10391,10399,10427,10429,10433,10453,10457,10459, & +! 10463,10477,10487,10499,10501,10513,10529,10531,10559,10567, & +! 10589,10597,10601,10607,10613,10627,10631,10639,10651,10657 /) +! npvec(1301:1400) = (/ & +! 10663,10667,10687,10691,10709,10711,10723,10729,10733,10739, & +! 10753,10771,10781,10789,10799,10831,10837,10847,10853,10859, & +! 10861,10867,10883,10889,10891,10903,10909,10937,10939,10949, & +! 10957,10973,10979,10987,10993,11003,11027,11047,11057,11059, & +! 11069,11071,11083,11087,11093,11113,11117,11119,11131,11149, & +! 11159,11161,11171,11173,11177,11197,11213,11239,11243,11251, & +! 11257,11261,11273,11279,11287,11299,11311,11317,11321,11329, & +! 11351,11353,11369,11383,11393,11399,11411,11423,11437,11443, & +! 11447,11467,11471,11483,11489,11491,11497,11503,11519,11527, & +! 11549,11551,11579,11587,11593,11597,11617,11621,11633,11657 /) +! npvec(1401:1500) = (/ & +! 11677,11681,11689,11699,11701,11717,11719,11731,11743,11777, & +! 11779,11783,11789,11801,11807,11813,11821,11827,11831,11833, & +! 11839,11863,11867,11887,11897,11903,11909,11923,11927,11933, & +! 11939,11941,11953,11959,11969,11971,11981,11987,12007,12011, & +! 12037,12041,12043,12049,12071,12073,12097,12101,12107,12109, & +! 12113,12119,12143,12149,12157,12161,12163,12197,12203,12211, & +! 12227,12239,12241,12251,12253,12263,12269,12277,12281,12289, & +! 12301,12323,12329,12343,12347,12373,12377,12379,12391,12401, & +! 12409,12413,12421,12433,12437,12451,12457,12473,12479,12487, & +! 12491,12497,12503,12511,12517,12527,12539,12541,12547,12553 /) +! npvec(1501:1600) = (/ & +! 12569,12577,12583,12589,12601,12611,12613,12619,12637,12641, & +! 12647,12653,12659,12671,12689,12697,12703,12713,12721,12739, & +! 12743,12757,12763,12781,12791,12799,12809,12821,12823,12829, & +! 12841,12853,12889,12893,12899,12907,12911,12917,12919,12923, & +! 12941,12953,12959,12967,12973,12979,12983,13001,13003,13007, & +! 13009,13033,13037,13043,13049,13063,13093,13099,13103,13109, & +! 13121,13127,13147,13151,13159,13163,13171,13177,13183,13187, & +! 13217,13219,13229,13241,13249,13259,13267,13291,13297,13309, & +! 13313,13327,13331,13337,13339,13367,13381,13397,13399,13411, & +! 13417,13421,13441,13451,13457,13463,13469,13477,13487,13499 /) +! END IF +! IF (n.EQ.-1) THEN +! PRIME = prime_max +! ELSE IF (n.EQ.0) THEN +! PRIME = 1 +! ELSE IF (n.LE.prime_max) THEN +! PRIME = npvec(n) +! ELSE +! PRIME = -1 +! write ( *, '(a)' ) ' ' +! write ( *, '(a)' ) 'PRIME - Fatal error!' +! write ( *, '(a,i8)' ) ' Illegal prime index N = ', n +! write ( *, '(a,i8)' ) ' N should be between 1 and PRIME_MAX =', prime_max +! stop 1 +! END IF + +! RETURN +!END FUNCTION PRIME + +END MODULE MOD_RadiationTrans_Init diff --git a/src/radiation/radiative_transfer/radtrans_vars.f90 b/src/radiation/radiative_transfer/radtrans_vars.f90 new file mode 100644 index 000000000..829ad3698 --- /dev/null +++ b/src/radiation/radiative_transfer/radtrans_vars.f90 @@ -0,0 +1,60 @@ +!================================================================================================================================== +! Copyright (c) 2018 - 2019 Marcel Pfeiffer +! +! This file is part of PICLas (gitlab.com/piclas/piclas). PICLas is free software: you can redistribute it and/or modify +! it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 +! of the License, or (at your option) any later version. +! +! PICLas is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty +! of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License v3.0 for more details. +! +! You should have received a copy of the GNU General Public License along with PICLas. If not, see . +!================================================================================================================================== +MODULE MOD_RadiationTrans_Vars +!=================================================================================================================================== +! Contains the tadiation transport variables +!=================================================================================================================================== +! MODULES +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +PUBLIC +SAVE +!----------------------------------------------------------------------------------------------------------------------------------- +! GLOBAL VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +LOGICAL :: useParticleRadiationSolver +TYPE tRadTrans + INTEGER :: NumPhotonsPerCell + INTEGER, ALLOCATABLE :: PhotPerCell(:) + REAL :: GlobalRadiationPower + REAL :: ScaledGlobalRadiationPower + INTEGER :: GlobalPhotonNum +END TYPE + +TYPE (tRadTrans) :: RadTrans + + +TYPE tPhotonProps + REAL :: PhotonPos(3) + REAL :: PhotonLastPos(3) + REAL :: PhotonDirection(3) + REAL :: PhotonEnergy + INTEGER :: ElemID + INTEGER :: WaveLength +END TYPE + +TYPE (tPhotonProps) :: PhotonProps + +REAL , ALLOCATABLE :: RadiationElemEnergy(:,:) + +REAL , ALLOCATABLE :: Radiation_Emission_Spec_Total(:) +REAL , ALLOCATABLE :: Radiation_Absorption_Spec_Total(:) + +REAL , ALLOCATABLE :: PhotonSampWall(:,:) + +INTEGER :: RadiationAbsorptionModel +INTEGER :: RadiationDirectionModel +INTEGER :: RadiationPhotonPosModel +LOGICAL :: RadEmiAdaptPhotonNum +!=================================================================================================================================== +END MODULE MOD_RadiationTrans_Vars diff --git a/src/timedisc/timedisc.f90 b/src/timedisc/timedisc.f90 index 242312299..31a961dc5 100644 --- a/src/timedisc/timedisc.f90 +++ b/src/timedisc/timedisc.f90 @@ -317,6 +317,8 @@ SUBROUTINE TimeDisc() #else CALL TimeStepPoissonByLSERK() ! Runge Kutta Explicit, Poisson #endif +#elif (PP_TimeDiscMethod==600) + CALL TimeStep_Radiation() #else CALL abort(& __STAMP__& diff --git a/src/timedisc/timedisc_TimeStep_Radiation.f90 b/src/timedisc/timedisc_TimeStep_Radiation.f90 new file mode 100644 index 000000000..b94dc3df5 --- /dev/null +++ b/src/timedisc/timedisc_TimeStep_Radiation.f90 @@ -0,0 +1,50 @@ +!================================================================================================================================== +! Copyright (c) 2010 - 2018 Prof. Claus-Dieter Munz and Prof. Stefanos Fasoulas +! +! This file is part of PICLas (gitlab.com/piclas/piclas). PICLas is free software: you can redistribute it and/or modify +! it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 +! of the License, or (at your option) any later version. +! +! PICLas is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty +! of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License v3.0 for more details. +! +! You should have received a copy of the GNU General Public License along with PICLas. If not, see . +!================================================================================================================================== +#include "piclas.h" + + +#if (PP_TimeDiscMethod==600) +MODULE MOD_TimeStep +!=================================================================================================================================== +! Module for the Temporal discretization +!=================================================================================================================================== +! MODULES +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +PRIVATE +!----------------------------------------------------------------------------------------------------------------------------------- +PUBLIC :: TimeStep_Radiation +!=================================================================================================================================== +CONTAINS + +SUBROUTINE TimeStep_Radiation() +!=================================================================================================================================== +!> Radiation Solver and Radiative Transfer Solver +!=================================================================================================================================== +! MODULES + +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES + +!=================================================================================================================================== + + +END SUBROUTINE TimeStep_Radiation + + +END MODULE MOD_TimeStep +#endif diff --git a/src/timedisc/timedisc_init.f90 b/src/timedisc/timedisc_init.f90 index 4453aa309..4999f82f7 100644 --- a/src/timedisc/timedisc_init.f90 +++ b/src/timedisc/timedisc_init.f90 @@ -245,7 +245,9 @@ SUBROUTINE InitTimeDisc() SWRITE(UNIT_stdOut,'(A)') ' Method of time integration: Boris-Leapfrog, Poisson' #elif (PP_TimeDiscMethod==509) SWRITE(UNIT_stdOut,'(A)') ' Method of time integration: Leapfrog, Poisson' -# endif +#elif (PP_TimeDiscMethod==600) + SWRITE(UNIT_stdOut,'(A)') ' Method of time integration: Radiation' +#endif RKdtFrac = 1. RKdtFracTotal = 1. From 9d0ed84159f840bdb04604fd97ebb98a4630c76b Mon Sep 17 00:00:00 2001 From: mpfeiffer Date: Wed, 21 Jul 2021 14:43:56 +0200 Subject: [PATCH 002/495] adapted CMKAKE --- CMakeLists.txt | 5 +++++ src/radiation/radiation_solver/radiation_vars.f90 | 1 + 2 files changed, 6 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4ecb0c242..2ec3284cd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -819,6 +819,8 @@ FILE(GLOB noparticlesF90 ./src/particles/analyze/particle_analyze_vars.f90 FILE(GLOB_RECURSE extraeF90 ./src/extrae/*.f90) +FILE(GLOB_RECURSE radiationF90 ./src/radiation/*.f90) + IF(PICLAS_EXTRAE) LIST(APPEND piclasF90 ${extraeF90}) ENDIF(PICLAS_EXTRAE) @@ -843,6 +845,9 @@ IF (PICLAS_PARTICLES) ELSE() LIST(APPEND piclasF90 ${noparticlesF90}) ENDIF(PICLAS_PARTICLES) +IF (PICLAS_TIMEDISCMETHOD STREQUAL "Radiation") + LIST(APPEND piclasF90 ${radiationF90}) +ENDIF() # define libs ADD_LIBRARY(libpiclasstaticF90 OBJECT ${piclasF90} ) diff --git a/src/radiation/radiation_solver/radiation_vars.f90 b/src/radiation/radiation_solver/radiation_vars.f90 index 4c9c5a7ae..29d24fe13 100644 --- a/src/radiation/radiation_solver/radiation_vars.f90 +++ b/src/radiation/radiation_solver/radiation_vars.f90 @@ -1,3 +1,4 @@ +#include "piclas.h" !================================================================================================================================== ! Copyright (c) 2010 - 2019 Prof. Claus-Dieter Munz and Prof. Stefanos Fasoulas ! From a35e158c33209e663fe7f70f71d22e298a9f35ea Mon Sep 17 00:00:00 2001 From: irsbeyer Date: Wed, 21 Jul 2021 22:43:20 +0200 Subject: [PATCH 003/495] constants now in globals_vars --- src/globals/globals_vars.f90 | 2 ++ .../radiation_solver/radiation_atoms.f90 | 3 +- .../radiation_solver/radiation_continuum.f90 | 4 +-- .../radiation_solver/radiation_init.f90 | 5 ++-- .../radiation_solver/radiation_molecules.f90 | 3 +- .../radiation_solver/radiation_readin.f90 | 28 ++----------------- 6 files changed, 10 insertions(+), 35 deletions(-) diff --git a/src/globals/globals_vars.f90 b/src/globals/globals_vars.f90 index 2e2d7ed29..81af7ce5a 100644 --- a/src/globals/globals_vars.f90 +++ b/src/globals/globals_vars.f90 @@ -57,6 +57,8 @@ MODULE MOD_Globals_Vars CHARACTER(LEN=255) :: ParameterDSMCFile !> filename of the parameterDSMC file REAL, PARAMETER :: BoltzmannConst=1.380648813e-23 !> Boltzmann constant [J/K] SI-Unit! in m^2/(s^2*K) CHARACTER(LEN=5) :: TimeStampLenStr,TimeStampLenStr2 !> Strings for timestamp format of time +REAL,PARAMETER :: BohrRadius = 5.2917721067E-11 !> Radius, 1st Bohr orbit for H (a0) [m] +REAL,PARAMETER :: AtomicMassUnit = 1.660539040E-27 !> Atomic mass unit [kg] REAL,PARAMETER :: maxEXP= LOG(HUGE(maxexp)) ! Set variables (natural constants and derived quantities) from user input or hard coded diff --git a/src/radiation/radiation_solver/radiation_atoms.f90 b/src/radiation/radiation_solver/radiation_atoms.f90 index 1a6cea3b6..964457896 100644 --- a/src/radiation/radiation_solver/radiation_atoms.f90 +++ b/src/radiation/radiation_solver/radiation_atoms.f90 @@ -47,8 +47,7 @@ SUBROUTINE radiation_atoms(iElem, em_atom) Radiation_Emission_spec, Radiation_Absorption_spec, & NumDensElectrons, Radiation_ElemEnergy_Species USE MOD_Particle_Vars, ONLY : nSpecies - USE MOD_Equation_Vars, ONLY : c - USE MOD_Globals_Vars, ONLY : Pi + USE MOD_Globals_Vars, ONLY : c, Pi USE MOD_DSMC_Vars, ONLY : SpecDSMC !USE MOD_Radiation_Excitation, ONLY : low_IonizationPot diff --git a/src/radiation/radiation_solver/radiation_continuum.f90 b/src/radiation/radiation_solver/radiation_continuum.f90 index 8e8b75acc..81aedd75f 100644 --- a/src/radiation/radiation_solver/radiation_continuum.f90 +++ b/src/radiation/radiation_solver/radiation_continuum.f90 @@ -122,7 +122,7 @@ SUBROUTINE Radiation_continuum_ff(n, z, iElem) ! MODULES USE MOD_Globals_Vars, ONLY : BoltzmannConst, PlanckConst USE MOD_Radiation_Vars, ONLY : RadiationInput, RadiationParameter, Radiation_Emission_spec, Radiation_Absorption_spec - USE MOD_Equation_Vars, ONLY : c + USE MOD_Globals_Vars, ONLY : c ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -174,7 +174,7 @@ SUBROUTINE Radiation_continuum_bf(iElem) USE MOD_Particle_Vars, ONLY : nSpecies USE MOD_Radiation_Vars, ONLY : RadiationInput, SpeciesRadiation, RadiationParameter, & Radiation_Emission_spec, Radiation_Absorption_spec, NumDensElectrons - USE MOD_Equation_Vars, ONLY : c + USE MOD_Globals_Vars, ONLY : c USE MOD_DSMC_Vars, ONLY : SpecDSMC ! IMPLICIT VARIABLE HANDLING diff --git a/src/radiation/radiation_solver/radiation_init.f90 b/src/radiation/radiation_solver/radiation_init.f90 index 894396a4e..9dbb8e92b 100644 --- a/src/radiation/radiation_solver/radiation_init.f90 +++ b/src/radiation/radiation_solver/radiation_init.f90 @@ -93,7 +93,7 @@ SUBROUTINE InitRadiation() !=================================================================================================================================== ! MODULES USE MOD_Globals -USE MOD_Globals_Vars, ONLY : PlanckConst +USE MOD_Globals_Vars, ONLY : PlanckConst, c USE MOD_Mesh_Vars, ONLY : nElems USE MOD_Particle_Mesh_Vars, ONLY : nTotalElems USE MOD_ReadInTools @@ -101,7 +101,6 @@ SUBROUTINE InitRadiation() USE MOD_Radiation_Vars USE MOD_DSMC_Vars, ONLY : SpecDSMC USE MOD_Radiation_ReadIn, ONLY : Radiation_readin_atoms, Radiation_readin_molecules -USE MOD_Equation_Vars, ONLY : c ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -230,7 +229,7 @@ SUBROUTINE MacroscopicRadiationInput() USE MOD_Particle_Vars ,ONLY: nSpecies USE MOD_Radiation_Vars ,ONLY: MacroRadInputParameters USE MOD_ReadInTools - USE MOD_Utils ,ONLY: BubbleSortID +! USE MOD_Utils ,ONLY: BubbleSortID !Laux ! USE MOD_Particle_Mesh_Vars ,ONLY: GEO !Laux ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE diff --git a/src/radiation/radiation_solver/radiation_molecules.f90 b/src/radiation/radiation_solver/radiation_molecules.f90 index d662c9027..901dc56ce 100644 --- a/src/radiation/radiation_solver/radiation_molecules.f90 +++ b/src/radiation/radiation_solver/radiation_molecules.f90 @@ -42,12 +42,11 @@ SUBROUTINE radiation_molecules(iElem, em_mol) !=================================================================================================================================== ! MODULES USE MOD_Globals - USE MOD_Globals_Vars, ONLY : BoltzmannConst, PlanckConst, ElementaryCharge, AtomicMassUnit, Pi + USE MOD_Globals_Vars, ONLY : BoltzmannConst, PlanckConst, ElementaryCharge, AtomicMassUnit, Pi, c USE MOD_Radiation_Vars, ONLY : RadiationInput, RadiationParameter, SpeciesRadiation, & Radiation_Emission_spec, Radiation_Absorption_spec, NumDensElectrons, TElectrons, & Radiation_ElemEnergy_Species USE MOD_Particle_Vars, ONLY : nSpecies - USE MOD_Equation_Vars, ONLY : c USE MOD_DSMC_Vars, ONLY : SpecDSMC ! IMPLICIT VARIABLE HANDLING diff --git a/src/radiation/radiation_solver/radiation_readin.f90 b/src/radiation/radiation_solver/radiation_readin.f90 index bf397f315..874a7a35d 100644 --- a/src/radiation/radiation_solver/radiation_readin.f90 +++ b/src/radiation/radiation_solver/radiation_readin.f90 @@ -46,9 +46,8 @@ SUBROUTINE Radiation_readin_atoms(iSpec) !=================================================================================================================================== ! MODULES USE MOD_Globals -USE MOD_Globals_Vars, ONLY : PlanckConst +USE MOD_Globals_Vars, ONLY : PlanckConst, c USE MOD_Radiation_Vars, ONLY : SpeciesRadiation, RadiationInput -USE MOD_Equation_Vars, ONLY : c USE MOD_ReadInTools ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -125,9 +124,8 @@ SUBROUTINE Radiation_readin_molecules(iSpec) !=================================================================================================================================== ! MODULES USE MOD_Globals -USE MOD_Globals_Vars, ONLY : PlanckConst +USE MOD_Globals_Vars, ONLY : PlanckConst, c USE MOD_Radiation_Vars, ONLY : SpeciesRadiation, RadiationInput -USE MOD_Equation_Vars, ONLY : c USE MOD_ReadInTools ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -278,26 +276,4 @@ SUBROUTINE Radiation_readin_molecules(iSpec) END SUBROUTINE Radiation_readin_molecules - -!FUNCTION Test_Comment(hilf) -!!=================================================================================================================================== -!!=================================================================================================================================== -!! MODULES -!! IMPLICIT VARIABLE HANDLING -!IMPLICIT NONE -!!----------------------------------------------------------------------------------------------------------------------------------- -!! INPUT VARIABLES -!CHARACTER,INTENT(IN) :: hilf -!!----------------------------------------------------------------------------------------------------------------------------------- -!! OUTPUT VARIABLES -!LOGICAL :: Test_Comment -!!----------------------------------------------------------------------------------------------------------------------------------- -!! LOCAL VARIABLES -!!=================================================================================================================================== -!Test_Comment = .false. -! if (( hilf(1:1) .eq. 'c' ) .or. (hilf(1:1) .eq. '!' )) Test_Comment = .true. -! return -!PRINT*, Test_Comment -!END FUNCTION Test_Comment - END MODULE MOD_Radiation_ReadIn From 578015d6d741a6bc47d2be09b18fc9ba24849697 Mon Sep 17 00:00:00 2001 From: irsbeyer Date: Tue, 27 Jul 2021 17:24:54 +0200 Subject: [PATCH 004/495] next steps, first compilable version --- src/init/define_parameters_init.f90 | 2 +- .../radiation_solver/radiation_init.f90 | 32 +- .../radiation_solver/radiation_vars.f90 | 2 +- .../radiative_transfer/radtrans_init.f90 | 499 +++++++++--------- 4 files changed, 276 insertions(+), 259 deletions(-) diff --git a/src/init/define_parameters_init.f90 b/src/init/define_parameters_init.f90 index 3f7ff9fcd..f4613d492 100644 --- a/src/init/define_parameters_init.f90 +++ b/src/init/define_parameters_init.f90 @@ -82,7 +82,7 @@ SUBROUTINE InitDefineParameters() USE MOD_SuperB_Init ,ONLY: DefineParametersSuperB #endif #if (PP_TimeDiscMethod==600) -USE MOD_RadiationTrans_Init ,ONLY: DefineParametersRadiationTransport +USE MOD_RadiationTrans_Init ,ONLY: DefineParametersRadiationTrans USE MOD_Radiation_Init ,ONLY: DefineParametersRadiation #endif !----------------------------------------------------------------------------------------------------------------------------------! diff --git a/src/radiation/radiation_solver/radiation_init.f90 b/src/radiation/radiation_solver/radiation_init.f90 index 9dbb8e92b..b1b18c138 100644 --- a/src/radiation/radiation_solver/radiation_init.f90 +++ b/src/radiation/radiation_solver/radiation_init.f90 @@ -94,13 +94,17 @@ SUBROUTINE InitRadiation() ! MODULES USE MOD_Globals USE MOD_Globals_Vars, ONLY : PlanckConst, c -USE MOD_Mesh_Vars, ONLY : nElems -USE MOD_Particle_Mesh_Vars, ONLY : nTotalElems +USE MOD_Mesh_Vars, ONLY : nElems, nGlobalElems +USE MOD_Particle_Mesh_Vars, ONLY : nComputeNodeElems USE MOD_ReadInTools USE MOD_PARTICLE_Vars, ONLY : nSpecies USE MOD_Radiation_Vars USE MOD_DSMC_Vars, ONLY : SpecDSMC USE MOD_Radiation_ReadIn, ONLY : Radiation_readin_atoms, Radiation_readin_molecules +#if USE_MPI +!USE MOD_MPI_Shared_Vars +USE MOD_MPI_Shared +#endif ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -111,6 +115,9 @@ SUBROUTINE InitRadiation() ! LOCAL VARIABLES CHARACTER(32) :: hilf INTEGER :: iSpec, iWaveLen +#if USE_MPI + INTEGER(KIND=MPI_ADDRESS_KIND) :: MPISharedSize +#endif /*USE_MPI*/ !=================================================================================================================================== SWRITE(UNIT_stdOut,'(A)') ' INIT RADIATION SOLVER...' @@ -186,15 +193,15 @@ SUBROUTINE InitRadiation() TElectrons = GETREAL('Radiation-TElectrons', '0.0') #if USE_MPI - ! allocate shared array for ElemInfo + ! allocate shared array for Radiation_Emission/Absorption_Spec MPISharedSize = INT((RadiationParameter%WaveLenDiscr)*nComputeNodeElems,MPI_ADDRESS_KIND)*MPI_ADDRESS_KIND CALL Allocate_Shared(MPISharedSize,(/RadiationParameter%WaveLenDiscr,nComputeNodeElems/), & -Radiation_Emission_Spec_Shared_Win,Radiation_Emission_Spec_Shared) + Radiation_Emission_Spec_Shared_Win,Radiation_Emission_Spec_Shared) CALL MPI_WIN_LOCK_ALL(0,Radiation_Emission_Spec_Shared_Win,IERROR) MPISharedSize = INT((RadiationParameter%WaveLenDiscr)*nGlobalElems,MPI_ADDRESS_KIND)*MPI_ADDRESS_KIND CALL Allocate_Shared(MPISharedSize,(/RadiationParameter%WaveLenDiscr,nGlobalElems/), & -Radiation_Absorption_Spec_Shared_Win,Radiation_Absorption_Spec_Shared) + Radiation_Absorption_Spec_Shared_Win,Radiation_Absorption_Spec_Shared) CALL MPI_WIN_LOCK_ALL(0,Radiation_Absorption_Spec_Shared_Win,IERROR) Radiation_Emission_spec => Radiation_Emission_spec_Shared @@ -311,6 +318,10 @@ SUBROUTINE FinalizeRadiation() !=================================================================================================================================== ! MODULES USE MOD_Radiation_Vars +#if USE_MPI +!USE MOD_MPI_Shared_Vars !,ONLY: MPI_COMM_SHARED +USE MOD_MPI_Shared +#endif !----------------------------------------------------------------------------------------------------------------------------------- IMPLICIT NONE ! INPUT VARIABLES @@ -323,10 +334,17 @@ SUBROUTINE FinalizeRadiation() SDEALLOCATE(RadiationInput) SDEALLOCATE(SpeciesRadiation) SDEALLOCATE(RadiationParameter%WaveLen) -SDEALLOCATE(Radiation_Emission_spec) -SDEALLOCATE(Radiation_Absorption_spec) SDEALLOCATE(Radiation_ElemEnergy_Species) +#if USE_MPI +CALL UNLOCK_AND_FREE(Radiation_Emission_Spec_Shared_Win) +CALL UNLOCK_AND_FREE(Radiation_Absorption_Spec_Shared_Win) +ADEALLOCATE(Radiation_Emission_Spec_Shared) +ADEALLOCATE(Radiation_Absorption_Spec_Shared) +#endif /*USE_MPI*/ +ADEALLOCATE(Radiation_Emission_Spec) +ADEALLOCATE(Radiation_Absorption_Spec) + END SUBROUTINE FinalizeRadiation diff --git a/src/radiation/radiation_solver/radiation_vars.f90 b/src/radiation/radiation_solver/radiation_vars.f90 index 29d24fe13..1639f7ad1 100644 --- a/src/radiation/radiation_solver/radiation_vars.f90 +++ b/src/radiation/radiation_solver/radiation_vars.f90 @@ -89,7 +89,7 @@ MODULE MOD_Radiation_Vars TYPE(tSpeciesRadiation), ALLOCATABLE :: SpeciesRadiation(:) ! (nSpec) -REAL, ALLOCATABLE :: Radiation_NumDens +!REAL, ALLOCATABLE :: Radiation_NumDens REAL, ALLOCATABLE :: Radiation_ElemEnergy_Species(:,:,:)! (number of species, number of mesh elements, 2(Emission,Absorption)) diff --git a/src/radiation/radiative_transfer/radtrans_init.f90 b/src/radiation/radiative_transfer/radtrans_init.f90 index b54e3a281..de984a573 100644 --- a/src/radiation/radiative_transfer/radtrans_init.f90 +++ b/src/radiation/radiative_transfer/radtrans_init.f90 @@ -58,15 +58,14 @@ SUBROUTINE InitRadiationTransport() !=================================================================================================================================== ! MODULES USE MOD_Globals -USE MOD_Globals_Vars, ONLY : Pi +USE MOD_Globals_Vars, ONLY : Pi, c USE MOD_ReadInTools USE MOD_RadiationTrans_Vars USE MOD_Mesh_Vars, ONLY : nElems, nGlobalElems -USE MOD_Particle_Mesh_Vars, ONLY : GEO, nTotalElems +USE MOD_Particle_Mesh_Vars, ONLY : GEO!, nTotalElems USE MOD_Globals_Vars, ONLY : BoltzmannConst, PlanckConst USE MOD_Particle_Boundary_Sampling, ONLY : InitParticleBoundarySampling USE MOD_Particle_Boundary_Vars, ONLY : SurfMesh -USE MOD_Equation_Vars, ONLY : c USE MOD_Radiation_Vars, ONLY : RadiationParameter, Radiation_Emission_spec, Radiation_Absorption_spec, RadiationSwitches USE MOD_Radiation, ONLY : radiation_main USE MOD_DSMC_Vars, ONLY: RadialWeighting @@ -176,256 +175,256 @@ SUBROUTINE InitRadiationTransport() END SUBROUTINE InitRadiationTransport -!SUBROUTINE HALTON( ind, dims, rand ) -!!=================================================================================================================================== -!! modified particle emmission for LD case -!!=================================================================================================================================== -!! MODULES -!! IMPLICIT VARIABLE HANDLING -!IMPLICIT NONE -!!----------------------------------------------------------------------------------------------------------------------------------- -!! INPUT VARIABLES -!!----------------------------------------------------------------------------------------------------------------------------------- -!! INOUTPUT VARIABLES -!INTEGER, INTENT(IN) :: ind, dims -!REAL, INTENT(OUT) :: rand(dims) -!!----------------------------------------------------------------------------------------------------------------------------------- -!! LOCAL VARIABLES -!INTEGER :: t(dims),j, i1, d -!REAL :: primeinv(dims) -!!=================================================================================================================================== -! t(1:dims) = ABS(ind) -! DO i1 = 1, dims -! primeinv(i1) = 1.0/REAL(PRIME(i1)) -! END DO -! rand = 0.0 +SUBROUTINE HALTON( ind, dims, rand ) +!=================================================================================================================================== +! modified particle emmission for LD case +!=================================================================================================================================== +! MODULES +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! INOUTPUT VARIABLES +INTEGER, INTENT(IN) :: ind, dims +REAL, INTENT(OUT) :: rand(dims) +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +INTEGER :: t(dims),j, i1, d +REAL :: primeinv(dims) +!=================================================================================================================================== + t(1:dims) = ABS(ind) + DO i1 = 1, dims + primeinv(i1) = 1.0/REAL(PRIME(i1)) + END DO + rand = 0.0 -! DO WHILE (ANY(t(1:dims).NE.0)) -! do j = 1, dims -! d = MOD(t(j), PRIME(j)) -! rand(j) = rand(j) + REAL(d) * primeinv(j) -! primeinv(j) = primeinv(j) / REAL(PRIME( j )) -! t(j) = ( t(j) / PRIME ( j ) ) -! END DO -! END DO + DO WHILE (ANY(t(1:dims).NE.0)) + do j = 1, dims + d = MOD(t(j), PRIME(j)) + rand(j) = rand(j) + REAL(d) * primeinv(j) + primeinv(j) = primeinv(j) / REAL(PRIME( j )) + t(j) = ( t(j) / PRIME ( j ) ) + END DO + END DO -! RETURN -!END SUBROUTINE HALTON + RETURN +END SUBROUTINE HALTON -!INTEGER FUNCTION PRIME(n) -!!=================================================================================================================================== -!! modified particle emmission for LD case -!!=================================================================================================================================== -!! MODULES -!! IMPLICIT VARIABLE HANDLING -!IMPLICIT NONE -!!----------------------------------------------------------------------------------------------------------------------------------- -!! INPUT VARIABLES -!!----------------------------------------------------------------------------------------------------------------------------------- -!! INOUTPUT VARIABLES -!!----------------------------------------------------------------------------------------------------------------------------------- -!! OUTPUT VARIABLES -!!----------------------------------------------------------------------------------------------------------------------------------- -!! LOCAL VARIABLES -!INTEGER, PARAMETER :: prime_max=1600 -!INTEGER, SAVE :: icall = 0, npvec(prime_max) -!INTEGER, INTENT(IN) :: n -!!=================================================================================================================================== -! IF (icall.EQ.0) THEN -! icall = 1 -! npvec(1:100) = (/ & -! 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, & -! 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, & -! 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, & -! 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, & -! 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, & -! 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, & -! 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, & -! 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, & -! 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, & -! 467, 479, 487, 491, 499, 503, 509, 521, 523, 541 /) -! npvec(101:200) = (/ & -! 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, & -! 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, & -! 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, & -! 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, & -! 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, & -! 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, & -! 947, 953, 967, 971, 977, 983, 991, 997, 1009, 1013, & -! 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, & -! 1087, 1091, 1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151, & -! 1153, 1163, 1171, 1181, 1187, 1193, 1201, 1213, 1217, 1223 /) -! npvec(201:300) = (/ & -! 1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283, 1289, 1291, & -! 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367, 1373, & -! 1381, 1399, 1409, 1423, 1427, 1429, 1433, 1439, 1447, 1451, & -! 1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499, 1511, & -! 1523, 1531, 1543, 1549, 1553, 1559, 1567, 1571, 1579, 1583, & -! 1597, 1601, 1607, 1609, 1613, 1619, 1621, 1627, 1637, 1657, & -! 1663, 1667, 1669, 1693, 1697, 1699, 1709, 1721, 1723, 1733, & -! 1741, 1747, 1753, 1759, 1777, 1783, 1787, 1789, 1801, 1811, & -! 1823, 1831, 1847, 1861, 1867, 1871, 1873, 1877, 1879, 1889, & -! 1901, 1907, 1913, 1931, 1933, 1949, 1951, 1973, 1979, 1987 /) -! npvec(301:400) = (/ & -! 1993, 1997, 1999, 2003, 2011, 2017, 2027, 2029, 2039, 2053, & -! 2063, 2069, 2081, 2083, 2087, 2089, 2099, 2111, 2113, 2129, & -! 2131, 2137, 2141, 2143, 2153, 2161, 2179, 2203, 2207, 2213, & -! 2221, 2237, 2239, 2243, 2251, 2267, 2269, 2273, 2281, 2287, & -! 2293, 2297, 2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357, & -! 2371, 2377, 2381, 2383, 2389, 2393, 2399, 2411, 2417, 2423, & -! 2437, 2441, 2447, 2459, 2467, 2473, 2477, 2503, 2521, 2531, & -! 2539, 2543, 2549, 2551, 2557, 2579, 2591, 2593, 2609, 2617, & -! 2621, 2633, 2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687, & -! 2689, 2693, 2699, 2707, 2711, 2713, 2719, 2729, 2731, 2741 /) -! npvec(401:500) = (/ & -! 2749, 2753, 2767, 2777, 2789, 2791, 2797, 2801, 2803, 2819, & -! 2833, 2837, 2843, 2851, 2857, 2861, 2879, 2887, 2897, 2903, & -! 2909, 2917, 2927, 2939, 2953, 2957, 2963, 2969, 2971, 2999, & -! 3001, 3011, 3019, 3023, 3037, 3041, 3049, 3061, 3067, 3079, & -! 3083, 3089, 3109, 3119, 3121, 3137, 3163, 3167, 3169, 3181, & -! 3187, 3191, 3203, 3209, 3217, 3221, 3229, 3251, 3253, 3257, & -! 3259, 3271, 3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331, & -! 3343, 3347, 3359, 3361, 3371, 3373, 3389, 3391, 3407, 3413, & -! 3433, 3449, 3457, 3461, 3463, 3467, 3469, 3491, 3499, 3511, & -! 3517, 3527, 3529, 3533, 3539, 3541, 3547, 3557, 3559, 3571 /) -! npvec(501:600) = (/ & -! 3581, 3583, 3593, 3607, 3613, 3617, 3623, 3631, 3637, 3643, & -! 3659, 3671, 3673, 3677, 3691, 3697, 3701, 3709, 3719, 3727, & -! 3733, 3739, 3761, 3767, 3769, 3779, 3793, 3797, 3803, 3821, & -! 3823, 3833, 3847, 3851, 3853, 3863, 3877, 3881, 3889, 3907, & -! 3911, 3917, 3919, 3923, 3929, 3931, 3943, 3947, 3967, 3989, & -! 4001, 4003, 4007, 4013, 4019, 4021, 4027, 4049, 4051, 4057, & -! 4073, 4079, 4091, 4093, 4099, 4111, 4127, 4129, 4133, 4139, & -! 4153, 4157, 4159, 4177, 4201, 4211, 4217, 4219, 4229, 4231, & -! 4241, 4243, 4253, 4259, 4261, 4271, 4273, 4283, 4289, 4297, & -! 4327, 4337, 4339, 4349, 4357, 4363, 4373, 4391, 4397, 4409 /) -! npvec(601:700) = (/ & -! 4421, 4423, 4441, 4447, 4451, 4457, 4463, 4481, 4483, 4493, & -! 4507, 4513, 4517, 4519, 4523, 4547, 4549, 4561, 4567, 4583, & -! 4591, 4597, 4603, 4621, 4637, 4639, 4643, 4649, 4651, 4657, & -! 4663, 4673, 4679, 4691, 4703, 4721, 4723, 4729, 4733, 4751, & -! 4759, 4783, 4787, 4789, 4793, 4799, 4801, 4813, 4817, 4831, & -! 4861, 4871, 4877, 4889, 4903, 4909, 4919, 4931, 4933, 4937, & -! 4943, 4951, 4957, 4967, 4969, 4973, 4987, 4993, 4999, 5003, & -! 5009, 5011, 5021, 5023, 5039, 5051, 5059, 5077, 5081, 5087, & -! 5099, 5101, 5107, 5113, 5119, 5147, 5153, 5167, 5171, 5179, & -! 5189, 5197, 5209, 5227, 5231, 5233, 5237, 5261, 5273, 5279 /) -! npvec(701:800) = (/ & -! 5281, 5297, 5303, 5309, 5323, 5333, 5347, 5351, 5381, 5387, & -! 5393, 5399, 5407, 5413, 5417, 5419, 5431, 5437, 5441, 5443, & -! 5449, 5471, 5477, 5479, 5483, 5501, 5503, 5507, 5519, 5521, & -! 5527, 5531, 5557, 5563, 5569, 5573, 5581, 5591, 5623, 5639, & -! 5641, 5647, 5651, 5653, 5657, 5659, 5669, 5683, 5689, 5693, & -! 5701, 5711, 5717, 5737, 5741, 5743, 5749, 5779, 5783, 5791, & -! 5801, 5807, 5813, 5821, 5827, 5839, 5843, 5849, 5851, 5857, & -! 5861, 5867, 5869, 5879, 5881, 5897, 5903, 5923, 5927, 5939, & -! 5953, 5981, 5987, 6007, 6011, 6029, 6037, 6043, 6047, 6053, & -! 6067, 6073, 6079, 6089, 6091, 6101, 6113, 6121, 6131, 6133 /) -! npvec(801:900) = (/ & -! 6143, 6151, 6163, 6173, 6197, 6199, 6203, 6211, 6217, 6221, & -! 6229, 6247, 6257, 6263, 6269, 6271, 6277, 6287, 6299, 6301, & -! 6311, 6317, 6323, 6329, 6337, 6343, 6353, 6359, 6361, 6367, & -! 6373, 6379, 6389, 6397, 6421, 6427, 6449, 6451, 6469, 6473, & -! 6481, 6491, 6521, 6529, 6547, 6551, 6553, 6563, 6569, 6571, & -! 6577, 6581, 6599, 6607, 6619, 6637, 6653, 6659, 6661, 6673, & -! 6679, 6689, 6691, 6701, 6703, 6709, 6719, 6733, 6737, 6761, & -! 6763, 6779, 6781, 6791, 6793, 6803, 6823, 6827, 6829, 6833, & -! 6841, 6857, 6863, 6869, 6871, 6883, 6899, 6907, 6911, 6917, & -! 6947, 6949, 6959, 6961, 6967, 6971, 6977, 6983, 6991, 6997 /) -! npvec(901:1000) = (/ & -! 7001, 7013, 7019, 7027, 7039, 7043, 7057, 7069, 7079, 7103, & -! 7109, 7121, 7127, 7129, 7151, 7159, 7177, 7187, 7193, 7207, & -! 7211, 7213, 7219, 7229, 7237, 7243, 7247, 7253, 7283, 7297, & -! 7307, 7309, 7321, 7331, 7333, 7349, 7351, 7369, 7393, 7411, & -! 7417, 7433, 7451, 7457, 7459, 7477, 7481, 7487, 7489, 7499, & -! 7507, 7517, 7523, 7529, 7537, 7541, 7547, 7549, 7559, 7561, & -! 7573, 7577, 7583, 7589, 7591, 7603, 7607, 7621, 7639, 7643, & -! 7649, 7669, 7673, 7681, 7687, 7691, 7699, 7703, 7717, 7723, & -! 7727, 7741, 7753, 7757, 7759, 7789, 7793, 7817, 7823, 7829, & -! 7841, 7853, 7867, 7873, 7877, 7879, 7883, 7901, 7907, 7919 /) -! npvec(1001:1100) = (/ & -! 7927, 7933, 7937, 7949, 7951, 7963, 7993, 8009, 8011, 8017, & -! 8039, 8053, 8059, 8069, 8081, 8087, 8089, 8093, 8101, 8111, & -! 8117, 8123, 8147, 8161, 8167, 8171, 8179, 8191, 8209, 8219, & -! 8221, 8231, 8233, 8237, 8243, 8263, 8269, 8273, 8287, 8291, & -! 8293, 8297, 8311, 8317, 8329, 8353, 8363, 8369, 8377, 8387, & -! 8389, 8419, 8423, 8429, 8431, 8443, 8447, 8461, 8467, 8501, & -! 8513, 8521, 8527, 8537, 8539, 8543, 8563, 8573, 8581, 8597, & -! 8599, 8609, 8623, 8627, 8629, 8641, 8647, 8663, 8669, 8677, & -! 8681, 8689, 8693, 8699, 8707, 8713, 8719, 8731, 8737, 8741, & -! 8747, 8753, 8761, 8779, 8783, 8803, 8807, 8819, 8821, 8831 /) -! npvec(1101:1200) = (/ & -! 8837, 8839, 8849, 8861, 8863, 8867, 8887, 8893, 8923, 8929, & -! 8933, 8941, 8951, 8963, 8969, 8971, 8999, 9001, 9007, 9011, & -! 9013, 9029, 9041, 9043, 9049, 9059, 9067, 9091, 9103, 9109, & -! 9127, 9133, 9137, 9151, 9157, 9161, 9173, 9181, 9187, 9199, & -! 9203, 9209, 9221, 9227, 9239, 9241, 9257, 9277, 9281, 9283, & -! 9293, 9311, 9319, 9323, 9337, 9341, 9343, 9349, 9371, 9377, & -! 9391, 9397, 9403, 9413, 9419, 9421, 9431, 9433, 9437, 9439, & -! 9461, 9463, 9467, 9473, 9479, 9491, 9497, 9511, 9521, 9533, & -! 9539, 9547, 9551, 9587, 9601, 9613, 9619, 9623, 9629, 9631, & -! 9643, 9649, 9661, 9677, 9679, 9689, 9697, 9719, 9721, 9733 /) -! npvec(1201:1300) = (/ & -! 9739, 9743, 9749, 9767, 9769, 9781, 9787, 9791, 9803, 9811, & -! 9817, 9829, 9833, 9839, 9851, 9857, 9859, 9871, 9883, 9887, & -! 9901, 9907, 9923, 9929, 9931, 9941, 9949, 9967, 9973,10007, & -! 10009,10037,10039,10061,10067,10069,10079,10091,10093,10099, & -! 10103,10111,10133,10139,10141,10151,10159,10163,10169,10177, & -! 10181,10193,10211,10223,10243,10247,10253,10259,10267,10271, & -! 10273,10289,10301,10303,10313,10321,10331,10333,10337,10343, & -! 10357,10369,10391,10399,10427,10429,10433,10453,10457,10459, & -! 10463,10477,10487,10499,10501,10513,10529,10531,10559,10567, & -! 10589,10597,10601,10607,10613,10627,10631,10639,10651,10657 /) -! npvec(1301:1400) = (/ & -! 10663,10667,10687,10691,10709,10711,10723,10729,10733,10739, & -! 10753,10771,10781,10789,10799,10831,10837,10847,10853,10859, & -! 10861,10867,10883,10889,10891,10903,10909,10937,10939,10949, & -! 10957,10973,10979,10987,10993,11003,11027,11047,11057,11059, & -! 11069,11071,11083,11087,11093,11113,11117,11119,11131,11149, & -! 11159,11161,11171,11173,11177,11197,11213,11239,11243,11251, & -! 11257,11261,11273,11279,11287,11299,11311,11317,11321,11329, & -! 11351,11353,11369,11383,11393,11399,11411,11423,11437,11443, & -! 11447,11467,11471,11483,11489,11491,11497,11503,11519,11527, & -! 11549,11551,11579,11587,11593,11597,11617,11621,11633,11657 /) -! npvec(1401:1500) = (/ & -! 11677,11681,11689,11699,11701,11717,11719,11731,11743,11777, & -! 11779,11783,11789,11801,11807,11813,11821,11827,11831,11833, & -! 11839,11863,11867,11887,11897,11903,11909,11923,11927,11933, & -! 11939,11941,11953,11959,11969,11971,11981,11987,12007,12011, & -! 12037,12041,12043,12049,12071,12073,12097,12101,12107,12109, & -! 12113,12119,12143,12149,12157,12161,12163,12197,12203,12211, & -! 12227,12239,12241,12251,12253,12263,12269,12277,12281,12289, & -! 12301,12323,12329,12343,12347,12373,12377,12379,12391,12401, & -! 12409,12413,12421,12433,12437,12451,12457,12473,12479,12487, & -! 12491,12497,12503,12511,12517,12527,12539,12541,12547,12553 /) -! npvec(1501:1600) = (/ & -! 12569,12577,12583,12589,12601,12611,12613,12619,12637,12641, & -! 12647,12653,12659,12671,12689,12697,12703,12713,12721,12739, & -! 12743,12757,12763,12781,12791,12799,12809,12821,12823,12829, & -! 12841,12853,12889,12893,12899,12907,12911,12917,12919,12923, & -! 12941,12953,12959,12967,12973,12979,12983,13001,13003,13007, & -! 13009,13033,13037,13043,13049,13063,13093,13099,13103,13109, & -! 13121,13127,13147,13151,13159,13163,13171,13177,13183,13187, & -! 13217,13219,13229,13241,13249,13259,13267,13291,13297,13309, & -! 13313,13327,13331,13337,13339,13367,13381,13397,13399,13411, & -! 13417,13421,13441,13451,13457,13463,13469,13477,13487,13499 /) -! END IF -! IF (n.EQ.-1) THEN -! PRIME = prime_max -! ELSE IF (n.EQ.0) THEN -! PRIME = 1 -! ELSE IF (n.LE.prime_max) THEN -! PRIME = npvec(n) -! ELSE -! PRIME = -1 -! write ( *, '(a)' ) ' ' -! write ( *, '(a)' ) 'PRIME - Fatal error!' -! write ( *, '(a,i8)' ) ' Illegal prime index N = ', n -! write ( *, '(a,i8)' ) ' N should be between 1 and PRIME_MAX =', prime_max -! stop 1 -! END IF +INTEGER FUNCTION PRIME(n) +!=================================================================================================================================== +! modified particle emmission for LD case +!=================================================================================================================================== +! MODULES +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! INOUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +INTEGER, PARAMETER :: prime_max=1600 +INTEGER, SAVE :: icall = 0, npvec(prime_max) +INTEGER, INTENT(IN) :: n +!=================================================================================================================================== + IF (icall.EQ.0) THEN + icall = 1 + npvec(1:100) = (/ & + 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, & + 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, & + 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, & + 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, & + 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, & + 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, & + 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, & + 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, & + 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, & + 467, 479, 487, 491, 499, 503, 509, 521, 523, 541 /) + npvec(101:200) = (/ & + 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, & + 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, & + 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, & + 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, & + 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, & + 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, & + 947, 953, 967, 971, 977, 983, 991, 997, 1009, 1013, & + 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, & + 1087, 1091, 1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151, & + 1153, 1163, 1171, 1181, 1187, 1193, 1201, 1213, 1217, 1223 /) + npvec(201:300) = (/ & + 1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283, 1289, 1291, & + 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367, 1373, & + 1381, 1399, 1409, 1423, 1427, 1429, 1433, 1439, 1447, 1451, & + 1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499, 1511, & + 1523, 1531, 1543, 1549, 1553, 1559, 1567, 1571, 1579, 1583, & + 1597, 1601, 1607, 1609, 1613, 1619, 1621, 1627, 1637, 1657, & + 1663, 1667, 1669, 1693, 1697, 1699, 1709, 1721, 1723, 1733, & + 1741, 1747, 1753, 1759, 1777, 1783, 1787, 1789, 1801, 1811, & + 1823, 1831, 1847, 1861, 1867, 1871, 1873, 1877, 1879, 1889, & + 1901, 1907, 1913, 1931, 1933, 1949, 1951, 1973, 1979, 1987 /) + npvec(301:400) = (/ & + 1993, 1997, 1999, 2003, 2011, 2017, 2027, 2029, 2039, 2053, & + 2063, 2069, 2081, 2083, 2087, 2089, 2099, 2111, 2113, 2129, & + 2131, 2137, 2141, 2143, 2153, 2161, 2179, 2203, 2207, 2213, & + 2221, 2237, 2239, 2243, 2251, 2267, 2269, 2273, 2281, 2287, & + 2293, 2297, 2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357, & + 2371, 2377, 2381, 2383, 2389, 2393, 2399, 2411, 2417, 2423, & + 2437, 2441, 2447, 2459, 2467, 2473, 2477, 2503, 2521, 2531, & + 2539, 2543, 2549, 2551, 2557, 2579, 2591, 2593, 2609, 2617, & + 2621, 2633, 2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687, & + 2689, 2693, 2699, 2707, 2711, 2713, 2719, 2729, 2731, 2741 /) + npvec(401:500) = (/ & + 2749, 2753, 2767, 2777, 2789, 2791, 2797, 2801, 2803, 2819, & + 2833, 2837, 2843, 2851, 2857, 2861, 2879, 2887, 2897, 2903, & + 2909, 2917, 2927, 2939, 2953, 2957, 2963, 2969, 2971, 2999, & + 3001, 3011, 3019, 3023, 3037, 3041, 3049, 3061, 3067, 3079, & + 3083, 3089, 3109, 3119, 3121, 3137, 3163, 3167, 3169, 3181, & + 3187, 3191, 3203, 3209, 3217, 3221, 3229, 3251, 3253, 3257, & + 3259, 3271, 3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331, & + 3343, 3347, 3359, 3361, 3371, 3373, 3389, 3391, 3407, 3413, & + 3433, 3449, 3457, 3461, 3463, 3467, 3469, 3491, 3499, 3511, & + 3517, 3527, 3529, 3533, 3539, 3541, 3547, 3557, 3559, 3571 /) + npvec(501:600) = (/ & + 3581, 3583, 3593, 3607, 3613, 3617, 3623, 3631, 3637, 3643, & + 3659, 3671, 3673, 3677, 3691, 3697, 3701, 3709, 3719, 3727, & + 3733, 3739, 3761, 3767, 3769, 3779, 3793, 3797, 3803, 3821, & + 3823, 3833, 3847, 3851, 3853, 3863, 3877, 3881, 3889, 3907, & + 3911, 3917, 3919, 3923, 3929, 3931, 3943, 3947, 3967, 3989, & + 4001, 4003, 4007, 4013, 4019, 4021, 4027, 4049, 4051, 4057, & + 4073, 4079, 4091, 4093, 4099, 4111, 4127, 4129, 4133, 4139, & + 4153, 4157, 4159, 4177, 4201, 4211, 4217, 4219, 4229, 4231, & + 4241, 4243, 4253, 4259, 4261, 4271, 4273, 4283, 4289, 4297, & + 4327, 4337, 4339, 4349, 4357, 4363, 4373, 4391, 4397, 4409 /) + npvec(601:700) = (/ & + 4421, 4423, 4441, 4447, 4451, 4457, 4463, 4481, 4483, 4493, & + 4507, 4513, 4517, 4519, 4523, 4547, 4549, 4561, 4567, 4583, & + 4591, 4597, 4603, 4621, 4637, 4639, 4643, 4649, 4651, 4657, & + 4663, 4673, 4679, 4691, 4703, 4721, 4723, 4729, 4733, 4751, & + 4759, 4783, 4787, 4789, 4793, 4799, 4801, 4813, 4817, 4831, & + 4861, 4871, 4877, 4889, 4903, 4909, 4919, 4931, 4933, 4937, & + 4943, 4951, 4957, 4967, 4969, 4973, 4987, 4993, 4999, 5003, & + 5009, 5011, 5021, 5023, 5039, 5051, 5059, 5077, 5081, 5087, & + 5099, 5101, 5107, 5113, 5119, 5147, 5153, 5167, 5171, 5179, & + 5189, 5197, 5209, 5227, 5231, 5233, 5237, 5261, 5273, 5279 /) + npvec(701:800) = (/ & + 5281, 5297, 5303, 5309, 5323, 5333, 5347, 5351, 5381, 5387, & + 5393, 5399, 5407, 5413, 5417, 5419, 5431, 5437, 5441, 5443, & + 5449, 5471, 5477, 5479, 5483, 5501, 5503, 5507, 5519, 5521, & + 5527, 5531, 5557, 5563, 5569, 5573, 5581, 5591, 5623, 5639, & + 5641, 5647, 5651, 5653, 5657, 5659, 5669, 5683, 5689, 5693, & + 5701, 5711, 5717, 5737, 5741, 5743, 5749, 5779, 5783, 5791, & + 5801, 5807, 5813, 5821, 5827, 5839, 5843, 5849, 5851, 5857, & + 5861, 5867, 5869, 5879, 5881, 5897, 5903, 5923, 5927, 5939, & + 5953, 5981, 5987, 6007, 6011, 6029, 6037, 6043, 6047, 6053, & + 6067, 6073, 6079, 6089, 6091, 6101, 6113, 6121, 6131, 6133 /) + npvec(801:900) = (/ & + 6143, 6151, 6163, 6173, 6197, 6199, 6203, 6211, 6217, 6221, & + 6229, 6247, 6257, 6263, 6269, 6271, 6277, 6287, 6299, 6301, & + 6311, 6317, 6323, 6329, 6337, 6343, 6353, 6359, 6361, 6367, & + 6373, 6379, 6389, 6397, 6421, 6427, 6449, 6451, 6469, 6473, & + 6481, 6491, 6521, 6529, 6547, 6551, 6553, 6563, 6569, 6571, & + 6577, 6581, 6599, 6607, 6619, 6637, 6653, 6659, 6661, 6673, & + 6679, 6689, 6691, 6701, 6703, 6709, 6719, 6733, 6737, 6761, & + 6763, 6779, 6781, 6791, 6793, 6803, 6823, 6827, 6829, 6833, & + 6841, 6857, 6863, 6869, 6871, 6883, 6899, 6907, 6911, 6917, & + 6947, 6949, 6959, 6961, 6967, 6971, 6977, 6983, 6991, 6997 /) + npvec(901:1000) = (/ & + 7001, 7013, 7019, 7027, 7039, 7043, 7057, 7069, 7079, 7103, & + 7109, 7121, 7127, 7129, 7151, 7159, 7177, 7187, 7193, 7207, & + 7211, 7213, 7219, 7229, 7237, 7243, 7247, 7253, 7283, 7297, & + 7307, 7309, 7321, 7331, 7333, 7349, 7351, 7369, 7393, 7411, & + 7417, 7433, 7451, 7457, 7459, 7477, 7481, 7487, 7489, 7499, & + 7507, 7517, 7523, 7529, 7537, 7541, 7547, 7549, 7559, 7561, & + 7573, 7577, 7583, 7589, 7591, 7603, 7607, 7621, 7639, 7643, & + 7649, 7669, 7673, 7681, 7687, 7691, 7699, 7703, 7717, 7723, & + 7727, 7741, 7753, 7757, 7759, 7789, 7793, 7817, 7823, 7829, & + 7841, 7853, 7867, 7873, 7877, 7879, 7883, 7901, 7907, 7919 /) + npvec(1001:1100) = (/ & + 7927, 7933, 7937, 7949, 7951, 7963, 7993, 8009, 8011, 8017, & + 8039, 8053, 8059, 8069, 8081, 8087, 8089, 8093, 8101, 8111, & + 8117, 8123, 8147, 8161, 8167, 8171, 8179, 8191, 8209, 8219, & + 8221, 8231, 8233, 8237, 8243, 8263, 8269, 8273, 8287, 8291, & + 8293, 8297, 8311, 8317, 8329, 8353, 8363, 8369, 8377, 8387, & + 8389, 8419, 8423, 8429, 8431, 8443, 8447, 8461, 8467, 8501, & + 8513, 8521, 8527, 8537, 8539, 8543, 8563, 8573, 8581, 8597, & + 8599, 8609, 8623, 8627, 8629, 8641, 8647, 8663, 8669, 8677, & + 8681, 8689, 8693, 8699, 8707, 8713, 8719, 8731, 8737, 8741, & + 8747, 8753, 8761, 8779, 8783, 8803, 8807, 8819, 8821, 8831 /) + npvec(1101:1200) = (/ & + 8837, 8839, 8849, 8861, 8863, 8867, 8887, 8893, 8923, 8929, & + 8933, 8941, 8951, 8963, 8969, 8971, 8999, 9001, 9007, 9011, & + 9013, 9029, 9041, 9043, 9049, 9059, 9067, 9091, 9103, 9109, & + 9127, 9133, 9137, 9151, 9157, 9161, 9173, 9181, 9187, 9199, & + 9203, 9209, 9221, 9227, 9239, 9241, 9257, 9277, 9281, 9283, & + 9293, 9311, 9319, 9323, 9337, 9341, 9343, 9349, 9371, 9377, & + 9391, 9397, 9403, 9413, 9419, 9421, 9431, 9433, 9437, 9439, & + 9461, 9463, 9467, 9473, 9479, 9491, 9497, 9511, 9521, 9533, & + 9539, 9547, 9551, 9587, 9601, 9613, 9619, 9623, 9629, 9631, & + 9643, 9649, 9661, 9677, 9679, 9689, 9697, 9719, 9721, 9733 /) + npvec(1201:1300) = (/ & + 9739, 9743, 9749, 9767, 9769, 9781, 9787, 9791, 9803, 9811, & + 9817, 9829, 9833, 9839, 9851, 9857, 9859, 9871, 9883, 9887, & + 9901, 9907, 9923, 9929, 9931, 9941, 9949, 9967, 9973,10007, & + 10009,10037,10039,10061,10067,10069,10079,10091,10093,10099, & + 10103,10111,10133,10139,10141,10151,10159,10163,10169,10177, & + 10181,10193,10211,10223,10243,10247,10253,10259,10267,10271, & + 10273,10289,10301,10303,10313,10321,10331,10333,10337,10343, & + 10357,10369,10391,10399,10427,10429,10433,10453,10457,10459, & + 10463,10477,10487,10499,10501,10513,10529,10531,10559,10567, & + 10589,10597,10601,10607,10613,10627,10631,10639,10651,10657 /) + npvec(1301:1400) = (/ & + 10663,10667,10687,10691,10709,10711,10723,10729,10733,10739, & + 10753,10771,10781,10789,10799,10831,10837,10847,10853,10859, & + 10861,10867,10883,10889,10891,10903,10909,10937,10939,10949, & + 10957,10973,10979,10987,10993,11003,11027,11047,11057,11059, & + 11069,11071,11083,11087,11093,11113,11117,11119,11131,11149, & + 11159,11161,11171,11173,11177,11197,11213,11239,11243,11251, & + 11257,11261,11273,11279,11287,11299,11311,11317,11321,11329, & + 11351,11353,11369,11383,11393,11399,11411,11423,11437,11443, & + 11447,11467,11471,11483,11489,11491,11497,11503,11519,11527, & + 11549,11551,11579,11587,11593,11597,11617,11621,11633,11657 /) + npvec(1401:1500) = (/ & + 11677,11681,11689,11699,11701,11717,11719,11731,11743,11777, & + 11779,11783,11789,11801,11807,11813,11821,11827,11831,11833, & + 11839,11863,11867,11887,11897,11903,11909,11923,11927,11933, & + 11939,11941,11953,11959,11969,11971,11981,11987,12007,12011, & + 12037,12041,12043,12049,12071,12073,12097,12101,12107,12109, & + 12113,12119,12143,12149,12157,12161,12163,12197,12203,12211, & + 12227,12239,12241,12251,12253,12263,12269,12277,12281,12289, & + 12301,12323,12329,12343,12347,12373,12377,12379,12391,12401, & + 12409,12413,12421,12433,12437,12451,12457,12473,12479,12487, & + 12491,12497,12503,12511,12517,12527,12539,12541,12547,12553 /) + npvec(1501:1600) = (/ & + 12569,12577,12583,12589,12601,12611,12613,12619,12637,12641, & + 12647,12653,12659,12671,12689,12697,12703,12713,12721,12739, & + 12743,12757,12763,12781,12791,12799,12809,12821,12823,12829, & + 12841,12853,12889,12893,12899,12907,12911,12917,12919,12923, & + 12941,12953,12959,12967,12973,12979,12983,13001,13003,13007, & + 13009,13033,13037,13043,13049,13063,13093,13099,13103,13109, & + 13121,13127,13147,13151,13159,13163,13171,13177,13183,13187, & + 13217,13219,13229,13241,13249,13259,13267,13291,13297,13309, & + 13313,13327,13331,13337,13339,13367,13381,13397,13399,13411, & + 13417,13421,13441,13451,13457,13463,13469,13477,13487,13499 /) + END IF + IF (n.EQ.-1) THEN + PRIME = prime_max + ELSE IF (n.EQ.0) THEN + PRIME = 1 + ELSE IF (n.LE.prime_max) THEN + PRIME = npvec(n) + ELSE + PRIME = -1 + write ( *, '(a)' ) ' ' + write ( *, '(a)' ) 'PRIME - Fatal error!' + write ( *, '(a,i8)' ) ' Illegal prime index N = ', n + write ( *, '(a,i8)' ) ' N should be between 1 and PRIME_MAX =', prime_max + stop 1 + END IF -! RETURN -!END FUNCTION PRIME + RETURN +END FUNCTION PRIME END MODULE MOD_RadiationTrans_Init From 91db6a79700784a1a3da9a5adbc2a571f8367ebb Mon Sep 17 00:00:00 2001 From: irsbeyer Date: Wed, 4 Aug 2021 18:42:25 +0200 Subject: [PATCH 005/495] next steps, same results for radiation in single cell as before --- .../radiation_solver/radiation_init.f90 | 5 ++- .../radiation_solver/radiation_readin.f90 | 1 + .../radiative_transfer/radtrans_init.f90 | 41 +++++++++---------- 3 files changed, 23 insertions(+), 24 deletions(-) diff --git a/src/radiation/radiation_solver/radiation_init.f90 b/src/radiation/radiation_solver/radiation_init.f90 index b1b18c138..ba0a753a0 100644 --- a/src/radiation/radiation_solver/radiation_init.f90 +++ b/src/radiation/radiation_solver/radiation_init.f90 @@ -71,7 +71,8 @@ SUBROUTINE DefineParametersRadiation() CALL prms%CreateIntOption( 'Radiation-WaveLenDiscr', 'Number of discretization points', '10000') CALL prms%CreateIntOption( 'Radiation-RadType', 'Select radiation type:\n'//& '1: particle radiation\n'//& - '2: black body radiation', '2') + '2: black body radiation\n'//& + '3: radiation solver only', '3') CALL prms%CreateLogicalOption('Radiation-ff', 'Enable free-free radiation', '.FALSE.') CALL prms%CreateLogicalOption('Radiation-bf', 'Enable bound-free radiation (only atomic)', '.FALSE.') CALL prms%CreateLogicalOption('Radiation-bb-atoms', 'Enable atomic bound-bound radiation', '.FALSE.') @@ -121,7 +122,7 @@ SUBROUTINE InitRadiation() !=================================================================================================================================== SWRITE(UNIT_stdOut,'(A)') ' INIT RADIATION SOLVER...' -RadiationSwitches%RadType = GETINT('Radiation-RadType', '2') +RadiationSwitches%RadType = GETINT('Radiation-RadType', '3') ALLOCATE(RadiationInput(nSpecies)) ALLOCATE(SpeciesRadiation(nSpecies)) SpeciesRadiation(:)%nLevels = 0 diff --git a/src/radiation/radiation_solver/radiation_readin.f90 b/src/radiation/radiation_solver/radiation_readin.f90 index 874a7a35d..27f02d09b 100644 --- a/src/radiation/radiation_solver/radiation_readin.f90 +++ b/src/radiation/radiation_solver/radiation_readin.f90 @@ -205,6 +205,7 @@ SUBROUTINE Radiation_readin_molecules(iSpec) REWIND(304) DO WHILE (hilf .NE. '['//TRIM(SpeciesRadiation(iSpec)%EnergyLevelName(iLoop))//']') READ(304,*,IOSTAT = errtemp) hilf + IF (hilf(1:1).EQ.'c') CYCLE END DO READ(304,*,IOSTAT = errtemp) hilf i=0 diff --git a/src/radiation/radiative_transfer/radtrans_init.f90 b/src/radiation/radiative_transfer/radtrans_init.f90 index de984a573..690f43633 100644 --- a/src/radiation/radiative_transfer/radtrans_init.f90 +++ b/src/radiation/radiative_transfer/radtrans_init.f90 @@ -80,26 +80,25 @@ SUBROUTINE InitRadiationTransport() INTEGER :: iWave, iElem, iNode REAL :: LocTemp !=================================================================================================================================== -!SWRITE(UNIT_StdOut,'(132("-"))') -!SWRITE(UNIT_stdOut,'(A)') ' INIT RADIATION TRANSPORT SOLVER ...' +SWRITE(UNIT_StdOut,'(132("-"))') +SWRITE(UNIT_stdOut,'(A)') ' INIT RADIATION TRANSPORT SOLVER ...' !ALLOCATE(RadiationElemEnergy(1:2,1:nTotalElems)) !RadiationElemEnergy=0.0 -!RadiationDirectionModel = GETINT('Radiation-DirectionModel','1') -!RadTrans%NumPhotonsPerCell = GETINT('Radiation-NumPhotonsPerCell','1') -!RadiationAbsorptionModel = GETINT('Radiation-AbsorptionModel','1') -!RadiationPhotonPosModel = GETINT('Radiation-PhotonPosModel','1') -!RadEmiAdaptPhotonNum = GETLOGICAL('Radiation-AdaptivePhotonNumEmission','.FALSE.') +RadiationDirectionModel = GETINT('Radiation-DirectionModel','1') +RadTrans%NumPhotonsPerCell = GETINT('Radiation-NumPhotonsPerCell','1') +RadiationAbsorptionModel = GETINT('Radiation-AbsorptionModel','1') +RadiationPhotonPosModel = GETINT('Radiation-PhotonPosModel','1') +RadEmiAdaptPhotonNum = GETLOGICAL('Radiation-AdaptivePhotonNumEmission','.FALSE.') ALLOCATE(Radiation_Emission_Spec_Total(nElems), RadTrans%PhotPerCell(nElems)) Radiation_Emission_Spec_Total=0.0 -!RadTrans%PhotPerCell=0.0 +RadTrans%PhotPerCell=0.0 -!SELECT CASE(RadiationSwitches%RadType) -!CASE(1) !calls radition solver module +SELECT CASE(RadiationSwitches%RadType) +CASE(1) !calls radition solver module ! DO iElem = 1, nElems -! ! CALL radiation_main(1) ! CALL radiation_main(iElem) !! DO iWave = 1, RadiationParameter%WaveLenDiscr !! Radiation_Emission_Spec_Total(iElem) = Radiation_Emission_Spec_Total(iElem) & @@ -107,7 +106,7 @@ SUBROUTINE InitRadiationTransport() !! END DO ! END DO -!CASE(2) ! Black body radiation +CASE(2) ! Black body radiation ! DO iElem = 1, nElems ! IF (GEO%ElemMidPoint(1,iElem).LT.1) THEN ! LocTemp = 10000. !GEO%ElemMidPoint(2,iElem)/GEO%ymaxglob*10000. @@ -117,8 +116,6 @@ SUBROUTINE InitRadiationTransport() ! DO iWave = 1, RadiationParameter%WaveLenDiscr ! IF (LocTemp.GT.0.0) Radiation_Emission_Spec(iWave, iElem) = 2.*PlanckConst*c*c/(RadiationParameter%WaveLen(iWave)**5. & ! *(EXP(PlanckConst*c/(RadiationParameter%WaveLen(iWave)*BoltzmannConst*LocTemp))-1.) ) -! ! Radiation_Emission_Spec(iWave, iElem) = 8.*pi*PlanckConst*c/(RadiationParameter%WaveLen(iWave)**5. & -! ! *(EXP(PlanckConst*c/(RadiationParameter%WaveLen(iWave)*BoltzmannConst*LocTemp))-1.) ) ! Radiation_Emission_Spec_Total(iElem) = Radiation_Emission_Spec_Total(iElem) & ! + 4.*Pi*Radiation_Emission_Spec(iWave, iElem) * RadiationParameter%WaveLenIncr ! END DO @@ -129,7 +126,7 @@ SUBROUTINE InitRadiationTransport() ! END DO ! END DO -!CASE(3) !only radiation +CASE(3) !only radiation ALLOCATE(Radiation_Absorption_Spec_Total(nElems)) Radiation_Absorption_Spec_Total = 0.0 DO iElem = 1, nElems @@ -142,11 +139,11 @@ SUBROUTINE InitRadiationTransport() END DO END DO -!CASE DEFAULT -! CALL abort(& -! __STAMP__& -! ,' ERROR: Radiation type is not implemented! (unknown case)') -!END SELECT +CASE DEFAULT + CALL abort(& + __STAMP__& + ,' ERROR: Radiation type is not implemented! (unknown case)') +END SELECT ! RadTrans%GlobalRadiationPower = 0.0 ! RadTrans%ScaledGlobalRadiationPower = 0.0 @@ -170,8 +167,8 @@ SUBROUTINE InitRadiationTransport() !ALLOCATE(PhotonSampWall(2,1:SurfMesh%nTotalSides)) !PhotonSampWall=0.0 -!SWRITE(UNIT_stdOut,'(A)')' INIT RADIATION TRANSPORT SOLVER DONE!' -!SWRITE(UNIT_StdOut,'(132("-"))') +SWRITE(UNIT_stdOut,'(A)')' INIT RADIATION TRANSPORT SOLVER DONE!' +SWRITE(UNIT_StdOut,'(132("-"))') END SUBROUTINE InitRadiationTransport From 91c2a4d20db48e4f304642d3ba742e65a63df018 Mon Sep 17 00:00:00 2001 From: Marcel Pfeiffer Date: Mon, 16 Aug 2021 23:57:15 +0200 Subject: [PATCH 006/495] first version with ne parallel concept --- src/output/output.f90 | 66 +- .../boundary/particle_boundary_init.f90 | 13 + .../boundary/particle_boundary_vars.f90 | 2 + src/piclas2vtk.f90 | 22 +- .../radiation_solver/radiation_init.f90 | 64 +- .../radiation_solver/radiation_vars.f90 | 8 +- .../radiative_transfer/radtrans_init.f90 | 184 ++-- .../radiative_transfer/radtrans_main.f90 | 386 ++++++++ .../radiative_transfer/radtrans_output.f90 | 430 +++++++++ .../radiative_transfer/radtrans_vars.f90 | 26 +- .../tracking/radtrans_tools.f90 | 828 ++++++++++++++++++ .../tracking/radtrans_tracking.f90 | 489 +++++++++++ src/timedisc/timedisc.f90 | 4 +- src/timedisc/timedisc_TimeStep_Radiation.f90 | 6 +- 14 files changed, 2433 insertions(+), 95 deletions(-) create mode 100644 src/radiation/radiative_transfer/radtrans_main.f90 create mode 100644 src/radiation/radiative_transfer/radtrans_output.f90 create mode 100644 src/radiation/radiative_transfer/tracking/radtrans_tools.f90 create mode 100644 src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 diff --git a/src/output/output.f90 b/src/output/output.f90 index d9d7bd7df..5e221b715 100644 --- a/src/output/output.f90 +++ b/src/output/output.f90 @@ -55,9 +55,15 @@ END SUBROUTINE insert_userblock MODULE PROCEDURE PrintStatusLine END INTERFACE +INTERFACE PrintStatusLineRadiation + MODULE PROCEDURE PrintStatusLineRadiation +END INTERFACE + + PUBLIC:: InitOutput PUBLIC:: PrintStatusLine PUBLIC:: DefineParametersOutput +PUBLIC:: PrintStatusLineRadiation !=================================================================================================================================== CONTAINS @@ -219,4 +225,62 @@ SUBROUTINE PrintStatusLine(t,dt,tStart,tEnd) END IF END SUBROUTINE PrintStatusLine -END MODULE MOD_Output \ No newline at end of file +!================================================================================================================================== +!> Displays the actual status of the simulation +!================================================================================================================================== +SUBROUTINE PrintStatusLineRadiation(t,tStart,tEnd,Phot) +!----------------------------------------------------------------------------------------------------------------------------------! +! description +!----------------------------------------------------------------------------------------------------------------------------------! +! MODULES ! +USE MOD_Globals +USE MOD_PreProc +!----------------------------------------------------------------------------------------------------------------------------------! +! insert modules here +!----------------------------------------------------------------------------------------------------------------------------------! +IMPLICIT NONE +! INPUT / OUTPUT VARIABLES +REAL,INTENT(IN) :: t !< current simulation time +REAL,INTENT(IN) :: tStart !< start time of simulation +REAL,INTENT(IN) :: tEnd !< end time of simulation +LOGICAL, INTENT(IN) :: Phot +!---------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +REAL :: percent,time_remaining,mins,secs,hours,days +!================================================================================================================================== + + +IF(MPIroot)THEN +#ifdef INTEL + OPEN(UNIT_stdOut,CARRIAGECONTROL='fortran') +#endif + percent = (t-tStart) / (tend-tStart) + CALL CPU_TIME(time_remaining) + IF (percent.GT.0.0) time_remaining = time_remaining/percent - time_remaining + percent = percent*100. + secs = MOD(time_remaining,60.) + time_remaining = time_remaining / 60 + mins = MOD(time_remaining,60.) + time_remaining = time_remaining / 60 + hours = MOD(time_remaining,24.) + time_remaining = time_remaining / 24 + !days = MOD(time_remaining,365.) ! Use this if years are also to be displayed + days = time_remaining +IF (Phot) THEN + WRITE(UNIT_stdOut,'(A,E10.4,A,E10.4,A,A,I6,A1,I0.2,A1,I0.2,A1,I0.2,A,A,A,A3,F6.2,A3,A1)',ADVANCE='NO') & + ' Photon = ', t,' TotalPhotons = ', tEnd, ' ', ' eta = ',INT(days),':',INT(hours),':',INT(mins),':',INT(secs),' |',& + REPEAT('☢',CEILING(percent/2)),REPEAT(' ',INT((100-percent)/2)),'| [',percent,'%] ',& + ACHAR(13) ! ACHAR(13) is carriage return +ELSE + WRITE(UNIT_stdOut,'(A,E10.4,A,I6,A1,I0.2,A1,I0.2,A1,I0.2,A,A,A1,A,A3,F6.2,A3,A1)',ADVANCE='NO') & + ' Elem = ', t,' eta = ',INT(days),':',INT(hours),':',INT(mins),':',INT(secs),' |',& + REPEAT('🚀',MAX(CEILING(percent/2)-1,0)),'>',REPEAT(' ',INT((100-percent)/2)),'| [',percent,'%] ',& + ACHAR(13) ! ACHAR(13) is carriage return +END IF +#ifdef INTEL + CLOSE(UNIT_stdOut) +#endif +END IF +END SUBROUTINE PrintStatusLineRadiation + +END MODULE MOD_Output diff --git a/src/particles/boundary/particle_boundary_init.f90 b/src/particles/boundary/particle_boundary_init.f90 index 00d22c4f0..2fa4c7591 100644 --- a/src/particles/boundary/particle_boundary_init.f90 +++ b/src/particles/boundary/particle_boundary_init.f90 @@ -92,6 +92,12 @@ SUBROUTINE DefineParametersParticleBoundary() CALL prms%CreateRealOption( 'Part-Boundary[$]-ElecACC ' & , 'Electronic accommodation coefficient of reflective particle boundary [$].' & , '0.', numberedmulti=.TRUE.) +CALL prms%CreateRealOption( 'Part-Boundary[$]-PhotonEnACC' & + , 'Energy accommodation coefficient of reflective photon boundary [$].' & + , '0.', numberedmulti=.TRUE.) +CALL prms%CreateLogicalOption( 'Part-Boundary[$]-PhotonSpecularReflection' & + , 'Momentum accommodation coefficient of reflective particle boundary [$].' & + , '.FALSE.', numberedmulti=.TRUE.) CALL prms%CreateLogicalOption( 'Part-Boundary[$]-Resample', & 'Sample particle properties from equilibrium distribution after reflection', '.FALSE.'& , numberedmulti=.TRUE.) @@ -278,6 +284,9 @@ SUBROUTINE InitializeVariablesPartBoundary() PartBound%RotACC = -1. ALLOCATE(PartBound%ElecACC( 1:nPartBound)) PartBound%ElecACC = -1. +ALLOCATE(PartBound%PhotonEnACC( 1:nPartBound)) +PartBound%PhotonEnACC = -1. +ALLOCATE(PartBound%PhotonSpecularReflection(1:nPartBound)) ALLOCATE(PartBound%Resample( 1:nPartBound)) PartBound%Resample = .FALSE. ALLOCATE(PartBound%WallVelo( 1:3,1:nPartBound)) @@ -362,6 +371,8 @@ SUBROUTINE InitializeVariablesPartBoundary() PartBound%Resample(iPartBound) = GETLOGICAL('Part-Boundary'//TRIM(hilf)//'-Resample') PartBound%WallVelo(1:3,iPartBound) = GETREALARRAY('Part-Boundary'//TRIM(hilf)//'-WallVelo',3) PartBound%RotVelo(iPartBound) = GETLOGICAL('Part-Boundary'//TRIM(hilf)//'-RotVelo') + PartBound%PhotonEnACC(iPartBound) = GETREAL('Part-Boundary'//TRIM(hilf)//'-PhotonEnACC') + PartBound%PhotonSpecularReflection(iPartBound) = GETLOGICAL('Part-Boundary'//TRIM(hilf)//'-PhotonSpecularReflection') IF(PartBound%RotVelo(iPartBound)) THEN PartBound%RotFreq(iPartBound) = GETREAL('Part-Boundary'//TRIM(hilf)//'-RotFreq') PartBound%RotOrg(1:3,iPartBound) = GETREALARRAY('Part-Boundary'//TRIM(hilf)//'-RotOrg',3) @@ -1081,6 +1092,8 @@ SUBROUTINE FinalizeParticleBoundary() SDEALLOCATE(PartBound%Resample) SDEALLOCATE(PartBound%WallVelo) SDEALLOCATE(PartBound%RotVelo) +SDEALLOCATE(PartBound%PhotonEnACC) +SDEALLOCATE(PartBound%PhotonSpecularReflection) SDEALLOCATE(PartBound%RotFreq) SDEALLOCATE(PartBound%RotOrg) SDEALLOCATE(PartBound%RotAxi) diff --git a/src/particles/boundary/particle_boundary_vars.f90 b/src/particles/boundary/particle_boundary_vars.f90 index a9ac304eb..de0e01930 100644 --- a/src/particles/boundary/particle_boundary_vars.f90 +++ b/src/particles/boundary/particle_boundary_vars.f90 @@ -234,6 +234,8 @@ MODULE MOD_Particle_Boundary_Vars REAL , ALLOCATABLE :: ElecACC(:) REAL , ALLOCATABLE :: WallVelo(:,:) REAL , ALLOCATABLE :: Voltage(:) + REAL , ALLOCATABLE :: PhotonEnACC(:) + LOGICAL , ALLOCATABLE :: PhotonSpecularReflection(:) LOGICAL , ALLOCATABLE :: RotVelo(:) ! Flag for rotating walls REAL , ALLOCATABLE :: RotFreq(:) ! Rotation frequency of the wall REAL , ALLOCATABLE :: RotAxi(:,:) ! Direction of rotation axis diff --git a/src/piclas2vtk.f90 b/src/piclas2vtk.f90 index 019fb71cd..64c69f0ce 100644 --- a/src/piclas2vtk.f90 +++ b/src/piclas2vtk.f90 @@ -829,8 +829,8 @@ SUBROUTINE ConvertElemData(InputStateFile,ArrayName,VarName) ! Read in solution CALL OpenDataFile(InputStateFile,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_WORLD) CALL ReadAttribute(File_ID,'Project_Name',1,StrScalar=ProjectName) -CALL ReadAttribute(File_ID,'Time',1,RealScalar=OutputTime) CALL ReadAttribute(File_ID,'File_Type',1,StrScalar=File_Type) +IF(TRIM(File_Type).NE.'RadiationState') CALL ReadAttribute(File_ID,'Time',1,RealScalar=OutputTime) CALL GetDataSize(File_ID,TRIM(ArrayName),nDims,HSize) nVarAdd=INT(HSize(1),4) DEALLOCATE(HSize) @@ -852,6 +852,8 @@ SUBROUTINE ConvertElemData(InputStateFile,ArrayName,VarName) FileString=TRIM(TIMESTAMP(TRIM(ProjectName)//'_Solution_'//TRIM(ArrayName),OutputTime))//'.vtu' CASE('DSMCState','DSMCHOState') FileString=TRIM(TIMESTAMP(TRIM(ProjectName)//'_visuDSMC',OutputTime))//'.vtu' + CASE('RadiationState') + FileString=TRIM(TRIM(ProjectName)//'_RadVisu')//'.vtu' END SELECT ! TODO: This is probably borked for NGeo>1 because then NodeCoords are not the corner nodes CALL WriteDataToVTK_PICLas(8,FileString,nVarAdd,VarNamesAdd(1:nVarAdd),nUniqueNodes,NodeCoords_Connect(1:3,1:nUniqueNodes),nElems,& @@ -885,7 +887,7 @@ SUBROUTINE ConvertSurfaceData(InputStateFile) ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -CHARACTER(LEN=255) :: FileString +CHARACTER(LEN=255) :: FileString, File_Type CHARACTER(LEN=255),ALLOCATABLE :: VarNamesSurf_HDF5(:) INTEGER :: nDims, nVarSurf, nSurfSample, nSurfaceSidesReadin REAL :: OutputTime @@ -896,8 +898,13 @@ SUBROUTINE ConvertSurfaceData(InputStateFile) ! Read in solution CALL OpenDataFile(InputStateFile,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_WORLD) CALL ReadAttribute(File_ID,'Project_Name',1,StrScalar=ProjectName) -CALL ReadAttribute(File_ID,'Time',1,RealScalar=OutputTime) -CALL ReadAttribute(File_ID,'DSMC_nSurfSample',1,IntegerScalar=nSurfSample) +CALL ReadAttribute(File_ID,'File_Type',1,StrScalar=File_Type) +IF(TRIM(File_Type).NE.'RadiationSurfState') THEN + CALL ReadAttribute(File_ID,'Time',1,RealScalar=OutputTime) + CALL ReadAttribute(File_ID,'DSMC_nSurfSample',1,IntegerScalar=nSurfSample) +ELSE + nSurfSample = 1 +END IF IF(nSurfSample.NE.1) THEN CALL abort(& __STAMP__& @@ -935,8 +942,11 @@ SUBROUTINE ConvertSurfaceData(InputStateFile) SurfData(1:nVarSurf,iSide) = tempSurfData(1:nVarSurf,1,1,iSide) END DO ! iSide = 1, SurfConnect%nSurfaceBCSides END IF - -FileString=TRIM(TIMESTAMP(TRIM(ProjectName)//'_visuSurf',OutputTime))//'.vtu' +IF(TRIM(File_Type).NE.'RadiationSurfState') THEN + FileString=TRIM(TIMESTAMP(TRIM(ProjectName)//'_visuSurf',OutputTime))//'.vtu' +ELSE + FileString=TRIM(TRIM(ProjectName)//'_RadSurfVisu')//'.vtu' +END IF CALL WriteDataToVTK_PICLas(4,FileString,nVarSurf,VarNamesSurf_HDF5,SurfConnect%nSurfaceNode,SurfConnect%NodeCoords(1:3,1:SurfConnect%nSurfaceNode),& SurfConnect%nSurfaceBCSides,SurfData,SurfConnect%SideSurfNodeMap(1:4,1:SurfConnect%nSurfaceBCSides)) diff --git a/src/radiation/radiation_solver/radiation_init.f90 b/src/radiation/radiation_solver/radiation_init.f90 index ba0a753a0..8b4767f26 100644 --- a/src/radiation/radiation_solver/radiation_init.f90 +++ b/src/radiation/radiation_solver/radiation_init.f90 @@ -105,6 +105,7 @@ SUBROUTINE InitRadiation() #if USE_MPI !USE MOD_MPI_Shared_Vars USE MOD_MPI_Shared +USE MOD_MPI_Shared_Vars #endif ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -115,7 +116,7 @@ SUBROUTINE InitRadiation() !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES CHARACTER(32) :: hilf - INTEGER :: iSpec, iWaveLen + INTEGER :: iSpec, iWaveLen, firstElem, lastElem, iElem #if USE_MPI INTEGER(KIND=MPI_ADDRESS_KIND) :: MPISharedSize #endif /*USE_MPI*/ @@ -195,28 +196,58 @@ SUBROUTINE InitRadiation() #if USE_MPI ! allocate shared array for Radiation_Emission/Absorption_Spec - MPISharedSize = INT((RadiationParameter%WaveLenDiscr)*nComputeNodeElems,MPI_ADDRESS_KIND)*MPI_ADDRESS_KIND - CALL Allocate_Shared(MPISharedSize,(/RadiationParameter%WaveLenDiscr,nComputeNodeElems/), & - Radiation_Emission_Spec_Shared_Win,Radiation_Emission_Spec_Shared) - CALL MPI_WIN_LOCK_ALL(0,Radiation_Emission_Spec_Shared_Win,IERROR) +CALL Allocate_Shared((/RadiationParameter%WaveLenDiscr,nComputeNodeElems/), Radiation_Emission_Spec_Shared_Win,Radiation_Emission_Spec_Shared) +CALL MPI_WIN_LOCK_ALL(0,Radiation_Emission_Spec_Shared_Win,IERROR) - MPISharedSize = INT((RadiationParameter%WaveLenDiscr)*nGlobalElems,MPI_ADDRESS_KIND)*MPI_ADDRESS_KIND - CALL Allocate_Shared(MPISharedSize,(/RadiationParameter%WaveLenDiscr,nGlobalElems/), & - Radiation_Absorption_Spec_Shared_Win,Radiation_Absorption_Spec_Shared) - CALL MPI_WIN_LOCK_ALL(0,Radiation_Absorption_Spec_Shared_Win,IERROR) +CALL Allocate_Shared((/RadiationParameter%WaveLenDiscr*nGlobalElems/),Radiation_Absorption_Spec_Shared_Win,Radiation_Absorption_Spec_Shared) +CALL MPI_WIN_LOCK_ALL(0,Radiation_Absorption_Spec_Shared_Win,IERROR) + +CALL Allocate_Shared((/nSpecies,nComputeNodeElems,2/), Radiation_ElemEnergy_Species_Shared_Win,Radiation_ElemEnergy_Species_Shared) +CALL MPI_WIN_LOCK_ALL(0,Radiation_ElemEnergy_Species_Shared_Win,IERROR) Radiation_Emission_spec => Radiation_Emission_spec_Shared -Radiation_Absorption_spec => Radiation_Absorption_spec_Shared +Radiation_Absorption_spec(1:RadiationParameter%WaveLenDiscr ,1:nGlobalElems) => Radiation_Absorption_spec_Shared +Radiation_ElemEnergy_Species => Radiation_ElemEnergy_Species_Shared #else ! allocate local array for ElemInfo ALLOCATE(Radiation_Emission_spec(RadiationParameter%WaveLenDiscr,nElems)) ALLOCATE(Radiation_Absorption_spec(RadiationParameter%WaveLenDiscr,nElems)) +ALLOCATE(Radiation_ElemEnergy_Species(nSpecies,nElems,2)) #endif /*USE_MPI*/ -ALLOCATE(Radiation_ElemEnergy_Species(nSpecies,nElems,2)) -Radiation_Emission_spec = 0.0 -Radiation_Absorption_spec = 0.0 -Radiation_ElemEnergy_Species = 0.0 +#if USE_MPI + firstElem = INT(REAL( myComputeNodeRank *nComputeNodeElems)/REAL(nComputeNodeProcessors))+1 + lastElem = INT(REAL((myComputeNodeRank+1)*nComputeNodeElems)/REAL(nComputeNodeProcessors)) +#else + firstElem = 1 + lastElem = nElems +#endif + +DO iElem = firstElem, lastElem + Radiation_Emission_spec(:,iElem) = 0.0 + Radiation_Absorption_spec(:,iElem) = 0.0 + Radiation_ElemEnergy_Species(:,iElem,:) =0.0 +END DO +#if USE_MPI + CALL BARRIER_AND_SYNC(Radiation_Emission_Spec_Shared_Win ,MPI_COMM_SHARED) + CALL BARRIER_AND_SYNC(Radiation_ElemEnergy_Species_Shared_Win ,MPI_COMM_SHARED) + CALL BARRIER_AND_SYNC(Radiation_Absorption_Spec_Shared_Win ,MPI_COMM_SHARED) + IF(nLeaderGroupProcs.GT.1)THEN + IF(myComputeNodeRank.EQ.0)THEN + CALL MPI_ALLGATHERV( MPI_IN_PLACE & + , 0 & + , MPI_DATATYPE_NULL & + , Radiation_Absorption_Spec_Shared & + , RadiationParameter%WaveLenDiscr *recvcountElem & + , RadiationParameter%WaveLenDiscr *displsElem & + , MPI_DOUBLE_PRECISION & + , MPI_COMM_LEADERS_SHARED & + , IERROR) + END IF + END IF + CALL BARRIER_AND_SYNC(Radiation_Absorption_Spec_Shared_Win ,MPI_COMM_SHARED) +#endif + SWRITE(UNIT_stdOut,'(A)') ' INIT RADIATION SOLVER DONE!' @@ -335,16 +366,15 @@ SUBROUTINE FinalizeRadiation() SDEALLOCATE(RadiationInput) SDEALLOCATE(SpeciesRadiation) SDEALLOCATE(RadiationParameter%WaveLen) -SDEALLOCATE(Radiation_ElemEnergy_Species) #if USE_MPI CALL UNLOCK_AND_FREE(Radiation_Emission_Spec_Shared_Win) CALL UNLOCK_AND_FREE(Radiation_Absorption_Spec_Shared_Win) -ADEALLOCATE(Radiation_Emission_Spec_Shared) -ADEALLOCATE(Radiation_Absorption_Spec_Shared) +CALL UNLOCK_AND_FREE(Radiation_ElemEnergy_Species_Shared_Win) #endif /*USE_MPI*/ ADEALLOCATE(Radiation_Emission_Spec) ADEALLOCATE(Radiation_Absorption_Spec) +ADEALLOCATE(Radiation_ElemEnergy_Species) END SUBROUTINE FinalizeRadiation diff --git a/src/radiation/radiation_solver/radiation_vars.f90 b/src/radiation/radiation_solver/radiation_vars.f90 index 1639f7ad1..33ad42777 100644 --- a/src/radiation/radiation_solver/radiation_vars.f90 +++ b/src/radiation/radiation_solver/radiation_vars.f90 @@ -90,18 +90,20 @@ MODULE MOD_Radiation_Vars TYPE(tSpeciesRadiation), ALLOCATABLE :: SpeciesRadiation(:) ! (nSpec) !REAL, ALLOCATABLE :: Radiation_NumDens -REAL, ALLOCATABLE :: Radiation_ElemEnergy_Species(:,:,:)! (number of species, number of mesh elements, 2(Emission,Absorption)) - +REAL, ALLOCPOINT :: Radiation_ElemEnergy_Species(:,:,:)! (number of species, number of mesh elements, 2(Emission,Absorption)) REAL,ALLOCPOINT :: Radiation_Emission_spec(:,:) ! (WaveLen(:), number of mesh elements) REAL,ALLOCPOINT :: Radiation_Absorption_spec(:,:) ! (WaveLen(:), number of mesh elements) + #if USE_MPI INTEGER :: Radiation_Emission_Spec_Shared_Win REAL,ALLOCPOINT :: Radiation_Emission_Spec_Shared(:,:) INTEGER :: Radiation_Absorption_Spec_Shared_Win -REAL,ALLOCPOINT :: Radiation_Absorption_Spec_Shared(:,:) +REAL,ALLOCPOINT :: Radiation_Absorption_Spec_Shared(:) +INTEGER :: Radiation_ElemEnergy_Species_Shared_Win +REAL,ALLOCPOINT :: Radiation_ElemEnergy_Species_Shared(:,:,:) #endif !=================================================================================================================================== END MODULE MOD_Radiation_Vars diff --git a/src/radiation/radiative_transfer/radtrans_init.f90 b/src/radiation/radiative_transfer/radtrans_init.f90 index 690f43633..c50d3c19d 100644 --- a/src/radiation/radiative_transfer/radtrans_init.f90 +++ b/src/radiation/radiative_transfer/radtrans_init.f90 @@ -62,13 +62,18 @@ SUBROUTINE InitRadiationTransport() USE MOD_ReadInTools USE MOD_RadiationTrans_Vars USE MOD_Mesh_Vars, ONLY : nElems, nGlobalElems -USE MOD_Particle_Mesh_Vars, ONLY : GEO!, nTotalElems +USE MOD_Particle_Mesh_Vars, ONLY : ElemVolume_Shared,ElemMidPoint_Shared, GEO, nComputeNodeElems USE MOD_Globals_Vars, ONLY : BoltzmannConst, PlanckConst USE MOD_Particle_Boundary_Sampling, ONLY : InitParticleBoundarySampling -USE MOD_Particle_Boundary_Vars, ONLY : SurfMesh +USE MOD_Particle_Boundary_Vars, ONLY : SurfMesh,nComputeNodeSurfTotalSides USE MOD_Radiation_Vars, ONLY : RadiationParameter, Radiation_Emission_spec, Radiation_Absorption_spec, RadiationSwitches +USE MOD_Radiation_Vars, ONLY : Radiation_Absorption_Spec_Shared, Radiation_Absorption_Spec_Shared_Win +USE MOD_Radiation_Vars, ONLY : Radiation_Emission_Spec_Shared_Win, Radiation_Emission_Spec_Shared USE MOD_Radiation, ONLY : radiation_main USE MOD_DSMC_Vars, ONLY: RadialWeighting +USE MOD_Output, ONLY: PrintStatusLineRadiation +USE MOD_MPI_Shared_Vars +USE MOD_MPI_Shared ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -77,14 +82,14 @@ SUBROUTINE InitRadiationTransport() ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -INTEGER :: iWave, iElem, iNode +INTEGER :: iWave, iElem, iNode, firstElem, lastElem REAL :: LocTemp !=================================================================================================================================== SWRITE(UNIT_StdOut,'(132("-"))') SWRITE(UNIT_stdOut,'(A)') ' INIT RADIATION TRANSPORT SOLVER ...' -!ALLOCATE(RadiationElemEnergy(1:2,1:nTotalElems)) -!RadiationElemEnergy=0.0 +ALLOCATE(RadiationElemAbsEnergy(1:nGlobalElems)) +RadiationElemAbsEnergy=0.0 RadiationDirectionModel = GETINT('Radiation-DirectionModel','1') RadTrans%NumPhotonsPerCell = GETINT('Radiation-NumPhotonsPerCell','1') @@ -92,50 +97,84 @@ SUBROUTINE InitRadiationTransport() RadiationPhotonPosModel = GETINT('Radiation-PhotonPosModel','1') RadEmiAdaptPhotonNum = GETLOGICAL('Radiation-AdaptivePhotonNumEmission','.FALSE.') -ALLOCATE(Radiation_Emission_Spec_Total(nElems), RadTrans%PhotPerCell(nElems)) +#if USE_MPI + ! allocate shared array for Radiation_Emission/Absorption_Spec +CALL Allocate_Shared((/nGlobalElems/),RadiationElemAbsEnergy_Shared_Win,RadiationElemAbsEnergy_Shared) +CALL MPI_WIN_LOCK_ALL(0,RadiationElemAbsEnergy_Shared_Win,IERROR) + +IF (myComputeNodeRank.EQ.0) RadiationElemAbsEnergy_Shared = 0. +CALL BARRIER_AND_SYNC(RadiationElemAbsEnergy_Shared_Win,MPI_COMM_SHARED) + +CALL Allocate_Shared((/nComputeNodeElems/), RadTransPhotPerCell_Shared_Win,RadTransPhotPerCell_Shared) +CALL MPI_WIN_LOCK_ALL(0,RadTransPhotPerCell_Shared_Win,IERROR) +CALL Allocate_Shared((/nComputeNodeElems/), Radiation_Emission_Spec_Total_Shared_Win,Radiation_Emission_Spec_Total_Shared) +CALL MPI_WIN_LOCK_ALL(0,Radiation_Emission_Spec_Total_Shared_Win,IERROR) + +RadTransPhotPerCell => RadTransPhotPerCell_Shared +Radiation_Emission_Spec_Total => Radiation_Emission_Spec_Total_Shared +IF (myComputeNodeRank.EQ.0) THEN + RadTransPhotPerCell = 0 + Radiation_Emission_Spec_Total = 0.0 +END IF +CALL BARRIER_AND_SYNC(RadTransPhotPerCell_Shared_Win ,MPI_COMM_SHARED) +CALL BARRIER_AND_SYNC(Radiation_Emission_Spec_Total_Shared_Win ,MPI_COMM_SHARED) +ALLOCATE(RadTransPhotPerCellLoc(nComputeNodeElems)) +RadTransPhotPerCellLoc = 0 +#else +! allocate local array for ElemInfo +ALLOCATE(RadTransPhotPerCell(nElems),Radiation_Emission_Spec_Total(nElems),RadTransPhotPerCellLoc(nELems)) +RadTransPhotPerCell = 0 +RadTransPhotPerCellLoc = 0 Radiation_Emission_Spec_Total=0.0 -RadTrans%PhotPerCell=0.0 +#endif /*USE_MPI*/ + +#if USE_MPI + firstElem = INT(REAL( myComputeNodeRank *nComputeNodeElems)/REAL(nComputeNodeProcessors))+1 + lastElem = INT(REAL((myComputeNodeRank+1)*nComputeNodeElems)/REAL(nComputeNodeProcessors)) +#else + firstElem = 1 + lastElem = nElems +#endif SELECT CASE(RadiationSwitches%RadType) CASE(1) !calls radition solver module -! DO iElem = 1, nElems -! CALL radiation_main(iElem) -!! DO iWave = 1, RadiationParameter%WaveLenDiscr -!! Radiation_Emission_Spec_Total(iElem) = Radiation_Emission_Spec_Total(iElem) & -!! + 4.*Pi*Radiation_Emission_Spec(iWave, iElem) * RadiationParameter%WaveLenIncr -!! END DO -! END DO - + SWRITE(UNIT_stdOut,'(A)') ' Calculate Radiation Data per Cell ...' + DO iElem = firstElem, lastElem + IF(MPIroot.AND.(MOD(iElem,10).EQ.0)) CALL PrintStatusLineRadiation(REAL(iElem),REAL(firstElem),REAL(lastElem),.FALSE.) + CALL radiation_main(iElem) + DO iWave = 1, RadiationParameter%WaveLenDiscr + Radiation_Emission_Spec_Total(iElem) = Radiation_Emission_Spec_Total(iElem) & + + 4.*Pi*Radiation_Emission_Spec(iWave, iElem) * RadiationParameter%WaveLenIncr + END DO + END DO CASE(2) ! Black body radiation -! DO iElem = 1, nElems -! IF (GEO%ElemMidPoint(1,iElem).LT.1) THEN -! LocTemp = 10000. !GEO%ElemMidPoint(2,iElem)/GEO%ymaxglob*10000. -! ELSE -! LocTemp = 10000. !GEO%ElemMidPoint(2,iElem)/GEO%ymaxglob*10000 -! END IF -! DO iWave = 1, RadiationParameter%WaveLenDiscr -! IF (LocTemp.GT.0.0) Radiation_Emission_Spec(iWave, iElem) = 2.*PlanckConst*c*c/(RadiationParameter%WaveLen(iWave)**5. & -! *(EXP(PlanckConst*c/(RadiationParameter%WaveLen(iWave)*BoltzmannConst*LocTemp))-1.) ) -! Radiation_Emission_Spec_Total(iElem) = Radiation_Emission_Spec_Total(iElem) & -! + 4.*Pi*Radiation_Emission_Spec(iWave, iElem) * RadiationParameter%WaveLenIncr -! END DO -! END DO -! DO iElem = 1, nTotalElems -! DO iWave = 1, RadiationParameter%WaveLenDiscr -! Radiation_Absorption_Spec(iWave, iElem) = 1. -! END DO -! END DO + DO iElem = firstElem, lastElem + IF (ElemMidPoint_Shared(1,iElem).LT.1) THEN + LocTemp = 10000. !GEO%ElemMidPoint(2,iElem)/GEO%ymaxglob*10000. + ELSE + LocTemp = 10000. !GEO%ElemMidPoint(2,iElem)/GEO%ymaxglob*10000 + END IF + DO iWave = 1, RadiationParameter%WaveLenDiscr + IF (LocTemp.GT.0.0) Radiation_Emission_Spec(iWave, iElem) = 2.*PlanckConst*c*c/(RadiationParameter%WaveLen(iWave)**5. & + *(EXP(PlanckConst*c/(RadiationParameter%WaveLen(iWave)*BoltzmannConst*LocTemp))-1.) ) + Radiation_Emission_Spec_Total(iElem) = Radiation_Emission_Spec_Total(iElem) & + + 4.*Pi*Radiation_Emission_Spec(iWave, iElem) * RadiationParameter%WaveLenIncr + END DO + END DO + DO iElem = firstElem, lastElem + DO iWave = 1, RadiationParameter%WaveLenDiscr + Radiation_Absorption_Spec(iWave, iElem) = 1. + END DO + END DO CASE(3) !only radiation - ALLOCATE(Radiation_Absorption_Spec_Total(nElems)) - Radiation_Absorption_Spec_Total = 0.0 - DO iElem = 1, nElems + SWRITE(UNIT_stdOut,'(A)') ' Calculate Radiation Data per Cell ...' + DO iElem = firstElem, lastElem + IF(MPIroot.AND.(MOD(iElem,10).EQ.0)) CALL PrintStatusLineRadiation(REAL(iElem),REAL(firstElem),REAL(lastElem),.FALSE.) CALL radiation_main(iElem) DO iWave = 1, RadiationParameter%WaveLenDiscr Radiation_Emission_Spec_Total(iElem) = Radiation_Emission_Spec_Total(iElem) & + 4.*Pi*Radiation_Emission_Spec(iWave, iElem) * RadiationParameter%WaveLenIncr - Radiation_Absorption_Spec_Total(iElem) = Radiation_Absorption_Spec_Total(iElem) & - + Radiation_Absorption_Spec(iWave, iElem) * RadiationParameter%WaveLenIncr END DO END DO @@ -145,27 +184,58 @@ SUBROUTINE InitRadiationTransport() ,' ERROR: Radiation type is not implemented! (unknown case)') END SELECT -! RadTrans%GlobalRadiationPower = 0.0 -! RadTrans%ScaledGlobalRadiationPower = 0.0 -! DO iElem = 1, nElems -! RadTrans%GlobalRadiationPower = RadTrans%GlobalRadiationPower + Radiation_Emission_Spec_Total(iElem)*GEO%Volume(iElem) -! IF (RadialWeighting%DoRadialWeighting) THEN -! RadTrans%ScaledGlobalRadiationPower = RadTrans%ScaledGlobalRadiationPower & -! + Radiation_Emission_Spec_Total(iElem)*GEO%Volume(iElem) & -! /(1. + GEO%ElemMidPoint(2,iElem)/GEO%ymaxglob*(RadialWeighting%PartScaleFactor-1.)) -! END IF -! END DO -!#if USE_MPI -! CALL MPI_ALLREDUCE(MPI_IN_PLACE,RadTrans%GlobalRadiationPower,1,MPI_DOUBLE_PRECISION,MPI_SUM,MPI_COMM_WORLD,iError) -! IF (RadialWeighting%DoRadialWeighting) THEN -! CALL MPI_ALLREDUCE(MPI_IN_PLACE,RadTrans%ScaledGlobalRadiationPower,1,MPI_DOUBLE_PRECISION,MPI_SUM,MPI_COMM_WORLD,iError) -! END IF -!#endif /*USE_MPI*/ -! RadTrans%GlobalPhotonNum = RadTrans%NumPhotonsPerCell * nGlobalElems + +#if USE_MPI + CALL BARRIER_AND_SYNC(Radiation_Emission_Spec_Total_Shared_Win,MPI_COMM_SHARED) + CALL BARRIER_AND_SYNC(Radiation_Emission_Spec_Shared_Win ,MPI_COMM_SHARED) + CALL BARRIER_AND_SYNC(Radiation_Absorption_Spec_Shared_Win ,MPI_COMM_SHARED) + IF(nLeaderGroupProcs.GT.1)THEN + IF(myComputeNodeRank.EQ.0)THEN + CALL MPI_ALLGATHERV( MPI_IN_PLACE & + , 0 & + , MPI_DATATYPE_NULL & + , Radiation_Absorption_Spec_Shared & + , RadiationParameter%WaveLenDiscr *recvcountElem & + , RadiationParameter%WaveLenDiscr *displsElem & + , MPI_DOUBLE_PRECISION & + , MPI_COMM_LEADERS_SHARED & + , IERROR) + END IF + END IF + CALL BARRIER_AND_SYNC(Radiation_Absorption_Spec_Shared_Win ,MPI_COMM_SHARED) +#endif + RadTrans%GlobalRadiationPower = 0.0 + RadTrans%ScaledGlobalRadiationPower = 0.0 + DO iElem = firstElem, lastElem + RadTrans%GlobalRadiationPower = RadTrans%GlobalRadiationPower + Radiation_Emission_Spec_Total(iElem)*ElemVolume_Shared(iElem) + IF (RadialWeighting%DoRadialWeighting) THEN + RadTrans%ScaledGlobalRadiationPower = RadTrans%ScaledGlobalRadiationPower & + + Radiation_Emission_Spec_Total(iElem)*ElemVolume_Shared(iElem) & + /(1. + ElemMidPoint_Shared(2,iElem)/GEO%ymaxglob*(RadialWeighting%PartScaleFactor-1.)) + END IF + END DO +#if USE_MPI + CALL MPI_ALLREDUCE(MPI_IN_PLACE,RadTrans%GlobalRadiationPower,1,MPI_DOUBLE_PRECISION,MPI_SUM,MPI_COMM_WORLD,iError) + IF (RadialWeighting%DoRadialWeighting) THEN + CALL MPI_ALLREDUCE(MPI_IN_PLACE,RadTrans%ScaledGlobalRadiationPower,1,MPI_DOUBLE_PRECISION,MPI_SUM,MPI_COMM_WORLD,iError) + END IF +#endif /*USE_MPI*/ + RadTrans%GlobalPhotonNum = RadTrans%NumPhotonsPerCell * nGlobalElems + + !IF (.NOT.ALLOCATED(SurfMesh%SideIDToSurfID)) CALL InitParticleBoundarySampling() -!ALLOCATE(PhotonSampWall(2,1:SurfMesh%nTotalSides)) -!PhotonSampWall=0.0 +ALLOCATE(PhotonSampWall(2,1:nComputeNodeSurfTotalSides)) +PhotonSampWall=0.0 + +#if USE_MPI +!> Then shared arrays for boundary sampling +CALL Allocate_Shared((/2,nComputeNodeSurfTotalSides/),PhotonSampWall_Shared_Win,PhotonSampWall_Shared) +CALL MPI_WIN_LOCK_ALL(0,PhotonSampWall_Shared_Win,IERROR) + +IF (myComputeNodeRank.EQ.0) PhotonSampWall_Shared = 0. +CALL BARRIER_AND_SYNC(PhotonSampWall_Shared_Win,MPI_COMM_SHARED) +#endif SWRITE(UNIT_stdOut,'(A)')' INIT RADIATION TRANSPORT SOLVER DONE!' SWRITE(UNIT_StdOut,'(132("-"))') diff --git a/src/radiation/radiative_transfer/radtrans_main.f90 b/src/radiation/radiative_transfer/radtrans_main.f90 new file mode 100644 index 000000000..233cb1230 --- /dev/null +++ b/src/radiation/radiative_transfer/radtrans_main.f90 @@ -0,0 +1,386 @@ +!================================================================================================================================== +! Copyright (c) 2018 - 2019 Marcel Pfeiffer +! +! This file is part of PICLas (gitlab.com/piclas/piclas). PICLas is free software: you can redistribute it and/or modify +! it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 +! of the License, or (at your option) any later version. +! +! PICLas is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty +! of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License v3.0 for more details. +! +! You should have received a copy of the GNU General Public License along with PICLas. If not, see . +!================================================================================================================================== +#include "piclas.h" + +MODULE MOD_RadTransport +!=================================================================================================================================== +! Module for the main radiation transport routines +!=================================================================================================================================== +! MODULES +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +PRIVATE + +INTERFACE RadTrans_main + MODULE PROCEDURE RadTrans_main +END INTERFACE + +!----------------------------------------------------------------------------------------------------------------------------------- +! GLOBAL VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! Private Part --------------------------------------------------------------------------------------------------------------------- +! Public Part ---------------------------------------------------------------------------------------------------------------------- +PUBLIC :: RadTrans_main +!=================================================================================================================================== + +CONTAINS + +SUBROUTINE RadTrans_main() +!=================================================================================================================================== +!> Main routine for the Radiation Transport +!=================================================================================================================================== +! MODULES +USE MOD_Globals +USE MOD_Mesh_Vars ,ONLY : nElems +USE MOD_Particle_Mesh_Vars ,ONLY : GEO, nComputeNodeElems, ElemMidPoint_Shared, ElemVolume_Shared +USE MOD_RadiationTrans_Vars ,ONLY : Radiation_Emission_Spec_Total, RadTrans, RadEmiAdaptPhotonNum +USE MOD_RadiationTrans_Vars ,ONLY : PhotonProps, RadiationDirectionModel, RadTransPhotPerCellLoc +USE MOD_RadiationTrans_Vars ,ONLY : RadTransPhotPerCell, RadTransPhotPerCell_Shared_Win +USE MOD_Photon_Tracking ,ONLY : PhotonTriaTracking!, Photon2DSymTracking +USE MOD_Radiation_Vars ,ONLY : RadiationSwitches +USE MOD_DSMC_Vars ,ONLY : RadialWeighting +USE MOD_Mesh_Tools ,ONLY: GetGlobalElemID +USE MOD_Output, ONLY: PrintStatusLineRadiation +USE MOD_MPI_Shared_Vars +USE MOD_MPI_Shared +! IMPLICIT VARIABLE HANDLING + IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +INTEGER :: iElem, nPhotons, iPhot, globPhotNum, nPhotonsCN, photonCount, iPhotLoc, photVisCount, LocPhotNum +INTEGER :: firstElem, lastElem, firstPhoton, lastPhoton +REAL :: Bounds(1:2,1:3) ! Bounds(1,1:3) --> maxCoords , Bounds(2,1:3) --> minCoords +REAL :: RandRot(3,3) !, PartPos(1:3) +!=================================================================================================================================== + IF (RadiationSwitches%RadType.EQ.3) RETURN + +#if USE_MPI + firstElem = INT(REAL( myComputeNodeRank *nComputeNodeElems)/REAL(nComputeNodeProcessors))+1 + lastElem = INT(REAL((myComputeNodeRank+1)*nComputeNodeElems)/REAL(nComputeNodeProcessors)) +#else + firstElem = 1 + lastElem = nElems +#endif + SWRITE(UNIT_stdOut,'(A)') ' Distribute Photons to Processors ...' + IF (RadEmiAdaptPhotonNum) THEN + DO iElem = firstElem, lastElem + IF (RadTrans%GlobalRadiationPower .EQ. 0.0) THEN !!!!TODO: check!!! + RadTransPhotPerCell(iElem) = 0 + ELSE + IF (RadialWeighting%DoRadialWeighting) THEN + RadTransPhotPerCell(iElem) = INT(Radiation_Emission_Spec_Total(iElem)*ElemVolume_Shared(iElem) & + /(1. + ElemMidPoint_Shared(2,iElem)/GEO%ymaxglob*(RadialWeighting%PartScaleFactor-1.)) & + / RadTrans%ScaledGlobalRadiationPower*RadTrans%GlobalPhotonNum + 0.5) + ELSE + RadTransPhotPerCell(iElem) = INT(Radiation_Emission_Spec_Total(iElem)*ElemVolume_Shared(iElem) & + / RadTrans%GlobalRadiationPower*RadTrans%GlobalPhotonNum + 0.5) + END IF + END IF + END DO +#if USE_MPI + CALL BARRIER_AND_SYNC(RadTransPhotPerCell_Shared_Win ,MPI_COMM_SHARED) + IF(myComputeNodeRank.EQ.0) nPhotons = SUM(RadTransPhotPerCell(:)) + IF(nLeaderGroupProcs.GT.1)THEN + IF(myComputeNodeRank.EQ.0)THEN + CALL MPI_ALLREDUCE(MPI_IN_PLACE,nPhotons,1,MPI_INTEGER,MPI_SUM,MPI_COMM_LEADERS_SHARED,iError) + END IF + END IF + CALL MPI_BCAST(nPhotons,1, MPI_INTEGER,0,MPI_COMM_SHARED,iERROR) + nPhotonsCN = SUM(RadTransPhotPerCell(:)) + firstPhoton = INT(REAL( myComputeNodeRank *nPhotonsCN)/REAL(nComputeNodeProcessors))+1 + lastPhoton = INT(REAL((myComputeNodeRank+1)*nPhotonsCN)/REAL(nComputeNodeProcessors)) + photonCount = 0 + DO iELem = 1, nComputeNodeElems + IF (photonCount.GT.lastPhoton) THEN + RadTransPhotPerCellLoc(iELem) = 0 + ELSE IF ((photonCount.GT.firstPhoton).AND.((photonCount+RadTransPhotPerCell(iElem)).LE.lastPhoton)) THEN + RadTransPhotPerCellLoc(iELem) = RadTransPhotPerCell(iElem) + ELSE IF ((photonCount.LT.firstPhoton).AND.((photonCount+RadTransPhotPerCell(iElem)).GT.lastPhoton)) THEN + RadTransPhotPerCellLoc(iELem) = lastPhoton - firstPhoton + 1 + ELSE IF ((photonCount+RadTransPhotPerCell(iElem)).GT.lastPhoton) THEN + RadTransPhotPerCellLoc(iELem) = lastPhoton - photonCount + ELSE IF ((photonCount+RadTransPhotPerCell(iElem)).GT.firstPhoton) THEN + RadTransPhotPerCellLoc(iELem) = photonCount+RadTransPhotPerCell(iElem) - firstPhoton + 1 + ELSE + RadTransPhotPerCellLoc(iELem) = 0 + END IF + photonCount = photonCount + RadTransPhotPerCell(iELem) + END DO +#else + RadTransPhotPerCellLoc(:) = RadTransPhotPerCell(:) + nPhotons = SUM(RadTransPhotPerCell(:)) +#endif /*USE_MPI*/ + RadTrans%GlobalPhotonNum = nPhotons + ELSE +#if USE_MPI + IF(myComputeNodeRank.EQ.0) RadTransPhotPerCell(:) = RadTrans%NumPhotonsPerCell + CALL BARRIER_AND_SYNC(RadTransPhotPerCell_Shared_Win ,MPI_COMM_SHARED) +#else + RadTransPhotPerCell(:) = RadTrans%NumPhotonsPerCell +#endif + RadTransPhotPerCellLoc(:) = RadTransPhotPerCell(:) + END IF + + SWRITE(UNIT_stdOut,'(A)') ' Start Radiative Transport Calculation ...' + globPhotNum = 0 + photonCount = 0 + photVisCount = 0 + LocPhotNum = SUM(RadTransPhotPerCellLoc(:)) + DO iElem = 1, nComputeNodeElems + IF (RadTransPhotPerCellLoc(iElem).GT.0) THEN + IF (RadiationDirectionModel.EQ.2) RandRot = RandomRotMatrix() + DO iPhot = 1, RadTransPhotPerCellLoc(iElem) + IF(MPIroot.AND.(MOD(photVisCount,20000).EQ.0)) CALL PrintStatusLineRadiation(REAL(photVisCount),REAL(1),REAL(LocPhotNum),.TRUE.) + photVisCount = photVisCount + 1 + PhotonProps%PhotonEnergy = SetPhotonEnergy(iElem) + PhotonProps%PhotonPos(1:3) = SetPhotonPos(iElem, globPhotNum) + PhotonProps%PhotonLastPos(1:3) = PhotonProps%PhotonPos(1:3) + PhotonProps%ElemID = GetGlobalElemID(iElem) + IF ((photonCount.LT.firstPhoton)) THEN + iPhotLoc = firstPhoton - photonCount + iPhot - 1 + ELSE + iPhotLoc = iPhot + END IF + PhotonProps%PhotonDirection(1:3) = SetPhotonStartDirection(iElem, iPhotLoc, RandRot) + PhotonProps%WaveLength = SetParticleWavelength(iElem) +! IF (Symmetry2DAxisymmetric) THEN +! CALL Photon2DSymTracking() +! ELSE + CALL PhotonTriaTracking() +! END IF + END DO + END IF + photonCount = photonCount + RadTransPhotPerCell(iELem) + END DO + +END SUBROUTINE RadTrans_main + +FUNCTION SetPhotonEnergy(iElem) +!=================================================================================================================================== +!> Calculation of the vibrational temperature (zero-point search) for the TSHO (Truncated Simple Harmonic Oscillator) +!=================================================================================================================================== +! MODULES +USE MOD_RadiationTrans_Vars ,ONLY : RadEmiAdaptPhotonNum, Radiation_Emission_Spec_Total, RadTrans, RadTransPhotPerCell +USE MOD_Particle_Mesh_Vars ,ONLY : GEO, ElemVolume_Shared +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES +INTEGER, INTENT(IN) :: iElem +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +REAL :: SetPhotonEnergy +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +!=================================================================================================================================== +IF (RadEmiAdaptPhotonNum) THEN + SetPhotonEnergy = Radiation_Emission_Spec_Total(iElem)*ElemVolume_Shared(iElem) / RadTransPhotPerCell(iElem) +ELSE + SetPhotonEnergy = Radiation_Emission_Spec_Total(iElem)*ElemVolume_Shared(iElem) / (RadTrans%NumPhotonsPerCell) +END IF + +END FUNCTION SetPhotonEnergy + +FUNCTION SetPhotonPos(iElem, globPhotNum) +!=================================================================================================================================== +!> Calculation of the vibrational temperature (zero-point search) for the TSHO (Truncated Simple Harmonic Oscillator) +!=================================================================================================================================== +! MODULES +USE MOD_Globals +USE MOD_RadiationTrans_Vars, ONLY : RadiationPhotonPosModel +USE MOD_Particle_Mesh_Tools, ONLY : ParticleInsideQuad3D +USE MOD_RadiationTrans_Init, ONLY : HALTON +!USE MOD_PARTICLE_Vars, ONLY : Symmetry2DAxisymmetric +USE MOD_Particle_Mesh_Vars, ONLY : BoundsOfElem_Shared +USE MOD_Mesh_Tools, ONLY: GetGlobalElemID +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES +INTEGER, INTENT(IN) :: iElem +INTEGER, INTENT(INOUT) :: globPhotNum +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +REAL :: SetPhotonPos(3) +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +LOGICAL :: InsideFlag +INTEGER :: globElemID +!=================================================================================================================================== + InsideFlag=.FALSE. + globElemID = GetGlobalElemID(iElem) + ASSOCIATE( Bounds => BoundsOfElem_Shared(1:2,1:3,globElemID) ) + DO WHILE(.NOT.InsideFlag) + SELECT CASE(RadiationPhotonPosModel) + CASE(1) + CALL RANDOM_NUMBER(SetPhotonPos) + CASE(2) + globPhotNum = globPhotNum + 1 + CALL HALTON(globPhotNum,3,SetPhotonPos) + CASE DEFAULT + CALL abort(& + __STAMP__& + ,' ERROR: Radiation-PhotonPosModel not implemented!. (unknown case)') + END SELECT !PartBound%MapToPartBC(BC(SideID) + SetPhotonPos = Bounds(1,:) + SetPhotonPos*(Bounds(2,:)-Bounds(1,:)) + ! IF (Symmetry2DAxisymmetric) SetPhotonPos(3) = 0.0 + CALL ParticleInsideQuad3D(SetPhotonPos,globElemID,InsideFlag) + END DO + END ASSOCIATE +END FUNCTION SetPhotonPos + +FUNCTION SetPhotonStartDirection(iElem, iPhot, RandRot) +!=================================================================================================================================== +! modified particle emmission for LD case +!=================================================================================================================================== +! MODULES +USE MOD_Globals +USE MOD_Globals_Vars, ONLY : Pi +USE MOD_RadiationTrans_Vars ,ONLY : RadiationDirectionModel, RadTrans, RadTransPhotPerCell +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES +INTEGER, INTENT(IN) :: iElem, iPhot +REAL, INTENT(IN) :: RandRot(3,3) +!----------------------------------------------------------------------------------------------------------------------------------- +! INOUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +REAL :: SetPhotonStartDirection(3) +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +REAL :: iRan,RandomDirection(2), X_new, Y_new, start, incr, SpiralPos, SpiralStep +INTEGER :: RadMod +!=================================================================================================================================== + SELECT CASE(RadiationDirectionModel) + CASE(1) + RadMod = RadiationDirectionModel + CASE(2) + IF (RadTransPhotPerCell(iElem).EQ.1) THEN + RadMod = 1 + ELSE + RadMod = RadiationDirectionModel + END IF + CASE DEFAULT + CALL abort(& + __STAMP__& + ,' ERROR: Radiation-DirectionModel not implemented!. (unknown case)') + END SELECT !PartBound%MapToPartBC(BC(SideID) + + SELECT CASE(RadMod) + CASE(1) + CALL RANDOM_NUMBER(iRan) + RandomDirection(1) = 2.*iRan - 1. + CALL RANDOM_NUMBER(iRan) + RandomDirection(2) = 2.*Pi*iRan - Pi + SetPhotonStartDirection(1) = SIN(RandomDirection(2))*SQRT(1.-RandomDirection(1)**2.) + SetPhotonStartDirection(2) = COS(RandomDirection(2))*SQRT(1.-RandomDirection(1)**2.) + SetPhotonStartDirection(3) = RandomDirection(1) + CASE(2) + SpiralStep = 0.1+1.2*REAL(RadTransPhotPerCell(iElem)) + start = (-1. + 1./(REAL(RadTransPhotPerCell(iElem))-1.)) + incr = (2.-2./(REAL(RadTransPhotPerCell(iElem))-1.))/(REAL(RadTransPhotPerCell(iElem))-1.) + SpiralPos = start + (REAL(iPhot)-1.) *incr + X_new = SpiralPos * SpiralStep + Y_new = Pi/2.*SIGN(1.,SpiralPos)*(1.-SQRT(1.-ABS(SpiralPos))) + SetPhotonStartDirection(1) = COS(X_new)*COS(Y_new) + SetPhotonStartDirection(2) = SIN(X_new)*COS(Y_new) + SetPhotonStartDirection(3) = SIN(Y_new) + SetPhotonStartDirection(1:3) = MATMUL(RandRot, SetPhotonStartDirection(1:3)) + CASE DEFAULT + CALL abort(& + __STAMP__& + ,' ERROR: Radiation-DirectionModel not implemented!. (unknown case)') + END SELECT !PartBound%MapToPartBC(BC(SideID) + +END FUNCTION SetPhotonStartDirection + +FUNCTION RandomRotMatrix() +!=================================================================================================================================== +! Calculation of the vibrational temperature (zero-point search) for the TSHO (Truncated Simple Harmonic Oscillator) +!=================================================================================================================================== +! MODULES + USE MOD_Globals_Vars, ONLY : Pi +! IMPLICIT VARIABLE HANDLING + IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES + REAL :: RandomRotMatrix(3,3) +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES + REAL :: alpha(3) , A(3,3) +!=================================================================================================================================== + CALL RANDOM_NUMBER(alpha) + alpha(1:3) = 2.*alpha(1:3)*Pi + RandomRotMatrix = RESHAPE((/1.,0.,0.,0.,COS(alpha(1)),SIN(alpha(1)),0.,-SIN(alpha(1)), COS(alpha(1))/),(/3,3/)) + A = RESHAPE((/COS(alpha(2)),0.,-SIN(alpha(2)),0.,1.,0.,SIN(alpha(2)),0.0, COS(alpha(2))/),(/3,3/)) + RandomRotMatrix = MATMUL(A,RandomRotMatrix) + A = RESHAPE((/COS(alpha(3)),SIN(alpha(3)),0.,-SIN(alpha(3)),COS(alpha(3)),0.,0.,0.0, 1./),(/3,3/)) + RandomRotMatrix = MATMUL(A, RandomRotMatrix) + +END FUNCTION RandomRotMatrix + + +FUNCTION SetParticleWavelength(iElem) +!=================================================================================================================================== +! modified particle emmission for LD case +!=================================================================================================================================== +! MODULES +USE MOD_Globals +USE MOD_Globals_Vars, ONLY : Pi +USE MOD_RadiationTrans_Vars, ONLY : Radiation_Emission_Spec_Total +USE MOD_Radiation_Vars, ONLY: Radiation_Emission_spec, RadiationParameter +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES +INTEGER, INTENT(IN) :: iElem +!----------------------------------------------------------------------------------------------------------------------------------- +! INOUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +INTEGER :: SetParticleWavelength +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +INTEGER :: iWaveLength, iWave +REAL :: iRan, iRadPower +!=================================================================================================================================== + + CALL RANDOM_NUMBER(iRan) + iWaveLength = INT(RadiationParameter%WaveLenDiscr*iRan) + 1 + iRadPower = 0.0 + DO iWave = 1, iWaveLength + iRadPower = iRadPower + 4.*Pi*Radiation_Emission_Spec(iWave,iElem)*RadiationParameter%WaveLenIncr + END DO + CALL RANDOM_NUMBER(iRan) + DO WHILE (iRan.GT.(iRadPower/Radiation_Emission_Spec_Total(iElem))) + CALL RANDOM_NUMBER(iRan) + iWaveLength = INT(RadiationParameter%WaveLenDiscr*iRan) + 1 + iRadPower = 0.0 + DO iWave = 1, iWaveLength + iRadPower = iRadPower + 4.*Pi*Radiation_Emission_Spec(iWave,iElem)*RadiationParameter%WaveLenIncr + END DO + CALL RANDOM_NUMBER(iRan) + END DO + SetParticleWavelength = iWaveLength + +END FUNCTION SetParticleWavelength + +END MODULE MOD_RadTransport diff --git a/src/radiation/radiative_transfer/radtrans_output.f90 b/src/radiation/radiative_transfer/radtrans_output.f90 new file mode 100644 index 000000000..b23efc56a --- /dev/null +++ b/src/radiation/radiative_transfer/radtrans_output.f90 @@ -0,0 +1,430 @@ +!================================================================================================================================== +! Copyright (c) 2018 - 2019 Marcel Pfeiffer +! +! This file is part of PICLas (gitlab.com/piclas/piclas). PICLas is free software: you can redistribute it and/or modify +! it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 +! of the License, or (at your option) any later version. +! +! PICLas is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty +! of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License v3.0 for more details. +! +! You should have received a copy of the GNU General Public License along with PICLas. If not, see . +!================================================================================================================================== +#include "piclas.h" + +MODULE MOD_RadTrans_Output +!=================================================================================================================================== +! Module for DSMC Sampling and Output +!=================================================================================================================================== +! MODULES +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +PRIVATE + +INTERFACE WriteRadiationToHDF5 + MODULE PROCEDURE WriteRadiationToHDF5 +END INTERFACE + + +!----------------------------------------------------------------------------------------------------------------------------------- +! GLOBAL VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! Private Part --------------------------------------------------------------------------------------------------------------------- +! Public Part ---------------------------------------------------------------------------------------------------------------------- +PUBLIC :: WriteRadiationToHDF5 !, WriteSurfSampleToHDF5 +!=================================================================================================================================== + +CONTAINS + +SUBROUTINE WriteRadiationToHDF5() +!=================================================================================================================================== +! Writes Radiation values to HDF5 +!=================================================================================================================================== +! MODULES + USE MOD_Globals + USE MOD_PreProc + USE MOD_io_HDF5 + USE MOD_HDF5_output ,ONLY: WriteArrayToHDF5,WriteAttributeToHDF5,WriteHDF5Header + USE MOD_Mesh_Vars ,ONLY: offsetElem,nGlobalElems, MeshFile + USE MOD_RadiationTrans_Vars ,ONLY: RadiationElemAbsEnergy_Shared + USE MOD_RadiationTrans_Vars ,ONLY: Radiation_Emission_Spec_Total, RadTransPhotPerCell + USE MOD_Globals_Vars ,ONLY: ProjectName + USE MOD_Particle_Mesh_Vars ,ONLY: ElemVolume_Shared + USE MOD_Radiation_Vars ,ONLY: RadiationSwitches, Radiation_ElemEnergy_Species, RadiationParameter, Radiation_Absorption_Spec + USE MOD_Particle_Vars ,ONLY: nSpecies + USE MOD_Mesh_Tools ,ONLY: GetCNElemID +! IMPLICIT VARIABLE HANDLING + IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- + CHARACTER(LEN=255) :: FileString,Statedummy + CHARACTER(LEN=255) :: SpecID + INTEGER :: nVal, iElem, nVar, iSpec, nVarCount, nVarSpec, CNElemID, iWave + REAL, ALLOCATABLE :: TempOutput(:,:) + CHARACTER(LEN=255), ALLOCATABLE :: StrVarNames(:) + REAL :: AbsTotal +!=================================================================================================================================== + SWRITE(UNIT_stdOut,'(a)',ADVANCE='NO') ' WRITE Radiation TO HDF5 FILE...' + FileString=TRIM(ProjectName)//'_RadiationState.h5' + Statedummy = 'RadiationState' + IF (RadiationSwitches%RadType.EQ.1) THEN + nVarSpec=2 ! _Emission, _Absorption + nVar=nVarSpec*nSpecies+4 ! nVarSpec + Total_Emission, Total_Absorption, Total_Heatflux, and Total_PhotonNum + ELSE + nVar=4 + END IF + + ALLOCATE(StrVarNames(nVar)) + ALLOCATE(TempOutput(nVar, PP_nElems)) + + IF (RadiationSwitches%RadType.EQ.1) THEN + nVarCount=0 + DO iSpec=1, nSpecies + WRITE(SpecID,'(I3.3)') iSpec + StrVarNames(nVarCount+1)='Spec'//TRIM(SpecID)//'_Emission' + StrVarNames(nVarCount+2)='Spec'//TRIM(SpecID)//'_Absorption' + nVarCount=nVarCount+nVarSpec + + END DO + StrVarNames(nVarCount+1)='Total_Emission' + StrVarNames(nVarCount+2)='Total_Absorption' + StrVarNames(nVarCount+3)='Total_Heatflux' + StrVarNames(nVarCount+4)='Total_PhotonNum' + ELSE + StrVarNames(1)='Total_Emission' + StrVarNames(2)='Total_Absorption' + StrVarNames(3)='Total_Heatflux' + StrVarNames(4)='Total_PhotonNum' + END IF + + IF(MPIRoot) THEN + CALL OpenDataFile(FileString,create=.TRUE.,single=.TRUE.,readOnly=.FALSE.) + CALL WriteHDF5Header(Statedummy,File_ID) + CALL WriteAttributeToHDF5(File_ID,'VarNamesAdd',nVar,StrArray=StrVarNames) + CALL WriteAttributeToHDF5(File_ID,'MeshFile',1,StrScalar=(/TRIM(MeshFile)/)) + CALL CloseDataFile() + END IF +#if USE_MPI + CALL MPI_ExchangeRadiationInfo() +#endif /*USE_MPI*/ + + CALL OpenDataFile(FileString,create=.false.,single=.FALSE.,readOnly=.FALSE.,communicatorOpt=MPI_COMM_WORLD) + + IF (RadiationSwitches%RadType.EQ.1) THEN + DO iElem=1,PP_nElems + CNElemID = GetCNElemID(iElem+offSetElem) + nVarCount=0 + AbsTotal=0. + DO iSpec=1, nSpecies ! Sum over absorbtion coefficient to determine absorbed energy portion per species + AbsTotal = AbsTotal + Radiation_ElemEnergy_Species(iSpec,CNElemID,2) + END DO + DO iSpec=1, nSpecies + TempOutput(nVarCount+1, iElem) = Radiation_ElemEnergy_Species(iSpec,CNElemID,1) +! TempOutput(nVarCount+2, iElem) = Radiation_ElemEnergy_Species(iSpec,iElem,2) !abs coefficient + TempOutput(nVarCount+2, iElem) = & + MAX(Radiation_ElemEnergy_Species(iSpec,CNElemID,2)/AbsTotal * RadiationElemAbsEnergy_Shared(iElem+offSetElem)/ ElemVolume_Shared(CNElemID),0.) !lost energy + nVarCount=nVarCount+nVarSpec + END DO + TempOutput((nVarSpec*nSpecies+1), iElem) = SUM(Radiation_ElemEnergy_Species(:,CNElemID,1)) + TempOutput((nVarSpec*nSpecies+2), iElem) = RadiationElemAbsEnergy_Shared(iElem+offSetElem)/ ElemVolume_Shared(CNElemID) + TempOutput(nVarSpec*nSpecies+3, iElem) = SUM(Radiation_ElemEnergy_Species(:,CNElemID,1))- RadiationElemAbsEnergy_Shared(iElem+offSetElem)/ ElemVolume_Shared(CNElemID) + TempOutput(nVarSpec*nSpecies+4, iElem) = RadTransPhotPerCell(CNElemID) + END DO + ELSE IF (RadiationSwitches%RadType.EQ.2) THEN + DO iElem=1, PP_nElems + CNElemID = GetCNElemID(iElem+offSetElem) + TempOutput(1, iElem) = Radiation_Emission_Spec_Total(CNElemID) + TempOutput(2, iElem) = RadiationElemAbsEnergy_Shared(iElem+offSetElem)/ElemVolume_Shared(CNElemID) + TempOutput(3, iElem) = Radiation_Emission_Spec_Total(CNElemID)- RadiationElemAbsEnergy_Shared(iElem+offSetElem)/ElemVolume_Shared(CNElemID) + TempOutput(4, iElem) = RadTransPhotPerCell(CNElemID) + END DO + ELSE + DO iElem=1, PP_nElems + CNElemID = GetCNElemID(iElem+offSetElem) + TempOutput(1, iElem) = Radiation_Emission_Spec_Total(CNElemID) + TempOutput(2, iElem) = 0.0 + DO iWave = 1, RadiationParameter%WaveLenDiscr + TempOutput(2, iElem) = TempOutput(2, iElem) + Radiation_Absorption_Spec(iWave, iElem+offSetElem) * RadiationParameter%WaveLenIncr + END DO + TempOutput(3, iElem) = Radiation_Emission_Spec_Total(CNElemID) - TempOutput(2, iElem) + TempOutput(4, iElem) = RadTransPhotPerCell(CNElemID) + END DO + END IF + + nVal=nGlobalElems ! For the MPI case this must be replaced by the global number of elements (sum over all procs) + CALL WriteArrayToHDF5(DataSetName='ElemData', rank=2,& + nValGlobal=(/nVar, nGlobalElems/),& + nVal= (/nVar, PP_nElems/),& + offset= (/0, offsetElem /),& + collective=.TRUE., RealArray=TempOutput(:,:)) + CALL CloseDataFile() + SWRITE(*,*) 'DONE' + +END SUBROUTINE WriteRadiationToHDF5 + + +#if USE_MPI + +SUBROUTINE MPI_ExchangeRadiationInfo() +!=================================================================================================================================== +! Writes DSMC state values to HDF5 +!=================================================================================================================================== +! MODULES + USE MOD_Globals + USE MOD_PreProc + USE MOD_RadiationTrans_Vars, ONLY : RadiationElemAbsEnergy, RadiationElemAbsEnergy_Shared, RadiationElemAbsEnergy_Shared_Win + USE MOD_Mesh_Vars, ONLY : nGlobalElems + USE MOD_MPI_Shared_Vars + USE MOD_MPI_Shared +! IMPLICIT VARIABLE HANDLING + IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +INTEGER :: MessageSize, iELem +!=================================================================================================================================== +! collect the information from the proc-local shadow arrays in the compute-node shared array +MessageSize = nGlobalElems + +IF (myComputeNodeRank.EQ.0) THEN + CALL MPI_REDUCE(RadiationElemAbsEnergy,RadiationElemAbsEnergy_Shared,MessageSize,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_SHARED,IERROR) +ELSE + CALL MPI_REDUCE(RadiationElemAbsEnergy,0 ,MessageSize,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_SHARED,IERROR) +ENDIF +CALL BARRIER_AND_SYNC(RadiationElemAbsEnergy_Shared_Win ,MPI_COMM_SHARED) + +IF(nLeaderGroupProcs.GT.1)THEN + IF(myComputeNodeRank.EQ.0)THEN + CALL MPI_ALLREDUCE(MPI_IN_PLACE,RadiationElemAbsEnergy_Shared,MessageSize,MPI_DOUBLE_PRECISION,MPI_SUM,MPI_COMM_LEADERS_SHARED,iError) + END IF + + CALL BARRIER_AND_SYNC(RadiationElemAbsEnergy_Shared_Win ,MPI_COMM_SHARED) +END IF + +END SUBROUTINE MPI_ExchangeRadiationInfo + + +!SUBROUTINE MPI_ExchangeRadiationSurfData() +!!=================================================================================================================================== +!! exchange the surface data +!! only processes with samling sides in their halo region and the original process participate on the communication +!! structure is similar to particle communication +!! each process sends his halo-information directly to the origin process by use of a list, containing the surfsideids for sending +!! the receiving process adds the new data to his own sides +!!=================================================================================================================================== +!! MODULES ! +!!----------------------------------------------------------------------------------------------------------------------------------! +!USE MOD_Globals +!USE MOD_Particle_Boundary_Vars ,ONLY:SurfComm +!USE MOD_Particle_MPI_Vars ,ONLY:SurfSendBuf,SurfRecvBuf,SurfExchange +!USE MOD_RadiationTrans_Vars, ONLY:PhotonSampWall +!!----------------------------------------------------------------------------------------------------------------------------------! +!! IMPLICIT VARIABLE HANDLING +!IMPLICIT NONE +!! INPUT VARIABLES +!!----------------------------------------------------------------------------------------------------------------------------------! +!! OUTPUT VARIABLES +!!----------------------------------------------------------------------------------------------------------------------------------- +!! LOCAL VARIABLES +!INTEGER :: MessageSize,nValues,iSurfSide,SurfSideID +!INTEGER :: iPos,iProc +!INTEGER :: recv_status_list(1:MPI_STATUS_SIZE,1:SurfCOMM%nMPINeighbors) +!!=================================================================================================================================== + +!nValues = 2 +!! +!! open receive buffer +!DO iProc=1,SurfCOMM%nMPINeighbors +! IF(SurfExchange%nSidesRecv(iProc).EQ.0) CYCLE +! MessageSize=SurfExchange%nSidesRecv(iProc)*nValues +! CALL MPI_IRECV( SurfRecvBuf(iProc)%content & +! , MessageSize & +! , MPI_DOUBLE_PRECISION & +! , SurfCOMM%MPINeighbor(iProc)%NativeProcID & +! , 1009 & +! , SurfCOMM%COMM & +! , SurfExchange%RecvRequest(iProc) & +! , IERROR ) +!END DO ! iProc + +!! build message +!DO iProc=1,SurfCOMM%nMPINeighbors +! IF(SurfExchange%nSidesSend(iProc).EQ.0) CYCLE +! iPos=0 +! SurfSendBuf(iProc)%content = 0. +! DO iSurfSide=1,SurfExchange%nSidesSend(iProc) +! SurfSideID=SurfCOMM%MPINeighbor(iProc)%SendList(iSurfSide) +! SurfSendBuf(iProc)%content(iPos+1:iPos+nValues)= PhotonSampWall(1:2,SurfSideID) +! iPos=iPos+nValues +! END DO ! iSurfSide=1,nSurfExchange%nSidesSend(iProc) +!END DO + +!! send message +!DO iProc=1,SurfCOMM%nMPINeighbors +! IF(SurfExchange%nSidesSend(iProc).EQ.0) CYCLE +! MessageSize=SurfExchange%nSidesSend(iProc)*nValues +! CALL MPI_ISEND( SurfSendBuf(iProc)%content & +! , MessageSize & +! , MPI_DOUBLE_PRECISION & +! , SurfCOMM%MPINeighbor(iProc)%NativeProcID & +! , 1009 & +! , SurfCOMM%COMM & +! , SurfExchange%SendRequest(iProc) & +! , IERROR ) +!END DO ! iProc + +!! 4) Finish Received number of particles +!DO iProc=1,SurfCOMM%nMPINeighbors +! IF(SurfExchange%nSidesSend(iProc).NE.0) THEN +! CALL MPI_WAIT(SurfExchange%SendRequest(iProc),MPIStatus,IERROR) +! IF(IERROR.NE.MPI_SUCCESS) CALL abort(& +!__STAMP__& +! ,' MPI Communication error', IERROR) +! END IF +! IF(SurfExchange%nSidesRecv(iProc).NE.0) THEN +! CALL MPI_WAIT(SurfExchange%RecvRequest(iProc),recv_status_list(:,iProc),IERROR) +! IF(IERROR.NE.MPI_SUCCESS) CALL abort(& +!__STAMP__& +! ,' MPI Communication error', IERROR) +! END IF +!END DO ! iProc + +!! add data do my list +!DO iProc=1,SurfCOMM%nMPINeighbors +! IF(SurfExchange%nSidesRecv(iProc).EQ.0) CYCLE +! iPos=0 +! DO iSurfSide=1,SurfExchange%nSidesRecv(iProc) +! SurfSideID=SurfCOMM%MPINeighbor(iProc)%RecvList(iSurfSide) +! PhotonSampWall(1:2,SurfSideID)=PhotonSampWall(1:2,SurfSideID) & +! +SurfRecvBuf(iProc)%content(iPos+1:iPos+nValues) +! iPos=iPos+nValues +! END DO ! iSurfSide=1,nSurfExchange%nSidesSend(iProc) +!END DO ! iProc + +!END SUBROUTINE MPI_ExchangeRadiationSurfData +#endif /*USE_MPI*/ + + +!SUBROUTINE WriteSurfSampleToHDF5() +!!=================================================================================================================================== +!!> write the final values of the surface sampling to a HDF5 state file +!!> additional performs all the final required computations +!!=================================================================================================================================== +!! MODULES ! +!!----------------------------------------------------------------------------------------------------------------------------------! +!USE MOD_Globals +!USE MOD_IO_HDF5 +!USE MOD_Globals_Vars, ONLY:ProjectName +!USE MOD_Particle_Boundary_Vars, ONLY:SurfMesh,offSetSurfSide!,nSurfSample +!USE MOD_HDF5_Output, ONLY:WriteAttributeToHDF5,WriteArrayToHDF5,WriteHDF5Header +!USE MOD_Particle_Boundary_Vars, ONLY:SurfCOMM,nSurfBC,SurfBCName +!USE MOD_Mesh_Vars, ONLY:MeshFile +!USE MOD_RadiationTrans_Vars, ONLY:PhotonSampWall +!!----------------------------------------------------------------------------------------------------------------------------------! +!! IMPLICIT VARIABLE HANDLING +!IMPLICIT NONE +!! INPUT VARIABLES +!!----------------------------------------------------------------------------------------------------------------------------------! +!! OUTPUT VARIABLES +!!----------------------------------------------------------------------------------------------------------------------------------- +!! LOCAL VARIABLES +!CHARACTER(LEN=255) :: FileString,Statedummy +!CHARACTER(LEN=255) :: H5_Name +!CHARACTER(LEN=255) :: NodeTypeTemp +!CHARACTER(LEN=255),ALLOCATABLE :: Str2DVarNames(:) +!INTEGER :: nVar2D +!REAL :: tstart,tend +!REAL, ALLOCATABLE :: helpArray(:,:) +!!=================================================================================================================================== +!IF (nSurfBC.EQ.0) THEN +! IF(SurfCOMM%MPIOutputROOT)THEN +! WRITE(UNIT_stdOut,'(A)') 'No boundary found for surface sampling!' +! END IF +! RETURN +!END IF +!#if USE_MPI +!CALL MPI_BARRIER(SurfCOMM%COMM,iERROR) +!CALL MPI_ExchangeRadiationSurfData() +!IF(SurfMesh%nSides.EQ.0) RETURN +!#endif /*USE_MPI*/ +!IF(SurfCOMM%MPIOutputRoot)THEN +! WRITE(UNIT_stdOut,'(a)',ADVANCE='NO')' WRITE Radiation SurfSTATE TO HDF5 FILE...' +! tstart=LOCALTIME() +!END IF + +!FileString=TRIM(ProjectName)//'_RadiationSurfState.h5' +!nVar2D = 2 + +!! Generate skeleton for the file with all relevant data on a single proc (MPIRoot) +!#if USE_MPI +!IF(SurfCOMM%MPIOutputRoot)THEN +!#endif /*USE_MPI*/ +! CALL OpenDataFile(FileString,create=.TRUE.,single=.TRUE.,readOnly=.FALSE.) +! Statedummy = 'RadiationSurfState' +! ! Write file header +! CALL WriteHDF5Header(Statedummy,File_ID) +! CALL WriteAttributeToHDF5(File_ID,'RadiationnSurfSample',1,IntegerScalar=1) +! CALL WriteAttributeToHDF5(File_ID,'MeshFile',1,StrScalar=(/TRIM(MeshFile)/)) +! CALL WriteAttributeToHDF5(File_ID,'BC_Surf',nSurfBC,StrArray=SurfBCName) +! CALL WriteAttributeToHDF5(File_ID,'N',1,IntegerScalar=1) +! NodeTypeTemp='VISU' +! CALL WriteAttributeToHDF5(File_ID,'NodeType',1,StrScalar=(/NodeTypeTemp/)) + +! ALLOCATE(Str2DVarNames(1:nVar2D)) +! ! fill varnames for total values +! Str2DVarNames(1) ='PhotonCount' +! Str2DVarNames(2) ='HeatFlux' + +! CALL WriteAttributeToHDF5(File_ID,'VarNamesSurface',nVar2D,StrArray=Str2DVarNames) + +! CALL CloseDataFile() +! DEALLOCATE(Str2DVarNames) +!#if USE_MPI +!END IF +!CALL MPI_BARRIER(SurfCOMM%OutputCOMM,iERROR) +!CALL OpenDataFile(FileString,create=.FALSE.,single=.FALSE.,readOnly=.FALSE.,communicatorOpt=SurfCOMM%OutputCOMM) +!#else +!CALL OpenDataFile(FileString,create=.FALSE.,single=.FALSE.,readOnly=.FALSE.) +!#endif /*USE_MPI*/ + + +!WRITE(H5_Name,'(A)') 'SurfaceData' +!ASSOCIATE (& +! nGlobalSides => INT(SurfMesh%nGlobalSides,IK) ,& +! LocalnBCSides => INT(SurfMesh%nBCSides,IK) ,& +! offsetSurfSide => INT(offsetSurfSide,IK) ,& +! nVar2D => INT(nVar2D,IK)) + +! ALLOCATE(helpArray(nVar2D,LocalnBCSides)) + +! helpArray(1,1:LocalnBCSides)= PhotonSampWall(1,1:LocalnBCSides) +! ! SurfaceArea should be changed to 1:SurfMesh%nSides if inner sampling sides exist... +! helpArray(2,1:LocalnBCSides)= PhotonSampWall(2,1:LocalnBCSides)/SurfMesh%SurfaceArea(1,1,1:LocalnBCSides) +! CALL WriteArrayToHDF5(DataSetName=H5_Name , rank=4 , & +! nValGlobal =(/nVar2D , 1, 1 , nGlobalSides/) , & +! nVal =(/nVar2D , 1, 1 , LocalnBCSides/) , & +! offset =(/0_IK, 0_IK , 0_IK , offsetSurfSide/), & +! collective =.TRUE. ,& +! RealArray=helpArray(1:nVar2D,1:LocalnBCSides)) +! DEALLOCATE(helpArray) +!END ASSOCIATE + +!CALL CloseDataFile() + +!IF(SurfCOMM%MPIOutputROOT)THEN +! tend=LOCALTIME() +! WRITE(UNIT_stdOut,'(A,F0.3,A)',ADVANCE='YES')'DONE [',tend-tstart,'s]' +!END IF + +!END SUBROUTINE WriteSurfSampleToHDF5 + +END MODULE MOD_RadTrans_Output diff --git a/src/radiation/radiative_transfer/radtrans_vars.f90 b/src/radiation/radiative_transfer/radtrans_vars.f90 index 829ad3698..13e8d151a 100644 --- a/src/radiation/radiative_transfer/radtrans_vars.f90 +++ b/src/radiation/radiative_transfer/radtrans_vars.f90 @@ -10,6 +10,8 @@ ! ! You should have received a copy of the GNU General Public License along with PICLas. If not, see . !================================================================================================================================== +#include "piclas.h" + MODULE MOD_RadiationTrans_Vars !=================================================================================================================================== ! Contains the tadiation transport variables @@ -25,7 +27,6 @@ MODULE MOD_RadiationTrans_Vars LOGICAL :: useParticleRadiationSolver TYPE tRadTrans INTEGER :: NumPhotonsPerCell - INTEGER, ALLOCATABLE :: PhotPerCell(:) REAL :: GlobalRadiationPower REAL :: ScaledGlobalRadiationPower INTEGER :: GlobalPhotonNum @@ -45,16 +46,25 @@ MODULE MOD_RadiationTrans_Vars TYPE (tPhotonProps) :: PhotonProps -REAL , ALLOCATABLE :: RadiationElemEnergy(:,:) - -REAL , ALLOCATABLE :: Radiation_Emission_Spec_Total(:) -REAL , ALLOCATABLE :: Radiation_Absorption_Spec_Total(:) - -REAL , ALLOCATABLE :: PhotonSampWall(:,:) - INTEGER :: RadiationAbsorptionModel INTEGER :: RadiationDirectionModel INTEGER :: RadiationPhotonPosModel LOGICAL :: RadEmiAdaptPhotonNum + +REAL, ALLOCATABLE :: RadiationElemAbsEnergy(:) +REAL,ALLOCPOINT :: Radiation_Emission_Spec_Total(:) +INTEGER,ALLOCPOINT :: RadTransPhotPerCell(:) ! (WaveLen(:), number of mesh elements) +INTEGER, ALLOCATABLE :: RadTransPhotPerCellLoc(:) +REAL, ALLOCATABLE :: PhotonSampWall(:,:) +#if USE_MPI +INTEGER :: RadTransPhotPerCell_Shared_Win +INTEGER,ALLOCPOINT :: RadTransPhotPerCell_Shared(:) +INTEGER :: Radiation_Emission_Spec_Total_Shared_Win +REAL,ALLOCPOINT :: Radiation_Emission_Spec_Total_Shared(:) +INTEGER :: PhotonSampWall_Shared_Win +REAL,POINTER :: PhotonSampWall_Shared(:,:) +INTEGER :: RadiationElemAbsEnergy_Shared_Win +REAL,POINTER :: RadiationElemAbsEnergy_Shared(:) +#endif !=================================================================================================================================== END MODULE MOD_RadiationTrans_Vars diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tools.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tools.f90 new file mode 100644 index 000000000..10b4d11b4 --- /dev/null +++ b/src/radiation/radiative_transfer/tracking/radtrans_tools.f90 @@ -0,0 +1,828 @@ +!================================================================================================================================== +! Copyright (c) 2010 - 2018 Prof. Claus-Dieter Munz and Prof. Stefanos Fasoulas +! +! This file is part of PICLas (gitlab.com/piclas/piclas). PICLas is free software: you can redistribute it and/or modify +! it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 +! of the License, or (at your option) any later version. +! +! PICLas is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty +! of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License v3.0 for more details. +! +! You should have received a copy of the GNU General Public License along with PICLas. If not, see . +!================================================================================================================================== +#include "piclas.h" + +MODULE MOD_Photon_TrackingTools +!=================================================================================================================================== +! Contains global variables provided by the particle surfaces routines +!=================================================================================================================================== +! MODULES +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +PUBLIC + +INTERFACE PhotonThroughSideCheck3DFast + MODULE PROCEDURE PhotonThroughSideCheck3DFast +END INTERFACE + +PUBLIC :: PhotonThroughSideCheck3DFast, PhotonIntersectionWithSide, CalcAbsoprtion, PerfectPhotonReflection, DiffusePhotonReflection +PUBLIC :: CalcWallAbsoprtion +!PUBLIC :: PhotonIntersectionWithSide2D, RotatePhotonIn2DPlane, PerfectPhotonReflection2D,DiffusePhotonReflection2D +!----------------------------------------------------------------------------------------------------------------------------------- +!----------------------------------------------------------------------------------------------------------------------------------- +!=================================================================================================================================== + +CONTAINS + + +SUBROUTINE PhotonThroughSideCheck3DFast(iLocSide,Element,ThroughSide,TriNum, IsMortar) +!=================================================================================================================================== +!> Routine to check whether a particle crossed the given triangle of a side. The determinant between the normalix_photon_startd trajectory +!> vector and the vectors from two of the three nodes to the old particle position is calculated. If the determinants for the three +!> possible combinations are greater than x_photon_startro, then the particle went through this triangle of the side. +!> Note that if this is a mortar side, the side of the small neighbouring mortar element has to be checked. Thus, the orientation +!> is reversed. +!=================================================================================================================================== +! MODULES +USE MOD_Globals_Vars ,ONLY: EpsMach +USE MOD_Particle_Mesh_Vars, ONLY : GEO, NodeCoords_Shared, ElemSideNodeID_Shared +USE MOD_RadiationTrans_Vars, ONLY:PhotonProps +USE MOD_Mesh_Tools ,ONLY: GetCNElemID +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +! INPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT/OUTPUT VARIABLES +INTEGER,INTENT(IN) :: iLocSide +INTEGER,INTENT(IN) :: Element +INTEGER,INTENT(IN) :: TriNum +LOGICAL,INTENT(OUT) :: ThroughSide +LOGICAL, INTENT(IN), OPTIONAL :: IsMortar +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +INTEGER :: CNElemID +INTEGER :: n, NodeID +REAL :: Px, Py, Pz +REAL :: Vx, Vy, Vz!, Vall +REAL :: xNode(3), yNode(3), zNode(3), Ax(3), Ay(3), Az(3) +REAL :: det(3) +!=================================================================================================================================== +CNElemID = GetCNElemID(Element) +ThroughSide = .FALSE. + +Px = PhotonProps%PhotonLastPos(1) +Py = PhotonProps%PhotonLastPos(2) +Pz = PhotonProps%PhotonLastPos(3) + +! Normalix_photon_startd particle trajectory (PartPos - lastPartPos)/ABS(PartPos - lastPartPos) +Vx = PhotonProps%PhotonDirection(1) +Vy = PhotonProps%PhotonDirection(2) +Vz = PhotonProps%PhotonDirection(3) +! Get the coordinates of the first node and the vector from the particle position to the node +xNode(1) = NodeCoords_Shared(1,ElemSideNodeID_Shared(1,iLocSide,CNElemID)+1) +yNode(1) = NodeCoords_Shared(2,ElemSideNodeID_Shared(1,iLocSide,CNElemID)+1) +zNode(1) = NodeCoords_Shared(3,ElemSideNodeID_Shared(1,iLocSide,CNElemID)+1) +Ax(1) = xNode(1) - Px +Ay(1) = yNode(1) - Py +Az(1) = zNode(1) - Pz +! Get the vectors to the other two nodes, depending on the triangle number +IF(PRESENT(IsMortar)) THEN + ! Note: reverse orientation in the mortar case, as the side is treated from the perspective of the smaller neighbouring element + ! (TriNum=1: NodeID=3,2; TriNum=2: NodeID=4,3) + xNode(2) = NodeCoords_Shared(1,ElemSideNodeID_Shared(2+TriNum,iLocSide,CNElemID)+1) + yNode(2) = NodeCoords_Shared(2,ElemSideNodeID_Shared(2+TriNum,iLocSide,CNElemID)+1) + zNode(2) = NodeCoords_Shared(3,ElemSideNodeID_Shared(2+TriNum,iLocSide,CNElemID)+1) + + Ax(2) = xNode(2) - Px + Ay(2) = yNode(2) - Py + Az(2) = zNode(2) - Pz + + xNode(3) = NodeCoords_Shared(1,ElemSideNodeID_Shared(1+TriNum,iLocSide,CNElemID)+1) + yNode(3) = NodeCoords_Shared(2,ElemSideNodeID_Shared(1+TriNum,iLocSide,CNElemID)+1) + zNode(3) = NodeCoords_Shared(3,ElemSideNodeID_Shared(1+TriNum,iLocSide,CNElemID)+1) + + Ax(3) = xNode(3) - Px + Ay(3) = yNode(3) - Py + Az(3) = zNode(3) - Pz +ELSE + DO n = 2,3 + NodeID = n+TriNum-1 ! m = true node number of the sides (TriNum=1: NodeID=2,3; TriNum=2: NodeID=3,4) + xNode(n) = NodeCoords_Shared(1,ElemSideNodeID_Shared(NodeID,iLocSide,CNElemID)+1) + yNode(n) = NodeCoords_Shared(2,ElemSideNodeID_Shared(NodeID,iLocSide,CNElemID)+1) + zNode(n) = NodeCoords_Shared(3,ElemSideNodeID_Shared(NodeID,iLocSide,CNElemID)+1) + + Ax(n) = xNode(n) - Px + Ay(n) = yNode(n) - Py + Az(n) = zNode(n) - Pz + END DO +END IF +!--- check whether v and the vectors from the particle to the two edge nodes build +!--- a right-hand-szstem. If yes for all edges: vector goes potentially through side +det(1) = ((Ay(1) * Vz - Az(1) * Vy) * Ax(3) + & + (Az(1) * Vx - Ax(1) * Vz) * Ay(3) + & + (Ax(1) * Vy - Ay(1) * Vx) * Az(3)) + +det(2) = ((Ay(2) * Vz - Az(2) * Vy) * Ax(1) + & + (Az(2) * Vx - Ax(2) * Vz) * Ay(1) + & + (Ax(2) * Vy - Ay(2) * Vx) * Az(1)) + +det(3) = ((Ay(3) * Vz - Az(3) * Vy) * Ax(2) + & + (Az(3) * Vx - Ax(3) * Vz) * Ay(2) + & + (Ax(3) * Vy - Ay(3) * Vx) * Az(2)) + +! Comparison of the determinants with eps, where a x_photon_startro is stored (due to machine precision) +IF ((det(1).ge.-epsMach).AND.(det(2).ge.-epsMach).AND.(det(3).ge.-epsMach)) THEN + ThroughSide = .TRUE. +END IF + +RETURN + +END SUBROUTINE PhotonThroughSideCheck3DFast + + +!SUBROUTINE PhotonIntersectionWithSide2D(iLocSide,ElemID,ThroughSide,IntersectionPos,isLastSide,Distance) +!!=================================================================================================================================== +!!> Routine to check whether a photon crossed the given side. +!!=================================================================================================================================== +!! MODULES +!USE MOD_Particle_Mesh_Vars, ONLY : GEO, PartElemToSide2D +!USE MOD_RadiationTrans_Vars, ONLY:PhotonProps +!! IMPLICIT VARIABLE HANDLING +!IMPLICIT NONE +!! INPUT VARIABLES +!!----------------------------------------------------------------------------------------------------------------------------------- +!! INPUT/OUTPUT VARIABLES +!LOGICAL,INTENT(OUT) :: ThroughSide +!INTEGER,INTENT(IN) :: iLocSide, ElemID +!REAL, INTENT(OUT) :: IntersectionPos(3) +!REAL, INTENT(OUT) :: Distance +!LOGICAL, INTENT(IN) :: isLastSide +!!----------------------------------------------------------------------------------------------------------------------------------- +!! LOCAL VARIABLES +!REAL :: y_photon_start,x_photon_start,yNode1,xNode1,yNode2,xNode2,sy,sz,sx +!REAL :: l1,S1,l2,S2,l,S +!REAL :: beta, alpha, deltay, a, b, c, tmpsqrt +!!=================================================================================================================================== +! +! ThroughSide = .FALSE. + +! xNode1 = GEO%NodeCoords(1,PartElemToSide2D(iLocSide,2, ElemID)) +! yNode1 = GEO%NodeCoords(2,PartElemToSide2D(iLocSide,2, ElemID)) +! xNode2 = GEO%NodeCoords(1,PartElemToSide2D(iLocSide,3, ElemID)) +! yNode2 = GEO%NodeCoords(2,PartElemToSide2D(iLocSide,3, ElemID)) + +! x_photon_start=PhotonProps%PhotonLastPos(1) +! y_photon_start=PhotonProps%PhotonLastPos(2) + +! sx=PhotonProps%PhotonDirection(1) +! sy=PhotonProps%PhotonDirection(2) +! sz=PhotonProps%PhotonDirection(3) + +! IF (sx .EQ. 0.0) THEN +! l = (x_photon_start-xNode1)/(xNode2-xNode1) +! a = sy*sy + sz*sz +! b = 2*sy*y_photon_start +! c = y_photon_start*y_photon_start - yNode1*yNode1 + 2.*l*yNode1*yNode1 - l*l*yNode1*yNode1 & +! - 2.*yNode1*yNode2*l + 2.*yNode1*yNode2*l*l - yNode2*yNode2*l*l +! tmpsqrt = b*b - 4.*a*c +! IF (tmpsqrt.LE.0.0) THEN +! RETURN +! END IF +! S1 = (-b+SQRT(tmpsqrt))/(2.*a) +! S2 = (-b-SQRT(tmpsqrt))/(2.*a) + +! IF(isLastSide) THEN +! IF (ALMOSTEQUAL(S1,S2)) THEN +! RETURN ! TODO +! ELSE IF (ABS(S1).GT.ABS(S2)) THEN +! S=S1 +! ELSE +! S=S2 +! END IF +! ELSE +! IF (S1.LE.0.0) THEN +! S = S2 +! ELSE +! IF (S2.GT.0.0) THEN +! IF(S2.GT.S1) THEN +! S = S1 +! ELSE +! S = S2 +! END IF +! ELSE +! S = S1 +! END IF +! END IF +! END IF + + +! ELSE +! alpha = (xNode1 - x_photon_start) / sx +! beta = (xNode2 - xNode1) / sx +! deltay = (yNode2 - yNode1) +! a = beta*beta*sy*sy - deltay*deltay + beta*beta*sz*sz +! b = 2.*beta*sy*y_photon_start + 2.*alpha*beta*sy*sy - 2.*deltay*yNode1 + 2.*alpha*beta*sz*sz +! c = y_photon_start*y_photon_start - yNode1*yNode1 + 2.*alpha*sy*y_photon_start + alpha*alpha*sy*sy + sz*sz*alpha*alpha +! tmpsqrt = b*b - 4.*a*c +! IF (tmpsqrt.LE.0.0) THEN +! RETURN +! END IF +! l1 = (-b + SQRT(tmpsqrt))/(2.*a) +! S1 = (xNode1-x_photon_start+(xNode2-xNode1)*l1)/sx +! l2 = (-b - SQRT(tmpsqrt))/(2.*a) +! S2 = (xNode1-x_photon_start+(xNode2-xNode1)*l2)/sx + +! IF (isLastSide) THEN +! IF (ALMOSTEQUAL(S1,S2).AND.ALMOSTEQUAL(ABS(l1),ABS(l2))) THEN +! RETURN +! ELSE IF (ALMOSTEQUAL(S1,S2)) THEN +! IF (ABS(l1).GT.ABS(l2)) THEN +! l=l1; S=S1 +! ELSE +! l=l2; S=S2 +! END IF +! ELSE IF (ABS(S1).GT.ABS(S2)) THEN !though same spot again, caused by numerical inaccuray (discard shorter solution) +! l=l1; S=S1 +! ELSE +! l=l2; S=S2 +! END IF +! ELSE IF ((l1.LE.0.0).OR.(l1.GE.1.0)) THEN !if 1 is not a valid intersection -> 2 +! l = l2; S = S2 +! ELSE !1 is valid intersection +! IF ((S1.LE.0.0)) THEN !1 would be moving backwards -> 2 +! l = l2; S = S2 +! ELSE +! IF ((l2.GT.0.0).AND.(l2.LT.1.0).AND.(S2.GT.0.0)) THEN !1 and 2 valid -> chose shorter one +! IF (S2.GT.S1) THEN +! l=l1; S=S1 +! ELSE +! l=l2; S=S2 +! END IF +! ELSE !1 is only valid intersection -> 1 +! l=l1; S=S1 +! END IF +! END IF +! END IF + +! END IF + +! IF((S .GT. 0.0) .AND. (0.0 .LE. l) .AND. (l .LE. 1.0)) THEN +! ThroughSide = .TRUE. +! IntersectionPos(1) = PhotonProps%PhotonLastPos(1) + S*sx +! IntersectionPos(2) = PhotonProps%PhotonLastPos(2) + S*sy +! IntersectionPos(3) = S*sz +! Distance = S +! END IF +! +! RETURN +! +!END SUBROUTINE PhotonIntersectionWithSide2D + +!SUBROUTINE RotatePhotonIn2DPlane(IntersectionPos) +!!=================================================================================================================================== +!!> Routine to check whether a photon crossed the given side. +!!=================================================================================================================================== +!! MODULES +!USE MOD_RadiationTrans_Vars, ONLY:PhotonProps +!! IMPLICIT VARIABLE HANDLING +!IMPLICIT NONE +!!----------------------------------------------------------------------------------------------------------------------------------- +!! INPUT/OUTPUT VARIABLES +!REAL, INTENT(OUT) :: IntersectionPos(3) +!!----------------------------------------------------------------------------------------------------------------------------------- +!! LOCAL VARIABLES +!REAL :: NewYPho, NewYVelo +! !=================================================================================================================================== +!PhotonProps%PhotonLastPos(1:3) = IntersectionPos(1:3) +!NewYPho = SQRT(PhotonProps%PhotonLastPos(2)**2 + PhotonProps%PhotonLastPos(3)**2) +!! Rotation: Vy' = Vy * cos(alpha) + Vz * sin(alpha) = Vy * y/y' + Vz * z/y' +!! Vz' = - Vy * sin(alpha) + Vz * cos(alpha) = - Vy * z/y' + Vz * y/y' +!! Right-hand system, using new y and z positions after tracking, position vector and velocity vector DO NOT have to +!! coincide (as opposed to Bird 1994, p. 391, where new positions are calculated with the velocity vector) +!NewYVelo = (PhotonProps%PhotonDirection(2)*PhotonProps%PhotonLastPos(2) & +! + PhotonProps%PhotonDirection(3)*PhotonProps%PhotonLastPos(3))/NewYPho +!PhotonProps%PhotonDirection(3) = (-PhotonProps%PhotonDirection(2)*PhotonProps%PhotonLastPos(3) & +! + PhotonProps%PhotonDirection(3)*PhotonProps%PhotonLastPos(2))/NewYPho +!PhotonProps%PhotonLastPos(2) = NewYPho +!PhotonProps%PhotonLastPos(3) = 0.0 +!PhotonProps%PhotonDirection(2) = NewYVelo +!PhotonProps%PhotonPos(1:3) = PhotonProps%PhotonLastPos(1:3) +! +!END SUBROUTINE RotatePhotonIn2DPlane + + + +SUBROUTINE PhotonIntersectionWithSide(iLocSide,Element,TriNum, IntersectionPos, IsMortar) +!--------------------------------------------------------------------------------------------------! +!Based on PerfectReflection3D +!--------------------------------------------------------------------------------------------------! +USE MOD_Particle_Mesh_Vars, ONLY : GEO, ElemSideNodeID_Shared, NodeCoords_Shared +USE MOD_RadiationTrans_Vars, ONLY:PhotonProps +USE MOD_Mesh_Tools ,ONLY: GetCNElemID +!--------------------------------------------------------------------------------------------------! + IMPLICIT NONE ! +!--------------------------------------------------------------------------------------------------! +! argument list declaration ! + INTEGER,INTENT(IN) :: iLocSide ! + INTEGER,INTENT(IN) :: Element ! + INTEGER,INTENT(IN) :: TriNum ! + REAL,INTENT(OUT) :: IntersectionPos(1:3) + LOGICAL, INTENT(IN), OPTIONAL :: IsMortar +! Local variable declaration ! + INTEGER :: CNElemID + INTEGER :: Node1, Node2 ! + REAL :: PoldX, PoldY, PoldZ, nx, ny, nz, nVal ! + REAL :: bx,by,bz, ax,ay,az, dist + REAL :: xNod, yNod, zNod,IntersecPara ! + REAL :: Vector1(1:3), Vector2(1:3), VectorShift(1:3) ! +!--------------------------------------------------------------------------------------------------! +!--------------------------------------------------------------------------------------------------! + + CNElemID = GetCNElemID(Element) + + PoldX = PhotonProps%PhotonLastPos(1) + PoldY = PhotonProps%PhotonLastPos(2) + PoldZ = PhotonProps%PhotonLastPos(3) + + xNod = NodeCoords_Shared(1,ElemSideNodeID_Shared(1,iLocSide,CNElemID)+1) + yNod = NodeCoords_Shared(2,ElemSideNodeID_Shared(1,iLocSide,CNElemID)+1) + zNod = NodeCoords_Shared(3,ElemSideNodeID_Shared(1,iLocSide,CNElemID)+1) + + !---- Calculate normal vector: + IF(PRESENT(IsMortar)) THEN + Node1 = TriNum+2 ! normal = cross product of 1-2 and 1-3 for first triangle + Node2 = TriNum+1 ! and 1-3 and 1-4 for second triangle + ELSE + Node1 = TriNum+1 ! normal = cross product of 1-2 and 1-3 for first triangle + Node2 = TriNum+2 ! and 1-3 and 1-4 for second triangle + END IF + + Vector1(1) = NodeCoords_Shared(1,ElemSideNodeID_Shared(Node1,iLocSide,CNElemID)+1) - xNod + Vector1(2) = NodeCoords_Shared(2,ElemSideNodeID_Shared(Node1,iLocSide,CNElemID)+1) - yNod + Vector1(3) = NodeCoords_Shared(3,ElemSideNodeID_Shared(Node1,iLocSide,CNElemID)+1) - zNod + + Vector2(1) = NodeCoords_Shared(1,ElemSideNodeID_Shared(Node2,iLocSide,CNElemID)+1) - xNod + Vector2(2) = NodeCoords_Shared(2,ElemSideNodeID_Shared(Node2,iLocSide,CNElemID)+1) - yNod + Vector2(3) = NodeCoords_Shared(3,ElemSideNodeID_Shared(Node2,iLocSide,CNElemID)+1) - zNod + + nx = Vector1(2) * Vector2(3) - Vector1(3) * Vector2(2) + ny = Vector1(3) * Vector2(1) - Vector1(1) * Vector2(3) + nz = Vector1(1) * Vector2(2) - Vector1(2) * Vector2(1) + + nVal = SQRT(nx*nx + ny*ny + nz*nz) + + nx = nx/nVal + ny = ny/nVal + nz = nz/nVal + + !---- Calculate Intersection + + bx = PoldX - xNod + by = PoldY - yNod + bz = PoldZ - zNod + + ax = bx - nx * (bx * nx + by * ny + bz * nz) + ay = by - ny * (bx * nx + by * ny + bz * nz) + az = bz - nz * (bx * nx + by * ny + bz * nz) + + dist = SQRT(((ay * bz - az * by) * (ay * bz - az * by) + & + (az * bx - ax * bz) * (az * bx - ax * bz) + & + (ax * by - ay * bx) * (ax * by - ay * bx))/ & + (ax * ax + ay * ay + az * az)) + + ! If vector from old point to new point goes through the node, a will be x_photon_startro + ! dist is then simply length of vector b instead of |axb|/|a| + IF (dist.NE.dist) dist = SQRT(bx*bx+by*by+bz*bz) + + VectorShift(1) = PhotonProps%PhotonDirection(1) + VectorShift(2) = PhotonProps%PhotonDirection(2) + VectorShift(3) = PhotonProps%PhotonDirection(3) + + IntersecPara = VectorShift(1) * nx + VectorShift(2) * ny + VectorShift(3) * nz + IntersecPara = dist / IntersecPara + + IntersectionPos(1) = PoldX + IntersecPara * VectorShift(1) + IntersectionPos(2) = PoldY + IntersecPara * VectorShift(2) + IntersectionPos(3) = PoldZ + IntersecPara * VectorShift(3) + + RETURN +END SUBROUTINE PhotonIntersectionWithSide + + +SUBROUTINE CalcAbsoprtionMC(IntersectionPos,Element, DONE) +!--------------------------------------------------------------------------------------------------! +!Based on PerfectReflection3D +!--------------------------------------------------------------------------------------------------! +USE MOD_RadiationTrans_Vars, ONLY:PhotonProps,RadiationElemAbsEnergy +USE MOD_Radiation_Vars, ONLY:Radiation_Absorption_spec +!--------------------------------------------------------------------------------------------------! + IMPLICIT NONE ! +!--------------------------------------------------------------------------------------------------! +! argument list declaration ! + INTEGER, INTENT(IN) :: Element + REAL, INTENT(IN) :: IntersectionPos(3) + LOGICAL, INTENT(OUT) :: DONE +! Local variable declaration ! +!--------------------------------------------------------------------------------------------------! + REAL :: iRan, DistanceVec(3), Distance +!--------------------------------------------------------------------------------------------------! + DistanceVec(1:3) = PhotonProps%PhotonPos(1:3) - IntersectionPos(1:3) + Distance = SQRT(DistanceVec(1)*DistanceVec(1) + DistanceVec(2)*DistanceVec(2) + DistanceVec(3)*DistanceVec(3)) + CALL RANDOM_NUMBER(iRan) + IF (-LOG(iRan).LT.(Distance*Radiation_Absorption_Spec(PhotonProps%WaveLength,Element))) THEN + RadiationElemAbsEnergy(Element) = RadiationElemAbsEnergy(Element) + PhotonProps%PhotonEnergy + DONE = .TRUE. + ELSE + PhotonProps%PhotonPos(1:3) = IntersectionPos(1:3) + END IF + +END SUBROUTINE CalcAbsoprtionMC + +SUBROUTINE CalcAbsoprtionAnalytic(IntersectionPos,Element, DONE) +!DEC$ ATTRIBUTES FORCEINLINE :: ParticleThroughSideLastPosCheck + USE MOD_Globals + USE MOD_RadiationTrans_Vars, ONLY:PhotonProps, RadTrans + USE MOD_RadiationTrans_Vars, ONLY:RadiationElemAbsEnergy + USE MOD_Radiation_Vars, ONLY:Radiation_Absorption_spec +!--------------------------------------------------------------------------------------------------! + IMPLICIT NONE ! +!--------------------------------------------------------------------------------------------------! +! argument list declaration ! + INTEGER, INTENT(IN) :: Element + REAL, INTENT(IN) :: IntersectionPos(3) + LOGICAL, INTENT(OUT) :: DONE +! Local variable declaration ! +!--------------------------------------------------------------------------------------------------! + REAL :: DistanceVec(3), Distance, LostEnergy, maz_photon_startxp, opticalPath +!--------------------------------------------------------------------------------------------------! + maz_photon_startxp = LOG(HUGE(maz_photon_startxp)) + DistanceVec(1:3) = PhotonProps%PhotonPos(1:3) - IntersectionPos(1:3) + Distance = SQRT(DistanceVec(1)*DistanceVec(1) + DistanceVec(2)*DistanceVec(2) + DistanceVec(3)*DistanceVec(3)) + opticalPath = Distance*Radiation_Absorption_Spec(PhotonProps%WaveLength,Element) + IF (opticalPath.GT.maz_photon_startxp) THEN + LostEnergy = PhotonProps%PhotonEnergy + ELSE + LostEnergy = PhotonProps%PhotonEnergy *(1.-EXP(-opticalPath)) + END IF + PhotonProps%PhotonEnergy = PhotonProps%PhotonEnergy - LostEnergy + RadiationElemAbsEnergy(Element) = RadiationElemAbsEnergy(Element) + LostEnergy + IF (PhotonProps%PhotonEnergy.LE.(RadTrans%GlobalRadiationPower/(1000.*RadTrans%GlobalPhotonNum))) THEN + DONE = .TRUE. + ELSE + PhotonProps%PhotonPos(1:3) = IntersectionPos(1:3) + END IF + +END SUBROUTINE CalcAbsoprtionAnalytic + +SUBROUTINE CalcAbsoprtion(IntersectionPos,Element, DONE) + USE MOD_Globals + USE MOD_RadiationTrans_Vars, ONLY : RadiationAbsorptionModel +!--------------------------------------------------------------------------------------------------! + IMPLICIT NONE ! +!--------------------------------------------------------------------------------------------------! +! argument list declaration ! + INTEGER, INTENT(IN) :: Element + REAL, INTENT(IN) :: IntersectionPos(3) + LOGICAL, INTENT(INOUT) :: DONE +! Local variable declaration ! +!--------------------------------------------------------------------------------------------------! +!--------------------------------------------------------------------------------------------------! + IF (RadiationAbsorptionModel.EQ.1) THEN + CALL CalcAbsoprtionAnalytic(IntersectionPos,Element, DONE) + ELSE IF (RadiationAbsorptionModel.EQ.2) THEN + CALL CalcAbsoprtionMC(IntersectionPos,Element, DONE) + ELSE + CALL Abort(& + __STAMP__,& + 'AbsorptionModel must be 1 or 2!') + END IF + +END SUBROUTINE CalcAbsoprtion + +SUBROUTINE PerfectPhotonReflection(iLocSide,Element,TriNum, IntersectionPos, IntersecAlreadyCalc) +!--------------------------------------------------------------------------------------------------! +!Based on PerfectReflection3D +!--------------------------------------------------------------------------------------------------! + USE MOD_Particle_Mesh_Vars, ONLY : GEO, NodeCoords_Shared, ElemSideNodeID_Shared + USE MOD_RadiationTrans_Vars, ONLY : PhotonProps + USE MOD_Mesh_Tools ,ONLY: GetCNElemID +!--------------------------------------------------------------------------------------------------! + IMPLICIT NONE ! +!--------------------------------------------------------------------------------------------------! +! argument list declaration ! + INTEGER,INTENT(IN) :: iLocSide ! + INTEGER,INTENT(IN) :: Element ! + INTEGER,INTENT(IN) :: TriNum ! + REAL, INTENT(INOUT) :: IntersectionPos(1:3) + LOGICAL, INTENT(IN) :: IntersecAlreadyCalc + ! Local variable declaration + INTEGER :: CNElemID + INTEGER :: Node1, Node2 ! + REAL :: PoldX, PoldY, PoldZ, nx, ny, nz, nVal ! + REAL :: xNod, yNod, zNod + REAL :: VelX, VelY, VelZ + REAL :: Vector1(1:3), Vector2(1:3), POI_fak, ProjVel +!--------------------------------------------------------------------------------------------------! +!--------------------------------------------------------------------------------------------------! + + CNElemID = GetCNElemID(Element) + PoldX = PhotonProps%PhotonLastPos(1) + PoldY = PhotonProps%PhotonLastPos(2) + PoldZ = PhotonProps%PhotonLastPos(3) + + VelX = PhotonProps%PhotonDirection(1) + VelY = PhotonProps%PhotonDirection(2) + VelZ = PhotonProps%PhotonDirection(3) + + xNod = NodeCoords_Shared(1,ElemSideNodeID_Shared(1,iLocSide,CNElemID)+1) + yNod = NodeCoords_Shared(2,ElemSideNodeID_Shared(1,iLocSide,CNElemID)+1) + zNod = NodeCoords_Shared(3,ElemSideNodeID_Shared(1,iLocSide,CNElemID)+1) + + !---- Calculate normal vector: + + Node1 = TriNum+1 ! normal = cross product of 1-2 and 1-3 for first triangle + Node2 = TriNum+2 ! and 1-3 and 1-4 for second triangle + + Vector1(1) = NodeCoords_Shared(1,ElemSideNodeID_Shared(Node1,iLocSide,CNElemID)+1) - xNod + Vector1(2) = NodeCoords_Shared(2,ElemSideNodeID_Shared(Node1,iLocSide,CNElemID)+1) - yNod + Vector1(3) = NodeCoords_Shared(3,ElemSideNodeID_Shared(Node1,iLocSide,CNElemID)+1) - zNod + + Vector2(1) = NodeCoords_Shared(1,ElemSideNodeID_Shared(Node2,iLocSide,CNElemID)+1) - xNod + Vector2(2) = NodeCoords_Shared(2,ElemSideNodeID_Shared(Node2,iLocSide,CNElemID)+1) - yNod + Vector2(3) = NodeCoords_Shared(3,ElemSideNodeID_Shared(Node2,iLocSide,CNElemID)+1) - zNod + + nx = Vector1(2) * Vector2(3) - Vector1(3) * Vector2(2) + ny = Vector1(3) * Vector2(1) - Vector1(1) * Vector2(3) + nz = Vector1(1) * Vector2(2) - Vector1(2) * Vector2(1) + + nVal = SQRT(nx*nx + ny*ny + nz*nz) + + nx = nx/nVal + ny = ny/nVal + nz = nz/nVal + + !---- Calculate Point of Intersection (POI) + IF (.NOT.IntersecAlreadyCalc) THEN + POI_fak = (Vector2(2)*(Vector1(1)*(zNod-PoldZ)+Vector1(3)*(PoldX-xNod)) & + +Vector1(2)*(Vector2(1)*(PoldZ-zNod)+Vector2(3)*(xNod-PoldX)) & + +yNod*(Vector1(3)*Vector2(1)-Vector1(1)*Vector2(3)) & + +PoldY*(Vector1(1)*Vector2(3)-Vector1(3)*Vector2(1))) & + /(Vector1(2)*(Vector2(3)*VelX-Vector2(1)*VelZ) & + + Vector2(2)*(Vector1(1)*VelZ-Vector1(3)*VelX) & + + VelY*(Vector1(3)*Vector2(1)-Vector1(1)*Vector2(3))) + + IntersectionPos(1) = PoldX + POI_fak * VelX + IntersectionPos(2) = PoldY + POI_fak * VelY + IntersectionPos(3) = PoldZ + POI_fak * VelZ + END IF + + !---- Calculate new velocity vector + ProjVel = nx*PhotonProps%PhotonDirection(1)+ny*PhotonProps%PhotonDirection(2) & + +nz*PhotonProps%PhotonDirection(3) + VelX=PhotonProps%PhotonDirection(1)-2.*ProjVel*nx + VelY=PhotonProps%PhotonDirection(2)-2.*ProjVel*ny + VelZ=PhotonProps%PhotonDirection(3)-2.*ProjVel*nz + + !---- Assign new values to "old" variables to continue loop + + PhotonProps%PhotonLastPos(1) = IntersectionPos(1) + PhotonProps%PhotonLastPos(2) = IntersectionPos(2) + PhotonProps%PhotonLastPos(3) = IntersectionPos(3) + + PhotonProps%PhotonDirection(1) = VelX + PhotonProps%PhotonDirection(2) = VelY + PhotonProps%PhotonDirection(3) = VelZ + RETURN +END SUBROUTINE PerfectPhotonReflection + + + +!SUBROUTINE PerfectPhotonReflection2D(iLocSide,ElemID, IntersectionPos) +!!--------------------------------------------------------------------------------------------------! +!!Based on PerfectReflection3D +!!--------------------------------------------------------------------------------------------------! +! USE MOD_Particle_Mesh_Vars, ONLY : GEO, Part2DSideNormalEdge +! USE MOD_RadiationTrans_Vars, ONLY : PhotonProps +!!--------------------------------------------------------------------------------------------------! +! IMPLICIT NONE ! +!!--------------------------------------------------------------------------------------------------! +!! argument list declaration ! +! INTEGER,INTENT(IN) :: iLocSide ! +! INTEGER,INTENT(IN) :: ElemID ! +! REAL, INTENT(INOUT) :: IntersectionPos(1:3) +! ! Local variable declaration ! +! INTEGER :: Node1, Node2 ! +! REAL :: PoldX, PoldY, PoldZ, nx, ny, nz, nVal, nytmp, nValIntersec +! REAL :: xNod, yNod, zNod +! REAL :: VelX, VelY, VelZ +! REAL :: Vector1(1:3), Vector2(1:3), POI_fak, ProjVel +!!--------------------------------------------------------- -----------------------------------------! +!!--------------------------------------------------------------------------------------------------! +! nx = Part2DSideNormalEdge(iLocSide, 1, ElemID) +! nValIntersec = SQRT(IntersectionPos(2)*IntersectionPos(2) + IntersectionPos(3)*IntersectionPos(3)) +! ny = IntersectionPos(2)/nValIntersec * Part2DSideNormalEdge(iLocSide,2, ElemID) +! nz = IntersectionPos(3)/nValIntersec * Part2DSideNormalEdge(iLocSide,2, ElemID) + +! !---- Calculate new velocity vector +! ProjVel = nx*PhotonProps%PhotonDirection(1)+ny*PhotonProps%PhotonDirection(2) & +! +nz*PhotonProps%PhotonDirection(3) +! VelX=PhotonProps%PhotonDirection(1)-2.*ProjVel*nx +! VelY=PhotonProps%PhotonDirection(2)-2.*ProjVel*ny +! VelZ=PhotonProps%PhotonDirection(3)-2.*ProjVel*nz + +! !---- Assign new values to "old" variables to continue loop + +! PhotonProps%PhotonLastPos(1) = IntersectionPos(1) +! PhotonProps%PhotonLastPos(2) = IntersectionPos(2) +! PhotonProps%PhotonLastPos(3) = IntersectionPos(3) + +! PhotonProps%PhotonDirection(1) = VelX +! PhotonProps%PhotonDirection(2) = VelY +! PhotonProps%PhotonDirection(3) = VelZ +!END SUBROUTINE PerfectPhotonReflection2D + +SUBROUTINE DiffusePhotonReflection(iLocSide,Element,TriNum, IntersectionPos, IntersecAlreadyCalc) +!--------------------------------------------------------------------------------------------------! +!Based on PerfectReflection3D +!--------------------------------------------------------------------------------------------------! + USE MOD_Particle_Mesh_Vars, ONLY : GEO, ElemSideNodeID_Shared, NodeCoords_Shared + USE MOD_RadiationTrans_Vars, ONLY : PhotonProps + USE Ziggurat + USE MOD_Mesh_Tools ,ONLY: GetCNElemID +!--------------------------------------------------------------------------------------------------! + IMPLICIT NONE ! +!--------------------------------------------------------------------------------------------------! +! argument list declaration ! + INTEGER,INTENT(IN) :: iLocSide ! + INTEGER,INTENT(IN) :: Element ! + INTEGER,INTENT(IN) :: TriNum ! + REAL, INTENT(INOUT) :: IntersectionPos(1:3) + LOGICAL, INTENT(IN) :: IntersecAlreadyCalc + ! Local variable declaration ! + INTEGER :: CNElemID + INTEGER :: Node1, Node2 ! + REAL :: PoldX, PoldY, PoldZ, nx, ny, nz, nVal ! + REAL :: xNod, yNod, zNod, VecX, VecY, VecZ + REAL :: VelX, VelY, VelZ, VeloCx, VeloCy, VeloCz, NormVec, RanNum + REAL :: Vector1(1:3), Vector2(1:3), POI_fak +!--------------------------------------------------------------------------------------------------! +!--------------------------------------------------------------------------------------------------! + CNElemID = GetCNElemID(Element) + PoldX = PhotonProps%PhotonLastPos(1) + PoldY = PhotonProps%PhotonLastPos(2) + PoldZ = PhotonProps%PhotonLastPos(3) + + VelX = PhotonProps%PhotonDirection(1) + VelY = PhotonProps%PhotonDirection(2) + VelZ = PhotonProps%PhotonDirection(3) + + xNod = NodeCoords_Shared(1,ElemSideNodeID_Shared(1,iLocSide,CNElemID)+1) + yNod = NodeCoords_Shared(2,ElemSideNodeID_Shared(1,iLocSide,CNElemID)+1) + zNod = NodeCoords_Shared(3,ElemSideNodeID_Shared(1,iLocSide,CNElemID)+1) + + !---- Calculate normal vector: + + Node1 = TriNum+1 ! normal = cross product of 1-2 and 1-3 for first triangle + Node2 = TriNum+2 ! and 1-3 and 1-4 for second triangle + + Vector1(1) = NodeCoords_Shared(1,ElemSideNodeID_Shared(Node1,iLocSide,CNElemID)+1) - xNod + Vector1(2) = NodeCoords_Shared(2,ElemSideNodeID_Shared(Node1,iLocSide,CNElemID)+1) - yNod + Vector1(3) = NodeCoords_Shared(3,ElemSideNodeID_Shared(Node1,iLocSide,CNElemID)+1) - zNod + + Vector2(1) = NodeCoords_Shared(1,ElemSideNodeID_Shared(Node2,iLocSide,CNElemID)+1) - xNod + Vector2(2) = NodeCoords_Shared(2,ElemSideNodeID_Shared(Node2,iLocSide,CNElemID)+1) - yNod + Vector2(3) = NodeCoords_Shared(3,ElemSideNodeID_Shared(Node2,iLocSide,CNElemID)+1) - zNod + + nx = Vector1(2) * Vector2(3) - Vector1(3) * Vector2(2) + ny = Vector1(3) * Vector2(1) - Vector1(1) * Vector2(3) + nz = Vector1(1) * Vector2(2) - Vector1(2) * Vector2(1) + + nVal = SQRT(nx*nx + ny*ny + nz*nz) + + nx = nx/nVal + ny = ny/nVal + nz = nz/nVal + + !---- Calculate Point of Intersection (POI) + !---- Calculate Point of Intersection (POI) + IF (.NOT.IntersecAlreadyCalc) THEN + POI_fak = (Vector2(2)*(Vector1(1)*(zNod-PoldZ)+Vector1(3)*(PoldX-xNod)) & + +Vector1(2)*(Vector2(1)*(PoldZ-zNod)+Vector2(3)*(xNod-PoldX)) & + +yNod*(Vector1(3)*Vector2(1)-Vector1(1)*Vector2(3)) & + +PoldY*(Vector1(1)*Vector2(3)-Vector1(3)*Vector2(1))) & + /(Vector1(2)*(Vector2(3)*VelX-Vector2(1)*VelZ) & + + Vector2(2)*(Vector1(1)*VelZ-Vector1(3)*VelX) & + + VelY*(Vector1(3)*Vector2(1)-Vector1(1)*Vector2(3))) + + IntersectionPos(1) = PoldX + POI_fak * VelX + IntersectionPos(2) = PoldY + POI_fak * VelY + IntersectionPos(3) = PoldZ + POI_fak * VelZ + END IF + !---- Calculate new velocity vector (Extended Maxwellian Model) + + VeloCx = rnor() !normal distri + VeloCy = rnor() !normal distri + CALL RANDOM_NUMBER(RanNum) + VeloCz = SQRT(-2.*LOG(RanNum)) ! rayleigh distri + + !---- Transformation local distribution -> global coordinates + VecX = Vector1(1) / SQRT( Vector1(1)**2 + Vector1(2)**2 + Vector1(3)**2 ) + VecY = Vector1(2) / SQRT( Vector1(1)**2 + Vector1(2)**2 + Vector1(3)**2 ) + VecZ = Vector1(3) / SQRT( Vector1(1)**2 + Vector1(2)**2 + Vector1(3)**2 ) + + VelX = VecX*VeloCx + (nz*VecY-ny*VecZ)*VeloCy - nx*VeloCz + VelY = VecY*VeloCx + (nx*VecZ-nz*VecX)*VeloCy - ny*VeloCz + VelZ = VecZ*VeloCx + (ny*VecX-nx*VecY)*VeloCy - nz*VeloCz + !---- Assign new values to "old" variables to continue loop + + PhotonProps%PhotonLastPos(1) = IntersectionPos(1) + PhotonProps%PhotonLastPos(2) = IntersectionPos(2) + PhotonProps%PhotonLastPos(3) = IntersectionPos(3) + + !---- saving new particle velocity + NormVec = SQRT(VelX*VelX + VelY*VelY + VelZ*VelZ) + PhotonProps%PhotonDirection(1) = VelX / NormVec + PhotonProps%PhotonDirection(2) = VelY / NormVec + PhotonProps%PhotonDirection(3) = VelZ / NormVec + + RETURN +END SUBROUTINE DiffusePhotonReflection + + +!SUBROUTINE DiffusePhotonReflection2D(iLocSide,ElemID, IntersectionPos) +!!--------------------------------------------------------------------------------------------------! +!!Based on PerfectReflection3D +!!--------------------------------------------------------------------------------------------------! +! USE MOD_Particle_Mesh_Vars, ONLY : GEO, Part2DSideNormalEdge +! USE MOD_RadiationTrans_Vars, ONLY : PhotonProps +! USE Ziggurat +!!--------------------------------------------------------------------------------------------------! +! IMPLICIT NONE ! +!!--------------------------------------------------------------------------------------------------! +!! argument list declaration ! +! INTEGER,INTENT(IN) :: iLocSide ! +! INTEGER,INTENT(IN) :: ElemID ! +! REAL, INTENT(IN) :: IntersectionPos(1:3) +! ! Local variable declaration ! +! REAL :: nx, ny, nz, nValIntersec, VecX, VecY, VecZ +! REAL :: VelX, VelY, VelZ, VeloCx, VeloCy, VeloCz, NormVec, RanNum +!!--------------------------------------------------------------------------------------------------! +!!--------------------------------------------------------------------------------------------------! +! nx = Part2DSideNormalEdge(iLocSide, 1, ElemID) +! nValIntersec = SQRT(IntersectionPos(2)*IntersectionPos(2) + IntersectionPos(3)*IntersectionPos(3)) +! ny = IntersectionPos(2)/nValIntersec * Part2DSideNormalEdge(iLocSide,2, ElemID) +! nz = IntersectionPos(3)/nValIntersec * Part2DSideNormalEdge(iLocSide,2, ElemID) + +! VecX = Part2DSideNormalEdge(iLocSide, 3, ElemID) +! VecY = IntersectionPos(2)/nValIntersec * Part2DSideNormalEdge(iLocSide,4, ElemID) +! VecZ = IntersectionPos(3)/nValIntersec * Part2DSideNormalEdge(iLocSide,4, ElemID) +! !---- Calculate new velocity vector (Extended Maxwellian Model) + +! VeloCx = rnor() !normal distri +! VeloCy = rnor() !normal distri +! CALL RANDOM_NUMBER(RanNum) +! VeloCz = SQRT(-2.*LOG(RanNum)) ! rayleigh distri +! +! VelX = VecX*VeloCx + (nz*VecY-ny*VecZ)*VeloCy - nx*VeloCz +! VelY = VecY*VeloCx + (nx*VecZ-nz*VecX)*VeloCy - ny*VeloCz +! VelZ = VecZ*VeloCx + (ny*VecX-nx*VecY)*VeloCy - nz*VeloCz +! !---- Assign new values to "old" variables to continue loop + +! PhotonProps%PhotonLastPos(1) = IntersectionPos(1) +! PhotonProps%PhotonLastPos(2) = IntersectionPos(2) +! PhotonProps%PhotonLastPos(3) = IntersectionPos(3) +! +! !---- saving new particle velocity +! NormVec = SQRT(VelX*VelX + VelY*VelY + VelZ*VelZ) +! PhotonProps%PhotonDirection(1) = VelX / NormVec +! PhotonProps%PhotonDirection(2) = VelY / NormVec +! PhotonProps%PhotonDirection(3) = VelZ / NormVec + +!END SUBROUTINE DiffusePhotonReflection2D + +SUBROUTINE CalcWallAbsoprtion(GlobSideID, DONE) + USE MOD_RadiationTrans_Vars, ONLY : PhotonSampWall, PhotonProps + USE MOD_Particle_Boundary_Vars, ONLY:PartBound, GlobalSide2SurfSide + USE MOD_Particle_Mesh_Vars ,ONLY: SideInfo_Shared +!--------------------------------------------------------------------------------------------------! + IMPLICIT NONE ! +!--------------------------------------------------------------------------------------------------! +! argument list declaration ! + INTEGER, INTENT(IN) :: GlobSideID + LOGICAL, INTENT(OUT) :: DONE +! Local variable declaration ! +!--------------------------------------------------------------------------------------------------! + REAL :: iRan + INTEGER :: SurfSideID +!--------------------------------------------------------------------------------------------------! + SurfSideID = GlobalSide2SurfSide(SURF_SIDEID,GlobSideID) + CALL RANDOM_NUMBER(iRan) + IF (PartBound%PhotonEnACC(PartBound%MapToPartBC(SideInfo_Shared(SIDE_BCID,GlobSideID))).GT.iRan) THEN + DONE = .TRUE. + PhotonSampWall(1,SurfSideID) = PhotonSampWall(1,SurfSideID) + 1. + PhotonSampWall(2,SurfSideID) = PhotonSampWall(2,SurfSideID) + PhotonProps%PhotonEnergy + END IF + +END SUBROUTINE CalcWallAbsoprtion + +END MODULE MOD_Photon_TrackingTools diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 new file mode 100644 index 000000000..66cafc94d --- /dev/null +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 @@ -0,0 +1,489 @@ +!================================================================================================================================== +! Copyright (c) 2010 - 2018 Prof. Claus-Dieter Munz and Prof. Stefanos Fasoulas +! +! This file is part of PICLas (gitlab.com/piclas/piclas). PICLas is free software: you can redistribute it and/or modify +! it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 +! of the License, or (at your option) any later version. +! +! PICLas is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty +! of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License v3.0 for more details. +! +! You should have received a copy of the GNU General Public License along with PICLas. If not, see . +!================================================================================================================================== +#include "piclas.h" + +MODULE MOD_Photon_Tracking +!=================================================================================================================================== +! Contains global variables provided by the particle surfaces routines +!=================================================================================================================================== +! MODULES +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +PUBLIC + +INTERFACE PhotonTriaTracking + MODULE PROCEDURE PhotonTriaTracking +END INTERFACE + +PUBLIC::PhotonTriaTracking!, Photon2DSymTracking +!----------------------------------------------------------------------------------------------------------------------------------- +!----------------------------------------------------------------------------------------------------------------------------------- +!=================================================================================================================================== + +CONTAINS + +SUBROUTINE PhotonTriaTracking() +!=================================================================================================================================== +! Routine for tracking of moving particles and boundary interaction using triangulated sides. +! 1) Loop over all particles that are still inside +! 2) Perform tracking until the particle is considered "done" (either localized or deleted) +! 2a) Perform a check based on the determinant of (3x3) matrix of the vectors from the particle position to the nodes of each +! triangle (ParticleInsideQuad3D) +! 2b) If particle is not within the given element in a), the side through which the particle went is determined by checking +! each side of the element (ParticleThroughSideCheck3DFast) +! 2c) If no sides are found, the particle is deleted (very rare case). If multiple possible sides are found, additional +! treatment is required, where the particle path is reconstructed (which side was crossed first) by comparing the ratio +! the determinants +! 3) In case of a boundary, determine the intersection and perform the appropriate boundary interaction (GetBoundaryInteraction) +!=================================================================================================================================== +! MODULES +USE MOD_Preproc +USE MOD_Globals +USE MOD_Particle_Mesh_Vars +USE MOD_Mesh_Vars, ONLY:MortarType, BC +USE MOD_Particle_Boundary_Vars, ONLY:PartBound +USE MOD_RadiationTrans_Vars, ONLY:PhotonProps +USE MOD_Photon_TrackingTools, ONLY:PhotonThroughSideCheck3DFast, PhotonIntersectionWithSide,CalcAbsoprtion +USE MOD_Photon_TrackingTools, ONLY:PerfectPhotonReflection, DiffusePhotonReflection, CalcWallAbsoprtion +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +INTEGER :: NblocSideID, NbElemID, ind, nbSideID, nMortarElems, SideIDMortar, BCType, localSideID +INTEGER :: ElemID,OldElemID,nlocSides +INTEGER :: LocalSide +INTEGER :: NrOfThroughSides, ind2 +INTEGER :: SideID,TempSideID,iLocSide +INTEGER :: TriNum, LocSidesTemp(1:6),TriNumTemp(1:6), GlobSideTemp(1:6) +INTEGER :: SecondNrOfThroughSides, indSide +INTEGER :: DoneLastElem(1:4,1:6) ! 1:3: 1=Element,2=LocalSide,3=TriNum 1:2: 1=last 2=beforelast +LOGICAL :: ThroughSide, Done +LOGICAL :: crossedBC, oldElemIsMortar, isMortarSideTemp(1:6), doCheckSide +REAL :: minRatio, intersecDist, intersecDistVec(3) +REAL :: IntersectionPos(1:3), IntersectionPosTemp(1:3) +REAL, PARAMETER :: eps = 0 + +!=================================================================================================================================== +Done = .FALSE. +ElemID = PhotonProps%ElemID +SideID = 0 +DoneLastElem(:,:) = 0 +! 1) Loop tracking until Photon is considered "done" (either absorbed or deleted) +DO WHILE (.NOT.Done) + oldElemIsMortar = .FALSE. + NrOfThroughSides = 0 + LocSidesTemp(:) = 0 + TriNumTemp(:) = 0 + GlobSideTemp = 0 + isMortarSideTemp = .FALSE. + nlocSides = ElemInfo_Shared(ELEM_LASTSIDEIND,ElemID) - ElemInfo_Shared(ELEM_FIRSTSIDEIND,ElemID) + DO iLocSide=1,nlocSides + TempSideID = ElemInfo_Shared(ELEM_FIRSTSIDEIND,ElemID) + iLocSide + localSideID = SideInfo_Shared(SIDE_LOCALID,TempSideID) + + ! Side is not one of the 6 local sides + IF (localSideID.LE.0) CYCLE + NbElemID = SideInfo_Shared(SIDE_NBELEMID,TempSideID) + IF (NbElemID.LT.0) THEN ! Mortar side + nMortarElems = MERGE(4,2,SideInfo_Shared(SIDE_NBELEMID,TempSideID).EQ.-1) + DO ind = 1, nMortarElems + nbSideID = ElemInfo_Shared(ELEM_FIRSTSIDEIND,ElemID) + iLocSide + ind + NbElemID = SideInfo_Shared(SIDE_NBELEMID,nbSideID) + ! If small mortar element not defined, abort. Every available information on the compute-node is kept in shared memory, so + ! no way to recover it during runtime + IF (NbElemID.LT.1) CALL ABORT(__STAMP__,'Small mortar element not defined!',ElemID) + ! For small mortar sides, SIDE_NBSIDEID contains the SideID of the corresponding big mortar side + nbSideID = SideInfo_Shared(SIDE_NBSIDEID,nbSideID) + NblocSideID = SideInfo_Shared(SIDE_LOCALID,nbSideID) + DO TriNum = 1,2 + ThroughSide = .FALSE. + CALL PhotonThroughSideCheck3DFast(NblocSideID,NbElemID,ThroughSide,TriNum, .TRUE.) + IF (ThroughSide) THEN + ! Store the information for this side for future checks, if this side was already treated + oldElemIsMortar = .TRUE. + NrOfThroughSides = NrOfThroughSides + 1 + LocSidesTemp(NrOfThroughSides) = NblocSideID + TriNumTemp(NrOfThroughSides) = TriNum + GlobSideTemp(NrOfThroughSides) = nbSideID + isMortarSideTemp(NrOfThroughSides) = .TRUE. + SideID = nbSideID + LocalSide = NblocSideID + END IF + END DO + END DO + ELSE ! Regular side + DO TriNum = 1,2 + ThroughSide = .FALSE. + CALL PhotonThroughSideCheck3DFast(localSideID,ElemID,ThroughSide,TriNum) + IF (ThroughSide) THEN + NrOfThroughSides = NrOfThroughSides + 1 + LocSidesTemp(NrOfThroughSides) = localSideID + TriNumTemp(NrOfThroughSides) = TriNum + GlobSideTemp(NrOfThroughSides) = TempSideID + SideID = TempSideID + LocalSide = localSideID + END IF + END DO + END IF ! Mortar or regular side + END DO ! iLocSide=1,6 + TriNum = TriNumTemp(1) + ! ---------------------------------------------------------------------------- + ! Addition treatment if particle did not cross any sides or it crossed multiple sides + IF (NrOfThroughSides.NE.1) THEN + ! 2c) If no sides are found, the particle is deleted (very rare case). If multiple possible sides are found, additional + ! treatment is required, where the particle path is reconstructed (which side was crossed first) by comparing the ratio + ! the determinants + IF (NrOfThroughSides.EQ.0) THEN + ! Particle appears to have not crossed any of the checked sides. Deleted! + IPWRITE(*,*) 'Error in Photon TriaTracking! Photon lost. Element:', ElemID + IPWRITE(*,*) 'LastPos: ', PhotonProps%PhotonLastPos(1:3) + IPWRITE(*,*) 'Pos: ', PhotonProps%PhotonPos(1:3) + IPWRITE(*,*) 'Direction:', PhotonProps%PhotonDirection(1:3) + IPWRITE(*,*) 'Photon deleted!' + Done = .TRUE. + EXIT + ELSE IF (NrOfThroughSides.GT.1) THEN + ! Use the slower search method if particle appears to have crossed more than one side (possible for irregular hexagons + ! and in the case of mortar elements) + SecondNrOfThroughSides = 0 + minRatio = 1E90 + oldElemIsMortar = .FALSE. + DO ind2 = 1, NrOfThroughSides + doCheckSide = .TRUE. + ! Check if this side was already treated + DO indSide = 2, 6 + IF((DoneLastElem(1,indSide).EQ.ElemID).AND. & + (DoneLastElem(4,indSide).EQ.GlobSideTemp(ind2)).AND. & + (DoneLastElem(3,indSide).EQ.TriNumTemp(ind2))) THEN + doCheckSide = .FALSE. + END IF + END DO + IF (doCheckSide) THEN + IF (isMortarSideTemp(ind2)) THEN ! Mortar side + NbElemID = SideInfo_Shared(SIDE_ELEMID,GlobSideTemp(ind2)) + ! Get the determinant between the old and new particle position and the nodes of the triangle which was crossed + CALL PhotonIntersectionWithSide(LocSidesTemp(ind2),NbElemID,TriNumTemp(ind2), IntersectionPosTemp, .TRUE.) + intersecDistVec(1:3) = IntersectionPosTemp(1:3) - PhotonProps%PhotonLastPos(1:3) + intersecDist = DOT_PRODUCT(intersecDistVec, intersecDistVec) + ! If the particle is inside the neighboring mortar element, it moved through this side + ! Ratio is always negative since detM(=detLastPartPos) is negative or zero, i.e. maximum abs is wanted + ! The closer the intersected side is to the last particle position the greater the absolute ratio will be + IF (intersecDist.LT.minRatio) THEN + IntersectionPos = IntersectionPosTemp + minRatio = intersecDist + SecondNrOfThroughSides = SecondNrOfThroughSides + 1 + SideID = GlobSideTemp(ind2) + LocalSide = LocSidesTemp(ind2) + TriNum = TriNumTemp(ind2) + oldElemIsMortar = .TRUE. + END IF + ELSE ! Regular side + CALL PhotonIntersectionWithSide(LocSidesTemp(ind2),NbElemID,TriNumTemp(ind2), IntersectionPosTemp) + intersecDistVec(1:3) = IntersectionPosTemp(1:3) - PhotonProps%PhotonLastPos(1:3) + intersecDist = DOT_PRODUCT(intersecDistVec, intersecDistVec) + IF (intersecDist.LT.minRatio) THEN + IntersectionPos = IntersectionPosTemp + minRatio = intersecDist + SecondNrOfThroughSides = SecondNrOfThroughSides + 1 + SideID = GlobSideTemp(ind2) + LocalSide = LocSidesTemp(ind2) + TriNum = TriNumTemp(ind2) + oldElemIsMortar = .FALSE. + END IF + END IF ! isMortarSideTemp = T/F + END IF ! doCheckSide + END DO ! ind2 = 1, NrOfThroughSides + ! Particle that went through multiple sides first, but did not cross any sides during the second check -> Deleted! + IF (SecondNrOfThroughSides.EQ.0) THEN + IPWRITE(*,*) 'Error in Photon TriaTracking! Photon lost on second check. Element:', ElemID + IPWRITE(*,*) 'LastPos: ', PhotonProps%PhotonLastPos(1:3) + IPWRITE(*,*) 'Pos: ', PhotonProps%PhotonPos(1:3) + IPWRITE(*,*) 'Direction:', PhotonProps%PhotonDirection(1:3) + IPWRITE(*,*) 'Photon deleted!' + Done = .TRUE. + EXIT + END IF + END IF ! NrOfThroughSides.EQ.0/.GT.1 + END IF ! NrOfThroughSides.NE.1 + ! ---------------------------------------------------------------------------- + ! 3) In case of a boundary, perform the appropriate boundary interaction + crossedBC=.FALSE. + IF (SideInfo_Shared(SIDE_BCID,SideID).GT.0) THEN + OldElemID=ElemID + BCType = PartBound%TargetBoundCond(PartBound%MapToPartBC(SideInfo_Shared(SIDE_BCID,SideID))) + SELECT CASE(BCType) + CASE(1) !PartBound%OpenBC) + IF (NrOfThroughSides.LT.2) CALL PhotonIntersectionWithSide(LocalSide,ElemID,TriNum, IntersectionPos) + CALL CalcAbsoprtion(IntersectionPos(1:3),ElemID, DONE) + DONE = .TRUE. + CASE(2) + IF (PartBound%PhotonSpecularReflection(PartBound%MapToPartBC(SideInfo_Shared(SIDE_BCID,SideID)))) THEN + IF (NrOfThroughSides.LT.2) THEN + CALL PerfectPhotonReflection(LocalSide,ElemID,TriNum, IntersectionPos, .FALSE.) + ELSE + CALL PerfectPhotonReflection(LocalSide,ElemID,TriNum, IntersectionPos, .TRUE.) + END IF + CALL CalcAbsoprtion(IntersectionPos(1:3),ElemID, DONE) + ELSE + IF (NrOfThroughSides.LT.2) THEN + CALL DiffusePhotonReflection(LocalSide,ElemID,TriNum, IntersectionPos, .FALSE.) + ELSE + CALL DiffusePhotonReflection(LocalSide,ElemID,TriNum, IntersectionPos, .TRUE.) + END IF + CALL CalcAbsoprtion(IntersectionPos(1:3),ElemID, DONE) + IF (.NOT.DONE) CALL CalcWallAbsoprtion(SideID, DONE) + END IF + CASE DEFAULT + CALL abort(& + __STAMP__& + ,' ERROR: PartBound not associated!. (unknown case)',999,999.) + END SELECT !PartBound%MapToPartBC(BC(SideID) + + + IF ((BCType.EQ.2).OR.(BCType.EQ.10)) THEN + DoneLastElem(:,:) = 0 + ELSE + DO ind2= 5, 1, -1 + DoneLastElem(:,ind2+1) = DoneLastElem(:,ind2) + END DO + DoneLastElem(1,1) = OldElemID + DoneLastElem(2,1) = LocalSide + DoneLastElem(3,1) = TriNum + DoneLastElem(4,1) = SideID + END IF + ELSE ! BC(SideID).LE.0 + DO ind2= 5, 1, -1 + DoneLastElem(:,ind2+1) = DoneLastElem(:,ind2) + END DO + DoneLastElem(1,1) = ElemID + DoneLastElem(2,1) = LocalSide + DoneLastElem(3,1) = TriNum + DoneLastElem(4,1) = SideID + IF (oldElemIsMortar) THEN + ElemID = SideInfo_Shared(SIDE_ELEMID,SideID) + CALL PhotonIntersectionWithSide(LocalSide,ElemID,TriNum, IntersectionPos,.TRUE.) + CALL CalcAbsoprtion(IntersectionPos(1:3),DoneLastElem(1,1), DONE) + ELSE + CALL PhotonIntersectionWithSide(LocalSide,ElemID,TriNum, IntersectionPos) + CALL CalcAbsoprtion(IntersectionPos(1:3),ElemID, DONE) + ElemID = SideInfo_Shared(SIDE_NBELEMID,SideID) + END IF + END IF ! BC(SideID).GT./.LE. 0 + IF (ElemID.LT.1) THEN + CALL abort(& + __STAMP__ & + ,'ERROR: Element not defined! Please increase the size of the halo region (HaloEpsVelo)!') + END IF +END DO ! .NOT.PartisDone + + +END SUBROUTINE PhotonTriaTracking + + +!SUBROUTINE Photon2DSymTracking() +!!=================================================================================================================================== +!! Routine for tracking of moving particles and boundary interaction using triangulated sides. +!! 1) Loop over all particles that are still inside +!! 2) Perform tracking until the particle is considered "done" (either localized or deleted) +!! 2a) Perform a check based on the determinant of (3x3) matrix of the vectors from the particle position to the nodes of each +!! triangle (ParticleInsideQuad3D) +!! 2b) If particle is not within the given element in a), the side through which the particle went is determined by checking +!! each side of the element (ParticleThroughSideCheck3DFast) +!! 2c) If no sides are found, the particle is deleted (very rare case). If multiple possible sides are found, additional +!! treatment is required, where the particle path is reconstructed (which side was crossed first) by comparing the ratio +!! the determinants +!! 3) In case of a boundary, determine the intersection and perform the appropriate boundary interaction (GetBoundaryInteraction) +!!=================================================================================================================================== +!! MODULES +!USE MOD_Preproc +!USE MOD_Globals +!USE MOD_Particle_Mesh_Vars, ONLY:PartElemToSide, PartSideToElem, PartElemToElemAndSide, PartElemToSide2D +!USE MOD_Particle_Mesh_Vars, ONLY:Part3DLocSideToSide2D +!USE MOD_Mesh_Vars, ONLY:MortarType, BC +!USE MOD_Particle_Boundary_Vars, ONLY:PartBound +!USE MOD_RadiationTrans_Vars, ONLY:PhotonProps +!USE MOD_Photon_TrackingTools, ONLY:CalcAbsoprtion, CalcWallAbsoprtion, DiffusePhotonReflection2D +!USE MOD_Photon_TrackingTools, ONLY:PhotonIntersectionWithSide2D, RotatePhotonIn2DPlane, PerfectPhotonReflection2D +!IMPLICIT NONE +!!----------------------------------------------------------------------------------------------------------------------------------- +!! INPUT VARIABLES +!!----------------------------------------------------------------------------------------------------------------------------------- +!! OUTPUT VARIABLES +!!----------------------------------------------------------------------------------------------------------------------------------- +!! LOCAL VARIABLES +!INTEGER :: NblocSideID3D, NbElemID, ind, nbSideID, nMortarElems, SideIDMortar, BCType, NblocSideID +!INTEGER :: ElemID, OldElemID, LocSide3D, LocalSide, NrOfThroughSides +!INTEGER :: SideID, TempSideID, iLocSide, correctSide, LastSide +!INTEGER :: LocSidesTemp(1:6), GlobSideTemp(1:6) +!LOGICAL :: oldElemIsMortar, isMortarSideTemp(1:6), isLastSide, ThroughSide, Done +!REAL :: IntersectionPos(1:6), IntersectionPosTemp(1:6,3), DistanceTemp(1:6), Distance +!!=================================================================================================================================== +!Done = .FALSE. +!ElemID = PhotonProps%ElemID +!SideID = 0 +!LastSide = 0 +!! 1) Loop tracking until Photon is considered "done" (either absorbed or deleted) +!DO WHILE (.NOT.Done) +! oldElemIsMortar = .FALSE. +! NrOfThroughSides = 0 +! LocSidesTemp = 0 +! GlobSideTemp = 0 +! DistanceTemp = 0.0 +! IntersectionPosTemp = 0.0 +! isMortarSideTemp = .FALSE. +! DO iLocSide=1,4 +! isLastSide = .FALSE. +! LocSide3D = PartElemToSide2D(iLocSide,1, ElemID) +! TempSideID=PartElemToSide(E2S_SIDE_ID,LocSide3D,ElemID) +! IF(BC(TempSideID).GT.0) THEN +! IF (PartBound%TargetBoundCond(PartBound%MapToPartBC(BC(TempSideID))).EQ.11) CYCLE +! END IF +! IF (LastSide.EQ.TempSideID) isLastSide = .TRUE. +! SideIDMortar=MortarType(2,TempSideID) +! IF (SideIDMortar.GT.0) THEN ! Mortar side +! IF (MortarType(1,TempSideID).EQ.1) THEN +! nMortarElems = 4 +! CALL abort(& +! __STAMP__ & +! ,'ERROR: 4 Neighbor Mortar Cells not allowed for 2D simulations.') +! ELSE +! nMortarElems = 2 +! END IF +! DO ind = 1, nMortarElems +! isLastSide = .FALSE. +! NbElemID = PartElemToElemAndSide(ind,LocSide3D,ElemID) +! IF (NbElemID.LT.1) THEN +! CALL abort(& +! __STAMP__ & +! ,'ERROR: Mortar Element not defined! Please increase the size of the halo region (HaloEpsVelo)!') +! END IF +! NblocSideID3D = PartElemToElemAndSide(ind+4,LocSide3D,ElemID) +! NblocSideID = Part3DLocSideToSide2D(NblocSideID3D, NbElemID) +! nbSideID = PartElemToSide(E2S_SIDE_ID,NblocSideID3D,NbElemID) +! ThroughSide = .FALSE. +! IF (LastSide.EQ.nbSideID) isLastSide = .TRUE. +! CALL PhotonIntersectionWithSide2D(NblocSideID,NbElemID,ThroughSide,IntersectionPos, isLastSide,Distance) +! IF (ThroughSide) THEN +! ! Store the information for this side for future checks, if this side was already treated +! oldElemIsMortar = .TRUE. +! NrOfThroughSides = NrOfThroughSides + 1 +! LocSidesTemp(NrOfThroughSides) = NblocSideID3D +! GlobSideTemp(NrOfThroughSides) = nbSideID +! DistanceTemp(NrOfThroughSides) = Distance +! IntersectionPosTemp(1:3,NrOfThroughSides) = IntersectionPos(1:3) +! isMortarSideTemp(NrOfThroughSides) = .TRUE. +! SideID = nbSideID +! LocalSide = NblocSideID3D +! END IF +! END DO +! ELSE ! Regular side +! ThroughSide = .FALSE. +! CALL PhotonIntersectionWithSide2D(iLocSide,ElemID,ThroughSide,IntersectionPos, isLastSide, Distance) +! IF (ThroughSide) THEN +! NrOfThroughSides = NrOfThroughSides + 1 +! SideID = TempSideID +! LocalSide = LocSide3D +! LocSidesTemp(NrOfThroughSides) = LocSide3D +! GlobSideTemp(NrOfThroughSides) = TempSideID +! DistanceTemp(NrOfThroughSides) = Distance +! IntersectionPosTemp(1:3,NrOfThroughSides) = IntersectionPos(1:3) +!! EXIT +! END IF +! END IF ! Mortar or regular side +! END DO ! iLocSide=1,4 +! ! ---------------------------------------------------------------------------- +! ! Addition treatment if particle did not cross any sides or it crossed multiple sides +! IF (NrOfThroughSides.NE.1) THEN +! ! 2c) If no sides are found, the particle is deleted (very rare case). If multiple possible sides are found, additional +! ! treatment is required, where the particle path is reconstructed (which side was crossed first) by comparing the ratio +! ! the determinants +! IF (NrOfThroughSides.EQ.0) THEN +! ! Particle appears to have not crossed any of the checked sides. Deleted! +! IPWRITE(*,*) 'Error in Photon 2DAxisTracking! Photon lost. Element:', ElemID +! IPWRITE(*,*) 'LastPos: ', PhotonProps%PhotonLastPos(1:3) +! IPWRITE(*,*) 'Pos: ', PhotonProps%PhotonPos(1:3) +! IPWRITE(*,*) 'Direction:', PhotonProps%PhotonDirection(1:3) +! IPWRITE(*,*) 'Photon deleted!' +! Done = .TRUE. +! EXIT +! ELSE IF (NrOfThroughSides.GT.1) THEN +! correctSide = MINLOC(DistanceTemp(1:NrOfThroughSides),DIM=1) +! oldElemIsMortar = isMortarSideTemp(correctSide) +! SideID = GlobSideTemp(correctSide) +! LocalSide = LocSidesTemp(correctSide) +! IntersectionPos(1:3) = IntersectionPosTemp(1:3,correctSide) +! END IF +! END IF ! NrOfThroughSides.NE.1 +! ! ---------------------------------------------------------------------------- +! ! 3) In case of a boundary, perform the appropriate boundary interaction +! OldElemID = ElemID +! IF(BC(SideID).GT.0) THEN +! BCType = PartBound%TargetBoundCond(PartBound%MapToPartBC(BC(SideID))) +! SELECT CASE(BCType) +! CASE(1) !PartBound%OpenBC) +! CALL CalcAbsoprtion(IntersectionPos(1:3),ElemID, DONE) +! DONE = .TRUE. +! CYCLE +! CASE(2) +! IF (PartBound%PhotonSpecularReflection(PartBound%MapToPartBC(BC(SideID)))) THEN +! CALL CalcAbsoprtion(IntersectionPos(1:3),ElemID, DONE) +! IF (.NOT.DONE) CALL PerfectPhotonReflection2D(Part3DLocSideToSide2D(LocalSide, ElemID),ElemID, IntersectionPos) +! ELSE +! CALL CalcAbsoprtion(IntersectionPos(1:3),ElemID, DONE) +! IF (.NOT.DONE) CALL CalcWallAbsoprtion(SideID, DONE) +! IF (.NOT.DONE) CALL DiffusePhotonReflection2D(Part3DLocSideToSide2D(LocalSide, ElemID),ElemID, IntersectionPos) +! END IF +! CASE DEFAULT +! CALL abort(& +! __STAMP__& +! ,' ERROR: PartBound not associated!. (unknown case)',BCType,999.) +! END SELECT !PartBound%MapToPartBC(BC(SideID) +! ELSE ! BC(SideID).LE.0 +! IF (oldElemIsMortar) THEN +! CALL CalcAbsoprtion(IntersectionPos(1:3),ElemID, DONE) +! IF (PartSideToElem(S2E_NB_ELEM_ID,SideID).EQ.-1) THEN +! ElemID = PartSideToElem(S2E_ELEM_ID,SideID) +! ELSE +! ElemID = PartSideToElem(S2E_NB_ELEM_ID,SideID) +! END IF +! ELSE +! CALL CalcAbsoprtion(IntersectionPos(1:3),ElemID, DONE) +! ElemID = PartElemToElemAndSide(1 ,LocalSide,ElemID) +! END IF +! END IF ! BC(SideID).GT./.LE. 0 +! IF (oldElemIsMortar) THEN +! LastSide = SideID +! ELSE +! LastSide = PartElemToElemAndSide(5,LocalSide,OldElemID) +! IF (LastSide.LT.1) THEN +! LastSide = SideID +! ELSE +! LastSide = PartElemToSide(E2S_SIDE_ID,LastSide,ElemID) +! SideIDMortar=MortarType(2,LastSide) +! IF (SideIDMortar.GT.0) LastSide = SideID +! END IF +! END IF +! IF (.NOT.DONE) CALL RotatePhotonIn2DPlane(IntersectionPos(1:3)) +! IF (ElemID.LT.1) THEN +! CALL abort(& +! __STAMP__ & +! ,'ERROR: Element not defined! Please increase the size of the halo region (HaloEpsVelo)!') +! END IF +!END DO ! .NOT.PartisDone + +!END SUBROUTINE Photon2DSymTracking + +END MODULE MOD_Photon_Tracking diff --git a/src/timedisc/timedisc.f90 b/src/timedisc/timedisc.f90 index 9947f5f9d..303479725 100644 --- a/src/timedisc/timedisc.f90 +++ b/src/timedisc/timedisc.f90 @@ -319,13 +319,13 @@ SUBROUTINE TimeDisc() #else CALL TimeStepPoissonByLSERK() ! Runge Kutta Explicit, Poisson #endif -#elif (PP_TimeDiscMethod==600) - CALL TimeStep_Radiation() #else CALL abort(& __STAMP__& ,'Timedisc 50x only available for EQNSYS Poisson!',PP_N,999.) #endif /*USE_HDG*/ +#elif (PP_TimeDiscMethod==600) + CALL TimeStep_Radiation() #endif ! calling the analyze routines iter=iter+1 diff --git a/src/timedisc/timedisc_TimeStep_Radiation.f90 b/src/timedisc/timedisc_TimeStep_Radiation.f90 index b94dc3df5..ff28db8ee 100644 --- a/src/timedisc/timedisc_TimeStep_Radiation.f90 +++ b/src/timedisc/timedisc_TimeStep_Radiation.f90 @@ -32,7 +32,8 @@ SUBROUTINE TimeStep_Radiation() !> Radiation Solver and Radiative Transfer Solver !=================================================================================================================================== ! MODULES - +USE MOD_RadTransport, ONLY: RadTrans_main +USE MOD_RadTrans_Output, ONLY: WriteRadiationToHDF5 !, WriteSurfSampleToHDF5 ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -42,6 +43,9 @@ SUBROUTINE TimeStep_Radiation() !=================================================================================================================================== +CALL RadTrans_main() +CALL WriteRadiationToHDF5() +!CALL WriteSurfSampleToHDF5() END SUBROUTINE TimeStep_Radiation From 52a29be6ed5e548d0e64f88f4833565c5016d940 Mon Sep 17 00:00:00 2001 From: Marcel Pfeiffer Date: Tue, 17 Aug 2021 11:57:03 +0200 Subject: [PATCH 007/495] bugfix absorption array --- .../radiation_solver/radiation_init.f90 | 3 +- .../radiative_transfer/radtrans_init.f90 | 3 +- .../radiative_transfer/radtrans_main.f90 | 5 +-- .../radiative_transfer/radtrans_output.f90 | 33 +++++++++---------- 4 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/radiation/radiation_solver/radiation_init.f90 b/src/radiation/radiation_solver/radiation_init.f90 index 8b4767f26..6e520b1ba 100644 --- a/src/radiation/radiation_solver/radiation_init.f90 +++ b/src/radiation/radiation_solver/radiation_init.f90 @@ -102,6 +102,7 @@ SUBROUTINE InitRadiation() USE MOD_Radiation_Vars USE MOD_DSMC_Vars, ONLY : SpecDSMC USE MOD_Radiation_ReadIn, ONLY : Radiation_readin_atoms, Radiation_readin_molecules +USE MOD_Mesh_Tools, ONLY : GetGlobalElemID #if USE_MPI !USE MOD_MPI_Shared_Vars USE MOD_MPI_Shared @@ -225,7 +226,7 @@ SUBROUTINE InitRadiation() DO iElem = firstElem, lastElem Radiation_Emission_spec(:,iElem) = 0.0 - Radiation_Absorption_spec(:,iElem) = 0.0 + Radiation_Absorption_spec(:,GetGlobalElemID(iElem)) = 0.0 Radiation_ElemEnergy_Species(:,iElem,:) =0.0 END DO #if USE_MPI diff --git a/src/radiation/radiative_transfer/radtrans_init.f90 b/src/radiation/radiative_transfer/radtrans_init.f90 index c50d3c19d..630649f81 100644 --- a/src/radiation/radiative_transfer/radtrans_init.f90 +++ b/src/radiation/radiative_transfer/radtrans_init.f90 @@ -72,6 +72,7 @@ SUBROUTINE InitRadiationTransport() USE MOD_Radiation, ONLY : radiation_main USE MOD_DSMC_Vars, ONLY: RadialWeighting USE MOD_Output, ONLY: PrintStatusLineRadiation +USE MOD_Mesh_Tools, ONLY : GetGlobalElemID USE MOD_MPI_Shared_Vars USE MOD_MPI_Shared ! IMPLICIT VARIABLE HANDLING @@ -164,7 +165,7 @@ SUBROUTINE InitRadiationTransport() END DO DO iElem = firstElem, lastElem DO iWave = 1, RadiationParameter%WaveLenDiscr - Radiation_Absorption_Spec(iWave, iElem) = 1. + Radiation_Absorption_Spec(iWave, GetGlobalElemID(iElem)) = 1. END DO END DO CASE(3) !only radiation diff --git a/src/radiation/radiative_transfer/radtrans_main.f90 b/src/radiation/radiative_transfer/radtrans_main.f90 index 233cb1230..7f31b32c4 100644 --- a/src/radiation/radiative_transfer/radtrans_main.f90 +++ b/src/radiation/radiative_transfer/radtrans_main.f90 @@ -61,7 +61,7 @@ SUBROUTINE RadTrans_main() ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -INTEGER :: iElem, nPhotons, iPhot, globPhotNum, nPhotonsCN, photonCount, iPhotLoc, photVisCount, LocPhotNum +INTEGER :: iElem, nPhotons, iPhot, globPhotNum, nPhotonsCN, photonCount, iPhotLoc, photVisCount, LocPhotNum, PhotDisp INTEGER :: firstElem, lastElem, firstPhoton, lastPhoton REAL :: Bounds(1:2,1:3) ! Bounds(1,1:3) --> maxCoords , Bounds(2,1:3) --> minCoords REAL :: RandRot(3,3) !, PartPos(1:3) @@ -140,11 +140,12 @@ SUBROUTINE RadTrans_main() photonCount = 0 photVisCount = 0 LocPhotNum = SUM(RadTransPhotPerCellLoc(:)) + PhotDisp = INT(LocPhotNum/20) DO iElem = 1, nComputeNodeElems IF (RadTransPhotPerCellLoc(iElem).GT.0) THEN IF (RadiationDirectionModel.EQ.2) RandRot = RandomRotMatrix() DO iPhot = 1, RadTransPhotPerCellLoc(iElem) - IF(MPIroot.AND.(MOD(photVisCount,20000).EQ.0)) CALL PrintStatusLineRadiation(REAL(photVisCount),REAL(1),REAL(LocPhotNum),.TRUE.) + IF(MPIroot.AND.(MOD(photVisCount,PhotDisp).EQ.0)) CALL PrintStatusLineRadiation(REAL(photVisCount),REAL(1),REAL(LocPhotNum),.TRUE.) photVisCount = photVisCount + 1 PhotonProps%PhotonEnergy = SetPhotonEnergy(iElem) PhotonProps%PhotonPos(1:3) = SetPhotonPos(iElem, globPhotNum) diff --git a/src/radiation/radiative_transfer/radtrans_output.f90 b/src/radiation/radiative_transfer/radtrans_output.f90 index b23efc56a..579d4885d 100644 --- a/src/radiation/radiative_transfer/radtrans_output.f90 +++ b/src/radiation/radiative_transfer/radtrans_output.f90 @@ -345,18 +345,15 @@ END SUBROUTINE MPI_ExchangeRadiationInfo !REAL :: tstart,tend !REAL, ALLOCATABLE :: helpArray(:,:) !!=================================================================================================================================== -!IF (nSurfBC.EQ.0) THEN -! IF(SurfCOMM%MPIOutputROOT)THEN -! WRITE(UNIT_stdOut,'(A)') 'No boundary found for surface sampling!' -! END IF -! RETURN -!END IF !#if USE_MPI -!CALL MPI_BARRIER(SurfCOMM%COMM,iERROR) -!CALL MPI_ExchangeRadiationSurfData() -!IF(SurfMesh%nSides.EQ.0) RETURN +!! Return if not a sampling leader +!IF (MPI_COMM_LEADERS_SURF.EQ.MPI_COMM_NULL) RETURN +!CALL MPI_BARRIER(MPI_COMM_LEADERS_SURF,iERROR) + +!! Return if no sampling sides +!IF (nSurfTotalSides .EQ.0) RETURN !#endif /*USE_MPI*/ -!IF(SurfCOMM%MPIOutputRoot)THEN +!IF (mySurfRank.EQ.0) THEN ! WRITE(UNIT_stdOut,'(a)',ADVANCE='NO')' WRITE Radiation SurfSTATE TO HDF5 FILE...' ! tstart=LOCALTIME() !END IF @@ -366,7 +363,7 @@ END SUBROUTINE MPI_ExchangeRadiationInfo !! Generate skeleton for the file with all relevant data on a single proc (MPIRoot) !#if USE_MPI -!IF(SurfCOMM%MPIOutputRoot)THEN +!IF (mySurfRank.EQ.0) THEN !#endif /*USE_MPI*/ ! CALL OpenDataFile(FileString,create=.TRUE.,single=.TRUE.,readOnly=.FALSE.) ! Statedummy = 'RadiationSurfState' @@ -390,8 +387,8 @@ END SUBROUTINE MPI_ExchangeRadiationInfo ! DEALLOCATE(Str2DVarNames) !#if USE_MPI !END IF -!CALL MPI_BARRIER(SurfCOMM%OutputCOMM,iERROR) -!CALL OpenDataFile(FileString,create=.FALSE.,single=.FALSE.,readOnly=.FALSE.,communicatorOpt=SurfCOMM%OutputCOMM) +!CALL MPI_BARRIER(MPI_COMM_LEADERS_SURF,iERROR) +!CALL OpenDataFile(FileString,create=.FALSE.,single=.FALSE.,readOnly=.FALSE.,communicatorOpt=MPI_COMM_LEADERS_SURF) !#else !CALL OpenDataFile(FileString,create=.FALSE.,single=.FALSE.,readOnly=.FALSE.) !#endif /*USE_MPI*/ @@ -399,16 +396,16 @@ END SUBROUTINE MPI_ExchangeRadiationInfo !WRITE(H5_Name,'(A)') 'SurfaceData' !ASSOCIATE (& -! nGlobalSides => INT(SurfMesh%nGlobalSides,IK) ,& -! LocalnBCSides => INT(SurfMesh%nBCSides,IK) ,& -! offsetSurfSide => INT(offsetSurfSide,IK) ,& +! nGlobalSides => INT(nOutputSides,IK) ,& +! LocalnBCSides => INT(nComputeNodeSurfOutputSides,IK) ,& +! offsetSurfSide => INT(offsetComputeNodeSurfOutputSide,IK) ,& ! nVar2D => INT(nVar2D,IK)) ! ALLOCATE(helpArray(nVar2D,LocalnBCSides)) ! helpArray(1,1:LocalnBCSides)= PhotonSampWall(1,1:LocalnBCSides) ! ! SurfaceArea should be changed to 1:SurfMesh%nSides if inner sampling sides exist... -! helpArray(2,1:LocalnBCSides)= PhotonSampWall(2,1:LocalnBCSides)/SurfMesh%SurfaceArea(1,1,1:LocalnBCSides) +! helpArray(2,1:LocalnBCSides)= PhotonSampWall(2,1:LocalnBCSides)/SurfSideArea(1,1,1:LocalnBCSides) ! CALL WriteArrayToHDF5(DataSetName=H5_Name , rank=4 , & ! nValGlobal =(/nVar2D , 1, 1 , nGlobalSides/) , & ! nVal =(/nVar2D , 1, 1 , LocalnBCSides/) , & @@ -420,7 +417,7 @@ END SUBROUTINE MPI_ExchangeRadiationInfo !CALL CloseDataFile() -!IF(SurfCOMM%MPIOutputROOT)THEN +!IF (mySurfRank.EQ.0) THEN ! tend=LOCALTIME() ! WRITE(UNIT_stdOut,'(A,F0.3,A)',ADVANCE='YES')'DONE [',tend-tstart,'s]' !END IF From 2f9bdfc9d4df86ccc9897fc606cf926d67503881 Mon Sep 17 00:00:00 2001 From: Marcel Pfeiffer Date: Tue, 17 Aug 2021 16:21:55 +0200 Subject: [PATCH 008/495] working photon wall sampling --- src/output/output.f90 | 4 +- .../radiative_transfer/radtrans_output.f90 | 485 ++++++++++-------- src/timedisc/timedisc_TimeStep_Radiation.f90 | 4 +- 3 files changed, 281 insertions(+), 212 deletions(-) diff --git a/src/output/output.f90 b/src/output/output.f90 index 5e221b715..84ae7a6ea 100644 --- a/src/output/output.f90 +++ b/src/output/output.f90 @@ -269,12 +269,12 @@ SUBROUTINE PrintStatusLineRadiation(t,tStart,tEnd,Phot) IF (Phot) THEN WRITE(UNIT_stdOut,'(A,E10.4,A,E10.4,A,A,I6,A1,I0.2,A1,I0.2,A1,I0.2,A,A,A,A3,F6.2,A3,A1)',ADVANCE='NO') & ' Photon = ', t,' TotalPhotons = ', tEnd, ' ', ' eta = ',INT(days),':',INT(hours),':',INT(mins),':',INT(secs),' |',& - REPEAT('☢',CEILING(percent/2)),REPEAT(' ',INT((100-percent)/2)),'| [',percent,'%] ',& + REPEAT('☢ ',CEILING(percent/4)),REPEAT(' ',INT((100-percent)/4)),'| [',percent,'%] ',& ACHAR(13) ! ACHAR(13) is carriage return ELSE WRITE(UNIT_stdOut,'(A,E10.4,A,I6,A1,I0.2,A1,I0.2,A1,I0.2,A,A,A1,A,A3,F6.2,A3,A1)',ADVANCE='NO') & ' Elem = ', t,' eta = ',INT(days),':',INT(hours),':',INT(mins),':',INT(secs),' |',& - REPEAT('🚀',MAX(CEILING(percent/2)-1,0)),'>',REPEAT(' ',INT((100-percent)/2)),'| [',percent,'%] ',& + REPEAT('🚀 ',MAX(CEILING(percent/4)-1,0)),'>',REPEAT(' ',INT((100-percent)/4)),'| [',percent,'%] ',& ACHAR(13) ! ACHAR(13) is carriage return END IF #ifdef INTEL diff --git a/src/radiation/radiative_transfer/radtrans_output.f90 b/src/radiation/radiative_transfer/radtrans_output.f90 index 579d4885d..1e786888d 100644 --- a/src/radiation/radiative_transfer/radtrans_output.f90 +++ b/src/radiation/radiative_transfer/radtrans_output.f90 @@ -31,7 +31,7 @@ MODULE MOD_RadTrans_Output !----------------------------------------------------------------------------------------------------------------------------------- ! Private Part --------------------------------------------------------------------------------------------------------------------- ! Public Part ---------------------------------------------------------------------------------------------------------------------- -PUBLIC :: WriteRadiationToHDF5 !, WriteSurfSampleToHDF5 +PUBLIC :: WriteRadiationToHDF5 , WriteSurfSampleToHDF5 !=================================================================================================================================== CONTAINS @@ -213,215 +213,284 @@ SUBROUTINE MPI_ExchangeRadiationInfo() END SUBROUTINE MPI_ExchangeRadiationInfo -!SUBROUTINE MPI_ExchangeRadiationSurfData() -!!=================================================================================================================================== -!! exchange the surface data -!! only processes with samling sides in their halo region and the original process participate on the communication -!! structure is similar to particle communication -!! each process sends his halo-information directly to the origin process by use of a list, containing the surfsideids for sending -!! the receiving process adds the new data to his own sides -!!=================================================================================================================================== -!! MODULES ! -!!----------------------------------------------------------------------------------------------------------------------------------! -!USE MOD_Globals -!USE MOD_Particle_Boundary_Vars ,ONLY:SurfComm -!USE MOD_Particle_MPI_Vars ,ONLY:SurfSendBuf,SurfRecvBuf,SurfExchange -!USE MOD_RadiationTrans_Vars, ONLY:PhotonSampWall -!!----------------------------------------------------------------------------------------------------------------------------------! -!! IMPLICIT VARIABLE HANDLING -!IMPLICIT NONE -!! INPUT VARIABLES -!!----------------------------------------------------------------------------------------------------------------------------------! -!! OUTPUT VARIABLES -!!----------------------------------------------------------------------------------------------------------------------------------- -!! LOCAL VARIABLES -!INTEGER :: MessageSize,nValues,iSurfSide,SurfSideID -!INTEGER :: iPos,iProc -!INTEGER :: recv_status_list(1:MPI_STATUS_SIZE,1:SurfCOMM%nMPINeighbors) -!!=================================================================================================================================== - -!nValues = 2 -!! -!! open receive buffer -!DO iProc=1,SurfCOMM%nMPINeighbors -! IF(SurfExchange%nSidesRecv(iProc).EQ.0) CYCLE -! MessageSize=SurfExchange%nSidesRecv(iProc)*nValues -! CALL MPI_IRECV( SurfRecvBuf(iProc)%content & -! , MessageSize & -! , MPI_DOUBLE_PRECISION & -! , SurfCOMM%MPINeighbor(iProc)%NativeProcID & -! , 1009 & -! , SurfCOMM%COMM & -! , SurfExchange%RecvRequest(iProc) & -! , IERROR ) -!END DO ! iProc - -!! build message -!DO iProc=1,SurfCOMM%nMPINeighbors -! IF(SurfExchange%nSidesSend(iProc).EQ.0) CYCLE -! iPos=0 -! SurfSendBuf(iProc)%content = 0. -! DO iSurfSide=1,SurfExchange%nSidesSend(iProc) -! SurfSideID=SurfCOMM%MPINeighbor(iProc)%SendList(iSurfSide) -! SurfSendBuf(iProc)%content(iPos+1:iPos+nValues)= PhotonSampWall(1:2,SurfSideID) -! iPos=iPos+nValues -! END DO ! iSurfSide=1,nSurfExchange%nSidesSend(iProc) -!END DO - -!! send message -!DO iProc=1,SurfCOMM%nMPINeighbors -! IF(SurfExchange%nSidesSend(iProc).EQ.0) CYCLE -! MessageSize=SurfExchange%nSidesSend(iProc)*nValues -! CALL MPI_ISEND( SurfSendBuf(iProc)%content & -! , MessageSize & -! , MPI_DOUBLE_PRECISION & -! , SurfCOMM%MPINeighbor(iProc)%NativeProcID & -! , 1009 & -! , SurfCOMM%COMM & -! , SurfExchange%SendRequest(iProc) & -! , IERROR ) -!END DO ! iProc - -!! 4) Finish Received number of particles -!DO iProc=1,SurfCOMM%nMPINeighbors -! IF(SurfExchange%nSidesSend(iProc).NE.0) THEN -! CALL MPI_WAIT(SurfExchange%SendRequest(iProc),MPIStatus,IERROR) -! IF(IERROR.NE.MPI_SUCCESS) CALL abort(& -!__STAMP__& -! ,' MPI Communication error', IERROR) -! END IF -! IF(SurfExchange%nSidesRecv(iProc).NE.0) THEN -! CALL MPI_WAIT(SurfExchange%RecvRequest(iProc),recv_status_list(:,iProc),IERROR) -! IF(IERROR.NE.MPI_SUCCESS) CALL abort(& -!__STAMP__& -! ,' MPI Communication error', IERROR) -! END IF -!END DO ! iProc - -!! add data do my list -!DO iProc=1,SurfCOMM%nMPINeighbors -! IF(SurfExchange%nSidesRecv(iProc).EQ.0) CYCLE -! iPos=0 -! DO iSurfSide=1,SurfExchange%nSidesRecv(iProc) -! SurfSideID=SurfCOMM%MPINeighbor(iProc)%RecvList(iSurfSide) -! PhotonSampWall(1:2,SurfSideID)=PhotonSampWall(1:2,SurfSideID) & -! +SurfRecvBuf(iProc)%content(iPos+1:iPos+nValues) -! iPos=iPos+nValues -! END DO ! iSurfSide=1,nSurfExchange%nSidesSend(iProc) -!END DO ! iProc - -!END SUBROUTINE MPI_ExchangeRadiationSurfData +SUBROUTINE MPI_ExchangeRadiationSurfData() +!=================================================================================================================================== +! exchange the surface data +! only processes with samling sides in their halo region and the original process participate on the communication +! structure is similar to particle communication +! each process sends his halo-information directly to the origin process by use of a list, containing the surfsideids for sending +! the receiving process adds the new data to his own sides +!=================================================================================================================================== +! MODULES ! +!----------------------------------------------------------------------------------------------------------------------------------! +USE MOD_Globals +USE MOD_Particle_Boundary_Vars ,ONLY:SurfOnNode, SurfMapping, nComputeNodeSurfTotalSides, GlobalSide2SurfSide +USE MOD_Particle_MPI_Vars ,ONLY:SurfSendBuf,SurfRecvBuf +USE MOD_RadiationTrans_Vars ,ONLY:PhotonSampWall, PhotonSampWall_Shared, PhotonSampWall_Shared_Win +USE MOD_MPI_Shared_Vars ,ONLY:MPI_COMM_LEADERS_SURF, MPI_COMM_SHARED, nSurfLeaders,myComputeNodeRank,mySurfRank +USE MOD_MPI_Shared +!----------------------------------------------------------------------------------------------------------------------------------! +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +! INPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------! +! OUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +INTEGER :: MessageSize,nValues,iSurfSide,SurfSideID, SideID +INTEGER :: iPos,iProc +INTEGER :: RecvRequest(0:nSurfLeaders-1),SendRequest(0:nSurfLeaders-1) +!=================================================================================================================================== +! nodes without sampling surfaces do not take part in this routine +IF (.NOT.SurfOnNode) RETURN + +MessageSize = 2*nComputeNodeSurfTotalSides +IF (myComputeNodeRank.EQ.0) THEN + CALL MPI_REDUCE(PhotonSampWall,PhotonSampWall_Shared,MessageSize,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_SHARED,IERROR) +ELSE + CALL MPI_REDUCE(PhotonSampWall,0 ,MessageSize,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_SHARED,IERROR) +ENDIF + +CALL BARRIER_AND_SYNC(PhotonSampWall_Shared_Win ,MPI_COMM_SHARED) + +! prepare buffers for surf leader communication +IF (myComputeNodeRank.EQ.0) THEN + nValues = 2 + + ! open receive buffer + DO iProc = 0,nSurfLeaders-1 + ! ignore myself + IF (iProc.EQ.mySurfRank) CYCLE + + ! Only open recv buffer if we are expecting sides from this leader node + IF (SurfMapping(iProc)%nRecvSurfSides.EQ.0) CYCLE + + ! Message is sent on MPI_COMM_LEADERS_SURF, so rank is indeed iProc + MessageSize = SurfMapping(iProc)%nRecvSurfSides * nValues + CALL MPI_IRECV( SurfRecvBuf(iProc)%content & + , MessageSize & + , MPI_DOUBLE_PRECISION & + , iProc & + , 1209 & + , MPI_COMM_LEADERS_SURF & + , RecvRequest(iProc) & + , IERROR) + END DO ! iProc + + ! build message + DO iProc = 0,nSurfLeaders-1 + ! Ignore myself + IF (iProc .EQ. mySurfRank) CYCLE + ! Only assemble message if we are expecting sides to send to this leader node + IF (SurfMapping(iProc)%nSendSurfSides.EQ.0) CYCLE + + ! Nullify everything + iPos = 0 + SurfSendBuf(iProc)%content = 0. + DO iSurfSide = 1,SurfMapping(iProc)%nSendSurfSides + SideID = SurfMapping(iProc)%SendSurfGlobalID(iSurfSide) + SurfSideID = GlobalSide2SurfSide(SURF_SIDEID,SideID) + ! Assemble message + SurfSendBuf(iProc)%content(iPos+1:iPos+2) = PhotonSampWall_Shared(:,SurfSideID) + iPos = iPos + 2 + PhotonSampWall_Shared(:,SurfSideID)=0. + END DO ! iSurfSide = 1,SurfMapping(iProc)%nSendSurfSides + END DO + + ! send message + DO iProc = 0,nSurfLeaders-1 + ! ignore myself + IF (iProc.EQ.mySurfRank) CYCLE + ! Only open recv buffer if we are expecting sides from this leader node + IF (SurfMapping(iProc)%nSendSurfSides.EQ.0) CYCLE + + ! Message is sent on MPI_COMM_LEADERS_SURF, so rank is indeed iProc + MessageSize = SurfMapping(iProc)%nSendSurfSides * nValues + CALL MPI_ISEND( SurfSendBuf(iProc)%content & + , MessageSize & + , MPI_DOUBLE_PRECISION & + , iProc & + , 1209 & + , MPI_COMM_LEADERS_SURF & + , SendRequest(iProc) & + , IERROR) + END DO ! iProc + + ! Finish received number of sampling surfaces + DO iProc = 0,nSurfLeaders-1 + ! ignore myself + IF (iProc.EQ.mySurfRank) CYCLE + + IF (SurfMapping(iProc)%nSendSurfSides.NE.0) THEN + CALL MPI_WAIT(SendRequest(iProc),MPIStatus,IERROR) + IF (IERROR.NE.MPI_SUCCESS) CALL ABORT(__STAMP__,' MPI Communication error',IERROR) + END IF + + IF (SurfMapping(iProc)%nRecvSurfSides.NE.0) THEN + CALL MPI_WAIT(RecvRequest(iProc),MPIStatus,IERROR) + IF (IERROR.NE.MPI_SUCCESS) CALL ABORT(__STAMP__,' MPI Communication error',IERROR) + END IF + END DO ! iProc + + ! add data do my list + DO iProc = 0,nSurfLeaders-1 + ! ignore myself + IF (iProc.EQ.mySurfRank) CYCLE + ! Only open recv buffer if we are expecting sides from this leader node + IF (SurfMapping(iProc)%nRecvSurfSides.EQ.0) CYCLE + + iPos=0 + DO iSurfSide = 1,SurfMapping(iProc)%nRecvSurfSides + SideID = SurfMapping(iProc)%RecvSurfGlobalID(iSurfSide) + SurfSideID = GlobalSide2SurfSide(SURF_SIDEID,SideID) + PhotonSampWall_Shared(:,SurfSideID) = PhotonSampWall_Shared(:,SurfSideID) & + + SurfRecvBuf(iProc)%content(iPos+1:iPos+2) + iPos = iPos + 2 + END DO ! iSurfSide = 1,SurfMapping(iProc)%nRecvSurfSides + ! Nullify buffer + SurfRecvBuf(iProc)%content = 0. + END DO ! iProc +END IF + +CALL BARRIER_AND_SYNC(PhotonSampWall_Shared_Win ,MPI_COMM_SHARED) + +END SUBROUTINE MPI_ExchangeRadiationSurfData +#endif /*USE_MPI*/ + + +SUBROUTINE WriteSurfSampleToHDF5() +!=================================================================================================================================== +!> write the final values of the surface sampling to a HDF5 state file +!> additional performs all the final required computations +!=================================================================================================================================== +! MODULES ! +!----------------------------------------------------------------------------------------------------------------------------------! +USE MOD_Globals +USE MOD_IO_HDF5 +USE MOD_Globals_Vars, ONLY:ProjectName +USE MOD_Particle_Boundary_Vars, ONLY:SurfSideArea, nComputeNodeSurfOutputSides,noutputsides, nSurfTotalSides, nSurfBC +USE MOD_Particle_Boundary_Vars, ONLY:offsetComputeNodeSurfOutputSide, SurfBCName, SurfSideArea_Shared, nComputeNodeSurfSides +USE MOD_Particle_Boundary_Vars, ONLY:SurfSide2GlobalSide, GlobalSide2SurfSide +USE MOD_HDF5_Output, ONLY:WriteAttributeToHDF5,WriteArrayToHDF5,WriteHDF5Header +USE MOD_Mesh_Vars, ONLY:MeshFile +USE MOD_Particle_Mesh_Vars, ONLY:SideInfo_Shared +USE MOD_RadiationTrans_Vars, ONLY:PhotonSampWall, PhotonSampWall_Shared +USE MOD_MPI_Shared_Vars, ONLY:MPI_COMM_LEADERS_SURF,mySurfRank +!----------------------------------------------------------------------------------------------------------------------------------! +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +! INPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------! +! OUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +CHARACTER(LEN=255) :: FileString,Statedummy +CHARACTER(LEN=255) :: H5_Name +CHARACTER(LEN=255) :: NodeTypeTemp +CHARACTER(LEN=255),ALLOCATABLE :: Str2DVarNames(:) +INTEGER :: nVar2D, GlobalSideID, iSurfSide, OutputCounter, SurfSideNb +REAL :: tstart,tend +REAL, ALLOCATABLE :: helpArray(:,:) +!=================================================================================================================================== +#if USE_MPI +CALL MPI_ExchangeRadiationSurfData() +! Return if not a sampling leader +IF (MPI_COMM_LEADERS_SURF.EQ.MPI_COMM_NULL) RETURN +CALL MPI_BARRIER(MPI_COMM_LEADERS_SURF,iERROR) + +! Return if no sampling sides +IF (nSurfTotalSides .EQ.0) RETURN +#endif /*USE_MPI*/ +IF (mySurfRank.EQ.0) THEN + WRITE(UNIT_stdOut,'(a)',ADVANCE='NO')' WRITE Radiation SurfSTATE TO HDF5 FILE...' + tstart=LOCALTIME() +END IF + +FileString=TRIM(ProjectName)//'_RadiationSurfState.h5' +nVar2D = 2 + +! Generate skeleton for the file with all relevant data on a single proc (MPIRoot) +#if USE_MPI +IF (mySurfRank.EQ.0) THEN +#endif /*USE_MPI*/ + CALL OpenDataFile(FileString,create=.TRUE.,single=.TRUE.,readOnly=.FALSE.) + Statedummy = 'RadiationSurfState' + ! Write file header + CALL WriteHDF5Header(Statedummy,File_ID) + CALL WriteAttributeToHDF5(File_ID,'RadiationnSurfSample',1,IntegerScalar=1) + CALL WriteAttributeToHDF5(File_ID,'MeshFile',1,StrScalar=(/TRIM(MeshFile)/)) + CALL WriteAttributeToHDF5(File_ID,'BC_Surf',nSurfBC,StrArray=SurfBCName) + CALL WriteAttributeToHDF5(File_ID,'N',1,IntegerScalar=1) + NodeTypeTemp='VISU' + CALL WriteAttributeToHDF5(File_ID,'NodeType',1,StrScalar=(/NodeTypeTemp/)) + + ALLOCATE(Str2DVarNames(1:nVar2D)) + ! fill varnames for total values + Str2DVarNames(1) ='PhotonCount' + Str2DVarNames(2) ='HeatFlux' + + CALL WriteAttributeToHDF5(File_ID,'VarNamesSurface',nVar2D,StrArray=Str2DVarNames) + + CALL CloseDataFile() + DEALLOCATE(Str2DVarNames) +#if USE_MPI +END IF +CALL MPI_BARRIER(MPI_COMM_LEADERS_SURF,iERROR) +CALL OpenDataFile(FileString,create=.FALSE.,single=.FALSE.,readOnly=.FALSE.,communicatorOpt=MPI_COMM_LEADERS_SURF) +#else +CALL OpenDataFile(FileString,create=.FALSE.,single=.FALSE.,readOnly=.FALSE.) +#endif /*USE_MPI*/ + + +WRITE(H5_Name,'(A)') 'SurfaceData' +#if USE_MPI +ASSOCIATE(PhotonSampWall => PhotonSampWall_Shared ,& + SurfSideArea => SurfSideArea_Shared) +#endif + +ASSOCIATE (& + nGlobalSides => INT(nOutputSides,IK) ,& + LocalnBCSides => INT(nComputeNodeSurfOutputSides,IK) ,& + offsetSurfSide => INT(offsetComputeNodeSurfOutputSide,IK) ,& + nVar2D => INT(nVar2D,IK)) + + ALLOCATE(helpArray(nVar2D,LocalnBCSides)) + OutputCounter = 0 + DO iSurfSide = 1,nComputeNodeSurfSides + GlobalSideID = SurfSide2GlobalSide(SURF_SIDEID,iSurfSide) + IF(SideInfo_Shared(SIDE_NBSIDEID,GlobalSideID).GT.0) THEN + IF(GlobalSideID.LT.SideInfo_Shared(SIDE_NBSIDEID,GlobalSideID)) THEN + SurfSideNb = GlobalSide2SurfSide(SURF_SIDEID,SideInfo_Shared(SIDE_NBSIDEID,GlobalSideID)) + PhotonSampWall(:,iSurfSide) = PhotonSampWall(:,iSurfSide) + PhotonSampWall(:,SurfSideNb) + ELSE + CYCLE + END IF + END IF + OutputCounter = OutputCounter + 1 + helpArray(1,OutputCounter)= PhotonSampWall(1,iSurfSide) + ! SurfaceArea should be changed to 1:SurfMesh%nSides if inner sampling sides exist... + helpArray(2,OutputCounter)= PhotonSampWall(2,iSurfSide)/SurfSideArea(1,1,iSurfSide) + END DO + CALL WriteArrayToHDF5(DataSetName=H5_Name , rank=4 , & + nValGlobal =(/nVar2D , 1, 1 , nGlobalSides/) , & + nVal =(/nVar2D , 1, 1 , LocalnBCSides/) , & + offset =(/0_IK, 0_IK , 0_IK , offsetSurfSide/), & + collective =.TRUE. ,& + RealArray=helpArray(1:nVar2D,1:LocalnBCSides)) + DEALLOCATE(helpArray) +END ASSOCIATE + +#if USE_MPI +END ASSOCIATE #endif /*USE_MPI*/ +CALL CloseDataFile() + +IF (mySurfRank.EQ.0) THEN + tend=LOCALTIME() + WRITE(UNIT_stdOut,'(A,F0.3,A)',ADVANCE='YES')'DONE [',tend-tstart,'s]' +END IF -!SUBROUTINE WriteSurfSampleToHDF5() -!!=================================================================================================================================== -!!> write the final values of the surface sampling to a HDF5 state file -!!> additional performs all the final required computations -!!=================================================================================================================================== -!! MODULES ! -!!----------------------------------------------------------------------------------------------------------------------------------! -!USE MOD_Globals -!USE MOD_IO_HDF5 -!USE MOD_Globals_Vars, ONLY:ProjectName -!USE MOD_Particle_Boundary_Vars, ONLY:SurfMesh,offSetSurfSide!,nSurfSample -!USE MOD_HDF5_Output, ONLY:WriteAttributeToHDF5,WriteArrayToHDF5,WriteHDF5Header -!USE MOD_Particle_Boundary_Vars, ONLY:SurfCOMM,nSurfBC,SurfBCName -!USE MOD_Mesh_Vars, ONLY:MeshFile -!USE MOD_RadiationTrans_Vars, ONLY:PhotonSampWall -!!----------------------------------------------------------------------------------------------------------------------------------! -!! IMPLICIT VARIABLE HANDLING -!IMPLICIT NONE -!! INPUT VARIABLES -!!----------------------------------------------------------------------------------------------------------------------------------! -!! OUTPUT VARIABLES -!!----------------------------------------------------------------------------------------------------------------------------------- -!! LOCAL VARIABLES -!CHARACTER(LEN=255) :: FileString,Statedummy -!CHARACTER(LEN=255) :: H5_Name -!CHARACTER(LEN=255) :: NodeTypeTemp -!CHARACTER(LEN=255),ALLOCATABLE :: Str2DVarNames(:) -!INTEGER :: nVar2D -!REAL :: tstart,tend -!REAL, ALLOCATABLE :: helpArray(:,:) -!!=================================================================================================================================== -!#if USE_MPI -!! Return if not a sampling leader -!IF (MPI_COMM_LEADERS_SURF.EQ.MPI_COMM_NULL) RETURN -!CALL MPI_BARRIER(MPI_COMM_LEADERS_SURF,iERROR) - -!! Return if no sampling sides -!IF (nSurfTotalSides .EQ.0) RETURN -!#endif /*USE_MPI*/ -!IF (mySurfRank.EQ.0) THEN -! WRITE(UNIT_stdOut,'(a)',ADVANCE='NO')' WRITE Radiation SurfSTATE TO HDF5 FILE...' -! tstart=LOCALTIME() -!END IF - -!FileString=TRIM(ProjectName)//'_RadiationSurfState.h5' -!nVar2D = 2 - -!! Generate skeleton for the file with all relevant data on a single proc (MPIRoot) -!#if USE_MPI -!IF (mySurfRank.EQ.0) THEN -!#endif /*USE_MPI*/ -! CALL OpenDataFile(FileString,create=.TRUE.,single=.TRUE.,readOnly=.FALSE.) -! Statedummy = 'RadiationSurfState' -! ! Write file header -! CALL WriteHDF5Header(Statedummy,File_ID) -! CALL WriteAttributeToHDF5(File_ID,'RadiationnSurfSample',1,IntegerScalar=1) -! CALL WriteAttributeToHDF5(File_ID,'MeshFile',1,StrScalar=(/TRIM(MeshFile)/)) -! CALL WriteAttributeToHDF5(File_ID,'BC_Surf',nSurfBC,StrArray=SurfBCName) -! CALL WriteAttributeToHDF5(File_ID,'N',1,IntegerScalar=1) -! NodeTypeTemp='VISU' -! CALL WriteAttributeToHDF5(File_ID,'NodeType',1,StrScalar=(/NodeTypeTemp/)) - -! ALLOCATE(Str2DVarNames(1:nVar2D)) -! ! fill varnames for total values -! Str2DVarNames(1) ='PhotonCount' -! Str2DVarNames(2) ='HeatFlux' - -! CALL WriteAttributeToHDF5(File_ID,'VarNamesSurface',nVar2D,StrArray=Str2DVarNames) - -! CALL CloseDataFile() -! DEALLOCATE(Str2DVarNames) -!#if USE_MPI -!END IF -!CALL MPI_BARRIER(MPI_COMM_LEADERS_SURF,iERROR) -!CALL OpenDataFile(FileString,create=.FALSE.,single=.FALSE.,readOnly=.FALSE.,communicatorOpt=MPI_COMM_LEADERS_SURF) -!#else -!CALL OpenDataFile(FileString,create=.FALSE.,single=.FALSE.,readOnly=.FALSE.) -!#endif /*USE_MPI*/ - - -!WRITE(H5_Name,'(A)') 'SurfaceData' -!ASSOCIATE (& -! nGlobalSides => INT(nOutputSides,IK) ,& -! LocalnBCSides => INT(nComputeNodeSurfOutputSides,IK) ,& -! offsetSurfSide => INT(offsetComputeNodeSurfOutputSide,IK) ,& -! nVar2D => INT(nVar2D,IK)) - -! ALLOCATE(helpArray(nVar2D,LocalnBCSides)) - -! helpArray(1,1:LocalnBCSides)= PhotonSampWall(1,1:LocalnBCSides) -! ! SurfaceArea should be changed to 1:SurfMesh%nSides if inner sampling sides exist... -! helpArray(2,1:LocalnBCSides)= PhotonSampWall(2,1:LocalnBCSides)/SurfSideArea(1,1,1:LocalnBCSides) -! CALL WriteArrayToHDF5(DataSetName=H5_Name , rank=4 , & -! nValGlobal =(/nVar2D , 1, 1 , nGlobalSides/) , & -! nVal =(/nVar2D , 1, 1 , LocalnBCSides/) , & -! offset =(/0_IK, 0_IK , 0_IK , offsetSurfSide/), & -! collective =.TRUE. ,& -! RealArray=helpArray(1:nVar2D,1:LocalnBCSides)) -! DEALLOCATE(helpArray) -!END ASSOCIATE - -!CALL CloseDataFile() - -!IF (mySurfRank.EQ.0) THEN -! tend=LOCALTIME() -! WRITE(UNIT_stdOut,'(A,F0.3,A)',ADVANCE='YES')'DONE [',tend-tstart,'s]' -!END IF - -!END SUBROUTINE WriteSurfSampleToHDF5 +END SUBROUTINE WriteSurfSampleToHDF5 END MODULE MOD_RadTrans_Output diff --git a/src/timedisc/timedisc_TimeStep_Radiation.f90 b/src/timedisc/timedisc_TimeStep_Radiation.f90 index ff28db8ee..a603abc9c 100644 --- a/src/timedisc/timedisc_TimeStep_Radiation.f90 +++ b/src/timedisc/timedisc_TimeStep_Radiation.f90 @@ -33,7 +33,7 @@ SUBROUTINE TimeStep_Radiation() !=================================================================================================================================== ! MODULES USE MOD_RadTransport, ONLY: RadTrans_main -USE MOD_RadTrans_Output, ONLY: WriteRadiationToHDF5 !, WriteSurfSampleToHDF5 +USE MOD_RadTrans_Output, ONLY: WriteRadiationToHDF5, WriteSurfSampleToHDF5 ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -45,7 +45,7 @@ SUBROUTINE TimeStep_Radiation() CALL RadTrans_main() CALL WriteRadiationToHDF5() -!CALL WriteSurfSampleToHDF5() +CALL WriteSurfSampleToHDF5() END SUBROUTINE TimeStep_Radiation From ee48fc1787fe0add532db31c21249250ed600a8e Mon Sep 17 00:00:00 2001 From: Marcel Pfeiffer Date: Fri, 27 Aug 2021 21:59:47 +0200 Subject: [PATCH 009/495] working photon 2D sym photon tracking --- .../particle_mesh/particle_mesh_build.f90 | 146 ++++- .../particle_mesh/particle_mesh_vars.f90 | 11 + .../radiative_transfer/radtrans_init.f90 | 9 +- .../radiative_transfer/radtrans_main.f90 | 11 +- .../tracking/radtrans_tools.f90 | 532 +++++++++--------- .../tracking/radtrans_tracking.f90 | 374 ++++++------ 6 files changed, 615 insertions(+), 468 deletions(-) diff --git a/src/particles/particle_mesh/particle_mesh_build.f90 b/src/particles/particle_mesh/particle_mesh_build.f90 index 8649ffec2..9a2371fa6 100644 --- a/src/particles/particle_mesh/particle_mesh_build.f90 +++ b/src/particles/particle_mesh/particle_mesh_build.f90 @@ -27,11 +27,155 @@ MODULE MOD_Particle_Mesh_Build PUBLIC:: BuildElementRadiusTria,BuildElemTypeAndBasisTria,BuildEpsOneCell,BuildBCElemDistance PUBLIC:: BuildNodeNeighbourhood,BuildElementOriginShared,BuildElementBasisAndRadius -PUBLIC:: BuildSideOriginAndRadius,BuildLinearSideBaseVectors +PUBLIC:: BuildSideOriginAndRadius,BuildLinearSideBaseVectors, BuildMesh2DInfo !=================================================================================================================================== CONTAINS +SUBROUTINE BuildMesh2DInfo() +!=================================================================================================================================== +!> Routine determines a symmetry side and calculates the 2D (area faces in symmetry plane) and axisymmetric volumes (cells are +!> revolved around the symmetry axis). The symmetry side will be used later on to determine in which two directions the quadtree +!> shall refine the mesh, skipping the z-dimension to avoid an unnecessary refinement. +!=================================================================================================================================== +! MODULES +USE MOD_Globals +USE MOD_PreProc +USE MOD_Mesh_Vars ,ONLY: nElems +USE MOD_Particle_Boundary_Vars ,ONLY: PartBound +USE MOD_Particle_Mesh_Vars ,ONLY: GEO +USE MOD_Particle_Mesh_Vars ,ONLY: SideIsSymSide, nComputeNodeSides, ElemBaryNGeo +USE MOD_Particle_Mesh_Vars ,ONLY: NodeCoords_Shared,ElemSideNodeID_Shared, SideInfo_Shared, ElemInfo_Shared +USE MOD_Mesh_Tools ,ONLY: GetGlobalElemID +USE MOD_Particle_Mesh_Tools ,ONLY: GetGlobalNonUniqueSideID +#if USE_MPI +USE MOD_MPI_Shared +USE MOD_MPI_Shared_Vars ,ONLY: MPI_COMM_SHARED, nComputeNodeTotalElems +USE MOD_Particle_Mesh_Vars ,ONLY: nNonUniqueGlobalSides, SideIsSymSide_Shared, SideIsSymSide_Shared_Win +USE MOD_Particle_Mesh_Vars ,ONLY: ElemSideNodeID2D_Shared, ElemSideNodeID2D_Shared_Win, SideNormalEdge2D_Shared +USE MOD_Particle_Mesh_Vars ,ONLY: SideNormalEdge2D_Shared_Win +USE MOD_MPI_Shared_Vars ,ONLY: myComputeNodeRank, nComputeNodeProcessors +#endif /*USE_MPI*/ +! IMPLICIT VARIABLE HANDLING + IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +INTEGER :: SideID, iLocSide, iNode, BCSideID, locElemID, CNElemID, iSide, iELem +REAL :: VecCell(2), FaceMidPoint(2), NormVec(2), EdgeVec(2), nVal +INTEGER :: firstElem,lastElem, firstSide, lastSide, GlobalElemID, tmpNode +LOGICAL :: DefineSide +!=================================================================================================================================== + +#if USE_MPI +CALL Allocate_Shared((/nNonUniqueGlobalSides/),SideIsSymSide_Shared_Win,SideIsSymSide_Shared) +CALL MPI_WIN_LOCK_ALL(0,SideIsSymSide_Shared_Win,IERROR) + +SideIsSymSide => SideIsSymSide_Shared +#else +! allocate local array for ElemInfo +ALLOCATE(SideIsSymSide(nComputeNodeSides)) +#endif /*USE_MPI*/ + +#if USE_MPI + firstSide = INT(REAL( myComputeNodeRank *nNonUniqueGlobalSides)/REAL(nComputeNodeProcessors))+1 + lastSide = INT(REAL((myComputeNodeRank+1)*nNonUniqueGlobalSides)/REAL(nComputeNodeProcessors)) +#else + firstSide = 1 + lastSide = nComputeNodeSides +#endif + +DO iSide = firstSide, lastSide + ! ignore non-BC sides + IF (SideInfo_Shared(SIDE_BCID,iSide).LE.0) THEN + SideIsSymSide(iSide) = .FALSE. + CYCLE + END IF + +#if USE_MPI + ! ignore sides outside of halo region + IF (ElemInfo_Shared(ELEM_HALOFLAG,SideInfo_Shared(SIDE_ELEMID,iSide)).EQ.0) THEN + SideIsSymSide(iSide) = .FALSE. + CYCLE + END IF +#endif /*USE_MPI*/ + IF (PartBound%TargetBoundCond(PartBound%MapToPartBC(SideInfo_Shared(SIDE_BCID,iSide))).EQ.PartBound%SymmetryBC) THEN + SideIsSymSide(iSide) = .TRUE. + ELSE + SideIsSymSide(iSide) = .FALSE. + END IF +END DO +#if USE_MPI +CALL BARRIER_AND_SYNC(SideIsSymSide_Shared_Win,MPI_COMM_SHARED) + +CALL Allocate_Shared((/2,6,nComputeNodeTotalElems/),ElemSideNodeID2D_Shared_Win,ElemSideNodeID2D_Shared) +CALL MPI_WIN_LOCK_ALL(0,ElemSideNodeID2D_Shared_Win,IERROR) +CALL Allocate_Shared((/4,6,nComputeNodeTotalElems/),SideNormalEdge2D_Shared_Win,SideNormalEdge2D_Shared) +CALL MPI_WIN_LOCK_ALL(0,SideNormalEdge2D_Shared_Win,IERROR) + +firstElem = INT(REAL( myComputeNodeRank *nComputeNodeTotalElems)/REAL(nComputeNodeProcessors))+1 +lastElem = INT(REAL((myComputeNodeRank+1)*nComputeNodeTotalElems)/REAL(nComputeNodeProcessors)) +#else +ALLOCATE(ElemSideNodeID2D_Shared(1:2,1:6,1:nElems)) +ALLOCATE(SideNormalEdge2D_Shared(1:4,1:6,1:nElems)) +firstElem = 1 +lastElem = nElems +#endif + +DO iElem = firstElem, lastElem + GlobalElemID = GetGlobalElemID(iElem) + DO iLocSide = 1, 6 + DefineSide = .TRUE. + SideID=GetGlobalNonUniqueSideID(GlobalElemID,iLocSide) + IF (SideInfo_Shared(SIDE_BCID,SideID).GT.0) THEN + IF (PartBound%TargetBoundCond(PartBound%MapToPartBC(SideInfo_Shared(SIDE_BCID,SideID))).EQ.PartBound%SymmetryBC) THEN + ElemSideNodeID2D_Shared(:,iLocSide, iElem) = -1 + SideNormalEdge2D_Shared(:,iLocSide, iElem) = 0. + DefineSide = .FALSE. + END IF + END IF + + IF (DefineSide) THEN + tmpNode = 0 + DO iNode = 1, 4 + IF(NodeCoords_Shared(3,ElemSideNodeID_Shared(iNode,iLocSide,iElem)+1).GT.(GEO%zmaxglob+GEO%zminglob)/2.) THEN + tmpNode = tmpNode + 1 + ElemSideNodeID2D_Shared(tmpNode,iLocSide, iElem) = ElemSideNodeID_Shared(iNode,iLocSide,iElem)+1 + END IF + END DO + EdgeVec(1:2) = NodeCoords_Shared(1:2,ElemSideNodeID2D_Shared(2,ilocSide,iElem))-NodeCoords_Shared(1:2,ElemSideNodeID2D_Shared(1,ilocSide,iElem)) + NormVec(1) = -EdgeVec(2) + NormVec(2) = EdgeVec(1) + FaceMidPoint(1:2) = (NodeCoords_Shared(1:2,ElemSideNodeID_Shared(1,iLocSide,iElem)+1) & + + NodeCoords_Shared(1:2,ElemSideNodeID_Shared(2,iLocSide,iElem)+1)& + + NodeCoords_Shared(1:2,ElemSideNodeID_Shared(3,iLocSide,iElem)+1) & + + NodeCoords_Shared(1:2,ElemSideNodeID_Shared(4,iLocSide,iElem)+1)) / 4. + VecCell(1:2) = FaceMidPoint(1:2) - ElemBaryNGeo(1:2,iElem) ! vector from elem bary to side + IF (DOT_PRODUCT(VecCell,NormVec).GT.0.0) THEN + SideNormalEdge2D_Shared(1:2,iLocSide, iElem) = NormVec(1:2) + ELSE + SideNormalEdge2D_Shared(1,iLocSide, iElem) = EdgeVec(2) + SideNormalEdge2D_Shared(2,iLocSide, iElem) = -EdgeVec(1) + END IF + nVal = SQRT(SideNormalEdge2D_Shared(1,iLocSide,iElem)**2. + SideNormalEdge2D_Shared(2,iLocSide,iElem)**2.) + SideNormalEdge2D_Shared(1,iLocSide,iElem)= SideNormalEdge2D_Shared(1,iLocSide,iElem)/ nVal + SideNormalEdge2D_Shared(2,iLocSide,iElem)= SideNormalEdge2D_Shared(2,iLocSide,iElem) / nVal + nVal = SQRT(EdgeVec(1)**2. + EdgeVec(2)**2.) + SideNormalEdge2D_Shared(3,iLocSide,iElem) = EdgeVec(1) / nVal + SideNormalEdge2D_Shared(4,iLocSide,iElem) = EdgeVec(2) / nVal + END IF + END DO +END DO + +#if USE_MPI +CALL BARRIER_AND_SYNC(ElemSideNodeID2D_Shared_Win,MPI_COMM_SHARED) +CALL BARRIER_AND_SYNC(SideNormalEdge2D_Shared_Win,MPI_COMM_SHARED) +#endif + +END SUBROUTINE BuildMesh2DInfo SUBROUTINE BuildElementRadiusTria() !================================================================================================================================ diff --git a/src/particles/particle_mesh/particle_mesh_vars.f90 b/src/particles/particle_mesh/particle_mesh_vars.f90 index 8550d6d19..05e56a624 100644 --- a/src/particles/particle_mesh/particle_mesh_vars.f90 +++ b/src/particles/particle_mesh/particle_mesh_vars.f90 @@ -166,7 +166,18 @@ MODULE MOD_Particle_Mesh_Vars REAL,ALLOCPOINT :: ElemCharLengthY_Shared(:) REAL,ALLOCPOINT :: ElemCharLengthZ_Shared(:) + +INTEGER,ALLOCPOINT :: ElemSideNodeID2D_Shared(:,:,:) !> Contains the 4 corner nodes of the local sides in an element +LOGICAL,ALLOCPOINT :: SideIsSymSide(:) +REAL,ALLOCPOINT :: SideNormalEdge2D_Shared(:,:,:) + #if USE_MPI +INTEGER :: SideNormalEdge2D_Shared_Win +INTEGER :: ElemSideNodeID2D_Shared_Win +INTEGER :: SideIsSymSide_Shared_Win +LOGICAL,ALLOCPOINT :: SideIsSymSide_Shared(:) + + ! integers to hold shared memory windows INTEGER :: NodeToElemMapping_Shared_Win INTEGER :: NodeToElemInfo_Shared_Win diff --git a/src/radiation/radiative_transfer/radtrans_init.f90 b/src/radiation/radiative_transfer/radtrans_init.f90 index 630649f81..16401bb5a 100644 --- a/src/radiation/radiative_transfer/radtrans_init.f90 +++ b/src/radiation/radiative_transfer/radtrans_init.f90 @@ -73,8 +73,10 @@ SUBROUTINE InitRadiationTransport() USE MOD_DSMC_Vars, ONLY: RadialWeighting USE MOD_Output, ONLY: PrintStatusLineRadiation USE MOD_Mesh_Tools, ONLY : GetGlobalElemID +USE MOD_Particle_Vars, ONLY : Symmetry USE MOD_MPI_Shared_Vars USE MOD_MPI_Shared +USE MOD_Particle_Mesh_Build, ONLY: BuildMesh2DInfo ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -83,7 +85,7 @@ SUBROUTINE InitRadiationTransport() ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -INTEGER :: iWave, iElem, iNode, firstElem, lastElem +INTEGER :: iWave, iElem, iNode, firstElem, lastElem, ElemDisp REAL :: LocTemp !=================================================================================================================================== SWRITE(UNIT_StdOut,'(132("-"))') @@ -98,6 +100,8 @@ SUBROUTINE InitRadiationTransport() RadiationPhotonPosModel = GETINT('Radiation-PhotonPosModel','1') RadEmiAdaptPhotonNum = GETLOGICAL('Radiation-AdaptivePhotonNumEmission','.FALSE.') +IF(Symmetry%Order.EQ.2) CALL BuildMesh2DInfo() + #if USE_MPI ! allocate shared array for Radiation_Emission/Absorption_Spec CALL Allocate_Shared((/nGlobalElems/),RadiationElemAbsEnergy_Shared_Win,RadiationElemAbsEnergy_Shared) @@ -140,8 +144,9 @@ SUBROUTINE InitRadiationTransport() SELECT CASE(RadiationSwitches%RadType) CASE(1) !calls radition solver module SWRITE(UNIT_stdOut,'(A)') ' Calculate Radiation Data per Cell ...' + ElemDisp = INT((lastElem-firstElem+1)/20) DO iElem = firstElem, lastElem - IF(MPIroot.AND.(MOD(iElem,10).EQ.0)) CALL PrintStatusLineRadiation(REAL(iElem),REAL(firstElem),REAL(lastElem),.FALSE.) + IF(MPIroot.AND.(MOD(iElem,ElemDisp).EQ.0)) CALL PrintStatusLineRadiation(REAL(iElem),REAL(firstElem),REAL(lastElem),.FALSE.) CALL radiation_main(iElem) DO iWave = 1, RadiationParameter%WaveLenDiscr Radiation_Emission_Spec_Total(iElem) = Radiation_Emission_Spec_Total(iElem) & diff --git a/src/radiation/radiative_transfer/radtrans_main.f90 b/src/radiation/radiative_transfer/radtrans_main.f90 index 7f31b32c4..65a105890 100644 --- a/src/radiation/radiative_transfer/radtrans_main.f90 +++ b/src/radiation/radiative_transfer/radtrans_main.f90 @@ -46,13 +46,14 @@ SUBROUTINE RadTrans_main() USE MOD_RadiationTrans_Vars ,ONLY : Radiation_Emission_Spec_Total, RadTrans, RadEmiAdaptPhotonNum USE MOD_RadiationTrans_Vars ,ONLY : PhotonProps, RadiationDirectionModel, RadTransPhotPerCellLoc USE MOD_RadiationTrans_Vars ,ONLY : RadTransPhotPerCell, RadTransPhotPerCell_Shared_Win -USE MOD_Photon_Tracking ,ONLY : PhotonTriaTracking!, Photon2DSymTracking +USE MOD_Photon_Tracking ,ONLY : PhotonTriaTracking, Photon2DSymTracking USE MOD_Radiation_Vars ,ONLY : RadiationSwitches USE MOD_DSMC_Vars ,ONLY : RadialWeighting USE MOD_Mesh_Tools ,ONLY: GetGlobalElemID USE MOD_Output, ONLY: PrintStatusLineRadiation USE MOD_MPI_Shared_Vars USE MOD_MPI_Shared +USE MOD_Particle_Vars ,ONLY: Symmetry ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -158,11 +159,11 @@ SUBROUTINE RadTrans_main() END IF PhotonProps%PhotonDirection(1:3) = SetPhotonStartDirection(iElem, iPhotLoc, RandRot) PhotonProps%WaveLength = SetParticleWavelength(iElem) -! IF (Symmetry2DAxisymmetric) THEN -! CALL Photon2DSymTracking() -! ELSE + IF(Symmetry%Axisymmetric) THEN + CALL Photon2DSymTracking() + ELSE CALL PhotonTriaTracking() -! END IF + END IF END DO END IF photonCount = photonCount + RadTransPhotPerCell(iELem) diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tools.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tools.f90 index 10b4d11b4..e83075921 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tools.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tools.f90 @@ -27,7 +27,7 @@ MODULE MOD_Photon_TrackingTools PUBLIC :: PhotonThroughSideCheck3DFast, PhotonIntersectionWithSide, CalcAbsoprtion, PerfectPhotonReflection, DiffusePhotonReflection PUBLIC :: CalcWallAbsoprtion -!PUBLIC :: PhotonIntersectionWithSide2D, RotatePhotonIn2DPlane, PerfectPhotonReflection2D,DiffusePhotonReflection2D +PUBLIC :: PhotonIntersectionWithSide2D, RotatePhotonIn2DPlane, PerfectPhotonReflection2D,DiffusePhotonReflection2D !----------------------------------------------------------------------------------------------------------------------------------- !----------------------------------------------------------------------------------------------------------------------------------- !=================================================================================================================================== @@ -140,175 +140,177 @@ SUBROUTINE PhotonThroughSideCheck3DFast(iLocSide,Element,ThroughSide,TriNum, IsM END SUBROUTINE PhotonThroughSideCheck3DFast -!SUBROUTINE PhotonIntersectionWithSide2D(iLocSide,ElemID,ThroughSide,IntersectionPos,isLastSide,Distance) -!!=================================================================================================================================== -!!> Routine to check whether a photon crossed the given side. -!!=================================================================================================================================== -!! MODULES -!USE MOD_Particle_Mesh_Vars, ONLY : GEO, PartElemToSide2D -!USE MOD_RadiationTrans_Vars, ONLY:PhotonProps -!! IMPLICIT VARIABLE HANDLING -!IMPLICIT NONE -!! INPUT VARIABLES -!!----------------------------------------------------------------------------------------------------------------------------------- -!! INPUT/OUTPUT VARIABLES -!LOGICAL,INTENT(OUT) :: ThroughSide -!INTEGER,INTENT(IN) :: iLocSide, ElemID -!REAL, INTENT(OUT) :: IntersectionPos(3) -!REAL, INTENT(OUT) :: Distance -!LOGICAL, INTENT(IN) :: isLastSide -!!----------------------------------------------------------------------------------------------------------------------------------- -!! LOCAL VARIABLES -!REAL :: y_photon_start,x_photon_start,yNode1,xNode1,yNode2,xNode2,sy,sz,sx -!REAL :: l1,S1,l2,S2,l,S -!REAL :: beta, alpha, deltay, a, b, c, tmpsqrt -!!=================================================================================================================================== -! -! ThroughSide = .FALSE. - -! xNode1 = GEO%NodeCoords(1,PartElemToSide2D(iLocSide,2, ElemID)) -! yNode1 = GEO%NodeCoords(2,PartElemToSide2D(iLocSide,2, ElemID)) -! xNode2 = GEO%NodeCoords(1,PartElemToSide2D(iLocSide,3, ElemID)) -! yNode2 = GEO%NodeCoords(2,PartElemToSide2D(iLocSide,3, ElemID)) - -! x_photon_start=PhotonProps%PhotonLastPos(1) -! y_photon_start=PhotonProps%PhotonLastPos(2) - -! sx=PhotonProps%PhotonDirection(1) -! sy=PhotonProps%PhotonDirection(2) -! sz=PhotonProps%PhotonDirection(3) - -! IF (sx .EQ. 0.0) THEN -! l = (x_photon_start-xNode1)/(xNode2-xNode1) -! a = sy*sy + sz*sz -! b = 2*sy*y_photon_start -! c = y_photon_start*y_photon_start - yNode1*yNode1 + 2.*l*yNode1*yNode1 - l*l*yNode1*yNode1 & -! - 2.*yNode1*yNode2*l + 2.*yNode1*yNode2*l*l - yNode2*yNode2*l*l -! tmpsqrt = b*b - 4.*a*c -! IF (tmpsqrt.LE.0.0) THEN -! RETURN -! END IF -! S1 = (-b+SQRT(tmpsqrt))/(2.*a) -! S2 = (-b-SQRT(tmpsqrt))/(2.*a) - -! IF(isLastSide) THEN -! IF (ALMOSTEQUAL(S1,S2)) THEN -! RETURN ! TODO -! ELSE IF (ABS(S1).GT.ABS(S2)) THEN -! S=S1 -! ELSE -! S=S2 -! END IF -! ELSE -! IF (S1.LE.0.0) THEN -! S = S2 -! ELSE -! IF (S2.GT.0.0) THEN -! IF(S2.GT.S1) THEN -! S = S1 -! ELSE -! S = S2 -! END IF -! ELSE -! S = S1 -! END IF -! END IF -! END IF - - -! ELSE -! alpha = (xNode1 - x_photon_start) / sx -! beta = (xNode2 - xNode1) / sx -! deltay = (yNode2 - yNode1) -! a = beta*beta*sy*sy - deltay*deltay + beta*beta*sz*sz -! b = 2.*beta*sy*y_photon_start + 2.*alpha*beta*sy*sy - 2.*deltay*yNode1 + 2.*alpha*beta*sz*sz -! c = y_photon_start*y_photon_start - yNode1*yNode1 + 2.*alpha*sy*y_photon_start + alpha*alpha*sy*sy + sz*sz*alpha*alpha -! tmpsqrt = b*b - 4.*a*c -! IF (tmpsqrt.LE.0.0) THEN -! RETURN -! END IF -! l1 = (-b + SQRT(tmpsqrt))/(2.*a) -! S1 = (xNode1-x_photon_start+(xNode2-xNode1)*l1)/sx -! l2 = (-b - SQRT(tmpsqrt))/(2.*a) -! S2 = (xNode1-x_photon_start+(xNode2-xNode1)*l2)/sx - -! IF (isLastSide) THEN -! IF (ALMOSTEQUAL(S1,S2).AND.ALMOSTEQUAL(ABS(l1),ABS(l2))) THEN -! RETURN -! ELSE IF (ALMOSTEQUAL(S1,S2)) THEN -! IF (ABS(l1).GT.ABS(l2)) THEN -! l=l1; S=S1 -! ELSE -! l=l2; S=S2 -! END IF -! ELSE IF (ABS(S1).GT.ABS(S2)) THEN !though same spot again, caused by numerical inaccuray (discard shorter solution) -! l=l1; S=S1 -! ELSE -! l=l2; S=S2 -! END IF -! ELSE IF ((l1.LE.0.0).OR.(l1.GE.1.0)) THEN !if 1 is not a valid intersection -> 2 -! l = l2; S = S2 -! ELSE !1 is valid intersection -! IF ((S1.LE.0.0)) THEN !1 would be moving backwards -> 2 -! l = l2; S = S2 -! ELSE -! IF ((l2.GT.0.0).AND.(l2.LT.1.0).AND.(S2.GT.0.0)) THEN !1 and 2 valid -> chose shorter one -! IF (S2.GT.S1) THEN -! l=l1; S=S1 -! ELSE -! l=l2; S=S2 -! END IF -! ELSE !1 is only valid intersection -> 1 -! l=l1; S=S1 -! END IF -! END IF -! END IF - -! END IF - -! IF((S .GT. 0.0) .AND. (0.0 .LE. l) .AND. (l .LE. 1.0)) THEN -! ThroughSide = .TRUE. -! IntersectionPos(1) = PhotonProps%PhotonLastPos(1) + S*sx -! IntersectionPos(2) = PhotonProps%PhotonLastPos(2) + S*sy -! IntersectionPos(3) = S*sz -! Distance = S -! END IF -! -! RETURN -! -!END SUBROUTINE PhotonIntersectionWithSide2D - -!SUBROUTINE RotatePhotonIn2DPlane(IntersectionPos) -!!=================================================================================================================================== -!!> Routine to check whether a photon crossed the given side. -!!=================================================================================================================================== -!! MODULES -!USE MOD_RadiationTrans_Vars, ONLY:PhotonProps -!! IMPLICIT VARIABLE HANDLING -!IMPLICIT NONE -!!----------------------------------------------------------------------------------------------------------------------------------- -!! INPUT/OUTPUT VARIABLES -!REAL, INTENT(OUT) :: IntersectionPos(3) -!!----------------------------------------------------------------------------------------------------------------------------------- -!! LOCAL VARIABLES -!REAL :: NewYPho, NewYVelo -! !=================================================================================================================================== -!PhotonProps%PhotonLastPos(1:3) = IntersectionPos(1:3) -!NewYPho = SQRT(PhotonProps%PhotonLastPos(2)**2 + PhotonProps%PhotonLastPos(3)**2) -!! Rotation: Vy' = Vy * cos(alpha) + Vz * sin(alpha) = Vy * y/y' + Vz * z/y' -!! Vz' = - Vy * sin(alpha) + Vz * cos(alpha) = - Vy * z/y' + Vz * y/y' -!! Right-hand system, using new y and z positions after tracking, position vector and velocity vector DO NOT have to -!! coincide (as opposed to Bird 1994, p. 391, where new positions are calculated with the velocity vector) -!NewYVelo = (PhotonProps%PhotonDirection(2)*PhotonProps%PhotonLastPos(2) & -! + PhotonProps%PhotonDirection(3)*PhotonProps%PhotonLastPos(3))/NewYPho -!PhotonProps%PhotonDirection(3) = (-PhotonProps%PhotonDirection(2)*PhotonProps%PhotonLastPos(3) & -! + PhotonProps%PhotonDirection(3)*PhotonProps%PhotonLastPos(2))/NewYPho -!PhotonProps%PhotonLastPos(2) = NewYPho -!PhotonProps%PhotonLastPos(3) = 0.0 -!PhotonProps%PhotonDirection(2) = NewYVelo -!PhotonProps%PhotonPos(1:3) = PhotonProps%PhotonLastPos(1:3) -! -!END SUBROUTINE RotatePhotonIn2DPlane +SUBROUTINE PhotonIntersectionWithSide2D(iLocSide,Element,ThroughSide,IntersectionPos,isLastSide,Distance) +!=================================================================================================================================== +!> Routine to check whether a photon crossed the given side. +!=================================================================================================================================== +! MODULES +USE MOD_Particle_Mesh_Vars, ONLY : ElemSideNodeID2D_Shared, NodeCoords_Shared +USE MOD_RadiationTrans_Vars, ONLY : PhotonProps +USE MOD_Mesh_Tools ,ONLY: GetCNElemID +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +! INPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT/OUTPUT VARIABLES +LOGICAL,INTENT(OUT) :: ThroughSide +INTEGER,INTENT(IN) :: iLocSide, Element +REAL, INTENT(OUT) :: IntersectionPos(3) +REAL, INTENT(OUT) :: Distance +LOGICAL, INTENT(IN) :: isLastSide +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +INTEGER :: CNElemID +REAL :: y_photon_start,x_photon_start,yNode1,xNode1,yNode2,xNode2,sy,sz,sx +REAL :: l1,S1,l2,S2,l,S +REAL :: beta, alpha, deltay, a, b, c, tmpsqrt +!=================================================================================================================================== + CNElemID = GetCNElemID(Element) + ThroughSide = .FALSE. + + xNode1 = NodeCoords_Shared(1,ElemSideNodeID2D_Shared(1,iLocSide, CNElemID)) + yNode1 = NodeCoords_Shared(2,ElemSideNodeID2D_Shared(1,iLocSide, CNElemID)) + xNode2 = NodeCoords_Shared(1,ElemSideNodeID2D_Shared(2,iLocSide, CNElemID)) + yNode2 = NodeCoords_Shared(2,ElemSideNodeID2D_Shared(2,iLocSide, CNElemID)) + + x_photon_start=PhotonProps%PhotonLastPos(1) + y_photon_start=PhotonProps%PhotonLastPos(2) + + sx=PhotonProps%PhotonDirection(1) + sy=PhotonProps%PhotonDirection(2) + sz=PhotonProps%PhotonDirection(3) + + IF (sx .EQ. 0.0) THEN + l = (x_photon_start-xNode1)/(xNode2-xNode1) + a = sy*sy + sz*sz + b = 2*sy*y_photon_start + c = y_photon_start*y_photon_start - yNode1*yNode1 + 2.*l*yNode1*yNode1 - l*l*yNode1*yNode1 & + - 2.*yNode1*yNode2*l + 2.*yNode1*yNode2*l*l - yNode2*yNode2*l*l + tmpsqrt = b*b - 4.*a*c + IF (tmpsqrt.LE.0.0) THEN + RETURN + END IF + S1 = (-b+SQRT(tmpsqrt))/(2.*a) + S2 = (-b-SQRT(tmpsqrt))/(2.*a) + + IF(isLastSide) THEN + IF (ALMOSTEQUAL(S1,S2)) THEN + RETURN ! TODO + ELSE IF (ABS(S1).GT.ABS(S2)) THEN + S=S1 + ELSE + S=S2 + END IF + ELSE + IF (S1.LE.0.0) THEN + S = S2 + ELSE + IF (S2.GT.0.0) THEN + IF(S2.GT.S1) THEN + S = S1 + ELSE + S = S2 + END IF + ELSE + S = S1 + END IF + END IF + END IF + + + ELSE + alpha = (xNode1 - x_photon_start) / sx + beta = (xNode2 - xNode1) / sx + deltay = (yNode2 - yNode1) + a = beta*beta*sy*sy - deltay*deltay + beta*beta*sz*sz + b = 2.*beta*sy*y_photon_start + 2.*alpha*beta*sy*sy - 2.*deltay*yNode1 + 2.*alpha*beta*sz*sz + c = y_photon_start*y_photon_start - yNode1*yNode1 + 2.*alpha*sy*y_photon_start + alpha*alpha*sy*sy + sz*sz*alpha*alpha + tmpsqrt = b*b - 4.*a*c + IF (tmpsqrt.LE.0.0) THEN + RETURN + END IF + l1 = (-b + SQRT(tmpsqrt))/(2.*a) + S1 = (xNode1-x_photon_start+(xNode2-xNode1)*l1)/sx + l2 = (-b - SQRT(tmpsqrt))/(2.*a) + S2 = (xNode1-x_photon_start+(xNode2-xNode1)*l2)/sx + + IF (isLastSide) THEN + IF (ALMOSTEQUAL(S1,S2).AND.ALMOSTEQUAL(ABS(l1),ABS(l2))) THEN + RETURN + ELSE IF (ALMOSTEQUAL(S1,S2)) THEN + IF (ABS(l1).GT.ABS(l2)) THEN + l=l1; S=S1 + ELSE + l=l2; S=S2 + END IF + ELSE IF (ABS(S1).GT.ABS(S2)) THEN !though same spot again, caused by numerical inaccuray (discard shorter solution) + l=l1; S=S1 + ELSE + l=l2; S=S2 + END IF + ELSE IF ((l1.LE.0.0).OR.(l1.GE.1.0)) THEN !if 1 is not a valid intersection -> 2 + l = l2; S = S2 + ELSE !1 is valid intersection + IF ((S1.LE.0.0)) THEN !1 would be moving backwards -> 2 + l = l2; S = S2 + ELSE + IF ((l2.GT.0.0).AND.(l2.LT.1.0).AND.(S2.GT.0.0)) THEN !1 and 2 valid -> chose shorter one + IF (S2.GT.S1) THEN + l=l1; S=S1 + ELSE + l=l2; S=S2 + END IF + ELSE !1 is only valid intersection -> 1 + l=l1; S=S1 + END IF + END IF + END IF + + END IF + + IF((S .GT. 0.0) .AND. (0.0 .LE. l) .AND. (l .LE. 1.0)) THEN + ThroughSide = .TRUE. + IntersectionPos(1) = PhotonProps%PhotonLastPos(1) + S*sx + IntersectionPos(2) = PhotonProps%PhotonLastPos(2) + S*sy + IntersectionPos(3) = S*sz + Distance = S + END IF + + RETURN + +END SUBROUTINE PhotonIntersectionWithSide2D + +SUBROUTINE RotatePhotonIn2DPlane(IntersectionPos) +!=================================================================================================================================== +!> Routine to check whether a photon crossed the given side. +!=================================================================================================================================== +! MODULES +USE MOD_RadiationTrans_Vars, ONLY:PhotonProps +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT/OUTPUT VARIABLES +REAL, INTENT(OUT) :: IntersectionPos(3) +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +REAL :: NewYPho, NewYVelo + !=================================================================================================================================== +PhotonProps%PhotonLastPos(1:3) = IntersectionPos(1:3) +NewYPho = SQRT(PhotonProps%PhotonLastPos(2)**2 + PhotonProps%PhotonLastPos(3)**2) +! Rotation: Vy' = Vy * cos(alpha) + Vz * sin(alpha) = Vy * y/y' + Vz * z/y' +! Vz' = - Vy * sin(alpha) + Vz * cos(alpha) = - Vy * z/y' + Vz * y/y' +! Right-hand system, using new y and z positions after tracking, position vector and velocity vector DO NOT have to +! coincide (as opposed to Bird 1994, p. 391, where new positions are calculated with the velocity vector) +NewYVelo = (PhotonProps%PhotonDirection(2)*PhotonProps%PhotonLastPos(2) & + + PhotonProps%PhotonDirection(3)*PhotonProps%PhotonLastPos(3))/NewYPho +PhotonProps%PhotonDirection(3) = (-PhotonProps%PhotonDirection(2)*PhotonProps%PhotonLastPos(3) & + + PhotonProps%PhotonDirection(3)*PhotonProps%PhotonLastPos(2))/NewYPho +PhotonProps%PhotonLastPos(2) = NewYPho +PhotonProps%PhotonLastPos(3) = 0.0 +PhotonProps%PhotonDirection(2) = NewYVelo +PhotonProps%PhotonPos(1:3) = PhotonProps%PhotonLastPos(1:3) + +END SUBROUTINE RotatePhotonIn2DPlane @@ -595,51 +597,52 @@ SUBROUTINE PerfectPhotonReflection(iLocSide,Element,TriNum, IntersectionPos, Int RETURN END SUBROUTINE PerfectPhotonReflection +SUBROUTINE PerfectPhotonReflection2D(iLocSide,Element, IntersectionPos) +!--------------------------------------------------------------------------------------------------! +!Based on PerfectReflection3D +!--------------------------------------------------------------------------------------------------! + USE MOD_Particle_Mesh_Vars, ONLY : SideNormalEdge2D_Shared + USE MOD_RadiationTrans_Vars, ONLY : PhotonProps + USE MOD_Mesh_Tools ,ONLY: GetCNElemID +!--------------------------------------------------------------------------------------------------! + IMPLICIT NONE ! +!--------------------------------------------------------------------------------------------------! +! argument list declaration ! + INTEGER,INTENT(IN) :: iLocSide ! + INTEGER,INTENT(IN) :: Element ! + REAL, INTENT(INOUT) :: IntersectionPos(1:3) + ! Local variable declaration ! + INTEGER :: Node1, Node2, CNElemID ! + REAL :: PoldX, PoldY, PoldZ, nx, ny, nz, nVal, nytmp, nValIntersec + REAL :: xNod, yNod, zNod + REAL :: VelX, VelY, VelZ + REAL :: Vector1(1:3), Vector2(1:3), POI_fak, ProjVel +!--------------------------------------------------------- -----------------------------------------! +!--------------------------------------------------------------------------------------------------! + CNElemID = GetCNElemID(Element) + + nx = SideNormalEdge2D_Shared(1,iLocSide, CNElemID) + nValIntersec = SQRT(IntersectionPos(2)*IntersectionPos(2) + IntersectionPos(3)*IntersectionPos(3)) + ny = IntersectionPos(2)/nValIntersec * SideNormalEdge2D_Shared(2,iLocSide, CNElemID) + nz = IntersectionPos(3)/nValIntersec * SideNormalEdge2D_Shared(2,iLocSide, CNElemID) + !---- Calculate new velocity vector + ProjVel = nx*PhotonProps%PhotonDirection(1)+ny*PhotonProps%PhotonDirection(2) & + +nz*PhotonProps%PhotonDirection(3) + VelX=PhotonProps%PhotonDirection(1)-2.*ProjVel*nx + VelY=PhotonProps%PhotonDirection(2)-2.*ProjVel*ny + VelZ=PhotonProps%PhotonDirection(3)-2.*ProjVel*nz -!SUBROUTINE PerfectPhotonReflection2D(iLocSide,ElemID, IntersectionPos) -!!--------------------------------------------------------------------------------------------------! -!!Based on PerfectReflection3D -!!--------------------------------------------------------------------------------------------------! -! USE MOD_Particle_Mesh_Vars, ONLY : GEO, Part2DSideNormalEdge -! USE MOD_RadiationTrans_Vars, ONLY : PhotonProps -!!--------------------------------------------------------------------------------------------------! -! IMPLICIT NONE ! -!!--------------------------------------------------------------------------------------------------! -!! argument list declaration ! -! INTEGER,INTENT(IN) :: iLocSide ! -! INTEGER,INTENT(IN) :: ElemID ! -! REAL, INTENT(INOUT) :: IntersectionPos(1:3) -! ! Local variable declaration ! -! INTEGER :: Node1, Node2 ! -! REAL :: PoldX, PoldY, PoldZ, nx, ny, nz, nVal, nytmp, nValIntersec -! REAL :: xNod, yNod, zNod -! REAL :: VelX, VelY, VelZ -! REAL :: Vector1(1:3), Vector2(1:3), POI_fak, ProjVel -!!--------------------------------------------------------- -----------------------------------------! -!!--------------------------------------------------------------------------------------------------! -! nx = Part2DSideNormalEdge(iLocSide, 1, ElemID) -! nValIntersec = SQRT(IntersectionPos(2)*IntersectionPos(2) + IntersectionPos(3)*IntersectionPos(3)) -! ny = IntersectionPos(2)/nValIntersec * Part2DSideNormalEdge(iLocSide,2, ElemID) -! nz = IntersectionPos(3)/nValIntersec * Part2DSideNormalEdge(iLocSide,2, ElemID) - -! !---- Calculate new velocity vector -! ProjVel = nx*PhotonProps%PhotonDirection(1)+ny*PhotonProps%PhotonDirection(2) & -! +nz*PhotonProps%PhotonDirection(3) -! VelX=PhotonProps%PhotonDirection(1)-2.*ProjVel*nx -! VelY=PhotonProps%PhotonDirection(2)-2.*ProjVel*ny -! VelZ=PhotonProps%PhotonDirection(3)-2.*ProjVel*nz - -! !---- Assign new values to "old" variables to continue loop - -! PhotonProps%PhotonLastPos(1) = IntersectionPos(1) -! PhotonProps%PhotonLastPos(2) = IntersectionPos(2) -! PhotonProps%PhotonLastPos(3) = IntersectionPos(3) - -! PhotonProps%PhotonDirection(1) = VelX -! PhotonProps%PhotonDirection(2) = VelY -! PhotonProps%PhotonDirection(3) = VelZ -!END SUBROUTINE PerfectPhotonReflection2D + !---- Assign new values to "old" variables to continue loop + + PhotonProps%PhotonLastPos(1) = IntersectionPos(1) + PhotonProps%PhotonLastPos(2) = IntersectionPos(2) + PhotonProps%PhotonLastPos(3) = IntersectionPos(3) + + PhotonProps%PhotonDirection(1) = VelX + PhotonProps%PhotonDirection(2) = VelY + PhotonProps%PhotonDirection(3) = VelZ +END SUBROUTINE PerfectPhotonReflection2D SUBROUTINE DiffusePhotonReflection(iLocSide,Element,TriNum, IntersectionPos, IntersecAlreadyCalc) !--------------------------------------------------------------------------------------------------! @@ -749,56 +752,59 @@ SUBROUTINE DiffusePhotonReflection(iLocSide,Element,TriNum, IntersectionPos, Int END SUBROUTINE DiffusePhotonReflection -!SUBROUTINE DiffusePhotonReflection2D(iLocSide,ElemID, IntersectionPos) -!!--------------------------------------------------------------------------------------------------! -!!Based on PerfectReflection3D -!!--------------------------------------------------------------------------------------------------! -! USE MOD_Particle_Mesh_Vars, ONLY : GEO, Part2DSideNormalEdge -! USE MOD_RadiationTrans_Vars, ONLY : PhotonProps -! USE Ziggurat -!!--------------------------------------------------------------------------------------------------! -! IMPLICIT NONE ! -!!--------------------------------------------------------------------------------------------------! -!! argument list declaration ! -! INTEGER,INTENT(IN) :: iLocSide ! -! INTEGER,INTENT(IN) :: ElemID ! -! REAL, INTENT(IN) :: IntersectionPos(1:3) -! ! Local variable declaration ! -! REAL :: nx, ny, nz, nValIntersec, VecX, VecY, VecZ -! REAL :: VelX, VelY, VelZ, VeloCx, VeloCy, VeloCz, NormVec, RanNum -!!--------------------------------------------------------------------------------------------------! -!!--------------------------------------------------------------------------------------------------! -! nx = Part2DSideNormalEdge(iLocSide, 1, ElemID) -! nValIntersec = SQRT(IntersectionPos(2)*IntersectionPos(2) + IntersectionPos(3)*IntersectionPos(3)) -! ny = IntersectionPos(2)/nValIntersec * Part2DSideNormalEdge(iLocSide,2, ElemID) -! nz = IntersectionPos(3)/nValIntersec * Part2DSideNormalEdge(iLocSide,2, ElemID) - -! VecX = Part2DSideNormalEdge(iLocSide, 3, ElemID) -! VecY = IntersectionPos(2)/nValIntersec * Part2DSideNormalEdge(iLocSide,4, ElemID) -! VecZ = IntersectionPos(3)/nValIntersec * Part2DSideNormalEdge(iLocSide,4, ElemID) -! !---- Calculate new velocity vector (Extended Maxwellian Model) - -! VeloCx = rnor() !normal distri -! VeloCy = rnor() !normal distri -! CALL RANDOM_NUMBER(RanNum) -! VeloCz = SQRT(-2.*LOG(RanNum)) ! rayleigh distri -! -! VelX = VecX*VeloCx + (nz*VecY-ny*VecZ)*VeloCy - nx*VeloCz -! VelY = VecY*VeloCx + (nx*VecZ-nz*VecX)*VeloCy - ny*VeloCz -! VelZ = VecZ*VeloCx + (ny*VecX-nx*VecY)*VeloCy - nz*VeloCz -! !---- Assign new values to "old" variables to continue loop - -! PhotonProps%PhotonLastPos(1) = IntersectionPos(1) -! PhotonProps%PhotonLastPos(2) = IntersectionPos(2) -! PhotonProps%PhotonLastPos(3) = IntersectionPos(3) -! -! !---- saving new particle velocity -! NormVec = SQRT(VelX*VelX + VelY*VelY + VelZ*VelZ) -! PhotonProps%PhotonDirection(1) = VelX / NormVec -! PhotonProps%PhotonDirection(2) = VelY / NormVec -! PhotonProps%PhotonDirection(3) = VelZ / NormVec - -!END SUBROUTINE DiffusePhotonReflection2D +SUBROUTINE DiffusePhotonReflection2D(iLocSide,Element, IntersectionPos) +!--------------------------------------------------------------------------------------------------! +!Based on PerfectReflection3D +!--------------------------------------------------------------------------------------------------! + USE MOD_Particle_Mesh_Vars, ONLY : SideNormalEdge2D_Shared + USE MOD_RadiationTrans_Vars, ONLY : PhotonProps + USE Ziggurat + USE MOD_Mesh_Tools ,ONLY: GetCNElemID +!--------------------------------------------------------------------------------------------------! + IMPLICIT NONE ! +!--------------------------------------------------------------------------------------------------! +! argument list declaration ! + INTEGER,INTENT(IN) :: iLocSide ! + INTEGER,INTENT(IN) :: Element ! + REAL, INTENT(IN) :: IntersectionPos(1:3) + ! Local variable declaration + INTEGER :: CNElemID + REAL :: nx, ny, nz, nValIntersec, VecX, VecY, VecZ + REAL :: VelX, VelY, VelZ, VeloCx, VeloCy, VeloCz, NormVec, RanNum +!--------------------------------------------------------------------------------------------------! +!--------------------------------------------------------------------------------------------------! + CNElemID = GetCNElemID(Element) + nx = SideNormalEdge2D_Shared(1,iLocSide, CNElemID) + nValIntersec = SQRT(IntersectionPos(2)*IntersectionPos(2) + IntersectionPos(3)*IntersectionPos(3)) + ny = IntersectionPos(2)/nValIntersec * SideNormalEdge2D_Shared(2,iLocSide, CNElemID) + nz = IntersectionPos(3)/nValIntersec * SideNormalEdge2D_Shared(2,iLocSide, CNElemID) + + VecX = SideNormalEdge2D_Shared(3,iLocSide, CNElemID) + VecY = IntersectionPos(2)/nValIntersec * SideNormalEdge2D_Shared(4,iLocSide, CNElemID) + VecZ = IntersectionPos(3)/nValIntersec * SideNormalEdge2D_Shared(4,iLocSide, CNElemID) + !---- Calculate new velocity vector (Extended Maxwellian Model) + + VeloCx = rnor() !normal distri + VeloCy = rnor() !normal distri + CALL RANDOM_NUMBER(RanNum) + VeloCz = SQRT(-2.*LOG(RanNum)) ! rayleigh distri + + VelX = VecX*VeloCx + (nz*VecY-ny*VecZ)*VeloCy - nx*VeloCz + VelY = VecY*VeloCx + (nx*VecZ-nz*VecX)*VeloCy - ny*VeloCz + VelZ = VecZ*VeloCx + (ny*VecX-nx*VecY)*VeloCy - nz*VeloCz + !---- Assign new values to "old" variables to continue loop + + PhotonProps%PhotonLastPos(1) = IntersectionPos(1) + PhotonProps%PhotonLastPos(2) = IntersectionPos(2) + PhotonProps%PhotonLastPos(3) = IntersectionPos(3) + + !---- saving new particle velocity + NormVec = SQRT(VelX*VelX + VelY*VelY + VelZ*VelZ) + PhotonProps%PhotonDirection(1) = VelX / NormVec + PhotonProps%PhotonDirection(2) = VelY / NormVec + PhotonProps%PhotonDirection(3) = VelZ / NormVec + +END SUBROUTINE DiffusePhotonReflection2D SUBROUTINE CalcWallAbsoprtion(GlobSideID, DONE) USE MOD_RadiationTrans_Vars, ONLY : PhotonSampWall, PhotonProps diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 index 66cafc94d..673a84fbc 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 @@ -25,7 +25,7 @@ MODULE MOD_Photon_Tracking MODULE PROCEDURE PhotonTriaTracking END INTERFACE -PUBLIC::PhotonTriaTracking!, Photon2DSymTracking +PUBLIC::PhotonTriaTracking, Photon2DSymTracking !----------------------------------------------------------------------------------------------------------------------------------- !----------------------------------------------------------------------------------------------------------------------------------- !=================================================================================================================================== @@ -50,11 +50,11 @@ SUBROUTINE PhotonTriaTracking() USE MOD_Preproc USE MOD_Globals USE MOD_Particle_Mesh_Vars -USE MOD_Mesh_Vars, ONLY:MortarType, BC USE MOD_Particle_Boundary_Vars, ONLY:PartBound USE MOD_RadiationTrans_Vars, ONLY:PhotonProps USE MOD_Photon_TrackingTools, ONLY:PhotonThroughSideCheck3DFast, PhotonIntersectionWithSide,CalcAbsoprtion USE MOD_Photon_TrackingTools, ONLY:PerfectPhotonReflection, DiffusePhotonReflection, CalcWallAbsoprtion +USE MOD_Particle_Vars, ONLY:Symmetry IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES @@ -71,7 +71,7 @@ SUBROUTINE PhotonTriaTracking() INTEGER :: SecondNrOfThroughSides, indSide INTEGER :: DoneLastElem(1:4,1:6) ! 1:3: 1=Element,2=LocalSide,3=TriNum 1:2: 1=last 2=beforelast LOGICAL :: ThroughSide, Done -LOGICAL :: crossedBC, oldElemIsMortar, isMortarSideTemp(1:6), doCheckSide +LOGICAL :: oldElemIsMortar, isMortarSideTemp(1:6), doCheckSide REAL :: minRatio, intersecDist, intersecDistVec(3) REAL :: IntersectionPos(1:3), IntersectionPosTemp(1:3) REAL, PARAMETER :: eps = 0 @@ -93,7 +93,6 @@ SUBROUTINE PhotonTriaTracking() DO iLocSide=1,nlocSides TempSideID = ElemInfo_Shared(ELEM_FIRSTSIDEIND,ElemID) + iLocSide localSideID = SideInfo_Shared(SIDE_LOCALID,TempSideID) - ! Side is not one of the 6 local sides IF (localSideID.LE.0) CYCLE NbElemID = SideInfo_Shared(SIDE_NBELEMID,TempSideID) @@ -220,7 +219,6 @@ SUBROUTINE PhotonTriaTracking() END IF ! NrOfThroughSides.NE.1 ! ---------------------------------------------------------------------------- ! 3) In case of a boundary, perform the appropriate boundary interaction - crossedBC=.FALSE. IF (SideInfo_Shared(SIDE_BCID,SideID).GT.0) THEN OldElemID=ElemID BCType = PartBound%TargetBoundCond(PartBound%MapToPartBC(SideInfo_Shared(SIDE_BCID,SideID))) @@ -249,7 +247,7 @@ SUBROUTINE PhotonTriaTracking() CASE DEFAULT CALL abort(& __STAMP__& - ,' ERROR: PartBound not associated!. (unknown case)',999,999.) + ,' ERROR: PartBound not associated!. (unknown case)',BCType,999.) END SELECT !PartBound%MapToPartBC(BC(SideID) @@ -293,197 +291,179 @@ SUBROUTINE PhotonTriaTracking() END SUBROUTINE PhotonTriaTracking -!SUBROUTINE Photon2DSymTracking() -!!=================================================================================================================================== -!! Routine for tracking of moving particles and boundary interaction using triangulated sides. -!! 1) Loop over all particles that are still inside -!! 2) Perform tracking until the particle is considered "done" (either localized or deleted) -!! 2a) Perform a check based on the determinant of (3x3) matrix of the vectors from the particle position to the nodes of each -!! triangle (ParticleInsideQuad3D) -!! 2b) If particle is not within the given element in a), the side through which the particle went is determined by checking -!! each side of the element (ParticleThroughSideCheck3DFast) -!! 2c) If no sides are found, the particle is deleted (very rare case). If multiple possible sides are found, additional -!! treatment is required, where the particle path is reconstructed (which side was crossed first) by comparing the ratio -!! the determinants -!! 3) In case of a boundary, determine the intersection and perform the appropriate boundary interaction (GetBoundaryInteraction) -!!=================================================================================================================================== -!! MODULES -!USE MOD_Preproc -!USE MOD_Globals -!USE MOD_Particle_Mesh_Vars, ONLY:PartElemToSide, PartSideToElem, PartElemToElemAndSide, PartElemToSide2D -!USE MOD_Particle_Mesh_Vars, ONLY:Part3DLocSideToSide2D -!USE MOD_Mesh_Vars, ONLY:MortarType, BC -!USE MOD_Particle_Boundary_Vars, ONLY:PartBound -!USE MOD_RadiationTrans_Vars, ONLY:PhotonProps -!USE MOD_Photon_TrackingTools, ONLY:CalcAbsoprtion, CalcWallAbsoprtion, DiffusePhotonReflection2D -!USE MOD_Photon_TrackingTools, ONLY:PhotonIntersectionWithSide2D, RotatePhotonIn2DPlane, PerfectPhotonReflection2D -!IMPLICIT NONE -!!----------------------------------------------------------------------------------------------------------------------------------- -!! INPUT VARIABLES -!!----------------------------------------------------------------------------------------------------------------------------------- -!! OUTPUT VARIABLES -!!----------------------------------------------------------------------------------------------------------------------------------- -!! LOCAL VARIABLES -!INTEGER :: NblocSideID3D, NbElemID, ind, nbSideID, nMortarElems, SideIDMortar, BCType, NblocSideID -!INTEGER :: ElemID, OldElemID, LocSide3D, LocalSide, NrOfThroughSides -!INTEGER :: SideID, TempSideID, iLocSide, correctSide, LastSide -!INTEGER :: LocSidesTemp(1:6), GlobSideTemp(1:6) -!LOGICAL :: oldElemIsMortar, isMortarSideTemp(1:6), isLastSide, ThroughSide, Done -!REAL :: IntersectionPos(1:6), IntersectionPosTemp(1:6,3), DistanceTemp(1:6), Distance -!!=================================================================================================================================== -!Done = .FALSE. -!ElemID = PhotonProps%ElemID -!SideID = 0 -!LastSide = 0 -!! 1) Loop tracking until Photon is considered "done" (either absorbed or deleted) -!DO WHILE (.NOT.Done) -! oldElemIsMortar = .FALSE. -! NrOfThroughSides = 0 -! LocSidesTemp = 0 -! GlobSideTemp = 0 -! DistanceTemp = 0.0 -! IntersectionPosTemp = 0.0 -! isMortarSideTemp = .FALSE. -! DO iLocSide=1,4 -! isLastSide = .FALSE. -! LocSide3D = PartElemToSide2D(iLocSide,1, ElemID) -! TempSideID=PartElemToSide(E2S_SIDE_ID,LocSide3D,ElemID) -! IF(BC(TempSideID).GT.0) THEN -! IF (PartBound%TargetBoundCond(PartBound%MapToPartBC(BC(TempSideID))).EQ.11) CYCLE -! END IF -! IF (LastSide.EQ.TempSideID) isLastSide = .TRUE. -! SideIDMortar=MortarType(2,TempSideID) -! IF (SideIDMortar.GT.0) THEN ! Mortar side -! IF (MortarType(1,TempSideID).EQ.1) THEN -! nMortarElems = 4 -! CALL abort(& -! __STAMP__ & -! ,'ERROR: 4 Neighbor Mortar Cells not allowed for 2D simulations.') -! ELSE -! nMortarElems = 2 -! END IF -! DO ind = 1, nMortarElems -! isLastSide = .FALSE. -! NbElemID = PartElemToElemAndSide(ind,LocSide3D,ElemID) -! IF (NbElemID.LT.1) THEN -! CALL abort(& -! __STAMP__ & -! ,'ERROR: Mortar Element not defined! Please increase the size of the halo region (HaloEpsVelo)!') -! END IF -! NblocSideID3D = PartElemToElemAndSide(ind+4,LocSide3D,ElemID) -! NblocSideID = Part3DLocSideToSide2D(NblocSideID3D, NbElemID) -! nbSideID = PartElemToSide(E2S_SIDE_ID,NblocSideID3D,NbElemID) -! ThroughSide = .FALSE. -! IF (LastSide.EQ.nbSideID) isLastSide = .TRUE. -! CALL PhotonIntersectionWithSide2D(NblocSideID,NbElemID,ThroughSide,IntersectionPos, isLastSide,Distance) -! IF (ThroughSide) THEN -! ! Store the information for this side for future checks, if this side was already treated -! oldElemIsMortar = .TRUE. -! NrOfThroughSides = NrOfThroughSides + 1 -! LocSidesTemp(NrOfThroughSides) = NblocSideID3D -! GlobSideTemp(NrOfThroughSides) = nbSideID -! DistanceTemp(NrOfThroughSides) = Distance -! IntersectionPosTemp(1:3,NrOfThroughSides) = IntersectionPos(1:3) -! isMortarSideTemp(NrOfThroughSides) = .TRUE. -! SideID = nbSideID -! LocalSide = NblocSideID3D -! END IF -! END DO -! ELSE ! Regular side -! ThroughSide = .FALSE. -! CALL PhotonIntersectionWithSide2D(iLocSide,ElemID,ThroughSide,IntersectionPos, isLastSide, Distance) -! IF (ThroughSide) THEN -! NrOfThroughSides = NrOfThroughSides + 1 -! SideID = TempSideID -! LocalSide = LocSide3D -! LocSidesTemp(NrOfThroughSides) = LocSide3D -! GlobSideTemp(NrOfThroughSides) = TempSideID -! DistanceTemp(NrOfThroughSides) = Distance -! IntersectionPosTemp(1:3,NrOfThroughSides) = IntersectionPos(1:3) -!! EXIT -! END IF -! END IF ! Mortar or regular side -! END DO ! iLocSide=1,4 -! ! ---------------------------------------------------------------------------- -! ! Addition treatment if particle did not cross any sides or it crossed multiple sides -! IF (NrOfThroughSides.NE.1) THEN -! ! 2c) If no sides are found, the particle is deleted (very rare case). If multiple possible sides are found, additional -! ! treatment is required, where the particle path is reconstructed (which side was crossed first) by comparing the ratio -! ! the determinants -! IF (NrOfThroughSides.EQ.0) THEN -! ! Particle appears to have not crossed any of the checked sides. Deleted! -! IPWRITE(*,*) 'Error in Photon 2DAxisTracking! Photon lost. Element:', ElemID -! IPWRITE(*,*) 'LastPos: ', PhotonProps%PhotonLastPos(1:3) -! IPWRITE(*,*) 'Pos: ', PhotonProps%PhotonPos(1:3) -! IPWRITE(*,*) 'Direction:', PhotonProps%PhotonDirection(1:3) -! IPWRITE(*,*) 'Photon deleted!' -! Done = .TRUE. -! EXIT -! ELSE IF (NrOfThroughSides.GT.1) THEN -! correctSide = MINLOC(DistanceTemp(1:NrOfThroughSides),DIM=1) -! oldElemIsMortar = isMortarSideTemp(correctSide) -! SideID = GlobSideTemp(correctSide) -! LocalSide = LocSidesTemp(correctSide) -! IntersectionPos(1:3) = IntersectionPosTemp(1:3,correctSide) -! END IF -! END IF ! NrOfThroughSides.NE.1 -! ! ---------------------------------------------------------------------------- -! ! 3) In case of a boundary, perform the appropriate boundary interaction -! OldElemID = ElemID -! IF(BC(SideID).GT.0) THEN -! BCType = PartBound%TargetBoundCond(PartBound%MapToPartBC(BC(SideID))) -! SELECT CASE(BCType) -! CASE(1) !PartBound%OpenBC) -! CALL CalcAbsoprtion(IntersectionPos(1:3),ElemID, DONE) -! DONE = .TRUE. -! CYCLE -! CASE(2) -! IF (PartBound%PhotonSpecularReflection(PartBound%MapToPartBC(BC(SideID)))) THEN -! CALL CalcAbsoprtion(IntersectionPos(1:3),ElemID, DONE) -! IF (.NOT.DONE) CALL PerfectPhotonReflection2D(Part3DLocSideToSide2D(LocalSide, ElemID),ElemID, IntersectionPos) -! ELSE -! CALL CalcAbsoprtion(IntersectionPos(1:3),ElemID, DONE) -! IF (.NOT.DONE) CALL CalcWallAbsoprtion(SideID, DONE) -! IF (.NOT.DONE) CALL DiffusePhotonReflection2D(Part3DLocSideToSide2D(LocalSide, ElemID),ElemID, IntersectionPos) -! END IF -! CASE DEFAULT -! CALL abort(& -! __STAMP__& -! ,' ERROR: PartBound not associated!. (unknown case)',BCType,999.) -! END SELECT !PartBound%MapToPartBC(BC(SideID) -! ELSE ! BC(SideID).LE.0 -! IF (oldElemIsMortar) THEN -! CALL CalcAbsoprtion(IntersectionPos(1:3),ElemID, DONE) -! IF (PartSideToElem(S2E_NB_ELEM_ID,SideID).EQ.-1) THEN -! ElemID = PartSideToElem(S2E_ELEM_ID,SideID) -! ELSE -! ElemID = PartSideToElem(S2E_NB_ELEM_ID,SideID) -! END IF -! ELSE -! CALL CalcAbsoprtion(IntersectionPos(1:3),ElemID, DONE) -! ElemID = PartElemToElemAndSide(1 ,LocalSide,ElemID) -! END IF -! END IF ! BC(SideID).GT./.LE. 0 -! IF (oldElemIsMortar) THEN -! LastSide = SideID -! ELSE -! LastSide = PartElemToElemAndSide(5,LocalSide,OldElemID) -! IF (LastSide.LT.1) THEN -! LastSide = SideID -! ELSE -! LastSide = PartElemToSide(E2S_SIDE_ID,LastSide,ElemID) -! SideIDMortar=MortarType(2,LastSide) -! IF (SideIDMortar.GT.0) LastSide = SideID -! END IF -! END IF -! IF (.NOT.DONE) CALL RotatePhotonIn2DPlane(IntersectionPos(1:3)) -! IF (ElemID.LT.1) THEN -! CALL abort(& -! __STAMP__ & -! ,'ERROR: Element not defined! Please increase the size of the halo region (HaloEpsVelo)!') -! END IF -!END DO ! .NOT.PartisDone -!END SUBROUTINE Photon2DSymTracking +SUBROUTINE Photon2DSymTracking() +!=================================================================================================================================== +! Routine for tracking of moving particles and boundary interaction using triangulated sides. +! 1) Loop over all particles that are still inside +! 2) Perform tracking until the particle is considered "done" (either localized or deleted) +! 2a) Perform a check based on the determinant of (3x3) matrix of the vectors from the particle position to the nodes of each +! triangle (ParticleInsideQuad3D) +! 2b) If particle is not within the given element in a), the side through which the particle went is determined by checking +! each side of the element (ParticleThroughSideCheck3DFast) +! 2c) If no sides are found, the particle is deleted (very rare case). If multiple possible sides are found, additional +! treatment is required, where the particle path is reconstructed (which side was crossed first) by comparing the ratio +! the determinants +! 3) In case of a boundary, determine the intersection and perform the appropriate boundary interaction (GetBoundaryInteraction) +!=================================================================================================================================== +! MODULES +USE MOD_Preproc +USE MOD_Globals +USE MOD_Particle_Mesh_Vars +USE MOD_Particle_Boundary_Vars, ONLY:PartBound +USE MOD_RadiationTrans_Vars, ONLY:PhotonProps +USE MOD_Photon_TrackingTools, ONLY:CalcAbsoprtion, CalcWallAbsoprtion, DiffusePhotonReflection2D +USE MOD_Photon_TrackingTools, ONLY:PhotonIntersectionWithSide2D, RotatePhotonIn2DPlane, PerfectPhotonReflection2D +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +INTEGER :: NblocSideID3D, NbElemID, ind, nbSideID, nMortarElems, SideIDMortar, BCType, NblocSideID +INTEGER :: ElemID, OldElemID, LocSide3D, LocalSide, NrOfThroughSides, localSideID, nlocSides +INTEGER :: SideID, TempSideID, iLocSide, correctSide, LastSide +INTEGER :: LocSidesTemp(1:6), GlobSideTemp(1:6) +LOGICAL :: oldElemIsMortar, isMortarSideTemp(1:6), isLastSide, ThroughSide, Done +REAL :: IntersectionPos(1:6), IntersectionPosTemp(1:6,3), DistanceTemp(1:6), Distance +!=================================================================================================================================== +Done = .FALSE. +ElemID = PhotonProps%ElemID +SideID = 0 +LastSide = 0 +! 1) Loop tracking until Photon is considered "done" (either absorbed or deleted) +DO WHILE (.NOT.Done) + oldElemIsMortar = .FALSE. + NrOfThroughSides = 0 + LocSidesTemp = 0 + GlobSideTemp = 0 + DistanceTemp = 0.0 + IntersectionPosTemp = 0.0 + isMortarSideTemp = .FALSE. + nlocSides = ElemInfo_Shared(ELEM_LASTSIDEIND,ElemID) - ElemInfo_Shared(ELEM_FIRSTSIDEIND,ElemID) + DO iLocSide=1,nlocSides + isLastSide = .FALSE. + TempSideID = ElemInfo_Shared(ELEM_FIRSTSIDEIND,ElemID) + iLocSide + localSideID = SideInfo_Shared(SIDE_LOCALID,TempSideID) + ! Side is not one of the 6 local sides + IF (localSideID.LE.0) CYCLE + IF (SideIsSymSide(TempSideID)) CYCLE + IF (SideInfo_Shared(SIDE_BCID,TempSideID).GT.0) THEN + IF (PartBound%TargetBoundCond(PartBound%MapToPartBC(SideInfo_Shared(SIDE_BCID,TempSideID))).EQ.11) CYCLE + END IF + IF (LastSide.EQ.TempSideID) isLastSide = .TRUE. + NbElemID = SideInfo_Shared(SIDE_NBELEMID,TempSideID) + IF (NbElemID.LT.0) THEN ! Mortar side + nMortarElems = MERGE(4,2,SideInfo_Shared(SIDE_NBELEMID,TempSideID).EQ.-1) + DO ind = 1, nMortarElems + isLastSide = .FALSE. + nbSideID = ElemInfo_Shared(ELEM_FIRSTSIDEIND,ElemID) + iLocSide + ind + NbElemID = SideInfo_Shared(SIDE_NBELEMID,nbSideID) + ! If small mortar element not defined, abort. Every available information on the compute-node is kept in shared memory, so + ! no way to recover it during runtime + IF (LastSide.EQ.nbSideID) isLastSide = .TRUE. + IF (NbElemID.LT.1) CALL ABORT(__STAMP__,'Small mortar element not defined!',ElemID) + ! For small mortar sides, SIDE_NBSIDEID contains the SideID of the corresponding big mortar side + nbSideID = SideInfo_Shared(SIDE_NBSIDEID,nbSideID) + NblocSideID = SideInfo_Shared(SIDE_LOCALID,nbSideID) + ThroughSide = .FALSE. + CALL PhotonIntersectionWithSide2D(NblocSideID,NbElemID,ThroughSide,IntersectionPos, isLastSide,Distance) + IF (ThroughSide) THEN + ! Store the information for this side for future checks, if this side was already treated + oldElemIsMortar = .TRUE. + NrOfThroughSides = NrOfThroughSides + 1 + LocSidesTemp(NrOfThroughSides) = NblocSideID + GlobSideTemp(NrOfThroughSides) = nbSideID + DistanceTemp(NrOfThroughSides) = Distance + IntersectionPosTemp(1:3,NrOfThroughSides) = IntersectionPos(1:3) + isMortarSideTemp(NrOfThroughSides) = .TRUE. + SideID = nbSideID + LocalSide = NblocSideID + END IF + END DO + ELSE ! Regular side + ThroughSide = .FALSE. + CALL PhotonIntersectionWithSide2D(localSideID,ElemID,ThroughSide,IntersectionPos, isLastSide, Distance) + IF (ThroughSide) THEN + NrOfThroughSides = NrOfThroughSides + 1 + SideID = TempSideID + LocalSide = localSideID + LocSidesTemp(NrOfThroughSides) = localSideID + GlobSideTemp(NrOfThroughSides) = TempSideID + DistanceTemp(NrOfThroughSides) = Distance + IntersectionPosTemp(1:3,NrOfThroughSides) = IntersectionPos(1:3) + END IF + END IF ! Mortar or regular side + END DO ! iLocSide=1,4 + ! ---------------------------------------------------------------------------- + ! Addition treatment if particle did not cross any sides or it crossed multiple sides + IF (NrOfThroughSides.NE.1) THEN + ! 2c) If no sides are found, the particle is deleted (very rare case). If multiple possible sides are found, additional + ! treatment is required, where the particle path is reconstructed (which side was crossed first) by comparing the ratio + ! the determinants + IF (NrOfThroughSides.EQ.0) THEN + ! Particle appears to have not crossed any of the checked sides. Deleted! + IPWRITE(*,*) 'Error in Photon 2DAxisTracking! Photon lost. Element:', ElemID + IPWRITE(*,*) 'LastPos: ', PhotonProps%PhotonLastPos(1:3) + IPWRITE(*,*) 'Pos: ', PhotonProps%PhotonPos(1:3) + IPWRITE(*,*) 'Direction:', PhotonProps%PhotonDirection(1:3) + IPWRITE(*,*) 'Photon deleted!' + Done = .TRUE. + EXIT + ELSE IF (NrOfThroughSides.GT.1) THEN + correctSide = MINLOC(DistanceTemp(1:NrOfThroughSides),DIM=1) + oldElemIsMortar = isMortarSideTemp(correctSide) + SideID = GlobSideTemp(correctSide) + LocalSide = LocSidesTemp(correctSide) + IntersectionPos(1:3) = IntersectionPosTemp(1:3,correctSide) + END IF + END IF ! NrOfThroughSides.NE.1 + ! ---------------------------------------------------------------------------- + ! 3) In case of a boundary, perform the appropriate boundary interaction + IF (SideInfo_Shared(SIDE_BCID,SideID).GT.0) THEN + OldElemID=ElemID + BCType = PartBound%TargetBoundCond(PartBound%MapToPartBC(SideInfo_Shared(SIDE_BCID,SideID))) + SELECT CASE(BCType) + CASE(1) !PartBound%OpenBC) + CALL CalcAbsoprtion(IntersectionPos(1:3),ElemID, DONE) + DONE = .TRUE. + CYCLE + CASE(2) + IF (PartBound%PhotonSpecularReflection(PartBound%MapToPartBC(SideInfo_Shared(SIDE_BCID,SideID)))) THEN + CALL CalcAbsoprtion(IntersectionPos(1:3),ElemID, DONE) + IF (.NOT.DONE) CALL PerfectPhotonReflection2D(LocalSide,ElemID, IntersectionPos) + ELSE + CALL CalcAbsoprtion(IntersectionPos(1:3),ElemID, DONE) + IF (.NOT.DONE) CALL CalcWallAbsoprtion(SideID, DONE) + IF (.NOT.DONE) CALL DiffusePhotonReflection2D(LocalSide,ElemID, IntersectionPos) + END IF + LastSide = SideID + CASE DEFAULT + CALL abort(& + __STAMP__& + ,' ERROR: PartBound not associated!. (unknown case)',999,999.) + END SELECT !PartBound%MapToPartBC(BC(SideID) + ELSE ! BC(SideID).LE.0 + IF (oldElemIsMortar) THEN + CALL CalcAbsoprtion(IntersectionPos(1:3),ElemID, DONE) + ElemID = SideInfo_Shared(SIDE_ELEMID,SideID) + LastSide = SideID + ELSE + CALL CalcAbsoprtion(IntersectionPos(1:3),ElemID, DONE) + ElemID = SideInfo_Shared(SIDE_NBELEMID,SideID) + LastSide = SideInfo_Shared(SIDE_NBSIDEID,SideID) + END IF + END IF ! BC(SideID).GT./.LE. 0 + + IF (.NOT.DONE) CALL RotatePhotonIn2DPlane(IntersectionPos(1:3)) + IF (ElemID.LT.1) THEN + CALL abort(& + __STAMP__ & + ,'ERROR: Element not defined! Please increase the size of the halo region (HaloEpsVelo)!') + END IF +END DO ! .NOT.PartisDone + +END SUBROUTINE Photon2DSymTracking END MODULE MOD_Photon_Tracking From 2bfd2eb914ee9a481dd80f452d00b5a41fc3a21c Mon Sep 17 00:00:00 2001 From: Marcel Pfeiffer Date: Fri, 27 Aug 2021 22:47:06 +0200 Subject: [PATCH 010/495] rad macro val readin in shared array --- .../radiation_solver/radiation_init.f90 | 38 +++++++++++++++---- .../radiation_solver/radiation_vars.f90 | 6 ++- 2 files changed, 34 insertions(+), 10 deletions(-) diff --git a/src/radiation/radiation_solver/radiation_init.f90 b/src/radiation/radiation_solver/radiation_init.f90 index 6e520b1ba..bfaedf77b 100644 --- a/src/radiation/radiation_solver/radiation_init.f90 +++ b/src/radiation/radiation_solver/radiation_init.f90 @@ -267,8 +267,15 @@ SUBROUTINE MacroscopicRadiationInput() USE MOD_HDF5_Input ,ONLY: OpenDataFile,CloseDataFile,DatasetExists,ReadArray,GetDataProps USE MOD_Mesh_Vars ,ONLY: offsetElem, nElems USE MOD_Particle_Vars ,ONLY: nSpecies - USE MOD_Radiation_Vars ,ONLY: MacroRadInputParameters + USE MOD_Radiation_Vars ,ONLY: MacroRadInputParameters, MacroRadInputParameters_Shared, MacroRadInputParameters_Shared_Win + USE MOD_Mesh_Tools ,ONLY: GetCNElemID USE MOD_ReadInTools + USE MOD_Particle_Mesh_Vars ,ONLY: nComputeNodeElems +#if USE_MPI +!USE MOD_MPI_Shared_Vars + USE MOD_MPI_Shared + USE MOD_MPI_Shared_Vars +#endif ! USE MOD_Utils ,ONLY: BubbleSortID !Laux ! USE MOD_Particle_Mesh_Vars ,ONLY: GEO !Laux ! IMPLICIT VARIABLE HANDLING @@ -279,7 +286,7 @@ SUBROUTINE MacroscopicRadiationInput() ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES - INTEGER :: nVar_HDF5, N_HDF5, nElems_HDF5, iVar, iSpec, iElem + INTEGER :: nVar_HDF5, N_HDF5, nElems_HDF5, iVar, iSpec, iElem, CNElemID REAL, ALLOCATABLE :: ElemData_HDF5(:,:) CHARACTER(LEN=300) :: MacroRadiationInputFile ! INTEGER, ALLOCATABLE :: SortElemInd(:) !Laux @@ -292,7 +299,17 @@ SUBROUTINE MacroscopicRadiationInput() CALL GetDataProps('ElemData',nVar_HDF5,N_HDF5,nElems_HDF5) ALLOCATE(MacroRadInputParameters(1:nElems,1:nSpecies,1:5)) - MacroRadInputParameters = 0. +#if USE_MPI + ! allocate shared array for Radiation_Emission/Absorption_Spec + CALL Allocate_Shared((/nComputeNodeElems,nSpecies,5/), MacroRadInputParameters_Shared_Win,MacroRadInputParameters_Shared) + CALL MPI_WIN_LOCK_ALL(0,MacroRadInputParameters_Shared_Win,IERROR) + + MacroRadInputParameters => MacroRadInputParameters_Shared +#else +! allocate local array for ElemInfo + ALLOCATE(MacroRadInputParameters(1:nElems,1:nSpecies,1:5)) +#endif /*USE_MPI*/ + ALLOCATE(ElemData_HDF5(1:nVar_HDF5,1:nElems)) ! Associate construct for integer KIND=8 possibility @@ -331,15 +348,20 @@ SUBROUTINE MacroscopicRadiationInput() iVar = 1 DO iSpec = 1, nSpecies DO iElem = 1, nElems - MacroRadInputParameters(iElem,iSpec,1) = ElemData_HDF5(iVar+ 6,iElem) !density - MacroRadInputParameters(iElem,iSpec,2) = ElemData_HDF5(iVar+ 7,iElem) !T_vib - MacroRadInputParameters(iElem,iSpec,3) = ElemData_HDF5(iVar+ 8,iElem) !T_rot - MacroRadInputParameters(iElem,iSpec,4) = ElemData_HDF5(iVar+ 9,iElem) !T_elec - MacroRadInputParameters(iElem,iSpec,5) = ElemData_HDF5(iVar+11,iElem) !T_mean + CNElemID = GetCNElemID(iElem+offsetElem) + MacroRadInputParameters(CNElemID,iSpec,1) = ElemData_HDF5(iVar+ 6,iElem) !density + MacroRadInputParameters(CNElemID,iSpec,2) = ElemData_HDF5(iVar+ 7,iElem) !T_vib + MacroRadInputParameters(CNElemID,iSpec,3) = ElemData_HDF5(iVar+ 8,iElem) !T_rot + MacroRadInputParameters(CNElemID,iSpec,4) = ElemData_HDF5(iVar+ 9,iElem) !T_elec + MacroRadInputParameters(CNElemID,iSpec,5) = ElemData_HDF5(iVar+11,iElem) !T_mean END DO iVar = iVar + DSMC_NVARS END DO +#if USE_MPI + CALL BARRIER_AND_SYNC(MacroRadInputParameters_Shared_Win ,MPI_COMM_SHARED) +#endif + DEALLOCATE(ElemData_HDF5) END SUBROUTINE MacroscopicRadiationInput diff --git a/src/radiation/radiation_solver/radiation_vars.f90 b/src/radiation/radiation_solver/radiation_vars.f90 index 33ad42777..dd0e698e7 100644 --- a/src/radiation/radiation_solver/radiation_vars.f90 +++ b/src/radiation/radiation_solver/radiation_vars.f90 @@ -39,8 +39,6 @@ MODULE MOD_Radiation_Vars TYPE(tRadiationInput), ALLOCATABLE :: RadiationInput(:) -REAL, ALLOCATABLE :: MacroRadInputParameters(:,:,:) ! DSMC Output file (iElem, iSpec, 5 (density, Tvib, Trot, Telec, Ttrans_mean)) - REAL :: NumDensElectrons ! Electron Density REAL :: TElectrons ! Electron Temperature @@ -97,7 +95,11 @@ MODULE MOD_Radiation_Vars REAL,ALLOCPOINT :: Radiation_Emission_spec(:,:) ! (WaveLen(:), number of mesh elements) REAL,ALLOCPOINT :: Radiation_Absorption_spec(:,:) ! (WaveLen(:), number of mesh elements) +REAL,ALLOCPOINT :: MacroRadInputParameters(:,:,:) ! DSMC Output file (iElem, iSpec, 5 (density, Tvib, Trot, Telec, Ttrans_mean)) + #if USE_MPI +INTEGER :: MacroRadInputParameters_Shared_Win +REAL,ALLOCPOINT :: MacroRadInputParameters_Shared(:,:,:) INTEGER :: Radiation_Emission_Spec_Shared_Win REAL,ALLOCPOINT :: Radiation_Emission_Spec_Shared(:,:) INTEGER :: Radiation_Absorption_Spec_Shared_Win From 3137714dda3a5d9a41eb109bbdad2abf8ef32cc4 Mon Sep 17 00:00:00 2001 From: irsbeyer Date: Mon, 30 Aug 2021 19:59:52 +0200 Subject: [PATCH 011/495] remove unused variables --- .../radiation_solver/exportspectrum.f90 | 2 +- .../radiation_solver/radiation_atoms.f90 | 59 +++---------------- .../radiation_solver/radiation_continuum.f90 | 1 - .../radiation_solver/radiation_excitation.f90 | 2 +- .../radiation_solver/radiation_init.f90 | 3 - .../radiation_solver/radiation_main.f90 | 14 +++-- .../radiation_solver/radiation_molecules.f90 | 58 +++++------------- .../radiative_transfer/radtrans_init.f90 | 4 +- .../radiative_transfer/radtrans_main.f90 | 4 +- .../tracking/radtrans_tools.f90 | 15 +++-- .../tracking/radtrans_tracking.f90 | 8 +-- 11 files changed, 45 insertions(+), 125 deletions(-) diff --git a/src/radiation/radiation_solver/exportspectrum.f90 b/src/radiation/radiation_solver/exportspectrum.f90 index c4e5f8244..084002e6a 100644 --- a/src/radiation/radiation_solver/exportspectrum.f90 +++ b/src/radiation/radiation_solver/exportspectrum.f90 @@ -58,7 +58,7 @@ SUBROUTINE radiation_exportspectrum(iElement, output_format) ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES - INTEGER :: w, io_error, iGlobalElement,m + INTEGER :: w, io_error, iGlobalElement CHARACTER(32) :: hilf !=================================================================================================================================== diff --git a/src/radiation/radiation_solver/radiation_atoms.f90 b/src/radiation/radiation_solver/radiation_atoms.f90 index 964457896..5a109e07e 100644 --- a/src/radiation/radiation_solver/radiation_atoms.f90 +++ b/src/radiation/radiation_solver/radiation_atoms.f90 @@ -246,7 +246,7 @@ SUBROUTINE radiation_atoms(iElem, em_atom) ! IF(eps .GE. 1.0E-25) THEN CALL Radiation_Atomic_Transition_Line_Profile(Radiation_Profile, SpeciesRadiation(iSpec)%LinesReal(k,1), Voigt_int, Voigt_int_distmax, & - Dlaml, Dlamv, epsilon_at, epsilon_iSpec, etot, Radiation_Absorption_spec, abs_iSpec, abstot, iElem) + epsilon_at, epsilon_iSpec, etot, Radiation_Absorption_spec, abs_iSpec, abstot, iElem) ! END IF END IF @@ -292,7 +292,7 @@ END SUBROUTINE radiation_atoms -SUBROUTINE Radiation_Atomic_Transition_Line_Profile(Radiation_Profile, wavelength, Voigt_int, Voigt_int_distmax, DlamL, DlamV, & +SUBROUTINE Radiation_Atomic_Transition_Line_Profile(Radiation_Profile, wavelength, Voigt_int, Voigt_int_distmax, & epsilon_mol, epsilon_iSpec, eps, Radiation_Absorption_spec, abs_iSpec, abstot, iElem) !=================================================================================================================================== ! calculates emission profile functions and adds radiative energy to emission array @@ -300,22 +300,20 @@ SUBROUTINE Radiation_Atomic_Transition_Line_Profile(Radiation_Profile, wavelengt ! MODULES USE MOD_Globals USE MOD_Radiation_Vars, ONLY : RadiationParameter - USE MOD_Globals_Vars, ONLY : Pi ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES REAL, INTENT(INOUT) :: Radiation_Profile(:), epsilon_mol(:), epsilon_iSpec(:), Radiation_Absorption_spec(:,:), & abs_iSpec(:) - REAL, INTENT(IN) :: wavelength, Voigt_int_distmax, Dlaml, Dlamv, eps, abstot, Voigt_int(-1001:1001) + REAL, INTENT(IN) :: wavelength, Voigt_int_distmax, eps, abstot, Voigt_int(-1001:1001) INTEGER, INTENT(IN) :: iElem !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES - INTEGER :: startwavelength_int, endwavelength_int, i, iVoigt + INTEGER :: startwavelength_int, endwavelength_int, i LOGICAL :: add_radline - REAL :: line_energy_fraction, Voigt_int_value, Voigt_int_value_old, hilf !=================================================================================================================================== ! --- determination of indices for first and last entry of Voigt-profiles on wavelength axis startwavelength_int = INT(MAX(1.0 & @@ -329,7 +327,6 @@ SUBROUTINE Radiation_Atomic_Transition_Line_Profile(Radiation_Profile, wavelengt ! + Voigt_int_distmax - RadiationParameter%MinWaveLen) / RadiationParameter%WaveLenIncr) + 1) add_radline = .FALSE. - line_energy_fraction = 0. IF ( (startwavelength_int .LT. endwavelength_int) .AND. & ((wavelength+Voigt_int_distmax) .GT. RadiationParameter%MinWaveLen) .AND. & @@ -337,35 +334,9 @@ SUBROUTINE Radiation_Atomic_Transition_Line_Profile(Radiation_Profile, wavelengt add_radline = .TRUE. - ! --- check whether line is dispersive -! IF(Dlaml/Dlamv .GE. 0.9) THEN - -! ! --- simplified computation of line profile if line is dispersive -! Voigt_int_value_old = 1. / Pi * ATAN(2./(DlamV) & -! * (RadiationParameter%WaveLen(startwavelength_int-1)-wavelength)) - -! line_energy_fraction = - Voigt_int_value_old - -! DO iVoigt = (startwavelength_int-1), (endwavelength_int-1) -! Voigt_int_value = 1. / Pi * ATAN(2./(Dlamv) & -! * (RadiationParameter%WaveLen(iVoigt)-wavelength)) -! Radiation_Profile(iVoigt+1) = Voigt_int_value - Voigt_int_value_old -! Voigt_int_value_old = Voigt_int_value -! END DO - -! line_energy_fraction = line_energy_fraction + Voigt_int_value - -! DO iVoigt=(startwavelength_int-1), (endwavelength_int-1) -! Radiation_Profile(iVoigt+1) = Radiation_Profile(iVoigt+1) / RadiationParameter%WaveLenIncr -! END DO - -! ELSE - ! --- determine transition lines of previous computed Voigt-profiles CALL Radiation_Voigt_wavelength_interpolation(Voigt_int, Voigt_int_distmax, wavelength, & - Radiation_Profile, line_energy_fraction, startwavelength_int, endwavelength_int) - -! END IF + Radiation_Profile, startwavelength_int, endwavelength_int) IF (add_radline) THEN @@ -381,19 +352,6 @@ SUBROUTINE Radiation_Atomic_Transition_Line_Profile(Radiation_Profile, wavelengt = Radiation_Absorption_spec(startwavelength_int+i,iElem)+MAX(0.0,abstot)*Radiation_Profile(startwavelength_int+i) END DO -!! ! --- add contribution to total emission -!! em_atom = em_atom + line_energy_fraction * etot - -!! ! --- add radiative energy to emission -!! DO i=0 , (endwavelength_int-startwavelength_int + 0) -!! Radiation_Emission_spec(startwavelength_int+i,iElem) & -!! = Radiation_Emission_spec(startwavelength_int+i,iElem) & -!! + etot * Radiation_Profile(startwavelength_int+i) -!! Radiation_Absorption_spec(startwavelength_int+i,iElem) & -!! = Radiation_Absorption_spec(startwavelength_int+i,iElem) & -!! + abstot * Radiation_Profile(startwavelength_int+i) -!! END DO - END IF END IF @@ -404,7 +362,7 @@ END SUBROUTINE Radiation_Atomic_Transition_Line_Profile SUBROUTINE Radiation_Voigt_wavelength_interpolation(Voigt_int, Voigt_int_distmax, centerwavelength, & - Radiation_Profile, line_energy_fraction, startwavelength_int, endwavelength_int) + Radiation_Profile, startwavelength_int, endwavelength_int) !=================================================================================================================================== ! distributes transition lines with precomputed integrated Voigt-profiles (Voigt_int) !=================================================================================================================================== @@ -418,7 +376,7 @@ SUBROUTINE Radiation_Voigt_wavelength_interpolation(Voigt_int, Voigt_int_distmax ! INPUT VARIABLES REAL, INTENT(IN) :: Voigt_int(-1001:1001), centerwavelength, Voigt_int_distmax ! TODO Voigt_int_nmax in Voigt_int(:) - REAL, INTENT(INOUT) :: Radiation_Profile(:), line_energy_fraction + REAL, INTENT(INOUT) :: Radiation_Profile(:) INTEGER, INTENT(INOUT) :: startwavelength_int, endwavelength_int !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES @@ -453,7 +411,6 @@ SUBROUTINE Radiation_Voigt_wavelength_interpolation(Voigt_int, Voigt_int_distmax Voigt_int_value_old = 0.0!startvalue !TODO: check! Voigt_int_value = 0.0 -!line_energy_fraction = - Voigt_int_value_old DO i=1, (endwavelength_int-startwavelength_int) @@ -483,8 +440,6 @@ SUBROUTINE Radiation_Voigt_wavelength_interpolation(Voigt_int, Voigt_int_distmax END DO -! line_energy_fraction = line_energy_fraction + Voigt_int_value - DO i=1, (endwavelength_int-startwavelength_int) Radiation_Profile(startwavelength_int+i) = Radiation_Profile(startwavelength_int+i) / RadiationParameter%WaveLenIncr END DO diff --git a/src/radiation/radiation_solver/radiation_continuum.f90 b/src/radiation/radiation_solver/radiation_continuum.f90 index 81aedd75f..9ac873e16 100644 --- a/src/radiation/radiation_solver/radiation_continuum.f90 +++ b/src/radiation/radiation_solver/radiation_continuum.f90 @@ -41,7 +41,6 @@ SUBROUTINE radiation_continuum(iElem, em_cont) ! Main routine of continuum radiation calculation !=================================================================================================================================== ! MODULES - USE MOD_Globals_Vars, ONLY : PlanckConst USE MOD_Radiation_Vars, ONLY : RadiationInput, RadiationParameter, Radiation_Emission_spec, RadiationSwitches USE MOD_PARTICLE_Vars, ONLY : nSpecies diff --git a/src/radiation/radiation_solver/radiation_excitation.f90 b/src/radiation/radiation_solver/radiation_excitation.f90 index 3a6b27292..1e13fc2a3 100644 --- a/src/radiation/radiation_solver/radiation_excitation.f90 +++ b/src/radiation/radiation_solver/radiation_excitation.f90 @@ -42,7 +42,7 @@ SUBROUTINE radiation_excitation() !=================================================================================================================================== ! MODULES USE MOD_Globals -USE MOD_Globals_Vars, ONLY : PlanckConst, ElementaryCharge, BoltzmannConst +USE MOD_Globals_Vars, ONLY : ElementaryCharge, BoltzmannConst USE MOD_Radiation_Vars, ONLY : RadiationInput, SpeciesRadiation, NumDensElectrons USE MOD_PARTICLE_Vars, ONLY : nSpecies USE MOD_DSMC_Vars, ONLY : SpecDSMC diff --git a/src/radiation/radiation_solver/radiation_init.f90 b/src/radiation/radiation_solver/radiation_init.f90 index bfaedf77b..aaa9f6bf9 100644 --- a/src/radiation/radiation_solver/radiation_init.f90 +++ b/src/radiation/radiation_solver/radiation_init.f90 @@ -118,9 +118,6 @@ SUBROUTINE InitRadiation() ! LOCAL VARIABLES CHARACTER(32) :: hilf INTEGER :: iSpec, iWaveLen, firstElem, lastElem, iElem -#if USE_MPI - INTEGER(KIND=MPI_ADDRESS_KIND) :: MPISharedSize -#endif /*USE_MPI*/ !=================================================================================================================================== SWRITE(UNIT_stdOut,'(A)') ' INIT RADIATION SOLVER...' diff --git a/src/radiation/radiation_solver/radiation_main.f90 b/src/radiation/radiation_solver/radiation_main.f90 index dd3b33bda..0f86befa2 100644 --- a/src/radiation/radiation_solver/radiation_main.f90 +++ b/src/radiation/radiation_solver/radiation_main.f90 @@ -51,7 +51,7 @@ SUBROUTINE radiation_main(iElem) USE MOD_Radiation_Continuum, ONLY : radiation_continuum USE MOD_Radiation_InstrBroadening, ONLY : radiation_instrbroadening USE MOD_PARTICLE_Vars, ONLY : nSpecies -USE MOD_Mesh_Vars, ONLY: offsetElem +USE MOD_Mesh_Vars, ONLY : nGlobalElems!, offsetElem USE MOD_Radiation_ExportSpectrum ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -111,11 +111,13 @@ SUBROUTINE radiation_main(iElem) ! READ* - OPEN(unit=20,file='Radiation_Emission_Absorption.dat',status='replace',action='write', iostat=io_error) - DO w=1, RadiationParameter%WaveLenDiscr - WRITE(20,*) RadiationParameter%WaveLen(w)*1.E9, Radiation_Emission_spec(w,1), Radiation_Absorption_spec(w,1) - END DO - CLOSE(unit=20) + IF((RadiationSwitches%RadType.EQ.3) .AND. (nGlobalElems.EQ.1)) THEN + OPEN(unit=20,file='Radiation_Emission_Absorption.dat',status='replace',action='write', iostat=io_error) + DO w=1, RadiationParameter%WaveLenDiscr + WRITE(20,*) RadiationParameter%WaveLen(w)*1.E9, Radiation_Emission_spec(w,1), Radiation_Absorption_spec(w,1) + END DO + CLOSE(unit=20) + END IF !------- Write output .dat-file including spectrally resolved emission and absorption for chosen cells ! --- FIRE II Front --- diff --git a/src/radiation/radiation_solver/radiation_molecules.f90 b/src/radiation/radiation_solver/radiation_molecules.f90 index 901dc56ce..7f163c224 100644 --- a/src/radiation/radiation_solver/radiation_molecules.f90 +++ b/src/radiation/radiation_solver/radiation_molecules.f90 @@ -42,7 +42,7 @@ SUBROUTINE radiation_molecules(iElem, em_mol) !=================================================================================================================================== ! MODULES USE MOD_Globals - USE MOD_Globals_Vars, ONLY : BoltzmannConst, PlanckConst, ElementaryCharge, AtomicMassUnit, Pi, c + USE MOD_Globals_Vars, ONLY : BoltzmannConst, PlanckConst, AtomicMassUnit, Pi, c USE MOD_Radiation_Vars, ONLY : RadiationInput, RadiationParameter, SpeciesRadiation, & Radiation_Emission_spec, Radiation_Absorption_spec, NumDensElectrons, TElectrons, & Radiation_ElemEnergy_Species @@ -60,7 +60,7 @@ SUBROUTINE radiation_molecules(iElem, em_mol) !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES - INTEGER :: iSpec, iWave, iBand, iTrans, i, hilf + INTEGER :: iSpec, iWave, iBand, iTrans, i!, hilf REAL :: rho, ptot !in ini !density [kg/m**3], pressure [Pa], number density REAL, ALLOCATABLE :: epsilon_mol(:), epsilon_iSpec(:), abs_iSpec(:) INTEGER :: istart, iend @@ -369,7 +369,7 @@ SUBROUTINE radiation_molecules(iElem, em_mol) ! --- calculate line profile and add radiative energy to emission IF(eps .GE. 1.0E-25) THEN CALL Radiation_Molecular_Transition_Line_Profile(Radiation_Profile, nubar, Voigt_int, Voigt_int_distmax, & - DlamL, DlamV, epsilon_mol, epsilon_iSpec, eps, Radiation_Absorption_spec, abs_iSpec, abstot, iElem) + epsilon_mol, epsilon_iSpec, eps, Radiation_Absorption_spec, abs_iSpec, abstot, iElem) END IF k_lower = k_lower + 1.0 @@ -476,7 +476,7 @@ SUBROUTINE radiation_molecules(iElem, em_mol) ! --- calculate line profile and add radiative energy to emission IF(eps .GE. 1.0E-25) THEN CALL Radiation_Molecular_Transition_Line_Profile(Radiation_Profile, nubar, Voigt_int, Voigt_int_distmax, & - DlamL, DlamV, epsilon_mol, epsilon_iSpec, eps, Radiation_Absorption_spec, abs_iSpec, abstot, iElem) + epsilon_mol, epsilon_iSpec, eps, Radiation_Absorption_spec, abs_iSpec, abstot, iElem) END IF k_lower = k_lower + 1.0 @@ -662,7 +662,7 @@ SUBROUTINE radiation_molecules(iElem, em_mol) ! --- calculate line profile and add radiative energy to emission IF(eps .GE. 1.0E-25) THEN CALL Radiation_Molecular_Transition_Line_Profile(Radiation_Profile, nubar, Voigt_int, Voigt_int_distmax, & - DlamL, DlamV, epsilon_mol, epsilon_iSpec, eps, Radiation_Absorption_spec, abs_iSpec, abstot, iElem) + epsilon_mol, epsilon_iSpec, eps, Radiation_Absorption_spec, abs_iSpec, abstot, iElem) END IF j_lower = j_lower + 1.0 @@ -756,7 +756,7 @@ SUBROUTINE radiation_molecules(iElem, em_mol) ! --- calculate line profile and add radiative energy to emission IF(eps .GE. 1.0E-25) THEN CALL Radiation_Molecular_Transition_Line_Profile(Radiation_Profile, nubar, Voigt_int, Voigt_int_distmax, & - DlamL, DlamV, epsilon_mol, epsilon_iSpec, eps, Radiation_Absorption_spec, abs_iSpec, abstot, iElem) + epsilon_mol, epsilon_iSpec, eps, Radiation_Absorption_spec, abs_iSpec, abstot, iElem) END IF END DO ! k END DO ! iBranch @@ -881,7 +881,7 @@ SUBROUTINE radiation_molecules(iElem, em_mol) ! --- calculate line profile and add radiative energy to emission IF(eps .GE. 1.0E-25) THEN CALL Radiation_Molecular_Transition_Line_Profile(Radiation_Profile, nubar, Voigt_int, Voigt_int_distmax, & - DlamL, DlamV, epsilon_mol, epsilon_iSpec, eps, Radiation_Absorption_spec, abs_iSpec, abstot, iElem) + epsilon_mol, epsilon_iSpec, eps, Radiation_Absorption_spec, abs_iSpec, abstot, iElem) END IF END DO ! k END DO ! iBranch @@ -971,7 +971,7 @@ SUBROUTINE radiation_molecules(iElem, em_mol) ! --- calculate line profile and add radiative energy to emission IF(eps .GE. 1.0E-25) THEN CALL Radiation_Molecular_Transition_Line_Profile(Radiation_Profile, nubar, Voigt_int, Voigt_int_distmax, & - DlamL, DlamV, epsilon_mol, epsilon_iSpec, eps, Radiation_Absorption_spec, abs_iSpec, abstot, iElem) + epsilon_mol, epsilon_iSpec, eps, Radiation_Absorption_spec, abs_iSpec, abstot, iElem) END IF END DO !k @@ -1073,7 +1073,7 @@ END FUNCTION ckovacs -SUBROUTINE Radiation_Molecular_Transition_Line_Profile(Radiation_Profile, nubar, Voigt_int, Voigt_int_distmax, DlamL, DlamV, & +SUBROUTINE Radiation_Molecular_Transition_Line_Profile(Radiation_Profile, nubar, Voigt_int, Voigt_int_distmax, & epsilon_mol, epsilon_iSpec, eps, Radiation_Absorption_spec, abs_iSpec, abstot, iElem) !=================================================================================================================================== ! calculates emission profile functions and adds radiative energy to emission array @@ -1081,22 +1081,20 @@ SUBROUTINE Radiation_Molecular_Transition_Line_Profile(Radiation_Profile, nubar, ! MODULES USE MOD_Globals USE MOD_Radiation_Vars, ONLY : RadiationParameter - USE MOD_Globals_Vars, ONLY : Pi ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES REAL, INTENT(INOUT) :: Radiation_Profile(:), epsilon_mol(:), epsilon_iSpec(:), Radiation_Absorption_spec(:,:), & abs_iSpec(:) - REAL, INTENT(IN) :: nubar, Voigt_int_distmax, DlamL, DlamV, eps, abstot,Voigt_int(-1001:1001) + REAL, INTENT(IN) :: nubar, Voigt_int_distmax, eps, abstot,Voigt_int(-1001:1001) INTEGER, INTENT(IN) :: iElem !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES - INTEGER :: startwavelength_int, endwavelength_int, i, iVoigt + INTEGER :: startwavelength_int, endwavelength_int, i LOGICAL :: add_radline - REAL :: line_energy_fraction, Voigt_int_value, Voigt_int_value_old !=================================================================================================================================== ! --- determination of indices for first and last entry of Voigt-profiles on wavelength axis @@ -1106,7 +1104,6 @@ SUBROUTINE Radiation_Molecular_Transition_Line_Profile(Radiation_Profile, nubar, - RadiationParameter%MinWaveLen) / RadiationParameter%WaveLenIncr) + 1) add_radline = .FALSE. -! line_energy_fraction = 0. IF ( (startwavelength_int .LT. endwavelength_int) .AND. & (((1./(100.*nubar))+Voigt_int_distmax) .GT. RadiationParameter%MinWaveLen) .AND. & @@ -1116,34 +1113,9 @@ SUBROUTINE Radiation_Molecular_Transition_Line_Profile(Radiation_Profile, nubar, add_radline = .TRUE. -! IF( (DlamL/DlamV) .GE. 0.9) THEN - -! ! --- simplified computation of line profile if line is dispersive -! Voigt_int_value_old = 1. / Pi * ATAN(2./(DlamV) & -! * (RadiationParameter%WaveLen(startwavelength_int-1)-(1./(100.*nubar)))) - -! line_energy_fraction = - Voigt_int_value_old - -! DO iVoigt = (startwavelength_int-1), (endwavelength_int-1) -! Voigt_int_value = 1. / Pi * ATAN(2./(DlamV) & -! * (RadiationParameter%WaveLen(iVoigt)-(1./(100.*nubar)))) -! Radiation_Profile(iVoigt+1) = Voigt_int_value - Voigt_int_value_old -! Voigt_int_value_old = Voigt_int_value -! END DO - -! line_energy_fraction = line_energy_fraction + Voigt_int_value - -! DO iVoigt=(startwavelength_int-1), (endwavelength_int-1) -! Radiation_Profile(iVoigt+1) = Radiation_Profile(iVoigt+1) / RadiationParameter%WaveLenIncr -! END DO - -! ELSE - ! --- determine transition lines of previous computed Voigt-profiles CALL Radiation_Voigt_wavelength_interpolation(Voigt_int, Voigt_int_distmax, (1./(100.*nubar)), & - Radiation_Profile, line_energy_fraction, startwavelength_int, endwavelength_int) - -! END IF + Radiation_Profile, startwavelength_int, endwavelength_int) IF (add_radline) THEN @@ -1172,7 +1144,7 @@ END SUBROUTINE Radiation_Molecular_Transition_Line_Profile SUBROUTINE Radiation_Voigt_wavelength_interpolation(Voigt_int, Voigt_int_distmax, centerwavelength, & - Radiation_Profile, line_energy_fraction, startwavelength_int, endwavelength_int) + Radiation_Profile, startwavelength_int, endwavelength_int) !=================================================================================================================================== ! distributes transition lines with precomputed integrated Voigt-profiles (Voigt_int) !=================================================================================================================================== @@ -1185,7 +1157,7 @@ SUBROUTINE Radiation_Voigt_wavelength_interpolation(Voigt_int, Voigt_int_distmax ! INPUT VARIABLES REAL, INTENT(IN) :: Voigt_int(-1001:1001), centerwavelength, Voigt_int_distmax ! TODO Voigt_int_nmax in Voigt_int(:) - REAL, INTENT(INOUT) :: Radiation_Profile(:), line_energy_fraction + REAL, INTENT(INOUT) :: Radiation_Profile(:) INTEGER, INTENT(INOUT) :: startwavelength_int, endwavelength_int !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES @@ -1251,8 +1223,6 @@ SUBROUTINE Radiation_Voigt_wavelength_interpolation(Voigt_int, Voigt_int_distmax END DO -! line_energy_fraction = line_energy_fraction + Voigt_int_value - ! DO i=1, width_int+1 DO i=1, (endwavelength_int-startwavelength_int) Radiation_Profile(startwavelength_int+i) = Radiation_Profile(startwavelength_int+i) / RadiationParameter%WaveLenIncr diff --git a/src/radiation/radiative_transfer/radtrans_init.f90 b/src/radiation/radiative_transfer/radtrans_init.f90 index 16401bb5a..c82202cae 100644 --- a/src/radiation/radiative_transfer/radtrans_init.f90 +++ b/src/radiation/radiative_transfer/radtrans_init.f90 @@ -65,7 +65,7 @@ SUBROUTINE InitRadiationTransport() USE MOD_Particle_Mesh_Vars, ONLY : ElemVolume_Shared,ElemMidPoint_Shared, GEO, nComputeNodeElems USE MOD_Globals_Vars, ONLY : BoltzmannConst, PlanckConst USE MOD_Particle_Boundary_Sampling, ONLY : InitParticleBoundarySampling -USE MOD_Particle_Boundary_Vars, ONLY : SurfMesh,nComputeNodeSurfTotalSides +USE MOD_Particle_Boundary_Vars, ONLY : nComputeNodeSurfTotalSides!, SurfMesh USE MOD_Radiation_Vars, ONLY : RadiationParameter, Radiation_Emission_spec, Radiation_Absorption_spec, RadiationSwitches USE MOD_Radiation_Vars, ONLY : Radiation_Absorption_Spec_Shared, Radiation_Absorption_Spec_Shared_Win USE MOD_Radiation_Vars, ONLY : Radiation_Emission_Spec_Shared_Win, Radiation_Emission_Spec_Shared @@ -85,7 +85,7 @@ SUBROUTINE InitRadiationTransport() ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -INTEGER :: iWave, iElem, iNode, firstElem, lastElem, ElemDisp +INTEGER :: iWave, iElem, firstElem, lastElem, ElemDisp REAL :: LocTemp !=================================================================================================================================== SWRITE(UNIT_StdOut,'(132("-"))') diff --git a/src/radiation/radiative_transfer/radtrans_main.f90 b/src/radiation/radiative_transfer/radtrans_main.f90 index 65a105890..48f80d3ce 100644 --- a/src/radiation/radiative_transfer/radtrans_main.f90 +++ b/src/radiation/radiative_transfer/radtrans_main.f90 @@ -177,7 +177,7 @@ FUNCTION SetPhotonEnergy(iElem) !=================================================================================================================================== ! MODULES USE MOD_RadiationTrans_Vars ,ONLY : RadEmiAdaptPhotonNum, Radiation_Emission_Spec_Total, RadTrans, RadTransPhotPerCell -USE MOD_Particle_Mesh_Vars ,ONLY : GEO, ElemVolume_Shared +USE MOD_Particle_Mesh_Vars ,ONLY : ElemVolume_Shared ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -252,7 +252,7 @@ FUNCTION SetPhotonStartDirection(iElem, iPhot, RandRot) ! MODULES USE MOD_Globals USE MOD_Globals_Vars, ONLY : Pi -USE MOD_RadiationTrans_Vars ,ONLY : RadiationDirectionModel, RadTrans, RadTransPhotPerCell +USE MOD_RadiationTrans_Vars ,ONLY : RadiationDirectionModel, RadTransPhotPerCell ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tools.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tools.f90 index e83075921..ab4826673 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tools.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tools.f90 @@ -45,7 +45,7 @@ SUBROUTINE PhotonThroughSideCheck3DFast(iLocSide,Element,ThroughSide,TriNum, IsM !=================================================================================================================================== ! MODULES USE MOD_Globals_Vars ,ONLY: EpsMach -USE MOD_Particle_Mesh_Vars, ONLY : GEO, NodeCoords_Shared, ElemSideNodeID_Shared +USE MOD_Particle_Mesh_Vars, ONLY : NodeCoords_Shared, ElemSideNodeID_Shared USE MOD_RadiationTrans_Vars, ONLY:PhotonProps USE MOD_Mesh_Tools ,ONLY: GetCNElemID ! IMPLICIT VARIABLE HANDLING @@ -318,7 +318,7 @@ SUBROUTINE PhotonIntersectionWithSide(iLocSide,Element,TriNum, IntersectionPos, !--------------------------------------------------------------------------------------------------! !Based on PerfectReflection3D !--------------------------------------------------------------------------------------------------! -USE MOD_Particle_Mesh_Vars, ONLY : GEO, ElemSideNodeID_Shared, NodeCoords_Shared +USE MOD_Particle_Mesh_Vars, ONLY : ElemSideNodeID_Shared, NodeCoords_Shared USE MOD_RadiationTrans_Vars, ONLY:PhotonProps USE MOD_Mesh_Tools ,ONLY: GetCNElemID !--------------------------------------------------------------------------------------------------! @@ -505,7 +505,7 @@ SUBROUTINE PerfectPhotonReflection(iLocSide,Element,TriNum, IntersectionPos, Int !--------------------------------------------------------------------------------------------------! !Based on PerfectReflection3D !--------------------------------------------------------------------------------------------------! - USE MOD_Particle_Mesh_Vars, ONLY : GEO, NodeCoords_Shared, ElemSideNodeID_Shared + USE MOD_Particle_Mesh_Vars, ONLY : NodeCoords_Shared, ElemSideNodeID_Shared USE MOD_RadiationTrans_Vars, ONLY : PhotonProps USE MOD_Mesh_Tools ,ONLY: GetCNElemID !--------------------------------------------------------------------------------------------------! @@ -612,11 +612,10 @@ SUBROUTINE PerfectPhotonReflection2D(iLocSide,Element, IntersectionPos) INTEGER,INTENT(IN) :: Element ! REAL, INTENT(INOUT) :: IntersectionPos(1:3) ! Local variable declaration ! - INTEGER :: Node1, Node2, CNElemID ! - REAL :: PoldX, PoldY, PoldZ, nx, ny, nz, nVal, nytmp, nValIntersec - REAL :: xNod, yNod, zNod + INTEGER :: CNElemID ! + REAL :: nx, ny, nz, nValIntersec REAL :: VelX, VelY, VelZ - REAL :: Vector1(1:3), Vector2(1:3), POI_fak, ProjVel + REAL :: ProjVel !--------------------------------------------------------- -----------------------------------------! !--------------------------------------------------------------------------------------------------! CNElemID = GetCNElemID(Element) @@ -648,7 +647,7 @@ SUBROUTINE DiffusePhotonReflection(iLocSide,Element,TriNum, IntersectionPos, Int !--------------------------------------------------------------------------------------------------! !Based on PerfectReflection3D !--------------------------------------------------------------------------------------------------! - USE MOD_Particle_Mesh_Vars, ONLY : GEO, ElemSideNodeID_Shared, NodeCoords_Shared + USE MOD_Particle_Mesh_Vars, ONLY : ElemSideNodeID_Shared, NodeCoords_Shared USE MOD_RadiationTrans_Vars, ONLY : PhotonProps USE Ziggurat USE MOD_Mesh_Tools ,ONLY: GetCNElemID diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 index 673a84fbc..884ac0bab 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 @@ -54,7 +54,6 @@ SUBROUTINE PhotonTriaTracking() USE MOD_RadiationTrans_Vars, ONLY:PhotonProps USE MOD_Photon_TrackingTools, ONLY:PhotonThroughSideCheck3DFast, PhotonIntersectionWithSide,CalcAbsoprtion USE MOD_Photon_TrackingTools, ONLY:PerfectPhotonReflection, DiffusePhotonReflection, CalcWallAbsoprtion -USE MOD_Particle_Vars, ONLY:Symmetry IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES @@ -62,7 +61,7 @@ SUBROUTINE PhotonTriaTracking() ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -INTEGER :: NblocSideID, NbElemID, ind, nbSideID, nMortarElems, SideIDMortar, BCType, localSideID +INTEGER :: NblocSideID, NbElemID, ind, nbSideID, nMortarElems, BCType, localSideID INTEGER :: ElemID,OldElemID,nlocSides INTEGER :: LocalSide INTEGER :: NrOfThroughSides, ind2 @@ -74,7 +73,6 @@ SUBROUTINE PhotonTriaTracking() LOGICAL :: oldElemIsMortar, isMortarSideTemp(1:6), doCheckSide REAL :: minRatio, intersecDist, intersecDistVec(3) REAL :: IntersectionPos(1:3), IntersectionPosTemp(1:3) -REAL, PARAMETER :: eps = 0 !=================================================================================================================================== Done = .FALSE. @@ -321,8 +319,8 @@ SUBROUTINE Photon2DSymTracking() ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -INTEGER :: NblocSideID3D, NbElemID, ind, nbSideID, nMortarElems, SideIDMortar, BCType, NblocSideID -INTEGER :: ElemID, OldElemID, LocSide3D, LocalSide, NrOfThroughSides, localSideID, nlocSides +INTEGER :: NbElemID, ind, nbSideID, nMortarElems, BCType, NblocSideID +INTEGER :: ElemID, OldElemID, LocalSide, NrOfThroughSides, localSideID, nlocSides INTEGER :: SideID, TempSideID, iLocSide, correctSide, LastSide INTEGER :: LocSidesTemp(1:6), GlobSideTemp(1:6) LOGICAL :: oldElemIsMortar, isMortarSideTemp(1:6), isLastSide, ThroughSide, Done From c873da4f191f9aac0ed9209f1c8b2c4d377a3139 Mon Sep 17 00:00:00 2001 From: irsbeyer Date: Mon, 30 Aug 2021 20:00:16 +0200 Subject: [PATCH 012/495] fix status bar --- src/output/output.f90 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/output/output.f90 b/src/output/output.f90 index 84ae7a6ea..0b1e6c6e5 100644 --- a/src/output/output.f90 +++ b/src/output/output.f90 @@ -272,9 +272,9 @@ SUBROUTINE PrintStatusLineRadiation(t,tStart,tEnd,Phot) REPEAT('☢ ',CEILING(percent/4)),REPEAT(' ',INT((100-percent)/4)),'| [',percent,'%] ',& ACHAR(13) ! ACHAR(13) is carriage return ELSE - WRITE(UNIT_stdOut,'(A,E10.4,A,I6,A1,I0.2,A1,I0.2,A1,I0.2,A,A,A1,A,A3,F6.2,A3,A1)',ADVANCE='NO') & - ' Elem = ', t,' eta = ',INT(days),':',INT(hours),':',INT(mins),':',INT(secs),' |',& - REPEAT('🚀 ',MAX(CEILING(percent/4)-1,0)),'>',REPEAT(' ',INT((100-percent)/4)),'| [',percent,'%] ',& + WRITE(UNIT_stdOut,'(A,E10.4,A,E10.4,A,A,I6,A1,I0.2,A1,I0.2,A1,I0.2,A,A,A,A3,F6.2,A3,A1)',ADVANCE='NO') & + ' Elem = ', t,' TotalElems = ', tEnd, ' ', ' eta = ',INT(days),':',INT(hours),':',INT(mins),':',INT(secs),' |',& + REPEAT('🚀',CEILING(percent/4)),REPEAT(' ',INT((100-percent)/4)),'| [',percent,'%] ',& ACHAR(13) ! ACHAR(13) is carriage return END IF #ifdef INTEL From 9ae17eefd01b419329ca191edb511df8d639ef65 Mon Sep 17 00:00:00 2001 From: Marcel Pfeiffer Date: Tue, 31 Aug 2021 23:36:38 +0200 Subject: [PATCH 013/495] missing init for surface output --- src/particles/particle_init.f90 | 4 ++++ src/radiation/radiative_transfer/radtrans_output.f90 | 12 +++++++++--- src/timedisc/timedisc_TimeStep_Radiation.f90 | 3 +-- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/particles/particle_init.f90 b/src/particles/particle_init.f90 index 8a37b96b3..64620057d 100644 --- a/src/particles/particle_init.f90 +++ b/src/particles/particle_init.f90 @@ -331,11 +331,15 @@ SUBROUTINE InitParticles() END IF ! Initialize surface sampling / rotational periodic mapping +#if (PP_TimeDiscMethod==600) + CALL InitParticleBoundarySampling() +#else IF (WriteMacroSurfaceValues.OR.DSMC%CalcSurfaceVal.OR.(ANY(PartBound%Reactive)).OR.(nPorousBC.GT.0).OR.GEO%RotPeriodicBC) THEN CALL InitParticleBoundarySampling() CALL InitParticleBoundaryRotPeriodic() CALL InitAdaptiveWallTemp() END IF +#endif ! Initialize porous boundary condition (requires BCdata_auxSF and SurfMesh from InitParticleBoundarySampling) IF(nPorousBC.GT.0) CALL InitPorousBoundaryCondition() diff --git a/src/radiation/radiative_transfer/radtrans_output.f90 b/src/radiation/radiative_transfer/radtrans_output.f90 index 1e786888d..564b78299 100644 --- a/src/radiation/radiative_transfer/radtrans_output.f90 +++ b/src/radiation/radiative_transfer/radtrans_output.f90 @@ -67,7 +67,7 @@ SUBROUTINE WriteRadiationToHDF5() INTEGER :: nVal, iElem, nVar, iSpec, nVarCount, nVarSpec, CNElemID, iWave REAL, ALLOCATABLE :: TempOutput(:,:) CHARACTER(LEN=255), ALLOCATABLE :: StrVarNames(:) - REAL :: AbsTotal + REAL :: AbsTotal,tempSpecAbs !=================================================================================================================================== SWRITE(UNIT_stdOut,'(a)',ADVANCE='NO') ' WRITE Radiation TO HDF5 FILE...' FileString=TRIM(ProjectName)//'_RadiationState.h5' @@ -126,8 +126,12 @@ SUBROUTINE WriteRadiationToHDF5() DO iSpec=1, nSpecies TempOutput(nVarCount+1, iElem) = Radiation_ElemEnergy_Species(iSpec,CNElemID,1) ! TempOutput(nVarCount+2, iElem) = Radiation_ElemEnergy_Species(iSpec,iElem,2) !abs coefficient - TempOutput(nVarCount+2, iElem) = & - MAX(Radiation_ElemEnergy_Species(iSpec,CNElemID,2)/AbsTotal * RadiationElemAbsEnergy_Shared(iElem+offSetElem)/ ElemVolume_Shared(CNElemID),0.) !lost energy + IF (AbsTotal.GT.0) THEN + tempSpecAbs = Radiation_ElemEnergy_Species(iSpec,CNElemID,2)/AbsTotal * RadiationElemAbsEnergy_Shared(iElem+offSetElem)/ ElemVolume_Shared(CNElemID) + ELSE + tempSpecAbs = 0.0 + END IF + TempOutput(nVarCount+2, iElem) = MAX(tempSpecAbs,0.) !lost energy nVarCount=nVarCount+nVarSpec END DO TempOutput((nVarSpec*nSpecies+1), iElem) = SUM(Radiation_ElemEnergy_Species(:,CNElemID,1)) @@ -164,6 +168,8 @@ SUBROUTINE WriteRadiationToHDF5() collective=.TRUE., RealArray=TempOutput(:,:)) CALL CloseDataFile() SWRITE(*,*) 'DONE' + + CALL WriteSurfSampleToHDF5() END SUBROUTINE WriteRadiationToHDF5 diff --git a/src/timedisc/timedisc_TimeStep_Radiation.f90 b/src/timedisc/timedisc_TimeStep_Radiation.f90 index a603abc9c..9ceff30a0 100644 --- a/src/timedisc/timedisc_TimeStep_Radiation.f90 +++ b/src/timedisc/timedisc_TimeStep_Radiation.f90 @@ -33,7 +33,7 @@ SUBROUTINE TimeStep_Radiation() !=================================================================================================================================== ! MODULES USE MOD_RadTransport, ONLY: RadTrans_main -USE MOD_RadTrans_Output, ONLY: WriteRadiationToHDF5, WriteSurfSampleToHDF5 +USE MOD_RadTrans_Output, ONLY: WriteRadiationToHDF5 ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -45,7 +45,6 @@ SUBROUTINE TimeStep_Radiation() CALL RadTrans_main() CALL WriteRadiationToHDF5() -CALL WriteSurfSampleToHDF5() END SUBROUTINE TimeStep_Radiation From e27b1517a44f6ab4eae128a1d69dad23248b5ee0 Mon Sep 17 00:00:00 2001 From: Marcel Pfeiffer Date: Wed, 1 Sep 2021 12:00:56 +0200 Subject: [PATCH 014/495] some stuff for int kind 8 --- .../radiation_solver/radiation_init.f90 | 7 ++++--- .../radiative_transfer/radtrans_output.f90 | 20 ++++++++++++------- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/radiation/radiation_solver/radiation_init.f90 b/src/radiation/radiation_solver/radiation_init.f90 index aaa9f6bf9..c7ea0c7ef 100644 --- a/src/radiation/radiation_solver/radiation_init.f90 +++ b/src/radiation/radiation_solver/radiation_init.f90 @@ -194,15 +194,16 @@ SUBROUTINE InitRadiation() #if USE_MPI ! allocate shared array for Radiation_Emission/Absorption_Spec +SWRITE(*,*) 'Hier0', RadiationParameter%WaveLenDiscr,nComputeNodeElems CALL Allocate_Shared((/RadiationParameter%WaveLenDiscr,nComputeNodeElems/), Radiation_Emission_Spec_Shared_Win,Radiation_Emission_Spec_Shared) CALL MPI_WIN_LOCK_ALL(0,Radiation_Emission_Spec_Shared_Win,IERROR) - +SWRITE(*,*) 'Hier1' CALL Allocate_Shared((/RadiationParameter%WaveLenDiscr*nGlobalElems/),Radiation_Absorption_Spec_Shared_Win,Radiation_Absorption_Spec_Shared) CALL MPI_WIN_LOCK_ALL(0,Radiation_Absorption_Spec_Shared_Win,IERROR) - +SWRITE(*,*) 'Hier2' CALL Allocate_Shared((/nSpecies,nComputeNodeElems,2/), Radiation_ElemEnergy_Species_Shared_Win,Radiation_ElemEnergy_Species_Shared) CALL MPI_WIN_LOCK_ALL(0,Radiation_ElemEnergy_Species_Shared_Win,IERROR) - +SWRITE(*,*) 'Hier3' Radiation_Emission_spec => Radiation_Emission_spec_Shared Radiation_Absorption_spec(1:RadiationParameter%WaveLenDiscr ,1:nGlobalElems) => Radiation_Absorption_spec_Shared Radiation_ElemEnergy_Species => Radiation_ElemEnergy_Species_Shared diff --git a/src/radiation/radiative_transfer/radtrans_output.f90 b/src/radiation/radiative_transfer/radtrans_output.f90 index 564b78299..4a8116df4 100644 --- a/src/radiation/radiative_transfer/radtrans_output.f90 +++ b/src/radiation/radiative_transfer/radtrans_output.f90 @@ -161,11 +161,17 @@ SUBROUTINE WriteRadiationToHDF5() END IF nVal=nGlobalElems ! For the MPI case this must be replaced by the global number of elements (sum over all procs) - CALL WriteArrayToHDF5(DataSetName='ElemData', rank=2,& - nValGlobal=(/nVar, nGlobalElems/),& - nVal= (/nVar, PP_nElems/),& - offset= (/0, offsetElem /),& - collective=.TRUE., RealArray=TempOutput(:,:)) + ASSOCIATE (& + nVar => INT(nVar,IK) ,& + nGlobalElems => INT(nGlobalElems,IK) ,& + offsetElem => INT(offsetElem,IK) ,& + PP_nElems => INT(PP_nElems,IK)) + CALL WriteArrayToHDF5(DataSetName='ElemData', rank=2,& + nValGlobal=(/nVar, nGlobalElems/),& + nVal= (/nVar, PP_nElems/),& + offset= (/0_IK, offsetElem /),& + collective=.TRUE., RealArray=TempOutput(:,:)) + END ASSOCIATE CALL CloseDataFile() SWRITE(*,*) 'DONE' @@ -478,8 +484,8 @@ SUBROUTINE WriteSurfSampleToHDF5() helpArray(2,OutputCounter)= PhotonSampWall(2,iSurfSide)/SurfSideArea(1,1,iSurfSide) END DO CALL WriteArrayToHDF5(DataSetName=H5_Name , rank=4 , & - nValGlobal =(/nVar2D , 1, 1 , nGlobalSides/) , & - nVal =(/nVar2D , 1, 1 , LocalnBCSides/) , & + nValGlobal =(/nVar2D , 1_IK, 1_IK , nGlobalSides/) , & + nVal =(/nVar2D , 1_IK, 1_IK , LocalnBCSides/) , & offset =(/0_IK, 0_IK , 0_IK , offsetSurfSide/), & collective =.TRUE. ,& RealArray=helpArray(1:nVar2D,1:LocalnBCSides)) From d39b883ea37fd1e90edd1b0d8266bdc3716e6e1d Mon Sep 17 00:00:00 2001 From: Marcel Pfeiffer Date: Tue, 7 Sep 2021 22:14:39 +0200 Subject: [PATCH 015/495] dirty doubled routine for int kind 8 Allocate_Shared --- src/mpi/mpi_shared.f90 | 52 ++++++++++++++++++- .../radiation_solver/radiation_excitation.f90 | 2 +- .../radiation_solver/radiation_init.f90 | 19 +++---- 3 files changed, 60 insertions(+), 13 deletions(-) diff --git a/src/mpi/mpi_shared.f90 b/src/mpi/mpi_shared.f90 index 1ae539e35..738e06624 100644 --- a/src/mpi/mpi_shared.f90 +++ b/src/mpi/mpi_shared.f90 @@ -78,7 +78,7 @@ MODULE MOD_MPI_Shared MODULE PROCEDURE MPI_SIZE END INTERFACE -PUBLIC::UNLOCK_AND_FREE_DUMMY +PUBLIC::UNLOCK_AND_FREE_DUMMY, Allocate_Shared_Test PUBLIC::BARRIER_AND_SYNC PUBLIC::MPI_SIZE !================================================================================================================================== @@ -560,6 +560,56 @@ SUBROUTINE Allocate_Shared_Real_1(nVal,SM_WIN,DataPointer& END SUBROUTINE ALLOCATE_SHARED_REAL_1 +SUBROUTINE Allocate_Shared_Test(nVal,SM_WIN,DataPointer& +#ifdef DEBUG_MEMORY + ,SM_WIN_NAME& +#endif /*DEBUG_MEMORY*/ +) +! MODULES +USE,INTRINSIC :: ISO_C_BINDING +USE MOD_Globals +USE MOD_MPI_Vars +USE MOD_MPI_Shared_Vars +IMPLICIT NONE +!---------------------------------------------------------------------------------------------------------------------------------- +! INPUT/OUTPUT VARIABLES +INTEGER(KIND=IK),INTENT(IN) :: nVal(1) !> Local number of variables in each rank +INTEGER,INTENT(OUT) :: SM_WIN !> Shared memory window +REAL ,INTENT(OUT),POINTER :: DataPointer(:) !> Pointer to the RMA window +#ifdef DEBUG_MEMORY +CHARACTER(LEN=*),INTENT(IN) :: SM_WIN_NAME !> Shared memory window name +#endif /*DEBUG_MEMORY*/ +!---------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +TYPE(C_PTR) :: SM_PTR !> Base pointer, translated to DataPointer later +INTEGER :: DISP_UNIT !> Displacement unit +INTEGER(KIND=MPI_ADDRESS_KIND) :: WIN_SIZE !> Size of the allocated memory window on current proc +!================================================================================================================================== +! Only node MPI root actually allocates the memory, all other nodes allocate memory with zero length but use the same displacement +WIN_SIZE = MERGE(MPI_SIZE(PRODUCT(INT(nVal,KIND=8)),KIND(DataPointer)),INT(0,MPI_ADDRESS_KIND),myComputeNodeRank.EQ.0) +DISP_UNIT = 1 + +#ifdef DEBUG_MEMORY +LWRITE(UNIT_stdOut,'(A,I7,A65,I20)') "myrank=",myrank," Allocated "//TRIM(SM_WIN_NAME)//" with WIN_SIZE = ",WIN_SIZE +#endif /*DEBUG_MEMORY*/ + +IF (ASSOCIATED(DataPointer)) CALL abort(& +__STAMP__& +,'ERROR: Datapointer (Real1) already associated') + +! Allocate MPI-3 remote memory access (RMA) type memory window +CALL MPI_WIN_ALLOCATE_SHARED(WIN_SIZE, DISP_UNIT, MPI_INFO_SHARED_LOOSE, MPI_COMM_SHARED, SM_PTR, SM_WIN,IERROR) + + +! Node MPI root already knows the location in virtual memory, all other find it here +IF (myComputeNodeRank.NE.0) THEN + CALL MPI_WIN_SHARED_QUERY(SM_WIN, 0, WIN_SIZE, DISP_UNIT, SM_PTR,IERROR) +END IF + +! SM_PTR can now be associated with a Fortran pointer and thus used to access the shared data +CALL C_F_POINTER(SM_PTR, DataPointer,nVal) + +END SUBROUTINE Allocate_Shared_Test !================================================================================================================================== !> Allocate data with MPI-3 shared memory option diff --git a/src/radiation/radiation_solver/radiation_excitation.f90 b/src/radiation/radiation_solver/radiation_excitation.f90 index 1e13fc2a3..59004b8b6 100644 --- a/src/radiation/radiation_solver/radiation_excitation.f90 +++ b/src/radiation/radiation_solver/radiation_excitation.f90 @@ -76,7 +76,7 @@ SUBROUTINE radiation_excitation() IF (SpeciesRadiation(iSpec)%nLevels.EQ.0) CYCLE low_IonizationPot = 2.9E-8*SQRT(NumDensElectrons/1.E6/MAX(1.,RadiationInput(iSpec)%Telec))*ElementaryCharge - nLevels_considered = SpeciesRadiation(1)%nLevels + nLevels_considered = SpeciesRadiation(iSpec)%nLevels IF (low_IonizationPot .NE. 0.0) THEN DO iLevel_considered = 1, SpeciesRadiation(iSpec)%nLevels diff --git a/src/radiation/radiation_solver/radiation_init.f90 b/src/radiation/radiation_solver/radiation_init.f90 index c7ea0c7ef..e4b1fd3d8 100644 --- a/src/radiation/radiation_solver/radiation_init.f90 +++ b/src/radiation/radiation_solver/radiation_init.f90 @@ -193,17 +193,14 @@ SUBROUTINE InitRadiation() TElectrons = GETREAL('Radiation-TElectrons', '0.0') #if USE_MPI - ! allocate shared array for Radiation_Emission/Absorption_Spec -SWRITE(*,*) 'Hier0', RadiationParameter%WaveLenDiscr,nComputeNodeElems + ! allocate shared array for Radiation_Emission/Absorption_Spec CALL Allocate_Shared((/RadiationParameter%WaveLenDiscr,nComputeNodeElems/), Radiation_Emission_Spec_Shared_Win,Radiation_Emission_Spec_Shared) CALL MPI_WIN_LOCK_ALL(0,Radiation_Emission_Spec_Shared_Win,IERROR) -SWRITE(*,*) 'Hier1' -CALL Allocate_Shared((/RadiationParameter%WaveLenDiscr*nGlobalElems/),Radiation_Absorption_Spec_Shared_Win,Radiation_Absorption_Spec_Shared) +CALL Allocate_Shared_Test((/INT(RadiationParameter%WaveLenDiscr,IK)*INT(nGlobalElems,IK)/),Radiation_Absorption_Spec_Shared_Win,Radiation_Absorption_Spec_Shared) CALL MPI_WIN_LOCK_ALL(0,Radiation_Absorption_Spec_Shared_Win,IERROR) -SWRITE(*,*) 'Hier2' CALL Allocate_Shared((/nSpecies,nComputeNodeElems,2/), Radiation_ElemEnergy_Species_Shared_Win,Radiation_ElemEnergy_Species_Shared) CALL MPI_WIN_LOCK_ALL(0,Radiation_ElemEnergy_Species_Shared_Win,IERROR) -SWRITE(*,*) 'Hier3' + Radiation_Emission_spec => Radiation_Emission_spec_Shared Radiation_Absorption_spec(1:RadiationParameter%WaveLenDiscr ,1:nGlobalElems) => Radiation_Absorption_spec_Shared Radiation_ElemEnergy_Species => Radiation_ElemEnergy_Species_Shared @@ -347,11 +344,11 @@ SUBROUTINE MacroscopicRadiationInput() DO iSpec = 1, nSpecies DO iElem = 1, nElems CNElemID = GetCNElemID(iElem+offsetElem) - MacroRadInputParameters(CNElemID,iSpec,1) = ElemData_HDF5(iVar+ 6,iElem) !density - MacroRadInputParameters(CNElemID,iSpec,2) = ElemData_HDF5(iVar+ 7,iElem) !T_vib - MacroRadInputParameters(CNElemID,iSpec,3) = ElemData_HDF5(iVar+ 8,iElem) !T_rot - MacroRadInputParameters(CNElemID,iSpec,4) = ElemData_HDF5(iVar+ 9,iElem) !T_elec - MacroRadInputParameters(CNElemID,iSpec,5) = ElemData_HDF5(iVar+11,iElem) !T_mean + MacroRadInputParameters(CNElemID,iSpec,1) = MAX(0.,ElemData_HDF5(iVar+ 6,iElem)) !density + MacroRadInputParameters(CNElemID,iSpec,2) = MAX(0.,ElemData_HDF5(iVar+ 7,iElem)) !T_vib + MacroRadInputParameters(CNElemID,iSpec,3) = MAX(0.,ElemData_HDF5(iVar+ 8,iElem)) !T_rot + MacroRadInputParameters(CNElemID,iSpec,4) = MAX(0.,ElemData_HDF5(iVar+ 9,iElem)) !T_elec + MacroRadInputParameters(CNElemID,iSpec,5) = MAX(0.,ElemData_HDF5(iVar+11,iElem)) !T_mean END DO iVar = iVar + DSMC_NVARS END DO From 109be3340ec2f7e4601f679a72a19bc1aa7794d1 Mon Sep 17 00:00:00 2001 From: irsbeyer Date: Wed, 22 Sep 2021 14:18:53 +0200 Subject: [PATCH 016/495] species-dependent relaxation probabilities for electronic excitation --- src/particles/dsmc/dsmc_init.f90 | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/particles/dsmc/dsmc_init.f90 b/src/particles/dsmc/dsmc_init.f90 index ae6a2031f..31c931a90 100644 --- a/src/particles/dsmc/dsmc_init.f90 +++ b/src/particles/dsmc/dsmc_init.f90 @@ -68,6 +68,9 @@ SUBROUTINE DefineParametersDSMC() , 'Define the vibrational relaxation probability upon collision of molecules', '0.004') CALL prms%CreateRealOption( 'Particles-DSMC-ElecRelaxProb'& , 'Define the electronic relaxation probability upon collision of molecules', '0.01') +CALL prms%CreateRealOption( 'Part-Species[$]-ElecRelaxProb' & + ,'Define the electronic relaxation probability upon collision', '999.'& + , numberedmulti=.TRUE.) CALL prms%CreateRealOption( 'Particles-DSMC-GammaQuant'& , 'Set the GammaQuant for zero point energy in Evib (perhaps also Erot) should be'//& ' 0.5 or 0.', '0.5') @@ -758,7 +761,8 @@ SUBROUTINE InitDSMC() ! Setting the values of Rot-/Vib-RelaxProb to a fix value SpecDSMC(iSpec)%RotRelaxProb = DSMC%RotRelaxProb SpecDSMC(iSpec)%VibRelaxProb = DSMC%VibRelaxProb ! 0.004 - SpecDSMC(iSpec)%ElecRelaxProb = DSMC%ElecRelaxProb ! or 0.02 | Bird: somewhere in range 0.01 .. 0.02 + SpecDSMC(iSpec)%ElecRelaxProb= GETREAL('Part-Species'//TRIM(hilf)//'-ElecRelaxProb') + IF(SpecDSMC(iSpec)%ElecRelaxProb.EQ.999.) SpecDSMC(iSpec)%ElecRelaxProb = DSMC%ElecRelaxProb ! or 0.02 | Bird: somewhere in range 0.01 .. 0.02 ! multi init stuff ALLOCATE(SpecDSMC(iSpec)%Init(0:Species(iSpec)%NumberOfInits)) DO iInit = 1, Species(iSpec)%NumberOfInits From 10955b91ec8a11c04342ad7f73f5960308f75ed0 Mon Sep 17 00:00:00 2001 From: Julian Beyer Date: Thu, 7 Oct 2021 11:24:02 +0200 Subject: [PATCH 017/495] Revert "species-dependent relaxation probabilities for electronic excitation" This reverts commit 109be3340ec2f7e4601f679a72a19bc1aa7794d1. --- src/particles/dsmc/dsmc_init.f90 | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/particles/dsmc/dsmc_init.f90 b/src/particles/dsmc/dsmc_init.f90 index 31c931a90..ae6a2031f 100644 --- a/src/particles/dsmc/dsmc_init.f90 +++ b/src/particles/dsmc/dsmc_init.f90 @@ -68,9 +68,6 @@ SUBROUTINE DefineParametersDSMC() , 'Define the vibrational relaxation probability upon collision of molecules', '0.004') CALL prms%CreateRealOption( 'Particles-DSMC-ElecRelaxProb'& , 'Define the electronic relaxation probability upon collision of molecules', '0.01') -CALL prms%CreateRealOption( 'Part-Species[$]-ElecRelaxProb' & - ,'Define the electronic relaxation probability upon collision', '999.'& - , numberedmulti=.TRUE.) CALL prms%CreateRealOption( 'Particles-DSMC-GammaQuant'& , 'Set the GammaQuant for zero point energy in Evib (perhaps also Erot) should be'//& ' 0.5 or 0.', '0.5') @@ -761,8 +758,7 @@ SUBROUTINE InitDSMC() ! Setting the values of Rot-/Vib-RelaxProb to a fix value SpecDSMC(iSpec)%RotRelaxProb = DSMC%RotRelaxProb SpecDSMC(iSpec)%VibRelaxProb = DSMC%VibRelaxProb ! 0.004 - SpecDSMC(iSpec)%ElecRelaxProb= GETREAL('Part-Species'//TRIM(hilf)//'-ElecRelaxProb') - IF(SpecDSMC(iSpec)%ElecRelaxProb.EQ.999.) SpecDSMC(iSpec)%ElecRelaxProb = DSMC%ElecRelaxProb ! or 0.02 | Bird: somewhere in range 0.01 .. 0.02 + SpecDSMC(iSpec)%ElecRelaxProb = DSMC%ElecRelaxProb ! or 0.02 | Bird: somewhere in range 0.01 .. 0.02 ! multi init stuff ALLOCATE(SpecDSMC(iSpec)%Init(0:Species(iSpec)%NumberOfInits)) DO iInit = 1, Species(iSpec)%NumberOfInits From a3a859aec08ae6a29a7e8d5550152c51a569bcd8 Mon Sep 17 00:00:00 2001 From: Marcel Pfeiffer Date: Sat, 16 Oct 2021 23:34:46 +0200 Subject: [PATCH 018/495] so far, corrected absorption model leads to higher absorption --- .../radiation_solver/radiation_atoms.f90 | 15 +- .../radiation_solver/radiation_init.f90 | 25 +++- .../radiation_solver/radiation_molecules.f90 | 15 +- .../radiation_solver/radiation_vars.f90 | 2 + .../radiative_transfer/radtrans_init.f90 | 38 ++++- .../radiative_transfer/radtrans_main.f90 | 136 +++++++++++++++--- .../radiative_transfer/radtrans_output.f90 | 2 +- .../radiative_transfer/radtrans_vars.f90 | 4 + 8 files changed, 199 insertions(+), 38 deletions(-) diff --git a/src/radiation/radiation_solver/radiation_atoms.f90 b/src/radiation/radiation_solver/radiation_atoms.f90 index 5a109e07e..c2b7415e9 100644 --- a/src/radiation/radiation_solver/radiation_atoms.f90 +++ b/src/radiation/radiation_solver/radiation_atoms.f90 @@ -65,7 +65,7 @@ SUBROUTINE radiation_atoms(iElem, em_atom) REAL :: c_emi, c_abs, c_dopp REAL :: rho, ntot !in ini REAL :: sigma_ij, coll_freq_ij, T_mean - INTEGER :: i, k, l, iSpec, jSpec, iWave!, hilf, w + INTEGER :: i, k, l, iSpec, jSpec, iWave, iWaveCoarse!, hilf, w INTEGER :: nLines_considered !number of calculated transition lines REAL :: etot, abstot REAL, ALLOCATABLE :: epsilon_at(:), epsilon_iSpec(:), abs_iSpec(:) @@ -275,7 +275,9 @@ SUBROUTINE radiation_atoms(iElem, em_atom) END DO DO iWave = 1, RadiationParameter%WaveLenDiscr - Radiation_Emission_spec(iWave,iElem) = Radiation_Emission_spec(iWave,iElem) + epsilon_at(iWave) + iWaveCoarse = INT((iWave-1)/RadiationParameter%WaveLenReductionFactor) + 1 + IF (iWaveCoarse.GT.RadiationParameter%WaveLenDiscrCoarse) iWaveCoarse = RadiationParameter%WaveLenDiscrCoarse + Radiation_Emission_spec(iWaveCoarse,iElem) = Radiation_Emission_spec(iWaveCoarse,iElem) + epsilon_at(iWave)/RadiationParameter%WaveLenReductionFactor END DO ! --- add contribution to total emission @@ -312,7 +314,7 @@ SUBROUTINE Radiation_Atomic_Transition_Line_Profile(Radiation_Profile, wavelengt ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES - INTEGER :: startwavelength_int, endwavelength_int, i + INTEGER :: startwavelength_int, endwavelength_int, i, iWaveCoarse, iWave LOGICAL :: add_radline !=================================================================================================================================== ! --- determination of indices for first and last entry of Voigt-profiles on wavelength axis @@ -348,8 +350,11 @@ SUBROUTINE Radiation_Atomic_Transition_Line_Profile(Radiation_Profile, wavelengt = epsilon_mol(startwavelength_int+i) + MAX(0.0,eps) * Radiation_Profile(startwavelength_int+i) abs_iSpec(startwavelength_int+i) & = abs_iSpec(startwavelength_int+i)+MAX(0.0,abstot)*Radiation_Profile(startwavelength_int+i) - Radiation_Absorption_spec(startwavelength_int+i,iElem) & - = Radiation_Absorption_spec(startwavelength_int+i,iElem)+MAX(0.0,abstot)*Radiation_Profile(startwavelength_int+i) + iWave = startwavelength_int+i + iWaveCoarse = INT((iWave-1)/RadiationParameter%WaveLenReductionFactor) + 1 + IF (iWaveCoarse.GT.RadiationParameter%WaveLenDiscrCoarse) iWaveCoarse = RadiationParameter%WaveLenDiscrCoarse + Radiation_Absorption_spec(iWaveCoarse,iElem) & + = Radiation_Absorption_spec(iWaveCoarse,iElem)+MAX(0.0,abstot)*Radiation_Profile(iWave)/RadiationParameter%WaveLenReductionFactor END DO END IF diff --git a/src/radiation/radiation_solver/radiation_init.f90 b/src/radiation/radiation_solver/radiation_init.f90 index e4b1fd3d8..5e861657e 100644 --- a/src/radiation/radiation_solver/radiation_init.f90 +++ b/src/radiation/radiation_solver/radiation_init.f90 @@ -69,6 +69,7 @@ SUBROUTINE DefineParametersRadiation() CALL prms%CreateRealOption( 'Radiation-MinWaveLen', 'Lower wavelength limit for radiation calculation', '0.0') CALL prms%CreateRealOption( 'Radiation-MaxWaveLen', 'Upper wavelength limit for radiation calculation','1000.0') CALL prms%CreateIntOption( 'Radiation-WaveLenDiscr', 'Number of discretization points', '10000') +CALL prms%CreateIntOption( 'Radiation-WaveLenReductionFactor', 'Number of discretization points', '1') CALL prms%CreateIntOption( 'Radiation-RadType', 'Select radiation type:\n'//& '1: particle radiation\n'//& '2: black body radiation\n'//& @@ -161,6 +162,16 @@ SUBROUTINE InitRadiation() RadiationParameter%MaxWaveLen = GETREAL('Radiation-MaxWaveLen','1000.0') RadiationParameter%MaxWaveLen = RadiationParameter%MaxWaveLen*1.E-9 RadiationParameter%WaveLenDiscr = GETINT('Radiation-WaveLenDiscr','10000') +RadiationParameter%WaveLenReductionFactor = GETINT('Radiation-WaveLenReductionFactor') +IF((RadiationSwitches%RadType.EQ.3) .AND. (nGlobalElems.EQ.1)) RadiationParameter%WaveLenReductionFactor = 1 +IF(RadiationSwitches%RadType.EQ.2) RadiationParameter%WaveLenReductionFactor = 1 +IF (RadiationParameter%WaveLenReductionFactor.NE.1) THEN + RadiationParameter%WaveLenDiscrCoarse = NINT(REAL(RadiationParameter%WaveLenDiscr)/ REAL(RadiationParameter%WaveLenReductionFactor)) + RadiationParameter%WaveLenReductionFactor = INT(RadiationParameter%WaveLenDiscr/RadiationParameter%WaveLenDiscrCoarse) + SWRITE(UNIT_stdOut,'(A)') 'Corrected WaveLenReductionFactor is ', RadiationParameter%WaveLenReductionFactor +ELSE + RadiationParameter%WaveLenDiscrCoarse = RadiationParameter%WaveLenDiscr +END IF IF(RadiationParameter%MinWaveLen.GE.RadiationParameter%MaxWaveLen) THEN CALL abort(& __STAMP__& @@ -194,20 +205,20 @@ SUBROUTINE InitRadiation() #if USE_MPI ! allocate shared array for Radiation_Emission/Absorption_Spec -CALL Allocate_Shared((/RadiationParameter%WaveLenDiscr,nComputeNodeElems/), Radiation_Emission_Spec_Shared_Win,Radiation_Emission_Spec_Shared) +CALL Allocate_Shared((/RadiationParameter%WaveLenDiscrCoarse,nComputeNodeElems/), Radiation_Emission_Spec_Shared_Win,Radiation_Emission_Spec_Shared) CALL MPI_WIN_LOCK_ALL(0,Radiation_Emission_Spec_Shared_Win,IERROR) -CALL Allocate_Shared_Test((/INT(RadiationParameter%WaveLenDiscr,IK)*INT(nGlobalElems,IK)/),Radiation_Absorption_Spec_Shared_Win,Radiation_Absorption_Spec_Shared) +CALL Allocate_Shared_Test((/INT(RadiationParameter%WaveLenDiscrCoarse,IK)*INT(nGlobalElems,IK)/),Radiation_Absorption_Spec_Shared_Win,Radiation_Absorption_Spec_Shared) CALL MPI_WIN_LOCK_ALL(0,Radiation_Absorption_Spec_Shared_Win,IERROR) CALL Allocate_Shared((/nSpecies,nComputeNodeElems,2/), Radiation_ElemEnergy_Species_Shared_Win,Radiation_ElemEnergy_Species_Shared) CALL MPI_WIN_LOCK_ALL(0,Radiation_ElemEnergy_Species_Shared_Win,IERROR) Radiation_Emission_spec => Radiation_Emission_spec_Shared -Radiation_Absorption_spec(1:RadiationParameter%WaveLenDiscr ,1:nGlobalElems) => Radiation_Absorption_spec_Shared +Radiation_Absorption_spec(1:RadiationParameter%WaveLenDiscrCoarse ,1:nGlobalElems) => Radiation_Absorption_spec_Shared Radiation_ElemEnergy_Species => Radiation_ElemEnergy_Species_Shared #else ! allocate local array for ElemInfo -ALLOCATE(Radiation_Emission_spec(RadiationParameter%WaveLenDiscr,nElems)) -ALLOCATE(Radiation_Absorption_spec(RadiationParameter%WaveLenDiscr,nElems)) +ALLOCATE(Radiation_Emission_spec(RadiationParameter%WaveLenDiscrCoarse,nElems)) +ALLOCATE(Radiation_Absorption_spec(RadiationParameter%WaveLenDiscrCoarse,nElems)) ALLOCATE(Radiation_ElemEnergy_Species(nSpecies,nElems,2)) #endif /*USE_MPI*/ @@ -234,8 +245,8 @@ SUBROUTINE InitRadiation() , 0 & , MPI_DATATYPE_NULL & , Radiation_Absorption_Spec_Shared & - , RadiationParameter%WaveLenDiscr *recvcountElem & - , RadiationParameter%WaveLenDiscr *displsElem & + , RadiationParameter%WaveLenDiscrCoarse *recvcountElem & + , RadiationParameter%WaveLenDiscrCoarse *displsElem & , MPI_DOUBLE_PRECISION & , MPI_COMM_LEADERS_SHARED & , IERROR) diff --git a/src/radiation/radiation_solver/radiation_molecules.f90 b/src/radiation/radiation_solver/radiation_molecules.f90 index 7f163c224..b981d91be 100644 --- a/src/radiation/radiation_solver/radiation_molecules.f90 +++ b/src/radiation/radiation_solver/radiation_molecules.f90 @@ -60,7 +60,7 @@ SUBROUTINE radiation_molecules(iElem, em_mol) !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES - INTEGER :: iSpec, iWave, iBand, iTrans, i!, hilf + INTEGER :: iSpec, iWave, iBand, iTrans, i, iWaveCoarse!, hilf REAL :: rho, ptot !in ini !density [kg/m**3], pressure [Pa], number density REAL, ALLOCATABLE :: epsilon_mol(:), epsilon_iSpec(:), abs_iSpec(:) INTEGER :: istart, iend @@ -1005,7 +1005,9 @@ SUBROUTINE radiation_molecules(iElem, em_mol) END DO DO iWave = 1, RadiationParameter%WaveLenDiscr - Radiation_Emission_spec(iWave,iElem) = Radiation_Emission_spec(iWave,iElem) + epsilon_mol(iWave) + iWaveCoarse = INT((iWave-1)/RadiationParameter%WaveLenReductionFactor) + 1 + IF (iWaveCoarse.GT.RadiationParameter%WaveLenDiscrCoarse) iWaveCoarse = RadiationParameter%WaveLenDiscrCoarse + Radiation_Emission_spec(iWaveCoarse,iElem) = Radiation_Emission_spec(iWaveCoarse,iElem) + epsilon_mol(iWave)/RadiationParameter%WaveLenReductionFactor END DO ! --- add contribution to total emission @@ -1093,7 +1095,7 @@ SUBROUTINE Radiation_Molecular_Transition_Line_Profile(Radiation_Profile, nubar, ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES - INTEGER :: startwavelength_int, endwavelength_int, i + INTEGER :: startwavelength_int, endwavelength_int, i, iWave, iWaveCoarse LOGICAL :: add_radline !=================================================================================================================================== @@ -1130,8 +1132,11 @@ SUBROUTINE Radiation_Molecular_Transition_Line_Profile(Radiation_Profile, nubar, = epsilon_mol(startwavelength_int+i) + MAX(0.0,eps)/1.E10 * Radiation_Profile(startwavelength_int+i) abs_iSpec(startwavelength_int+i) & = abs_iSpec(startwavelength_int+i)+MAX(0.0,abstot)/1.E10*Radiation_Profile(startwavelength_int+i) - Radiation_Absorption_spec(startwavelength_int+i,iElem) & - = Radiation_Absorption_spec(startwavelength_int+i,iElem)+MAX(0.0,abstot)/1.E10*Radiation_Profile(startwavelength_int+i) + iWave = startwavelength_int+i + iWaveCoarse = INT((iWave-1)/RadiationParameter%WaveLenReductionFactor) + 1 + IF (iWaveCoarse.GT.RadiationParameter%WaveLenDiscrCoarse) iWaveCoarse = RadiationParameter%WaveLenDiscrCoarse + Radiation_Absorption_spec(iWaveCoarse,iElem) & + = Radiation_Absorption_spec(iWaveCoarse,iElem)+MAX(0.0,abstot)/1.E10*Radiation_Profile(iWave)/RadiationParameter%WaveLenReductionFactor END DO END IF diff --git a/src/radiation/radiation_solver/radiation_vars.f90 b/src/radiation/radiation_solver/radiation_vars.f90 index dd0e698e7..c127c6cf8 100644 --- a/src/radiation/radiation_solver/radiation_vars.f90 +++ b/src/radiation/radiation_solver/radiation_vars.f90 @@ -46,6 +46,8 @@ MODULE MOD_Radiation_Vars REAL :: MinWaveLen ! minimum spectral wavelength REAL :: MaxWaveLen ! maximum spectral wavelength INTEGER :: WaveLenDiscr ! number of points in calculated spectrum + INTEGER :: WaveLenDiscrCoarse ! number of points in calculated spectrum + INTEGER :: WaveLenReductionFactor REAL :: WaveLenIncr ! wavelength increments REAL, ALLOCATABLE :: WaveLen(:) ! wavelength array END TYPE tRadiationParameter diff --git a/src/radiation/radiative_transfer/radtrans_init.f90 b/src/radiation/radiative_transfer/radtrans_init.f90 index c82202cae..5af7357b8 100644 --- a/src/radiation/radiative_transfer/radtrans_init.f90 +++ b/src/radiation/radiative_transfer/radtrans_init.f90 @@ -49,6 +49,7 @@ SUBROUTINE DefineParametersRadiationTrans() CALL prms%CreateIntOption( 'Radiation-NumPhotonsPerCell', 'HM','1') CALL prms%CreateIntOption( 'Radiation-AbsorptionModel', 'HM','1') CALL prms%CreateIntOption( 'Radiation-PhotonPosModel', 'HM','1') +CALL prms%CreateIntOption( 'Radiation-PhotonWaveLengthModel', 'HM','1') END SUBROUTINE DefineParametersRadiationTrans @@ -98,6 +99,7 @@ SUBROUTINE InitRadiationTransport() RadTrans%NumPhotonsPerCell = GETINT('Radiation-NumPhotonsPerCell','1') RadiationAbsorptionModel = GETINT('Radiation-AbsorptionModel','1') RadiationPhotonPosModel = GETINT('Radiation-PhotonPosModel','1') +RadiationPhotonWaveLengthModel = GETINT('Radiation-PhotonWaveLengthModel') RadEmiAdaptPhotonNum = GETLOGICAL('Radiation-AdaptivePhotonNumEmission','.FALSE.') IF(Symmetry%Order.EQ.2) CALL BuildMesh2DInfo() @@ -123,6 +125,17 @@ SUBROUTINE InitRadiationTransport() END IF CALL BARRIER_AND_SYNC(RadTransPhotPerCell_Shared_Win ,MPI_COMM_SHARED) CALL BARRIER_AND_SYNC(Radiation_Emission_Spec_Total_Shared_Win ,MPI_COMM_SHARED) + +IF (RadiationPhotonWaveLengthModel.EQ.1) THEN + CALL Allocate_Shared((/nComputeNodeElems/), Radiation_Emission_Spec_Max_Shared_Win,Radiation_Emission_Spec_Max_Shared) + CALL MPI_WIN_LOCK_ALL(0,Radiation_Emission_Spec_Max_Shared_Win,IERROR) + Radiation_Emission_Spec_Max => Radiation_Emission_Spec_Max_Shared + IF (myComputeNodeRank.EQ.0) THEN + Radiation_Emission_Spec_Max = 0.0 + END IF + CALL BARRIER_AND_SYNC(Radiation_Emission_Spec_Max_Shared_Win ,MPI_COMM_SHARED) +END IF + ALLOCATE(RadTransPhotPerCellLoc(nComputeNodeElems)) RadTransPhotPerCellLoc = 0 #else @@ -131,6 +144,10 @@ SUBROUTINE InitRadiationTransport() RadTransPhotPerCell = 0 RadTransPhotPerCellLoc = 0 Radiation_Emission_Spec_Total=0.0 +IF (RadiationPhotonWaveLengthModel.EQ.1) THEN + ALLOCATE(Radiation_Emission_Spec_Max(nElems)) + Radiation_Emission_Spec_Max=0.0 +END IF #endif /*USE_MPI*/ @@ -148,10 +165,20 @@ SUBROUTINE InitRadiationTransport() DO iElem = firstElem, lastElem IF(MPIroot.AND.(MOD(iElem,ElemDisp).EQ.0)) CALL PrintStatusLineRadiation(REAL(iElem),REAL(firstElem),REAL(lastElem),.FALSE.) CALL radiation_main(iElem) - DO iWave = 1, RadiationParameter%WaveLenDiscr + DO iWave = 1, RadiationParameter%WaveLenDiscrCoarse Radiation_Emission_Spec_Total(iElem) = Radiation_Emission_Spec_Total(iElem) & - + 4.*Pi*Radiation_Emission_Spec(iWave, iElem) * RadiationParameter%WaveLenIncr + + 4.*Pi*Radiation_Emission_Spec(iWave, iElem) * RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor + IF (RadiationPhotonWaveLengthModel.EQ.1) Radiation_Emission_Spec_Max(iElem) = MAX(Radiation_Emission_Spec_Max(iElem), & + 4.*Pi*Radiation_Emission_Spec(iWave, iElem) * RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor) END DO + IF (RadiationParameter%WaveLenReductionFactor.GT.1) THEN + IF (MOD(RadiationParameter%WaveLenDiscr,RadiationParameter%WaveLenDiscrCoarse).NE.0) THEN + Radiation_Emission_Spec_Total(iElem) = Radiation_Emission_Spec_Total(iElem) & + + 4.*Pi*Radiation_Emission_Spec(RadiationParameter%WaveLenDiscrCoarse, iElem) * RadiationParameter%WaveLenIncr + IF (RadiationPhotonWaveLengthModel.EQ.1) Radiation_Emission_Spec_Max(iElem) = MAX(Radiation_Emission_Spec_Max(iElem), & + 4.*Pi*Radiation_Emission_Spec(RadiationParameter%WaveLenDiscrCoarse, iElem) * RadiationParameter%WaveLenIncr*(RadiationParameter%WaveLenReductionFactor+1.)) + END IF + END IF END DO CASE(2) ! Black body radiation @@ -192,6 +219,9 @@ SUBROUTINE InitRadiationTransport() #if USE_MPI + IF (RadiationPhotonWaveLengthModel.EQ.1) THEN + CALL BARRIER_AND_SYNC(Radiation_Emission_Spec_Max_Shared_Win,MPI_COMM_SHARED) + END IF CALL BARRIER_AND_SYNC(Radiation_Emission_Spec_Total_Shared_Win,MPI_COMM_SHARED) CALL BARRIER_AND_SYNC(Radiation_Emission_Spec_Shared_Win ,MPI_COMM_SHARED) CALL BARRIER_AND_SYNC(Radiation_Absorption_Spec_Shared_Win ,MPI_COMM_SHARED) @@ -201,8 +231,8 @@ SUBROUTINE InitRadiationTransport() , 0 & , MPI_DATATYPE_NULL & , Radiation_Absorption_Spec_Shared & - , RadiationParameter%WaveLenDiscr *recvcountElem & - , RadiationParameter%WaveLenDiscr *displsElem & + , RadiationParameter%WaveLenDiscrCoarse *recvcountElem & + , RadiationParameter%WaveLenDiscrCoarse *displsElem & , MPI_DOUBLE_PRECISION & , MPI_COMM_LEADERS_SHARED & , IERROR) diff --git a/src/radiation/radiative_transfer/radtrans_main.f90 b/src/radiation/radiative_transfer/radtrans_main.f90 index 48f80d3ce..031cc3936 100644 --- a/src/radiation/radiative_transfer/radtrans_main.f90 +++ b/src/radiation/radiative_transfer/radtrans_main.f90 @@ -45,7 +45,7 @@ SUBROUTINE RadTrans_main() USE MOD_Particle_Mesh_Vars ,ONLY : GEO, nComputeNodeElems, ElemMidPoint_Shared, ElemVolume_Shared USE MOD_RadiationTrans_Vars ,ONLY : Radiation_Emission_Spec_Total, RadTrans, RadEmiAdaptPhotonNum USE MOD_RadiationTrans_Vars ,ONLY : PhotonProps, RadiationDirectionModel, RadTransPhotPerCellLoc -USE MOD_RadiationTrans_Vars ,ONLY : RadTransPhotPerCell, RadTransPhotPerCell_Shared_Win +USE MOD_RadiationTrans_Vars ,ONLY : RadTransPhotPerCell, RadTransPhotPerCell_Shared_Win, RadiationPhotonWaveLengthModel USE MOD_Photon_Tracking ,ONLY : PhotonTriaTracking, Photon2DSymTracking USE MOD_Radiation_Vars ,ONLY : RadiationSwitches USE MOD_DSMC_Vars ,ONLY : RadialWeighting @@ -158,7 +158,11 @@ SUBROUTINE RadTrans_main() iPhotLoc = iPhot END IF PhotonProps%PhotonDirection(1:3) = SetPhotonStartDirection(iElem, iPhotLoc, RandRot) - PhotonProps%WaveLength = SetParticleWavelength(iElem) + IF (RadiationPhotonWaveLengthModel.EQ.1) THEN + PhotonProps%WaveLength = SetParticleWavelengthAR(iElem) + ELSE + PhotonProps%WaveLength = SetParticleWavelengthBiSec(iElem) + END IF IF(Symmetry%Axisymmetric) THEN CALL Photon2DSymTracking() ELSE @@ -340,14 +344,14 @@ FUNCTION RandomRotMatrix() END FUNCTION RandomRotMatrix -FUNCTION SetParticleWavelength(iElem) +FUNCTION SetParticleWavelengthAR(iElem) !=================================================================================================================================== ! modified particle emmission for LD case !=================================================================================================================================== ! MODULES USE MOD_Globals USE MOD_Globals_Vars, ONLY : Pi -USE MOD_RadiationTrans_Vars, ONLY : Radiation_Emission_Spec_Total +USE MOD_RadiationTrans_Vars, ONLY : Radiation_Emission_Spec_Max USE MOD_Radiation_Vars, ONLY: Radiation_Emission_spec, RadiationParameter ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -358,7 +362,7 @@ FUNCTION SetParticleWavelength(iElem) ! INOUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES -INTEGER :: SetParticleWavelength +INTEGER :: SetParticleWavelengthAR !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES INTEGER :: iWaveLength, iWave @@ -366,23 +370,123 @@ FUNCTION SetParticleWavelength(iElem) !=================================================================================================================================== CALL RANDOM_NUMBER(iRan) - iWaveLength = INT(RadiationParameter%WaveLenDiscr*iRan) + 1 - iRadPower = 0.0 - DO iWave = 1, iWaveLength - iRadPower = iRadPower + 4.*Pi*Radiation_Emission_Spec(iWave,iElem)*RadiationParameter%WaveLenIncr + iWaveLength = INT(RadiationParameter%WaveLenDiscrCoarse*iRan) + 1 + IF ((RadiationParameter%WaveLenReductionFactor.GT.1).AND.(iWaveLength.EQ.RadiationParameter%WaveLenDiscrCoarse)) THEN + IF (MOD(RadiationParameter%WaveLenDiscr,RadiationParameter%WaveLenDiscrCoarse).NE.0) THEN + iRadPower = 4.*Pi*Radiation_Emission_Spec(RadiationParameter%WaveLenDiscrCoarse, iElem) * RadiationParameter%WaveLenIncr & + * (1.+RadiationParameter%WaveLenReductionFactor) + ELSE + iRadPower = 4.*Pi*Radiation_Emission_Spec(iWaveLength,iElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor + END IF + ELSE + iRadPower = 4.*Pi*Radiation_Emission_Spec(iWaveLength,iElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor + END IF + CALL RANDOM_NUMBER(iRan) + DO WHILE (iRan.GT.(iRadPower/Radiation_Emission_Spec_Max(iElem))) + CALL RANDOM_NUMBER(iRan) + iWaveLength = INT(RadiationParameter%WaveLenDiscrCoarse*iRan) + 1 + IF ((RadiationParameter%WaveLenReductionFactor.GT.1).AND.(iWaveLength.EQ.RadiationParameter%WaveLenDiscrCoarse)) THEN + IF (MOD(RadiationParameter%WaveLenDiscr,RadiationParameter%WaveLenDiscrCoarse).NE.0) THEN + iRadPower = 4.*Pi*Radiation_Emission_Spec(RadiationParameter%WaveLenDiscrCoarse, iElem) * RadiationParameter%WaveLenIncr & + * (1.+RadiationParameter%WaveLenReductionFactor) + ELSE + iRadPower = 4.*Pi*Radiation_Emission_Spec(iWaveLength,iElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor + END IF + ELSE + iRadPower = 4.*Pi*Radiation_Emission_Spec(iWaveLength,iElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor + END IF + CALL RANDOM_NUMBER(iRan) END DO + SetParticleWavelengthAR = iWaveLength + +END FUNCTION SetParticleWavelengthAR + + +FUNCTION SetParticleWavelengthBiSec(iElem) +!=================================================================================================================================== +! modified particle emmission for LD case +!=================================================================================================================================== +! MODULES +USE MOD_Globals +USE MOD_Globals_Vars, ONLY : Pi +USE MOD_RadiationTrans_Vars, ONLY : Radiation_Emission_Spec_Total +USE MOD_Radiation_Vars, ONLY: Radiation_Emission_spec, RadiationParameter +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES +INTEGER, INTENT(IN) :: iElem +!----------------------------------------------------------------------------------------------------------------------------------- +! INOUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +INTEGER :: SetParticleWavelengthBiSec +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +INTEGER :: iWaveLength, iWave, iWaveOld, iWaveMin, iWaveMax +REAL :: iRan, iRadPower, iRadPower2 +!=================================================================================================================================== + CALL RANDOM_NUMBER(iRan) - DO WHILE (iRan.GT.(iRadPower/Radiation_Emission_Spec_Total(iElem))) - CALL RANDOM_NUMBER(iRan) - iWaveLength = INT(RadiationParameter%WaveLenDiscr*iRan) + 1 + iWaveOld = 1 + iWaveLength = INT(RadiationParameter%WaveLenDiscrCoarse/2) + iWaveMin = 1 + iWaveMax = RadiationParameter%WaveLenDiscrCoarse + IF (iWaveLength.EQ.RadiationParameter%WaveLenDiscrCoarse) THEN + iRadPower = Radiation_Emission_Spec_Total(iElem) + ELSE iRadPower = 0.0 DO iWave = 1, iWaveLength - iRadPower = iRadPower + 4.*Pi*Radiation_Emission_Spec(iWave,iElem)*RadiationParameter%WaveLenIncr + iRadPower = iRadPower + 4.*Pi*Radiation_Emission_Spec(iWave,iElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor END DO - CALL RANDOM_NUMBER(iRan) + END IF + + DO + IF (iRan.GT.(iRadPower/Radiation_Emission_Spec_Total(iElem)))THEN + iWaveMin = iWaveLength + ELSE + iWaveMax = iWaveLength + END IF + iWaveOld = iWaveLength + iWaveLength = INT((iWaveMax+iWaveMin)/2) + IF (iWaveLength.EQ.RadiationParameter%WaveLenDiscrCoarse) THEN + iRadPower = Radiation_Emission_Spec_Total(iElem) + ELSE + iRadPower = 0.0 + DO iWave = 1, iWaveLength + iRadPower = iRadPower + 4.*Pi*Radiation_Emission_Spec(iWave,iElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor + END DO + END IF + IF (ABS(iWaveOld-iWaveLength).LE.1) EXIT + END DO - SetParticleWavelength = iWaveLength + + iWaveOld = iWaveLength + IF (iRan.LT.(iRadPower/Radiation_Emission_Spec_Total(iElem))) THEN + IF (iWaveLength.EQ.1) THEN + iWaveLength = iWaveLength + ELSE + iWaveLength = iWaveLength - 1 + iRadPower2 = 0.0 + DO iWave = 1, iWaveLength + iRadPower2 = iRadPower2 + 4.*Pi*Radiation_Emission_Spec(iWave,iElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor + END DO + IF (ABS(iRan-(iRadPower/Radiation_Emission_Spec_Total(iElem))).LT.ABS(iRan-(iRadPower2/Radiation_Emission_Spec_Total(iElem)))) THEN + iWaveLength = iWaveOld + END IF + END IF + ELSE + iWaveLength = iWaveLength + 1 + iRadPower2 = 0.0 + DO iWave = 1, iWaveLength + iRadPower2 = iRadPower2 + 4.*Pi*Radiation_Emission_Spec(iWave,iElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor + END DO + IF (ABS(iRan-(iRadPower/Radiation_Emission_Spec_Total(iElem))).LT.ABS(iRan-(iRadPower2/Radiation_Emission_Spec_Total(iElem)))) THEN + iWaveLength = iWaveOld + END IF + END IF + SetParticleWavelengthBiSec = iWaveLength -END FUNCTION SetParticleWavelength +END FUNCTION SetParticleWavelengthBiSec END MODULE MOD_RadTransport diff --git a/src/radiation/radiative_transfer/radtrans_output.f90 b/src/radiation/radiative_transfer/radtrans_output.f90 index 4a8116df4..ca2f49974 100644 --- a/src/radiation/radiative_transfer/radtrans_output.f90 +++ b/src/radiation/radiative_transfer/radtrans_output.f90 @@ -134,7 +134,7 @@ SUBROUTINE WriteRadiationToHDF5() TempOutput(nVarCount+2, iElem) = MAX(tempSpecAbs,0.) !lost energy nVarCount=nVarCount+nVarSpec END DO - TempOutput((nVarSpec*nSpecies+1), iElem) = SUM(Radiation_ElemEnergy_Species(:,CNElemID,1)) + TempOutput((nVarSpec*nSpecies+1), iElem) = Radiation_Emission_Spec_Total(CNElemID) ! SUM(Radiation_ElemEnergy_Species(:,CNElemID,1)) TempOutput((nVarSpec*nSpecies+2), iElem) = RadiationElemAbsEnergy_Shared(iElem+offSetElem)/ ElemVolume_Shared(CNElemID) TempOutput(nVarSpec*nSpecies+3, iElem) = SUM(Radiation_ElemEnergy_Species(:,CNElemID,1))- RadiationElemAbsEnergy_Shared(iElem+offSetElem)/ ElemVolume_Shared(CNElemID) TempOutput(nVarSpec*nSpecies+4, iElem) = RadTransPhotPerCell(CNElemID) diff --git a/src/radiation/radiative_transfer/radtrans_vars.f90 b/src/radiation/radiative_transfer/radtrans_vars.f90 index 13e8d151a..ee3fddb64 100644 --- a/src/radiation/radiative_transfer/radtrans_vars.f90 +++ b/src/radiation/radiative_transfer/radtrans_vars.f90 @@ -49,10 +49,12 @@ MODULE MOD_RadiationTrans_Vars INTEGER :: RadiationAbsorptionModel INTEGER :: RadiationDirectionModel INTEGER :: RadiationPhotonPosModel +INTEGER :: RadiationPhotonWaveLengthModel LOGICAL :: RadEmiAdaptPhotonNum REAL, ALLOCATABLE :: RadiationElemAbsEnergy(:) REAL,ALLOCPOINT :: Radiation_Emission_Spec_Total(:) +REAL,ALLOCPOINT :: Radiation_Emission_Spec_Max(:) INTEGER,ALLOCPOINT :: RadTransPhotPerCell(:) ! (WaveLen(:), number of mesh elements) INTEGER, ALLOCATABLE :: RadTransPhotPerCellLoc(:) REAL, ALLOCATABLE :: PhotonSampWall(:,:) @@ -61,6 +63,8 @@ MODULE MOD_RadiationTrans_Vars INTEGER,ALLOCPOINT :: RadTransPhotPerCell_Shared(:) INTEGER :: Radiation_Emission_Spec_Total_Shared_Win REAL,ALLOCPOINT :: Radiation_Emission_Spec_Total_Shared(:) +INTEGER :: Radiation_Emission_Spec_Max_Shared_Win +REAL,ALLOCPOINT :: Radiation_Emission_Spec_Max_Shared(:) INTEGER :: PhotonSampWall_Shared_Win REAL,POINTER :: PhotonSampWall_Shared(:,:) INTEGER :: RadiationElemAbsEnergy_Shared_Win From 31086e7f2a0105c77dcc92d9bf0d68f6c159ea39 Mon Sep 17 00:00:00 2001 From: Julian Beyer Date: Tue, 26 Oct 2021 16:30:34 +0200 Subject: [PATCH 019/495] Ability to post-process DSMC results without electronic excitation. For atoms T_e,iSpec=T_electrons, for molecules T_e,iSpec=sqrt(T_electrons*T_vib,iSpec) --- .../radiation_solver/radiation_init.f90 | 69 ++++++++++++------- .../radiation_solver/radiation_vars.f90 | 1 + 2 files changed, 47 insertions(+), 23 deletions(-) diff --git a/src/radiation/radiation_solver/radiation_init.f90 b/src/radiation/radiation_solver/radiation_init.f90 index 5e861657e..fe1f7a778 100644 --- a/src/radiation/radiation_solver/radiation_init.f90 +++ b/src/radiation/radiation_solver/radiation_init.f90 @@ -66,7 +66,7 @@ SUBROUTINE DefineParametersRadiation() CALL prms%CreateIntOption( 'Part-Species[$]-NuclCharge', 'Nuclear charge:\n'//& '1: neutral atom\n'//& '2: singly ionized atom', '1', numberedmulti=.TRUE.) -CALL prms%CreateRealOption( 'Radiation-MinWaveLen', 'Lower wavelength limit for radiation calculation', '0.0') +CALL prms%CreateRealOption( 'Radiation-MinWaveLen', 'Lower wavelength limit for radiation calculation', '100.0') CALL prms%CreateRealOption( 'Radiation-MaxWaveLen', 'Upper wavelength limit for radiation calculation','1000.0') CALL prms%CreateIntOption( 'Radiation-WaveLenDiscr', 'Number of discretization points', '10000') CALL prms%CreateIntOption( 'Radiation-WaveLenReductionFactor', 'Number of discretization points', '1') @@ -79,6 +79,8 @@ SUBROUTINE DefineParametersRadiation() CALL prms%CreateLogicalOption('Radiation-bb-atoms', 'Enable atomic bound-bound radiation', '.FALSE.') CALL prms%CreateLogicalOption('Radiation-bb-molecules', 'Enable molecular bound-bound radiation', '.FALSE.') CALL prms%CreateLogicalOption('Radiation-MacroRadInput', 'Reading in flow field data as radiation input', '.FALSE.') +CALL prms%CreateLogicalOption('Radiation-UseElectronicExcitation', 'Use el. excitation to populate upper state densitites', & + '.TRUE.') CALL prms%CreateRealOption( 'Radiation-NumDensElectrons', 'Electron number density, 1/cm3', '0.0') CALL prms%CreateRealOption( 'Radiation-TElectrons', 'Electron temperature, K', '0.0') CALL prms%CreateStringOption( 'Radiation-Species[$]-SpectraFileName', 'File name of data file', 'none', numberedmulti=.TRUE.) @@ -131,24 +133,24 @@ SUBROUTINE InitRadiation() IF (RadiationSwitches%RadType.NE.2) THEN DO iSpec = 1, nSpecies WRITE(UNIT=hilf,FMT='(I0)') iSpec - RadiationInput(iSpec)%Ttrans(4) = GETREAL('Part-Species'//TRIM(hilf)//'-RadiationTtrans','0.0') - RadiationInput(iSpec)%Telec = GETREAL('Part-Species'//TRIM(hilf)//'-RadiationTelec','0.0') - RadiationInput(iSpec)%NumDens = GETREAL('Part-Species'//TRIM(hilf)//'-RadiationNumDens','0.0') + RadiationInput(iSpec)%Ttrans(4) = GETREAL('Part-Species'//TRIM(hilf)//'-RadiationTtrans') + RadiationInput(iSpec)%Telec = GETREAL('Part-Species'//TRIM(hilf)//'-RadiationTelec') + RadiationInput(iSpec)%NumDens = GETREAL('Part-Species'//TRIM(hilf)//'-RadiationNumDens') IF(SpecDSMC(iSpec)%InterID.EQ.2) THEN - RadiationInput(iSpec)%Tvib = GETREAL('Part-Species'//TRIM(hilf)//'-RadiationTvib','0.0') - RadiationInput(iSpec)%Trot = GETREAL('Part-Species'//TRIM(hilf)//'-RadiationTrot','0.0') + RadiationInput(iSpec)%Tvib = GETREAL('Part-Species'//TRIM(hilf)//'-RadiationTvib') + RadiationInput(iSpec)%Trot = GETREAL('Part-Species'//TRIM(hilf)//'-RadiationTrot') END IF - RadiationInput(iSpec)%IonizationEn = GETREAL('Part-Species'//TRIM(hilf)//'-RadiationIonizationEn','0.0') + RadiationInput(iSpec)%IonizationEn = GETREAL('Part-Species'//TRIM(hilf)//'-RadiationIonizationEn') RadiationInput(iSpec)%IonizationEn = RadiationInput(iSpec)%IonizationEn *PlanckConst*c*100. - RadiationInput(iSpec)%Mass = GETREAL('Part-Species'//TRIM(hilf)//'-RadiationMass_u','0.0') + RadiationInput(iSpec)%Mass = GETREAL('Part-Species'//TRIM(hilf)//'-RadiationMass_u') RadiationInput(iSpec)%Mass = RadiationInput(iSpec)%Mass*1.660539040E-27 IF((SpecDSMC(iSpec)%InterID .EQ. 1) .OR. (SpecDSMC(iSpec)%InterID .EQ. 10)) THEN !Only for atoms (1) and atomic ions (10) CALL Radiation_readin_atoms(iSpec) - RadiationInput(iSpec)%Radius = GETREAL('Part-Species'//TRIM(hilf)//'-RadiationRadius_A','0.0') + RadiationInput(iSpec)%Radius = GETREAL('Part-Species'//TRIM(hilf)//'-RadiationRadius_A') RadiationInput(iSpec)%Radius = RadiationInput(iSpec)%Radius *1.0E-10 - RadiationInput(iSpec)%Starkex = GETREAL('Part-Species'//TRIM(hilf)//'-Starkex','0.0') - RadiationInput(iSpec)%NuclCharge = GETINT('Part-Species'//TRIM(hilf)//'-NuclCharge','1') + RadiationInput(iSpec)%Starkex = GETREAL('Part-Species'//TRIM(hilf)//'-Starkex') + RadiationInput(iSpec)%NuclCharge = GETINT('Part-Species'//TRIM(hilf)//'-NuclCharge') END IF IF((SpecDSMC(iSpec)%InterID .EQ. 2) .OR. (SpecDSMC(iSpec)%InterID .EQ. 20)) THEN !Only for molecules (2) and molecular ions (20) @@ -157,11 +159,11 @@ SUBROUTINE InitRadiation() END DO END IF -RadiationParameter%MinWaveLen = GETREAL('Radiation-MinWaveLen','0.0') +RadiationParameter%MinWaveLen = GETREAL('Radiation-MinWaveLen') RadiationParameter%MinWaveLen = RadiationParameter%MinWaveLen*1.E-9 -RadiationParameter%MaxWaveLen = GETREAL('Radiation-MaxWaveLen','1000.0') +RadiationParameter%MaxWaveLen = GETREAL('Radiation-MaxWaveLen') RadiationParameter%MaxWaveLen = RadiationParameter%MaxWaveLen*1.E-9 -RadiationParameter%WaveLenDiscr = GETINT('Radiation-WaveLenDiscr','10000') +RadiationParameter%WaveLenDiscr = GETINT('Radiation-WaveLenDiscr') RadiationParameter%WaveLenReductionFactor = GETINT('Radiation-WaveLenReductionFactor') IF((RadiationSwitches%RadType.EQ.3) .AND. (nGlobalElems.EQ.1)) RadiationParameter%WaveLenReductionFactor = 1 IF(RadiationSwitches%RadType.EQ.2) RadiationParameter%WaveLenReductionFactor = 1 @@ -192,16 +194,17 @@ SUBROUTINE InitRadiation() RadiationParameter%WaveLen(iWaveLen) = RadiationParameter%MinWaveLen + (iWaveLen-1) * RadiationParameter%WaveLenIncr END DO -RadiationSwitches%ff = GETLOGICAL('Radiation-ff', '.FALSE.') -RadiationSwitches%bf = GETLOGICAL('Radiation-bf', '.FALSE.') -RadiationSwitches%bb_at = GETLOGICAL('Radiation-bb-atoms', '.FALSE.') -RadiationSwitches%bb_mol = GETLOGICAL('Radiation-bb-molecules', '.FALSE.') -RadiationSwitches%MacroRadInput = GETLOGICAL('Radiation-MacroRadInput', '.FALSE.') +RadiationSwitches%ff = GETLOGICAL('Radiation-ff') +RadiationSwitches%bf = GETLOGICAL('Radiation-bf') +RadiationSwitches%bb_at = GETLOGICAL('Radiation-bb-atoms') +RadiationSwitches%bb_mol = GETLOGICAL('Radiation-bb-molecules') +RadiationSwitches%MacroRadInput = GETLOGICAL('Radiation-MacroRadInput') +RadiationSwitches%UseElectronicExcitation = GETLOGICAL('Radiation-UseElectronicExcitation') IF (RadiationSwitches%MacroRadInput) CALL MacroscopicRadiationInput() -NumDensElectrons = GETREAL('Radiation-NumDensElectrons','0.0') -TElectrons = GETREAL('Radiation-TElectrons', '0.0') +NumDensElectrons = GETREAL('Radiation-NumDensElectrons') +TElectrons = GETREAL('Radiation-TElectrons') #if USE_MPI ! allocate shared array for Radiation_Emission/Absorption_Spec @@ -273,7 +276,9 @@ SUBROUTINE MacroscopicRadiationInput() USE MOD_HDF5_Input ,ONLY: OpenDataFile,CloseDataFile,DatasetExists,ReadArray,GetDataProps USE MOD_Mesh_Vars ,ONLY: offsetElem, nElems USE MOD_Particle_Vars ,ONLY: nSpecies - USE MOD_Radiation_Vars ,ONLY: MacroRadInputParameters, MacroRadInputParameters_Shared, MacroRadInputParameters_Shared_Win + USE MOD_DSMC_Vars ,ONLY: SpecDSMC + USE MOD_Radiation_Vars ,ONLY: RadiationSwitches, MacroRadInputParameters, MacroRadInputParameters_Shared, & + MacroRadInputParameters_Shared_Win USE MOD_Mesh_Tools ,ONLY: GetCNElemID USE MOD_ReadInTools USE MOD_Particle_Mesh_Vars ,ONLY: nComputeNodeElems @@ -292,7 +297,7 @@ SUBROUTINE MacroscopicRadiationInput() ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES - INTEGER :: nVar_HDF5, N_HDF5, nElems_HDF5, iVar, iSpec, iElem, CNElemID + INTEGER :: nVar_HDF5, N_HDF5, nElems_HDF5, iVar, iSpec, iElem, CNElemID, IndexElectronTemp, iSpecElectrons REAL, ALLOCATABLE :: ElemData_HDF5(:,:) CHARACTER(LEN=300) :: MacroRadiationInputFile ! INTEGER, ALLOCATABLE :: SortElemInd(:) !Laux @@ -364,6 +369,24 @@ SUBROUTINE MacroscopicRadiationInput() iVar = iVar + DSMC_NVARS END DO + IF(.NOT.RadiationSwitches%UseElectronicExcitation) THEN + iSpecElectrons = 11 + IndexElectronTemp = (iSpecElectrons-1)*DSMC_NVARS+1 + 11 !132 for 11th Species + DO iSpec = 1, nSpecies + DO iElem = 1, nElems + CNElemID = GetCNElemID(iElem+offsetElem) + IF((SpecDSMC(iSpec)%InterID .EQ. 1) .OR. (SpecDSMC(iSpec)%InterID .EQ. 10)) THEN + MacroRadInputParameters(CNElemID,iSpec,4) = MAX(0.,ElemData_HDF5(IndexElectronTemp,iElem)) + ELSEIF((SpecDSMC(iSpec)%InterID .EQ. 2) .OR. (SpecDSMC(iSpec)%InterID .EQ. 20)) THEN + MacroRadInputParameters(CNElemID,iSpec,4) = SQRT(MacroRadInputParameters(CNElemID,iSpec,2) & + * MAX(0.,ElemData_HDF5(IndexElectronTemp,iElem))) + ELSE + print*, "excitation temperature cannot be matched, unknown InterID for species", iSpec + END IF + END DO + END DO + END IF + #if USE_MPI CALL BARRIER_AND_SYNC(MacroRadInputParameters_Shared_Win ,MPI_COMM_SHARED) #endif diff --git a/src/radiation/radiation_solver/radiation_vars.f90 b/src/radiation/radiation_solver/radiation_vars.f90 index c127c6cf8..344bcebb1 100644 --- a/src/radiation/radiation_solver/radiation_vars.f90 +++ b/src/radiation/radiation_solver/radiation_vars.f90 @@ -61,6 +61,7 @@ MODULE MOD_Radiation_Vars LOGICAL :: bb_at ! Switch for atomic line radiation LOGICAL :: bb_mol ! Switch for molecular band radiation LOGICAL :: MacroRadInput ! Switch for input of DSMC files + LOGICAL :: UseElectronicExcitation ! Switch for using electronic excitation energies (t) OR T_electron for atoms and sqrt(T_vib*T_electron) for molecules (f) END TYPE tRadiationSwitches TYPE(tRadiationSwitches) :: RadiationSwitches From 0c6b7efd80df145825f6c162ef5aa386d60528e3 Mon Sep 17 00:00:00 2001 From: Julian Beyer Date: Thu, 28 Oct 2021 11:42:26 +0200 Subject: [PATCH 020/495] current version --- src/radiation/radiation_solver/radiation_init.f90 | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/radiation/radiation_solver/radiation_init.f90 b/src/radiation/radiation_solver/radiation_init.f90 index fe1f7a778..6eedc4ffe 100644 --- a/src/radiation/radiation_solver/radiation_init.f90 +++ b/src/radiation/radiation_solver/radiation_init.f90 @@ -375,14 +375,20 @@ SUBROUTINE MacroscopicRadiationInput() DO iSpec = 1, nSpecies DO iElem = 1, nElems CNElemID = GetCNElemID(iElem+offsetElem) - IF((SpecDSMC(iSpec)%InterID .EQ. 1) .OR. (SpecDSMC(iSpec)%InterID .EQ. 10)) THEN + IF((SpecDSMC(iSpec)%InterID .EQ. 1) .OR. (SpecDSMC(iSpec)%InterID .EQ. 10) .OR. & + (SpecDSMC(iSpec)%InterID .EQ. 2) .OR. (SpecDSMC(iSpec)%InterID .EQ. 20)) THEN MacroRadInputParameters(CNElemID,iSpec,4) = MAX(0.,ElemData_HDF5(IndexElectronTemp,iElem)) - ELSEIF((SpecDSMC(iSpec)%InterID .EQ. 2) .OR. (SpecDSMC(iSpec)%InterID .EQ. 20)) THEN - MacroRadInputParameters(CNElemID,iSpec,4) = SQRT(MacroRadInputParameters(CNElemID,iSpec,2) & - * MAX(0.,ElemData_HDF5(IndexElectronTemp,iElem))) ELSE print*, "excitation temperature cannot be matched, unknown InterID for species", iSpec END IF +! IF((SpecDSMC(iSpec)%InterID .EQ. 1) .OR. (SpecDSMC(iSpec)%InterID .EQ. 10)) THEN +! MacroRadInputParameters(CNElemID,iSpec,4) = MAX(0.,ElemData_HDF5(IndexElectronTemp,iElem)) +! ELSEIF((SpecDSMC(iSpec)%InterID .EQ. 2) .OR. (SpecDSMC(iSpec)%InterID .EQ. 20)) THEN +! MacroRadInputParameters(CNElemID,iSpec,4) = SQRT(MacroRadInputParameters(CNElemID,iSpec,2) & +! * MAX(0.,ElemData_HDF5(IndexElectronTemp,iElem))) +! ELSE +! print*, "excitation temperature cannot be matched, unknown InterID for species", iSpec +! END IF END DO END DO END IF From c3c712d2b4ca43f49c1b15935fdd9279c09f9ec8 Mon Sep 17 00:00:00 2001 From: Marcel Pfeiffer Date: Thu, 28 Oct 2021 14:33:45 +0200 Subject: [PATCH 021/495] missing init of count variable --- src/radiation/radiative_transfer/radtrans_main.f90 | 1 + 1 file changed, 1 insertion(+) diff --git a/src/radiation/radiative_transfer/radtrans_main.f90 b/src/radiation/radiative_transfer/radtrans_main.f90 index 031cc3936..ccb19df9a 100644 --- a/src/radiation/radiative_transfer/radtrans_main.f90 +++ b/src/radiation/radiative_transfer/radtrans_main.f90 @@ -134,6 +134,7 @@ SUBROUTINE RadTrans_main() RadTransPhotPerCell(:) = RadTrans%NumPhotonsPerCell #endif RadTransPhotPerCellLoc(:) = RadTransPhotPerCell(:) + firstPhoton = 1 END IF SWRITE(UNIT_stdOut,'(A)') ' Start Radiative Transport Calculation ...' From 9703e0d3b195393d1c76228e3d17148290ca1394 Mon Sep 17 00:00:00 2001 From: Marcel Pfeiffer Date: Fri, 29 Oct 2021 14:25:21 +0200 Subject: [PATCH 022/495] interger overflow in photon assignment --- src/radiation/radiative_transfer/radtrans_main.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/radiation/radiative_transfer/radtrans_main.f90 b/src/radiation/radiative_transfer/radtrans_main.f90 index ccb19df9a..e56e2e394 100644 --- a/src/radiation/radiative_transfer/radtrans_main.f90 +++ b/src/radiation/radiative_transfer/radtrans_main.f90 @@ -102,8 +102,8 @@ SUBROUTINE RadTrans_main() END IF CALL MPI_BCAST(nPhotons,1, MPI_INTEGER,0,MPI_COMM_SHARED,iERROR) nPhotonsCN = SUM(RadTransPhotPerCell(:)) - firstPhoton = INT(REAL( myComputeNodeRank *nPhotonsCN)/REAL(nComputeNodeProcessors))+1 - lastPhoton = INT(REAL((myComputeNodeRank+1)*nPhotonsCN)/REAL(nComputeNodeProcessors)) + firstPhoton = INT(REAL( myComputeNodeRank) *REAL(nPhotonsCN)/REAL(nComputeNodeProcessors))+1 + lastPhoton = INT(REAL(myComputeNodeRank+1)*REAL(nPhotonsCN)/REAL(nComputeNodeProcessors)) photonCount = 0 DO iELem = 1, nComputeNodeElems IF (photonCount.GT.lastPhoton) THEN From 7ba306ec88f281f5a4972ec5010fefaa5ae8c93a Mon Sep 17 00:00:00 2001 From: Marcel Pfeiffer Date: Fri, 29 Oct 2021 16:58:26 +0200 Subject: [PATCH 023/495] bug in non adaptive photon sampling --- src/radiation/radiative_transfer/radtrans_main.f90 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/radiation/radiative_transfer/radtrans_main.f90 b/src/radiation/radiative_transfer/radtrans_main.f90 index e56e2e394..b6b76b71a 100644 --- a/src/radiation/radiative_transfer/radtrans_main.f90 +++ b/src/radiation/radiative_transfer/radtrans_main.f90 @@ -133,7 +133,8 @@ SUBROUTINE RadTrans_main() #else RadTransPhotPerCell(:) = RadTrans%NumPhotonsPerCell #endif - RadTransPhotPerCellLoc(:) = RadTransPhotPerCell(:) + RadTransPhotPerCellLoc(:) = 0.0 + RadTransPhotPerCellLoc(firstElem:lastElem) = RadTransPhotPerCell(firstElem:lastElem) firstPhoton = 1 END IF From 742aa7287db2a90639815396dbf78487de3908ef Mon Sep 17 00:00:00 2001 From: irsmpfei Date: Fri, 5 Nov 2021 00:17:12 +0100 Subject: [PATCH 024/495] radiation good --- src/radiation/radiation_solver/radiation_atoms.f90 | 3 ++- src/radiation/radiation_solver/radiation_init.f90 | 1 - src/radiation/radiation_solver/radiation_molecules.f90 | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/radiation/radiation_solver/radiation_atoms.f90 b/src/radiation/radiation_solver/radiation_atoms.f90 index c2b7415e9..15f7511d2 100644 --- a/src/radiation/radiation_solver/radiation_atoms.f90 +++ b/src/radiation/radiation_solver/radiation_atoms.f90 @@ -112,7 +112,8 @@ SUBROUTINE radiation_atoms(iElem, em_atom) DO iSpec = 1, nSpecies IF((SpecDSMC(iSpec)%InterID .NE. 1) .AND. (SpecDSMC(iSpec)%InterID .NE. 10)) CYCLE - IF (RadiationInput(iSpec)%Telec.LE.0.0) CYCLE + IF((RadiationInput(iSpec)%Telec.LT.10.0).OR.(RadiationInput(iSpec)%NumDens.LT.10.0).OR.(RadiationInput(iSpec)%Ttrans(4).LT.10.0)) CYCLE + ALLOCATE(lamnu(SpeciesRadiation(iSpec)%nLines)) lamnu = 0.0 diff --git a/src/radiation/radiation_solver/radiation_init.f90 b/src/radiation/radiation_solver/radiation_init.f90 index 6eedc4ffe..3126266cd 100644 --- a/src/radiation/radiation_solver/radiation_init.f90 +++ b/src/radiation/radiation_solver/radiation_init.f90 @@ -309,7 +309,6 @@ SUBROUTINE MacroscopicRadiationInput() CALL GetDataProps('ElemData',nVar_HDF5,N_HDF5,nElems_HDF5) - ALLOCATE(MacroRadInputParameters(1:nElems,1:nSpecies,1:5)) #if USE_MPI ! allocate shared array for Radiation_Emission/Absorption_Spec CALL Allocate_Shared((/nComputeNodeElems,nSpecies,5/), MacroRadInputParameters_Shared_Win,MacroRadInputParameters_Shared) diff --git a/src/radiation/radiation_solver/radiation_molecules.f90 b/src/radiation/radiation_solver/radiation_molecules.f90 index b981d91be..e4f18f959 100644 --- a/src/radiation/radiation_solver/radiation_molecules.f90 +++ b/src/radiation/radiation_solver/radiation_molecules.f90 @@ -135,7 +135,8 @@ SUBROUTINE radiation_molecules(iElem, em_mol) DO iSpec = 1, nSpecies IF((SpecDSMC(iSpec)%InterID .NE. 2) .AND. (SpecDSMC(iSpec)%InterID .NE. 20)) CYCLE Radiation_Profile = 0.0 - IF ((RadiationInput(iSpec)%Telec.LE.0.0).OR.(RadiationInput(iSpec)%Tvib.LE.0.0))CYCLE + IF ((RadiationInput(iSpec)%Telec.LT.10.0).OR.(RadiationInput(iSpec)%Tvib.LT.10.0).OR.(RadiationInput(iSpec)%NumDens.LT.10.0).OR.(RadiationInput(iSpec)%Ttrans(4).LT.10.0))CYCLE + epsilon_iSpec = 0.0 abs_iSpec = 0.0 From 3c3221b971a58eb9e9ed35a604defedeba7c33f4 Mon Sep 17 00:00:00 2001 From: Marcel Pfeiffer Date: Wed, 9 Mar 2022 00:08:49 +0100 Subject: [PATCH 025/495] definition of sensor outside of simulation region --- .../radiative_transfer/radtrans_init.f90 | 131 ++++++++++++++++-- .../radiative_transfer/radtrans_main.f90 | 107 +++++++++----- .../radiative_transfer/radtrans_output.f90 | 25 +++- .../radiative_transfer/radtrans_vars.f90 | 19 +++ .../tracking/radtrans_tools.f90 | 36 ++++- .../tracking/radtrans_tracking.f90 | 21 ++- 6 files changed, 283 insertions(+), 56 deletions(-) diff --git a/src/radiation/radiative_transfer/radtrans_init.f90 b/src/radiation/radiative_transfer/radtrans_init.f90 index 5af7357b8..1e68c1dba 100644 --- a/src/radiation/radiative_transfer/radtrans_init.f90 +++ b/src/radiation/radiative_transfer/radtrans_init.f90 @@ -45,11 +45,16 @@ SUBROUTINE DefineParametersRadiationTrans() CALL prms%SetSection("Radiation Transport") CALL prms%CreateLogicalOption('Radiation-AdaptivePhotonNumEmission', 'HM','.FALSE.') +CALL prms%CreateLogicalOption('Radiation-CalcRadObservationPoint', 'HM','.FALSE.') CALL prms%CreateIntOption( 'Radiation-DirectionModel', 'HM','1') CALL prms%CreateIntOption( 'Radiation-NumPhotonsPerCell', 'HM','1') CALL prms%CreateIntOption( 'Radiation-AbsorptionModel', 'HM','1') CALL prms%CreateIntOption( 'Radiation-PhotonPosModel', 'HM','1') CALL prms%CreateIntOption( 'Radiation-PhotonWaveLengthModel', 'HM','1') +CALL prms%CreateRealArrayOption('Radiation-ObservationMidPoint', 'HM') +CALL prms%CreateRealOption('Radiation-ObservationDiameter', 'HM') +CALL prms%CreateRealArrayOption('Radiation-ObservationViewDirection', 'HM') +CALL prms%CreateRealOption('Radiation-ObservationAngularAperture', 'HM') END SUBROUTINE DefineParametersRadiationTrans @@ -68,8 +73,7 @@ SUBROUTINE InitRadiationTransport() USE MOD_Particle_Boundary_Sampling, ONLY : InitParticleBoundarySampling USE MOD_Particle_Boundary_Vars, ONLY : nComputeNodeSurfTotalSides!, SurfMesh USE MOD_Radiation_Vars, ONLY : RadiationParameter, Radiation_Emission_spec, Radiation_Absorption_spec, RadiationSwitches -USE MOD_Radiation_Vars, ONLY : Radiation_Absorption_Spec_Shared, Radiation_Absorption_Spec_Shared_Win -USE MOD_Radiation_Vars, ONLY : Radiation_Emission_Spec_Shared_Win, Radiation_Emission_Spec_Shared +USE MOD_RadiationTrans_Vars, ONLY : RadObservation_Emission USE MOD_Radiation, ONLY : radiation_main USE MOD_DSMC_Vars, ONLY: RadialWeighting USE MOD_Output, ONLY: PrintStatusLineRadiation @@ -78,6 +82,12 @@ SUBROUTINE InitRadiationTransport() USE MOD_MPI_Shared_Vars USE MOD_MPI_Shared USE MOD_Particle_Mesh_Build, ONLY: BuildMesh2DInfo +USE MOD_SuperB_Tools, ONLY: FindLinIndependentVectors, GramSchmidtAlgo +#if USE_MPI +USE MOD_RadiationTrans_Vars, ONLY : RadTransObsVolumeFrac_Shared_Win, RadTransObsVolumeFrac_Shared +USE MOD_Radiation_Vars, ONLY : Radiation_Absorption_Spec_Shared, Radiation_Absorption_Spec_Shared_Win +USE MOD_Radiation_Vars, ONLY : Radiation_Emission_Spec_Shared_Win, Radiation_Emission_Spec_Shared +#endif ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -87,7 +97,8 @@ SUBROUTINE InitRadiationTransport() !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES INTEGER :: iWave, iElem, firstElem, lastElem, ElemDisp -REAL :: LocTemp +REAL :: LocTemp, ObsLengt +LOGICAL :: ElemInCone !=================================================================================================================================== SWRITE(UNIT_StdOut,'(132("-"))') SWRITE(UNIT_stdOut,'(A)') ' INIT RADIATION TRANSPORT SOLVER ...' @@ -95,14 +106,36 @@ SUBROUTINE InitRadiationTransport() ALLOCATE(RadiationElemAbsEnergy(1:nGlobalElems)) RadiationElemAbsEnergy=0.0 -RadiationDirectionModel = GETINT('Radiation-DirectionModel','1') -RadTrans%NumPhotonsPerCell = GETINT('Radiation-NumPhotonsPerCell','1') -RadiationAbsorptionModel = GETINT('Radiation-AbsorptionModel','1') -RadiationPhotonPosModel = GETINT('Radiation-PhotonPosModel','1') +RadiationDirectionModel = GETINT('Radiation-DirectionModel') +RadTrans%NumPhotonsPerCell = GETINT('Radiation-NumPhotonsPerCell') +RadiationAbsorptionModel = GETINT('Radiation-AbsorptionModel') +RadiationPhotonPosModel = GETINT('Radiation-PhotonPosModel') RadiationPhotonWaveLengthModel = GETINT('Radiation-PhotonWaveLengthModel') -RadEmiAdaptPhotonNum = GETLOGICAL('Radiation-AdaptivePhotonNumEmission','.FALSE.') +RadEmiAdaptPhotonNum = GETLOGICAL('Radiation-AdaptivePhotonNumEmission') +CalcRadObservationPoint = GETLOGICAL('Radiation-CalcRadObservationPoint') + +IF (CalcRadObservationPoint) THEN + RadObservationPoint%AngularAperture = GETREAL('Radiation-ObservationAngularAperture') + RadObservationPoint%Diameter = GETREAL('Radiation-ObservationDiameter') + RadObservationPoint%MidPoint = GETREALARRAY('Radiation-ObservationMidPoint',3) + RadObservationPoint%ViewDirection = GETREALARRAY('Radiation-ObservationViewDirection',3) + IF(.NOT.ALL(RadObservationPoint%ViewDirection(:).EQ.0.)) THEN + RadObservationPoint%ViewDirection = RadObservationPoint%ViewDirection / VECNORM(RadObservationPoint%ViewDirection) + END IF + RadObservationPoint%OrthoNormBasis(1:3,1) = RadObservationPoint%ViewDirection(1:3) + CALL FindLinIndependentVectors(RadObservationPoint%OrthoNormBasis(1:3,1), RadObservationPoint%OrthoNormBasis(1:3,2), RadObservationPoint%OrthoNormBasis(1:3,3)) + CALL GramSchmidtAlgo(RadObservationPoint%OrthoNormBasis(1:3,1), RadObservationPoint%OrthoNormBasis(1:3,2), RadObservationPoint%OrthoNormBasis(1:3,3)) + ObsLengt = RadObservationPoint%Diameter/(2.*TAN(RadObservationPoint%AngularAperture/2.)) + RadObservationPoint%StartPoint(1:3) = RadObservationPoint%MidPoint(1:3) - ObsLengt*RadObservationPoint%ViewDirection(1:3) + RadObservationPoint%Area = Pi*RadObservationPoint%Diameter*RadObservationPoint%Diameter/4. +END IF IF(Symmetry%Order.EQ.2) CALL BuildMesh2DInfo() +IF (CalcRadObservationPoint) THEN + ALLOCATE(RadObservation_Emission(RadiationParameter%WaveLenDiscrCoarse),RadObservation_EmissionPart(RadiationParameter%WaveLenDiscrCoarse)) + RadObservation_Emission = 0.0 + RadObservation_EmissionPart = 0 +END IF #if USE_MPI ! allocate shared array for Radiation_Emission/Absorption_Spec @@ -117,13 +150,19 @@ SUBROUTINE InitRadiationTransport() CALL Allocate_Shared((/nComputeNodeElems/), Radiation_Emission_Spec_Total_Shared_Win,Radiation_Emission_Spec_Total_Shared) CALL MPI_WIN_LOCK_ALL(0,Radiation_Emission_Spec_Total_Shared_Win,IERROR) +CALL Allocate_Shared((/nComputeNodeElems/), RadTransObsVolumeFrac_Shared_Win,RadTransObsVolumeFrac_Shared) +CALL MPI_WIN_LOCK_ALL(0,RadTransObsVolumeFrac_Shared_Win,IERROR) + RadTransPhotPerCell => RadTransPhotPerCell_Shared Radiation_Emission_Spec_Total => Radiation_Emission_Spec_Total_Shared +RadTransObsVolumeFrac => RadTransObsVolumeFrac_Shared IF (myComputeNodeRank.EQ.0) THEN RadTransPhotPerCell = 0 Radiation_Emission_Spec_Total = 0.0 + RadTransObsVolumeFrac = 1. END IF CALL BARRIER_AND_SYNC(RadTransPhotPerCell_Shared_Win ,MPI_COMM_SHARED) +CALL BARRIER_AND_SYNC(RadTransObsVolumeFrac_Shared_Win ,MPI_COMM_SHARED) CALL BARRIER_AND_SYNC(Radiation_Emission_Spec_Total_Shared_Win ,MPI_COMM_SHARED) IF (RadiationPhotonWaveLengthModel.EQ.1) THEN @@ -140,9 +179,10 @@ SUBROUTINE InitRadiationTransport() RadTransPhotPerCellLoc = 0 #else ! allocate local array for ElemInfo -ALLOCATE(RadTransPhotPerCell(nElems),Radiation_Emission_Spec_Total(nElems),RadTransPhotPerCellLoc(nELems)) +ALLOCATE(RadTransPhotPerCell(nElems),Radiation_Emission_Spec_Total(nElems),RadTransPhotPerCellLoc(nELems), RadTransObsVolumeFrac(nElems)) RadTransPhotPerCell = 0 RadTransPhotPerCellLoc = 0 +RadTransObsVolumeFrac = 1.0 Radiation_Emission_Spec_Total=0.0 IF (RadiationPhotonWaveLengthModel.EQ.1) THEN ALLOCATE(Radiation_Emission_Spec_Max(nElems)) @@ -164,6 +204,10 @@ SUBROUTINE InitRadiationTransport() ElemDisp = INT((lastElem-firstElem+1)/20) DO iElem = firstElem, lastElem IF(MPIroot.AND.(MOD(iElem,ElemDisp).EQ.0)) CALL PrintStatusLineRadiation(REAL(iElem),REAL(firstElem),REAL(lastElem),.FALSE.) + IF (CalcRadObservationPoint) THEN + CALL ElemInObsCone(iElem, ElemInCone) + IF (.NOT.ElemInCone) CYCLE + END IF CALL radiation_main(iElem) DO iWave = 1, RadiationParameter%WaveLenDiscrCoarse Radiation_Emission_Spec_Total(iElem) = Radiation_Emission_Spec_Total(iElem) & @@ -219,6 +263,7 @@ SUBROUTINE InitRadiationTransport() #if USE_MPI + CALL BARRIER_AND_SYNC(RadTransObsVolumeFrac_Shared_Win ,MPI_COMM_SHARED) IF (RadiationPhotonWaveLengthModel.EQ.1) THEN CALL BARRIER_AND_SYNC(Radiation_Emission_Spec_Max_Shared_Win,MPI_COMM_SHARED) END IF @@ -243,10 +288,10 @@ SUBROUTINE InitRadiationTransport() RadTrans%GlobalRadiationPower = 0.0 RadTrans%ScaledGlobalRadiationPower = 0.0 DO iElem = firstElem, lastElem - RadTrans%GlobalRadiationPower = RadTrans%GlobalRadiationPower + Radiation_Emission_Spec_Total(iElem)*ElemVolume_Shared(iElem) + RadTrans%GlobalRadiationPower = RadTrans%GlobalRadiationPower + Radiation_Emission_Spec_Total(iElem)*ElemVolume_Shared(iElem)*RadTransObsVolumeFrac(iElem) IF (RadialWeighting%DoRadialWeighting) THEN RadTrans%ScaledGlobalRadiationPower = RadTrans%ScaledGlobalRadiationPower & - + Radiation_Emission_Spec_Total(iElem)*ElemVolume_Shared(iElem) & + + Radiation_Emission_Spec_Total(iElem)*ElemVolume_Shared(iElem)*RadTransObsVolumeFrac(iElem) & /(1. + ElemMidPoint_Shared(2,iElem)/GEO%ymaxglob*(RadialWeighting%PartScaleFactor-1.)) END IF END DO @@ -314,6 +359,70 @@ SUBROUTINE HALTON( ind, dims, rand ) RETURN END SUBROUTINE HALTON +SUBROUTINE ElemInObsCone(ElemID, ElemInCone) +!=================================================================================================================================== +! modified particle emmission for LD case +!=================================================================================================================================== +! MODULES +USE MOD_Globals +USE MOD_Mesh_Tools ,ONLY: GetGlobalElemID +USE MOD_Particle_Mesh_Vars ,ONLY: NodeCoords_Shared,ElemInfo_Shared, BoundsOfElem_Shared +USE MOD_RadiationTrans_Vars ,ONLY: RadObservationPoint, RadTransObsVolumeFrac +USE MOD_Particle_Vars ,ONLY: Symmetry +USE MOD_Particle_Mesh_Tools ,ONLY: ParticleInsideQuad3D +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! INOUTPUT VARIABLES +INTEGER, INTENT(IN) :: ElemID +LOGICAL, INTENT(OUT) :: ElemInCone +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +INTEGER :: iNode, MCVar, iGlobalElem, iPoint +LOGICAL :: NodeInCone(8), InsideFlag +REAL :: NodePoint(3), ConeDist, ConeRadius, orthoDist, RandomPos(3) +!=================================================================================================================================== +ElemInCone = .FALSE. +NodeInCone = .FALSE. +MCVar = 1000000 +DO iNode = 1, 8 + NodePoint(1:3) = NodeCoords_Shared(1:3,ElemInfo_Shared(ELEM_FIRSTNODEIND,ElemID)+iNode) + ConeDist = DOT_PRODUCT(NodePoint(1:3) - RadObservationPoint%StartPoint(1:3), RadObservationPoint%ViewDirection(1:3)) + ConeRadius = TAN(RadObservationPoint%AngularAperture/2.) * ConeDist + orthoDist = VECNORM(NodePoint(1:3) - RadObservationPoint%StartPoint(1:3) - ConeDist*RadObservationPoint%ViewDirection(1:3)) + IF (orthoDist.LE.ConeRadius) THEN + NodeInCone(iNode) = .TRUE. + END IF +END DO + +IF (ALL(NodeInCone)) THEN + ElemInCone = .TRUE. +ELSE IF (ANY(NodeInCone)) THEN + iGlobalElem = GetGlobalElemID(ElemID) + RadTransObsVolumeFrac(ElemID) = 0.0 + ElemInCone = .TRUE. + ASSOCIATE( Bounds => BoundsOfElem_Shared(1:2,1:3,iGlobalElem) ) + DO iPoint = 1, MCVar + InsideFlag=.FALSE. + DO WHILE(.NOT.InsideFlag) + CALL RANDOM_NUMBER(RandomPos) + RandomPos = Bounds(1,:) + RandomPos*(Bounds(2,:)-Bounds(1,:)) + IF(Symmetry%Order.LE.2) RandomPos(3) = 0. + IF(Symmetry%Order.LE.1) RandomPos(2) = 0. + CALL ParticleInsideQuad3D(RandomPos,iGlobalElem,InsideFlag) + END DO + ConeDist = DOT_PRODUCT(RandomPos(1:3) - RadObservationPoint%StartPoint(1:3), RadObservationPoint%ViewDirection(1:3)) + ConeRadius = TAN(RadObservationPoint%AngularAperture/2.) * ConeDist + orthoDist = VECNORM(RandomPos(1:3) - RadObservationPoint%StartPoint(1:3) - ConeDist*RadObservationPoint%ViewDirection(1:3)) + IF (orthoDist.LE.ConeRadius) RadTransObsVolumeFrac(ElemID) = RadTransObsVolumeFrac(ElemID) + 1./REAL(MCVar) + END DO + END ASSOCIATE +END IF + +END SUBROUTINE ElemInObsCone + INTEGER FUNCTION PRIME(n) !=================================================================================================================================== ! modified particle emmission for LD case diff --git a/src/radiation/radiative_transfer/radtrans_main.f90 b/src/radiation/radiative_transfer/radtrans_main.f90 index b6b76b71a..0c0fab73f 100644 --- a/src/radiation/radiative_transfer/radtrans_main.f90 +++ b/src/radiation/radiative_transfer/radtrans_main.f90 @@ -43,7 +43,7 @@ SUBROUTINE RadTrans_main() USE MOD_Globals USE MOD_Mesh_Vars ,ONLY : nElems USE MOD_Particle_Mesh_Vars ,ONLY : GEO, nComputeNodeElems, ElemMidPoint_Shared, ElemVolume_Shared -USE MOD_RadiationTrans_Vars ,ONLY : Radiation_Emission_Spec_Total, RadTrans, RadEmiAdaptPhotonNum +USE MOD_RadiationTrans_Vars ,ONLY : Radiation_Emission_Spec_Total, RadTrans, RadEmiAdaptPhotonNum, RadTransObsVolumeFrac USE MOD_RadiationTrans_Vars ,ONLY : PhotonProps, RadiationDirectionModel, RadTransPhotPerCellLoc USE MOD_RadiationTrans_Vars ,ONLY : RadTransPhotPerCell, RadTransPhotPerCell_Shared_Win, RadiationPhotonWaveLengthModel USE MOD_Photon_Tracking ,ONLY : PhotonTriaTracking, Photon2DSymTracking @@ -83,11 +83,11 @@ SUBROUTINE RadTrans_main() RadTransPhotPerCell(iElem) = 0 ELSE IF (RadialWeighting%DoRadialWeighting) THEN - RadTransPhotPerCell(iElem) = INT(Radiation_Emission_Spec_Total(iElem)*ElemVolume_Shared(iElem) & + RadTransPhotPerCell(iElem) = INT(Radiation_Emission_Spec_Total(iElem)*ElemVolume_Shared(iElem)*RadTransObsVolumeFrac(iElem) & /(1. + ElemMidPoint_Shared(2,iElem)/GEO%ymaxglob*(RadialWeighting%PartScaleFactor-1.)) & / RadTrans%ScaledGlobalRadiationPower*RadTrans%GlobalPhotonNum + 0.5) ELSE - RadTransPhotPerCell(iElem) = INT(Radiation_Emission_Spec_Total(iElem)*ElemVolume_Shared(iElem) & + RadTransPhotPerCell(iElem) = INT(Radiation_Emission_Spec_Total(iElem)*ElemVolume_Shared(iElem)*RadTransObsVolumeFrac(iElem) & / RadTrans%GlobalRadiationPower*RadTrans%GlobalPhotonNum + 0.5) END IF END IF @@ -150,7 +150,6 @@ SUBROUTINE RadTrans_main() DO iPhot = 1, RadTransPhotPerCellLoc(iElem) IF(MPIroot.AND.(MOD(photVisCount,PhotDisp).EQ.0)) CALL PrintStatusLineRadiation(REAL(photVisCount),REAL(1),REAL(LocPhotNum),.TRUE.) photVisCount = photVisCount + 1 - PhotonProps%PhotonEnergy = SetPhotonEnergy(iElem) PhotonProps%PhotonPos(1:3) = SetPhotonPos(iElem, globPhotNum) PhotonProps%PhotonLastPos(1:3) = PhotonProps%PhotonPos(1:3) PhotonProps%ElemID = GetGlobalElemID(iElem) @@ -160,6 +159,7 @@ SUBROUTINE RadTrans_main() iPhotLoc = iPhot END IF PhotonProps%PhotonDirection(1:3) = SetPhotonStartDirection(iElem, iPhotLoc, RandRot) + PhotonProps%PhotonEnergy = SetPhotonEnergy(iElem,PhotonProps%PhotonPos(1:3)) IF (RadiationPhotonWaveLengthModel.EQ.1) THEN PhotonProps%WaveLength = SetParticleWavelengthAR(iElem) ELSE @@ -177,28 +177,49 @@ SUBROUTINE RadTrans_main() END SUBROUTINE RadTrans_main -FUNCTION SetPhotonEnergy(iElem) +FUNCTION SetPhotonEnergy(iElem, Point) !=================================================================================================================================== !> Calculation of the vibrational temperature (zero-point search) for the TSHO (Truncated Simple Harmonic Oscillator) !=================================================================================================================================== ! MODULES +USE MOD_Globals +USE MOD_Globals_Vars, ONLY : Pi USE MOD_RadiationTrans_Vars ,ONLY : RadEmiAdaptPhotonNum, Radiation_Emission_Spec_Total, RadTrans, RadTransPhotPerCell +USE MOD_RadiationTrans_Vars ,ONLY : RadObservationPoint, CalcRadObservationPoint,RadTransObsVolumeFrac USE MOD_Particle_Mesh_Vars ,ONLY : ElemVolume_Shared ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES INTEGER, INTENT(IN) :: iElem +REAL, INTENT(IN) :: Point(3) !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES REAL :: SetPhotonEnergy !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES +!REAL :: ProjectedDist(3), Dist(3), ClosestPoint(3), FarthestPoint(3), Vec1(3), Vec2(3), fullangle +REAL :: cosTheta, Dist(3), DistNorm(3), spaceangle, absdistnorm !=================================================================================================================================== IF (RadEmiAdaptPhotonNum) THEN - SetPhotonEnergy = Radiation_Emission_Spec_Total(iElem)*ElemVolume_Shared(iElem) / RadTransPhotPerCell(iElem) + SetPhotonEnergy = Radiation_Emission_Spec_Total(iElem)*ElemVolume_Shared(iElem)*RadTransObsVolumeFrac(iElem) / RadTransPhotPerCell(iElem) ELSE - SetPhotonEnergy = Radiation_Emission_Spec_Total(iElem)*ElemVolume_Shared(iElem) / (RadTrans%NumPhotonsPerCell) + SetPhotonEnergy = Radiation_Emission_Spec_Total(iElem)*ElemVolume_Shared(iElem)*RadTransObsVolumeFrac(iElem) / (RadTrans%NumPhotonsPerCell) +END IF + +IF (CalcRadObservationPoint) THEN + Dist(1:3) = Point(1:3) - RadObservationPoint%MidPoint(1:3) + absdistnorm = VECNORM(Dist(1:3)) + DistNorm(1:3) = Dist(1:3)/absdistnorm + cosTheta = DOT_PRODUCT(RadObservationPoint%ViewDirection(1:3),DistNorm(1:3))/(VECNORM(RadObservationPoint%ViewDirection(1:3))*VECNORM(DistNorm(1:3))) + spaceangle = cosTheta * RadObservationPoint%Area/(absdistnorm*absdistnorm) +! ProjectedDist(1:3) = Dist(1:3) - DOT_PRODUCT(RadObservationPoint%ViewDirection(1:3),Dist(1:3))*RadObservationPoint%ViewDirection(1:3) +! ClosestPoint(1:3) = RadObservationPoint%MidPoint(1:3) + RadObservationPoint%Diameter/2.*ProjectedDist(1:3)/VECNORM(ProjectedDist(1:3)) +! FarthestPoint(1:3) = RadObservationPoint%MidPoint(1:3) - RadObservationPoint%Diameter/2.*ProjectedDist(1:3)/VECNORM(ProjectedDist(1:3)) +! Vec1(1:3) = ClosestPoint(1:3) - Point(1:3) +! Vec2(1:3) = FarthestPoint(1:3) - Point(1:3) +! fullangle = ACOS(DOT_PRODUCT(Vec1,Vec2)/(VECNORM(Vec1)*VECNORM(Vec2))) + SetPhotonEnergy = SetPhotonEnergy * spaceangle/(4.*Pi) END IF END FUNCTION SetPhotonEnergy @@ -209,12 +230,13 @@ FUNCTION SetPhotonPos(iElem, globPhotNum) !=================================================================================================================================== ! MODULES USE MOD_Globals -USE MOD_RadiationTrans_Vars, ONLY : RadiationPhotonPosModel +USE MOD_RadiationTrans_Vars, ONLY : RadiationPhotonPosModel, CalcRadObservationPoint USE MOD_Particle_Mesh_Tools, ONLY : ParticleInsideQuad3D USE MOD_RadiationTrans_Init, ONLY : HALTON !USE MOD_PARTICLE_Vars, ONLY : Symmetry2DAxisymmetric USE MOD_Particle_Mesh_Vars, ONLY : BoundsOfElem_Shared USE MOD_Mesh_Tools, ONLY: GetGlobalElemID +USE MOD_Photon_TrackingTools, ONLY: PointInObsCone ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -247,6 +269,11 @@ FUNCTION SetPhotonPos(iElem, globPhotNum) SetPhotonPos = Bounds(1,:) + SetPhotonPos*(Bounds(2,:)-Bounds(1,:)) ! IF (Symmetry2DAxisymmetric) SetPhotonPos(3) = 0.0 CALL ParticleInsideQuad3D(SetPhotonPos,globElemID,InsideFlag) + IF (CalcRadObservationPoint) THEN + IF (InsideFlag) THEN + InsideFlag = PointInObsCone(SetPhotonPos) + END IF + END IF END DO END ASSOCIATE END FUNCTION SetPhotonPos @@ -258,7 +285,8 @@ FUNCTION SetPhotonStartDirection(iElem, iPhot, RandRot) ! MODULES USE MOD_Globals USE MOD_Globals_Vars, ONLY : Pi -USE MOD_RadiationTrans_Vars ,ONLY : RadiationDirectionModel, RadTransPhotPerCell +USE MOD_RadiationTrans_Vars ,ONLY : RadiationDirectionModel, RadTransPhotPerCell, CalcRadObservationPoint,RadObservationPoint +USE MOD_RadiationTrans_Vars ,ONLY : PhotonProps ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -289,32 +317,45 @@ FUNCTION SetPhotonStartDirection(iElem, iPhot, RandRot) __STAMP__& ,' ERROR: Radiation-DirectionModel not implemented!. (unknown case)') END SELECT !PartBound%MapToPartBC(BC(SideID) - - SELECT CASE(RadMod) - CASE(1) + IF (CalcRadObservationPoint) THEN CALL RANDOM_NUMBER(iRan) - RandomDirection(1) = 2.*iRan - 1. + RandomDirection(1) = RadObservationPoint%Diameter/2. * SQRT(iRan) CALL RANDOM_NUMBER(iRan) - RandomDirection(2) = 2.*Pi*iRan - Pi - SetPhotonStartDirection(1) = SIN(RandomDirection(2))*SQRT(1.-RandomDirection(1)**2.) - SetPhotonStartDirection(2) = COS(RandomDirection(2))*SQRT(1.-RandomDirection(1)**2.) - SetPhotonStartDirection(3) = RandomDirection(1) - CASE(2) - SpiralStep = 0.1+1.2*REAL(RadTransPhotPerCell(iElem)) - start = (-1. + 1./(REAL(RadTransPhotPerCell(iElem))-1.)) - incr = (2.-2./(REAL(RadTransPhotPerCell(iElem))-1.))/(REAL(RadTransPhotPerCell(iElem))-1.) - SpiralPos = start + (REAL(iPhot)-1.) *incr - X_new = SpiralPos * SpiralStep - Y_new = Pi/2.*SIGN(1.,SpiralPos)*(1.-SQRT(1.-ABS(SpiralPos))) - SetPhotonStartDirection(1) = COS(X_new)*COS(Y_new) - SetPhotonStartDirection(2) = SIN(X_new)*COS(Y_new) - SetPhotonStartDirection(3) = SIN(Y_new) - SetPhotonStartDirection(1:3) = MATMUL(RandRot, SetPhotonStartDirection(1:3)) - CASE DEFAULT - CALL abort(& - __STAMP__& - ,' ERROR: Radiation-DirectionModel not implemented!. (unknown case)') - END SELECT !PartBound%MapToPartBC(BC(SideID) + RandomDirection(2) = iRan * 2. * Pi + SetPhotonStartDirection(1) = 0.0 + SetPhotonStartDirection(2) = RandomDirection(1) * COS(RandomDirection(2)) + SetPhotonStartDirection(3) = RandomDirection(1) * SIN(RandomDirection(2)) + SetPhotonStartDirection(1:3) = MATMUL(RadObservationPoint%OrthoNormBasis, SetPhotonStartDirection(1:3)) + SetPhotonStartDirection(1:3) = SetPhotonStartDirection(1:3) + RadObservationPoint%MidPoint(1:3) + SetPhotonStartDirection(1:3) = SetPhotonStartDirection(1:3) - PhotonProps%PhotonPos(1:3) + SetPhotonStartDirection(1:3) = SetPhotonStartDirection(1:3) / VECNORM(SetPhotonStartDirection(1:3)) + ELSE + SELECT CASE(RadMod) + CASE(1) + CALL RANDOM_NUMBER(iRan) + RandomDirection(1) = 2.*iRan - 1. + CALL RANDOM_NUMBER(iRan) + RandomDirection(2) = 2.*Pi*iRan - Pi + SetPhotonStartDirection(1) = SIN(RandomDirection(2))*SQRT(1.-RandomDirection(1)**2.) + SetPhotonStartDirection(2) = COS(RandomDirection(2))*SQRT(1.-RandomDirection(1)**2.) + SetPhotonStartDirection(3) = RandomDirection(1) + CASE(2) + SpiralStep = 0.1+1.2*REAL(RadTransPhotPerCell(iElem)) + start = (-1. + 1./(REAL(RadTransPhotPerCell(iElem))-1.)) + incr = (2.-2./(REAL(RadTransPhotPerCell(iElem))-1.))/(REAL(RadTransPhotPerCell(iElem))-1.) + SpiralPos = start + (REAL(iPhot)-1.) *incr + X_new = SpiralPos * SpiralStep + Y_new = Pi/2.*SIGN(1.,SpiralPos)*(1.-SQRT(1.-ABS(SpiralPos))) + SetPhotonStartDirection(1) = COS(X_new)*COS(Y_new) + SetPhotonStartDirection(2) = SIN(X_new)*COS(Y_new) + SetPhotonStartDirection(3) = SIN(Y_new) + SetPhotonStartDirection(1:3) = MATMUL(RandRot, SetPhotonStartDirection(1:3)) + CASE DEFAULT + CALL abort(& + __STAMP__& + ,' ERROR: Radiation-DirectionModel not implemented!. (unknown case)') + END SELECT !PartBound%MapToPartBC(BC(SideID) + END IF END FUNCTION SetPhotonStartDirection diff --git a/src/radiation/radiative_transfer/radtrans_output.f90 b/src/radiation/radiative_transfer/radtrans_output.f90 index ca2f49974..3ce152f7b 100644 --- a/src/radiation/radiative_transfer/radtrans_output.f90 +++ b/src/radiation/radiative_transfer/radtrans_output.f90 @@ -46,8 +46,8 @@ SUBROUTINE WriteRadiationToHDF5() USE MOD_io_HDF5 USE MOD_HDF5_output ,ONLY: WriteArrayToHDF5,WriteAttributeToHDF5,WriteHDF5Header USE MOD_Mesh_Vars ,ONLY: offsetElem,nGlobalElems, MeshFile - USE MOD_RadiationTrans_Vars ,ONLY: RadiationElemAbsEnergy_Shared - USE MOD_RadiationTrans_Vars ,ONLY: Radiation_Emission_Spec_Total, RadTransPhotPerCell + USE MOD_RadiationTrans_Vars ,ONLY: RadiationElemAbsEnergy_Shared, CalcRadObservationPoint, RadObservation_Emission, RadObservationPoint + USE MOD_RadiationTrans_Vars ,ONLY: Radiation_Emission_Spec_Total, RadTransPhotPerCell, RadObservation_EmissionPart USE MOD_Globals_Vars ,ONLY: ProjectName USE MOD_Particle_Mesh_Vars ,ONLY: ElemVolume_Shared USE MOD_Radiation_Vars ,ONLY: RadiationSwitches, Radiation_ElemEnergy_Species, RadiationParameter, Radiation_Absorption_Spec @@ -176,6 +176,27 @@ SUBROUTINE WriteRadiationToHDF5() SWRITE(*,*) 'DONE' CALL WriteSurfSampleToHDF5() + + IF (CalcRadObservationPoint) THEN + IF (myRank.EQ.0) THEN + CALL MPI_REDUCE(MPI_IN_PLACE,RadObservation_Emission,RadiationParameter%WaveLenDiscrCoarse,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_WORLD,IERROR) + ELSE + CALL MPI_REDUCE(RadObservation_Emission,0 ,RadiationParameter%WaveLenDiscrCoarse,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_WORLD,IERROR) + ENDIF + IF (myRank.EQ.0) THEN + CALL MPI_REDUCE(MPI_IN_PLACE,RadObservation_EmissionPart,RadiationParameter%WaveLenDiscrCoarse,MPI_INTEGER,MPI_SUM,0,MPI_COMM_WORLD,IERROR) + ELSE + CALL MPI_REDUCE(RadObservation_EmissionPart,0 ,RadiationParameter%WaveLenDiscrCoarse,MPI_INTEGER,MPI_SUM,0,MPI_COMM_WORLD,IERROR) + ENDIF + IF (myRank.EQ.0) THEN + OPEN(unit=20,file='Radiation_ObservationPoint.csv', status='replace',action='write') + WRITE(20,*) 'x,y1,y2' + DO iWave=1, RadiationParameter%WaveLenDiscrCoarse + WRITE(20,*) RadiationParameter%MinWaveLen + (iWave-1) * RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor*1.E10,',',RadObservation_Emission(iWave)/RadObservationPoint%Area,',',RadObservation_EmissionPart(iWave) + END DO + CLOSE(unit=20) + END IF + END IF END SUBROUTINE WriteRadiationToHDF5 diff --git a/src/radiation/radiative_transfer/radtrans_vars.f90 b/src/radiation/radiative_transfer/radtrans_vars.f90 index ee3fddb64..649344136 100644 --- a/src/radiation/radiative_transfer/radtrans_vars.f90 +++ b/src/radiation/radiative_transfer/radtrans_vars.f90 @@ -25,6 +25,22 @@ MODULE MOD_RadiationTrans_Vars ! GLOBAL VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- LOGICAL :: useParticleRadiationSolver +LOGICAL :: CalcRadObservationPoint + +TYPE tRadObservationPoint + REAL :: StartPoint(3) + REAL :: Area + REAL :: AngularAperture + REAL :: ViewDirection(3) + REAL :: MidPoint(3) + REAL :: Diameter + REAL :: OrthoNormBasis(3,3) +END TYPE + +TYPE(tRadObservationPoint) :: RadObservationPoint +REAL,ALLOCATABLE :: RadObservation_Emission(:) +INTEGER,ALLOCATABLE :: RadObservation_EmissionPart(:) + TYPE tRadTrans INTEGER :: NumPhotonsPerCell REAL :: GlobalRadiationPower @@ -57,10 +73,13 @@ MODULE MOD_RadiationTrans_Vars REAL,ALLOCPOINT :: Radiation_Emission_Spec_Max(:) INTEGER,ALLOCPOINT :: RadTransPhotPerCell(:) ! (WaveLen(:), number of mesh elements) INTEGER, ALLOCATABLE :: RadTransPhotPerCellLoc(:) +REAL, ALLOCPOINT :: RadTransObsVolumeFrac(:) REAL, ALLOCATABLE :: PhotonSampWall(:,:) #if USE_MPI INTEGER :: RadTransPhotPerCell_Shared_Win INTEGER,ALLOCPOINT :: RadTransPhotPerCell_Shared(:) +INTEGER :: RadTransObsVolumeFrac_Shared_Win +REAL,ALLOCPOINT :: RadTransObsVolumeFrac_Shared(:) INTEGER :: Radiation_Emission_Spec_Total_Shared_Win REAL,ALLOCPOINT :: Radiation_Emission_Spec_Total_Shared(:) INTEGER :: Radiation_Emission_Spec_Max_Shared_Win diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tools.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tools.f90 index ab4826673..5cede8ce3 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tools.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tools.f90 @@ -26,7 +26,7 @@ MODULE MOD_Photon_TrackingTools END INTERFACE PUBLIC :: PhotonThroughSideCheck3DFast, PhotonIntersectionWithSide, CalcAbsoprtion, PerfectPhotonReflection, DiffusePhotonReflection -PUBLIC :: CalcWallAbsoprtion +PUBLIC :: CalcWallAbsoprtion, PointInObsCone PUBLIC :: PhotonIntersectionWithSide2D, RotatePhotonIn2DPlane, PerfectPhotonReflection2D,DiffusePhotonReflection2D !----------------------------------------------------------------------------------------------------------------------------------- !----------------------------------------------------------------------------------------------------------------------------------- @@ -468,11 +468,11 @@ SUBROUTINE CalcAbsoprtionAnalytic(IntersectionPos,Element, DONE) END IF PhotonProps%PhotonEnergy = PhotonProps%PhotonEnergy - LostEnergy RadiationElemAbsEnergy(Element) = RadiationElemAbsEnergy(Element) + LostEnergy - IF (PhotonProps%PhotonEnergy.LE.(RadTrans%GlobalRadiationPower/(1000.*RadTrans%GlobalPhotonNum))) THEN - DONE = .TRUE. - ELSE +! IF (PhotonProps%PhotonEnergy.LE.(RadTrans%GlobalRadiationPower/(1000.*RadTrans%GlobalPhotonNum))) THEN +! DONE = .TRUE. +! ELSE PhotonProps%PhotonPos(1:3) = IntersectionPos(1:3) - END IF +! END IF END SUBROUTINE CalcAbsoprtionAnalytic @@ -830,4 +830,30 @@ SUBROUTINE CalcWallAbsoprtion(GlobSideID, DONE) END SUBROUTINE CalcWallAbsoprtion +LOGICAL FUNCTION PointInObsCone(Point) +!=================================================================================================================================== +! modified particle emmission for LD case +!=================================================================================================================================== +! MODULES + USE MOD_Globals + USE MOD_RadiationTrans_Vars, ONLY: RadObservationPoint +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! INOUTPUT VARIABLES +REAL, INTENT(IN) :: Point(3) +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +REAL :: ConeDist, ConeRadius, orthoDist +!=================================================================================================================================== +PointInObsCone = .FALSE. +ConeDist = DOT_PRODUCT(Point(1:3) - RadObservationPoint%StartPoint(1:3), RadObservationPoint%ViewDirection(1:3)) +ConeRadius = TAN(RadObservationPoint%AngularAperture/2.) * ConeDist +orthoDist = VECNORM(Point(1:3) - RadObservationPoint%StartPoint(1:3) - ConeDist*RadObservationPoint%ViewDirection(1:3)) +IF (orthoDist.LE.ConeRadius) PointInObsCone = .TRUE. + +END FUNCTION PointInObsCone + END MODULE MOD_Photon_TrackingTools diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 index 884ac0bab..78eb623e7 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 @@ -51,9 +51,9 @@ SUBROUTINE PhotonTriaTracking() USE MOD_Globals USE MOD_Particle_Mesh_Vars USE MOD_Particle_Boundary_Vars, ONLY:PartBound -USE MOD_RadiationTrans_Vars, ONLY:PhotonProps +USE MOD_RadiationTrans_Vars, ONLY:PhotonProps,RadObservation_Emission, CalcRadObservationPoint, RadObservation_EmissionPart USE MOD_Photon_TrackingTools, ONLY:PhotonThroughSideCheck3DFast, PhotonIntersectionWithSide,CalcAbsoprtion -USE MOD_Photon_TrackingTools, ONLY:PerfectPhotonReflection, DiffusePhotonReflection, CalcWallAbsoprtion +USE MOD_Photon_TrackingTools, ONLY:PerfectPhotonReflection, DiffusePhotonReflection, CalcWallAbsoprtion, PointInObsCone IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES @@ -224,6 +224,12 @@ SUBROUTINE PhotonTriaTracking() CASE(1) !PartBound%OpenBC) IF (NrOfThroughSides.LT.2) CALL PhotonIntersectionWithSide(LocalSide,ElemID,TriNum, IntersectionPos) CALL CalcAbsoprtion(IntersectionPos(1:3),ElemID, DONE) + IF (CalcRadObservationPoint) THEN + IF (PointInObsCone(IntersectionPos(1:3))) THEN + RadObservation_Emission(PhotonProps%WaveLength) = RadObservation_Emission(PhotonProps%WaveLength) + PhotonProps%PhotonEnergy + RadObservation_EmissionPart(PhotonProps%WaveLength) = RadObservation_EmissionPart(PhotonProps%WaveLength) + 1 + END IF + END IF DONE = .TRUE. CASE(2) IF (PartBound%PhotonSpecularReflection(PartBound%MapToPartBC(SideInfo_Shared(SIDE_BCID,SideID)))) THEN @@ -309,8 +315,8 @@ SUBROUTINE Photon2DSymTracking() USE MOD_Globals USE MOD_Particle_Mesh_Vars USE MOD_Particle_Boundary_Vars, ONLY:PartBound -USE MOD_RadiationTrans_Vars, ONLY:PhotonProps -USE MOD_Photon_TrackingTools, ONLY:CalcAbsoprtion, CalcWallAbsoprtion, DiffusePhotonReflection2D +USE MOD_RadiationTrans_Vars, ONLY:PhotonProps, RadObservation_Emission, CalcRadObservationPoint,RadObservation_EmissionPart +USE MOD_Photon_TrackingTools, ONLY:CalcAbsoprtion, CalcWallAbsoprtion, DiffusePhotonReflection2D, PointInObsCone USE MOD_Photon_TrackingTools, ONLY:PhotonIntersectionWithSide2D, RotatePhotonIn2DPlane, PerfectPhotonReflection2D IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -426,6 +432,12 @@ SUBROUTINE Photon2DSymTracking() CASE(1) !PartBound%OpenBC) CALL CalcAbsoprtion(IntersectionPos(1:3),ElemID, DONE) DONE = .TRUE. + IF (CalcRadObservationPoint) THEN + IF (PointInObsCone(IntersectionPos(1:3))) THEN + RadObservation_Emission(PhotonProps%WaveLength) = RadObservation_Emission(PhotonProps%WaveLength) + PhotonProps%PhotonEnergy + RadObservation_EmissionPart(PhotonProps%WaveLength) = RadObservation_EmissionPart(PhotonProps%WaveLength) + 1 + END IF + END IF CYCLE CASE(2) IF (PartBound%PhotonSpecularReflection(PartBound%MapToPartBC(SideInfo_Shared(SIDE_BCID,SideID)))) THEN @@ -461,7 +473,6 @@ SUBROUTINE Photon2DSymTracking() ,'ERROR: Element not defined! Please increase the size of the halo region (HaloEpsVelo)!') END IF END DO ! .NOT.PartisDone - END SUBROUTINE Photon2DSymTracking END MODULE MOD_Photon_Tracking From d90bef24d66f5090bd5c26582ddfc7cc9dae0d1c Mon Sep 17 00:00:00 2001 From: Julian Beyer Date: Thu, 10 Mar 2022 20:26:54 +0100 Subject: [PATCH 026/495] radiation can be calculated for each species separately + bugfixes --- .../radiation_solver/radiation_atoms.f90 | 1 + .../radiation_solver/radiation_init.f90 | 28 +++++++++++-------- .../radiation_solver/radiation_molecules.f90 | 1 + .../radiation_solver/radiation_readin.f90 | 5 ++-- .../radiation_solver/radiation_vars.f90 | 1 + 5 files changed, 22 insertions(+), 14 deletions(-) diff --git a/src/radiation/radiation_solver/radiation_atoms.f90 b/src/radiation/radiation_solver/radiation_atoms.f90 index 15f7511d2..129dcaf4b 100644 --- a/src/radiation/radiation_solver/radiation_atoms.f90 +++ b/src/radiation/radiation_solver/radiation_atoms.f90 @@ -111,6 +111,7 @@ SUBROUTINE radiation_atoms(iElem, em_atom) DO iSpec = 1, nSpecies + IF(.NOT.RadiationInput(iSpec)%DoRadiation) CYCLE IF((SpecDSMC(iSpec)%InterID .NE. 1) .AND. (SpecDSMC(iSpec)%InterID .NE. 10)) CYCLE IF((RadiationInput(iSpec)%Telec.LT.10.0).OR.(RadiationInput(iSpec)%NumDens.LT.10.0).OR.(RadiationInput(iSpec)%Ttrans(4).LT.10.0)) CYCLE diff --git a/src/radiation/radiation_solver/radiation_init.f90 b/src/radiation/radiation_solver/radiation_init.f90 index 3126266cd..cd047b99a 100644 --- a/src/radiation/radiation_solver/radiation_init.f90 +++ b/src/radiation/radiation_solver/radiation_init.f90 @@ -66,6 +66,8 @@ SUBROUTINE DefineParametersRadiation() CALL prms%CreateIntOption( 'Part-Species[$]-NuclCharge', 'Nuclear charge:\n'//& '1: neutral atom\n'//& '2: singly ionized atom', '1', numberedmulti=.TRUE.) +CALL prms%CreateLogicalOption('Part-Species[$]-DoRadiation', 'Considering species for radiative emission', '.TRUE.', & + numberedmulti=.TRUE.) CALL prms%CreateRealOption( 'Radiation-MinWaveLen', 'Lower wavelength limit for radiation calculation', '100.0') CALL prms%CreateRealOption( 'Radiation-MaxWaveLen', 'Upper wavelength limit for radiation calculation','1000.0') CALL prms%CreateIntOption( 'Radiation-WaveLenDiscr', 'Number of discretization points', '10000') @@ -132,11 +134,12 @@ SUBROUTINE InitRadiation() IF (RadiationSwitches%RadType.NE.2) THEN DO iSpec = 1, nSpecies + IF(SpecDSMC(iSpec)%InterID.EQ.4) CYCLE WRITE(UNIT=hilf,FMT='(I0)') iSpec RadiationInput(iSpec)%Ttrans(4) = GETREAL('Part-Species'//TRIM(hilf)//'-RadiationTtrans') RadiationInput(iSpec)%Telec = GETREAL('Part-Species'//TRIM(hilf)//'-RadiationTelec') RadiationInput(iSpec)%NumDens = GETREAL('Part-Species'//TRIM(hilf)//'-RadiationNumDens') - IF(SpecDSMC(iSpec)%InterID.EQ.2) THEN + IF((SpecDSMC(iSpec)%InterID.EQ.2) .OR. (SpecDSMC(iSpec)%InterID.EQ.20)) THEN RadiationInput(iSpec)%Tvib = GETREAL('Part-Species'//TRIM(hilf)//'-RadiationTvib') RadiationInput(iSpec)%Trot = GETREAL('Part-Species'//TRIM(hilf)//'-RadiationTrot') END IF @@ -145,6 +148,8 @@ SUBROUTINE InitRadiation() RadiationInput(iSpec)%Mass = GETREAL('Part-Species'//TRIM(hilf)//'-RadiationMass_u') RadiationInput(iSpec)%Mass = RadiationInput(iSpec)%Mass*1.660539040E-27 + RadiationInput(iSpec)%DoRadiation = GETLOGICAL('Part-Species'//TRIM(hilf)//'-DoRadiation') + IF((SpecDSMC(iSpec)%InterID .EQ. 1) .OR. (SpecDSMC(iSpec)%InterID .EQ. 10)) THEN !Only for atoms (1) and atomic ions (10) CALL Radiation_readin_atoms(iSpec) RadiationInput(iSpec)%Radius = GETREAL('Part-Species'//TRIM(hilf)//'-RadiationRadius_A') @@ -369,7 +374,14 @@ SUBROUTINE MacroscopicRadiationInput() END DO IF(.NOT.RadiationSwitches%UseElectronicExcitation) THEN - iSpecElectrons = 11 + iSpecElectrons = 0 + DO iSpec = 1, nSpecies + IF (SpecDSMC(iSpec)%InterID .EQ. 4) iSpecElectrons = iSpec + END DO + IF (iSpecElectrons .EQ. 0) THEN + PRINT*, "unknown species number for electrons while reading flow field data" + STOP + END IF IndexElectronTemp = (iSpecElectrons-1)*DSMC_NVARS+1 + 11 !132 for 11th Species DO iSpec = 1, nSpecies DO iElem = 1, nElems @@ -377,17 +389,11 @@ SUBROUTINE MacroscopicRadiationInput() IF((SpecDSMC(iSpec)%InterID .EQ. 1) .OR. (SpecDSMC(iSpec)%InterID .EQ. 10) .OR. & (SpecDSMC(iSpec)%InterID .EQ. 2) .OR. (SpecDSMC(iSpec)%InterID .EQ. 20)) THEN MacroRadInputParameters(CNElemID,iSpec,4) = MAX(0.,ElemData_HDF5(IndexElectronTemp,iElem)) + ELSE IF(SpecDSMC(iSpec)%InterID .EQ. 4) THEN + ! MacroRadInputParameters(CNElemID,iSpec,4) = MacroRadInputParameters(CNElemID,iSpec,4) ELSE - print*, "excitation temperature cannot be matched, unknown InterID for species", iSpec + PRINT*, "excitation temperature cannot be matched, unknown InterID for species", iSpec END IF -! IF((SpecDSMC(iSpec)%InterID .EQ. 1) .OR. (SpecDSMC(iSpec)%InterID .EQ. 10)) THEN -! MacroRadInputParameters(CNElemID,iSpec,4) = MAX(0.,ElemData_HDF5(IndexElectronTemp,iElem)) -! ELSEIF((SpecDSMC(iSpec)%InterID .EQ. 2) .OR. (SpecDSMC(iSpec)%InterID .EQ. 20)) THEN -! MacroRadInputParameters(CNElemID,iSpec,4) = SQRT(MacroRadInputParameters(CNElemID,iSpec,2) & -! * MAX(0.,ElemData_HDF5(IndexElectronTemp,iElem))) -! ELSE -! print*, "excitation temperature cannot be matched, unknown InterID for species", iSpec -! END IF END DO END DO END IF diff --git a/src/radiation/radiation_solver/radiation_molecules.f90 b/src/radiation/radiation_solver/radiation_molecules.f90 index e4f18f959..c61f9c893 100644 --- a/src/radiation/radiation_solver/radiation_molecules.f90 +++ b/src/radiation/radiation_solver/radiation_molecules.f90 @@ -133,6 +133,7 @@ SUBROUTINE radiation_molecules(iElem, em_mol) iend = 1 DO iSpec = 1, nSpecies + IF(.NOT.RadiationInput(iSpec)%DoRadiation) CYCLE IF((SpecDSMC(iSpec)%InterID .NE. 2) .AND. (SpecDSMC(iSpec)%InterID .NE. 20)) CYCLE Radiation_Profile = 0.0 IF ((RadiationInput(iSpec)%Telec.LT.10.0).OR.(RadiationInput(iSpec)%Tvib.LT.10.0).OR.(RadiationInput(iSpec)%NumDens.LT.10.0).OR.(RadiationInput(iSpec)%Ttrans(4).LT.10.0))CYCLE diff --git a/src/radiation/radiation_solver/radiation_readin.f90 b/src/radiation/radiation_solver/radiation_readin.f90 index 27f02d09b..94352b2e5 100644 --- a/src/radiation/radiation_solver/radiation_readin.f90 +++ b/src/radiation/radiation_solver/radiation_readin.f90 @@ -109,9 +109,8 @@ SUBROUTINE Radiation_readin_atoms(iSpec) SWRITE(*,'(A6,I6,A17)') ' Found ',SpeciesRadiation(iSpec)%nLines,' Line entries in File:' SWRITE(*,*) RadiationInput(iSpec)%RadiationSpectraFileName - CLOSE(unit=42) -END IF - + CLOSE(unit=42) + END IF END SUBROUTINE Radiation_readin_atoms diff --git a/src/radiation/radiation_solver/radiation_vars.f90 b/src/radiation/radiation_solver/radiation_vars.f90 index 344bcebb1..bd86dd126 100644 --- a/src/radiation/radiation_solver/radiation_vars.f90 +++ b/src/radiation/radiation_solver/radiation_vars.f90 @@ -35,6 +35,7 @@ MODULE MOD_Radiation_Vars REAL :: Starkex ! Exponent for Stark broadening INTEGER :: NuclCharge ! nuclear charge (0: atom, 1: single-ionized atom, ...) CHARACTER(LEN=256) :: RadiationSpectraFileName + LOGICAL :: DoRadiation ! Flag to consider/cycle species END TYPE TYPE(tRadiationInput), ALLOCATABLE :: RadiationInput(:) From 0578c90c40e16fd67ddf0752169e383b6e998793 Mon Sep 17 00:00:00 2001 From: Julian Beyer Date: Fri, 11 Mar 2022 13:11:35 +0100 Subject: [PATCH 027/495] bugfix if no mass is available -> using DSMC inputs --- .../radiation_solver/radiation_atoms.f90 | 21 ++++++++----------- .../radiation_solver/radiation_continuum.f90 | 10 ++++----- .../radiation_solver/radiation_excitation.f90 | 2 ++ .../radiation_solver/radiation_init.f90 | 7 ++----- .../radiation_solver/radiation_molecules.f90 | 12 +++++------ .../radiation_solver/radiation_vars.f90 | 1 - 6 files changed, 24 insertions(+), 29 deletions(-) diff --git a/src/radiation/radiation_solver/radiation_atoms.f90 b/src/radiation/radiation_solver/radiation_atoms.f90 index 129dcaf4b..d46a6cd5a 100644 --- a/src/radiation/radiation_solver/radiation_atoms.f90 +++ b/src/radiation/radiation_solver/radiation_atoms.f90 @@ -46,7 +46,7 @@ SUBROUTINE radiation_atoms(iElem, em_atom) USE MOD_Radiation_Vars, ONLY : RadiationInput, RadiationParameter, SpeciesRadiation, & Radiation_Emission_spec, Radiation_Absorption_spec, & NumDensElectrons, Radiation_ElemEnergy_Species - USE MOD_Particle_Vars, ONLY : nSpecies + USE MOD_Particle_Vars, ONLY : nSpecies, Species USE MOD_Globals_Vars, ONLY : c, Pi USE MOD_DSMC_Vars, ONLY : SpecDSMC !USE MOD_Radiation_Excitation, ONLY : low_IonizationPot @@ -100,7 +100,7 @@ SUBROUTINE radiation_atoms(iElem, em_atom) ntot = 0.0 DO jSpec = 1, nSpecies - rho = rho + RadiationInput(jSpec)%NumDens * RadiationInput(jSpec)%Mass + rho = rho + RadiationInput(jSpec)%NumDens * Species(jSpec)%MassIC ntot = ntot + RadiationInput(jSpec)%NumDens END DO @@ -136,17 +136,14 @@ SUBROUTINE radiation_atoms(iElem, em_atom) coll_freq_ij=0.0 DO jSpec = 1, nSpecies sigma_ij = Pi*(RadiationInput(iSpec)%Radius + RadiationInput(jSpec)%Radius)**2 - T_mean = (RadiationInput(iSpec)%Mass*RadiationInput(iSpec)%NumDens*RadiationInput(iSpec)%Ttrans(4)+ & - RadiationInput(jSpec)%Mass*RadiationInput(jSpec)%NumDens*RadiationInput(jSpec)%Ttrans(4)) / & - (RadiationInput(iSpec)%Mass*RadiationInput(iSpec)%NumDens+RadiationInput(jSpec)%Mass*RadiationInput(jSpec)%NumDens) + T_mean = (Species(iSpec)%MassIC*RadiationInput(iSpec)%NumDens*RadiationInput(iSpec)%Ttrans(4)+ & + Species(jSpec)%MassIC*RadiationInput(jSpec)%NumDens*RadiationInput(jSpec)%Ttrans(4)) / & + (Species(iSpec)%MassIC*RadiationInput(iSpec)%NumDens+Species(jSpec)%MassIC*RadiationInput(jSpec)%NumDens) coll_freq_ij = coll_freq_ij + 2.0 * RadiationInput(iSpec)%NumDens * RadiationInput(jSpec)%NumDens * sigma_ij & - * SQRT(2*BoltzmannConst * T_mean * (RadiationInput(iSpec)%Mass + RadiationInput(jSpec)%Mass) & - / (Pi*RadiationInput(iSpec)%Mass*RadiationInput(jSpec)%Mass)) - ! coll_freq_ij = coll_freq_ij + 2.0 * RadiationInput(iSpec)%NumDens * RadiationInput(iSpec)%NumDens * sigma_ij & - ! * SQRT(2*BoltzmannConst* RadiationInput(iSpec)%Ttrans(4) * (RadiationInput(iSpec)%Mass + RadiationInput(jSpec)%Mass) & - ! / (Pi*RadiationInput(iSpec)%Mass*RadiationInput(jSpec)%Mass)) + * SQRT(2*BoltzmannConst * T_mean * (Species(iSpec)%MassIC + Species(jSpec)%MassIC) & + / (Pi*Species(iSpec)%MassIC*Species(jSpec)%MassIC)) END DO - +! PRINT*, sigma_ij, T_mean, coll_freq_ij nLines_considered = 0 ! --- loop over all transition lines @@ -194,7 +191,7 @@ SUBROUTINE radiation_atoms(iElem, em_atom) Dlaml = Dlams + Dlamvw + Dlamn + Dlamp + Dlamr ! --- Doppler broadening - Dlamd = c_dopp*SpeciesRadiation(iSpec)%LinesReal(k,1)*SQRT(RadiationInput(iSpec)%Ttrans(4)/RadiationInput(iSpec)%Mass ) + Dlamd = c_dopp*SpeciesRadiation(iSpec)%LinesReal(k,1)*SQRT(RadiationInput(iSpec)%Ttrans(4)/Species(iSpec)%MassIC ) ! --- determine actual wavelength range to be calculated wrange = 100. * MAX(Dlaml,Dlamd) diff --git a/src/radiation/radiation_solver/radiation_continuum.f90 b/src/radiation/radiation_solver/radiation_continuum.f90 index 9ac873e16..ba3b012ed 100644 --- a/src/radiation/radiation_solver/radiation_continuum.f90 +++ b/src/radiation/radiation_solver/radiation_continuum.f90 @@ -170,7 +170,7 @@ SUBROUTINE Radiation_continuum_bf(iElem) !=================================================================================================================================== ! MODULES USE MOD_Globals_Vars, ONLY : BoltzmannConst, PlanckConst, ElementaryCharge, ElectronMass, BohrRadius, Pi - USE MOD_Particle_Vars, ONLY : nSpecies + USE MOD_Particle_Vars, ONLY : nSpecies, Species USE MOD_Radiation_Vars, ONLY : RadiationInput, SpeciesRadiation, RadiationParameter, & Radiation_Emission_spec, Radiation_Absorption_spec, NumDensElectrons USE MOD_Globals_Vars, ONLY : c @@ -210,7 +210,7 @@ SUBROUTINE Radiation_continuum_bf(iElem) ! --- determine ionized species DO jAtom = 1, nSpecies ! TODO nAtoms instead of nSpecies IF((SpecDSMC(jAtom)%InterID .NE. 1) .AND. (SpecDSMC(jAtom)%InterID .NE. 10)) CYCLE - IF((RadiationInput(iAtom)%Mass .EQ. RadiationInput(jAtom)%Mass) & + IF((Species(iAtom)%MassIC .EQ. Species(jAtom)%MassIC) & .AND. (RadiationInput(iAtom)%NuclCharge+1 .EQ. RadiationInput(jAtom)%NuclCharge) ) THEN iIon = jAtom END IF @@ -242,8 +242,8 @@ SUBROUTINE Radiation_continuum_bf(iElem) ! --- assumed degeneracy of the ion geIon = 1.0d0 ! --- equilibrium ground state ion number density - NumDensIon = ((RadiationInput(iAtom)%Mass-ElectronMass) * 2. * Pi * BoltzmannConst/PlanckConst**2. * ElectronMass & - * RadiationInput(1)%Telec / RadiationInput(iAtom)%Mass)**1.5d0 * geIon / SpeciesRadiation(iAtom)%Level(1,1) & + NumDensIon = ((Species(iAtom)%MassIC-ElectronMass) * 2. * Pi * BoltzmannConst/PlanckConst**2. * ElectronMass & + * RadiationInput(1)%Telec / Species(iAtom)%MassIC)**1.5d0 * geIon / SpeciesRadiation(iAtom)%Level(1,1) & * EXP(-ActualIonizationEn/kbTe) * SpeciesRadiation(iAtom)%NumDensExc(1) / MAX(1.0d0, NumDensElectrons) ! PRINT*,'bound-free continuum is approximated using equilibrium considerations! (missing data file for ionized species): ', & ! TRIM(RadiationInput(iAtom)%RadiationSpectraFileName) @@ -252,7 +252,7 @@ SUBROUTINE Radiation_continuum_bf(iElem) ! --- emission coefficient formula is valid for photorecombination from the ion ground state only! epsilonBFFactor = 1.719236e-46 * NumDensElectrons * NumDensIon * RadiationInput(iAtom)%NuclCharge**4. / geIon & - / c * ( RadiationInput(iAtom)%Mass/((RadiationInput(iAtom)%Mass-ElectronMass) * MAX(250., RadiationInput(iAtom)%Telec) ))**1.5 + / c * ( Species(iAtom)%MassIC/((Species(iAtom)%MassIC-ElectronMass) * MAX(250., RadiationInput(iAtom)%Telec) ))**1.5 kappaBFFactor = 2.815401e25 * RadiationInput(iAtom)%NuclCharge**4. DO iWave = 1, RadiationParameter%WaveLenDiscr diff --git a/src/radiation/radiation_solver/radiation_excitation.f90 b/src/radiation/radiation_solver/radiation_excitation.f90 index 59004b8b6..3aacaff90 100644 --- a/src/radiation/radiation_solver/radiation_excitation.f90 +++ b/src/radiation/radiation_solver/radiation_excitation.f90 @@ -70,6 +70,8 @@ SUBROUTINE radiation_excitation() DO iSpec = 1, nSpecies + IF(.NOT.RadiationInput(iSpec)%DoRadiation) CYCLE + ! --- atoms (1) and atomic ions (10) IF((SpecDSMC(iSpec)%InterID .EQ. 1) .OR. (SpecDSMC(iSpec)%InterID .EQ. 10)) THEN IF (RadiationInput(iSpec)%Telec.LE.0.0) CYCLE diff --git a/src/radiation/radiation_solver/radiation_init.f90 b/src/radiation/radiation_solver/radiation_init.f90 index cd047b99a..9d4bb0ec6 100644 --- a/src/radiation/radiation_solver/radiation_init.f90 +++ b/src/radiation/radiation_solver/radiation_init.f90 @@ -59,7 +59,6 @@ SUBROUTINE DefineParametersRadiation() CALL prms%CreateRealOption( 'Part-Species[$]-RadiationTvib', 'Vibrational temperature, K', '0.0', numberedmulti=.TRUE.) CALL prms%CreateRealOption( 'Part-Species[$]-RadiationTrot', 'Rotational temperature, K', '0.0', numberedmulti=.TRUE.) CALL prms%CreateRealOption( 'Part-Species[$]-RadiationIonizationEn', 'Ionization Energy, 1/cm', '0.0', numberedmulti=.TRUE.) -CALL prms%CreateRealOption( 'Part-Species[$]-RadiationMass_u', 'Molar mass, kg/kmol', '0.0', numberedmulti=.TRUE.) CALL prms%CreateRealOption( 'Part-Species[$]-RadiationRadius_A', 'Species radius, A', '0.0', numberedmulti=.TRUE.) CALL prms%CreateRealOption( 'Part-Species[$]-Starkex', 'Exponent for the determination of Stark broadening', & '0.0', numberedmulti=.TRUE.) @@ -103,7 +102,7 @@ SUBROUTINE InitRadiation() USE MOD_Mesh_Vars, ONLY : nElems, nGlobalElems USE MOD_Particle_Mesh_Vars, ONLY : nComputeNodeElems USE MOD_ReadInTools -USE MOD_PARTICLE_Vars, ONLY : nSpecies +USE MOD_PARTICLE_Vars, ONLY : nSpecies, Species USE MOD_Radiation_Vars USE MOD_DSMC_Vars, ONLY : SpecDSMC USE MOD_Radiation_ReadIn, ONLY : Radiation_readin_atoms, Radiation_readin_molecules @@ -145,8 +144,6 @@ SUBROUTINE InitRadiation() END IF RadiationInput(iSpec)%IonizationEn = GETREAL('Part-Species'//TRIM(hilf)//'-RadiationIonizationEn') RadiationInput(iSpec)%IonizationEn = RadiationInput(iSpec)%IonizationEn *PlanckConst*c*100. - RadiationInput(iSpec)%Mass = GETREAL('Part-Species'//TRIM(hilf)//'-RadiationMass_u') - RadiationInput(iSpec)%Mass = RadiationInput(iSpec)%Mass*1.660539040E-27 RadiationInput(iSpec)%DoRadiation = GETLOGICAL('Part-Species'//TRIM(hilf)//'-DoRadiation') @@ -390,7 +387,7 @@ SUBROUTINE MacroscopicRadiationInput() (SpecDSMC(iSpec)%InterID .EQ. 2) .OR. (SpecDSMC(iSpec)%InterID .EQ. 20)) THEN MacroRadInputParameters(CNElemID,iSpec,4) = MAX(0.,ElemData_HDF5(IndexElectronTemp,iElem)) ELSE IF(SpecDSMC(iSpec)%InterID .EQ. 4) THEN - ! MacroRadInputParameters(CNElemID,iSpec,4) = MacroRadInputParameters(CNElemID,iSpec,4) + CYCLE ELSE PRINT*, "excitation temperature cannot be matched, unknown InterID for species", iSpec END IF diff --git a/src/radiation/radiation_solver/radiation_molecules.f90 b/src/radiation/radiation_solver/radiation_molecules.f90 index c61f9c893..47a6888b7 100644 --- a/src/radiation/radiation_solver/radiation_molecules.f90 +++ b/src/radiation/radiation_solver/radiation_molecules.f90 @@ -46,7 +46,7 @@ SUBROUTINE radiation_molecules(iElem, em_mol) USE MOD_Radiation_Vars, ONLY : RadiationInput, RadiationParameter, SpeciesRadiation, & Radiation_Emission_spec, Radiation_Absorption_spec, NumDensElectrons, TElectrons, & Radiation_ElemEnergy_Species - USE MOD_Particle_Vars, ONLY : nSpecies + USE MOD_Particle_Vars, ONLY : nSpecies, Species USE MOD_DSMC_Vars, ONLY : SpecDSMC ! IMPLICIT VARIABLE HANDLING @@ -115,7 +115,7 @@ SUBROUTINE radiation_molecules(iElem, em_mol) ptot = 0.0 DO iSpec = 1, nSpecies - rho = rho + RadiationInput(iSpec)%NumDens * RadiationInput(iSpec)%Mass + rho = rho + RadiationInput(iSpec)%NumDens * Species(iSpec)%MassIC ptot = ptot + RadiationInput(iSpec)%NumDens * BoltzmannConst * RadiationInput(iSpec)%Ttrans(4) END DO ptot = ptot + NumDensElectrons * BoltzmannConst * TElectrons ! TODO: isp -> should be electrons? Radiation: NumDens(N2), Telec @@ -150,7 +150,7 @@ SUBROUTINE radiation_molecules(iElem, em_mol) 1.0D-40*ptot/(RadiationInput(iSpec)%Ttrans(4)*BoltzmannConst)) MolWeightForeignGas = 20. * AtomicMassUnit - IF(rho .GT. 1.0E-16) MolWeightForeignGas = (rho - RadiationInput(iSpec)%Mass*RadiationInput(iSpec)%NumDens) / NumDensForeignGas + IF(rho .GT. 1.0E-16) MolWeightForeignGas = (rho - Species(iSpec)%MassIC*RadiationInput(iSpec)%NumDens) / NumDensForeignGas MolWeightForeignGas = MolWeightForeignGas / (AtomicMassUnit * 1.0E-3) IF(MolWeightForeignGas .LT. 10.*1.0E-3*AtomicMassUnit) MolWeightForeignGas = 10. * 1.0E-3 * AtomicMassUnit IF(MolWeightForeignGas .GT. 28.85*1.0E-3*AtomicMassUnit) MolWeightForeignGas = 28.85* 1.0E-3 * AtomicMassUnit @@ -212,11 +212,11 @@ SUBROUTINE radiation_molecules(iElem, em_mol) IF( (0.5/(100.*nubar0)) .GT. RadiationParameter%WaveLen(RadiationParameter%WaveLenDiscr) ) CYCLE ! --- widths - DlamG = 7.16E-7 / (100.*nubar0) * SQRT(RadiationInput(iSpec)%Ttrans(4)/(RadiationInput(iSpec)%Mass/AtomicMassUnit)) + DlamG = 7.16E-7 / (100.*nubar0) * SQRT(RadiationInput(iSpec)%Ttrans(4)/(Species(iSpec)%MassIC/AtomicMassUnit)) - DlamL1 = 1.33E-29 * SQRT(2.0/(RadiationInput(iSpec)%Mass/AtomicMassUnit)) & + DlamL1 = 1.33E-29 * SQRT(2.0/(Species(iSpec)%MassIC/AtomicMassUnit)) & * (0.01/nubar0)**2 * SQRT(RadiationInput(iSpec)%Ttrans(4)) * RadiationInput(iSpec)%NumDens * 1.0E-6 * 10. * 1.0E10 - DlamL2 = 5.85E-30 * SQRT(1.0/(RadiationInput(iSpec)%Mass/AtomicMassUnit)+1./(MolWeightForeignGas/(AtomicMassUnit*1.0E-3))) & + DlamL2 = 5.85E-30 * SQRT(1.0/(Species(iSpec)%MassIC/AtomicMassUnit)+1./(MolWeightForeignGas/(AtomicMassUnit*1.0E-3))) & * (0.01/nubar0)**2 * SQRT(RadiationInput(iSpec)%Ttrans(4)) * NumDensForeignGas * 1.0E-6 * 10. * 1.0E10 DlamL3 = 1.18E-4 * 1.0E-10 DlamL4 = 1.0E-8 * Stark * (1.0E-22 * MAX(NumDensElectrons, 1.E-6))**0.6 * (0.01/nubar0)**2 * 1.0E10 diff --git a/src/radiation/radiation_solver/radiation_vars.f90 b/src/radiation/radiation_solver/radiation_vars.f90 index bd86dd126..f04b710e4 100644 --- a/src/radiation/radiation_solver/radiation_vars.f90 +++ b/src/radiation/radiation_solver/radiation_vars.f90 @@ -30,7 +30,6 @@ MODULE MOD_Radiation_Vars REAL :: Trot ! Rotational Temp REAL :: Telec ! Electronic Temp REAL :: IonizationEn ! ionization energy [1/cm] - REAL :: Mass REAL :: Radius REAL :: Starkex ! Exponent for Stark broadening INTEGER :: NuclCharge ! nuclear charge (0: atom, 1: single-ionized atom, ...) From efe7090e123d616b0003c14347c83c26215d8aa0 Mon Sep 17 00:00:00 2001 From: Marcel Pfeiffer Date: Fri, 11 Mar 2022 17:57:07 +0100 Subject: [PATCH 028/495] output with wavelength --- src/radiation/radiation_solver/radiation_init.f90 | 13 +++++++++++-- src/radiation/radiation_solver/radiation_vars.f90 | 2 ++ .../radiative_transfer/radtrans_output.f90 | 12 +++++++++--- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/radiation/radiation_solver/radiation_init.f90 b/src/radiation/radiation_solver/radiation_init.f90 index 9d4bb0ec6..98822350e 100644 --- a/src/radiation/radiation_solver/radiation_init.f90 +++ b/src/radiation/radiation_solver/radiation_init.f90 @@ -173,6 +173,8 @@ SUBROUTINE InitRadiation() RadiationParameter%WaveLenDiscrCoarse = NINT(REAL(RadiationParameter%WaveLenDiscr)/ REAL(RadiationParameter%WaveLenReductionFactor)) RadiationParameter%WaveLenReductionFactor = INT(RadiationParameter%WaveLenDiscr/RadiationParameter%WaveLenDiscrCoarse) SWRITE(UNIT_stdOut,'(A)') 'Corrected WaveLenReductionFactor is ', RadiationParameter%WaveLenReductionFactor + ALLOCATE(RadiationParameter%WaveLenCoarse(RadiationParameter%WaveLenDiscrCoarse)) + RadiationParameter%WaveLenCoarse = 0.0 ELSE RadiationParameter%WaveLenDiscrCoarse = RadiationParameter%WaveLenDiscr END IF @@ -195,6 +197,13 @@ SUBROUTINE InitRadiation() DO iWaveLen = 1, RadiationParameter%WaveLenDiscr RadiationParameter%WaveLen(iWaveLen) = RadiationParameter%MinWaveLen + (iWaveLen-1) * RadiationParameter%WaveLenIncr END DO +IF (RadiationParameter%WaveLenReductionFactor.NE.1) THEN + RadiationParameter%WaveLenIncrCoarse = (RadiationParameter%MaxWaveLen - RadiationParameter%MinWaveLen) & + / (RadiationParameter%WaveLenDiscr*RadiationParameter%WaveLenReductionFactor-1) + DO iWaveLen = 1, RadiationParameter%WaveLenIncrCoarse + RadiationParameter%WaveLenCoarse(iWaveLen) = RadiationParameter%MinWaveLen + (iWaveLen-1) * RadiationParameter%WaveLenIncrCoarse + END DO +END IF RadiationSwitches%ff = GETLOGICAL('Radiation-ff') RadiationSwitches%bf = GETLOGICAL('Radiation-bf') @@ -380,8 +389,8 @@ SUBROUTINE MacroscopicRadiationInput() STOP END IF IndexElectronTemp = (iSpecElectrons-1)*DSMC_NVARS+1 + 11 !132 for 11th Species - DO iSpec = 1, nSpecies - DO iElem = 1, nElems + DO iElem = 1, nElems + DO iSpec = 1, nSpecies CNElemID = GetCNElemID(iElem+offsetElem) IF((SpecDSMC(iSpec)%InterID .EQ. 1) .OR. (SpecDSMC(iSpec)%InterID .EQ. 10) .OR. & (SpecDSMC(iSpec)%InterID .EQ. 2) .OR. (SpecDSMC(iSpec)%InterID .EQ. 20)) THEN diff --git a/src/radiation/radiation_solver/radiation_vars.f90 b/src/radiation/radiation_solver/radiation_vars.f90 index f04b710e4..ab821bd04 100644 --- a/src/radiation/radiation_solver/radiation_vars.f90 +++ b/src/radiation/radiation_solver/radiation_vars.f90 @@ -49,7 +49,9 @@ MODULE MOD_Radiation_Vars INTEGER :: WaveLenDiscrCoarse ! number of points in calculated spectrum INTEGER :: WaveLenReductionFactor REAL :: WaveLenIncr ! wavelength increments + REAL :: WaveLenIncrCoarse REAL, ALLOCATABLE :: WaveLen(:) ! wavelength array + REAL, ALLOCATABLE :: WaveLenCoarse(:) END TYPE tRadiationParameter TYPE(tRadiationParameter) :: RadiationParameter diff --git a/src/radiation/radiative_transfer/radtrans_output.f90 b/src/radiation/radiative_transfer/radtrans_output.f90 index 3ce152f7b..27f62da6d 100644 --- a/src/radiation/radiative_transfer/radtrans_output.f90 +++ b/src/radiation/radiative_transfer/radtrans_output.f90 @@ -191,9 +191,15 @@ SUBROUTINE WriteRadiationToHDF5() IF (myRank.EQ.0) THEN OPEN(unit=20,file='Radiation_ObservationPoint.csv', status='replace',action='write') WRITE(20,*) 'x,y1,y2' - DO iWave=1, RadiationParameter%WaveLenDiscrCoarse - WRITE(20,*) RadiationParameter%MinWaveLen + (iWave-1) * RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor*1.E10,',',RadObservation_Emission(iWave)/RadObservationPoint%Area,',',RadObservation_EmissionPart(iWave) - END DO + IF (RadiationParameter%WaveLenReductionFactor.NE.1) THEN + DO iWave=1, RadiationParameter%WaveLenDiscrCoarse + WRITE(20,*) RadiationParameter%WaveLenCoarse(iWave)*1.E10,',',RadObservation_Emission(iWave)/RadObservationPoint%Area,',',RadObservation_EmissionPart(iWave) + END DO + ELSE + DO iWave=1, RadiationParameter%WaveLenDiscrCoarse + WRITE(20,*) RadiationParameter%WaveLen(iWave)*1.E10,',',RadObservation_Emission(iWave)/RadObservationPoint%Area,',',RadObservation_EmissionPart(iWave) + END DO + END IF CLOSE(unit=20) END IF END IF From 8bfad8fe0a6acc58a97eef04bd4780e1c9632584 Mon Sep 17 00:00:00 2001 From: Marcel Pfeiffer Date: Thu, 17 Mar 2022 00:07:14 +0100 Subject: [PATCH 029/495] intercept cell edges at position 0, check whether photons intersect sensor disk --- .../radiative_transfer/radtrans_main.f90 | 2 +- .../tracking/radtrans_tools.f90 | 46 ++++++++++++++++++- .../tracking/radtrans_tracking.f90 | 15 ++++-- 3 files changed, 55 insertions(+), 8 deletions(-) diff --git a/src/radiation/radiative_transfer/radtrans_main.f90 b/src/radiation/radiative_transfer/radtrans_main.f90 index 0c0fab73f..083b6d46a 100644 --- a/src/radiation/radiative_transfer/radtrans_main.f90 +++ b/src/radiation/radiative_transfer/radtrans_main.f90 @@ -151,7 +151,7 @@ SUBROUTINE RadTrans_main() IF(MPIroot.AND.(MOD(photVisCount,PhotDisp).EQ.0)) CALL PrintStatusLineRadiation(REAL(photVisCount),REAL(1),REAL(LocPhotNum),.TRUE.) photVisCount = photVisCount + 1 PhotonProps%PhotonPos(1:3) = SetPhotonPos(iElem, globPhotNum) - PhotonProps%PhotonLastPos(1:3) = PhotonProps%PhotonPos(1:3) + PhotonProps%PhotonLastPos(1:3) = PhotonProps%PhotonPos(1:3) PhotonProps%ElemID = GetGlobalElemID(iElem) IF ((photonCount.LT.firstPhoton)) THEN iPhotLoc = firstPhoton - photonCount + iPhot - 1 diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tools.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tools.f90 index 5cede8ce3..34fd8cf6a 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tools.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tools.f90 @@ -26,7 +26,7 @@ MODULE MOD_Photon_TrackingTools END INTERFACE PUBLIC :: PhotonThroughSideCheck3DFast, PhotonIntersectionWithSide, CalcAbsoprtion, PerfectPhotonReflection, DiffusePhotonReflection -PUBLIC :: CalcWallAbsoprtion, PointInObsCone +PUBLIC :: CalcWallAbsoprtion, PointInObsCone, PhotonIntersectSensor PUBLIC :: PhotonIntersectionWithSide2D, RotatePhotonIn2DPlane, PerfectPhotonReflection2D,DiffusePhotonReflection2D !----------------------------------------------------------------------------------------------------------------------------------- !----------------------------------------------------------------------------------------------------------------------------------- @@ -172,7 +172,7 @@ SUBROUTINE PhotonIntersectionWithSide2D(iLocSide,Element,ThroughSide,Intersectio yNode1 = NodeCoords_Shared(2,ElemSideNodeID2D_Shared(1,iLocSide, CNElemID)) xNode2 = NodeCoords_Shared(1,ElemSideNodeID2D_Shared(2,iLocSide, CNElemID)) yNode2 = NodeCoords_Shared(2,ElemSideNodeID2D_Shared(2,iLocSide, CNElemID)) - + x_photon_start=PhotonProps%PhotonLastPos(1) y_photon_start=PhotonProps%PhotonLastPos(2) @@ -243,6 +243,12 @@ SUBROUTINE PhotonIntersectionWithSide2D(iLocSide,Element,ThroughSide,Intersectio ELSE l=l2; S=S2 END IF + ELSE IF (ALMOSTZERO(S1).AND.ALMOSTZERO(S2)) THEN + IF (ABS(l1).GT.ABS(l2)) THEN + l=l1; S=S1 + ELSE + l=l2; S=S2 + END IF ELSE IF (ABS(S1).GT.ABS(S2)) THEN !though same spot again, caused by numerical inaccuray (discard shorter solution) l=l1; S=S1 ELSE @@ -856,4 +862,40 @@ LOGICAL FUNCTION PointInObsCone(Point) END FUNCTION PointInObsCone +LOGICAL FUNCTION PhotonIntersectSensor(Point, Direction) +!=================================================================================================================================== +! modified particle emmission for LD case +!=================================================================================================================================== +! MODULES + USE MOD_Globals + USE MOD_RadiationTrans_Vars, ONLY: RadObservationPoint +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! INOUTPUT VARIABLES +REAL, INTENT(IN) :: Point(3), Direction(3) +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +REAL :: projectedDist, DirectionVec(3) +!=================================================================================================================================== +PhotonIntersectSensor = .FALSE. + +projectedDist = DOT_PRODUCT(RadObservationPoint%ViewDirection(1:3), Direction(1:3)) +IF (projectedDist.LT.0.0) THEN + DirectionVec(1:3) = RadObservationPoint%MidPoint(1:3) - Point(1:3) + !distance to travel + projectedDist = DOT_PRODUCT(DirectionVec(1:3), RadObservationPoint%ViewDirection(1:3))/projectedDist + ! actual intersection point + DirectionVec(1:3) = Point(1:3) + projectedDist*Direction(1:3) + !Vector from midpoint of sensor + DirectionVec(1:3) = DirectionVec(1:3) - RadObservationPoint%MidPoint(1:3) + !distance to midpoint + projectedDist = VECNORM(DirectionVec(1:3)) + IF (projectedDist.LE.RadObservationPoint%Diameter/2.) PhotonIntersectSensor = .TRUE. +END IF + +END FUNCTION PhotonIntersectSensor + END MODULE MOD_Photon_TrackingTools diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 index 78eb623e7..60383248e 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 @@ -318,6 +318,7 @@ SUBROUTINE Photon2DSymTracking() USE MOD_RadiationTrans_Vars, ONLY:PhotonProps, RadObservation_Emission, CalcRadObservationPoint,RadObservation_EmissionPart USE MOD_Photon_TrackingTools, ONLY:CalcAbsoprtion, CalcWallAbsoprtion, DiffusePhotonReflection2D, PointInObsCone USE MOD_Photon_TrackingTools, ONLY:PhotonIntersectionWithSide2D, RotatePhotonIn2DPlane, PerfectPhotonReflection2D +USE MOD_Photon_TrackingTools, ONLY:PhotonIntersectSensor IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES @@ -325,7 +326,7 @@ SUBROUTINE Photon2DSymTracking() ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -INTEGER :: NbElemID, ind, nbSideID, nMortarElems, BCType, NblocSideID +INTEGER :: NbElemID, ind, nbSideID, nMortarElems, BCType, NblocSideID, OrigElem INTEGER :: ElemID, OldElemID, LocalSide, NrOfThroughSides, localSideID, nlocSides INTEGER :: SideID, TempSideID, iLocSide, correctSide, LastSide INTEGER :: LocSidesTemp(1:6), GlobSideTemp(1:6) @@ -334,6 +335,7 @@ SUBROUTINE Photon2DSymTracking() !=================================================================================================================================== Done = .FALSE. ElemID = PhotonProps%ElemID +OrigElem = ElemID SideID = 0 LastSide = 0 ! 1) Loop tracking until Photon is considered "done" (either absorbed or deleted) @@ -412,6 +414,7 @@ SUBROUTINE Photon2DSymTracking() IPWRITE(*,*) 'LastPos: ', PhotonProps%PhotonLastPos(1:3) IPWRITE(*,*) 'Pos: ', PhotonProps%PhotonPos(1:3) IPWRITE(*,*) 'Direction:', PhotonProps%PhotonDirection(1:3) + IPWRITE(*,*) 'OrigElem:', OrigElem IPWRITE(*,*) 'Photon deleted!' Done = .TRUE. EXIT @@ -432,10 +435,12 @@ SUBROUTINE Photon2DSymTracking() CASE(1) !PartBound%OpenBC) CALL CalcAbsoprtion(IntersectionPos(1:3),ElemID, DONE) DONE = .TRUE. - IF (CalcRadObservationPoint) THEN + IF (CalcRadObservationPoint) THEN IF (PointInObsCone(IntersectionPos(1:3))) THEN - RadObservation_Emission(PhotonProps%WaveLength) = RadObservation_Emission(PhotonProps%WaveLength) + PhotonProps%PhotonEnergy - RadObservation_EmissionPart(PhotonProps%WaveLength) = RadObservation_EmissionPart(PhotonProps%WaveLength) + 1 + IF (PhotonIntersectSensor(IntersectionPos(1:3), PhotonProps%PhotonDirection(1:3))) THEN + RadObservation_Emission(PhotonProps%WaveLength) = RadObservation_Emission(PhotonProps%WaveLength) + PhotonProps%PhotonEnergy + RadObservation_EmissionPart(PhotonProps%WaveLength) = RadObservation_EmissionPart(PhotonProps%WaveLength) + 1 + END IF END IF END IF CYCLE @@ -465,7 +470,7 @@ SUBROUTINE Photon2DSymTracking() LastSide = SideInfo_Shared(SIDE_NBSIDEID,SideID) END IF END IF ! BC(SideID).GT./.LE. 0 - + IF (.NOT.DONE) CALL RotatePhotonIn2DPlane(IntersectionPos(1:3)) IF (ElemID.LT.1) THEN CALL abort(& From 071510dabf3f94ac229090c0e7e8d0795c092bfc Mon Sep 17 00:00:00 2001 From: Marcel Pfeiffer Date: Thu, 7 Apr 2022 13:55:57 +0200 Subject: [PATCH 030/495] more meaningful console output --- .../radiative_transfer/radtrans_init.f90 | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/radiation/radiative_transfer/radtrans_init.f90 b/src/radiation/radiative_transfer/radtrans_init.f90 index 1e68c1dba..d629e9425 100644 --- a/src/radiation/radiative_transfer/radtrans_init.f90 +++ b/src/radiation/radiative_transfer/radtrans_init.f90 @@ -78,15 +78,15 @@ SUBROUTINE InitRadiationTransport() USE MOD_DSMC_Vars, ONLY: RadialWeighting USE MOD_Output, ONLY: PrintStatusLineRadiation USE MOD_Mesh_Tools, ONLY : GetGlobalElemID -USE MOD_Particle_Vars, ONLY : Symmetry +USE MOD_Particle_Vars, ONLY : Symmetry, nSpecies USE MOD_MPI_Shared_Vars USE MOD_MPI_Shared USE MOD_Particle_Mesh_Build, ONLY: BuildMesh2DInfo USE MOD_SuperB_Tools, ONLY: FindLinIndependentVectors, GramSchmidtAlgo #if USE_MPI USE MOD_RadiationTrans_Vars, ONLY : RadTransObsVolumeFrac_Shared_Win, RadTransObsVolumeFrac_Shared -USE MOD_Radiation_Vars, ONLY : Radiation_Absorption_Spec_Shared, Radiation_Absorption_Spec_Shared_Win -USE MOD_Radiation_Vars, ONLY : Radiation_Emission_Spec_Shared_Win, Radiation_Emission_Spec_Shared +USE MOD_Radiation_Vars, ONLY : Radiation_Absorption_Spec_Shared, Radiation_Absorption_Spec_Shared_Win, RadiationInput +USE MOD_Radiation_Vars, ONLY : Radiation_Emission_Spec_Shared_Win, Radiation_Emission_Spec_Shared, MacroRadInputParameters #endif ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -96,8 +96,8 @@ SUBROUTINE InitRadiationTransport() ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -INTEGER :: iWave, iElem, firstElem, lastElem, ElemDisp -REAL :: LocTemp, ObsLengt +INTEGER :: iWave, iElem, firstElem, lastElem, ElemDisp, DisplRank, iSpec +REAL :: LocTemp, ObsLengt, MaxSumTemp(2), GlobalMaxTemp(2) LOGICAL :: ElemInCone !=================================================================================================================================== SWRITE(UNIT_StdOut,'(132("-"))') @@ -194,16 +194,27 @@ SUBROUTINE InitRadiationTransport() #if USE_MPI firstElem = INT(REAL( myComputeNodeRank *nComputeNodeElems)/REAL(nComputeNodeProcessors))+1 lastElem = INT(REAL((myComputeNodeRank+1)*nComputeNodeElems)/REAL(nComputeNodeProcessors)) + MaxSumTemp(2) = REAL(myRank) + MaxSumTemp(1) = 0.0 + DO iSpec = 1, nSpecies + IF(.NOT.RadiationInput(iSpec)%DoRadiation) CYCLE + MaxSumTemp(1) = MaxSumTemp(1) + SUM(MacroRadInputParameters(firstElem:lastElem,iSpec,4)) + END DO + CALL MPI_ALLREDUCE(MaxSumTemp, GlobalMaxTemp, 1, MPI_2DOUBLE_PRECISION, MPI_MAXLOC,MPI_COMM_WORLD,iError) + DisplRank = NINT(GlobalMaxTemp(2)) #else firstElem = 1 lastElem = nElems + DisplRank = 0 #endif SELECT CASE(RadiationSwitches%RadType) CASE(1) !calls radition solver module SWRITE(UNIT_stdOut,'(A)') ' Calculate Radiation Data per Cell ...' ElemDisp = INT((lastElem-firstElem+1)/20) + ElemDisp = MAX(10,ElemDisp) + DO iElem = firstElem, lastElem - IF(MPIroot.AND.(MOD(iElem,ElemDisp).EQ.0)) CALL PrintStatusLineRadiation(REAL(iElem),REAL(firstElem),REAL(lastElem),.FALSE.) + IF((myRank.EQ.DisplRank).AND.(MOD(iElem-firstElem,ElemDisp).EQ.0)) CALL PrintStatusLineRadiation(REAL(iElem),REAL(firstElem),REAL(lastElem),.FALSE.) IF (CalcRadObservationPoint) THEN CALL ElemInObsCone(iElem, ElemInCone) IF (.NOT.ElemInCone) CYCLE From fd7a51d891e8d7a8c53528d5fa27d91c757e0936 Mon Sep 17 00:00:00 2001 From: Marcel Pfeiffer Date: Thu, 7 Apr 2022 14:20:10 +0200 Subject: [PATCH 031/495] add println for procs other then mpiroot --- src/output/output.f90 | 34 +++++++++++-------- .../radiative_transfer/radtrans_init.f90 | 2 +- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/src/output/output.f90 b/src/output/output.f90 index 0b1e6c6e5..295ed4131 100644 --- a/src/output/output.f90 +++ b/src/output/output.f90 @@ -228,7 +228,7 @@ END SUBROUTINE PrintStatusLine !================================================================================================================================== !> Displays the actual status of the simulation !================================================================================================================================== -SUBROUTINE PrintStatusLineRadiation(t,tStart,tEnd,Phot) +SUBROUTINE PrintStatusLineRadiation(t,tStart,tEnd,Phot,outputrank) !----------------------------------------------------------------------------------------------------------------------------------! ! description !----------------------------------------------------------------------------------------------------------------------------------! @@ -244,13 +244,19 @@ SUBROUTINE PrintStatusLineRadiation(t,tStart,tEnd,Phot) REAL,INTENT(IN) :: tStart !< start time of simulation REAL,INTENT(IN) :: tEnd !< end time of simulation LOGICAL, INTENT(IN) :: Phot +INTEGER, INTENT(IN),OPTIONAL :: outputrank !---------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES REAL :: percent,time_remaining,mins,secs,hours,days +INTEGER :: visRank !================================================================================================================================== +IF (PRESENT(outputrank)) THEN + visRank = outputrank +ELSE + visRank = 0 +END IF - -IF(MPIroot)THEN +IF(myRank.EQ.visRank)THEN #ifdef INTEL OPEN(UNIT_stdOut,CARRIAGECONTROL='fortran') #endif @@ -266,17 +272,17 @@ SUBROUTINE PrintStatusLineRadiation(t,tStart,tEnd,Phot) time_remaining = time_remaining / 24 !days = MOD(time_remaining,365.) ! Use this if years are also to be displayed days = time_remaining -IF (Phot) THEN - WRITE(UNIT_stdOut,'(A,E10.4,A,E10.4,A,A,I6,A1,I0.2,A1,I0.2,A1,I0.2,A,A,A,A3,F6.2,A3,A1)',ADVANCE='NO') & - ' Photon = ', t,' TotalPhotons = ', tEnd, ' ', ' eta = ',INT(days),':',INT(hours),':',INT(mins),':',INT(secs),' |',& - REPEAT('☢ ',CEILING(percent/4)),REPEAT(' ',INT((100-percent)/4)),'| [',percent,'%] ',& - ACHAR(13) ! ACHAR(13) is carriage return -ELSE - WRITE(UNIT_stdOut,'(A,E10.4,A,E10.4,A,A,I6,A1,I0.2,A1,I0.2,A1,I0.2,A,A,A,A3,F6.2,A3,A1)',ADVANCE='NO') & - ' Elem = ', t,' TotalElems = ', tEnd, ' ', ' eta = ',INT(days),':',INT(hours),':',INT(mins),':',INT(secs),' |',& - REPEAT('🚀',CEILING(percent/4)),REPEAT(' ',INT((100-percent)/4)),'| [',percent,'%] ',& - ACHAR(13) ! ACHAR(13) is carriage return -END IF + IF (Phot) THEN + WRITE(UNIT_stdOut,'(A,E10.4,A,E10.4,A,A,I6,A1,I0.2,A1,I0.2,A1,I0.2,A,A,A,A3,F6.2,A3,A1)',ADVANCE='NO') & + ' Photon = ', t,' TotalPhotons = ', tEnd, ' ', ' eta = ',INT(days),':',INT(hours),':',INT(mins),':',INT(secs),' |',& + REPEAT('☢ ',CEILING(percent/4)),REPEAT(' ',INT((100-percent)/4)),'| [',percent,'%] ',& + ACHAR(13) ! ACHAR(13) is carriage return + ELSE + WRITE(UNIT_stdOut,'(A,E10.4,A,E10.4,A,A,I6,A1,I0.2,A1,I0.2,A1,I0.2,A,A,A,A3,F6.2,A3,A1)',ADVANCE='NO') & + ' Elem = ', t,' TotalElems = ', tEnd, ' ', ' eta = ',INT(days),':',INT(hours),':',INT(mins),':',INT(secs),' |',& + REPEAT('🚀',CEILING(percent/4)),REPEAT(' ',INT((100-percent)/4)),'| [',percent,'%] ',& + ACHAR(13) ! ACHAR(13) is carriage return + END IF #ifdef INTEL CLOSE(UNIT_stdOut) #endif diff --git a/src/radiation/radiative_transfer/radtrans_init.f90 b/src/radiation/radiative_transfer/radtrans_init.f90 index d629e9425..74800d853 100644 --- a/src/radiation/radiative_transfer/radtrans_init.f90 +++ b/src/radiation/radiative_transfer/radtrans_init.f90 @@ -214,7 +214,7 @@ SUBROUTINE InitRadiationTransport() ElemDisp = MAX(10,ElemDisp) DO iElem = firstElem, lastElem - IF((myRank.EQ.DisplRank).AND.(MOD(iElem-firstElem,ElemDisp).EQ.0)) CALL PrintStatusLineRadiation(REAL(iElem),REAL(firstElem),REAL(lastElem),.FALSE.) + IF((myRank.EQ.DisplRank).AND.(MOD(iElem-firstElem,ElemDisp).EQ.0)) CALL PrintStatusLineRadiation(REAL(iElem),REAL(firstElem),REAL(lastElem),.FALSE.,DisplRank) IF (CalcRadObservationPoint) THEN CALL ElemInObsCone(iElem, ElemInCone) IF (.NOT.ElemInCone) CYCLE From 0c4fef8a7d5a9f805ffa7b27308b2edb5bdc8fc9 Mon Sep 17 00:00:00 2001 From: Marcel Pfeiffer Date: Thu, 7 Apr 2022 15:47:22 +0200 Subject: [PATCH 032/495] load blancing for each node --- .../radiation_solver/radiation_readin.f90 | 1 - .../radiative_transfer/radtrans_init.f90 | 41 ++++++++++++++++++- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/src/radiation/radiation_solver/radiation_readin.f90 b/src/radiation/radiation_solver/radiation_readin.f90 index 94352b2e5..0155bc4b8 100644 --- a/src/radiation/radiation_solver/radiation_readin.f90 +++ b/src/radiation/radiation_solver/radiation_readin.f90 @@ -144,7 +144,6 @@ SUBROUTINE Radiation_readin_molecules(iSpec) RadiationInput(iSpec)%RadiationSpectraFileName = GETSTR('Radiation-Species'//TRIM(hilf)//'-SpectraFileName','none') IF (RadiationInput(iSpec)%RadiationSpectraFileName.EQ.'none') THEN SpeciesRadiation(iSpec)%nBands = 0 - print*, 'Nope' ! STOP END IF diff --git a/src/radiation/radiative_transfer/radtrans_init.f90 b/src/radiation/radiative_transfer/radtrans_init.f90 index 74800d853..f700b7756 100644 --- a/src/radiation/radiative_transfer/radtrans_init.f90 +++ b/src/radiation/radiative_transfer/radtrans_init.f90 @@ -96,7 +96,7 @@ SUBROUTINE InitRadiationTransport() ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -INTEGER :: iWave, iElem, firstElem, lastElem, ElemDisp, DisplRank, iSpec +INTEGER :: iWave, iElem, firstElem, lastElem, ElemDisp, DisplRank, iSpec, currentRank REAL :: LocTemp, ObsLengt, MaxSumTemp(2), GlobalMaxTemp(2) LOGICAL :: ElemInCone !=================================================================================================================================== @@ -194,6 +194,45 @@ SUBROUTINE InitRadiationTransport() #if USE_MPI firstElem = INT(REAL( myComputeNodeRank *nComputeNodeElems)/REAL(nComputeNodeProcessors))+1 lastElem = INT(REAL((myComputeNodeRank+1)*nComputeNodeElems)/REAL(nComputeNodeProcessors)) + IF (nComputeNodeElems.NE.nComputeNodeProcessors) THEN + MaxSumTemp(1) = 0.0 + DO iSpec = 1, nSpecies + IF(.NOT.RadiationInput(iSpec)%DoRadiation) CYCLE + MaxSumTemp(1) = MaxSumTemp(1) + SUM(MacroRadInputParameters(firstElem:lastElem,iSpec,4)) + END DO + CALL MPI_ALLREDUCE(MaxSumTemp(1), GlobalMaxTemp(1), 1, MPI_DOUBLE_PRECISION, MPI_SUM,MPI_COMM_SHARED,iError) + GlobalMaxTemp(1) = GlobalMaxTemp(1) / REAL(nComputeNodeProcessors) + MaxSumTemp(1) = 0.0 + currentRank = 0 + firstElem = 1 + ElemLoop: DO iElem = 1, nComputeNodeElems + DO iSpec = 1, nSpecies + IF(.NOT.RadiationInput(iSpec)%DoRadiation) CYCLE + MaxSumTemp(1) = MaxSumTemp(1) + MacroRadInputParameters(iElem,iSpec,4) + END DO + IF ((nComputeNodeElems - iElem).EQ.(nComputeNodeProcessors - currentRank - 1)) THEN + currentRank = currentRank + 1 + IF (currentRank.EQ.myComputeNodeRank) THEN + firstElem = iElem + 1 + lastElem = iElem + 1 + EXIT ElemLoop + ELSE + CYCLE ElemLoop + END IF + END IF + IF (MaxSumTemp(1).GE.GlobalMaxTemp(1)) THEN + currentRank = currentRank + 1 + IF (currentRank.GT.myComputeNodeRank) THEN + lastElem = iElem + EXIT ElemLoop + END IF + IF (currentRank.EQ.myComputeNodeRank) firstElem = MIN(iElem+1, nComputeNodeElems) + MaxSumTemp(1) = 0.0 + END IF + END DO ElemLoop + IF (myRank+1.EQ.nComputeNodeProcessors) lastElem = nComputeNodeElems + END IF + MaxSumTemp(2) = REAL(myRank) MaxSumTemp(1) = 0.0 DO iSpec = 1, nSpecies From 81e114182a4d141a504c183139646d2683d908d6 Mon Sep 17 00:00:00 2001 From: hildf Date: Tue, 12 Apr 2022 16:33:48 +0200 Subject: [PATCH 033/495] alpha per species for energy conservation --- src/particles/bgk/bgk_colloperator.f90 | 52 ++++++++++++++++---------- 1 file changed, 32 insertions(+), 20 deletions(-) diff --git a/src/particles/bgk/bgk_colloperator.f90 b/src/particles/bgk/bgk_colloperator.f90 index 6efe8571c..113905ae9 100644 --- a/src/particles/bgk/bgk_colloperator.f90 +++ b/src/particles/bgk/bgk_colloperator.f90 @@ -75,12 +75,12 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume) !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES REAL :: vBulk(3), u0ij(3,3), u2, V_rel(3), dtCell -REAL :: alpha, CellTemp, dens, InnerDOF, NewEn, OldEn, Prandtl, relaxfreq, TEqui +REAL :: alpha, alphaRot(nSpecies), CellTemp, dens, InnerDOF, NewEn, OldEn, Prandtl, relaxfreq, TEqui INTEGER, ALLOCATABLE :: iPartIndx_NodeRelax(:),iPartIndx_NodeRelaxTemp(:),iPartIndx_NodeRelaxRot(:),iPartIndx_NodeRelaxVib(:) INTEGER :: iLoop, iPart, nRelax, iPolyatMole REAL, ALLOCATABLE :: Xi_vib_DOF(:), VibEnergyDOF(:,:) INTEGER :: iSpec, nSpec(nSpecies), jSpec, nRotRelax, nVibRelax -REAL :: OldEnRot, NewEnRot, NewEnVib +REAL :: OldEnRot, NewEnRot(nSpecies), NewEnVib(nSpecies) REAL :: TotalMass, u2Spec(nSpecies), u2i(3), vBulkAll(3) REAL :: SpecTemp(nSpecies) #ifdef CODE_ANALYZE @@ -249,10 +249,17 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume) END DO ! 9.) Rotation: Scale the new rotational state of the molecules to ensure energy conservation -IF ( (nRotRelax.GT.0)) alpha = OldEn/NewEnRot*(Xi_RotTotal/(Xi_RotTotal+3.*(nPart-1.))) +DO iSpec = 1, nSpecies + IF (NewEnRot(iSpec).GT.0.0) THEN + alphaRot(iSpec) = OldEn/NewEnRot(iSpec)*(Xi_RotSpec(iSpec)*nRotRelaxSpec(iSpec)/(Xi_RotTotal+3.*(nPart-1.))) + ELSE + alphaRot(iSpec) = 0.0 + END IF +END DO DO iLoop = 1, nRotRelax iPart = iPartIndx_NodeRelaxRot(iLoop) - PartStateIntEn( 2,iPart) = alpha*PartStateIntEn( 2,iPart) + iSpec = PartSpecies(iPart) + PartStateIntEn( 2,iPart) = alphaRot(iSpec)*PartStateIntEn( 2,iPart) END DO ! CODE ANALYZE: Compare the old momentum and energy of the cell with the new, abort if relative difference is above the limits @@ -692,7 +699,7 @@ SUBROUTINE RelaxInnerEnergy(nVibRelax, nRotRelax, iPartIndx_NodeRelaxVib, iPartI ! INPUT VARIABLES INTEGER, INTENT(IN) :: nVibRelax, nRotRelax, iPartIndx_NodeRelaxVib(nVibRelax), iPartIndx_NodeRelaxRot(nRotRelax) REAL, INTENT(IN) :: Xi_vib_DOF(:), TEqui, Xi_VibSpec(nSpecies), Xi_RotSpec(nSpecies) -REAL, INTENT(INOUT) :: NewEnVib, NewEnRot +REAL, INTENT(INOUT) :: NewEnVib(nSpecies), NewEnRot(nSpecies) !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES REAL, INTENT(OUT) :: VibEnergyDOF(:,:) @@ -720,7 +727,7 @@ SUBROUTINE RelaxInnerEnergy(nVibRelax, nRotRelax, iPartIndx_NodeRelaxVib, iPartI CALL RANDOM_NUMBER(iRan) PartStateIntEn( 1,iPart) = -LOG(iRan)*Xi_VibSpec(iSpec)/2.*TEqui*BoltzmannConst END IF - NewEnVib = NewEnVib + PartStateIntEn(1,iPart) * partWeight + NewEnVib(iSpec) = NewEnVib(iSpec) + PartStateIntEn(1,iPart) * partWeight END DO END IF ! ROT Relaxation @@ -730,7 +737,7 @@ SUBROUTINE RelaxInnerEnergy(nVibRelax, nRotRelax, iPartIndx_NodeRelaxVib, iPartI partWeight = GetParticleWeight(iPart) CALL RANDOM_NUMBER(iRan) PartStateIntEn( 2,iPart) = -Xi_RotSpec(iSpec) / 2. * BoltzmannConst*TEqui*LOG(iRan) - NewEnRot = NewEnRot + PartStateIntEn( 2,iPart) * partWeight + NewEnRot(iSpec) = NewEnRot(iSpec) + PartStateIntEn( 2,iPart) * partWeight END DO END SUBROUTINE RelaxInnerEnergy @@ -866,28 +873,38 @@ SUBROUTINE EnergyConsVib(nPart, nVibRelax, nVibRelaxSpec, iPartIndx_NodeRelaxVib !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES INTEGER, INTENT(IN) :: nPart, nVibRelax, iPartIndx_NodeRelaxVib(:), nVibRelaxSpec(nSpecies) -REAL, INTENT(IN) :: NewEnVib, VibEnergyDOF(:,:), Xi_VibSpec(nSpecies), TEqui +REAL, INTENT(IN) :: NewEnVib(nSpecies), VibEnergyDOF(:,:), Xi_VibSpec(nSpecies), TEqui REAL, INTENT(INOUT) :: OldEn !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES INTEGER :: iPart, iLoop, iDOF, iSpec, iQuant, iQuaMax, iPolyatMole -REAL :: alpha, partWeight, betaV, iRan, MaxColQua, Xi_VibTotal +REAL :: alpha(nSpecies), partWeight, betaV, iRan, MaxColQua, Xi_VibTotal !=================================================================================================================================== IF(BGKDoVibRelaxation) THEN - IF ((NewEnVib.GT.0.0).AND.(nVibRelax.GT.0)) THEN + IF (ANY(NewEnVib.GT.0.0).AND.(nVibRelax.GT.0)) THEN + Xi_VibTotal = 0.0 + DO iSpec = 1, nSpecies + Xi_VibTotal = Xi_VibTotal + Xi_VibSpec(iSpec)*nVibRelaxSpec(iSpec) + END DO + DO iSpec = 1, nSpecies + IF (NewEnVib(iSpec).GT.0.0) THEN + alpha(iSpec) = OldEn/NewEnVib(iSpec)*(Xi_VibSpec(iSpec)*nVibRelaxSpec(iSpec)/(3.*(nPart-1.)+Xi_VibTotal)) + ELSE + alpha(iSpec) = 0. + END IF + END DO IF (BGKUseQuantVibEn) THEN - alpha = OldEn/NewEnVib*(Xi_VibSpec(1)*nVibRelax/(3.*(nPart-1.)+Xi_VibSpec(1)*nVibRelax)) DO iLoop = 1, nVibRelax iPart = iPartIndx_NodeRelaxVib(iLoop) partWeight = GetParticleWeight(iPart) iSpec = PartSpecies(iPart) - IF(SpecDSMC(iSpec)%PolyatomicMol) THEN + IF(SpecDSMC(iSpec)%PolyatomicMol) THEN ! TBC, noch nicht mit verschiedenen alpha pro Spezies PartStateIntEn(1,iPart) = 0.0 iPolyatMole = SpecDSMC(iSpec)%SpecToPolyArray DO iDOF = 1, PolyatomMolDSMC(iPolyatMole)%VibDOF - betaV = alpha*VibEnergyDOF(iLoop,iDOF)/(PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)*BoltzmannConst) + betaV = alpha(iSpec)*VibEnergyDOF(iLoop,iDOF)/(PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)*BoltzmannConst) CALL RANDOM_NUMBER(iRan) iQuant = INT(betaV+iRan) IF(iQuant.GT.PolyatomMolDSMC(iPolyatMole)%MaxVibQuantDOF(iDOF)) iQuant=PolyatomMolDSMC(iPolyatMole)%MaxVibQuantDOF(iDOF) @@ -913,7 +930,7 @@ SUBROUTINE EnergyConsVib(nPart, nVibRelax, nVibRelaxSpec, iPartIndx_NodeRelaxVib PartStateIntEn( 1,iPart) = PartStateIntEn( 1,iPart) & + SpecDSMC(iSpec)%EZeroPoint ELSE ! Diatomic molecules - betaV = alpha*PartStateIntEn( 1,iPart)/(SpecDSMC(iSpec)%CharaTVib*BoltzmannConst) + betaV = alpha(iSpec)*PartStateIntEn( 1,iPart)/(SpecDSMC(iSpec)%CharaTVib*BoltzmannConst) CALL RANDOM_NUMBER(iRan) iQuant = INT(betaV+iRan) IF (iQuant.GT.SpecDSMC(iSpec)%MaxVibQuant) iQuant = SpecDSMC(iSpec)%MaxVibQuant @@ -937,16 +954,11 @@ SUBROUTINE EnergyConsVib(nPart, nVibRelax, nVibRelaxSpec, iPartIndx_NodeRelaxVib END IF ! SpecDSMC(1)%PolyatomicMol END DO ELSE ! Continuous treatment of vibrational energy - Xi_VibTotal = 0.0 - DO iSpec = 1, nSpecies - Xi_VibTotal = Xi_VibTotal + Xi_VibSpec(iSpec)*nVibRelaxSpec(iSpec) - END DO - alpha = OldEn/NewEnVib*(Xi_VibTotal/(3.*(nPart-1.)+Xi_VibTotal)) DO iLoop = 1, nVibRelax iPart = iPartIndx_NodeRelaxVib(iLoop) iSpec = PartSpecies(iPart) partWeight = GetParticleWeight(iPart) - PartStateIntEn( 1,iPart) = alpha*PartStateIntEn( 1,iPart) + SpecDSMC(iSpec)%EZeroPoint + PartStateIntEn( 1,iPart) = alpha(iSpec)*PartStateIntEn( 1,iPart) + SpecDSMC(iSpec)%EZeroPoint OldEn = OldEn - (PartStateIntEn( 1,iPart) - SpecDSMC(iSpec)%EZeroPoint)*partWeight END DO END IF ! BGKUseQuantVibEn From ff70c8ec7f3b74b8183b6441cfe5c3a123d35ed2 Mon Sep 17 00:00:00 2001 From: hildf Date: Wed, 13 Apr 2022 10:57:31 +0200 Subject: [PATCH 034/495] enable multispec polyatomic for ESBGK --- src/particles/bgk/bgk_init.f90 | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/particles/bgk/bgk_init.f90 b/src/particles/bgk/bgk_init.f90 index a7bceb12b..2b266b41d 100644 --- a/src/particles/bgk/bgk_init.f90 +++ b/src/particles/bgk/bgk_init.f90 @@ -127,11 +127,11 @@ SUBROUTINE InitBGK() /(2.*(Species(iSpec)%MassIC * Species(iSpec2)%MassIC)))/CollInf%Tref(iSpec,iSpec2)**(-CollInf%omega(iSpec,iSpec2) +0.5) END DO END DO -IF ((nSpecies.GT.1).AND.(ANY(SpecDSMC(:)%PolyatomicMol))) THEN - CALL abort(& -__STAMP__& -,' ERROR Multispec not implemented with polyatomic molecules!') -END IF +!IF ((nSpecies.GT.1).AND.(ANY(SpecDSMC(:)%PolyatomicMol))) THEN +! CALL abort(& +!__STAMP__& +!,' ERROR Multispec not implemented with polyatomic molecules!') +!END IF BGKCollModel = GETINT('Particles-BGK-CollModel') IF ((nSpecies.GT.1).AND.(BGKCollModel.GT.1)) THEN From e0aa051a7f0eb985c8b82164c7442029b39c0be0 Mon Sep 17 00:00:00 2001 From: hildf Date: Wed, 13 Apr 2022 11:12:39 +0200 Subject: [PATCH 035/495] enable multispec quantised vibration --- src/particles/bgk/bgk_init.f90 | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/particles/bgk/bgk_init.f90 b/src/particles/bgk/bgk_init.f90 index 2b266b41d..28e080675 100644 --- a/src/particles/bgk/bgk_init.f90 +++ b/src/particles/bgk/bgk_init.f90 @@ -127,11 +127,11 @@ SUBROUTINE InitBGK() /(2.*(Species(iSpec)%MassIC * Species(iSpec2)%MassIC)))/CollInf%Tref(iSpec,iSpec2)**(-CollInf%omega(iSpec,iSpec2) +0.5) END DO END DO -!IF ((nSpecies.GT.1).AND.(ANY(SpecDSMC(:)%PolyatomicMol))) THEN -! CALL abort(& -!__STAMP__& -!,' ERROR Multispec not implemented with polyatomic molecules!') -!END IF +IF ((nSpecies.GT.1).AND.(ANY(SpecDSMC(:)%PolyatomicMol))) THEN + CALL abort(& +__STAMP__& +,' ERROR Multispec not implemented with polyatomic molecules!') +END IF BGKCollModel = GETINT('Particles-BGK-CollModel') IF ((nSpecies.GT.1).AND.(BGKCollModel.GT.1)) THEN @@ -178,11 +178,11 @@ SUBROUTINE InitBGK() ! Vibrational modelling BGKDoVibRelaxation = GETLOGICAL('Particles-BGK-DoVibRelaxation') BGKUseQuantVibEn = GETLOGICAL('Particles-BGK-UseQuantVibEn') - IF ((nSpecies.GT.1).AND.(BGKUseQuantVibEn)) THEN - CALL abort(& - __STAMP__& - ,' ERROR Multispec not implemented for quantized vibrational energy!') - END IF + !IF ((nSpecies.GT.1).AND.(BGKUseQuantVibEn)) THEN + ! CALL abort(& + ! __STAMP__& + ! ,' ERROR Multispec not implemented for quantized vibrational energy!') + !END IF END IF IF(DSMC%CalcQualityFactors) THEN From 3bf1d3cc0a952d0dabd6f310755457baa509b2a6 Mon Sep 17 00:00:00 2001 From: Julian Beyer Date: Wed, 13 Apr 2022 12:25:53 +0200 Subject: [PATCH 036/495] sorts cells of macro rad input according to their y-position --- .../radiation_solver/radiation_init.f90 | 172 ++++++++++++------ .../radiation_solver/radiation_vars.f90 | 1 + 2 files changed, 115 insertions(+), 58 deletions(-) diff --git a/src/radiation/radiation_solver/radiation_init.f90 b/src/radiation/radiation_solver/radiation_init.f90 index 98822350e..8455d605f 100644 --- a/src/radiation/radiation_solver/radiation_init.f90 +++ b/src/radiation/radiation_solver/radiation_init.f90 @@ -80,6 +80,7 @@ SUBROUTINE DefineParametersRadiation() CALL prms%CreateLogicalOption('Radiation-bb-atoms', 'Enable atomic bound-bound radiation', '.FALSE.') CALL prms%CreateLogicalOption('Radiation-bb-molecules', 'Enable molecular bound-bound radiation', '.FALSE.') CALL prms%CreateLogicalOption('Radiation-MacroRadInput', 'Reading in flow field data as radiation input', '.FALSE.') +CALL prms%CreateLogicalOption('Radiation-MacroInput-SortCellsY', 'Sorts Cells in y-direction', '.FALSE.') CALL prms%CreateLogicalOption('Radiation-UseElectronicExcitation', 'Use el. excitation to populate upper state densitites', & '.TRUE.') CALL prms%CreateRealOption( 'Radiation-NumDensElectrons', 'Electron number density, 1/cm3', '0.0') @@ -210,6 +211,7 @@ SUBROUTINE InitRadiation() RadiationSwitches%bb_at = GETLOGICAL('Radiation-bb-atoms') RadiationSwitches%bb_mol = GETLOGICAL('Radiation-bb-molecules') RadiationSwitches%MacroRadInput = GETLOGICAL('Radiation-MacroRadInput') +RadiationSwitches%SortCellsY = GETLOGICAL('Radiation-MacroInput-SortCellsY') RadiationSwitches%UseElectronicExcitation = GETLOGICAL('Radiation-UseElectronicExcitation') IF (RadiationSwitches%MacroRadInput) CALL MacroscopicRadiationInput() @@ -298,8 +300,7 @@ SUBROUTINE MacroscopicRadiationInput() USE MOD_MPI_Shared USE MOD_MPI_Shared_Vars #endif -! USE MOD_Utils ,ONLY: BubbleSortID !Laux -! USE MOD_Particle_Mesh_Vars ,ONLY: GEO !Laux + USE MOD_Particle_Mesh_Vars ,ONLY: ElemMidPoint_Shared ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -311,8 +312,8 @@ SUBROUTINE MacroscopicRadiationInput() INTEGER :: nVar_HDF5, N_HDF5, nElems_HDF5, iVar, iSpec, iElem, CNElemID, IndexElectronTemp, iSpecElectrons REAL, ALLOCATABLE :: ElemData_HDF5(:,:) CHARACTER(LEN=300) :: MacroRadiationInputFile -! INTEGER, ALLOCATABLE :: SortElemInd(:) !Laux -! REAL, ALLOCATABLE :: SortElemYPos(:) !Laux + INTEGER, ALLOCATABLE :: SortElemInd(:) + REAL, ALLOCATABLE :: SortElemYPos(:) !=================================================================================================================================== MacroRadiationInputFile = GETSTR('Radiation-MacroInput-Filename') @@ -342,66 +343,64 @@ SUBROUTINE MacroscopicRadiationInput() END ASSOCIATE -! --- uncomment for Laux Test Case ---------------------------------------------------------------- -! reanrrages Elem IDs for 1xnElemsx1 meshes (for 3D and 2D rotationally symmetric meshes) - -! ALLOCATE(SortElemInd(nElems), SortElemYPos(nElems)) -! DO iElem = 1, nElems -! SortElemInd(iElem) = iElem -! END DO -! SortElemYPos(:) = -GEO%ElemMidPoint(2,:) -! CALL BubbleSortID(SortElemYPos, SortElemInd, nElems) - - -! iVar = 1 -! DO iSpec = 1, nSpecies -! DO iElem = 1, nElems -! MacroRadInputParameters(SortElemInd(iElem),iSpec,1) = ElemData_HDF5(iVar+ 6,iElem) density -! MacroRadInputParameters(SortElemInd(iElem),iSpec,2) = ElemData_HDF5(iVar+ 7,iElem) T_vib -! MacroRadInputParameters(SortElemInd(iElem),iSpec,3) = ElemData_HDF5(iVar+ 8,iElem) T_rot -! MacroRadInputParameters(SortElemInd(iElem),iSpec,4) = ElemData_HDF5(iVar+ 9,iElem) T_elec -! MacroRadInputParameters(SortElemInd(iElem),iSpec,5) = ElemData_HDF5(iVar+11,iElem) T_mean -! END DO -! iVar = iVar + DSMC_NVARS -! END DO -! ------------------------------------------------------------------------------------------------- - - iVar = 1 - DO iSpec = 1, nSpecies - DO iElem = 1, nElems - CNElemID = GetCNElemID(iElem+offsetElem) - MacroRadInputParameters(CNElemID,iSpec,1) = MAX(0.,ElemData_HDF5(iVar+ 6,iElem)) !density - MacroRadInputParameters(CNElemID,iSpec,2) = MAX(0.,ElemData_HDF5(iVar+ 7,iElem)) !T_vib - MacroRadInputParameters(CNElemID,iSpec,3) = MAX(0.,ElemData_HDF5(iVar+ 8,iElem)) !T_rot - MacroRadInputParameters(CNElemID,iSpec,4) = MAX(0.,ElemData_HDF5(iVar+ 9,iElem)) !T_elec - MacroRadInputParameters(CNElemID,iSpec,5) = MAX(0.,ElemData_HDF5(iVar+11,iElem)) !T_mean - END DO - iVar = iVar + DSMC_NVARS - END DO + IF(RadiationSwitches%SortCellsY) THEN !Sort cells if manually created input is used + ALLOCATE(SortElemInd(nElems), SortElemYPos(nElems)) + DO iElem = 1, nElems + SortElemInd(iElem) = iElem + END DO + SortElemYPos(:) = -ElemMidPoint_Shared(2,:) + CALL BubbleSortID(SortElemYPos, SortElemInd, nElems) - IF(.NOT.RadiationSwitches%UseElectronicExcitation) THEN - iSpecElectrons = 0 + iVar = 1 DO iSpec = 1, nSpecies - IF (SpecDSMC(iSpec)%InterID .EQ. 4) iSpecElectrons = iSpec + DO iElem = 1, nElems + CNElemID = GetCNElemID(iElem+offsetElem) + MacroRadInputParameters(SortElemInd(CNElemID),iSpec,1) = MAX(0.,ElemData_HDF5(iVar+ 6,iElem)) !density + MacroRadInputParameters(SortElemInd(CNElemID),iSpec,2) = MAX(0.,ElemData_HDF5(iVar+ 7,iElem)) !T_vib + MacroRadInputParameters(SortElemInd(CNElemID),iSpec,3) = MAX(0.,ElemData_HDF5(iVar+ 8,iElem)) !T_rot + MacroRadInputParameters(SortElemInd(CNElemID),iSpec,4) = MAX(0.,ElemData_HDF5(iVar+ 9,iElem)) !T_elec + MacroRadInputParameters(SortElemInd(CNElemID),iSpec,5) = MAX(0.,ElemData_HDF5(iVar+11,iElem)) !T_mean + END DO + iVar = iVar + DSMC_NVARS END DO - IF (iSpecElectrons .EQ. 0) THEN - PRINT*, "unknown species number for electrons while reading flow field data" - STOP - END IF - IndexElectronTemp = (iSpecElectrons-1)*DSMC_NVARS+1 + 11 !132 for 11th Species - DO iElem = 1, nElems - DO iSpec = 1, nSpecies + ELSE + iVar = 1 + DO iSpec = 1, nSpecies + DO iElem = 1, nElems CNElemID = GetCNElemID(iElem+offsetElem) - IF((SpecDSMC(iSpec)%InterID .EQ. 1) .OR. (SpecDSMC(iSpec)%InterID .EQ. 10) .OR. & - (SpecDSMC(iSpec)%InterID .EQ. 2) .OR. (SpecDSMC(iSpec)%InterID .EQ. 20)) THEN - MacroRadInputParameters(CNElemID,iSpec,4) = MAX(0.,ElemData_HDF5(IndexElectronTemp,iElem)) - ELSE IF(SpecDSMC(iSpec)%InterID .EQ. 4) THEN - CYCLE - ELSE - PRINT*, "excitation temperature cannot be matched, unknown InterID for species", iSpec - END IF + MacroRadInputParameters(CNElemID,iSpec,1) = MAX(0.,ElemData_HDF5(iVar+ 6,iElem)) !density + MacroRadInputParameters(CNElemID,iSpec,2) = MAX(0.,ElemData_HDF5(iVar+ 7,iElem)) !T_vib + MacroRadInputParameters(CNElemID,iSpec,3) = MAX(0.,ElemData_HDF5(iVar+ 8,iElem)) !T_rot + MacroRadInputParameters(CNElemID,iSpec,4) = MAX(0.,ElemData_HDF5(iVar+ 9,iElem)) !T_elec + MacroRadInputParameters(CNElemID,iSpec,5) = MAX(0.,ElemData_HDF5(iVar+11,iElem)) !T_mean END DO + iVar = iVar + DSMC_NVARS END DO + + IF(.NOT.RadiationSwitches%UseElectronicExcitation) THEN + iSpecElectrons = 0 + DO iSpec = 1, nSpecies + IF (SpecDSMC(iSpec)%InterID .EQ. 4) iSpecElectrons = iSpec + END DO + IF (iSpecElectrons .EQ. 0) THEN + PRINT*, "unknown species number for electrons while reading flow field data" + STOP + END IF + IndexElectronTemp = (iSpecElectrons-1)*DSMC_NVARS+1 + 11 !132 for 11th Species + DO iElem = 1, nElems + DO iSpec = 1, nSpecies + CNElemID = GetCNElemID(iElem+offsetElem) + IF((SpecDSMC(iSpec)%InterID .EQ. 1) .OR. (SpecDSMC(iSpec)%InterID .EQ. 10) .OR. & + (SpecDSMC(iSpec)%InterID .EQ. 2) .OR. (SpecDSMC(iSpec)%InterID .EQ. 20)) THEN + MacroRadInputParameters(CNElemID,iSpec,4) = MAX(0.,ElemData_HDF5(IndexElectronTemp,iElem)) + ELSE IF(SpecDSMC(iSpec)%InterID .EQ. 4) THEN + CYCLE + ELSE + PRINT*, "excitation temperature cannot be matched, unknown InterID for species", iSpec + END IF + END DO + END DO + END IF END IF #if USE_MPI @@ -413,6 +412,63 @@ SUBROUTINE MacroscopicRadiationInput() END SUBROUTINE MacroscopicRadiationInput +SUBROUTINE BubbleSortID(a,id,len) +!=================================================================================================================================== +! bubble sort, taken from rosetta-wiki and modified for own use +!=================================================================================================================================== +! MODULES +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES +INTEGER,INTENT(IN) :: len +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +REAL,INTENT(INOUT) :: a(len) +INTEGER,INTENT(INOUT),OPTIONAL :: id(len) +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +REAL :: temp +INTEGER :: iloop,jloop, temp2 +LOGICAL :: swapped = .TRUE. +!=================================================================================================================================== + +IF(PRESENT(id))THEN + DO jloop=len-1,1,-1 + swapped = .FALSE. + DO iloop=1,jloop + IF (a(iloop).GT.a(iloop+1))THEN + ! switch entries + temp=a(iloop) + a(iloop) = a(iloop+1) + a(iloop+1) = temp + ! switch ids + temp2=id(iloop) + id(iloop) = id(iloop+1) + id(iloop+1) = temp2 + swapped = .TRUE. + END IF + END DO ! iloop + IF (.NOT. swapped) EXIT + END DO ! jloop +ELSE + DO jloop=len-1,1,-1 + swapped = .FALSE. + DO iloop=1,jloop + IF (a(iloop).GT.a(iloop+1))THEN + ! switch entries + temp=a(iloop) + a(iloop) = a(iloop+1) + a(iloop+1) = temp + swapped = .TRUE. + END IF + END DO ! iloop + IF (.NOT. swapped) EXIT + END DO ! jloop +END IF +END SUBROUTINE BubbleSortID + + SUBROUTINE FinalizeRadiation() !=================================================================================================================================== !> Deallocating radiation variables diff --git a/src/radiation/radiation_solver/radiation_vars.f90 b/src/radiation/radiation_solver/radiation_vars.f90 index ab821bd04..812fd1b3d 100644 --- a/src/radiation/radiation_solver/radiation_vars.f90 +++ b/src/radiation/radiation_solver/radiation_vars.f90 @@ -63,6 +63,7 @@ MODULE MOD_Radiation_Vars LOGICAL :: bb_at ! Switch for atomic line radiation LOGICAL :: bb_mol ! Switch for molecular band radiation LOGICAL :: MacroRadInput ! Switch for input of DSMC files + LOGICAL :: SortCellsY ! Sorts Cells in y-direction for manually created input files (e.g. Laux's test case) LOGICAL :: UseElectronicExcitation ! Switch for using electronic excitation energies (t) OR T_electron for atoms and sqrt(T_vib*T_electron) for molecules (f) END TYPE tRadiationSwitches From 16ee2aa945862efba3f68d061c3aaf1638b27633 Mon Sep 17 00:00:00 2001 From: hildf Date: Wed, 13 Apr 2022 15:48:27 +0200 Subject: [PATCH 037/495] BGK mean collisionfrecspec instead of per species --- src/particles/bgk/bgk_colloperator.f90 | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/particles/bgk/bgk_colloperator.f90 b/src/particles/bgk/bgk_colloperator.f90 index 113905ae9..91122b7fe 100644 --- a/src/particles/bgk/bgk_colloperator.f90 +++ b/src/particles/bgk/bgk_colloperator.f90 @@ -92,7 +92,7 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume) REAL :: totalWeightSpec(nSpecies), totalWeight, partWeight, CellTemptmp REAL :: EVibSpec(nSpecies), ERotSpec(nSpecies), Xi_VibSpec(nSpecies), Xi_RotSpec(nSpecies),Xi_Vib_oldSpec(nSpecies) REAL :: TVibSpec(nSpecies), TRotSpec(nSpecies), RotExpSpec(nSpecies), VibExpSpec(nSpecies) -REAL :: collisionfreqSpec(nSpecies),rotrelaxfreqSpec(nSpecies), vibrelaxfreqSpec(nSpecies), Xi_RotTotal +REAL :: collisionfreqSpec,rotrelaxfreqSpec(nSpecies), vibrelaxfreqSpec(nSpecies), Xi_RotTotal INTEGER :: nVibRelaxSpec(nSpecies), nRotRelaxSpec(nSpecies) !=================================================================================================================================== #ifdef CODE_ANALYZE @@ -160,18 +160,18 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume) IF(ANY(SpecDSMC(:)%InterID.EQ.2).OR.ANY(SpecDSMC(:)%InterID.EQ.20)) THEN collisionfreqSpec = 0.0 DO iSpec = 1, nSpecies - DO jSpec = 1, nSpecies + DO jSpec = 1, iSpec IF (iSpec.EQ.jSpec) THEN CellTemptmp = CellTemp !SpecTemp(iSpec) ELSE CellTemptmp = CellTemp END IF - collisionfreqSpec(iSpec) = collisionfreqSpec(iSpec) + SpecBGK(iSpec)%CollFreqPreFactor(jSpec) * totalWeightSpec(iSpec)*totalWeightSpec(jSpec) & + collisionfreqSpec = collisionfreqSpec + SpecBGK(iSpec)%CollFreqPreFactor(jSpec) * totalWeightSpec(iSpec)*totalWeightSpec(jSpec) & *Dens *CellTemptmp**(-CollInf%omega(iSpec,jSpec) +0.5) /(totalWeight*totalWeight) END DO END DO - rotrelaxfreqSpec(:) = collisionfreqSpec(:) * DSMC%RotRelaxProb - vibrelaxfreqSpec(:) = collisionfreqSpec(:) * DSMC%VibRelaxProb + rotrelaxfreqSpec(:) = collisionfreqSpec * DSMC%RotRelaxProb + vibrelaxfreqSpec(:) = collisionfreqSpec * DSMC%VibRelaxProb RotExpSpec=0.; VibExpSpec=0. IF(SpecDSMC(1)%PolyatomicMol) THEN From bf0306a07855446cf0e1a2d498e5efbc36d641ad Mon Sep 17 00:00:00 2001 From: hildf Date: Wed, 27 Apr 2022 15:23:21 +0200 Subject: [PATCH 038/495] Corrected collisionfreqspec for mixtures --- src/particles/bgk/bgk_colloperator.f90 | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/particles/bgk/bgk_colloperator.f90 b/src/particles/bgk/bgk_colloperator.f90 index 91122b7fe..9363f866c 100644 --- a/src/particles/bgk/bgk_colloperator.f90 +++ b/src/particles/bgk/bgk_colloperator.f90 @@ -92,7 +92,7 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume) REAL :: totalWeightSpec(nSpecies), totalWeight, partWeight, CellTemptmp REAL :: EVibSpec(nSpecies), ERotSpec(nSpecies), Xi_VibSpec(nSpecies), Xi_RotSpec(nSpecies),Xi_Vib_oldSpec(nSpecies) REAL :: TVibSpec(nSpecies), TRotSpec(nSpecies), RotExpSpec(nSpecies), VibExpSpec(nSpecies) -REAL :: collisionfreqSpec,rotrelaxfreqSpec(nSpecies), vibrelaxfreqSpec(nSpecies), Xi_RotTotal +REAL :: collisionfreqSpec(nSpecies),rotrelaxfreqSpec(nSpecies), vibrelaxfreqSpec(nSpecies), Xi_RotTotal INTEGER :: nVibRelaxSpec(nSpecies), nRotRelaxSpec(nSpecies) !=================================================================================================================================== #ifdef CODE_ANALYZE @@ -160,18 +160,18 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume) IF(ANY(SpecDSMC(:)%InterID.EQ.2).OR.ANY(SpecDSMC(:)%InterID.EQ.20)) THEN collisionfreqSpec = 0.0 DO iSpec = 1, nSpecies - DO jSpec = 1, iSpec + DO jSpec = 1, nSpecies IF (iSpec.EQ.jSpec) THEN CellTemptmp = CellTemp !SpecTemp(iSpec) ELSE CellTemptmp = CellTemp END IF - collisionfreqSpec = collisionfreqSpec + SpecBGK(iSpec)%CollFreqPreFactor(jSpec) * totalWeightSpec(iSpec)*totalWeightSpec(jSpec) & - *Dens *CellTemptmp**(-CollInf%omega(iSpec,jSpec) +0.5) /(totalWeight*totalWeight) + collisionfreqSpec(iSpec) = collisionfreqSpec(iSpec) + SpecBGK(iSpec)%CollFreqPreFactor(jSpec) * totalWeightSpec(jSpec) & + * (Dens / totalWeight) *CellTemptmp**(-CollInf%omega(iSpec,jSpec) +0.5) END DO END DO - rotrelaxfreqSpec(:) = collisionfreqSpec * DSMC%RotRelaxProb - vibrelaxfreqSpec(:) = collisionfreqSpec * DSMC%VibRelaxProb + rotrelaxfreqSpec(:) = collisionfreqSpec(:) * DSMC%RotRelaxProb + vibrelaxfreqSpec(:) = collisionfreqSpec(:) * DSMC%VibRelaxProb RotExpSpec=0.; VibExpSpec=0. IF(SpecDSMC(1)%PolyatomicMol) THEN From 0c9bc3568318ac665c1efdaac1a967b5fe70d2a0 Mon Sep 17 00:00:00 2001 From: hildf Date: Thu, 28 Apr 2022 15:24:21 +0200 Subject: [PATCH 039/495] CollFreqPreFactor change of factor for mixtures --- src/particles/bgk/bgk_init.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/particles/bgk/bgk_init.f90 b/src/particles/bgk/bgk_init.f90 index 28e080675..3ff014285 100644 --- a/src/particles/bgk/bgk_init.f90 +++ b/src/particles/bgk/bgk_init.f90 @@ -120,7 +120,7 @@ SUBROUTINE InitBGK() IF (iSpec.EQ.iSpec2) THEN delta_ij = 1.0 ELSE - delta_ij = 0.0 + delta_ij = 1.0 END IF SpecBGK(iSpec)%CollFreqPreFactor(iSpec2)= 4.*(2.-delta_ij)*CollInf%dref(iSpec,iSpec2)**2.0 & * SQRT(Pi*BoltzmannConst*CollInf%Tref(iSpec,iSpec2)*(Species(iSpec)%MassIC + Species(iSpec2)%MassIC) & From a0e1a8fe6e420923ff1925e5c58db2e681c30173 Mon Sep 17 00:00:00 2001 From: Marcel Pfeiffer Date: Sun, 1 May 2022 16:57:02 +0200 Subject: [PATCH 040/495] added line of sight + optional analytic full spectra calc --- .../radiative_transfer/radtrans_init.f90 | 142 +++++++++- .../radiative_transfer/radtrans_main.f90 | 50 +++- .../radiative_transfer/radtrans_output.f90 | 32 ++- .../radiative_transfer/radtrans_vars.f90 | 3 +- .../tracking/radtrans_tools.f90 | 246 +++++++++++++++++- .../tracking/radtrans_tracking.f90 | 25 +- 6 files changed, 455 insertions(+), 43 deletions(-) diff --git a/src/radiation/radiative_transfer/radtrans_init.f90 b/src/radiation/radiative_transfer/radtrans_init.f90 index f700b7756..f79d04a74 100644 --- a/src/radiation/radiative_transfer/radtrans_init.f90 +++ b/src/radiation/radiative_transfer/radtrans_init.f90 @@ -45,7 +45,7 @@ SUBROUTINE DefineParametersRadiationTrans() CALL prms%SetSection("Radiation Transport") CALL prms%CreateLogicalOption('Radiation-AdaptivePhotonNumEmission', 'HM','.FALSE.') -CALL prms%CreateLogicalOption('Radiation-CalcRadObservationPoint', 'HM','.FALSE.') +CALL prms%CreateIntOption('Radiation-RadObservationPointMethod', 'HM','0') CALL prms%CreateIntOption( 'Radiation-DirectionModel', 'HM','1') CALL prms%CreateIntOption( 'Radiation-NumPhotonsPerCell', 'HM','1') CALL prms%CreateIntOption( 'Radiation-AbsorptionModel', 'HM','1') @@ -55,6 +55,7 @@ SUBROUTINE DefineParametersRadiationTrans() CALL prms%CreateRealOption('Radiation-ObservationDiameter', 'HM') CALL prms%CreateRealArrayOption('Radiation-ObservationViewDirection', 'HM') CALL prms%CreateRealOption('Radiation-ObservationAngularAperture', 'HM') +CALL prms%CreateLogicalOption('Radiation-ObservationCalcFullSpectra','.FALSE.') END SUBROUTINE DefineParametersRadiationTrans @@ -112,9 +113,9 @@ SUBROUTINE InitRadiationTransport() RadiationPhotonPosModel = GETINT('Radiation-PhotonPosModel') RadiationPhotonWaveLengthModel = GETINT('Radiation-PhotonWaveLengthModel') RadEmiAdaptPhotonNum = GETLOGICAL('Radiation-AdaptivePhotonNumEmission') -CalcRadObservationPoint = GETLOGICAL('Radiation-CalcRadObservationPoint') +RadObservationPointMethod = GETINT('Radiation-RadObservationPointMethod') -IF (CalcRadObservationPoint) THEN +IF (RadObservationPointMethod.GT.0) THEN RadObservationPoint%AngularAperture = GETREAL('Radiation-ObservationAngularAperture') RadObservationPoint%Diameter = GETREAL('Radiation-ObservationDiameter') RadObservationPoint%MidPoint = GETREALARRAY('Radiation-ObservationMidPoint',3) @@ -128,10 +129,17 @@ SUBROUTINE InitRadiationTransport() ObsLengt = RadObservationPoint%Diameter/(2.*TAN(RadObservationPoint%AngularAperture/2.)) RadObservationPoint%StartPoint(1:3) = RadObservationPoint%MidPoint(1:3) - ObsLengt*RadObservationPoint%ViewDirection(1:3) RadObservationPoint%Area = Pi*RadObservationPoint%Diameter*RadObservationPoint%Diameter/4. + IF (RadObservationPointMethod.EQ.2) THEN + RadObservationPoint%CalcFullSpectra = GETLOGICAL('Radiation-ObservationCalcFullSpectra') + IF (RadObservationPoint%CalcFullSpectra) THEN + RadEmiAdaptPhotonNum = .FALSE. + RadTrans%NumPhotonsPerCell = RadiationParameter%WaveLenDiscrCoarse + END IF + END IF END IF IF(Symmetry%Order.EQ.2) CALL BuildMesh2DInfo() -IF (CalcRadObservationPoint) THEN +IF (RadObservationPointMethod.GT.0) THEN ALLOCATE(RadObservation_Emission(RadiationParameter%WaveLenDiscrCoarse),RadObservation_EmissionPart(RadiationParameter%WaveLenDiscrCoarse)) RadObservation_Emission = 0.0 RadObservation_EmissionPart = 0 @@ -254,9 +262,12 @@ SUBROUTINE InitRadiationTransport() DO iElem = firstElem, lastElem IF((myRank.EQ.DisplRank).AND.(MOD(iElem-firstElem,ElemDisp).EQ.0)) CALL PrintStatusLineRadiation(REAL(iElem),REAL(firstElem),REAL(lastElem),.FALSE.,DisplRank) - IF (CalcRadObservationPoint) THEN + IF (RadObservationPointMethod.EQ.1) THEN CALL ElemInObsCone(iElem, ElemInCone) IF (.NOT.ElemInCone) CYCLE + ELSE IF (RadObservationPointMethod.EQ.2) THEN + CALL ElemOnLineOfSight(iELem, ElemInCone) + IF (.NOT.ElemInCone) CYCLE END IF CALL radiation_main(iElem) DO iWave = 1, RadiationParameter%WaveLenDiscrCoarse @@ -416,10 +427,11 @@ SUBROUTINE ElemInObsCone(ElemID, ElemInCone) ! MODULES USE MOD_Globals USE MOD_Mesh_Tools ,ONLY: GetGlobalElemID -USE MOD_Particle_Mesh_Vars ,ONLY: NodeCoords_Shared,ElemInfo_Shared, BoundsOfElem_Shared +USE MOD_Particle_Mesh_Vars ,ONLY: NodeCoords_Shared,ElemInfo_Shared, BoundsOfElem_Shared, SideIsSymSide, SideInfo_Shared USE MOD_RadiationTrans_Vars ,ONLY: RadObservationPoint, RadTransObsVolumeFrac USE MOD_Particle_Vars ,ONLY: Symmetry USE MOD_Particle_Mesh_Tools ,ONLY: ParticleInsideQuad3D +USE MOD_Photon_TrackingTools ,ONLY: PhotonIntersectionWithSide2DDir, PhotonThroughSideCheck3DDir ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -430,8 +442,8 @@ SUBROUTINE ElemInObsCone(ElemID, ElemInCone) LOGICAL, INTENT(OUT) :: ElemInCone !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -INTEGER :: iNode, MCVar, iGlobalElem, iPoint -LOGICAL :: NodeInCone(8), InsideFlag +INTEGER :: iNode, MCVar, iGlobalElem, iPoint, iLocSide, nlocSides, TempSideID, localSideID, TriNum +LOGICAL :: NodeInCone(8), InsideFlag, ThroughSide REAL :: NodePoint(3), ConeDist, ConeRadius, orthoDist, RandomPos(3) !=================================================================================================================================== ElemInCone = .FALSE. @@ -469,10 +481,124 @@ SUBROUTINE ElemInObsCone(ElemID, ElemInCone) IF (orthoDist.LE.ConeRadius) RadTransObsVolumeFrac(ElemID) = RadTransObsVolumeFrac(ElemID) + 1./REAL(MCVar) END DO END ASSOCIATE +ELSE + nlocSides = ElemInfo_Shared(ELEM_LASTSIDEIND,ElemID) - ElemInfo_Shared(ELEM_FIRSTSIDEIND,ElemID) + SideLoop: DO iLocSide=1,nlocSides + TempSideID = ElemInfo_Shared(ELEM_FIRSTSIDEIND,ElemID) + iLocSide + localSideID = SideInfo_Shared(SIDE_LOCALID,TempSideID) + ! Side is not one of the 6 local sides + IF (localSideID.LE.0) CYCLE + IF(Symmetry%Axisymmetric) THEN + IF (SideIsSymSide(TempSideID)) CYCLE + ThroughSide = .FALSE. + CALL PhotonIntersectionWithSide2DDir(localSideID,ElemID,ThroughSide, RadObservationPoint%StartPoint(1:3),RadObservationPoint%ViewDirection(1:3)) + IF (ThroughSide) THEN + ElemInCone = .TRUE. + ASSOCIATE( Bounds => BoundsOfElem_Shared(1:2,1:3,iGlobalElem) ) + DO iPoint = 1, MCVar + InsideFlag=.FALSE. + DO WHILE(.NOT.InsideFlag) + CALL RANDOM_NUMBER(RandomPos) + RandomPos = Bounds(1,:) + RandomPos*(Bounds(2,:)-Bounds(1,:)) + IF(Symmetry%Order.LE.2) RandomPos(3) = 0. + IF(Symmetry%Order.LE.1) RandomPos(2) = 0. + CALL ParticleInsideQuad3D(RandomPos,iGlobalElem,InsideFlag) + END DO + ConeDist = DOT_PRODUCT(RandomPos(1:3) - RadObservationPoint%StartPoint(1:3), RadObservationPoint%ViewDirection(1:3)) + ConeRadius = TAN(RadObservationPoint%AngularAperture/2.) * ConeDist + orthoDist = VECNORM(RandomPos(1:3) - RadObservationPoint%StartPoint(1:3) - ConeDist*RadObservationPoint%ViewDirection(1:3)) + IF (orthoDist.LE.ConeRadius) RadTransObsVolumeFrac(ElemID) = RadTransObsVolumeFrac(ElemID) + 1./REAL(MCVar) + END DO + END ASSOCIATE + EXIT SideLoop + END IF + ELSE + DO TriNum = 1,2 + ThroughSide = .FALSE. + CALL PhotonThroughSideCheck3DDir(localSideID,ElemID,ThroughSide,TriNum, RadObservationPoint%StartPoint(1:3),RadObservationPoint%ViewDirection(1:3)) + IF (ThroughSide) THEN + ElemInCone = .TRUE. + ASSOCIATE( Bounds => BoundsOfElem_Shared(1:2,1:3,iGlobalElem) ) + DO iPoint = 1, MCVar + InsideFlag=.FALSE. + DO WHILE(.NOT.InsideFlag) + CALL RANDOM_NUMBER(RandomPos) + RandomPos = Bounds(1,:) + RandomPos*(Bounds(2,:)-Bounds(1,:)) + IF(Symmetry%Order.LE.2) RandomPos(3) = 0. + IF(Symmetry%Order.LE.1) RandomPos(2) = 0. + CALL ParticleInsideQuad3D(RandomPos,iGlobalElem,InsideFlag) + END DO + ConeDist = DOT_PRODUCT(RandomPos(1:3) - RadObservationPoint%StartPoint(1:3), RadObservationPoint%ViewDirection(1:3)) + ConeRadius = TAN(RadObservationPoint%AngularAperture/2.) * ConeDist + orthoDist = VECNORM(RandomPos(1:3) - RadObservationPoint%StartPoint(1:3) - ConeDist*RadObservationPoint%ViewDirection(1:3)) + IF (orthoDist.LE.ConeRadius) RadTransObsVolumeFrac(ElemID) = RadTransObsVolumeFrac(ElemID) + 1./REAL(MCVar) + END DO + END ASSOCIATE + EXIT SideLoop + END IF + END DO + END IF + END DO SideLoop END IF END SUBROUTINE ElemInObsCone + +SUBROUTINE ElemOnLineOfSight(ElemID, ElemInCone) +!=================================================================================================================================== +! modified particle emmission for LD case +!=================================================================================================================================== +! MODULES +USE MOD_Globals +USE MOD_Mesh_Tools ,ONLY: GetGlobalElemID +USE MOD_Particle_Mesh_Vars ,ONLY: NodeCoords_Shared,ElemInfo_Shared, BoundsOfElem_Shared, SideInfo_Shared, SideIsSymSide +USE MOD_RadiationTrans_Vars ,ONLY: RadObservationPoint, RadTransObsVolumeFrac +USE MOD_Particle_Vars ,ONLY: Symmetry +USE MOD_Particle_Mesh_Tools ,ONLY: ParticleInsideQuad3D +USE MOD_Photon_TrackingTools ,ONLY: PhotonIntersectionWithSide2DDir, PhotonThroughSideCheck3DDir +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! INOUTPUT VARIABLES +INTEGER, INTENT(IN) :: ElemID +LOGICAL, INTENT(OUT) :: ElemInCone +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +INTEGER :: iNode, MCVar, iGlobalElem, iPoint, iLocSide, nlocSides, TempSideID, localSideID, TriNum +LOGICAL :: NodeInCone(8), InsideFlag, ThroughSide +REAL :: NodePoint(3), ConeDist, ConeRadius, orthoDist, RandomPos(3) +!=================================================================================================================================== +ElemInCone = .FALSE. +nlocSides = ElemInfo_Shared(ELEM_LASTSIDEIND,ElemID) - ElemInfo_Shared(ELEM_FIRSTSIDEIND,ElemID) +SideLoop: DO iLocSide=1,nlocSides + TempSideID = ElemInfo_Shared(ELEM_FIRSTSIDEIND,ElemID) + iLocSide + localSideID = SideInfo_Shared(SIDE_LOCALID,TempSideID) + ! Side is not one of the 6 local sides + IF (localSideID.LE.0) CYCLE + IF(Symmetry%Axisymmetric) THEN + IF (SideIsSymSide(TempSideID)) CYCLE + ThroughSide = .FALSE. + CALL PhotonIntersectionWithSide2DDir(localSideID,ElemID,ThroughSide, RadObservationPoint%StartPoint(1:3),RadObservationPoint%ViewDirection(1:3)) + IF (ThroughSide) THEN + ElemInCone = .TRUE. + EXIT SideLoop + END IF + ELSE + DO TriNum = 1,2 + ThroughSide = .FALSE. + CALL PhotonThroughSideCheck3DDir(localSideID,ElemID,ThroughSide,TriNum, RadObservationPoint%StartPoint(1:3),RadObservationPoint%ViewDirection(1:3)) + IF (ThroughSide) THEN + ElemInCone = .TRUE. + EXIT SideLoop + END IF + END DO + END IF +END DO SideLoop + +END SUBROUTINE ElemOnLineOfSight + INTEGER FUNCTION PRIME(n) !=================================================================================================================================== ! modified particle emmission for LD case diff --git a/src/radiation/radiative_transfer/radtrans_main.f90 b/src/radiation/radiative_transfer/radtrans_main.f90 index 083b6d46a..25e5daac0 100644 --- a/src/radiation/radiative_transfer/radtrans_main.f90 +++ b/src/radiation/radiative_transfer/radtrans_main.f90 @@ -44,8 +44,9 @@ SUBROUTINE RadTrans_main() USE MOD_Mesh_Vars ,ONLY : nElems USE MOD_Particle_Mesh_Vars ,ONLY : GEO, nComputeNodeElems, ElemMidPoint_Shared, ElemVolume_Shared USE MOD_RadiationTrans_Vars ,ONLY : Radiation_Emission_Spec_Total, RadTrans, RadEmiAdaptPhotonNum, RadTransObsVolumeFrac -USE MOD_RadiationTrans_Vars ,ONLY : PhotonProps, RadiationDirectionModel, RadTransPhotPerCellLoc +USE MOD_RadiationTrans_Vars ,ONLY : PhotonProps, RadiationDirectionModel, RadTransPhotPerCellLoc, RadObservationPoint USE MOD_RadiationTrans_Vars ,ONLY : RadTransPhotPerCell, RadTransPhotPerCell_Shared_Win, RadiationPhotonWaveLengthModel +USE MOD_RadiationTrans_Vars ,ONLY : RadObservationPointMethod USE MOD_Photon_Tracking ,ONLY : PhotonTriaTracking, Photon2DSymTracking USE MOD_Radiation_Vars ,ONLY : RadiationSwitches USE MOD_DSMC_Vars ,ONLY : RadialWeighting @@ -147,7 +148,7 @@ SUBROUTINE RadTrans_main() DO iElem = 1, nComputeNodeElems IF (RadTransPhotPerCellLoc(iElem).GT.0) THEN IF (RadiationDirectionModel.EQ.2) RandRot = RandomRotMatrix() - DO iPhot = 1, RadTransPhotPerCellLoc(iElem) + locPhotLoop: DO iPhot = 1, RadTransPhotPerCellLoc(iElem) IF(MPIroot.AND.(MOD(photVisCount,PhotDisp).EQ.0)) CALL PrintStatusLineRadiation(REAL(photVisCount),REAL(1),REAL(LocPhotNum),.TRUE.) photVisCount = photVisCount + 1 PhotonProps%PhotonPos(1:3) = SetPhotonPos(iElem, globPhotNum) @@ -159,25 +160,30 @@ SUBROUTINE RadTrans_main() iPhotLoc = iPhot END IF PhotonProps%PhotonDirection(1:3) = SetPhotonStartDirection(iElem, iPhotLoc, RandRot) - PhotonProps%PhotonEnergy = SetPhotonEnergy(iElem,PhotonProps%PhotonPos(1:3)) - IF (RadiationPhotonWaveLengthModel.EQ.1) THEN - PhotonProps%WaveLength = SetParticleWavelengthAR(iElem) + IF ((RadObservationPointMethod.EQ.2).AND.RadObservationPoint%CalcFullSpectra) THEN + PhotonProps%WaveLength = iPhotLoc ELSE - PhotonProps%WaveLength = SetParticleWavelengthBiSec(iElem) + IF (RadiationPhotonWaveLengthModel.EQ.1) THEN + PhotonProps%WaveLength = SetParticleWavelengthAR(iElem) + ELSE + PhotonProps%WaveLength = SetParticleWavelengthBiSec(iElem) + END IF END IF + PhotonProps%PhotonEnergy = SetPhotonEnergy(iElem,PhotonProps%PhotonPos(1:3), PhotonProps%WaveLength) + IF (PhotonProps%PhotonEnergy.EQ.0.0) CYCLE locPhotLoop IF(Symmetry%Axisymmetric) THEN CALL Photon2DSymTracking() ELSE CALL PhotonTriaTracking() END IF - END DO + END DO locPhotLoop END IF photonCount = photonCount + RadTransPhotPerCell(iELem) END DO END SUBROUTINE RadTrans_main -FUNCTION SetPhotonEnergy(iElem, Point) +FUNCTION SetPhotonEnergy(iElem, Point, iWave) !=================================================================================================================================== !> Calculation of the vibrational temperature (zero-point search) for the TSHO (Truncated Simple Harmonic Oscillator) !=================================================================================================================================== @@ -185,14 +191,16 @@ FUNCTION SetPhotonEnergy(iElem, Point) USE MOD_Globals USE MOD_Globals_Vars, ONLY : Pi USE MOD_RadiationTrans_Vars ,ONLY : RadEmiAdaptPhotonNum, Radiation_Emission_Spec_Total, RadTrans, RadTransPhotPerCell -USE MOD_RadiationTrans_Vars ,ONLY : RadObservationPoint, CalcRadObservationPoint,RadTransObsVolumeFrac +USE MOD_RadiationTrans_Vars ,ONLY : RadObservationPoint, RadObservationPointMethod,RadTransObsVolumeFrac USE MOD_Particle_Mesh_Vars ,ONLY : ElemVolume_Shared +USE MOD_Radiation_Vars ,ONLY : RadiationParameter,Radiation_Emission_spec ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES INTEGER, INTENT(IN) :: iElem REAL, INTENT(IN) :: Point(3) +INTEGER, INTENT(IN), OPTIONAL :: iWave !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES REAL :: SetPhotonEnergy @@ -207,7 +215,7 @@ FUNCTION SetPhotonEnergy(iElem, Point) SetPhotonEnergy = Radiation_Emission_Spec_Total(iElem)*ElemVolume_Shared(iElem)*RadTransObsVolumeFrac(iElem) / (RadTrans%NumPhotonsPerCell) END IF -IF (CalcRadObservationPoint) THEN +IF (RadObservationPointMethod.EQ.1) THEN Dist(1:3) = Point(1:3) - RadObservationPoint%MidPoint(1:3) absdistnorm = VECNORM(Dist(1:3)) DistNorm(1:3) = Dist(1:3)/absdistnorm @@ -220,6 +228,16 @@ FUNCTION SetPhotonEnergy(iElem, Point) ! Vec2(1:3) = FarthestPoint(1:3) - Point(1:3) ! fullangle = ACOS(DOT_PRODUCT(Vec1,Vec2)/(VECNORM(Vec1)*VECNORM(Vec2))) SetPhotonEnergy = SetPhotonEnergy * spaceangle/(4.*Pi) +ELSEIF (RadObservationPointMethod.EQ.2) THEN + IF (RadObservationPoint%CalcFullSpectra) THEN + SetPhotonEnergy = Radiation_Emission_Spec(iWave, iElem) * RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor & + *ElemVolume_Shared(iElem)*RadTransObsVolumeFrac(iElem) +! print*, 'arg', Radiation_Emission_Spec_Total(iElem)*ElemVolume_Shared(iElem)*RadTransObsVolumeFrac(iElem) /(4.*Pi), SetPhotonEnergy + ELSE + SetPhotonEnergy = SetPhotonEnergy /(4.*Pi) + END IF +! print*, iWave, SetPhotonEnergy +! read* END IF END FUNCTION SetPhotonEnergy @@ -230,7 +248,7 @@ FUNCTION SetPhotonPos(iElem, globPhotNum) !=================================================================================================================================== ! MODULES USE MOD_Globals -USE MOD_RadiationTrans_Vars, ONLY : RadiationPhotonPosModel, CalcRadObservationPoint +USE MOD_RadiationTrans_Vars, ONLY : RadiationPhotonPosModel, RadObservationPointMethod USE MOD_Particle_Mesh_Tools, ONLY : ParticleInsideQuad3D USE MOD_RadiationTrans_Init, ONLY : HALTON !USE MOD_PARTICLE_Vars, ONLY : Symmetry2DAxisymmetric @@ -269,7 +287,7 @@ FUNCTION SetPhotonPos(iElem, globPhotNum) SetPhotonPos = Bounds(1,:) + SetPhotonPos*(Bounds(2,:)-Bounds(1,:)) ! IF (Symmetry2DAxisymmetric) SetPhotonPos(3) = 0.0 CALL ParticleInsideQuad3D(SetPhotonPos,globElemID,InsideFlag) - IF (CalcRadObservationPoint) THEN + IF (RadObservationPointMethod.EQ.1) THEN IF (InsideFlag) THEN InsideFlag = PointInObsCone(SetPhotonPos) END IF @@ -285,7 +303,7 @@ FUNCTION SetPhotonStartDirection(iElem, iPhot, RandRot) ! MODULES USE MOD_Globals USE MOD_Globals_Vars, ONLY : Pi -USE MOD_RadiationTrans_Vars ,ONLY : RadiationDirectionModel, RadTransPhotPerCell, CalcRadObservationPoint,RadObservationPoint +USE MOD_RadiationTrans_Vars ,ONLY : RadiationDirectionModel, RadTransPhotPerCell, RadObservationPointMethod,RadObservationPoint USE MOD_RadiationTrans_Vars ,ONLY : PhotonProps ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -317,7 +335,7 @@ FUNCTION SetPhotonStartDirection(iElem, iPhot, RandRot) __STAMP__& ,' ERROR: Radiation-DirectionModel not implemented!. (unknown case)') END SELECT !PartBound%MapToPartBC(BC(SideID) - IF (CalcRadObservationPoint) THEN + IF (RadObservationPointMethod.EQ.1) THEN CALL RANDOM_NUMBER(iRan) RandomDirection(1) = RadObservationPoint%Diameter/2. * SQRT(iRan) CALL RANDOM_NUMBER(iRan) @@ -329,6 +347,10 @@ FUNCTION SetPhotonStartDirection(iElem, iPhot, RandRot) SetPhotonStartDirection(1:3) = SetPhotonStartDirection(1:3) + RadObservationPoint%MidPoint(1:3) SetPhotonStartDirection(1:3) = SetPhotonStartDirection(1:3) - PhotonProps%PhotonPos(1:3) SetPhotonStartDirection(1:3) = SetPhotonStartDirection(1:3) / VECNORM(SetPhotonStartDirection(1:3)) + ELSEIF (RadObservationPointMethod.EQ.2) THEN + SetPhotonStartDirection(1:3) = RadObservationPoint%MidPoint(1:3) + SetPhotonStartDirection(1:3) = SetPhotonStartDirection(1:3) - RadObservationPoint%ViewDirection(1:3) + SetPhotonStartDirection(1:3) = SetPhotonStartDirection(1:3) / VECNORM(SetPhotonStartDirection(1:3)) ELSE SELECT CASE(RadMod) CASE(1) diff --git a/src/radiation/radiative_transfer/radtrans_output.f90 b/src/radiation/radiative_transfer/radtrans_output.f90 index 27f62da6d..f63462ad9 100644 --- a/src/radiation/radiative_transfer/radtrans_output.f90 +++ b/src/radiation/radiative_transfer/radtrans_output.f90 @@ -46,7 +46,7 @@ SUBROUTINE WriteRadiationToHDF5() USE MOD_io_HDF5 USE MOD_HDF5_output ,ONLY: WriteArrayToHDF5,WriteAttributeToHDF5,WriteHDF5Header USE MOD_Mesh_Vars ,ONLY: offsetElem,nGlobalElems, MeshFile - USE MOD_RadiationTrans_Vars ,ONLY: RadiationElemAbsEnergy_Shared, CalcRadObservationPoint, RadObservation_Emission, RadObservationPoint + USE MOD_RadiationTrans_Vars ,ONLY: RadiationElemAbsEnergy_Shared, RadObservationPointMethod, RadObservation_Emission, RadObservationPoint USE MOD_RadiationTrans_Vars ,ONLY: Radiation_Emission_Spec_Total, RadTransPhotPerCell, RadObservation_EmissionPart USE MOD_Globals_Vars ,ONLY: ProjectName USE MOD_Particle_Mesh_Vars ,ONLY: ElemVolume_Shared @@ -177,7 +177,7 @@ SUBROUTINE WriteRadiationToHDF5() CALL WriteSurfSampleToHDF5() - IF (CalcRadObservationPoint) THEN + IF (RadObservationPointMethod.GT.0) THEN IF (myRank.EQ.0) THEN CALL MPI_REDUCE(MPI_IN_PLACE,RadObservation_Emission,RadiationParameter%WaveLenDiscrCoarse,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_WORLD,IERROR) ELSE @@ -191,14 +191,26 @@ SUBROUTINE WriteRadiationToHDF5() IF (myRank.EQ.0) THEN OPEN(unit=20,file='Radiation_ObservationPoint.csv', status='replace',action='write') WRITE(20,*) 'x,y1,y2' - IF (RadiationParameter%WaveLenReductionFactor.NE.1) THEN - DO iWave=1, RadiationParameter%WaveLenDiscrCoarse - WRITE(20,*) RadiationParameter%WaveLenCoarse(iWave)*1.E10,',',RadObservation_Emission(iWave)/RadObservationPoint%Area,',',RadObservation_EmissionPart(iWave) - END DO - ELSE - DO iWave=1, RadiationParameter%WaveLenDiscrCoarse - WRITE(20,*) RadiationParameter%WaveLen(iWave)*1.E10,',',RadObservation_Emission(iWave)/RadObservationPoint%Area,',',RadObservation_EmissionPart(iWave) - END DO + IF (RadObservationPointMethod.EQ.1) THEN + IF (RadiationParameter%WaveLenReductionFactor.NE.1) THEN + DO iWave=1, RadiationParameter%WaveLenDiscrCoarse + WRITE(20,*) RadiationParameter%WaveLenCoarse(iWave)*1.E10,',',RadObservation_Emission(iWave)/RadObservationPoint%Area,',',RadObservation_EmissionPart(iWave) + END DO + ELSE + DO iWave=1, RadiationParameter%WaveLenDiscrCoarse + WRITE(20,*) RadiationParameter%WaveLen(iWave)*1.E10,',',RadObservation_Emission(iWave)/RadObservationPoint%Area,',',RadObservation_EmissionPart(iWave) + END DO + END IF + ELSEIF (RadObservationPointMethod.EQ.2) THEN + IF (RadiationParameter%WaveLenReductionFactor.NE.1) THEN + DO iWave=1, RadiationParameter%WaveLenDiscrCoarse + WRITE(20,*) RadiationParameter%WaveLenCoarse(iWave)*1.E10,',',RadObservation_Emission(iWave),',',RadObservation_EmissionPart(iWave) + END DO + ELSE + DO iWave=1, RadiationParameter%WaveLenDiscrCoarse + WRITE(20,*) RadiationParameter%WaveLen(iWave)*1.E10,',',RadObservation_Emission(iWave),',',RadObservation_EmissionPart(iWave) + END DO + END IF END IF CLOSE(unit=20) END IF diff --git a/src/radiation/radiative_transfer/radtrans_vars.f90 b/src/radiation/radiative_transfer/radtrans_vars.f90 index 649344136..7c55245c4 100644 --- a/src/radiation/radiative_transfer/radtrans_vars.f90 +++ b/src/radiation/radiative_transfer/radtrans_vars.f90 @@ -25,7 +25,7 @@ MODULE MOD_RadiationTrans_Vars ! GLOBAL VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- LOGICAL :: useParticleRadiationSolver -LOGICAL :: CalcRadObservationPoint +INTEGER :: RadObservationPointMethod TYPE tRadObservationPoint REAL :: StartPoint(3) @@ -35,6 +35,7 @@ MODULE MOD_RadiationTrans_Vars REAL :: MidPoint(3) REAL :: Diameter REAL :: OrthoNormBasis(3,3) + LOGICAL :: CalcFullSpectra END TYPE TYPE(tRadObservationPoint) :: RadObservationPoint diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tools.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tools.f90 index 34fd8cf6a..00ba1a00e 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tools.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tools.f90 @@ -26,8 +26,8 @@ MODULE MOD_Photon_TrackingTools END INTERFACE PUBLIC :: PhotonThroughSideCheck3DFast, PhotonIntersectionWithSide, CalcAbsoprtion, PerfectPhotonReflection, DiffusePhotonReflection -PUBLIC :: CalcWallAbsoprtion, PointInObsCone, PhotonIntersectSensor -PUBLIC :: PhotonIntersectionWithSide2D, RotatePhotonIn2DPlane, PerfectPhotonReflection2D,DiffusePhotonReflection2D +PUBLIC :: CalcWallAbsoprtion, PointInObsCone, PhotonIntersectSensor, PhotonThroughSideCheck3DDir, PhotonIntersectionWithSide2DDir +PUBLIC :: PhotonIntersectionWithSide2D, RotatePhotonIn2DPlane, PerfectPhotonReflection2D,DiffusePhotonReflection2D, PhotonOnLineOfSight !----------------------------------------------------------------------------------------------------------------------------------- !----------------------------------------------------------------------------------------------------------------------------------- !=================================================================================================================================== @@ -140,6 +140,92 @@ SUBROUTINE PhotonThroughSideCheck3DFast(iLocSide,Element,ThroughSide,TriNum, IsM END SUBROUTINE PhotonThroughSideCheck3DFast +SUBROUTINE PhotonThroughSideCheck3DDir(iLocSide,Element,ThroughSide,TriNum,StartPoint,Dir) +!=================================================================================================================================== +!> Routine to check whether a particle crossed the given triangle of a side. The determinant between the normalix_photon_startd trajectory +!> vector and the vectors from two of the three nodes to the old particle position is calculated. If the determinants for the three +!> possible combinations are greater than x_photon_startro, then the particle went through this triangle of the side. +!> Note that if this is a mortar side, the side of the small neighbouring mortar element has to be checked. Thus, the orientation +!> is reversed. +!=================================================================================================================================== +! MODULES +USE MOD_Globals_Vars ,ONLY: EpsMach +USE MOD_Particle_Mesh_Vars, ONLY : NodeCoords_Shared, ElemSideNodeID_Shared +USE MOD_Mesh_Tools ,ONLY: GetCNElemID +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +! INPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT/OUTPUT VARIABLES +INTEGER,INTENT(IN) :: iLocSide +INTEGER,INTENT(IN) :: Element +INTEGER,INTENT(IN) :: TriNum +LOGICAL,INTENT(OUT) :: ThroughSide +REAL, INTENT(IN) :: StartPoint(3), Dir(3) +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +INTEGER :: CNElemID +INTEGER :: n, NodeID +REAL :: Px, Py, Pz +REAL :: Vx, Vy, Vz!, Vall +REAL :: xNode(3), yNode(3), zNode(3), Ax(3), Ay(3), Az(3) +REAL :: det(3) +!=================================================================================================================================== +CNElemID = GetCNElemID(Element) +ThroughSide = .FALSE. + +Px = StartPoint(1) +Py = StartPoint(2) +Pz = StartPoint(3) + +! Normalix_photon_startd particle trajectory (PartPos - lastPartPos)/ABS(PartPos - lastPartPos) +Vx = Dir(1) +Vy = Dir(2) +Vz = Dir(3) +! Get the coordinates of the first node and the vector from the particle position to the node +xNode(1) = NodeCoords_Shared(1,ElemSideNodeID_Shared(1,iLocSide,CNElemID)+1) +yNode(1) = NodeCoords_Shared(2,ElemSideNodeID_Shared(1,iLocSide,CNElemID)+1) +zNode(1) = NodeCoords_Shared(3,ElemSideNodeID_Shared(1,iLocSide,CNElemID)+1) +Ax(1) = xNode(1) - Px +Ay(1) = yNode(1) - Py +Az(1) = zNode(1) - Pz +! Get the vectors to the other two nodes, depending on the triangle number + +DO n = 2,3 + NodeID = n+TriNum-1 ! m = true node number of the sides (TriNum=1: NodeID=2,3; TriNum=2: NodeID=3,4) + xNode(n) = NodeCoords_Shared(1,ElemSideNodeID_Shared(NodeID,iLocSide,CNElemID)+1) + yNode(n) = NodeCoords_Shared(2,ElemSideNodeID_Shared(NodeID,iLocSide,CNElemID)+1) + zNode(n) = NodeCoords_Shared(3,ElemSideNodeID_Shared(NodeID,iLocSide,CNElemID)+1) + + Ax(n) = xNode(n) - Px + Ay(n) = yNode(n) - Py + Az(n) = zNode(n) - Pz +END DO + +!--- check whether v and the vectors from the particle to the two edge nodes build +!--- a right-hand-szstem. If yes for all edges: vector goes potentially through side +det(1) = ((Ay(1) * Vz - Az(1) * Vy) * Ax(3) + & + (Az(1) * Vx - Ax(1) * Vz) * Ay(3) + & + (Ax(1) * Vy - Ay(1) * Vx) * Az(3)) + +det(2) = ((Ay(2) * Vz - Az(2) * Vy) * Ax(1) + & + (Az(2) * Vx - Ax(2) * Vz) * Ay(1) + & + (Ax(2) * Vy - Ay(2) * Vx) * Az(1)) + +det(3) = ((Ay(3) * Vz - Az(3) * Vy) * Ax(2) + & + (Az(3) * Vx - Ax(3) * Vz) * Ay(2) + & + (Ax(3) * Vy - Ay(3) * Vx) * Az(2)) + +! Comparison of the determinants with eps, where a x_photon_startro is stored (due to machine precision) +IF ((det(1).ge.-epsMach).AND.(det(2).ge.-epsMach).AND.(det(3).ge.-epsMach)) THEN + ThroughSide = .TRUE. +END IF + +RETURN + +END SUBROUTINE PhotonThroughSideCheck3DDir + + SUBROUTINE PhotonIntersectionWithSide2D(iLocSide,Element,ThroughSide,IntersectionPos,isLastSide,Distance) !=================================================================================================================================== !> Routine to check whether a photon crossed the given side. @@ -282,10 +368,113 @@ SUBROUTINE PhotonIntersectionWithSide2D(iLocSide,Element,ThroughSide,Intersectio Distance = S END IF - RETURN - END SUBROUTINE PhotonIntersectionWithSide2D + +SUBROUTINE PhotonIntersectionWithSide2DDir(iLocSide,Element,ThroughSide,StartPoint, Dir) +!=================================================================================================================================== +!> Routine to check whether a photon crossed the given side. +!=================================================================================================================================== +! MODULES +USE MOD_Particle_Mesh_Vars, ONLY : ElemSideNodeID2D_Shared, NodeCoords_Shared +USE MOD_Mesh_Tools ,ONLY: GetCNElemID +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +! INPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT/OUTPUT VARIABLES +LOGICAL,INTENT(OUT) :: ThroughSide +INTEGER,INTENT(IN) :: iLocSide, Element +REAL,INTENT(IN) :: StartPoint(3), Dir(3) +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +INTEGER :: CNElemID +REAL :: y_photon_start,x_photon_start,yNode1,xNode1,yNode2,xNode2,sy,sz,sx +REAL :: l1,S1,l2,S2,l,S +REAL :: beta, alpha, deltay, a, b, c, tmpsqrt +!=================================================================================================================================== + CNElemID = GetCNElemID(Element) + ThroughSide = .FALSE. + + xNode1 = NodeCoords_Shared(1,ElemSideNodeID2D_Shared(1,iLocSide, CNElemID)) + yNode1 = NodeCoords_Shared(2,ElemSideNodeID2D_Shared(1,iLocSide, CNElemID)) + xNode2 = NodeCoords_Shared(1,ElemSideNodeID2D_Shared(2,iLocSide, CNElemID)) + yNode2 = NodeCoords_Shared(2,ElemSideNodeID2D_Shared(2,iLocSide, CNElemID)) + + x_photon_start=StartPoint(1) + y_photon_start=StartPoint(2) + + sx=Dir(1) + sy=Dir(2) + sz=Dir(3) + + IF (sx .EQ. 0.0) THEN + l = (x_photon_start-xNode1)/(xNode2-xNode1) + a = sy*sy + sz*sz + b = 2*sy*y_photon_start + c = y_photon_start*y_photon_start - yNode1*yNode1 + 2.*l*yNode1*yNode1 - l*l*yNode1*yNode1 & + - 2.*yNode1*yNode2*l + 2.*yNode1*yNode2*l*l - yNode2*yNode2*l*l + tmpsqrt = b*b - 4.*a*c + IF (tmpsqrt.LE.0.0) THEN + RETURN + END IF + S1 = (-b+SQRT(tmpsqrt))/(2.*a) + S2 = (-b-SQRT(tmpsqrt))/(2.*a) + + IF (S1.LE.0.0) THEN + S = S2 + ELSE + IF (S2.GT.0.0) THEN + IF(S2.GT.S1) THEN + S = S1 + ELSE + S = S2 + END IF + ELSE + S = S1 + END IF + END IF + ELSE + alpha = (xNode1 - x_photon_start) / sx + beta = (xNode2 - xNode1) / sx + deltay = (yNode2 - yNode1) + a = beta*beta*sy*sy - deltay*deltay + beta*beta*sz*sz + b = 2.*beta*sy*y_photon_start + 2.*alpha*beta*sy*sy - 2.*deltay*yNode1 + 2.*alpha*beta*sz*sz + c = y_photon_start*y_photon_start - yNode1*yNode1 + 2.*alpha*sy*y_photon_start + alpha*alpha*sy*sy + sz*sz*alpha*alpha + tmpsqrt = b*b - 4.*a*c + IF (tmpsqrt.LE.0.0) THEN + RETURN + END IF + l1 = (-b + SQRT(tmpsqrt))/(2.*a) + S1 = (xNode1-x_photon_start+(xNode2-xNode1)*l1)/sx + l2 = (-b - SQRT(tmpsqrt))/(2.*a) + S2 = (xNode1-x_photon_start+(xNode2-xNode1)*l2)/sx + + IF ((l1.LE.0.0).OR.(l1.GE.1.0)) THEN !if 1 is not a valid intersection -> 2 + l = l2; S = S2 + ELSE !1 is valid intersection + IF ((S1.LE.0.0)) THEN !1 would be moving backwards -> 2 + l = l2; S = S2 + ELSE + IF ((l2.GT.0.0).AND.(l2.LT.1.0).AND.(S2.GT.0.0)) THEN !1 and 2 valid -> chose shorter one + IF (S2.GT.S1) THEN + l=l1; S=S1 + ELSE + l=l2; S=S2 + END IF + ELSE !1 is only valid intersection -> 1 + l=l1; S=S1 + END IF + END IF + END IF + + END IF + + IF((S .GT. 0.0) .AND. (0.0 .LE. l) .AND. (l .LE. 1.0)) THEN + ThroughSide = .TRUE. + END IF +END SUBROUTINE PhotonIntersectionWithSide2DDir + SUBROUTINE RotatePhotonIn2DPlane(IntersectionPos) !=================================================================================================================================== !> Routine to check whether a photon crossed the given side. @@ -898,4 +1087,53 @@ LOGICAL FUNCTION PhotonIntersectSensor(Point, Direction) END FUNCTION PhotonIntersectSensor +LOGICAL FUNCTION PhotonOnLineOfSight(Direction) +!=================================================================================================================================== +! modified particle emmission for LD case +!=================================================================================================================================== +! MODULES + USE MOD_Globals + USE MOD_RadiationTrans_Vars, ONLY: RadObservationPoint +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! INOUTPUT VARIABLES +REAL, INTENT(IN) :: Direction(3) +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +REAL :: SkalarFactors(3) +INTEGER :: iDir, jDir +!=================================================================================================================================== +PhotonOnLineOfSight = .FALSE. +DO iDir = 1, 3 + IF (Direction(iDir).EQ.0.0) THEN + IF (RadObservationPoint%ViewDirection(iDir).NE.0.0) THEN + RETURN + ELSE + SkalarFactors(iDir) = 0.0 + END IF + ELSE + IF (RadObservationPoint%ViewDirection(iDir).EQ.0.0) THEN + RETURN + ELSE + SkalarFactors(iDir) = Direction(iDir)/ RadObservationPoint%ViewDirection(iDir) + END IF + END IF +END DO +PhotonOnLineOfSight = .TRUE. +DO iDir = 1, 2 + DO jDir = iDir+1 , 3 + IF (SkalarFactors(iDir).EQ.0.0) CYCLE + IF (SkalarFactors(jDir).EQ.0.0) CYCLE + IF (.NOT.ALMOSTEQUAL(SkalarFactors(iDir),SkalarFactors(jDir))) THEN + PhotonOnLineOfSight = .FALSE. + RETURN + END IF + END DO +END DO + +END FUNCTION PhotonOnLineOfSight + END MODULE MOD_Photon_TrackingTools diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 index 60383248e..b87d0f986 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 @@ -51,9 +51,10 @@ SUBROUTINE PhotonTriaTracking() USE MOD_Globals USE MOD_Particle_Mesh_Vars USE MOD_Particle_Boundary_Vars, ONLY:PartBound -USE MOD_RadiationTrans_Vars, ONLY:PhotonProps,RadObservation_Emission, CalcRadObservationPoint, RadObservation_EmissionPart -USE MOD_Photon_TrackingTools, ONLY:PhotonThroughSideCheck3DFast, PhotonIntersectionWithSide,CalcAbsoprtion +USE MOD_RadiationTrans_Vars, ONLY:PhotonProps,RadObservation_Emission, RadObservationPointMethod, RadObservation_EmissionPart +USE MOD_Photon_TrackingTools, ONLY:PhotonThroughSideCheck3DFast, PhotonIntersectionWithSide,CalcAbsoprtion,PhotonOnLineOfSight USE MOD_Photon_TrackingTools, ONLY:PerfectPhotonReflection, DiffusePhotonReflection, CalcWallAbsoprtion, PointInObsCone +USE MOD_Photon_TrackingTools, ONLY:PhotonIntersectSensor IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES @@ -224,8 +225,15 @@ SUBROUTINE PhotonTriaTracking() CASE(1) !PartBound%OpenBC) IF (NrOfThroughSides.LT.2) CALL PhotonIntersectionWithSide(LocalSide,ElemID,TriNum, IntersectionPos) CALL CalcAbsoprtion(IntersectionPos(1:3),ElemID, DONE) - IF (CalcRadObservationPoint) THEN + IF (RadObservationPointMethod.EQ.1) THEN IF (PointInObsCone(IntersectionPos(1:3))) THEN + IF (PhotonIntersectSensor(IntersectionPos(1:3), PhotonProps%PhotonDirection(1:3))) THEN + RadObservation_Emission(PhotonProps%WaveLength) = RadObservation_Emission(PhotonProps%WaveLength) + PhotonProps%PhotonEnergy + RadObservation_EmissionPart(PhotonProps%WaveLength) = RadObservation_EmissionPart(PhotonProps%WaveLength) + 1 + END IF + END IF + ELSE IF (RadObservationPointMethod.EQ.2) THEN + IF (PhotonOnLineOfSight(PhotonProps%PhotonDirection(1:3))) THEN RadObservation_Emission(PhotonProps%WaveLength) = RadObservation_Emission(PhotonProps%WaveLength) + PhotonProps%PhotonEnergy RadObservation_EmissionPart(PhotonProps%WaveLength) = RadObservation_EmissionPart(PhotonProps%WaveLength) + 1 END IF @@ -315,10 +323,10 @@ SUBROUTINE Photon2DSymTracking() USE MOD_Globals USE MOD_Particle_Mesh_Vars USE MOD_Particle_Boundary_Vars, ONLY:PartBound -USE MOD_RadiationTrans_Vars, ONLY:PhotonProps, RadObservation_Emission, CalcRadObservationPoint,RadObservation_EmissionPart +USE MOD_RadiationTrans_Vars, ONLY:PhotonProps, RadObservation_Emission, RadObservationPointMethod,RadObservation_EmissionPart USE MOD_Photon_TrackingTools, ONLY:CalcAbsoprtion, CalcWallAbsoprtion, DiffusePhotonReflection2D, PointInObsCone USE MOD_Photon_TrackingTools, ONLY:PhotonIntersectionWithSide2D, RotatePhotonIn2DPlane, PerfectPhotonReflection2D -USE MOD_Photon_TrackingTools, ONLY:PhotonIntersectSensor +USE MOD_Photon_TrackingTools, ONLY:PhotonIntersectSensor, PhotonOnLineOfSight IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES @@ -435,13 +443,18 @@ SUBROUTINE Photon2DSymTracking() CASE(1) !PartBound%OpenBC) CALL CalcAbsoprtion(IntersectionPos(1:3),ElemID, DONE) DONE = .TRUE. - IF (CalcRadObservationPoint) THEN + IF (RadObservationPointMethod.EQ.1) THEN IF (PointInObsCone(IntersectionPos(1:3))) THEN IF (PhotonIntersectSensor(IntersectionPos(1:3), PhotonProps%PhotonDirection(1:3))) THEN RadObservation_Emission(PhotonProps%WaveLength) = RadObservation_Emission(PhotonProps%WaveLength) + PhotonProps%PhotonEnergy RadObservation_EmissionPart(PhotonProps%WaveLength) = RadObservation_EmissionPart(PhotonProps%WaveLength) + 1 END IF END IF + ELSE IF (RadObservationPointMethod.EQ.2) THEN + IF (PhotonOnLineOfSight(PhotonProps%PhotonDirection(1:3))) THEN + RadObservation_Emission(PhotonProps%WaveLength) = RadObservation_Emission(PhotonProps%WaveLength) + PhotonProps%PhotonEnergy + RadObservation_EmissionPart(PhotonProps%WaveLength) = RadObservation_EmissionPart(PhotonProps%WaveLength) + 1 + END IF END IF CYCLE CASE(2) From 437909993e89fa25b24608c9becd9005c826809a Mon Sep 17 00:00:00 2001 From: Marcel Pfeiffer Date: Sun, 1 May 2022 17:04:39 +0200 Subject: [PATCH 041/495] print deleted --- src/radiation/radiative_transfer/radtrans_main.f90 | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/radiation/radiative_transfer/radtrans_main.f90 b/src/radiation/radiative_transfer/radtrans_main.f90 index 25e5daac0..0ebc74fe7 100644 --- a/src/radiation/radiative_transfer/radtrans_main.f90 +++ b/src/radiation/radiative_transfer/radtrans_main.f90 @@ -232,12 +232,9 @@ FUNCTION SetPhotonEnergy(iElem, Point, iWave) IF (RadObservationPoint%CalcFullSpectra) THEN SetPhotonEnergy = Radiation_Emission_Spec(iWave, iElem) * RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor & *ElemVolume_Shared(iElem)*RadTransObsVolumeFrac(iElem) -! print*, 'arg', Radiation_Emission_Spec_Total(iElem)*ElemVolume_Shared(iElem)*RadTransObsVolumeFrac(iElem) /(4.*Pi), SetPhotonEnergy ELSE SetPhotonEnergy = SetPhotonEnergy /(4.*Pi) END IF -! print*, iWave, SetPhotonEnergy -! read* END IF END FUNCTION SetPhotonEnergy From d134de011016aed83c29697d1a26f3440cb59545 Mon Sep 17 00:00:00 2001 From: Marcel Pfeiffer Date: Sun, 1 May 2022 18:28:35 +0200 Subject: [PATCH 042/495] bugfix one cell display rank --- src/radiation/radiative_transfer/radtrans_init.f90 | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/radiation/radiative_transfer/radtrans_init.f90 b/src/radiation/radiative_transfer/radtrans_init.f90 index f79d04a74..3ad553c2f 100644 --- a/src/radiation/radiative_transfer/radtrans_init.f90 +++ b/src/radiation/radiative_transfer/radtrans_init.f90 @@ -200,6 +200,7 @@ SUBROUTINE InitRadiationTransport() #if USE_MPI +IF (RadiationSwitches%MacroRadInput) THEN firstElem = INT(REAL( myComputeNodeRank *nComputeNodeElems)/REAL(nComputeNodeProcessors))+1 lastElem = INT(REAL((myComputeNodeRank+1)*nComputeNodeElems)/REAL(nComputeNodeProcessors)) IF (nComputeNodeElems.NE.nComputeNodeProcessors) THEN @@ -249,6 +250,11 @@ SUBROUTINE InitRadiationTransport() END DO CALL MPI_ALLREDUCE(MaxSumTemp, GlobalMaxTemp, 1, MPI_2DOUBLE_PRECISION, MPI_MAXLOC,MPI_COMM_WORLD,iError) DisplRank = NINT(GlobalMaxTemp(2)) +ELSE + firstElem = INT(REAL( myComputeNodeRank *nComputeNodeElems)/REAL(nComputeNodeProcessors))+1 + lastElem = INT(REAL((myComputeNodeRank+1)*nComputeNodeElems)/REAL(nComputeNodeProcessors)) + DisplRank = 0 +END IF #else firstElem = 1 lastElem = nElems From 621a614e99c4d65f0a3f59df94d6b76179bec1bc Mon Sep 17 00:00:00 2001 From: Julian Beyer Date: Wed, 4 May 2022 10:15:32 +0200 Subject: [PATCH 043/495] first convolution for instrumental broadening - not energy conserving yet --- .../radiative_transfer/radtrans_init.f90 | 15 +- .../radiative_transfer/radtrans_output.f90 | 168 +++++++++++++++--- .../radiative_transfer/radtrans_vars.f90 | 5 +- 3 files changed, 164 insertions(+), 24 deletions(-) diff --git a/src/radiation/radiative_transfer/radtrans_init.f90 b/src/radiation/radiative_transfer/radtrans_init.f90 index 3ad553c2f..a6f80a0e6 100644 --- a/src/radiation/radiative_transfer/radtrans_init.f90 +++ b/src/radiation/radiative_transfer/radtrans_init.f90 @@ -52,10 +52,12 @@ SUBROUTINE DefineParametersRadiationTrans() CALL prms%CreateIntOption( 'Radiation-PhotonPosModel', 'HM','1') CALL prms%CreateIntOption( 'Radiation-PhotonWaveLengthModel', 'HM','1') CALL prms%CreateRealArrayOption('Radiation-ObservationMidPoint', 'HM') +CALL prms%CreateRealArrayOption('Radiation-ObservationSlitFunction', 'Slit function for convolution, trapezoid, 1:topwidth[A] 2:basewidth[A]', '0.,0.') CALL prms%CreateRealOption('Radiation-ObservationDiameter', 'HM') CALL prms%CreateRealArrayOption('Radiation-ObservationViewDirection', 'HM') CALL prms%CreateRealOption('Radiation-ObservationAngularAperture', 'HM') CALL prms%CreateLogicalOption('Radiation-ObservationCalcFullSpectra','.FALSE.') +CALL prms%CreateLogicalOption('Radiation-ObservationDoConvolution','Consider instrumental broadening?','.FALSE.') END SUBROUTINE DefineParametersRadiationTrans @@ -98,7 +100,7 @@ SUBROUTINE InitRadiationTransport() !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES INTEGER :: iWave, iElem, firstElem, lastElem, ElemDisp, DisplRank, iSpec, currentRank -REAL :: LocTemp, ObsLengt, MaxSumTemp(2), GlobalMaxTemp(2) +REAL :: LocTemp, ObsLengt, MaxSumTemp(2), GlobalMaxTemp(2), hilf LOGICAL :: ElemInCone !=================================================================================================================================== SWRITE(UNIT_StdOut,'(132("-"))') @@ -114,6 +116,7 @@ SUBROUTINE InitRadiationTransport() RadiationPhotonWaveLengthModel = GETINT('Radiation-PhotonWaveLengthModel') RadEmiAdaptPhotonNum = GETLOGICAL('Radiation-AdaptivePhotonNumEmission') RadObservationPointMethod = GETINT('Radiation-RadObservationPointMethod') +ObservationDoConvolution = GETLOGICAL('Radiation-ObservationDoConvolution') IF (RadObservationPointMethod.GT.0) THEN RadObservationPoint%AngularAperture = GETREAL('Radiation-ObservationAngularAperture') @@ -123,6 +126,12 @@ SUBROUTINE InitRadiationTransport() IF(.NOT.ALL(RadObservationPoint%ViewDirection(:).EQ.0.)) THEN RadObservationPoint%ViewDirection = RadObservationPoint%ViewDirection / VECNORM(RadObservationPoint%ViewDirection) END IF + RadObservationPoint%SlitFunction = GETREALARRAY('Radiation-ObservationSlitFunction',2) + IF(RadObservationPoint%SlitFunction(1).GT.RadObservationPoint%SlitFunction(2)) THEN + hilf = RadObservationPoint%SlitFunction(1) + RadObservationPoint%SlitFunction(1) = RadObservationPoint%SlitFunction(2) + RadObservationPoint%SlitFunction(2) = hilf + END IF RadObservationPoint%OrthoNormBasis(1:3,1) = RadObservationPoint%ViewDirection(1:3) CALL FindLinIndependentVectors(RadObservationPoint%OrthoNormBasis(1:3,1), RadObservationPoint%OrthoNormBasis(1:3,2), RadObservationPoint%OrthoNormBasis(1:3,3)) CALL GramSchmidtAlgo(RadObservationPoint%OrthoNormBasis(1:3,1), RadObservationPoint%OrthoNormBasis(1:3,2), RadObservationPoint%OrthoNormBasis(1:3,3)) @@ -140,8 +149,10 @@ SUBROUTINE InitRadiationTransport() IF(Symmetry%Order.EQ.2) CALL BuildMesh2DInfo() IF (RadObservationPointMethod.GT.0) THEN - ALLOCATE(RadObservation_Emission(RadiationParameter%WaveLenDiscrCoarse),RadObservation_EmissionPart(RadiationParameter%WaveLenDiscrCoarse)) + ALLOCATE(RadObservation_Emission(RadiationParameter%WaveLenDiscrCoarse),RadObservation_Emission_Conv(RadiationParameter%WaveLenDiscrCoarse), & + RadObservation_EmissionPart(RadiationParameter%WaveLenDiscrCoarse)) RadObservation_Emission = 0.0 + RadObservation_Emission_Conv = 0.0 RadObservation_EmissionPart = 0 END IF diff --git a/src/radiation/radiative_transfer/radtrans_output.f90 b/src/radiation/radiative_transfer/radtrans_output.f90 index f63462ad9..4f33a520d 100644 --- a/src/radiation/radiative_transfer/radtrans_output.f90 +++ b/src/radiation/radiative_transfer/radtrans_output.f90 @@ -48,6 +48,7 @@ SUBROUTINE WriteRadiationToHDF5() USE MOD_Mesh_Vars ,ONLY: offsetElem,nGlobalElems, MeshFile USE MOD_RadiationTrans_Vars ,ONLY: RadiationElemAbsEnergy_Shared, RadObservationPointMethod, RadObservation_Emission, RadObservationPoint USE MOD_RadiationTrans_Vars ,ONLY: Radiation_Emission_Spec_Total, RadTransPhotPerCell, RadObservation_EmissionPart + USE MOD_RadiationTrans_Vars ,ONLY: ObservationDoConvolution, RadObservation_Emission_Conv USE MOD_Globals_Vars ,ONLY: ProjectName USE MOD_Particle_Mesh_Vars ,ONLY: ElemVolume_Shared USE MOD_Radiation_Vars ,ONLY: RadiationSwitches, Radiation_ElemEnergy_Species, RadiationParameter, Radiation_Absorption_Spec @@ -189,30 +190,59 @@ SUBROUTINE WriteRadiationToHDF5() CALL MPI_REDUCE(RadObservation_EmissionPart,0 ,RadiationParameter%WaveLenDiscrCoarse,MPI_INTEGER,MPI_SUM,0,MPI_COMM_WORLD,IERROR) ENDIF IF (myRank.EQ.0) THEN - OPEN(unit=20,file='Radiation_ObservationPoint.csv', status='replace',action='write') - WRITE(20,*) 'x,y1,y2' - IF (RadObservationPointMethod.EQ.1) THEN - IF (RadiationParameter%WaveLenReductionFactor.NE.1) THEN - DO iWave=1, RadiationParameter%WaveLenDiscrCoarse - WRITE(20,*) RadiationParameter%WaveLenCoarse(iWave)*1.E10,',',RadObservation_Emission(iWave)/RadObservationPoint%Area,',',RadObservation_EmissionPart(iWave) - END DO - ELSE - DO iWave=1, RadiationParameter%WaveLenDiscrCoarse - WRITE(20,*) RadiationParameter%WaveLen(iWave)*1.E10,',',RadObservation_Emission(iWave)/RadObservationPoint%Area,',',RadObservation_EmissionPart(iWave) - END DO + IF(ObservationDoConvolution) THEN + CALL SpectralConvolution(RadObservation_Emission,RadObservation_Emission_Conv) + OPEN(unit=20,file='Radiation_ObservationPoint.csv', status='replace',action='write') + WRITE(20,*) 'x,y1,y2,y3' + IF (RadObservationPointMethod.EQ.1) THEN + IF (RadiationParameter%WaveLenReductionFactor.NE.1) THEN + DO iWave=1, RadiationParameter%WaveLenDiscrCoarse + WRITE(20,*) RadiationParameter%WaveLenCoarse(iWave)*1.E10,',',RadObservation_Emission(iWave)/RadObservationPoint%Area,',',RadObservation_EmissionPart(iWave),',',RadObservation_Emission_Conv(iWave)/RadObservationPoint%Area + END DO + ELSE + DO iWave=1, RadiationParameter%WaveLenDiscrCoarse + WRITE(20,*) RadiationParameter%WaveLen(iWave)*1.E10,',',RadObservation_Emission(iWave)/RadObservationPoint%Area,',',RadObservation_EmissionPart(iWave),',',RadObservation_Emission_Conv(iWave)/RadObservationPoint%Area + END DO + END IF + ELSEIF (RadObservationPointMethod.EQ.2) THEN + IF (RadiationParameter%WaveLenReductionFactor.NE.1) THEN + DO iWave=1, RadiationParameter%WaveLenDiscrCoarse + WRITE(20,*) RadiationParameter%WaveLenCoarse(iWave)*1.E10,',',RadObservation_Emission(iWave),',',RadObservation_EmissionPart(iWave),',',RadObservation_Emission_Conv(iWave) + END DO + ELSE + DO iWave=1, RadiationParameter%WaveLenDiscrCoarse + WRITE(20,*) RadiationParameter%WaveLen(iWave)*1.E10,',',RadObservation_Emission(iWave),',',RadObservation_EmissionPart(iWave),',',RadObservation_Emission_Conv(iWave) + END DO + END IF END IF - ELSEIF (RadObservationPointMethod.EQ.2) THEN - IF (RadiationParameter%WaveLenReductionFactor.NE.1) THEN - DO iWave=1, RadiationParameter%WaveLenDiscrCoarse - WRITE(20,*) RadiationParameter%WaveLenCoarse(iWave)*1.E10,',',RadObservation_Emission(iWave),',',RadObservation_EmissionPart(iWave) - END DO - ELSE - DO iWave=1, RadiationParameter%WaveLenDiscrCoarse - WRITE(20,*) RadiationParameter%WaveLen(iWave)*1.E10,',',RadObservation_Emission(iWave),',',RadObservation_EmissionPart(iWave) - END DO + CLOSE(unit=20) + ELSE + OPEN(unit=20,file='Radiation_ObservationPoint.csv', status='replace',action='write') + WRITE(20,*) 'x,y1,y2' + IF (RadObservationPointMethod.EQ.1) THEN + IF (RadiationParameter%WaveLenReductionFactor.NE.1) THEN + DO iWave=1, RadiationParameter%WaveLenDiscrCoarse + WRITE(20,*) RadiationParameter%WaveLenCoarse(iWave)*1.E10,',',RadObservation_Emission(iWave)/RadObservationPoint%Area,',',RadObservation_EmissionPart(iWave) + END DO + ELSE + DO iWave=1, RadiationParameter%WaveLenDiscrCoarse + WRITE(20,*) RadiationParameter%WaveLen(iWave)*1.E10,',',RadObservation_Emission(iWave)/RadObservationPoint%Area,',',RadObservation_EmissionPart(iWave) + END DO + END IF + ELSEIF (RadObservationPointMethod.EQ.2) THEN + IF (RadiationParameter%WaveLenReductionFactor.NE.1) THEN + DO iWave=1, RadiationParameter%WaveLenDiscrCoarse + WRITE(20,*) RadiationParameter%WaveLenCoarse(iWave)*1.E10,',',RadObservation_Emission(iWave),',',RadObservation_EmissionPart(iWave) + END DO + ELSE + DO iWave=1, RadiationParameter%WaveLenDiscrCoarse + WRITE(20,*) RadiationParameter%WaveLen(iWave)*1.E10,',',RadObservation_Emission(iWave),',',RadObservation_EmissionPart(iWave) + END DO + END IF END IF + CLOSE(unit=20) END IF - CLOSE(unit=20) + END IF END IF @@ -544,4 +574,100 @@ SUBROUTINE WriteSurfSampleToHDF5() END SUBROUTINE WriteSurfSampleToHDF5 +SUBROUTINE SpectralConvolution(RadObservation_Emission, RadObservation_Emission_Conv) + !=================================================================================================================================== + ! calculates spectral concolution with slit function/instrumental broadening profile/spectral resolution function + !=================================================================================================================================== + ! MODULES + ! USE MOD_Globals + USE MOD_RadiationTrans_Vars ,ONLY: RadObservationPoint + USE MOD_Radiation_Vars ,ONLY : RadiationInput, RadiationParameter, SpeciesRadiation + ! IMPLICIT VARIABLE HANDLING + IMPLICIT NONE + !----------------------------------------------------------------------------------------------------------------------------------- + ! INPUT VARIABLES + REAL, INTENT(IN) :: RadObservation_Emission(:) + REAL, INTENT(INOUT) :: RadObservation_Emission_Conv(:) + !----------------------------------------------------------------------------------------------------------------------------------- + ! OUTPUT VARIABLES + !----------------------------------------------------------------------------------------------------------------------------------- + ! LOCAL VARIABLES + REAL :: topwidth, basewidth + INTEGER :: iWave_min, iWave, i + REAL :: topwidth_half, basewidth_half, slope + REAL :: wavelength_min_base, wavelength_max_base, wavelength_min_top, wavelength_max_top + INTEGER :: io_error, w + REAL :: fractionl, fractionr, delta_base, delta_top + !=================================================================================================================================== + + topwidth = RadObservationPoint%SlitFunction(1)*1.E-10 + basewidth = RadObservationPoint%SlitFunction(2)*1.E-10 + + iWave_min = 1!0 + + basewidth_half = 0.5 * basewidth + topwidth_half = 0.5 * topwidth + slope = 1. / (basewidth_half-topwidth_half) + RadObservation_Emission_Conv=0.0 + DO iWave=1, RadiationParameter%WaveLenDiscr + wavelength_min_base = RadiationParameter%WaveLen(iWave) - basewidth_half + wavelength_max_base = RadiationParameter%WaveLen(iWave) + basewidth_half + wavelength_min_top = RadiationParameter%WaveLen(iWave) - topwidth_half + wavelength_max_top = RadiationParameter%WaveLen(iWave) + topwidth_half +! --- start index determination + DO WHILE(RadiationParameter%WaveLen(iWave_min+1) .LT. wavelength_min_base) + iWave_min = iWave_min + 1 + END DO + +! --- slit function + DO i = iWave_min, RadiationParameter%WaveLenDiscr-1 + IF(RadiationParameter%WaveLen(i) .LT. wavelength_min_base) THEN + fractionl = 0. + IF(RadiationParameter%WaveLen(i+1) .GT. wavelength_min_top) THEN + STOP 'slit function: step width is too big!' + END IF + fractionr = slope * (RadiationParameter%WaveLen(i+1) - RadiationParameter%WaveLen(iWave) + basewidth_half) + delta_base = RadiationParameter%WaveLen(i+1) - wavelength_min_base + delta_top = 0. + ELSEIF(RadiationParameter%WaveLen(i+1) .LT. wavelength_min_top) THEN + fractionl = slope * (RadiationParameter%WaveLen(i ) - RadiationParameter%WaveLen(iWave) + basewidth_half) + fractionr = slope * (RadiationParameter%WaveLen(i+1) - RadiationParameter%WaveLen(iWave) + basewidth_half) + delta_base = RadiationParameter%WaveLenIncr + delta_top = 0. + ELSEIF(RadiationParameter%WaveLen(i ) .LT. wavelength_min_top) THEN + fractionl = slope * (RadiationParameter%WaveLen(i ) - RadiationParameter%WaveLen(iWave) + basewidth_half) + fractionr = 1. + delta_base = wavelength_min_top - RadiationParameter%WaveLen(i) + delta_top = RadiationParameter%WaveLen(i+1) - wavelength_min_top + ELSEIF(RadiationParameter%WaveLen(i+1) .LT. wavelength_max_top) THEN + delta_base = 0. + delta_top = RadiationParameter%WaveLenIncr + ELSEIF(RadiationParameter%WaveLen(i ) .LT. wavelength_max_top) THEN + fractionl = 1. + fractionr = - slope * (RadiationParameter%WaveLen(i+1) - RadiationParameter%WaveLen(iWave) - basewidth_half) + delta_base = RadiationParameter%WaveLen(i+1) - wavelength_max_top + delta_top = wavelength_max_top - RadiationParameter%WaveLen(i) + ELSEIF(RadiationParameter%WaveLen(i+1) .LT. wavelength_max_base) THEN + fractionl = - slope * (RadiationParameter%WaveLen(i ) - RadiationParameter%WaveLen(iWave) - basewidth_half) + fractionr = - slope * (RadiationParameter%WaveLen(i+1) - RadiationParameter%WaveLen(iWave) - basewidth_half) + delta_base = RadiationParameter%WaveLenIncr + delta_top = 0. + ELSEIF(RadiationParameter%WaveLen(i) .LT. wavelength_max_base) THEN + fractionl = - slope * (RadiationParameter%WaveLen(i ) - RadiationParameter%WaveLen(iWave) - basewidth_half) + fractionr = 0. + delta_base = wavelength_max_base - RadiationParameter%WaveLen(i) + delta_top = 0. + ELSE + exit + END IF + + RadObservation_Emission_Conv(iWave) = RadObservation_Emission_Conv(iWave) & + + ((fractionl+fractionr)*.5*delta_base+delta_top) & + * RadObservation_Emission(i+1)*1.E10 + + END DO + END DO + +END SUBROUTINE SpectralConvolution + END MODULE MOD_RadTrans_Output diff --git a/src/radiation/radiative_transfer/radtrans_vars.f90 b/src/radiation/radiative_transfer/radtrans_vars.f90 index 7c55245c4..af6c48b34 100644 --- a/src/radiation/radiative_transfer/radtrans_vars.f90 +++ b/src/radiation/radiative_transfer/radtrans_vars.f90 @@ -26,6 +26,7 @@ MODULE MOD_RadiationTrans_Vars !----------------------------------------------------------------------------------------------------------------------------------- LOGICAL :: useParticleRadiationSolver INTEGER :: RadObservationPointMethod +LOGICAL :: ObservationDoConvolution TYPE tRadObservationPoint REAL :: StartPoint(3) @@ -36,10 +37,12 @@ MODULE MOD_RadiationTrans_Vars REAL :: Diameter REAL :: OrthoNormBasis(3,3) LOGICAL :: CalcFullSpectra + REAL :: SlitFunction(2) END TYPE TYPE(tRadObservationPoint) :: RadObservationPoint -REAL,ALLOCATABLE :: RadObservation_Emission(:) +REAL,ALLOCATABLE :: RadObservation_Emission(:) +REAL,ALLOCATABLE :: RadObservation_Emission_Conv(:) INTEGER,ALLOCATABLE :: RadObservation_EmissionPart(:) TYPE tRadTrans From 2719fc1efc6af20f3045192777df8eeb14f80152 Mon Sep 17 00:00:00 2001 From: Marcel Pfeiffer Date: Wed, 11 May 2022 12:00:49 +0200 Subject: [PATCH 044/495] changed LOS, currently onyl axissym --- src/piclas2vtk.f90 | 12 +-- .../radiative_transfer/radtrans_init.f90 | 68 ++++++++++++++-- .../radiative_transfer/radtrans_main.f90 | 81 ++++++++++++------- .../radiative_transfer/radtrans_vars.f90 | 3 + .../tracking/radtrans_tools.f90 | 21 ++--- 5 files changed, 133 insertions(+), 52 deletions(-) diff --git a/src/piclas2vtk.f90 b/src/piclas2vtk.f90 index 64c69f0ce..7056ff726 100644 --- a/src/piclas2vtk.f90 +++ b/src/piclas2vtk.f90 @@ -330,7 +330,7 @@ PROGRAM piclas2vtk END IF ! === ElemData =================================================================================================================== IF(ElemDataExists) THEN - CALL ConvertElemData(InputStateFile,'ElemData','VarNamesAdd') + CALL ConvertElemData(InputStateFile,'ElemData','VarNamesAdd',iArgs) END IF ! === SurfaceData ================================================================================================================ IF(SurfaceDataExists) THEN @@ -345,7 +345,7 @@ PROGRAM piclas2vtk ! === AdaptiveInfo IF(VisuAdaptiveInfo) THEN IF(AdaptiveInfoExists) THEN - CALL ConvertElemData(InputStateFile,'AdaptiveInfo','VarNamesAdaptive') + CALL ConvertElemData(InputStateFile,'AdaptiveInfo','VarNamesAdaptive',iArgs) END IF END IF END DO ! iArgs = 2, nArgs @@ -797,7 +797,7 @@ SUBROUTINE ConvertPartData(InputStateFile) END SUBROUTINE ConvertPartData -SUBROUTINE ConvertElemData(InputStateFile,ArrayName,VarName) +SUBROUTINE ConvertElemData(InputStateFile,ArrayName,VarName, iArgs) !=================================================================================================================================== !> Convert element/volume data (single value per cell, e.g. DSMC/BGK results) to a VTK format !=================================================================================================================================== @@ -815,11 +815,12 @@ SUBROUTINE ConvertElemData(InputStateFile,ArrayName,VarName) CHARACTER(LEN=255),INTENT(IN) :: InputStateFile CHARACTER(LEN=*),INTENT(IN) :: ArrayName CHARACTER(LEN=*),INTENT(IN) :: VarName +INTEGER, INTENT(IN) :: iArgs !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -CHARACTER(LEN=255) :: FileString, File_Type +CHARACTER(LEN=255) :: FileString, File_Type, File_Num REAL :: OutputTime INTEGER :: nDims,nVarAdd CHARACTER(LEN=255),ALLOCATABLE :: VarNamesAdd(:) @@ -853,7 +854,8 @@ SUBROUTINE ConvertElemData(InputStateFile,ArrayName,VarName) CASE('DSMCState','DSMCHOState') FileString=TRIM(TIMESTAMP(TRIM(ProjectName)//'_visuDSMC',OutputTime))//'.vtu' CASE('RadiationState') - FileString=TRIM(TRIM(ProjectName)//'_RadVisu')//'.vtu' + WRITE(File_Num, "(I3.3)") iArgs + FileString=TRIM(TRIM(ProjectName)//'_RadVisu_'//TRIM(File_Num))//'.vtu' END SELECT ! TODO: This is probably borked for NGeo>1 because then NodeCoords are not the corner nodes CALL WriteDataToVTK_PICLas(8,FileString,nVarAdd,VarNamesAdd(1:nVarAdd),nUniqueNodes,NodeCoords_Connect(1:3,1:nUniqueNodes),nElems,& diff --git a/src/radiation/radiative_transfer/radtrans_init.f90 b/src/radiation/radiative_transfer/radtrans_init.f90 index 3ad553c2f..bc997b390 100644 --- a/src/radiation/radiative_transfer/radtrans_init.f90 +++ b/src/radiation/radiative_transfer/radtrans_init.f90 @@ -126,13 +126,14 @@ SUBROUTINE InitRadiationTransport() RadObservationPoint%OrthoNormBasis(1:3,1) = RadObservationPoint%ViewDirection(1:3) CALL FindLinIndependentVectors(RadObservationPoint%OrthoNormBasis(1:3,1), RadObservationPoint%OrthoNormBasis(1:3,2), RadObservationPoint%OrthoNormBasis(1:3,3)) CALL GramSchmidtAlgo(RadObservationPoint%OrthoNormBasis(1:3,1), RadObservationPoint%OrthoNormBasis(1:3,2), RadObservationPoint%OrthoNormBasis(1:3,3)) - ObsLengt = RadObservationPoint%Diameter/(2.*TAN(RadObservationPoint%AngularAperture/2.)) + IF (RadObservationPointMethod.EQ.2) RadObservationPoint%Diameter = 0.0 + ObsLengt = RadObservationPoint%Diameter/(2.*TAN(RadObservationPoint%AngularAperture/2.)) RadObservationPoint%StartPoint(1:3) = RadObservationPoint%MidPoint(1:3) - ObsLengt*RadObservationPoint%ViewDirection(1:3) RadObservationPoint%Area = Pi*RadObservationPoint%Diameter*RadObservationPoint%Diameter/4. IF (RadObservationPointMethod.EQ.2) THEN RadObservationPoint%CalcFullSpectra = GETLOGICAL('Radiation-ObservationCalcFullSpectra') IF (RadObservationPoint%CalcFullSpectra) THEN - RadEmiAdaptPhotonNum = .FALSE. + RadEmiAdaptPhotonNum = .TRUE. RadTrans%NumPhotonsPerCell = RadiationParameter%WaveLenDiscrCoarse END IF END IF @@ -185,6 +186,14 @@ SUBROUTINE InitRadiationTransport() ALLOCATE(RadTransPhotPerCellLoc(nComputeNodeElems)) RadTransPhotPerCellLoc = 0 + +IF (RadObservationPointMethod.EQ.2) THEN + CALL Allocate_Shared((/7,nComputeNodeElems/), RadObservationPOI_Shared_Win,RadObservationPOI_Shared) + CALL MPI_WIN_LOCK_ALL(0,RadObservationPOI_Shared_Win,IERROR) + RadObservationPOI => RadObservationPOI_Shared + IF (myComputeNodeRank.EQ.0) RadObservationPOI = 0. + CALL BARRIER_AND_SYNC(RadObservationPOI_Shared_Win ,MPI_COMM_SHARED) +END IF #else ! allocate local array for ElemInfo ALLOCATE(RadTransPhotPerCell(nElems),Radiation_Emission_Spec_Total(nElems),RadTransPhotPerCellLoc(nELems), RadTransObsVolumeFrac(nElems)) @@ -196,6 +205,10 @@ SUBROUTINE InitRadiationTransport() ALLOCATE(Radiation_Emission_Spec_Max(nElems)) Radiation_Emission_Spec_Max=0.0 END IF +IF (RadObservationPointMethod.EQ.2) THEN + ALLOCATE(RadObservationPOI(7,nElems)) + RadObservationPOI = 0. +END IF #endif /*USE_MPI*/ @@ -351,6 +364,9 @@ SUBROUTINE InitRadiationTransport() END IF END IF CALL BARRIER_AND_SYNC(Radiation_Absorption_Spec_Shared_Win ,MPI_COMM_SHARED) + IF (RadObservationPointMethod.EQ.2) CALL BARRIER_AND_SYNC(RadObservationPOI_Shared_Win ,MPI_COMM_SHARED) + print*, 'AHAAAA', SUM(RadObservationPOI(7,:)) + read* #endif RadTrans%GlobalRadiationPower = 0.0 RadTrans%ScaledGlobalRadiationPower = 0.0 @@ -558,10 +574,11 @@ SUBROUTINE ElemOnLineOfSight(ElemID, ElemInCone) USE MOD_Globals USE MOD_Mesh_Tools ,ONLY: GetGlobalElemID USE MOD_Particle_Mesh_Vars ,ONLY: NodeCoords_Shared,ElemInfo_Shared, BoundsOfElem_Shared, SideInfo_Shared, SideIsSymSide -USE MOD_RadiationTrans_Vars ,ONLY: RadObservationPoint, RadTransObsVolumeFrac +USE MOD_RadiationTrans_Vars ,ONLY: RadObservationPoint, RadTransObsVolumeFrac, RadObservationPOI USE MOD_Particle_Vars ,ONLY: Symmetry USE MOD_Particle_Mesh_Tools ,ONLY: ParticleInsideQuad3D USE MOD_Photon_TrackingTools ,ONLY: PhotonIntersectionWithSide2DDir, PhotonThroughSideCheck3DDir +USE MOD_Particle_Boundary_Vars ,ONLY: PartBound ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -573,11 +590,15 @@ SUBROUTINE ElemOnLineOfSight(ElemID, ElemInCone) !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES INTEGER :: iNode, MCVar, iGlobalElem, iPoint, iLocSide, nlocSides, TempSideID, localSideID, TriNum -LOGICAL :: NodeInCone(8), InsideFlag, ThroughSide -REAL :: NodePoint(3), ConeDist, ConeRadius, orthoDist, RandomPos(3) +INTEGER :: nThroughSide, BCType +LOGICAL :: NodeInCone(8), InsideFlag, ThroughSide, IsSymElem +REAL :: NodePoint(3), ConeDist, ConeRadius, orthoDist, RandomPos(3),IntersectionPos(1:3), Distance(2) +REAL :: length !=================================================================================================================================== ElemInCone = .FALSE. +IsSymElem = .FALSE. nlocSides = ElemInfo_Shared(ELEM_LASTSIDEIND,ElemID) - ElemInfo_Shared(ELEM_FIRSTSIDEIND,ElemID) +nThroughSide = 0 SideLoop: DO iLocSide=1,nlocSides TempSideID = ElemInfo_Shared(ELEM_FIRSTSIDEIND,ElemID) + iLocSide localSideID = SideInfo_Shared(SIDE_LOCALID,TempSideID) @@ -585,11 +606,26 @@ SUBROUTINE ElemOnLineOfSight(ElemID, ElemInCone) IF (localSideID.LE.0) CYCLE IF(Symmetry%Axisymmetric) THEN IF (SideIsSymSide(TempSideID)) CYCLE + IF (SideInfo_Shared(SIDE_BCID,TempSideID).GT.0) THEN + BCType = PartBound%TargetBoundCond(PartBound%MapToPartBC(SideInfo_Shared(SIDE_BCID,TempSideID))) + IF (BCType.EQ.PartBound%SymmetryAxis) IsSymElem = .TRUE. + END IF ThroughSide = .FALSE. - CALL PhotonIntersectionWithSide2DDir(localSideID,ElemID,ThroughSide, RadObservationPoint%StartPoint(1:3),RadObservationPoint%ViewDirection(1:3)) + CALL PhotonIntersectionWithSide2DDir(localSideID,ElemID,ThroughSide, RadObservationPoint%StartPoint(1:3),& + RadObservationPoint%ViewDirection(1:3), IntersectionPos(1:3), Distance(nThroughSide+1)) IF (ThroughSide) THEN ElemInCone = .TRUE. - EXIT SideLoop + RadObservationPOI(1+nThroughSide*3:3+nThroughSide*3, ElemID) = IntersectionPos(1:3) + nThroughSide = nThroughSide + 1 + IF (nThroughSide.EQ.2) THEN + IF (Distance(2).LT.Distance(1)) THEN + IntersectionPos(1:3) = RadObservationPOI(1:3, ElemID) + RadObservationPOI(1:3, ElemID) = RadObservationPOI(4:6, ElemID) + RadObservationPOI(4:6, ElemID) = IntersectionPos(1:3) + END IF + RadObservationPOI(7, ElemID) = VECNORM(RadObservationPOI(4:6, ElemID)-RadObservationPOI(1:3, ElemID)) + EXIT SideLoop + END IF END IF ELSE DO TriNum = 1,2 @@ -602,6 +638,24 @@ SUBROUTINE ElemOnLineOfSight(ElemID, ElemInCone) END DO END IF END DO SideLoop +IF (ElemInCone.AND.(nThroughSide.NE.2)) THEN + IF (IsSymElem) THEN + IF (nThroughSide.NE.1) THEN + CALL abort(& + __STAMP__& + ,' Cannot find 1 POI of LOS in Elem', ElemID) + END IF + RadObservationPOI(4:6, ElemID) = RadObservationPOI(1:3, ElemID) + length = -RadObservationPoint%StartPoint(2)/RadObservationPoint%ViewDirection(2) + RadObservationPOI(2:3, ElemID) = 0.0 + RadObservationPOI(1, ElemID) = RadObservationPoint%StartPoint(1) + length*RadObservationPoint%ViewDirection(1) + RadObservationPOI(7, ElemID) = VECNORM(RadObservationPOI(4:6, ElemID)-RadObservationPOI(1:3, ElemID)) + RETURN + END IF + CALL abort(& + __STAMP__& + ,' Cannot find POI of LOS in Elem', ElemID) +END IF END SUBROUTINE ElemOnLineOfSight diff --git a/src/radiation/radiative_transfer/radtrans_main.f90 b/src/radiation/radiative_transfer/radtrans_main.f90 index 0ebc74fe7..dd5eb1a85 100644 --- a/src/radiation/radiative_transfer/radtrans_main.f90 +++ b/src/radiation/radiative_transfer/radtrans_main.f90 @@ -80,16 +80,24 @@ SUBROUTINE RadTrans_main() SWRITE(UNIT_stdOut,'(A)') ' Distribute Photons to Processors ...' IF (RadEmiAdaptPhotonNum) THEN DO iElem = firstElem, lastElem - IF (RadTrans%GlobalRadiationPower .EQ. 0.0) THEN !!!!TODO: check!!! - RadTransPhotPerCell(iElem) = 0 + IF (RadObservationPoint%CalcFullSpectra) THEN + IF (Radiation_Emission_Spec_Total(iElem).GT.0.0) THEN + RadTransPhotPerCell(iElem) = RadTrans%NumPhotonsPerCell + ELSE + RadTransPhotPerCell(iElem) = 0 + END IF ELSE - IF (RadialWeighting%DoRadialWeighting) THEN - RadTransPhotPerCell(iElem) = INT(Radiation_Emission_Spec_Total(iElem)*ElemVolume_Shared(iElem)*RadTransObsVolumeFrac(iElem) & - /(1. + ElemMidPoint_Shared(2,iElem)/GEO%ymaxglob*(RadialWeighting%PartScaleFactor-1.)) & - / RadTrans%ScaledGlobalRadiationPower*RadTrans%GlobalPhotonNum + 0.5) + IF (RadTrans%GlobalRadiationPower .EQ. 0.0) THEN !!!!TODO: check!!! + RadTransPhotPerCell(iElem) = 0 ELSE - RadTransPhotPerCell(iElem) = INT(Radiation_Emission_Spec_Total(iElem)*ElemVolume_Shared(iElem)*RadTransObsVolumeFrac(iElem) & - / RadTrans%GlobalRadiationPower*RadTrans%GlobalPhotonNum + 0.5) + IF (RadialWeighting%DoRadialWeighting) THEN + RadTransPhotPerCell(iElem) = INT(Radiation_Emission_Spec_Total(iElem)*ElemVolume_Shared(iElem)*RadTransObsVolumeFrac(iElem) & + /(1. + ElemMidPoint_Shared(2,iElem)/GEO%ymaxglob*(RadialWeighting%PartScaleFactor-1.)) & + / RadTrans%ScaledGlobalRadiationPower*RadTrans%GlobalPhotonNum + 0.5) + ELSE + RadTransPhotPerCell(iElem) = INT(Radiation_Emission_Spec_Total(iElem)*ElemVolume_Shared(iElem)*RadTransObsVolumeFrac(iElem) & + / RadTrans%GlobalRadiationPower*RadTrans%GlobalPhotonNum + 0.5) + END IF END IF END IF END DO @@ -191,7 +199,7 @@ FUNCTION SetPhotonEnergy(iElem, Point, iWave) USE MOD_Globals USE MOD_Globals_Vars, ONLY : Pi USE MOD_RadiationTrans_Vars ,ONLY : RadEmiAdaptPhotonNum, Radiation_Emission_Spec_Total, RadTrans, RadTransPhotPerCell -USE MOD_RadiationTrans_Vars ,ONLY : RadObservationPoint, RadObservationPointMethod,RadTransObsVolumeFrac +USE MOD_RadiationTrans_Vars ,ONLY : RadObservationPoint, RadObservationPointMethod,RadTransObsVolumeFrac,RadObservationPOI USE MOD_Particle_Mesh_Vars ,ONLY : ElemVolume_Shared USE MOD_Radiation_Vars ,ONLY : RadiationParameter,Radiation_Emission_spec ! IMPLICIT VARIABLE HANDLING @@ -235,6 +243,7 @@ FUNCTION SetPhotonEnergy(iElem, Point, iWave) ELSE SetPhotonEnergy = SetPhotonEnergy /(4.*Pi) END IF + SetPhotonEnergy = SetPhotonEnergy / (ElemVolume_Shared(iElem)*RadTransObsVolumeFrac(iElem))*RadObservationPOI(7, iElem) END IF END FUNCTION SetPhotonEnergy @@ -245,7 +254,7 @@ FUNCTION SetPhotonPos(iElem, globPhotNum) !=================================================================================================================================== ! MODULES USE MOD_Globals -USE MOD_RadiationTrans_Vars, ONLY : RadiationPhotonPosModel, RadObservationPointMethod +USE MOD_RadiationTrans_Vars, ONLY : RadiationPhotonPosModel, RadObservationPointMethod, RadObservationPOI USE MOD_Particle_Mesh_Tools, ONLY : ParticleInsideQuad3D USE MOD_RadiationTrans_Init, ONLY : HALTON !USE MOD_PARTICLE_Vars, ONLY : Symmetry2DAxisymmetric @@ -269,27 +278,38 @@ FUNCTION SetPhotonPos(iElem, globPhotNum) InsideFlag=.FALSE. globElemID = GetGlobalElemID(iElem) ASSOCIATE( Bounds => BoundsOfElem_Shared(1:2,1:3,globElemID) ) - DO WHILE(.NOT.InsideFlag) - SELECT CASE(RadiationPhotonPosModel) - CASE(1) - CALL RANDOM_NUMBER(SetPhotonPos) - CASE(2) - globPhotNum = globPhotNum + 1 - CALL HALTON(globPhotNum,3,SetPhotonPos) - CASE DEFAULT + IF (RadObservationPointMethod.EQ.2) THEN + SetPhotonPos(1:3) = RadObservationPOI(1:3, iElem) + 0.5*(RadObservationPOI(4:6,iElem)-RadObservationPOI(1:3,iElem)) + CALL ParticleInsideQuad3D(SetPhotonPos,globElemID,InsideFlag) + IF (.NOT.InsideFlag) THEN + IPWRITE(*,*) 'Photonpos not in Element! Pos:',SetPhotonPos CALL abort(& __STAMP__& - ,' ERROR: Radiation-PhotonPosModel not implemented!. (unknown case)') - END SELECT !PartBound%MapToPartBC(BC(SideID) - SetPhotonPos = Bounds(1,:) + SetPhotonPos*(Bounds(2,:)-Bounds(1,:)) - ! IF (Symmetry2DAxisymmetric) SetPhotonPos(3) = 0.0 - CALL ParticleInsideQuad3D(SetPhotonPos,globElemID,InsideFlag) - IF (RadObservationPointMethod.EQ.1) THEN - IF (InsideFlag) THEN - InsideFlag = PointInObsCone(SetPhotonPos) - END IF + ,' Photon not in Element', iElem) END IF - END DO + ELSE + DO WHILE(.NOT.InsideFlag) + SELECT CASE(RadiationPhotonPosModel) + CASE(1) + CALL RANDOM_NUMBER(SetPhotonPos) + CASE(2) + globPhotNum = globPhotNum + 1 + CALL HALTON(globPhotNum,3,SetPhotonPos) + CASE DEFAULT + CALL abort(& + __STAMP__& + ,' ERROR: Radiation-PhotonPosModel not implemented!. (unknown case)') + END SELECT !PartBound%MapToPartBC(BC(SideID) + SetPhotonPos = Bounds(1,:) + SetPhotonPos*(Bounds(2,:)-Bounds(1,:)) + ! IF (Symmetry2DAxisymmetric) SetPhotonPos(3) = 0.0 + CALL ParticleInsideQuad3D(SetPhotonPos,globElemID,InsideFlag) + IF (RadObservationPointMethod.EQ.1) THEN + IF (InsideFlag) THEN + InsideFlag = PointInObsCone(SetPhotonPos) + END IF + END IF + END DO + END IF END ASSOCIATE END FUNCTION SetPhotonPos @@ -345,8 +365,9 @@ FUNCTION SetPhotonStartDirection(iElem, iPhot, RandRot) SetPhotonStartDirection(1:3) = SetPhotonStartDirection(1:3) - PhotonProps%PhotonPos(1:3) SetPhotonStartDirection(1:3) = SetPhotonStartDirection(1:3) / VECNORM(SetPhotonStartDirection(1:3)) ELSEIF (RadObservationPointMethod.EQ.2) THEN - SetPhotonStartDirection(1:3) = RadObservationPoint%MidPoint(1:3) - SetPhotonStartDirection(1:3) = SetPhotonStartDirection(1:3) - RadObservationPoint%ViewDirection(1:3) +! SetPhotonStartDirection(1:3) = RadObservationPoint%MidPoint(1:3) +! SetPhotonStartDirection(1:3) = SetPhotonStartDirection(1:3) - RadObservationPoint%ViewDirection(1:3) + SetPhotonStartDirection(1:3) = -RadObservationPoint%ViewDirection(1:3) SetPhotonStartDirection(1:3) = SetPhotonStartDirection(1:3) / VECNORM(SetPhotonStartDirection(1:3)) ELSE SELECT CASE(RadMod) diff --git a/src/radiation/radiative_transfer/radtrans_vars.f90 b/src/radiation/radiative_transfer/radtrans_vars.f90 index 7c55245c4..92ec8294e 100644 --- a/src/radiation/radiative_transfer/radtrans_vars.f90 +++ b/src/radiation/radiative_transfer/radtrans_vars.f90 @@ -76,6 +76,7 @@ MODULE MOD_RadiationTrans_Vars INTEGER, ALLOCATABLE :: RadTransPhotPerCellLoc(:) REAL, ALLOCPOINT :: RadTransObsVolumeFrac(:) REAL, ALLOCATABLE :: PhotonSampWall(:,:) +REAL, ALLOCPOINT :: RadObservationPOI(:,:) #if USE_MPI INTEGER :: RadTransPhotPerCell_Shared_Win INTEGER,ALLOCPOINT :: RadTransPhotPerCell_Shared(:) @@ -89,6 +90,8 @@ MODULE MOD_RadiationTrans_Vars REAL,POINTER :: PhotonSampWall_Shared(:,:) INTEGER :: RadiationElemAbsEnergy_Shared_Win REAL,POINTER :: RadiationElemAbsEnergy_Shared(:) +INTEGER :: RadObservationPOI_Shared_Win +REAL,ALLOCPOINT :: RadObservationPOI_Shared(:,:) #endif !=================================================================================================================================== END MODULE MOD_RadiationTrans_Vars diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tools.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tools.f90 index 00ba1a00e..2edcea1d1 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tools.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tools.f90 @@ -140,7 +140,7 @@ SUBROUTINE PhotonThroughSideCheck3DFast(iLocSide,Element,ThroughSide,TriNum, IsM END SUBROUTINE PhotonThroughSideCheck3DFast -SUBROUTINE PhotonThroughSideCheck3DDir(iLocSide,Element,ThroughSide,TriNum,StartPoint,Dir) +SUBROUTINE PhotonThroughSideCheck3DDir(iLocSide,CNElemID,ThroughSide,TriNum,StartPoint,Dir) !=================================================================================================================================== !> Routine to check whether a particle crossed the given triangle of a side. The determinant between the normalix_photon_startd trajectory !> vector and the vectors from two of the three nodes to the old particle position is calculated. If the determinants for the three @@ -151,27 +151,24 @@ SUBROUTINE PhotonThroughSideCheck3DDir(iLocSide,Element,ThroughSide,TriNum,Start ! MODULES USE MOD_Globals_Vars ,ONLY: EpsMach USE MOD_Particle_Mesh_Vars, ONLY : NodeCoords_Shared, ElemSideNodeID_Shared -USE MOD_Mesh_Tools ,ONLY: GetCNElemID ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE ! INPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT/OUTPUT VARIABLES INTEGER,INTENT(IN) :: iLocSide -INTEGER,INTENT(IN) :: Element +INTEGER,INTENT(IN) :: CNElemID INTEGER,INTENT(IN) :: TriNum LOGICAL,INTENT(OUT) :: ThroughSide REAL, INTENT(IN) :: StartPoint(3), Dir(3) !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -INTEGER :: CNElemID INTEGER :: n, NodeID REAL :: Px, Py, Pz REAL :: Vx, Vy, Vz!, Vall REAL :: xNode(3), yNode(3), zNode(3), Ax(3), Ay(3), Az(3) REAL :: det(3) !=================================================================================================================================== -CNElemID = GetCNElemID(Element) ThroughSide = .FALSE. Px = StartPoint(1) @@ -371,29 +368,27 @@ SUBROUTINE PhotonIntersectionWithSide2D(iLocSide,Element,ThroughSide,Intersectio END SUBROUTINE PhotonIntersectionWithSide2D -SUBROUTINE PhotonIntersectionWithSide2DDir(iLocSide,Element,ThroughSide,StartPoint, Dir) +SUBROUTINE PhotonIntersectionWithSide2DDir(iLocSide,CNElemID,ThroughSide,StartPoint, Dir, IntersectionPos, Distance) !=================================================================================================================================== !> Routine to check whether a photon crossed the given side. !=================================================================================================================================== ! MODULES USE MOD_Particle_Mesh_Vars, ONLY : ElemSideNodeID2D_Shared, NodeCoords_Shared -USE MOD_Mesh_Tools ,ONLY: GetCNElemID ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE ! INPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT/OUTPUT VARIABLES LOGICAL,INTENT(OUT) :: ThroughSide -INTEGER,INTENT(IN) :: iLocSide, Element +INTEGER,INTENT(IN) :: iLocSide, CNElemID +REAL, INTENT(OUT), OPTIONAL :: IntersectionPos(3), Distance REAL,INTENT(IN) :: StartPoint(3), Dir(3) !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -INTEGER :: CNElemID REAL :: y_photon_start,x_photon_start,yNode1,xNode1,yNode2,xNode2,sy,sz,sx REAL :: l1,S1,l2,S2,l,S REAL :: beta, alpha, deltay, a, b, c, tmpsqrt !=================================================================================================================================== - CNElemID = GetCNElemID(Element) ThroughSide = .FALSE. xNode1 = NodeCoords_Shared(1,ElemSideNodeID2D_Shared(1,iLocSide, CNElemID)) @@ -472,6 +467,12 @@ SUBROUTINE PhotonIntersectionWithSide2DDir(iLocSide,Element,ThroughSide,StartPoi IF((S .GT. 0.0) .AND. (0.0 .LE. l) .AND. (l .LE. 1.0)) THEN ThroughSide = .TRUE. + IF (PRESENT(IntersectionPos)) THEN + IntersectionPos(1) = StartPoint(1) + S*sx + IntersectionPos(2) = StartPoint(2) + S*sy + IntersectionPos(3) = S*sz + Distance = S + END IF END IF END SUBROUTINE PhotonIntersectionWithSide2DDir From 3a4de5aa3d9a759bdaa572d639af3dac3a86aa42 Mon Sep 17 00:00:00 2001 From: Julian Beyer Date: Wed, 11 May 2022 16:01:07 +0200 Subject: [PATCH 045/495] shocktube --- .../radiative_transfer/radtrans_init.f90 | 35 +++++++++++++++++++ .../radiative_transfer/radtrans_main.f90 | 4 +-- .../radiative_transfer/radtrans_output.f90 | 17 ++++++++- .../radiative_transfer/radtrans_vars.f90 | 1 + 4 files changed, 54 insertions(+), 3 deletions(-) diff --git a/src/radiation/radiative_transfer/radtrans_init.f90 b/src/radiation/radiative_transfer/radtrans_init.f90 index a6f80a0e6..54a1b4afc 100644 --- a/src/radiation/radiative_transfer/radtrans_init.f90 +++ b/src/radiation/radiative_transfer/radtrans_init.f90 @@ -58,6 +58,7 @@ SUBROUTINE DefineParametersRadiationTrans() CALL prms%CreateRealOption('Radiation-ObservationAngularAperture', 'HM') CALL prms%CreateLogicalOption('Radiation-ObservationCalcFullSpectra','.FALSE.') CALL prms%CreateLogicalOption('Radiation-ObservationDoConvolution','Consider instrumental broadening?','.FALSE.') +CALL prms%CreateRealOption('Radiation-ShockTubeDiameter', 'Diameter of shock tube in m', '0.0') END SUBROUTINE DefineParametersRadiationTrans @@ -102,6 +103,8 @@ SUBROUTINE InitRadiationTransport() INTEGER :: iWave, iElem, firstElem, lastElem, ElemDisp, DisplRank, iSpec, currentRank REAL :: LocTemp, ObsLengt, MaxSumTemp(2), GlobalMaxTemp(2), hilf LOGICAL :: ElemInCone +REAL,ALLOCATABLE :: Radiation_ShockTube_Spec(:,:) +INTEGER :: w, io_error !=================================================================================================================================== SWRITE(UNIT_StdOut,'(132("-"))') SWRITE(UNIT_stdOut,'(A)') ' INIT RADIATION TRANSPORT SOLVER ...' @@ -117,6 +120,7 @@ SUBROUTINE InitRadiationTransport() RadEmiAdaptPhotonNum = GETLOGICAL('Radiation-AdaptivePhotonNumEmission') RadObservationPointMethod = GETINT('Radiation-RadObservationPointMethod') ObservationDoConvolution = GETLOGICAL('Radiation-ObservationDoConvolution') +RadObservationPoint%ShockTubeDiameter = GETREAL('Radiation-ShockTubeDiameter') IF (RadObservationPointMethod.GT.0) THEN RadObservationPoint%AngularAperture = GETREAL('Radiation-ObservationAngularAperture') @@ -331,8 +335,39 @@ SUBROUTINE InitRadiationTransport() Radiation_Emission_Spec_Total(iElem) = Radiation_Emission_Spec_Total(iElem) & + 4.*Pi*Radiation_Emission_Spec(iWave, iElem) * RadiationParameter%WaveLenIncr END DO + END DO +CASE(4) !Shocktube mode + ALLOCATE(Radiation_ShockTube_Spec(RadiationParameter%WaveLenDiscr,nGlobalElems)) + SWRITE(UNIT_stdOut,'(A)') ' Calculate Radiation Data per Cell ...' + DO iElem = firstElem, lastElem + IF(MPIroot.AND.(MOD(iElem,10).EQ.0)) CALL PrintStatusLineRadiation(REAL(iElem),REAL(firstElem),REAL(lastElem),.FALSE.) + CALL radiation_main(iElem) + DO iWave = 1, RadiationParameter%WaveLenDiscr + Radiation_Emission_Spec_Total(iElem) = Radiation_Emission_Spec_Total(iElem) & + + 4.*Pi*Radiation_Emission_Spec(iWave, iElem) * RadiationParameter%WaveLenIncr + IF(Radiation_Absorption_Spec(iWave, iElem).EQ.0.0) THEN + Radiation_ShockTube_Spec(iWave,iElem) = Radiation_Emission_Spec(iWave, iElem)*RadObservationPoint%ShockTubeDiameter + ELSE + Radiation_ShockTube_Spec(iWave,iElem) = Radiation_Emission_Spec(iWave, iElem)/Radiation_Absorption_Spec(iWave, iElem) * & + (1.-EXP(-Radiation_Absorption_Spec(iWave, iElem)*RadObservationPoint%ShockTubeDiameter)) + END IF + END DO + END DO + OPEN(unit=40,file='Radiation_Shocktube.csv',status='replace',action='write', iostat=io_error) + WRITE(40,"(A2)",ADVANCE="NO") ", " + DO iElem=1,nGlobalElems + WRITE(40,CSVFORMAT,ADVANCE="NO") ',', ElemMidPoint_Shared(1,iElem) + END DO + WRITE(40,*) + DO iWave =1,RadiationParameter%WaveLenDiscr + WRITE(40,CSVFORMAT,ADVANCE="NO") ',', RadiationParameter%WaveLen(iWave)*1.E9 + DO iElem = 1,nGlobalElems + WRITE(40,CSVFORMAT,ADVANCE="NO") ',', Radiation_ShockTube_Spec(iWave,iElem) + END DO + WRITE(40,*) END DO + CASE DEFAULT CALL abort(& __STAMP__& diff --git a/src/radiation/radiative_transfer/radtrans_main.f90 b/src/radiation/radiative_transfer/radtrans_main.f90 index 0ebc74fe7..97216d83e 100644 --- a/src/radiation/radiative_transfer/radtrans_main.f90 +++ b/src/radiation/radiative_transfer/radtrans_main.f90 @@ -51,7 +51,7 @@ SUBROUTINE RadTrans_main() USE MOD_Radiation_Vars ,ONLY : RadiationSwitches USE MOD_DSMC_Vars ,ONLY : RadialWeighting USE MOD_Mesh_Tools ,ONLY: GetGlobalElemID -USE MOD_Output, ONLY: PrintStatusLineRadiation +USE MOD_Output ,ONLY: PrintStatusLineRadiation USE MOD_MPI_Shared_Vars USE MOD_MPI_Shared USE MOD_Particle_Vars ,ONLY: Symmetry @@ -68,7 +68,7 @@ SUBROUTINE RadTrans_main() REAL :: Bounds(1:2,1:3) ! Bounds(1,1:3) --> maxCoords , Bounds(2,1:3) --> minCoords REAL :: RandRot(3,3) !, PartPos(1:3) !=================================================================================================================================== - IF (RadiationSwitches%RadType.EQ.3) RETURN + IF ((RadiationSwitches%RadType.EQ.3) .OR. (RadiationSwitches%RadType.EQ.4)) RETURN #if USE_MPI firstElem = INT(REAL( myComputeNodeRank *nComputeNodeElems)/REAL(nComputeNodeProcessors))+1 diff --git a/src/radiation/radiative_transfer/radtrans_output.f90 b/src/radiation/radiative_transfer/radtrans_output.f90 index 4f33a520d..ce19a422f 100644 --- a/src/radiation/radiative_transfer/radtrans_output.f90 +++ b/src/radiation/radiative_transfer/radtrans_output.f90 @@ -148,7 +148,18 @@ SUBROUTINE WriteRadiationToHDF5() TempOutput(3, iElem) = Radiation_Emission_Spec_Total(CNElemID)- RadiationElemAbsEnergy_Shared(iElem+offSetElem)/ElemVolume_Shared(CNElemID) TempOutput(4, iElem) = RadTransPhotPerCell(CNElemID) END DO - ELSE + ELSE IF (RadiationSwitches%RadType.EQ.3) THEN + DO iElem=1, PP_nElems + CNElemID = GetCNElemID(iElem+offSetElem) + TempOutput(1, iElem) = Radiation_Emission_Spec_Total(CNElemID) + TempOutput(2, iElem) = 0.0 + DO iWave = 1, RadiationParameter%WaveLenDiscr + TempOutput(2, iElem) = TempOutput(2, iElem) + Radiation_Absorption_Spec(iWave, iElem+offSetElem) * RadiationParameter%WaveLenIncr + END DO + TempOutput(3, iElem) = Radiation_Emission_Spec_Total(CNElemID) - TempOutput(2, iElem) + TempOutput(4, iElem) = RadTransPhotPerCell(CNElemID) + END DO + ELSE IF (RadiationSwitches%RadType.EQ.4) THEN DO iElem=1, PP_nElems CNElemID = GetCNElemID(iElem+offSetElem) TempOutput(1, iElem) = Radiation_Emission_Spec_Total(CNElemID) @@ -159,6 +170,10 @@ SUBROUTINE WriteRadiationToHDF5() TempOutput(3, iElem) = Radiation_Emission_Spec_Total(CNElemID) - TempOutput(2, iElem) TempOutput(4, iElem) = RadTransPhotPerCell(CNElemID) END DO + ELSE + CALL abort(& + __STAMP__& + ,' ERROR: Radiation type is not implemented! (unknown case)') END IF nVal=nGlobalElems ! For the MPI case this must be replaced by the global number of elements (sum over all procs) diff --git a/src/radiation/radiative_transfer/radtrans_vars.f90 b/src/radiation/radiative_transfer/radtrans_vars.f90 index af6c48b34..116c66fc7 100644 --- a/src/radiation/radiative_transfer/radtrans_vars.f90 +++ b/src/radiation/radiative_transfer/radtrans_vars.f90 @@ -38,6 +38,7 @@ MODULE MOD_RadiationTrans_Vars REAL :: OrthoNormBasis(3,3) LOGICAL :: CalcFullSpectra REAL :: SlitFunction(2) + REAL :: ShockTubeDiameter END TYPE TYPE(tRadObservationPoint) :: RadObservationPoint From f7762e643060507bdc8d3f66d5117d7ed997470d Mon Sep 17 00:00:00 2001 From: Raphael Tietz Date: Mon, 16 May 2022 11:26:26 +0200 Subject: [PATCH 046/495] Removed empty column in Radiation_Shocktube.csv --- src/radiation/radiative_transfer/radtrans_init.f90 | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/radiation/radiative_transfer/radtrans_init.f90 b/src/radiation/radiative_transfer/radtrans_init.f90 index 54a1b4afc..e43d818b8 100644 --- a/src/radiation/radiative_transfer/radtrans_init.f90 +++ b/src/radiation/radiative_transfer/radtrans_init.f90 @@ -355,13 +355,12 @@ SUBROUTINE InitRadiationTransport() END DO OPEN(unit=40,file='Radiation_Shocktube.csv',status='replace',action='write', iostat=io_error) - WRITE(40,"(A2)",ADVANCE="NO") ", " DO iElem=1,nGlobalElems WRITE(40,CSVFORMAT,ADVANCE="NO") ',', ElemMidPoint_Shared(1,iElem) END DO WRITE(40,*) DO iWave =1,RadiationParameter%WaveLenDiscr - WRITE(40,CSVFORMAT,ADVANCE="NO") ',', RadiationParameter%WaveLen(iWave)*1.E9 + WRITE(40,'(E23.16E3)',ADVANCE="NO") RadiationParameter%WaveLen(iWave)*1.E9 DO iElem = 1,nGlobalElems WRITE(40,CSVFORMAT,ADVANCE="NO") ',', Radiation_ShockTube_Spec(iWave,iElem) END DO From a69a5da9ff8dab03fe5a9d54dde40a46c5c2e31a Mon Sep 17 00:00:00 2001 From: hildf Date: Tue, 8 Nov 2022 10:28:51 +0100 Subject: [PATCH 047/495] diatomic mixture Pr number with collision integrals for BGK + some code comments in BGK colloperator --- src/particles/bgk/bgk_colloperator.f90 | 172 +++++++++++++++++++------ src/particles/bgk/bgk_init.f90 | 9 +- 2 files changed, 134 insertions(+), 47 deletions(-) diff --git a/src/particles/bgk/bgk_colloperator.f90 b/src/particles/bgk/bgk_colloperator.f90 index 9363f866c..9af84f8d2 100644 --- a/src/particles/bgk/bgk_colloperator.f90 +++ b/src/particles/bgk/bgk_colloperator.f90 @@ -105,6 +105,7 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume) Momentum_old(1:3) = Momentum_old(1:3) + PartState(4:6,iPart)*Species(iSpec)%MassIC*partWeight Energy_old = Energy_old + DOTPRODUCT(PartState(4:6,iPart))*0.5*Species(iSpec)%MassIC*partWeight IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN + ! Add internal energies (vibration, rotation) for molecules and molecular ions Energy_old = Energy_old + (PartStateIntEn(1,iPart) + PartStateIntEn(2,iPart))*partWeight END IF END DO @@ -115,6 +116,7 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume) ! 1.) Moment calculation: Summing up the relative velocities and their squares CALL CalcMoments(nPart, iPartIndx_Node, nSpec, vBulkAll, totalWeight, totalWeightSpec, TotalMass, u2, u2Spec, u0ij, & u2i, OldEn, EVibSpec, ERotSpec, CellTemp, SpecTemp, dtCell) + IF((CellTemp.LE.0).OR.(MAXVAL(nSpec(:)).EQ.1).OR.(totalWeight.LE.0.0)) RETURN IF(VarTimeStep%UseVariableTimeStep) THEN @@ -166,19 +168,23 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume) ELSE CellTemptmp = CellTemp END IF + ! Sum up collision frequencies of species i with itself and the other species + ! S. Chapman and T.G. Cowling, "The mathematical Theory of Non-Uniform Gases", Cambridge University Press, 1970, S. 87f collisionfreqSpec(iSpec) = collisionfreqSpec(iSpec) + SpecBGK(iSpec)%CollFreqPreFactor(jSpec) * totalWeightSpec(jSpec) & * (Dens / totalWeight) *CellTemptmp**(-CollInf%omega(iSpec,jSpec) +0.5) END DO END DO + ! Calculate relaxation frequencies of rotation and vibration with relaxation properties rotrelaxfreqSpec(:) = collisionfreqSpec(:) * DSMC%RotRelaxProb vibrelaxfreqSpec(:) = collisionfreqSpec(:) * DSMC%VibRelaxProb RotExpSpec=0.; VibExpSpec=0. - IF(SpecDSMC(1)%PolyatomicMol) THEN + ! Calculation of the equilibrium temperature + IF(SpecDSMC(1)%PolyatomicMol) THEN ! polyatomic, no mixtures possible by now CALL CalcTEquiPoly(nPart, CellTemp, TRotSpec(1), TVibSpec(1), Xi_vib_DOF, Xi_Vib_oldSpec(1), RotExpSpec(1), VibExpSpec(1), & TEqui, rotrelaxfreqSpec(1), vibrelaxfreqSpec(1), dtCell) Xi_VibSpec(1) = SUM(Xi_vib_DOF(1:PolyatomMolDSMC(iPolyatMole)%VibDOF)) - ELSE + ELSE ! diatomic CALL CalcTEquiMulti(nPart, nSpec, CellTemp, TRotSpec, TVibSpec, Xi_VibSpec, Xi_Vib_oldSpec, RotExpSpec, VibExpSpec, & TEqui, rotrelaxfreqSpec, vibrelaxfreqSpec, dtCell) END IF @@ -203,6 +209,7 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume) ALLOCATE(VibEnergyDOF(nVibRelax,PolyatomMolDSMC(iPolyatMole)%VibDOF)) END IF END IF + ! 5.) Determine the new rotational and vibrational state of molecules undergoing a relaxation CALL RelaxInnerEnergy(nVibRelax, nRotRelax, iPartIndx_NodeRelaxVib, iPartIndx_NodeRelaxRot, Xi_vib_DOF, Xi_VibSpec, & Xi_RotSpec , TEqui, VibEnergyDOF, NewEnVib, NewEnRot) @@ -233,6 +240,7 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume) END IF OldEn = OldEn + OldEnRot + ! 8.) Determine the new particle state and ensure energy conservation by scaling the new velocities with the factor alpha. Xi_RotTotal = 0.0 DO iSpec = 1, nSpecies @@ -328,6 +336,7 @@ SUBROUTINE CalcMoments(nPart, iPartIndx_Node, nSpec, vBulkAll, totalWeight, tota USE MOD_BGK_Vars ,ONLY: BGKDoVibRelaxation, BGKCollModel USE MOD_part_tools ,ONLY: GetParticleWeight USE MOD_Globals_Vars ,ONLY: BoltzmannConst +USE MOD_Globals ,ONLY: DOTPRODUCT ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -346,6 +355,7 @@ SUBROUTINE CalcMoments(nPart, iPartIndx_Node, nSpec, vBulkAll, totalWeight, tota REAL :: tempweight, tempweight2, tempmass, vBulkTemp(3), totalWeight2, totalWeight3 !=================================================================================================================================== totalWeightSpec = 0.0; totalWeightSpec2=0.0; vBulkAll=0.0; TotalMass=0.0; vBulkSpec=0.0; nSpec=0; dtCell=0.0 +! Loop over all simulation particles to sum up bulk velocities DO iLoop = 1, nPart iPart = iPartIndx_Node(iLoop) partWeight = GetParticleWeight(iPart) @@ -355,31 +365,38 @@ SUBROUTINE CalcMoments(nPart, iPartIndx_Node, nSpec, vBulkAll, totalWeight, tota vBulkAll(1:3) = vBulkAll(1:3) + PartState(4:6,iPart)*Species(iSpec)%MassIC*partWeight TotalMass = TotalMass + Species(iSpec)%MassIC*partWeight vBulkSpec(1:3,iSpec) = vBulkSpec(1:3,iSpec) + PartState(4:6,iPart)*partWeight - nSpec(iSpec) = nSpec(iSpec) + 1 + nSpec(iSpec) = nSpec(iSpec) + 1 ! Count number of simulation particles per species IF(VarTimeStep%UseVariableTimeStep) THEN dtCell = dtCell + VarTimeStep%ParticleTimeStep(iPart)*partWeight END IF END DO totalWeight = SUM(totalWeightSpec) totalWeight2 = SUM(totalWeightSpec2) + IF ((MAXVAL(nSpec(:)).EQ.1).OR.(totalWeight.LE.0.0)) RETURN + +! Calculate bulk velocities vBulkAll(1:3) = vBulkAll(1:3) / TotalMass DO iSpec = 1, nSpecies - IF (nSpec(iSpec).GT.0) vBulkSpec(:,iSpec) = vBulkSpec(:,iSpec) /totalWeightSpec(iSpec) + IF (nSpec(iSpec).GT.0) vBulkSpec(:,iSpec) = vBulkSpec(:,iSpec) / totalWeightSpec(iSpec) END DO totalWeight3 = 0.; u2Spec=0.0; u0ij=0.0; u2i=0.0; OldEn=0.0; EVibSpec=0.0; ERotSpec=0.0 +! Loop over all simulation particles to sum up relative velocities DO iLoop = 1, nPart iPart = iPartIndx_Node(iLoop) partWeight = GetParticleWeight(iPart) iSpec = PartSpecies(iPart) + ! Calculate thermal velocity with bulk velocity of the species V_rel(1:3)=PartState(4:6,iPart)-vBulkSpec(1:3,iSpec) vmag2 = V_rel(1)**2 + V_rel(2)**2 + V_rel(3)**2 + ! Summing up thermal velocities (squared) of all particles per species u2Spec(iSpec) = u2Spec(iSpec) + vmag2*partWeight + ! Calculate thermal velocity with bulk velocity of the gas V_rel(1:3)=PartState(4:6,iPart)-vBulkAll(1:3) vmag2 = V_rel(1)**2 + V_rel(2)**2 + V_rel(3)**2 - IF (BGKCollModel.EQ.1) THEN + IF (BGKCollModel.EQ.1) THEN ! ESBGK DO fillMa1 =1, 3 DO fillMa2 =fillMa1, 3 u0ij(fillMa1, fillMa2)= u0ij(fillMa1, fillMa2) & @@ -387,25 +404,29 @@ SUBROUTINE CalcMoments(nPart, iPartIndx_Node, nSpec, vBulkAll, totalWeight, tota END DO END DO END IF - IF (BGKCollModel.EQ.2) THEN + IF (BGKCollModel.EQ.2) THEN ! Shakhov u2i(1:3) = u2i(1:3) + V_rel(1:3)*vmag2 * partWeight*Species(iSpec)%MassIC totalWeight3 = totalWeight3 + partWeight*partWeight*partWeight END IF + + ! Sum up old energy of thermal velocities and calculate internal energies OldEn = OldEn + 0.5*Species(iSpec)%MassIC * vmag2*partWeight IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN IF(BGKDoVibRelaxation) THEN + ! EVib without zero-point energy EVibSpec(iSpec) = EVibSpec(iSpec) + (PartStateIntEn(1,iPart) - SpecDSMC(iSpec)%EZeroPoint) * partWeight END IF ERotSpec(iSpec) = ERotSpec(iSpec) + PartStateIntEn(2,iPart) * partWeight END IF END DO -u0ij = u0ij* totalWeight / (TotalMass*(totalWeight - totalWeight2/totalWeight)) -IF (BGKCollModel.EQ.2) THEN +u0ij = u0ij* totalWeight / (TotalMass*(totalWeight - totalWeight2/totalWeight)) ! ESBGK +IF (BGKCollModel.EQ.2) THEN ! Shakhov u2i = u2i*totalWeight**3/(TotalMass*(totalWeight**3-3.*totalWeight*totalWeight2+2.*totalWeight3)) END IF -IF (nSpecies.GT.1) THEN +! Calculation of cell temperature and bulk velocity (squared) +IF (nSpecies.GT.1) THEN ! mixture SpecTemp = 0.0 EnerTotal = 0.0 tempweight = 0.0; tempweight2 = 0.0; tempmass = 0.0; vBulkTemp = 0.0 @@ -413,22 +434,21 @@ SUBROUTINE CalcMoments(nPart, iPartIndx_Node, nSpec, vBulkAll, totalWeight, tota IF ((nSpec(iSpec).GE.2).AND.(.NOT.ALMOSTZERO(u2Spec(iSpec)))) THEN SpecTemp(iSpec) = Species(iSpec)%MassIC * u2Spec(iSpec) & /(3.0*BoltzmannConst*(totalWeightSpec(iSpec) - totalWeightSpec2(iSpec)/totalWeightSpec(iSpec))) - EnerTotal = EnerTotal + 3./2.*BoltzmannConst*SpecTemp(iSpec) * totalWeightSpec(iSpec) - vmag2 = vBulkSpec(1,iSpec)**(2.) + vBulkSpec(2,iSpec)**(2.) + vBulkSpec(3,iSpec)**(2.) - EnerTotal = EnerTotal + totalWeightSpec(iSpec) * Species(iSpec)%MassIC / 2. * vmag2 + EnerTotal = EnerTotal + 3./2.*BoltzmannConst*SpecTemp(iSpec) * totalWeightSpec(iSpec) ! thermal energy + vmag2 = DOTPRODUCT(vBulkSpec(1:3,iSpec)) + EnerTotal = EnerTotal + totalWeightSpec(iSpec) * Species(iSpec)%MassIC / 2. * vmag2 ! kinetic energy tempweight = tempweight + totalWeightSpec(iSpec) tempweight2 = tempweight2 + totalWeightSpec2(iSpec) tempmass = tempmass + totalWeightSpec(iSpec) * Species(iSpec)%MassIC vBulkTemp(1:3) = vBulkTemp(1:3) + vBulkSpec(1:3,iSpec)*totalWeightSpec(iSpec) * Species(iSpec)%MassIC END IF END DO - vBulkTemp(1:3) = vBulkTemp(1:3) / tempmass - vmag2 = vBulkTemp(1)*vBulkTemp(1) + vBulkTemp(2)*vBulkTemp(2) + vBulkTemp(3)*vBulkTemp(3) + vmag2 = DOTPRODUCT(vBulkTemp(1:3)) EnerTotal = EnerTotal - tempmass / 2. * vmag2 CellTemp = 2. * EnerTotal / (3.*tempweight*BoltzmannConst) u2 = 3. * CellTemp * BoltzmannConst * (tempweight - tempweight2/tempweight) / tempmass -ELSE +ELSE ! single species gas u2 = u2Spec(1) / (totalWeight - totalWeight2/totalWeight) CellTemp = Species(1)%MassIC * u2 / (3.0*BoltzmannConst) END IF @@ -465,25 +485,33 @@ SUBROUTINE CalcInnerDOFs(nSpec, EVibSpec, ERotSpec, totalWeightSpec, TVibSpec, T IF (nSpec(iSpec).EQ.0) CYCLE IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN IF(BGKDoVibRelaxation) THEN - IF(SpecDSMC(iSpec)%PolyatomicMol) THEN + IF(SpecDSMC(iSpec)%PolyatomicMol) THEN ! polyatomic iPolyatMole = SpecDSMC(iSpec)%SpecToPolyArray + ! Calculation of the vibrational temperature (zero-point search) for polyatomic molecules TVibSpec(iSpec) = CalcTVibPoly(EVibSpec(iSpec)/totalWeightSpec(iSpec), 1) IF (TVibSpec(iSpec).GT.0.0) THEN DO iDOF = 1, PolyatomMolDSMC(iPolyatMole)%VibDOF + ! Calculation of vibrational DOFs from Pfeiffer et. al., AIP Conference Proceedings 2132, 100001 (2019), + ! "Extension of particle-based BGK models to polyatomic species in hypersonic flow around a flat-faced cylinder", Xi_VibSpec(iSpec) = Xi_VibSpec(iSpec) + 2.*PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)/TVibSpec(iSpec) & /(EXP(PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)/TVibSpec(iSpec)) - 1.) END DO END IF - ELSE - TVibSpec(iSpec)=EVibSpec(iSpec) / (totalWeightSpec(iSpec)*BoltzmannConst*SpecDSMC(iSpec)%CharaTVib) + ELSE ! diatomic + ! Calculation of vibrational temperature and DOFs from Pfeiffer, Physics of Fluids 30, 116103 (2018), + ! "Extending the particle ellipsoidal statistical Bhatnagar-Gross-Krook method to diatomic molecules including quantized vibrational energies" + ! TVibSpec = vibrational energy without zero-point energy + TVibSpec(iSpec) = EVibSpec(iSpec) / (totalWeightSpec(iSpec)*BoltzmannConst*SpecDSMC(iSpec)%CharaTVib) IF (TVibSpec(iSpec).GT.0.0) THEN - TVibSpec(iSpec)= SpecDSMC(iSpec)%CharaTVib/LOG(1. + 1./(TVibSpec(iSpec))) + TVibSpec(iSpec) = SpecDSMC(iSpec)%CharaTVib/LOG(1. + 1./(TVibSpec(iSpec))) Xi_VibSpec(iSpec) = 2.* EVibSpec(iSpec) / (totalWeightSpec(iSpec)*BoltzmannConst*TVibSpec(iSpec)) END IF END IF Xi_Vib_oldSpec(iSpec) = Xi_VibSpec(iSpec) END IF Xi_RotSpec(iSpec) = SpecDSMC(iSpec)%Xi_Rot + ! Calculation of rotational temperature from Pfeiffer, Physics of Fluids 30, 116103 (2018), + ! "Extending the particle ellipsoidal statistical Bhatnagar-Gross-Krook method to diatomic molecules including quantized vibrational energies" TRotSpec(iSpec) = 2.*ERotSpec(iSpec)/(Xi_RotSpec(iSpec)*totalWeightSpec(iSpec)*BoltzmannConst) END IF InnerDOF = InnerDOF + Xi_RotSpec(iSpec) + Xi_VibSpec(iSpec) @@ -518,7 +546,7 @@ SUBROUTINE CalcGasProperties(nSpec, dens, InnerDOF, totalWeightSpec, totalWeight REAL :: PrandtlCorrection, dynamicvisSpec(nSpecies), thermalcondSpec(nSpecies), Phi(nSpecies) REAL :: dynamicvis, thermalcond, C_P, nu, A(3,3), W(3), Theta, CellTempSpec(nSpecies+1), Work(100) !=================================================================================================================================== -IF (nSpecies.GT.1) THEN +IF (nSpecies.GT.1) THEN ! gas mixture MolarFraction(1:nSpecies) = totalWeightSpec(1:nSpecies) / totalWeight MassIC_Mixture = TotalMass / totalWeight MassFraction(1:nSpecies) = MolarFraction(1:nSpecies) * Species(1:nSpecies)%MassIC / MassIC_Mixture @@ -527,18 +555,24 @@ SUBROUTINE CalcGasProperties(nSpec, dens, InnerDOF, totalWeightSpec, totalWeight C_P = 0.0 DO iSpec = 1, nSpecies IF (nSpec(iSpec).EQ.0) CYCLE + ! Correction of Pr for calculation of relaxation frequency, see alpha - Pfeiffer et. al., Physics of Fluids 33, 036106 (2021), + ! "Multi-species modeling in the particle-based ellipsoidal statistical Bhatnagar–Gross–Krook method for monatomic gas species" PrandtlCorrection = PrandtlCorrection + MolarFraction(iSpec)*MassIC_Mixture/Species(iSpec)%MassIC - IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN + IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN ! molecules C_P = C_P + ((5. + (Xi_VibSpec(iSpec)+Xi_RotSpec(iSpec)))/2.) * BoltzmannConst / Species(iSpec)%MassIC * MassFraction(iSpec) - ELSE + ELSE ! atoms C_P = C_P + (5./2.) * BoltzmannConst / Species(iSpec)%MassIC * MassFraction(iSpec) END IF END DO SELECT CASE(BGKMixtureModel) + ! Both cases are described in Pfeiffer et. al., Physics of Fluids 33, 036106 (2021), + ! "Multi-species modeling in the particle-based ellipsoidal statistical Bhatnagar–Gross–Krook method for monatomic gas species" + CASE (1) ! Wilke's mixing rules DO iSpec = 1, nSpecies ! Dynamic viscosity per species + ! Omega = OmegaVHS + 0.5 IF ((nSpec(iSpec).GE.2).AND.(.NOT.ALMOSTZERO(u2Spec(iSpec)))) THEN ! Species temperature: Sufficient number of particles per species are available dynamicvisSpec(iSpec) = 30.*SQRT(Species(iSpec)%MassIC* BoltzmannConst*CollInf%Tref(iSpec,iSpec)/Pi) & @@ -551,14 +585,16 @@ SUBROUTINE CalcGasProperties(nSpec, dens, InnerDOF, totalWeightSpec, totalWeight *CollInf%Tref(iSpec,iSpec)**(CollInf%omega(iSpec,iSpec) + 0.5)*CellTemp**(-CollInf%omega(iSpec,iSpec) - 0.5)) END IF ! Thermal conductivity per species (Eucken's formula with a correction by Hirschfelder for the internal degrees of freedom) - IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN + IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN ! inner DOF + ! Istomin et. al., "Eucken correction in high-temperature gases with electronic excitation", J. Chem. Phys. 140, 184311 (2014) thermalcondspec(iSpec) = 0.25 * (15. + 2. * (Xi_VibSpec(iSpec)+Xi_RotSpec(iSpec)) * 1.328) & * dynamicvisSpec(iSpec) * BoltzmannConst / Species(iSpec)%MassIC - ELSE + ELSE ! atoms thermalcondspec(iSpec) = 0.25 * 15. * dynamicvisSpec(iSpec) * BoltzmannConst / Species(iSpec)%MassIC END IF END DO Phi= 0.0 + ! Calculation of factor phi, depending on mass ratios and ratios of dynamic viscosities DO iSpec = 1, nSpecies DO jSpec = 1, nSpecies Phi(iSpec) = Phi(iSpec) & @@ -570,11 +606,13 @@ SUBROUTINE CalcGasProperties(nSpec, dens, InnerDOF, totalWeightSpec, totalWeight END DO dynamicvis = 0.0 thermalcond = 0.0 + ! Sum up dynamic viscosities and thermal conductivities of species DO iSpec = 1, nSpecies IF (nSpec(iSpec).EQ.0) CYCLE dynamicvis = dynamicvis + REAL(totalWeightSpec(iSpec)) * dynamicvisSpec(iSpec) / Phi(iSpec) thermalcond = thermalcond + REAL(totalWeightSpec(iSpec)) * thermalcondspec(iSpec) / Phi(iSpec) END DO + CASE(2) ! Collision integrals (VHS) DO iSpec = 1, nSpecies IF ((nSpec(iSpec).LT.2).OR.ALMOSTZERO(u2Spec(iSpec))) THEN @@ -584,27 +622,36 @@ SUBROUTINE CalcGasProperties(nSpec, dens, InnerDOF, totalWeightSpec, totalWeight END IF END DO CellTempSpec(nSpecies+1) = CellTemp - CALL CalcViscosityThermalCondColIntVHS(CellTempSpec(1:nSpecies+1), MolarFraction(1:nSpecies),dens, dynamicvis, thermalcond) + CALL CalcViscosityThermalCondColIntVHS(CellTempSpec(1:nSpecies+1), MolarFraction(1:nSpecies),dens, Xi_RotSpec, Xi_VibSpec, dynamicvis, thermalcond) END SELECT + ! Calculation of Prandtl number Prandtl = C_P*dynamicvis/thermalcond*PrandtlCorrection + IF(DSMC%CalcQualityFactors) BGK_ExpectedPrandtlNumber = BGK_ExpectedPrandtlNumber + Prandtl - A = u0ij - CALL DSYEV('N','U',3,A,3,W,Work,100,INFO) - Theta = u2 / 3. + ! Ensure anisotropic matrix to be positive definite - gas mixtures only for ESBGK by now + A = u0ij ! pressure tensor + CALL DSYEV('N','U',3,A,3,W,Work,100,INFO) ! calculate eigenvalues, W(3) is maximum eigenvalue + Theta = u2 / 3. ! kB*T/m nu = 1.-1./Prandtl nu= MAX(nu,-Theta/(W(3)-Theta)) Prandtl = 1./(1.-nu) + + ! Calculation of relaxation frequency relaxfreq = Prandtl*dens*BoltzmannConst*CellTemp/dynamicvis -ELSE + +ELSE ! single species gas + ! Calculation of reference dynamic viscosity dynamicvis = 30.*SQRT(Species(1)%MassIC* BoltzmannConst*CollInf%Tref(1,1)/Pi) & / (4.*(4.- 2.*CollInf%omega(1,1)) * (6. - 2.*CollInf%omega(1,1))* CollInf%dref(1,1)**2.) - Prandtl =2.*(InnerDOF + 5.)/(2.*InnerDOF + 15.) - IF (BGKCollModel.EQ.1) THEN + ! Calculation of Prandtl number: Pr = cp*mu/K with inner DOF, atoms: Pr = 2/3 + Prandtl = 2.*(InnerDOF + 5.)/(2.*InnerDOF + 15.) + ! Calculation of relaxation frequency using the exponential ansatz of the viscosity mu + IF (BGKCollModel.EQ.1) THEN ! ESBGK: relaxfreq nu = Pr*n*kB*T/mu relaxfreq = Prandtl*dens*BoltzmannConst*CollInf%Tref(1,1)**(CollInf%omega(1,1) + 0.5) & /dynamicvis*CellTemp**(-CollInf%omega(1,1) +0.5) - ELSE + ELSE ! relaxfreq nu = n*kB*T/mu relaxfreq = dens*BoltzmannConst*CollInf%Tref(1,1)**(CollInf%omega(1,1) + 0.5) & /dynamicvis*CellTemp**(-CollInf%omega(1,1) +0.5) END IF @@ -1623,19 +1670,19 @@ SUBROUTINE CalcTEquiPoly(nPart, CellTemp, TRot, TVib, Xi_Vib_DOF, Xi_Vib_old, Ro END SUBROUTINE CalcTEquiPoly -SUBROUTINE CalcViscosityThermalCondColIntVHS(CellTemp, Xi, dens, Visc, ThermalCond) +SUBROUTINE CalcViscosityThermalCondColIntVHS(CellTemp, Xi, dens, Xi_RotSpec, Xi_VibSpec, Visc, ThermalCond) !=================================================================================================================================== !> Determination of the mixture viscosity and thermal conductivity using collision integrals (derived for the Variable Hard !> Sphere model). Solving an equation system depending on the number of species. !=================================================================================================================================== ! MODULES -USE MOD_DSMC_Vars, ONLY : CollInf +USE MOD_DSMC_Vars, ONLY : CollInf, SpecDSMC USE MOD_Globals_Vars, ONLY : BoltzmannConst USE MOD_Particle_Vars, ONLY : Species, nSpecies IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES -REAL, INTENT(IN) :: CellTemp(nSpecies+1), Xi(nSpecies), dens +REAL, INTENT(IN) :: CellTemp(nSpecies+1), Xi(nSpecies), dens, Xi_RotSpec(nSpecies), Xi_VibSpec(nSpecies) !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES REAL, INTENT(OUT) :: Visc,ThermalCond @@ -1644,29 +1691,53 @@ SUBROUTINE CalcViscosityThermalCondColIntVHS(CellTemp, Xi, dens, Visc, ThermalCo !----------------------------------------------------------------------------------------------------------------------------------- REAL :: Sigma_11, Sigma_22, B_12(nSpecies,nSpecies), A_12(nSpecies,nSpecies), InteractDiam, cv, DiffCoef(nSpecies, nSpecies) REAL :: Mass, ViscSpec(nSpecies), ThermalCondSpec(nSpecies), TVHS, omegaVHS, E_12, CellTemptmp +REAL :: ThermalCondSpec_Vib(nSpecies), ThermalCondSpec_Rot(nSpecies), cv_rot, cv_vib, rhoSpec +REAL :: Xj_Dij(nSpecies,nSpecies), Xi_Dij_tot REAL :: ViscMat(nSpecies, nSpecies), RHSSolve(nSpecies), m0, pressure INTEGER :: iSpec, jSpec, kSpec, IPIV(nSpecies), info_dgesv !=================================================================================================================================== -ViscSpec = 0.; ThermalCondSpec = 0.; DiffCoef =0.; A_12 = 0.; B_12 = 0. +ViscSpec = 0.; ThermalCondSpec = 0.; ThermalCondSpec_Vib = 0.; ThermalCondSpec_Rot = 0.; DiffCoef =0.; A_12 = 0.; B_12 = 0. +Xj_Dij = 0. +! Loop over all species combinations DO iSpec = 1, nSpecies + ! Calculate cv with rotational and vibrational degrees of freedom + IF ((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN + cv_rot = (Xi_RotSpec(iSpec)*BoltzmannConst)/(2.*Species(iSpec)%MassIC) + cv_vib = (Xi_VibSpec(iSpec)*BoltzmannConst)/(2.*Species(iSpec)%MassIC) + END IF DO jSpec = iSpec, nSpecies + ! Interaction parameters InteractDiam = CollInf%dref(iSpec,jSpec) - Mass = Species(iSpec)%MassIC*Species(jSpec)%MassIC/(Species(iSpec)%MassIC + Species(jSpec)%MassIC) + Mass = Species(iSpec)%MassIC*Species(jSpec)%MassIC/(Species(iSpec)%MassIC + Species(jSpec)%MassIC) ! reduced mass TVHS = CollInf%Tref(iSpec,jSpec) omegaVHS = CollInf%omega(iSpec,jSpec) IF (iSpec.EQ.jSpec) THEN - CellTemptmp = CellTemp(iSpec) + CellTemptmp = CellTemp(iSpec) ! Species temperature or cell temperature for nSpec<2 or u2spec=0 ELSE - CellTemptmp = CellTemp(nSpecies+1) + CellTemptmp = CellTemp(nSpecies+1) ! Cell temperature END IF + ! Calculation of collision integral Sigma_22 Sigma_22 = CalcSigma_22VHS(CellTemptmp,InteractDiam,Mass,TVHS, omegaVHS) IF (iSpec.EQ.jSpec) THEN - cv= 3./2.*BoltzmannConst/(2.*Mass) + cv= 3./2.*BoltzmannConst/(2.*Mass) ! DOF = 3, translational part + ! Calculation of the viscosity and thermal conductivity + ! S. Chapman and T.G. Cowling, "The mathematical Theory of Non-Uniform Gases", Cambridge University Press, 1970, S. 160 ViscSpec(iSpec) = (5./8.)*(BoltzmannConst*CellTemp(iSpec))/Sigma_22 ThermalCondSpec(iSpec) = (25./16.)*(cv*BoltzmannConst*CellTemp(iSpec))/Sigma_22 !ThermalCondSpec(iSpec) = (15./4.)*BoltzmannConst/(2.*Mass)*ViscSpec(iSpec) + ! Additional calculation of Sigma_11VHS and the diffusion coefficient for molecular species + IF ((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN + CALL CalcSigma_11VHS(CellTemp(nSpecies+1),InteractDiam,Mass,TVHS, omegaVHS, Sigma_11) + E_12 = BoltzmannConst*CellTemp(nSpecies+1)/(8.*Species(iSpec)%MassIC*Species(jSpec)%MassIC & + /(Species(iSpec)%MassIC+Species(jSpec)%MassIC)**2.*Sigma_11) + DiffCoef(iSpec,jSpec) = 3.*E_12/(2.*(Species(iSpec)%MassIC+Species(jSpec)%MassIC)*dens) + END IF ELSE + ! Calculation of collision integral Sigma_11 CALL CalcSigma_11VHS(CellTemp(nSpecies+1),InteractDiam,Mass,TVHS, omegaVHS, Sigma_11) + ! Parameters for calculation of contribution of species to mixture transport coefficients + ! Pfeiffer et. al., Physics of Fluids 33, 036106 (2021), + ! "Multi-species modeling in the particle-based ellipsoidal statistical Bhatnagar–Gross–Krook method for monatomic gas species" B_12(iSpec,jSpec) = (5.*GAMMA(4.-omegaVHS)-GAMMA(5.-omegaVHS))/(5.*GAMMA(3.-omegaVHS)) B_12(jSpec,iSpec) = B_12(iSpec,jSpec) A_12(iSpec,jSpec) = Sigma_22 / (5.*Sigma_11) @@ -1676,9 +1747,20 @@ SUBROUTINE CalcViscosityThermalCondColIntVHS(CellTemp, Xi, dens, Visc, ThermalCo DiffCoef(iSpec,jSpec) = 3.*E_12/(2.*(Species(iSpec)%MassIC+Species(jSpec)%MassIC)*dens) DiffCoef(jSpec,iSpec) = DiffCoef(iSpec,jSpec) END IF + Xj_Dij(iSpec,jSpec) = Xi(jSpec)/DiffCoef(iSpec,jSpec) + Xj_Dij(jSpec,iSpec) = Xj_Dij(iSpec,jSpec) END DO + ! Calculation of thermal conductivity of rotation and vibration for each molecular species + ! S. Chapman and T.G. Cowling, "The mathematical Theory of Non-Uniform Gases", Cambridge University Press, 1970, S. 254 + Xi_Dij_tot = SUM(Xj_Dij(iSpec,:)) + rhoSpec = dens * Species(iSpec)%MassIC * Xi(iSpec) + ThermalCondSpec_Rot(iSpec) = (rhoSpec*cv_rot/Xi_Dij_tot) + ThermalCondSpec_Vib(iSpec) = (rhoSpec*cv_vib/Xi_Dij_tot) END DO +! Calculate mixture viscosity by solving a system of linear equations with matrices +! Pfeiffer et. al., Physics of Fluids 33, 036106 (2021), +! "Multi-species modeling in the particle-based ellipsoidal statistical Bhatnagar–Gross–Krook method for monatomic gas species" ViscMat = 0.0 DO iSpec = 1, nSpecies DO jSpec = 1, nSpecies @@ -1699,6 +1781,9 @@ SUBROUTINE CalcViscosityThermalCondColIntVHS(CellTemp, Xi, dens, Visc, ThermalCo CALL DGESV(nSpecies, 1, ViscMat, nSpecies, IPIV, RHSSolve, nSpecies, info_dgesv) Visc = SUM(RHSSolve) +! Calculate mixture thermal conductivity by solving a system of linear equations with matrices +! Pfeiffer et. al., Physics of Fluids 33, 036106 (2021), +! "Multi-species modeling in the particle-based ellipsoidal statistical Bhatnagar–Gross–Krook method for monatomic gas species" pressure = BoltzmannConst*dens*CellTemp(nSpecies+1) ViscMat = 0.0 DO iSpec = 1, nSpecies @@ -1722,7 +1807,8 @@ SUBROUTINE CalcViscosityThermalCondColIntVHS(CellTemp, Xi, dens, Visc, ThermalCo RHSSolve(iSpec) = Xi(iSpec) END DO CALL DGESV(nSpecies, 1, ViscMat, nSpecies, IPIV, RHSSolve, nSpecies, info_dgesv) -ThermalCond = SUM(RHSSolve) +! Thermal conductivity from translation, rotation and vibration +ThermalCond = SUM(RHSSolve) + SUM(ThermalCondSpec_Rot) + SUM(ThermalCondSpec_Vib) END SUBROUTINE CalcViscosityThermalCondColIntVHS @@ -1745,6 +1831,8 @@ SUBROUTINE CalcSigma_11VHS(CellTemp,Dref,Mass,Tref, omegaVHS, Sigma_11) ! LOCAL VARIABLES REAL :: Prefactor !=================================================================================================================================== + ! See Stephani et. al., Physics of Fluids 24, 077101 (2012), + ! “Consistent treatment of transport properties for five-species air direct simulation Monte Carlo/Navier-Stokes applications” Prefactor = Pi/2.*Dref*Dref*SQRT(BoltzmannConst/(2.*Pi*Mass))*Tref**omegaVHS*GAMMA(3.-omegaVHS)/GAMMA(2.-omegaVHS) Sigma_11 = Prefactor*CellTemp**(0.5-omegaVHS) @@ -1767,6 +1855,8 @@ REAL FUNCTION CalcSigma_22VHS(CellTemp,Dref,Mass,Tref, omegaVHS) ! LOCAL VARIABLES REAL :: Prefactor !=================================================================================================================================== + ! See Stephani et. al., Physics of Fluids 24, 077101 (2012), + ! “Consistent treatment of transport properties for five-species air direct simulation Monte Carlo/Navier-Stokes applications” Prefactor = Pi/3.*Dref*Dref*SQRT(BoltzmannConst/(2.*Pi*Mass))*Tref**omegaVHS*GAMMA(4.-omegaVHS)/GAMMA(2.-omegaVHS) CalcSigma_22VHS = Prefactor*CellTemp**(0.5-omegaVHS) diff --git a/src/particles/bgk/bgk_init.f90 b/src/particles/bgk/bgk_init.f90 index 3ff014285..cfba3bb38 100644 --- a/src/particles/bgk/bgk_init.f90 +++ b/src/particles/bgk/bgk_init.f90 @@ -116,13 +116,10 @@ SUBROUTINE InitBGK() DO iSpec=1, nSpecies IF ((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) MoleculePresent = .TRUE. ALLOCATE(SpecBGK(iSpec)%CollFreqPreFactor(nSpecies)) + ! Calculation of the prefacor of the collision frequency per species + ! S. Chapman and T.G. Cowling, "The mathematical Theory of Non-Uniform Gases", Cambridge University Press, 1970, S. 87f DO iSpec2=1, nSpecies - IF (iSpec.EQ.iSpec2) THEN - delta_ij = 1.0 - ELSE - delta_ij = 1.0 - END IF - SpecBGK(iSpec)%CollFreqPreFactor(iSpec2)= 4.*(2.-delta_ij)*CollInf%dref(iSpec,iSpec2)**2.0 & + SpecBGK(iSpec)%CollFreqPreFactor(iSpec2)= 4.*CollInf%dref(iSpec,iSpec2)**2.0 & * SQRT(Pi*BoltzmannConst*CollInf%Tref(iSpec,iSpec2)*(Species(iSpec)%MassIC + Species(iSpec2)%MassIC) & /(2.*(Species(iSpec)%MassIC * Species(iSpec2)%MassIC)))/CollInf%Tref(iSpec,iSpec2)**(-CollInf%omega(iSpec,iSpec2) +0.5) END DO From 1d9c4f306e5fe42d31edc6146e6fec6d1dd37170 Mon Sep 17 00:00:00 2001 From: hildf Date: Tue, 8 Nov 2022 16:19:32 +0100 Subject: [PATCH 048/495] BGK collision integrals checks for innerDOFs and particles of all species --- src/particles/bgk/bgk_colloperator.f90 | 28 +++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/src/particles/bgk/bgk_colloperator.f90 b/src/particles/bgk/bgk_colloperator.f90 index bb37fa74b..62916eefb 100644 --- a/src/particles/bgk/bgk_colloperator.f90 +++ b/src/particles/bgk/bgk_colloperator.f90 @@ -1714,15 +1714,17 @@ SUBROUTINE CalcViscosityThermalCondColIntVHS(CellTemp, Xi, dens, Xi_RotSpec, Xi_ INTEGER :: iSpec, jSpec, kSpec, IPIV(nSpecies), info_dgesv !=================================================================================================================================== ViscSpec = 0.; ThermalCondSpec = 0.; ThermalCondSpec_Vib = 0.; ThermalCondSpec_Rot = 0.; DiffCoef =0.; A_12 = 0.; B_12 = 0. -Xj_Dij = 0. +Xj_Dij = 0.; cv_rot = 0.; cv_vib = 0.; E_12 = 0. ! Loop over all species combinations DO iSpec = 1, nSpecies + IF (Xi(iSpec).LE.0.0) CYCLE ! Calculate cv with rotational and vibrational degrees of freedom IF ((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN cv_rot = (Xi_RotSpec(iSpec)*BoltzmannConst)/(2.*Species(iSpec)%MassIC) cv_vib = (Xi_VibSpec(iSpec)*BoltzmannConst)/(2.*Species(iSpec)%MassIC) END IF DO jSpec = iSpec, nSpecies + IF (Xi(jSpec).LE.0.0) CYCLE ! Interaction parameters InteractDiam = CollInf%dref(iSpec,jSpec) Mass = Species(iSpec)%MassIC*Species(jSpec)%MassIC/(Species(iSpec)%MassIC + Species(jSpec)%MassIC) ! reduced mass @@ -1764,15 +1766,19 @@ SUBROUTINE CalcViscosityThermalCondColIntVHS(CellTemp, Xi, dens, Xi_RotSpec, Xi_ DiffCoef(iSpec,jSpec) = 3.*E_12/(2.*(Species(iSpec)%MassIC+Species(jSpec)%MassIC)*dens) DiffCoef(jSpec,iSpec) = DiffCoef(iSpec,jSpec) END IF - Xj_Dij(iSpec,jSpec) = Xi(jSpec)/DiffCoef(iSpec,jSpec) - Xj_Dij(jSpec,iSpec) = Xj_Dij(iSpec,jSpec) + IF ((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN + Xj_Dij(iSpec,jSpec) = Xi(jSpec)/DiffCoef(iSpec,jSpec) + Xj_Dij(jSpec,iSpec) = Xj_Dij(iSpec,jSpec) + END IF END DO - ! Calculation of thermal conductivity of rotation and vibration for each molecular species - ! S. Chapman and T.G. Cowling, "The mathematical Theory of Non-Uniform Gases", Cambridge University Press, 1970, S. 254 - Xi_Dij_tot = SUM(Xj_Dij(iSpec,:)) - rhoSpec = dens * Species(iSpec)%MassIC * Xi(iSpec) - ThermalCondSpec_Rot(iSpec) = (rhoSpec*cv_rot/Xi_Dij_tot) - ThermalCondSpec_Vib(iSpec) = (rhoSpec*cv_vib/Xi_Dij_tot) + IF ((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN + ! Calculation of thermal conductivity of rotation and vibration for each molecular species + ! S. Chapman and T.G. Cowling, "The mathematical Theory of Non-Uniform Gases", Cambridge University Press, 1970, S. 254 + Xi_Dij_tot = SUM(Xj_Dij(iSpec,:)) + rhoSpec = dens * Species(iSpec)%MassIC * Xi(iSpec) + ThermalCondSpec_Rot(iSpec) = (rhoSpec*cv_rot/Xi_Dij_tot) + ThermalCondSpec_Vib(iSpec) = (rhoSpec*cv_vib/Xi_Dij_tot) + END IF END DO ! Calculate mixture viscosity by solving a system of linear equations with matrices @@ -1780,7 +1786,9 @@ SUBROUTINE CalcViscosityThermalCondColIntVHS(CellTemp, Xi, dens, Xi_RotSpec, Xi_ ! "Multi-species modeling in the particle-based ellipsoidal statistical Bhatnagar–Gross–Krook method for monatomic gas species" ViscMat = 0.0 DO iSpec = 1, nSpecies + IF (Xi(iSpec).LE.0.0) CYCLE DO jSpec = 1, nSpecies + IF (Xi(jSpec).LE.0.0) CYCLE IF (iSpec.EQ.jSpec) THEN ViscMat(iSpec, jSpec) = ViscMat(iSpec, jSpec) + Xi(iSpec)/ViscSpec(iSpec) DO kSpec = 1, nSpecies @@ -1804,7 +1812,9 @@ SUBROUTINE CalcViscosityThermalCondColIntVHS(CellTemp, Xi, dens, Xi_RotSpec, Xi_ pressure = BoltzmannConst*dens*CellTemp(nSpecies+1) ViscMat = 0.0 DO iSpec = 1, nSpecies + IF (Xi(iSpec).LE.0.0) CYCLE DO jSpec = 1, nSpecies + IF (Xi(jSpec).LE.0.0) CYCLE IF (iSpec.EQ.jSpec) THEN ViscMat(iSpec, jSpec) = ViscMat(iSpec, jSpec) + Xi(iSpec)/ThermalCondSpec(iSpec) DO kSpec = 1, nSpecies From a6bbd1188c6613a47130eef4cde261838124ffb6 Mon Sep 17 00:00:00 2001 From: Franziska Hild Date: Mon, 23 Jan 2023 13:34:43 +0100 Subject: [PATCH 049/495] BGK collision integrals bug fix: ensure invertability of matrix for calculation of viscosity and thermal conductivity for gas mixtures + correct calculation of temperature for only one particle of a species + enabled viscosity and thermal conductivity output for paraview --- src/particles/bgk/bgk_adaptation.f90 | 10 +++- src/particles/bgk/bgk_colloperator.f90 | 80 +++++++++++++++----------- src/particles/bgk/bgk_init.f90 | 5 +- src/particles/bgk/bgk_main.f90 | 10 +++- src/particles/bgk/bgk_vars.f90 | 2 + src/particles/dsmc/dsmc_analyze.f90 | 24 +++++--- 6 files changed, 83 insertions(+), 48 deletions(-) diff --git a/src/particles/bgk/bgk_adaptation.f90 b/src/particles/bgk/bgk_adaptation.f90 index 6aba3c4fe..05da1c0c9 100644 --- a/src/particles/bgk/bgk_adaptation.f90 +++ b/src/particles/bgk/bgk_adaptation.f90 @@ -50,6 +50,7 @@ SUBROUTINE BGK_octree_adapt(iElem) USE MOD_FP_CollOperator ,ONLY: FP_CollisionOperator USE MOD_BGK_Vars ,ONLY: BGKInitDone,BGK_MeanRelaxFactor,BGK_MeanRelaxFactorCounter,BGK_MaxRelaxFactor USE MOD_BGK_Vars ,ONLY: BGK_QualityFacSamp, BGK_MaxRotRelaxFactor, BGK_PrandtlNumber, BGK_ExpectedPrandtlNumber +USE MOD_BGK_Vars ,ONLY: BGK_Viscosity, BGK_ThermalConductivity USE MOD_FPFlow_Vars ,ONLY: FPInitDone, FP_PrandtlNumber, FP_QualityFacSamp USE MOD_FPFlow_Vars ,ONLY: FP_MaxRelaxFactor, FP_MaxRotRelaxFactor, FP_MeanRelaxFactor, FP_MeanRelaxFactorCounter USE MOD_part_tools ,ONLY: GetParticleWeight @@ -73,7 +74,7 @@ SUBROUTINE BGK_octree_adapt(iElem) IF(DSMC%CalcQualityFactors) THEN IF(BGKInitDone) THEN BGK_MeanRelaxFactorCounter = 0; BGK_MeanRelaxFactor = 0.; BGK_MaxRelaxFactor = 0.; BGK_MaxRotRelaxFactor = 0. - BGK_PrandtlNumber=0.; BGK_ExpectedPrandtlNumber=0. + BGK_PrandtlNumber=0.; BGK_ExpectedPrandtlNumber=0.; BGK_Viscosity=0.; BGK_ThermalConductivity=0. END IF IF(FPInitDone) THEN FP_MeanRelaxFactorCounter = 0; FP_MeanRelaxFactor = 0.; FP_MaxRelaxFactor = 0.; FP_MaxRotRelaxFactor = 0.; FP_PrandtlNumber = 0. @@ -162,6 +163,8 @@ SUBROUTINE BGK_octree_adapt(iElem) BGK_QualityFacSamp(5,iElem) = BGK_QualityFacSamp(5,iElem) + BGK_MaxRotRelaxFactor BGK_QualityFacSamp(6,iElem) = BGK_QualityFacSamp(6,iElem) + BGK_PrandtlNumber BGK_QualityFacSamp(7,iElem) = BGK_QualityFacSamp(7,iElem) + BGK_ExpectedPrandtlNumber + BGK_QualityFacSamp(8,iElem) = BGK_QualityFacSamp(8,iElem) + BGK_Viscosity + BGK_QualityFacSamp(9,iElem) = BGK_QualityFacSamp(9,iElem) + BGK_ThermalConductivity END IF IF(FPInitDone) THEN FP_QualityFacSamp(1,iElem) = FP_QualityFacSamp(1,iElem) + FP_MeanRelaxFactor @@ -528,6 +531,7 @@ SUBROUTINE BGK_quadtree_adapt(iElem) USE MOD_FP_CollOperator ,ONLY: FP_CollisionOperator USE MOD_BGK_Vars ,ONLY: BGKInitDone,BGK_MeanRelaxFactor,BGK_MeanRelaxFactorCounter,BGK_MaxRelaxFactor USE MOD_BGK_Vars ,ONLY: BGK_QualityFacSamp, BGK_MaxRotRelaxFactor, BGK_PrandtlNumber, BGK_ExpectedPrandtlNumber +USE MOD_BGK_Vars ,ONLY: BGK_Viscosity, BGK_ThermalConductivity USE MOD_FPFlow_Vars ,ONLY: FPInitDone, FP_PrandtlNumber, FP_QualityFacSamp USE MOD_FPFlow_Vars ,ONLY: FP_MaxRelaxFactor, FP_MaxRotRelaxFactor, FP_MeanRelaxFactor, FP_MeanRelaxFactorCounter USE MOD_part_tools ,ONLY: GetParticleWeight @@ -556,7 +560,7 @@ SUBROUTINE BGK_quadtree_adapt(iElem) IF(DSMC%CalcQualityFactors) THEN IF(BGKInitDone) THEN BGK_MeanRelaxFactorCounter = 0; BGK_MeanRelaxFactor = 0.; BGK_MaxRelaxFactor = 0.; BGK_MaxRotRelaxFactor = 0. - BGK_PrandtlNumber=0.; BGK_ExpectedPrandtlNumber=0. + BGK_PrandtlNumber=0.; BGK_ExpectedPrandtlNumber=0.; BGK_Viscosity=0.; BGK_ThermalConductivity=0. END IF IF(FPInitDone) THEN FP_MeanRelaxFactorCounter = 0; FP_MeanRelaxFactor = 0.; FP_MaxRelaxFactor = 0.; FP_MaxRotRelaxFactor = 0.; FP_PrandtlNumber = 0. @@ -641,6 +645,8 @@ SUBROUTINE BGK_quadtree_adapt(iElem) BGK_QualityFacSamp(5,iElem) = BGK_QualityFacSamp(5,iElem) + BGK_MaxRotRelaxFactor BGK_QualityFacSamp(6,iElem) = BGK_QualityFacSamp(6,iElem) + BGK_PrandtlNumber BGK_QualityFacSamp(7,iElem) = BGK_QualityFacSamp(7,iElem) + BGK_ExpectedPrandtlNumber + BGK_QualityFacSamp(8,iElem) = BGK_QualityFacSamp(8,iElem) + BGK_Viscosity + BGK_QualityFacSamp(9,iElem) = BGK_QualityFacSamp(9,iElem) + BGK_ThermalConductivity END IF IF(FPInitDone) THEN FP_QualityFacSamp(1,iElem) = FP_QualityFacSamp(1,iElem) + FP_MeanRelaxFactor diff --git a/src/particles/bgk/bgk_colloperator.f90 b/src/particles/bgk/bgk_colloperator.f90 index 62916eefb..22fc50b31 100644 --- a/src/particles/bgk/bgk_colloperator.f90 +++ b/src/particles/bgk/bgk_colloperator.f90 @@ -56,7 +56,7 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume) USE MOD_TimeDisc_Vars ,ONLY: dt USE MOD_BGK_Vars ,ONLY: SpecBGK, BGKDoVibRelaxation!, BGKMovingAverageLength USE MOD_BGK_Vars ,ONLY: BGK_MeanRelaxFactor, BGK_MeanRelaxFactorCounter, BGK_MaxRelaxFactor, BGK_MaxRotRelaxFactor -USE MOD_BGK_Vars ,ONLY: BGK_PrandtlNumber +USE MOD_BGK_Vars ,ONLY: BGK_PrandtlNumber, BGK_Viscosity, BGK_ThermalConductivity USE MOD_part_tools ,ONLY: GetParticleWeight #ifdef CODE_ANALYZE USE MOD_Globals ,ONLY: abort,unit_stdout,myrank @@ -76,6 +76,7 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume) ! LOCAL VARIABLES REAL :: vBulk(3), u0ij(3,3), u2, V_rel(3), dtCell REAL :: alpha, alphaRot(nSpecies), CellTemp, dens, InnerDOF, NewEn, OldEn, Prandtl, relaxfreq, TEqui +REAL :: dynamicvis, thermalcond INTEGER, ALLOCATABLE :: iPartIndx_NodeRelax(:),iPartIndx_NodeRelaxTemp(:),iPartIndx_NodeRelaxRot(:),iPartIndx_NodeRelaxVib(:) INTEGER :: iLoop, iPart, nRelax, iPolyatMole, nXiVibDOF REAL, ALLOCATABLE :: Xi_vib_DOF(:), VibEnergyDOF(:,:) @@ -117,7 +118,7 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume) CALL CalcMoments(nPart, iPartIndx_Node, nSpec, vBulkAll, totalWeight, totalWeightSpec, TotalMass, u2, u2Spec, u0ij, & u2i, OldEn, EVibSpec, ERotSpec, CellTemp, SpecTemp, dtCell) -IF((CellTemp.LE.0).OR.(MAXVAL(nSpec(:)).EQ.1).OR.(totalWeight.LE.0.0)) RETURN +IF((CellTemp.LE.0.0).OR.(MAXVAL(nSpec(:)).EQ.1).OR.(totalWeight.LE.0.0)) RETURN IF(VarTimeStep%UseVariableTimeStep) THEN dtCell = dt * dtCell / totalWeight @@ -150,13 +151,15 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume) ! 2.) Calculation of the relaxation frequency of the distribution function towards the target distribution function CALL CalcGasProperties(nSpec, dens, InnerDOF, totalWeightSpec, totalWeight, TotalMass, u2Spec, u0ij, u2, SpecTemp, CellTemp, & - Xi_VibSpec, Xi_RotSpec, Prandtl, relaxfreq) + Xi_VibSpec, Xi_RotSpec, Prandtl, relaxfreq, dynamicvis, thermalcond) IF(DSMC%CalcQualityFactors) THEN BGK_MeanRelaxFactor = BGK_MeanRelaxFactor + relaxfreq * dtCell BGK_MeanRelaxFactorCounter = BGK_MeanRelaxFactorCounter + 1 BGK_MaxRelaxFactor = MAX(BGK_MaxRelaxFactor,relaxfreq*dtCell) BGK_PrandtlNumber = BGK_PrandtlNumber + Prandtl + BGK_Viscosity = BGK_Viscosity + dynamicvis + BGK_ThermalConductivity = BGK_ThermalConductivity + thermalcond END IF ! 3.) Treatment of molecules: determination of the rotational and vibrational relaxation frequency using the collision frequency, @@ -355,6 +358,7 @@ SUBROUTINE CalcMoments(nPart, iPartIndx_Node, nSpec, vBulkAll, totalWeight, tota INTEGER :: iLoop, iPart, iSpec, fillMa1, fillMa2 REAL :: V_rel(1:3), vmag2, partWeight, EnerTotal, totalWeightSpec2(nSpecies), vBulkSpec(3,nSpecies) REAL :: tempweight, tempweight2, tempmass, vBulkTemp(3), totalWeight2, totalWeight3 +LOGICAL :: validSpec(nSpecies) !=================================================================================================================================== totalWeightSpec = 0.0; totalWeightSpec2=0.0; vBulkAll=0.0; TotalMass=0.0; vBulkSpec=0.0; nSpec=0; dtCell=0.0 ! Loop over all simulation particles to sum up bulk velocities @@ -375,8 +379,6 @@ SUBROUTINE CalcMoments(nPart, iPartIndx_Node, nSpec, vBulkAll, totalWeight, tota totalWeight = SUM(totalWeightSpec) totalWeight2 = SUM(totalWeightSpec2) -IF ((MAXVAL(nSpec(:)).EQ.1).OR.(totalWeight.LE.0.0)) RETURN - ! Calculate bulk velocities vBulkAll(1:3) = vBulkAll(1:3) / TotalMass DO iSpec = 1, nSpecies @@ -429,11 +431,13 @@ SUBROUTINE CalcMoments(nPart, iPartIndx_Node, nSpec, vBulkAll, totalWeight, tota ! Calculation of cell temperature and bulk velocity (squared) IF (nSpecies.GT.1) THEN ! mixture + validSpec = .FALSE. SpecTemp = 0.0 EnerTotal = 0.0 tempweight = 0.0; tempweight2 = 0.0; tempmass = 0.0; vBulkTemp = 0.0 DO iSpec = 1, nSpecies IF ((nSpec(iSpec).GE.2).AND.(.NOT.ALMOSTZERO(u2Spec(iSpec)))) THEN + validSpec = .TRUE. SpecTemp(iSpec) = Species(iSpec)%MassIC * u2Spec(iSpec) & /(3.0*BoltzmannConst*(totalWeightSpec(iSpec) - totalWeightSpec2(iSpec)/totalWeightSpec(iSpec))) EnerTotal = EnerTotal + 3./2.*BoltzmannConst*SpecTemp(iSpec) * totalWeightSpec(iSpec) ! thermal energy @@ -445,11 +449,16 @@ SUBROUTINE CalcMoments(nPart, iPartIndx_Node, nSpec, vBulkAll, totalWeight, tota vBulkTemp(1:3) = vBulkTemp(1:3) + vBulkSpec(1:3,iSpec)*totalWeightSpec(iSpec) * Species(iSpec)%MassIC END IF END DO - vBulkTemp(1:3) = vBulkTemp(1:3) / tempmass - vmag2 = DOTPRODUCT(vBulkTemp(1:3)) - EnerTotal = EnerTotal - tempmass / 2. * vmag2 - CellTemp = 2. * EnerTotal / (3.*tempweight*BoltzmannConst) - u2 = 3. * CellTemp * BoltzmannConst * (tempweight - tempweight2/tempweight) / tempmass + IF (ANY(validSpec)) THEN + vBulkTemp(1:3) = vBulkTemp(1:3) / tempmass + vmag2 = DOTPRODUCT(vBulkTemp(1:3)) + EnerTotal = EnerTotal - tempmass / 2. * vmag2 + CellTemp = 2. * EnerTotal / (3.*tempweight*BoltzmannConst) + u2 = 3. * CellTemp * BoltzmannConst * (tempweight - tempweight2/tempweight) / tempmass + ELSE ! only one part per species or cloned species with u2spec = 0 because PartState(4:6) = vBulkAll + u2 = OldEn / (TotalMass*(1. - totalWeight2/totalWeight**2)) * 2. ! variance-free + CellTemp = TotalMass/totalWeight * u2 / (3.0*BoltzmannConst) + END IF ELSE ! single species gas u2 = u2Spec(1) / (totalWeight - totalWeight2/totalWeight) CellTemp = Species(1)%MassIC * u2 / (3.0*BoltzmannConst) @@ -527,7 +536,7 @@ SUBROUTINE CalcInnerDOFs(nSpec, EVibSpec, ERotSpec, totalWeightSpec, TVibSpec, T END SUBROUTINE CalcInnerDOFs SUBROUTINE CalcGasProperties(nSpec, dens, InnerDOF, totalWeightSpec, totalWeight, TotalMass, u2Spec, u0ij, u2, SpecTemp, CellTemp, & - Xi_VibSpec, Xi_RotSpec, Prandtl, relaxfreq) + Xi_VibSpec, Xi_RotSpec, Prandtl, relaxfreq, dynamicvis, thermalcond) !=================================================================================================================================== !> Calculate the reference dynamic viscosity, Prandtl number and the resulting relaxation frequency of the distribution function !=================================================================================================================================== @@ -545,13 +554,13 @@ SUBROUTINE CalcGasProperties(nSpec, dens, InnerDOF, totalWeightSpec, totalWeight REAL, INTENT(IN) :: u0ij(3,3), u2, Xi_VibSpec(nSpecies), Xi_RotSpec(nSpecies), dens, InnerDOF !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES -REAL, INTENT(OUT) :: Prandtl, relaxfreq +REAL, INTENT(OUT) :: Prandtl, relaxfreq, dynamicvis, thermalcond !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES INTEGER :: iSpec, jSpec, INFO REAL :: MolarFraction(1:nSpecies), MassFraction(1:nSpecies), MassIC_Mixture REAL :: PrandtlCorrection, dynamicvisSpec(nSpecies), thermalcondSpec(nSpecies), Phi(nSpecies) -REAL :: dynamicvis, thermalcond, C_P, nu, A(3,3), W(3), Theta, CellTempSpec(nSpecies+1), Work(100) +REAL :: C_P, nu, A(3,3), W(3), Theta, CellTempSpec(nSpecies+1), Work(100) !=================================================================================================================================== IF (nSpecies.GT.1) THEN ! gas mixture MolarFraction(1:nSpecies) = totalWeightSpec(1:nSpecies) / totalWeight @@ -563,7 +572,7 @@ SUBROUTINE CalcGasProperties(nSpec, dens, InnerDOF, totalWeightSpec, totalWeight DO iSpec = 1, nSpecies IF (nSpec(iSpec).EQ.0) CYCLE ! Correction of Pr for calculation of relaxation frequency, see alpha - Pfeiffer et. al., Physics of Fluids 33, 036106 (2021), - ! "Multi-species modeling in the particle-based ellipsoidal statistical Bhatnagar–Gross–Krook method for monatomic gas species" + ! "Multi-species modeling in the particle-based ellipsoidal statistical Bhatnagar-Gross-Krook method for monatomic gas species" PrandtlCorrection = PrandtlCorrection + MolarFraction(iSpec)*MassIC_Mixture/Species(iSpec)%MassIC IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN ! molecules C_P = C_P + ((5. + (Xi_VibSpec(iSpec)+Xi_RotSpec(iSpec)))/2.) * BoltzmannConst / Species(iSpec)%MassIC * MassFraction(iSpec) @@ -574,7 +583,7 @@ SUBROUTINE CalcGasProperties(nSpec, dens, InnerDOF, totalWeightSpec, totalWeight SELECT CASE(BGKMixtureModel) ! Both cases are described in Pfeiffer et. al., Physics of Fluids 33, 036106 (2021), - ! "Multi-species modeling in the particle-based ellipsoidal statistical Bhatnagar–Gross–Krook method for monatomic gas species" + ! "Multi-species modeling in the particle-based ellipsoidal statistical Bhatnagar-Gross-Krook method for monatomic gas species" CASE (1) ! Wilke's mixing rules DO iSpec = 1, nSpecies @@ -1743,7 +1752,7 @@ SUBROUTINE CalcViscosityThermalCondColIntVHS(CellTemp, Xi, dens, Xi_RotSpec, Xi_ ! S. Chapman and T.G. Cowling, "The mathematical Theory of Non-Uniform Gases", Cambridge University Press, 1970, S. 160 ViscSpec(iSpec) = (5./8.)*(BoltzmannConst*CellTemp(iSpec))/Sigma_22 ThermalCondSpec(iSpec) = (25./16.)*(cv*BoltzmannConst*CellTemp(iSpec))/Sigma_22 - !ThermalCondSpec(iSpec) = (15./4.)*BoltzmannConst/(2.*Mass)*ViscSpec(iSpec) + ! results in in same as ThermalCondSpec(iSpec) = (15./4.)*BoltzmannConst/(2.*Mass)*ViscSpec(iSpec) ! Additional calculation of Sigma_11VHS and the diffusion coefficient for molecular species IF ((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN CALL CalcSigma_11VHS(CellTemp(nSpecies+1),InteractDiam,Mass,TVHS, omegaVHS, Sigma_11) @@ -1756,7 +1765,7 @@ SUBROUTINE CalcViscosityThermalCondColIntVHS(CellTemp, Xi, dens, Xi_RotSpec, Xi_ CALL CalcSigma_11VHS(CellTemp(nSpecies+1),InteractDiam,Mass,TVHS, omegaVHS, Sigma_11) ! Parameters for calculation of contribution of species to mixture transport coefficients ! Pfeiffer et. al., Physics of Fluids 33, 036106 (2021), - ! "Multi-species modeling in the particle-based ellipsoidal statistical Bhatnagar–Gross–Krook method for monatomic gas species" + ! "Multi-species modeling in the particle-based ellipsoidal statistical Bhatnagar-Gross-Krook method for monatomic gas species" B_12(iSpec,jSpec) = (5.*GAMMA(4.-omegaVHS)-GAMMA(5.-omegaVHS))/(5.*GAMMA(3.-omegaVHS)) B_12(jSpec,iSpec) = B_12(iSpec,jSpec) A_12(iSpec,jSpec) = Sigma_22 / (5.*Sigma_11) @@ -1783,42 +1792,50 @@ SUBROUTINE CalcViscosityThermalCondColIntVHS(CellTemp, Xi, dens, Xi_RotSpec, Xi_ ! Calculate mixture viscosity by solving a system of linear equations with matrices ! Pfeiffer et. al., Physics of Fluids 33, 036106 (2021), -! "Multi-species modeling in the particle-based ellipsoidal statistical Bhatnagar–Gross–Krook method for monatomic gas species" +! "Multi-species modeling in the particle-based ellipsoidal statistical Bhatnagar-Gross-Krook method for monatomic gas species" ViscMat = 0.0 DO iSpec = 1, nSpecies - IF (Xi(iSpec).LE.0.0) CYCLE + IF (Xi(iSpec).LE.0.0) THEN + ViscMat(iSpec,iSpec) = 1. ! Ensure invertibility of ViscMat + CYCLE + END IF DO jSpec = 1, nSpecies IF (Xi(jSpec).LE.0.0) CYCLE IF (iSpec.EQ.jSpec) THEN - ViscMat(iSpec, jSpec) = ViscMat(iSpec, jSpec) + Xi(iSpec)/ViscSpec(iSpec) + ViscMat(iSpec, jSpec) = Xi(iSpec)/ViscSpec(iSpec) DO kSpec = 1, nSpecies - IF(kSpec.EQ.iSpec) CYCLE + IF (Xi(kSpec).LE.0.0) CYCLE + IF (kSpec.EQ.iSpec) CYCLE ViscMat(iSpec, jSpec) = ViscMat(iSpec, jSpec) + 3.*Xi(kSpec) / ((Species(iSpec)%MassIC*dens & - + Species(kSpec)%MassIC*dens)*DiffCoef(iSpec,kSpec))*(2./3.+Species(kSpec)%MassIC/Species(iSpec)%MassIC*A_12(iSpec,kSpec)) + + Species(kSpec)%MassIC*dens)*DiffCoef(iSpec,kSpec))*(2./3.+Species(kSpec)%MassIC/Species(iSpec)%MassIC*A_12(iSpec,kSpec)) END DO ELSE - ViscMat(iSpec, jSpec) = ViscMat(iSpec, jSpec) - Xi(iSpec)*3. / ((Species(iSpec)%MassIC*dens & + ViscMat(iSpec, jSpec) = -Xi(iSpec)*3. / ((Species(iSpec)%MassIC*dens & + Species(jSpec)%MassIC*dens)*DiffCoef(iSpec,jSpec))*(2./3.-A_12(iSpec,jSpec)) END IF END DO - RHSSolve(iSpec) = Xi(iSpec) END DO +RHSSolve(:) = Xi(:) CALL DGESV(nSpecies, 1, ViscMat, nSpecies, IPIV, RHSSolve, nSpecies, info_dgesv) Visc = SUM(RHSSolve) ! Calculate mixture thermal conductivity by solving a system of linear equations with matrices ! Pfeiffer et. al., Physics of Fluids 33, 036106 (2021), -! "Multi-species modeling in the particle-based ellipsoidal statistical Bhatnagar–Gross–Krook method for monatomic gas species" +! "Multi-species modeling in the particle-based ellipsoidal statistical Bhatnagar-Gross-Krook method for monatomic gas species" pressure = BoltzmannConst*dens*CellTemp(nSpecies+1) ViscMat = 0.0 DO iSpec = 1, nSpecies - IF (Xi(iSpec).LE.0.0) CYCLE + IF (Xi(iSpec).LE.0.0) THEN + ViscMat(iSpec,iSpec) = 1. ! Ensure invertibility of ViscMat + CYCLE + END IF DO jSpec = 1, nSpecies IF (Xi(jSpec).LE.0.0) CYCLE IF (iSpec.EQ.jSpec) THEN - ViscMat(iSpec, jSpec) = ViscMat(iSpec, jSpec) + Xi(iSpec)/ThermalCondSpec(iSpec) + ViscMat(iSpec, jSpec) = Xi(iSpec)/ThermalCondSpec(iSpec) DO kSpec = 1, nSpecies - IF(kSpec.EQ.iSpec) CYCLE + IF (Xi(kSpec).LE.0.0) CYCLE + IF (kSpec.EQ.iSpec) CYCLE m0 = Species(iSpec)%MassIC+Species(kSpec)%MassIC ViscMat(iSpec, jSpec) = ViscMat(iSpec, jSpec) + CellTemp(nSpecies+1)*Xi(kSpec)/(5.*pressure*DiffCoef(iSpec,kSpec)) & * (6.*Species(iSpec)%MassIC**2./m0**2.+(5.-4.*B_12(iSpec,kSpec))*Species(kSpec)%MassIC**2./m0**2. & @@ -1826,13 +1843,12 @@ SUBROUTINE CalcViscosityThermalCondColIntVHS(CellTemp, Xi, dens, Xi_RotSpec, Xi_ END DO ELSE m0 = Species(iSpec)%MassIC+Species(jSpec)%MassIC - ViscMat(iSpec, jSpec) = ViscMat(iSpec, jSpec) - Xi(iSpec)*CellTemp(nSpecies+1) & - *(Species(iSpec)%MassIC*Species(jSpec)%MassIC/m0**2.)/(5.*pressure*DiffCoef(iSpec,jSpec)) & - *(11.-4.*B_12(iSpec,jSpec)-8.*A_12(iSpec,jSpec)) + ViscMat(iSpec, jSpec) = -Xi(iSpec)*CellTemp(nSpecies+1) * (Species(iSpec)%MassIC*Species(jSpec)%MassIC/m0**2.) & + /(5.*pressure*DiffCoef(iSpec,jSpec)) *(11.-4.*B_12(iSpec,jSpec)-8.*A_12(iSpec,jSpec)) END IF END DO - RHSSolve(iSpec) = Xi(iSpec) END DO +RHSSolve(:) = Xi(:) CALL DGESV(nSpecies, 1, ViscMat, nSpecies, IPIV, RHSSolve, nSpecies, info_dgesv) ! Thermal conductivity from translation, rotation and vibration ThermalCond = SUM(RHSSolve) + SUM(ThermalCondSpec_Rot) + SUM(ThermalCondSpec_Vib) diff --git a/src/particles/bgk/bgk_init.f90 b/src/particles/bgk/bgk_init.f90 index 70f0ddfe7..ae7b7ecb0 100644 --- a/src/particles/bgk/bgk_init.f90 +++ b/src/particles/bgk/bgk_init.f90 @@ -110,7 +110,6 @@ SUBROUTINE InitBGK() !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES INTEGER :: iSpec, iSpec2 -REAL :: delta_ij LOGICAL :: MoleculePresent !=================================================================================================================================== LBWRITE(UNIT_stdOut,'(A)') ' INIT BGK Solver...' @@ -178,8 +177,8 @@ SUBROUTINE InitBGK() END IF IF(DSMC%CalcQualityFactors) THEN - ALLOCATE(BGK_QualityFacSamp(1:7,nElems)) - BGK_QualityFacSamp(1:7,1:nElems) = 0.0 + ALLOCATE(BGK_QualityFacSamp(1:9,nElems)) + BGK_QualityFacSamp(1:9,1:nElems) = 0.0 END IF BGKInitDone = .TRUE. diff --git a/src/particles/bgk/bgk_main.f90 b/src/particles/bgk/bgk_main.f90 index 7118f5766..bcaf2d04a 100644 --- a/src/particles/bgk/bgk_main.f90 +++ b/src/particles/bgk/bgk_main.f90 @@ -48,6 +48,7 @@ SUBROUTINE BGK_DSMC_main(stage_opt) ! USE MOD_BGK_Vars ,ONLY: BGKMovingAverage,ElemNodeAveraging,BGKMovingAverageLength USE MOD_BGK_Vars ,ONLY: BGK_MeanRelaxFactor,BGK_MeanRelaxFactorCounter,BGK_MaxRelaxFactor,BGK_QualityFacSamp USE MOD_BGK_Vars ,ONLY: BGK_MaxRotRelaxFactor, BGK_PrandtlNumber, BGK_ExpectedPrandtlNumber +USE MOD_BGK_Vars ,ONLY: BGK_Viscosity, BGK_ThermalConductivity USE MOD_BGK_CollOperator ,ONLY: BGK_CollisionOperator USE MOD_DSMC ,ONLY: DSMC_main USE MOD_DSMC_Vars ,ONLY: DSMC, RadialWeighting @@ -128,7 +129,7 @@ SUBROUTINE BGK_DSMC_main(stage_opt) IF(DSMC%CalcQualityFactors) THEN BGK_MeanRelaxFactorCounter = 0; BGK_MeanRelaxFactor = 0.; BGK_MaxRelaxFactor = 0.; BGK_MaxRotRelaxFactor = 0. - BGK_PrandtlNumber=0.; BGK_ExpectedPrandtlNumber=0. + BGK_PrandtlNumber=0.; BGK_ExpectedPrandtlNumber=0.; BGK_Viscosity=0.; BGK_ThermalConductivity=0. END IF ! IF (BGKMovingAverage) THEN ! CALL BGK_CollisionOperator(iPartIndx_Node, nPart, ElemVolume_Shared(CNElemID), & @@ -147,6 +148,8 @@ SUBROUTINE BGK_DSMC_main(stage_opt) BGK_QualityFacSamp(5,iElem) = BGK_QualityFacSamp(5,iElem) + BGK_MaxRotRelaxFactor BGK_QualityFacSamp(6,iElem) = BGK_QualityFacSamp(6,iElem) + BGK_PrandtlNumber BGK_QualityFacSamp(7,iElem) = BGK_QualityFacSamp(7,iElem) + BGK_ExpectedPrandtlNumber + BGK_QualityFacSamp(8,iElem) = BGK_QualityFacSamp(8,iElem) + BGK_Viscosity + BGK_QualityFacSamp(9,iElem) = BGK_QualityFacSamp(9,iElem) + BGK_ThermalConductivity END IF END IF END IF @@ -172,6 +175,7 @@ SUBROUTINE BGK_main(stage_opt) USE MOD_BGK_Vars ,ONLY: DoBGKCellAdaptation!, BGKMovingAverage, ElemNodeAveraging, BGKMovingAverageLength USE MOD_BGK_Vars ,ONLY: BGK_MeanRelaxFactor,BGK_MeanRelaxFactorCounter,BGK_MaxRelaxFactor,BGK_QualityFacSamp USE MOD_BGK_Vars ,ONLY: BGK_MaxRotRelaxFactor, BGK_PrandtlNumber, BGK_ExpectedPrandtlNumber +USE MOD_BGK_Vars ,ONLY: BGK_Viscosity, BGK_ThermalConductivity USE MOD_BGK_CollOperator ,ONLY: BGK_CollisionOperator USE MOD_DSMC_Analyze ,ONLY: DSMCMacroSampling USE MOD_Particle_Mesh_Vars ,ONLY: ElemVolume_Shared @@ -234,7 +238,7 @@ SUBROUTINE BGK_main(stage_opt) IF(DSMC%CalcQualityFactors) THEN BGK_MeanRelaxFactorCounter = 0; BGK_MeanRelaxFactor = 0.; BGK_MaxRelaxFactor = 0.; BGK_MaxRotRelaxFactor = 0. - BGK_PrandtlNumber=0.; BGK_ExpectedPrandtlNumber=0. + BGK_PrandtlNumber=0.; BGK_ExpectedPrandtlNumber=0.; BGK_Viscosity=0.; BGK_ThermalConductivity=0. END IF ! IF (BGKMovingAverage) THEN @@ -254,6 +258,8 @@ SUBROUTINE BGK_main(stage_opt) BGK_QualityFacSamp(5,iElem) = BGK_QualityFacSamp(5,iElem) + BGK_MaxRotRelaxFactor BGK_QualityFacSamp(6,iElem) = BGK_QualityFacSamp(6,iElem) + BGK_PrandtlNumber BGK_QualityFacSamp(7,iElem) = BGK_QualityFacSamp(7,iElem) + BGK_ExpectedPrandtlNumber + BGK_QualityFacSamp(8,iElem) = BGK_QualityFacSamp(8,iElem) + BGK_Viscosity + BGK_QualityFacSamp(9,iElem) = BGK_QualityFacSamp(9,iElem) + BGK_ThermalConductivity END IF END IF END DO diff --git a/src/particles/bgk/bgk_vars.f90 b/src/particles/bgk/bgk_vars.f90 index 536ea1dff..0779e4eff 100644 --- a/src/particles/bgk/bgk_vars.f90 +++ b/src/particles/bgk/bgk_vars.f90 @@ -48,6 +48,8 @@ MODULE MOD_BGK_Vars REAL :: BGK_MaxRotRelaxFactor REAL :: BGK_PrandtlNumber REAL :: BGK_ExpectedPrandtlNumber +REAL :: BGK_Viscosity +REAL :: BGK_ThermalConductivity TYPE tElemNodeAveraging TYPE (tNodeAverage), POINTER :: Root => null() diff --git a/src/particles/dsmc/dsmc_analyze.f90 b/src/particles/dsmc/dsmc_analyze.f90 index d8276bd83..fb702d98b 100644 --- a/src/particles/dsmc/dsmc_analyze.f90 +++ b/src/particles/dsmc/dsmc_analyze.f90 @@ -951,16 +951,20 @@ SUBROUTINE DSMC_output_calc(nVar,nVar_quality,nVarloc,DSMC_MacroVal) DSMC_MacroVal(nVarCount+2,iElem) = BGK_QualityFacSamp(6,iElem) / BGK_QualityFacSamp(2,iElem) ! Mean expected Prandtl number DSMC_MacroVal(nVarCount+3,iElem) = BGK_QualityFacSamp(7,iElem) / BGK_QualityFacSamp(2,iElem) + ! Mean viscosity + DSMC_MacroVal(nVarCount+4,iElem) = BGK_QualityFacSamp(8,iElem) / BGK_QualityFacSamp(2,iElem) + ! Mean thermal conductivity + DSMC_MacroVal(nVarCount+5,iElem) = BGK_QualityFacSamp(9,iElem) / BGK_QualityFacSamp(2,iElem) END IF IF(BGK_QualityFacSamp(4,iElem).GT.0) THEN ! Max relaxation factor (maximal value of all octree subcells) - DSMC_MacroVal(nVarCount+4,iElem) = BGK_QualityFacSamp(3,iElem) / BGK_QualityFacSamp(4,iElem) + DSMC_MacroVal(nVarCount+6,iElem) = BGK_QualityFacSamp(3,iElem) / BGK_QualityFacSamp(4,iElem) ! Max rotational relaxation factor - DSMC_MacroVal(nVarCount+5,iElem) = BGK_QualityFacSamp(5,iElem) / BGK_QualityFacSamp(4,iElem) + DSMC_MacroVal(nVarCount+7,iElem) = BGK_QualityFacSamp(5,iElem) / BGK_QualityFacSamp(4,iElem) END IF ! Ratio between BGK and DSMC usage per cell - DSMC_MacroVal(nVarCount+6,iElem) = BGK_QualityFacSamp(4,iElem) / iter_loc - nVarCount = nVarCount + 6 + DSMC_MacroVal(nVarCount+8,iElem) = BGK_QualityFacSamp(4,iElem) / iter_loc + nVarCount = nVarCount + 8 END IF ! variable rotation and vibration relaxation IF(Collismode.GT.1) THEN @@ -1054,7 +1058,7 @@ SUBROUTINE WriteDSMCToHDF5(MeshFileName,OutputTime,FutureTime) nVar_quality=3 IF(VarTimeStep%UseVariableTimeStep) nVar_quality = nVar_quality + 1 IF(RadialWeighting%PerformCloning) nVar_quality = nVar_quality + 2 - IF(BGKInitDone) nVar_quality = nVar_quality + 6 + IF(BGKInitDone) nVar_quality = nVar_quality + 8 IF(FPInitDone) nVar_quality = nVar_quality + 5 ELSE nVar_quality=0 @@ -1136,10 +1140,12 @@ SUBROUTINE WriteDSMCToHDF5(MeshFileName,OutputTime,FutureTime) StrVarNames(nVarCount+1) ='BGK_MeanRelaxationFactor' StrVarNames(nVarCount+2) ='BGK_MeanPrandtlNumber' StrVarNames(nVarCount+3) ='BGK_ExpectedPrandtlNumber' - StrVarNames(nVarCount+4) ='BGK_MaxRelaxationFactor' - StrVarNames(nVarCount+5) ='BGK_MaxRotationRelaxFactor' - StrVarNames(nVarCount+6) ='BGK_DSMC_Ratio' - nVarCount=nVarCount+6 + StrVarNames(nVarCount+4) ='BGK_Viscosity' + StrVarNames(nVarCount+5) ='BGK_ThermalConductivity' + StrVarNames(nVarCount+6) ='BGK_MaxRelaxationFactor' + StrVarNames(nVarCount+7) ='BGK_MaxRotationRelaxFactor' + StrVarNames(nVarCount+8) ='BGK_DSMC_Ratio' + nVarCount=nVarCount+8 END IF IF(FPInitDone) THEN StrVarNames(nVarCount+1) ='FP_MeanRelaxationFactor' From b93c44729071ec3e9b867802ac85735ed0e2ea00 Mon Sep 17 00:00:00 2001 From: Franziska Hild Date: Mon, 30 Jan 2023 18:02:52 +0100 Subject: [PATCH 050/495] BGK collision operator: comments and references --- src/particles/bgk/bgk_colloperator.f90 | 309 +++++++++++++++++++++---- 1 file changed, 263 insertions(+), 46 deletions(-) diff --git a/src/particles/bgk/bgk_colloperator.f90 b/src/particles/bgk/bgk_colloperator.f90 index 22fc50b31..948a30f77 100644 --- a/src/particles/bgk/bgk_colloperator.f90 +++ b/src/particles/bgk/bgk_colloperator.f90 @@ -163,7 +163,7 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume) END IF ! 3.) Treatment of molecules: determination of the rotational and vibrational relaxation frequency using the collision frequency, -! which is not the same as the relaxation frequency of distribution function, calculated above. +! which is not the same as the relaxation frequency of distribution function, calculated above IF(ANY(SpecDSMC(:)%InterID.EQ.2).OR.ANY(SpecDSMC(:)%InterID.EQ.20)) THEN collisionfreqSpec = 0.0 DO iSpec = 1, nSpecies @@ -175,19 +175,25 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume) END IF ! Sum up collision frequencies of species i with itself and the other species ! S. Chapman and T.G. Cowling, "The mathematical Theory of Non-Uniform Gases", Cambridge University Press, 1970, S. 87f + ! For SpecBGK(iSpec)%CollFreqPreFactor(jSpec) see bgk_init.f90 collisionfreqSpec(iSpec) = collisionfreqSpec(iSpec) + SpecBGK(iSpec)%CollFreqPreFactor(jSpec) * totalWeightSpec(jSpec) & * (Dens / totalWeight) *CellTemptmp**(-CollInf%omega(iSpec,jSpec) +0.5) END DO END DO ! Calculate relaxation frequencies of rotation and vibration with relaxation properties + ! M. Pfeiffer, "Extending the particle ellipsoidal statistical Bhatnagar-Gross-Krook method to diatomic molecules including + ! quantized vibrational energies", Phys. Fluids 30, 116103 (2018) + ! N.E. Gimelshein et. al, "Vibrational relaxation rates in the direct simulation Monte Carlo method", Phys. Fluids 14, 4452 (2018) + ! relaxfreqSpec = collisionfreqSpec / collision number Z with RelaxProb = 1/Z rotrelaxfreqSpec(:) = collisionfreqSpec(:) * DSMC%RotRelaxProb vibrelaxfreqSpec(:) = collisionfreqSpec(:) * DSMC%VibRelaxProb RotExpSpec=0.; VibExpSpec=0. ! Calculation of the equilibrium temperature - IF(SpecDSMC(1)%PolyatomicMol) THEN ! polyatomic, no mixtures possible by now + IF(SpecDSMC(1)%PolyatomicMol) THEN ! polyatomic, NO MIXTURES POSSIBLE BY NOW CALL CalcTEquiPoly(nPart, CellTemp, TRotSpec(1), TVibSpec(1), nXiVibDOF, Xi_vib_DOF, Xi_Vib_oldSpec(1), RotExpSpec(1), VibExpSpec(1), & TEqui, rotrelaxfreqSpec(1), vibrelaxfreqSpec(1), dtCell) + ! Corrected vibrational degrees of freedom Xi_VibSpec(1) = SUM(Xi_vib_DOF(1:PolyatomMolDSMC(iPolyatMole)%VibDOF)) ELSE ! diatomic CALL CalcTEquiMulti(nPart, nSpec, CellTemp, TRotSpec, TVibSpec, Xi_VibSpec, Xi_Vib_oldSpec, RotExpSpec, VibExpSpec, & @@ -207,6 +213,8 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume) CALL DetermineRelaxPart(nPart, iPartIndx_Node, relaxfreq, dtCell, RotExpSpec, VibExpSpec, nRelax, nRotRelax, nVibRelax, & nRotRelaxSpec, nVibRelaxSpec, iPartIndx_NodeRelax, iPartIndx_NodeRelaxTemp, iPartIndx_NodeRelaxRot, & iPartIndx_NodeRelaxVib, vBulk, OldEnRot, OldEn) + +! Return if no particles are undergoing a relaxation IF ((nRelax.EQ.0).AND.(nRotRelax.EQ.0).AND.(nVibRelax.EQ.0)) RETURN IF(BGKDoVibRelaxation) THEN @@ -223,19 +231,28 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume) CALL SampleFromTargetDistr(nRelax, iPartIndx_NodeRelax, Prandtl, u2, u0ij, u2i, vBulkAll, CellTemp, vBulk) NewEn = 0. + +! Calculation of the new bulk velocity vBulk = vBulk/TotalMass + +! Loop over all relaxing particles for calculation of the new energy DO iLoop = 1, nRelax iPart = iPartIndx_NodeRelax(iLoop) iSpec = PartSpecies(iPart) partWeight = GetParticleWeight(iPart) + ! Thermal velocity of all relaxing particles V_rel(1:3) = PartState(4:6,iPart) - vBulk(1:3) + ! Sum up kinetic energies NewEn = NewEn + (V_rel(1)**(2.) + V_rel(2)**(2.) + V_rel(3)**(2.))*0.5*Species(iSpec)%MassIC*partWeight END DO +! Loop over all non-relaxing particles for calculation of the new energy DO iLoop = 1, nPart-nRelax iPart = iPartIndx_NodeRelaxTemp(iLoop) iSpec = PartSpecies(iPart) partWeight = GetParticleWeight(iPart) + ! Thermal velocity of all non-relaxing particles V_rel(1:3) = PartState(4:6,iPart) - vBulk(1:3) + ! Sum up kinetic energies NewEn = NewEn + (V_rel(1)**(2.) + V_rel(2)**(2.) + V_rel(3)**(2.))*0.5*Species(iSpec)%MassIC*partWeight END DO @@ -244,14 +261,21 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume) CALL EnergyConsVib(nPart, nVibRelax, nVibRelaxSpec, iPartIndx_NodeRelaxVib, NewEnVib, OldEn, nXiVibDOF, Xi_VibSpec, VibEnergyDOF, TEqui) END IF +! Remaining vibrational (+ translational) energy + rotational energy for translation and rotation OldEn = OldEn + OldEnRot -! 8.) Determine the new particle state and ensure energy conservation by scaling the new velocities with the factor alpha. +! 8.) Determine the new particle state and ensure energy conservation by scaling the new velocities with the factor alpha Xi_RotTotal = 0.0 +! ! Total number of relaxing rotational degrees of freedom DO iSpec = 1, nSpecies Xi_RotTotal = Xi_RotTotal + Xi_RotSpec(iSpec)*nRotRelaxSpec(iSpec) END DO +! Calculation of scaling factor alpha, see M. Pfeiffer, "Extending the particle ellipsoidal statistical Bhatnagar-Gross-Krook method +! to diatomic molecules including quantized vibrational energies", Phys. Fluids 30, 116103 (2018) alpha = SQRT(OldEn/NewEn*(3.*(nPart-1.))/(Xi_RotTotal+3.*(nPart-1.))) +! Calculation of the final particle velocities with vBulkAll (average flow velocity before relaxation), scaling factor alpha, +! the particle velocity PartState(4:6,iPart) after the relaxation but before the energy conservation and vBulk (average value of +! the latter) DO iLoop = 1, nRelax iPart = iPartIndx_NodeRelax(iLoop) PartState(4:6,iPart) = vBulkAll(1:3) + alpha*(PartState(4:6,iPart)-vBulk(1:3)) @@ -263,6 +287,8 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume) ! 9.) Rotation: Scale the new rotational state of the molecules to ensure energy conservation DO iSpec = 1, nSpecies + ! Calculate scaling factor alpha per species, see M. Pfeiffer, "Extending the particle ellipsoidal statistical Bhatnagar-Gross- + ! Krook method to diatomic molecules including quantized vibrational energies", Phys. Fluids 30, 116103 (2018) IF (NewEnRot(iSpec).GT.0.0) THEN alphaRot(iSpec) = OldEn/NewEnRot(iSpec)*(Xi_RotSpec(iSpec)*nRotRelaxSpec(iSpec)/(Xi_RotTotal+3.*(nPart-1.))) ELSE @@ -272,6 +298,7 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume) DO iLoop = 1, nRotRelax iPart = iPartIndx_NodeRelaxRot(iLoop) iSpec = PartSpecies(iPart) + ! Scaling of rotational energy with factor alpha PartStateIntEn( 2,iPart) = alphaRot(iSpec)*PartStateIntEn( 2,iPart) END DO @@ -330,6 +357,7 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume) END SUBROUTINE BGK_CollisionOperator + SUBROUTINE CalcMoments(nPart, iPartIndx_Node, nSpec, vBulkAll, totalWeight, totalWeightSpec, TotalMass, u2, u2Spec, & u0ij, u2i, OldEn, EVibSpec, ERotSpec, CellTemp, SpecTemp, dtCell) !=================================================================================================================================== @@ -361,7 +389,7 @@ SUBROUTINE CalcMoments(nPart, iPartIndx_Node, nSpec, vBulkAll, totalWeight, tota LOGICAL :: validSpec(nSpecies) !=================================================================================================================================== totalWeightSpec = 0.0; totalWeightSpec2=0.0; vBulkAll=0.0; TotalMass=0.0; vBulkSpec=0.0; nSpec=0; dtCell=0.0 -! Loop over all simulation particles to sum up bulk velocities +! Loop over all simulation particles to sum up particle velocities to calculate bulk velocities DO iLoop = 1, nPart iPart = iPartIndx_Node(iLoop) partWeight = GetParticleWeight(iPart) @@ -379,7 +407,7 @@ SUBROUTINE CalcMoments(nPart, iPartIndx_Node, nSpec, vBulkAll, totalWeight, tota totalWeight = SUM(totalWeightSpec) totalWeight2 = SUM(totalWeightSpec2) -! Calculate bulk velocities +! Calculate total bulk velocity and bulk velocities per species vBulkAll(1:3) = vBulkAll(1:3) / TotalMass DO iSpec = 1, nSpecies IF (nSpec(iSpec).GT.0) vBulkSpec(:,iSpec) = vBulkSpec(:,iSpec) / totalWeightSpec(iSpec) @@ -413,7 +441,7 @@ SUBROUTINE CalcMoments(nPart, iPartIndx_Node, nSpec, vBulkAll, totalWeight, tota totalWeight3 = totalWeight3 + partWeight*partWeight*partWeight END IF - ! Sum up old energy of thermal velocities and calculate internal energies + ! Sum up old energy of thermal velocities and sum up internal energies OldEn = OldEn + 0.5*Species(iSpec)%MassIC * vmag2*partWeight IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN IF(BGKDoVibRelaxation) THEN @@ -424,7 +452,9 @@ SUBROUTINE CalcMoments(nPart, iPartIndx_Node, nSpec, vBulkAll, totalWeight, tota END IF END DO -u0ij = u0ij* totalWeight / (TotalMass*(totalWeight - totalWeight2/totalWeight)) ! ESBGK +IF (BGKCollModel.EQ.1) THEN ! ESBGK + u0ij = u0ij* totalWeight / (TotalMass*(totalWeight - totalWeight2/totalWeight)) +END IF IF (BGKCollModel.EQ.2) THEN ! Shakhov u2i = u2i*totalWeight**3/(TotalMass*(totalWeight**3-3.*totalWeight*totalWeight2+2.*totalWeight3)) END IF @@ -436,13 +466,17 @@ SUBROUTINE CalcMoments(nPart, iPartIndx_Node, nSpec, vBulkAll, totalWeight, tota EnerTotal = 0.0 tempweight = 0.0; tempweight2 = 0.0; tempmass = 0.0; vBulkTemp = 0.0 DO iSpec = 1, nSpecies + ! At least two particles and non-zero squared thermal velocity needed for a valid species IF ((nSpec(iSpec).GE.2).AND.(.NOT.ALMOSTZERO(u2Spec(iSpec)))) THEN validSpec = .TRUE. + ! Calculation of the species temperature SpecTemp(iSpec) = Species(iSpec)%MassIC * u2Spec(iSpec) & /(3.0*BoltzmannConst*(totalWeightSpec(iSpec) - totalWeightSpec2(iSpec)/totalWeightSpec(iSpec))) - EnerTotal = EnerTotal + 3./2.*BoltzmannConst*SpecTemp(iSpec) * totalWeightSpec(iSpec) ! thermal energy + ! Thermal energy + EnerTotal = EnerTotal + 3./2.*BoltzmannConst*SpecTemp(iSpec) * totalWeightSpec(iSpec) vmag2 = DOTPRODUCT(vBulkSpec(1:3,iSpec)) - EnerTotal = EnerTotal + totalWeightSpec(iSpec) * Species(iSpec)%MassIC / 2. * vmag2 ! kinetic energy + ! Add kinetic energy + EnerTotal = EnerTotal + totalWeightSpec(iSpec) * Species(iSpec)%MassIC / 2. * vmag2 tempweight = tempweight + totalWeightSpec(iSpec) tempweight2 = tempweight2 + totalWeightSpec2(iSpec) tempmass = tempmass + totalWeightSpec(iSpec) * Species(iSpec)%MassIC @@ -452,7 +486,9 @@ SUBROUTINE CalcMoments(nPart, iPartIndx_Node, nSpec, vBulkAll, totalWeight, tota IF (ANY(validSpec)) THEN vBulkTemp(1:3) = vBulkTemp(1:3) / tempmass vmag2 = DOTPRODUCT(vBulkTemp(1:3)) + ! EnerTotal = kinetic energy (tempmass / 2. * vmag2) + thermal energy (3. * tempweight * BoltzmannConst * CellTemp / 2) EnerTotal = EnerTotal - tempmass / 2. * vmag2 + ! Calculation of the cell temperature from the thermal energy CellTemp = 2. * EnerTotal / (3.*tempweight*BoltzmannConst) u2 = 3. * CellTemp * BoltzmannConst * (tempweight - tempweight2/tempweight) / tempmass ELSE ! only one part per species or cloned species with u2spec = 0 because PartState(4:6) = vBulkAll @@ -466,6 +502,7 @@ SUBROUTINE CalcMoments(nPart, iPartIndx_Node, nSpec, vBulkAll, totalWeight, tota END SUBROUTINE CalcMoments + SUBROUTINE CalcInnerDOFs(nSpec, EVibSpec, ERotSpec, totalWeightSpec, TVibSpec, TRotSpec, InnerDOF, Xi_VibSpec, Xi_Vib_oldSpec & ,Xi_RotSpec) !=================================================================================================================================== @@ -495,6 +532,7 @@ SUBROUTINE CalcInnerDOFs(nSpec, EVibSpec, ERotSpec, totalWeightSpec, TVibSpec, T Xi_VibSpec=0.; InnerDOF=0.; Xi_RotSpec=0.; Xi_Vib_oldSpec=0.; TVibSpec=0.; TRotSpec=0. DO iSpec = 1, nSpecies IF (nSpec(iSpec).EQ.0) CYCLE + ! Only for molecules IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN IF(BGKDoVibRelaxation) THEN IF(SpecDSMC(iSpec)%PolyatomicMol) THEN ! polyatomic @@ -503,7 +541,7 @@ SUBROUTINE CalcInnerDOFs(nSpec, EVibSpec, ERotSpec, totalWeightSpec, TVibSpec, T TVibSpec(iSpec) = CalcTVibPoly(EVibSpec(iSpec)/totalWeightSpec(iSpec), 1) IF (TVibSpec(iSpec).GT.0.0) THEN DO iDOF = 1, PolyatomMolDSMC(iPolyatMole)%VibDOF - ! Calculation of vibrational DOFs from Pfeiffer et. al., AIP Conference Proceedings 2132, 100001 (2019), + ! Calculation of vibrational DOFs according to Pfeiffer et. al., AIP Conference Proceedings 2132, 100001 (2019), ! "Extension of particle-based BGK models to polyatomic species in hypersonic flow around a flat-faced cylinder" exparg = PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)/TVibSpec(iSpec) IF(CHECKEXP(exparg))THEN @@ -514,8 +552,9 @@ SUBROUTINE CalcInnerDOFs(nSpec, EVibSpec, ERotSpec, totalWeightSpec, TVibSpec, T END DO END IF ELSE ! diatomic - ! Calculation of vibrational temperature and DOFs from Pfeiffer, Physics of Fluids 30, 116103 (2018), - ! "Extending the particle ellipsoidal statistical Bhatnagar-Gross-Krook method to diatomic molecules including quantized vibrational energies" + ! Calculation of vibrational temperature and DOFs from Pfeiffer, Physics of Fluids 30, 116103 (2018), "Extending the + ! particle ellipsoidal statistical Bhatnagar-Gross-Krook method to diatomic molecules including quantized vibrational + ! energies" ! TVibSpec = vibrational energy without zero-point energy TVibSpec(iSpec) = EVibSpec(iSpec) / (totalWeightSpec(iSpec)*BoltzmannConst*SpecDSMC(iSpec)%CharaTVib) IF (TVibSpec(iSpec).GT.0.0) THEN @@ -526,8 +565,8 @@ SUBROUTINE CalcInnerDOFs(nSpec, EVibSpec, ERotSpec, totalWeightSpec, TVibSpec, T Xi_Vib_oldSpec(iSpec) = Xi_VibSpec(iSpec) END IF Xi_RotSpec(iSpec) = SpecDSMC(iSpec)%Xi_Rot - ! Calculation of rotational temperature from Pfeiffer, Physics of Fluids 30, 116103 (2018), - ! "Extending the particle ellipsoidal statistical Bhatnagar-Gross-Krook method to diatomic molecules including quantized vibrational energies" + ! Calculation of rotational temperature from Pfeiffer, Physics of Fluids 30, 116103 (2018), "Extending the particle ellipsoidal + ! statistical Bhatnagar-Gross-Krook method to diatomic molecules including quantized vibrational energies" TRotSpec(iSpec) = 2.*ERotSpec(iSpec)/(Xi_RotSpec(iSpec)*totalWeightSpec(iSpec)*BoltzmannConst) END IF InnerDOF = InnerDOF + Xi_RotSpec(iSpec) + Xi_VibSpec(iSpec) @@ -535,6 +574,7 @@ SUBROUTINE CalcInnerDOFs(nSpec, EVibSpec, ERotSpec, totalWeightSpec, TVibSpec, T END SUBROUTINE CalcInnerDOFs + SUBROUTINE CalcGasProperties(nSpec, dens, InnerDOF, totalWeightSpec, totalWeight, TotalMass, u2Spec, u0ij, u2, SpecTemp, CellTemp, & Xi_VibSpec, Xi_RotSpec, Prandtl, relaxfreq, dynamicvis, thermalcond) !=================================================================================================================================== @@ -602,7 +642,8 @@ SUBROUTINE CalcGasProperties(nSpec, dens, InnerDOF, totalWeightSpec, totalWeight END IF ! Thermal conductivity per species (Eucken's formula with a correction by Hirschfelder for the internal degrees of freedom) IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN ! inner DOF - ! Istomin et. al., "Eucken correction in high-temperature gases with electronic excitation", J. Chem. Phys. 140, 184311 (2014) + ! Istomin et. al., "Eucken correction in high-temperature gases with electronic excitation", J. Chem. Phys. 140, + ! 184311 (2014) thermalcondspec(iSpec) = 0.25 * (15. + 2. * (Xi_VibSpec(iSpec)+Xi_RotSpec(iSpec)) * 1.328) & * dynamicvisSpec(iSpec) * BoltzmannConst / Species(iSpec)%MassIC ELSE ! atoms @@ -675,6 +716,7 @@ SUBROUTINE CalcGasProperties(nSpec, dens, InnerDOF, totalWeightSpec, totalWeight END SUBROUTINE CalcGasProperties + SUBROUTINE DetermineRelaxPart(nPart, iPartIndx_Node, relaxfreq, dtCell, RotExpSpec, VibExpSpec, nRelax, nRotRelax, nVibRelax, & nRotRelaxSpec, nVibRelaxSpec, iPartIndx_NodeRelax, iPartIndx_NodeRelaxTemp, iPartIndx_NodeRelaxRot, & iPartIndx_NodeRelaxVib, vBulk, OldEnRot, OldEn) @@ -707,36 +749,47 @@ SUBROUTINE DetermineRelaxPart(nPart, iPartIndx_Node, relaxfreq, dtCell, RotExpSp REAL :: ProbAddPartTrans, iRan, partWeight !=================================================================================================================================== nVibRelaxSpec =0; nRotRelaxSpec =0; nRelax=0; nNotRelax=0; vBulk=0.0; nRotRelax=0; nVibRelax=0; OldEnRot=0.0 +! Calculate probability of relaxation of a particle towards the target distribution function ProbAddPartTrans = 1.-EXP(-relaxfreq*dtCell) +! Loop over all simulation particles DO iLoop = 1, nPart iPart = iPartIndx_Node(iLoop) iSpec = PartSpecies(iPart) partWeight = GetParticleWeight(iPart) CALL RANDOM_NUMBER(iRan) + ! Count particles that are undergoing a relaxation IF (ProbAddPartTrans.GT.iRan) THEN nRelax = nRelax + 1 iPartIndx_NodeRelax(nRelax) = iPart + ! Count particles that are not undergoing a relaxation ELSE nNotRelax = nNotRelax + 1 iPartIndx_NodeRelaxTemp(nNotRelax) = iPart + ! Sum up velocities of non-relaxing particles for bulk velocity vBulk(1:3) = vBulk(1:3) + PartState(4:6,iPart)*Species(iSpec)%MassIC*partWeight END IF + + ! For molecules: relaxation of inner DOF IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN - !Rotation + ! Rotation CALL RANDOM_NUMBER(iRan) + ! Count particles that are undergoing a relaxation, in total and per species IF ((1.-RotExpSpec(iSpec)).GT.iRan) THEN nRotRelax = nRotRelax + 1 nRotRelaxSpec(iSpec) = nRotRelaxSpec(iSpec) + 1 iPartIndx_NodeRelaxRot(nRotRelax) = iPart + ! Sum up total rotational energy OldEnRot = OldEnRot + PartStateIntEn(2,iPart) * partWeight END IF ! Vibration IF(BGKDoVibRelaxation) THEN CALL RANDOM_NUMBER(iRan) + ! Count particles that are undergoing a relaxation, in total and per species IF ((1.-VibExpSpec(iSpec)).GT.iRan) THEN nVibRelax = nVibRelax + 1 nVibRelaxSpec(iSpec) = nVibRelaxSpec(iSpec) + 1 iPartIndx_NodeRelaxVib(nVibRelax) = iPart + ! Sum up total vibrational energy, considering zero-point energy OldEn = OldEn + (PartStateIntEn(1,iPartIndx_NodeRelaxVib(nVibRelax)) - SpecDSMC(iSpec)%EZeroPoint) * partWeight END IF END IF @@ -745,6 +798,7 @@ SUBROUTINE DetermineRelaxPart(nPart, iPartIndx_Node, relaxfreq, dtCell, RotExpSp END SUBROUTINE DetermineRelaxPart + SUBROUTINE RelaxInnerEnergy(nPart, nVibRelax, nRotRelax, iPartIndx_NodeRelaxVib, iPartIndx_NodeRelaxRot, nXiVibDOF, Xi_vib_DOF, Xi_VibSpec, & Xi_RotSpec , TEqui, VibEnergyDOF, NewEnVib, NewEnRot) !=================================================================================================================================== @@ -772,40 +826,51 @@ SUBROUTINE RelaxInnerEnergy(nPart, nVibRelax, nRotRelax, iPartIndx_NodeRelaxVib, INTEGER :: iLoop, iPart, iDOF, iPolyatMole, iSpec REAL :: partWeight, iRan !=================================================================================================================================== -! VIB Relaxation NewEnVib = 0.0; NewEnRot=0.0 IF(BGKDoVibRelaxation) THEN + ! Loop over all particles undergoing a relaxation in the vibration DO iLoop = 1, nVibRelax iPart = iPartIndx_NodeRelaxVib(iLoop) iSpec = PartSpecies(iPart) partWeight = GetParticleWeight(iPart) + ! polyatomic, more than one vibrational DOF IF(SpecDSMC(iSpec)%PolyatomicMol) THEN iPolyatMole = SpecDSMC(iSpec)%SpecToPolyArray PartStateIntEn(1,iPart) = 0.0 + ! Sum up the new vibrational energy over all DOFs, see M. Pfeiffer et. al., "Extension of Particle-based BGK Models to + ! Polyatomic Species in Hypersonic Flow around a Flat-faced Cylinder", AIP Conference Proceedings 2132, 100001 (2019) DO iDOF = 1, PolyatomMolDSMC(iPolyatMole)%VibDOF CALL RANDOM_NUMBER(iRan) VibEnergyDOF(iLoop,iDOF) = - LOG(iRan)*Xi_vib_DOF(iDOF)/2.*TEqui*BoltzmannConst PartStateIntEn(1,iPart) = PartStateIntEn(1,iPart)+VibEnergyDOF(iLoop,iDOF) END DO + ! ELSE: diatomic, only one vibrational DOF, calculate new vibrational energy according to M. Pfeiffer, "Extending the particle + ! ellipsoidal statistical Bhatnagar-Gross-Krook method to diatomic molecules including quantized vibrational energies", + ! Phys. Fluids 30, 116103 (2018) ELSE CALL RANDOM_NUMBER(iRan) PartStateIntEn( 1,iPart) = -LOG(iRan)*Xi_VibSpec(iSpec)/2.*TEqui*BoltzmannConst END IF + ! Sum up new vibrational energy per species NewEnVib(iSpec) = NewEnVib(iSpec) + PartStateIntEn(1,iPart) * partWeight END DO END IF -! ROT Relaxation +! Loop over all particles undergoing a relaxation in the rotation DO iLoop = 1, nRotRelax iPart = iPartIndx_NodeRelaxRot(iLoop) iSpec = PartSpecies(iPart) partWeight = GetParticleWeight(iPart) CALL RANDOM_NUMBER(iRan) + ! Calculate new rotational energy according to M. Pfeiffer et. al., "Extension of Particle-based BGK Models to Polyatomic Species + ! in Hypersonic Flow around a Flat-faced Cylinder", AIP Conference Proceedings 2132, 100001 (2019) PartStateIntEn( 2,iPart) = -Xi_RotSpec(iSpec) / 2. * BoltzmannConst*TEqui*LOG(iRan) + ! Sum up new rotational energy per species NewEnRot(iSpec) = NewEnRot(iSpec) + PartStateIntEn( 2,iPart) * partWeight END DO END SUBROUTINE RelaxInnerEnergy + SUBROUTINE SampleFromTargetDistr(nRelax, iPartIndx_NodeRelax, Prandtl, u2, u0ij, u2i, vBulkAll, CellTemp, vBulk) !=================================================================================================================================== !> Sample new particle velocities from the target distribution function, depending on the chosen model @@ -829,11 +894,13 @@ SUBROUTINE SampleFromTargetDistr(nRelax, iPartIndx_NodeRelax, Prandtl, u2, u0ij, INTEGER :: iPart, fillMa1, fillMa2, INFO, iLoop, iSpec REAL :: iRanPart(3, nRelax), A(3,3), KronDelta, SMat(3,3), W(3), Work(100), tempVelo(3), partWeight !=================================================================================================================================== +! According to M. Pfeiffer, "Particle-based fluid dynamics: Comparison of different Bhatnagar-Gross-Krook models and the direct +! simulation Monte Carlo method for hypersonic flows", Phys. Fluids 30, 106106 (2018) IF (nRelax.GT.0) THEN SELECT CASE(BGKCollModel) - CASE (1) ! Ellipsoidal Statistical + CASE (1) ! Ellipsoidal Statistical BGK IF (ESBGKModel.EQ.1) THEN - !! Approximated Solution + ! Approximated solution DO fillMa1 =1, 3 DO fillMa2 =fillMa1, 3 IF (fillMa1.EQ.fillMa2) THEN @@ -841,6 +908,7 @@ SUBROUTINE SampleFromTargetDistr(nRelax, iPartIndx_NodeRelax, Prandtl, u2, u0ij, ELSE KronDelta = 0.0 END IF + ! Fill symmetric transformation matrix SMat with anisotopic matrix A = SS SMat(fillMa1, fillMa2)= KronDelta - (1.-Prandtl)/(2.*Prandtl) & *(3./u2*u0ij(fillMa1, fillMa2)-KronDelta) END DO @@ -848,9 +916,9 @@ SUBROUTINE SampleFromTargetDistr(nRelax, iPartIndx_NodeRelax, Prandtl, u2, u0ij, SMat(2,1)=SMat(1,2) SMat(3,1)=SMat(1,3) SMat(3,2)=SMat(2,3) + ! Generate random normals for the sampling of new velocities of all relaxing particles CALL BGK_BuildTransGaussNums(nRelax, iRanPart) ELSE - !! Exact Solution DO fillMa1 =1, 3 DO fillMa2 =fillMa1, 3 IF (fillMa1.EQ.fillMa2) THEN @@ -858,18 +926,19 @@ SUBROUTINE SampleFromTargetDistr(nRelax, iPartIndx_NodeRelax, Prandtl, u2, u0ij, ELSE KronDelta = 0.0 END IF + ! Fill anisotopic matrix A A(fillMa1, fillMa2) = KronDelta - (1.-Prandtl)/Prandtl*(3.*u0ij(fillMa1, fillMa2)/u2 - KronDelta) END DO END DO IF (ESBGKModel.EQ.2) THEN + ! Exact solution + ! Compute eigenvalues and eigenvectors of matrix A --> output: W is the array that contains the eigenvalues, A then contains + ! the orthonormal eigenvectors of anisotropic matrix A CALL DSYEV('V','U',3,A,3,W,Work,100,INFO) SMat = 0.0 - IF (W(1).LT.0.0) THEN - W(1) = 0.0 - IF (W(2).LT.0) W(2) = 0.0 - END IF - IF (W(3).LT.0) THEN - W(3) = 0.0 + IF (W(3).LT.0.0) THEN + ! Due to ascending order of eigenvalues, all three eigenvalues are lower than zero here + ! Same calculation as for approximate solution (ESBGKModel.EQ.1) DO fillMa1 =1, 3 DO fillMa2 =fillMa1, 3 IF (fillMa1.EQ.fillMa2) THEN @@ -885,36 +954,58 @@ SUBROUTINE SampleFromTargetDistr(nRelax, iPartIndx_NodeRelax, Prandtl, u2, u0ij, SMat(3,1)=SMat(1,3) SMat(3,2)=SMat(2,3) ELSE + ! At least W(3) is not negative + ! Set negative eigenvalues to zero + IF (W(1).LT.0.0) THEN + W(1) = 0.0 + IF (W(2).LT.0.0) W(2) = 0.0 + END IF + ! SMat with square roots of the eigenvalues as diagonal elements SMat(1,1) = SQRT(W(1)) SMat(2,2) = SQRT(W(2)) SMat(3,3) = SQRT(W(3)) + ! Diagonalisation of anisotropic matrix, SMat is square root of anisotropic matrix SMat = MATMUL(A, SMat) SMat = MATMUL(SMat, TRANSPOSE(A)) END IF + ! Generate random normals for the sampling of new velocities of all relaxing particles CALL BGK_BuildTransGaussNums(nRelax, iRanPart) ELSE IF (ESBGKModel.EQ.3) THEN + ! Metropolis-Hastings A(2,1)=A(1,2) A(3,1)=A(1,3) A(3,2)=A(2,3) CALL MetropolisES(nRelax, iRanPart, A) END IF END IF - CASE (2) ! Shakov + + CASE (2) ! Shakov BGK ! CALL MetropolisShakhov(nRelax, iRanPart, u2/3., u2i, Prandtl) + ! Acceptance-rejection method CALL ARShakhov(nRelax, iRanPart, u2/3., u2i, Prandtl) + CASE (3) ! Standard BGK (Maxwell target distribution) + ! Generate random normals for the sampling of new velocities of all relaxing particles CALL BGK_BuildTransGaussNums(nRelax, iRanPart) END SELECT + + ! Loop over all particles undergoing a relaxation towards the target distribution function DO iLoop = 1, nRelax iPart = iPartIndx_NodeRelax(iLoop) iSpec = PartSpecies(iPart) + ! Calculation of new velocities of all particles IF ((BGKCollModel.EQ.1).AND.(ESBGKModel.NE.3)) THEN + ! Transformation of normalized thermal velocity vector tempVelo (sampled from a Maxwellian distribution) to a thermal velocity + ! vector sampled from the ESBGK target distribution function (anisotropic Gaussian distribution) tempVelo(1:3) = SQRT(BoltzmannConst*CellTemp/Species(iSpec)%MassIC)*iRanPart(1:3,iLoop) PartState(4:6,iPart) = vBulkAll(1:3) + MATMUL(SMat,tempVelo) ELSE + ! New thermal velocity of particles is sqrt(k_B*T/m) multiplied by normal distributed random vector PartState(4:6,iPart) = vBulkAll(1:3) + SQRT(BoltzmannConst*CellTemp/Species(iSpec)%MassIC)*iRanPart(1:3,iLoop) END IF partWeight = GetParticleWeight(iPart) + ! Sum up new velocities of relaxing particles for bulk velocity, velocities of non-relaxing particles already calculated in + ! subroutine DetermineRelaxPart vBulk(1:3) = vBulk(1:3) + PartState(4:6,iPart)*Species(iSpec)%MassIC*partWeight END DO END IF ! nRelax.GT.0 @@ -947,12 +1038,17 @@ SUBROUTINE EnergyConsVib(nPart, nVibRelax, nVibRelaxSpec, iPartIndx_NodeRelaxVib INTEGER :: iPart, iLoop, iDOF, iSpec, iQuant, iQuaMax, iPolyatMole REAL :: alpha(nSpecies), partWeight, betaV, iRan, MaxColQua, Xi_VibTotal !=================================================================================================================================== +! According to M. Pfeiffer, "Extending the particle ellipsoidal statistical Bhatnagar-Gross-Krook method to diatomic molecules +! including quantized vibrational energies", Phys. Fluids 30, 116103 (2018) IF(BGKDoVibRelaxation) THEN + ! Vibrational energy is positive for at least one species + there are vibrational relaxations IF (ANY(NewEnVib.GT.0.0).AND.(nVibRelax.GT.0)) THEN Xi_VibTotal = 0.0 + ! Total number of relaxing vibrational degrees of freedom DO iSpec = 1, nSpecies Xi_VibTotal = Xi_VibTotal + Xi_VibSpec(iSpec)*nVibRelaxSpec(iSpec) END DO + ! Calculate scaling factor alpha per species DO iSpec = 1, nSpecies IF (NewEnVib(iSpec).GT.0.0) THEN alpha(iSpec) = OldEn/NewEnVib(iSpec)*(Xi_VibSpec(iSpec)*nVibRelaxSpec(iSpec)/(3.*(nPart-1.)+Xi_VibTotal)) @@ -960,61 +1056,85 @@ SUBROUTINE EnergyConsVib(nPart, nVibRelax, nVibRelaxSpec, iPartIndx_NodeRelaxVib alpha(iSpec) = 0. END IF END DO + ! Quantized vibrational energy IF (BGKUseQuantVibEn) THEN DO iLoop = 1, nVibRelax iPart = iPartIndx_NodeRelaxVib(iLoop) partWeight = GetParticleWeight(iPart) iSpec = PartSpecies(iPart) - IF(SpecDSMC(iSpec)%PolyatomicMol) THEN ! TBC, noch nicht mit verschiedenen alpha pro Spezies + ! Polyatomic ------------------------------------ TBC, noch nicht mit verschiedenen alpha pro Spezies + IF(SpecDSMC(iSpec)%PolyatomicMol) THEN PartStateIntEn(1,iPart) = 0.0 iPolyatMole = SpecDSMC(iSpec)%SpecToPolyArray + ! Loop over all vibrational DOF DO iDOF = 1, PolyatomMolDSMC(iPolyatMole)%VibDOF + ! Energy per vibrational mode alpha*VibEnergyDOF is reformulated to a quantum number iQuant betaV = alpha(iSpec)*VibEnergyDOF(iLoop,iDOF)/(PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)*BoltzmannConst) CALL RANDOM_NUMBER(iRan) iQuant = INT(betaV+iRan) + ! Check maximum vibrational quantum number IF(iQuant.GT.PolyatomMolDSMC(iPolyatMole)%MaxVibQuantDOF(iDOF)) iQuant=PolyatomMolDSMC(iPolyatMole)%MaxVibQuantDOF(iDOF) + ! Remaining energy negative, new quantum number needs to be calculated IF ((OldEn - iQuant*PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)*BoltzmannConst*partWeight).LT.0.0) THEN + ! Maximum quantum number MaxColQua = OldEn/(BoltzmannConst*PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)*partWeight) + ! OldEn < k_B*CharaTVibDOF --> iQuant < 1 IF (INT(MaxColQua).EQ.0) THEN iQuant = 0 ELSE CALL RANDOM_NUMBER(iRan) + ! Calculation of new iQuant iQuant = INT(-LOG(iRan)*TEqui/PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)) + ! Determine maximum quantum number iQuaMax = MIN(INT(MaxColQua)+1, PolyatomMolDSMC(iPolyatMole)%MaxVibQuantDOF(iDOF)) + ! Calculation of new iQuant as long as iQuant > maximum quantum number DO WHILE (iQuant.GE.iQuaMax) CALL RANDOM_NUMBER(iRan) iQuant = INT(-LOG(iRan)*TEqui/PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)) END DO END IF END IF + ! Sup up the vibrational energy over all vibrational DOF PartStateIntEn( 1,iPart) = PartStateIntEn( 1,iPart) & + iQuant*PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)*BoltzmannConst VibQuantsPar(iPart)%Quants(iDOF) = iQuant + ! Remaining OldEn for remaining particles OldEn = OldEn - iQuant*PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)*BoltzmannConst*partWeight END DO + ! Add zero-point energy PartStateIntEn( 1,iPart) = PartStateIntEn( 1,iPart) & + SpecDSMC(iSpec)%EZeroPoint ELSE ! Diatomic molecules + ! Vibrational energy is reformulated to a quantum number iQuant betaV = alpha(iSpec)*PartStateIntEn( 1,iPart)/(SpecDSMC(iSpec)%CharaTVib*BoltzmannConst) CALL RANDOM_NUMBER(iRan) iQuant = INT(betaV+iRan) + ! Check maximum vibrational quantum number IF (iQuant.GT.SpecDSMC(iSpec)%MaxVibQuant) iQuant = SpecDSMC(iSpec)%MaxVibQuant PartStateIntEn( 1,iPart) = (iQuant + DSMC%GammaQuant)*SpecDSMC(iSpec)%CharaTVib*BoltzmannConst + ! Remaining energy negative, new quantum number needs to be calculated IF ((OldEn - (PartStateIntEn( 1,iPart) - SpecDSMC(iSpec)%EZeroPoint)*partWeight).LT.0.0) THEN + ! Maximum quantum number MaxColQua = OldEn/(BoltzmannConst*SpecDSMC(iSpec)%CharaTVib*partWeight) + ! OldEn < k_B*CharaTVib --> iQuant < 1 IF (INT(MaxColQua).EQ.0) THEN iQuant = 0 ELSE CALL RANDOM_NUMBER(iRan) + ! Calculation of new iQuant iQuant = INT(-LOG(iRan)*TEqui/SpecDSMC(iSpec)%CharaTVib) + ! Determine maximum quantum number iQuaMax = MIN(INT(MaxColQua)+1, SpecDSMC(iSpec)%MaxVibQuant) + ! Calculation of new iQuant as long as iQuant > maximum quantum number DO WHILE (iQuant.GE.iQuaMax) CALL RANDOM_NUMBER(iRan) iQuant = INT(-LOG(iRan)*TEqui/SpecDSMC(iSpec)%CharaTVib) END DO END IF + ! Calculate vibrational energy including zero-point energy PartStateIntEn( 1,iPart) = (iQuant + DSMC%GammaQuant)*SpecDSMC(iSpec)%CharaTVib*BoltzmannConst END IF + ! Remaining OldEn for remaining particles OldEn = OldEn - (PartStateIntEn( 1,iPart) - SpecDSMC(iSpec)%EZeroPoint)*partWeight END IF ! SpecDSMC(1)%PolyatomicMol END DO @@ -1023,11 +1143,15 @@ SUBROUTINE EnergyConsVib(nPart, nVibRelax, nVibRelaxSpec, iPartIndx_NodeRelaxVib iPart = iPartIndx_NodeRelaxVib(iLoop) iSpec = PartSpecies(iPart) partWeight = GetParticleWeight(iPart) + ! Scaling of vibrational energy with factor alpha + zero-point energy PartStateIntEn( 1,iPart) = alpha(iSpec)*PartStateIntEn( 1,iPart) + SpecDSMC(iSpec)%EZeroPoint + ! Remaining OldEn for remaining particles OldEn = OldEn - (PartStateIntEn( 1,iPart) - SpecDSMC(iSpec)%EZeroPoint)*partWeight END DO END IF ! BGKUseQuantVibEn - ELSE IF (nVibRelax.GT.0) THEN ! Relaxation towards the vibrational ground-state (new state is simply the zero-point energy) + ! NewEnVib = 0 for all species, relaxation towards the vibrational ground-state (new state is simply the zero-point energy) + ELSE IF (nVibRelax.GT.0) THEN + ! Set zero-point energy as vibrational energy for all particles with vibrational relaxation DO iLoop = 1, nVibRelax iPart = iPartIndx_NodeRelaxVib(iLoop) iSpec = PartSpecies(iPart) @@ -1038,6 +1162,7 @@ SUBROUTINE EnergyConsVib(nPart, nVibRelax, nVibRelaxSpec, iPartIndx_NodeRelaxVib END SUBROUTINE EnergyConsVib + #ifdef WIP SUBROUTINE ARGrads13(nPart, iRanPart, Vtherm, HeatVec, PressTens) !=================================================================================================================================== @@ -1112,6 +1237,7 @@ SUBROUTINE ARGrads13(nPart, iRanPart, Vtherm, HeatVec, PressTens) END SUBROUTINE ARGrads13 + SUBROUTINE ARChapEnsk(nPart, iRanPart, Vtherm, HeatVec, PressTens) !=================================================================================================================================== !> description @@ -1172,9 +1298,10 @@ SUBROUTINE ARChapEnsk(nPart, iRanPart, Vtherm, HeatVec, PressTens) END SUBROUTINE ARChapEnsk #endif /*WIP*/ + SUBROUTINE MetropolisES(nPart, iRanPart, A) !=================================================================================================================================== -!> description +!> Sampling from ESBGK target distribution function by using a Metropolis-Hastings method !=================================================================================================================================== ! MODULES USE Ziggurat @@ -1195,15 +1322,18 @@ SUBROUTINE MetropolisES(nPart, iRanPart, A) LOGICAL :: Changed REAL :: AC(3), AInvers(3,3), detA !=================================================================================================================================== +! Generate normal distributed random vector as start vector for the thermal velocity iRanPart(1,1) = rnor() iRanPart(2,1) = rnor() iRanPart(3,1) = rnor() +! Inverse matrix of A CALL INV33(A,AInvers, detA) AC(1:3) = MATMUL(AInvers, iRanPart(1:3,1)) V2 = iRanPart(1,1)*AC(1) + iRanPart(2,1)*AC(2) + iRanPart(3,1)*AC(3) OldProb = EXP(-0.5*V2) -!Burn in -DO iLoop = 1, 35 !50 +! Burn-in phase, 35 initial steps +DO iLoop = 1, 35 + ! Generate normal distributed random vector for the thermal velocity iRanPartTemp(1) = rnor() iRanPartTemp(2) = rnor() iRanPartTemp(3) = rnor() @@ -1212,20 +1342,24 @@ SUBROUTINE MetropolisES(nPart, iRanPart, A) NewProb = EXP(-0.5*V2) NormProb = MIN(1.,NewProb/OldProb) CALL RANDOM_NUMBER(iRan) + ! Acceptance of new sample with probability NormProb IF (NormProb.GT.iRan) THEN iRanPart(1:3,1) = iRanPartTemp(1:3) OldProb = NewProb END IF END DO -! All the others +! Main phase, for all following particles DO iPart = 2, nPart + ! Normal distributed random vector from previous particle iRanPart(1,iPart) = iRanPart(1,iPart-1) iRanPart(2,iPart) = iRanPart(2,iPart-1) iRanPart(3,iPart) = iRanPart(3,iPart-1) iRun = 0 Changed = .FALSE. + ! For acception: velocity should be changed at least once and at least ten steps in the Markov chain should be taken DO WHILE ((iRun.LT.10).OR.(.NOT.Changed)) iRun = iRun + 1 + ! Generate normal distributed random vector for the thermal velocity iRanPartTemp(1) = rnor() iRanPartTemp(2) = rnor() iRanPartTemp(3) = rnor() @@ -1234,8 +1368,9 @@ SUBROUTINE MetropolisES(nPart, iRanPart, A) NewProb = EXP(-0.5*V2) NormProb = MIN(1.,NewProb/OldProb) CALL RANDOM_NUMBER(iRan) + ! Acceptance of new sample with probability NormProb, velocity is changed IF (NormProb.GT.iRan) THEN - Changed = .TRUE. + Changed = .TRUE. iRanPart(1:3,iPart) = iRanPartTemp(1:3) OldProb = NewProb END IF @@ -1244,9 +1379,10 @@ SUBROUTINE MetropolisES(nPart, iRanPart, A) END SUBROUTINE MetropolisES + SUBROUTINE ARShakhov(nPart, iRanPart, Vtherm, HeatVec, Prandtl) !=================================================================================================================================== -!> description +!> Acceptance-rejection method for sampling from the Shakhov distribution function !=================================================================================================================================== ! MODULES USE Ziggurat @@ -1264,33 +1400,38 @@ SUBROUTINE ARShakhov(nPart, iRanPart, Vtherm, HeatVec, Prandtl) REAL :: Vheat, V2, iRan, OldProb, Envelope INTEGER :: iPart !=================================================================================================================================== +! Calculate envelope function Envelope = MAX(ABS(HeatVec(1)),ABS(HeatVec(2)),ABS(HeatVec(3)))/Vtherm**(3./2.) Envelope = 1.+4.*Envelope +! Loop over all relaxing particles DO iPart = 1, nPart + ! Generate random normals iRanPart(1,iPart) = rnor() iRanPart(2,iPart) = rnor() iRanPart(3,iPart) = rnor() V2 = iRanPart(1,iPart)*iRanPart(1,iPart) + iRanPart(2,iPart)*iRanPart(2,iPart) + iRanPart(3,iPart)*iRanPart(3,iPart) Vheat = iRanPart(1,iPart)*HeatVec(1) + iRanPart(2,iPart)*HeatVec(2) + iRanPart(3,iPart)*HeatVec(3) - OldProb = (1. + (1.-Prandtl)*VHeat/(5.*Vtherm**(3./2.))*(V2/2.-5./2.)) + OldProb = (1. + (1.-Prandtl)*Vheat/(5.*Vtherm**(3./2.))*(V2/2.-5./2.)) CALL RANDOM_NUMBER(iRan) + ! Acception if Envelope*iRan < OldProb DO WHILE (Envelope*iRan.GT.OldProb) iRanPart(1,iPart) = rnor() iRanPart(2,iPart) = rnor() iRanPart(3,iPart) = rnor() V2 = iRanPart(1,iPart)*iRanPart(1,iPart) + iRanPart(2,iPart)*iRanPart(2,iPart) + iRanPart(3,iPart)*iRanPart(3,iPart) Vheat = iRanPart(1,iPart)*HeatVec(1) + iRanPart(2,iPart)*HeatVec(2) + iRanPart(3,iPart)*HeatVec(3) - OldProb = (1. + (1.-Prandtl)*VHeat/(5.*Vtherm**(3./2.))*(V2/2.-5./2.)) + OldProb = (1. + (1.-Prandtl)*Vheat/(5.*Vtherm**(3./2.))*(V2/2.-5./2.)) CALL RANDOM_NUMBER(iRan) END DO END DO END SUBROUTINE ARShakhov + SUBROUTINE BGK_BuildTransGaussNums(nPart, iRanPart) !=================================================================================================================================== -!> description +!> Generate normal distributed random vector for sampling of new velocities of all relaxing particles relaxing !=================================================================================================================================== ! MODULES USE Ziggurat @@ -1306,6 +1447,7 @@ SUBROUTINE BGK_BuildTransGaussNums(nPart, iRanPart) ! LOCAL VARIABLES INTEGER :: iLoop !=================================================================================================================================== +! Generate three normal distributed random values for all relaxing simulation particles DO iLoop = 1, nPart iRanPart(1,iLoop) = rnor() iRanPart(2,iLoop) = rnor() @@ -1314,10 +1456,11 @@ SUBROUTINE BGK_BuildTransGaussNums(nPart, iRanPart) END SUBROUTINE BGK_BuildTransGaussNums + SUBROUTINE CalcTEqui(nPart, CellTemp, TRot, TVib, Xi_Vib, Xi_Vib_old, RotExp, VibExp, & TEqui, rotrelaxfreq, vibrelaxfreq, dtCell, DoVibRelaxIn) !=================================================================================================================================== -! Calculation of the vibrational temperature (zero-point search) for polyatomic molecules +! Calculation of the vibrational temperature (zero-point search) for non-polyatomic molecules for Fokker-Planck !=================================================================================================================================== ! MODULES USE MOD_DSMC_Vars, ONLY: SpecDSMC @@ -1418,10 +1561,11 @@ SUBROUTINE CalcTEqui(nPart, CellTemp, TRot, TVib, Xi_Vib, Xi_Vib_old, RotExp, Vi END SUBROUTINE CalcTEqui + SUBROUTINE CalcTEquiMulti(nPart, nSpec, CellTemp, TRotSpec, TVibSpec, Xi_VibSpec, Xi_Vib_oldSpec, RotExpSpec, VibExpSpec, & TEqui, rotrelaxfreqSpec, vibrelaxfreqSpec, dtCell, DoVibRelaxIn) !=================================================================================================================================== -! Calculation of the vibrational temperature (zero-point search) for polyatomic molecules +! Calculation of the vibrational temperature (zero-point search) for diatomic molecule mixtures !=================================================================================================================================== ! MODULES USE MOD_DSMC_Vars, ONLY: SpecDSMC @@ -1461,10 +1605,16 @@ SUBROUTINE CalcTEquiMulti(nPart, nSpec, CellTemp, TRotSpec, TVibSpec, Xi_VibSpec correctFacRot = 1. RotFracSpec = 0.0 VibFracSpec = 0.0 + +! Loop over all molecular species --> only internal energies are relevant here DO iSpec=1, nSpecies IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN + ! Calculate number of rotational relaxing molecules with number of molecules * probability of relaxation + ! P = 1 - exp(-nu*dt) with relaxation frequency nu and timestep dt RotExpSpec(iSpec) = exp(-rotrelaxfreqSpec(iSpec)*dtCell/correctFacRot) RotFracSpec(iSpec) = nSpec(iSpec)*(1.-RotExpSpec(iSpec)) + ! Calculate number of vibrational relaxing molecules if enabled with number of molecules * probability of relaxation + ! P = 1 - exp(-nu*dt) with relaxation frequency nu and timestep dt IF(DoVibRelax) THEN VibExpSpec(iSpec) = exp(-vibrelaxfreqSpec(iSpec)*dtCell/correctFac) VibFracSpec(iSpec) = nSpec(iSpec)*(1.-VibExpSpec(iSpec)) @@ -1476,8 +1626,12 @@ SUBROUTINE CalcTEquiMulti(nPart, nSpec, CellTemp, TRotSpec, TVibSpec, Xi_VibSpec END IF END DO TEqui_Old = 0.0 +! Calculation of equilibrium temperature +! M. Pfeiffer, "Extending the particle ellipsoidal statistical Bhatnagar-Gross-Krook method to diatomic molecules including +! quantized vibrational energies", Phys. Fluids 30, 116103 (2018), Eq. 25 TEqui = 3.*(nPart-1.)*CellTemp TEquiNumDof = 3.*(nPart-1.) +! Sum up over all species DO iSpec=1, nSpecies IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN TEqui = TEqui + 2.*RotFracSpec(iSpec)*TRotSpec(iSpec)+Xi_Vib_oldSpec(iSpec)*VibFracSpec(iSpec)*TVibSpec(iSpec) @@ -1485,50 +1639,71 @@ SUBROUTINE CalcTEquiMulti(nPart, nSpec, CellTemp, TRotSpec, TVibSpec, Xi_VibSpec END IF END DO TEqui = TEqui / TEquiNumDof +! Required condition of Landau-Teller relaxation not fulfilled --> relaxation probabilities of rotation and vibration are +! corrected with a parameter beta for rotation and vibration as suggested by Burt: +! J. Burt and I. Boyd, “Evaluation of a particle method for the ellipsoidal statistical Bhatnagar-Gross-Krook equation”, +! 44th AIAA Aerospace Sciences Meeting and Exhibit (AIAA, 2006), p. 989 +! Solving of equation system until accuracy eps_prec is reached DO WHILE ( ABS( TEqui - TEqui_Old ) .GT. eps_prec ) DO iSpec = 1, nSpecies IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN + ! if difference too small: beta is not taken into account IF (ABS(TRotSpec(iSpec)-TEqui).LT.1E-3) THEN RotExpSpec(iSpec) = exp(-rotrelaxfreqSpec(iSpec)*dtCell/correctFacRot) ELSE + ! betaR = beta*nu*dt (= correction parameter rotation * relaxation frequency * time step) betaR = ((TRotSpec(iSpec)-CellTemp)/(TRotSpec(iSpec)-TEqui))*rotrelaxfreqSpec(iSpec)*dtCell/correctFacRot + ! negative betaR would leed to negative relaxation probability! IF (-betaR.GT.0.0) THEN RotExpSpec(iSpec) = 0. + ! Check if the exponent is within the range of machine precision ELSE IF (CHECKEXP(betaR)) THEN RotExpSpec(iSpec) = exp(-betaR) ELSE RotExpSpec(iSpec) = 0. END IF END IF + ! new calculation of number of rotational relaxing molecules RotFracSpec(iSpec) = nSpec(iSpec)*(1.-RotExpSpec(iSpec)) + IF(DoVibRelax) THEN + ! if difference too small: beta is not taken into account IF (ABS(TVibSpec(iSpec)-TEqui).LT.1E-3) THEN VibExpSpec(iSpec) = exp(-vibrelaxfreqSpec(iSpec)*dtCell/correctFac) ELSE + ! betaV = beta*nu*dt (= correction parameter vibration * relaxation frequency * time step) betaV = ((TVibSpec(iSpec)-CellTemp)/(TVibSpec(iSpec)-TEqui))*vibrelaxfreqSpec(iSpec)*dtCell/correctFac + ! negative betaV would leed to negative relaxation probability! IF (-betaV.GT.0.0) THEN VibExpSpec(iSpec) = 0. + ! Check if the exponent is within the range of machine precision ELSE IF (CHECKEXP(betaV)) THEN VibExpSpec(iSpec) = exp(-betaV) ELSE VibExpSpec(iSpec) = 0. END IF END IF + ! new calculation of number of vibrational relaxing molecules + VibFracSpec(iSpec) = nSpec(iSpec)*(1.-VibExpSpec(iSpec)) + + ! new calculation of the vibrational degrees of freedom exparg = SpecDSMC(iSpec)%CharaTVib/TEqui + ! Check if the exponent is within the range of machine precision for calculation of vibrational degrees of freedom IF(CHECKEXP(exparg))THEN Xi_VibSpec(iSpec) = 2.*SpecDSMC(iSpec)%CharaTVib/TEqui/(EXP(exparg)-1.) ELSE Xi_VibSpec(iSpec) = 0.0 END IF ! CHECKEXP(exparg) - VibFracSpec(iSpec) = nSpec(iSpec)*(1.-VibExpSpec(iSpec)) END IF END IF END DO TEqui_Old = TEqui TEqui_Old2 = TEqui + ! new calculation of equilibrium temperature with new RotFracSpec, new VibFracSpec, new Xi_VibSpec(TEqui) in denominator TEqui = 3.*(nPart-1.)*CellTemp TEquiNumDof = 3.*(nPart-1.) + ! Sum up over all species DO iSpec=1, nSpecies IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN TEqui = TEqui + 2.*RotFracSpec(iSpec)*TRotSpec(iSpec)+Xi_Vib_oldSpec(iSpec)*VibFracSpec(iSpec)*TVibSpec(iSpec) @@ -1537,10 +1712,13 @@ SUBROUTINE CalcTEquiMulti(nPart, nSpec, CellTemp, TRotSpec, TVibSpec, Xi_VibSpec END DO TEqui = TEqui / TEquiNumDof IF(DoVibRelax) THEN + ! accuracy eps_prec not reached yet DO WHILE( ABS( TEqui - TEqui_Old2 ) .GT. eps_prec ) + ! mean value of old and new equilibrium temperature TEqui =(TEqui + TEqui_Old2)*0.5 DO iSpec=1, nSpecies IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN + ! new calculation of the vibrational degrees of freedom exparg = SpecDSMC(iSpec)%CharaTVib/TEqui IF(CHECKEXP(exparg))THEN Xi_VibSpec(iSpec) = 2.*SpecDSMC(iSpec)%CharaTVib/TEqui/(EXP(exparg)-1.) @@ -1549,9 +1727,11 @@ SUBROUTINE CalcTEquiMulti(nPart, nSpec, CellTemp, TRotSpec, TVibSpec, Xi_VibSpec END IF ! CHECKEXP(exparg) END IF END DO + ! new calculation of equilibrium temperature with corrected vibrational degrees of freedom in denominator TEqui_Old2 = TEqui TEqui = 3.*(nPart-1.)*CellTemp TEquiNumDof = 3.*(nPart-1.) + ! Sum up over all species DO iSpec=1, nSpecies IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN TEqui = TEqui + 2.*RotFracSpec(iSpec)*TRotSpec(iSpec)+Xi_Vib_oldSpec(iSpec)*VibFracSpec(iSpec)*TVibSpec(iSpec) @@ -1565,7 +1745,6 @@ SUBROUTINE CalcTEquiMulti(nPart, nSpec, CellTemp, TRotSpec, TVibSpec, Xi_VibSpec END SUBROUTINE CalcTEquiMulti - SUBROUTINE CalcTEquiPoly(nPart, CellTemp, TRot, TVib, nXiVibDOF, Xi_Vib_DOF, Xi_Vib_old, RotExp, VibExp, TEqui, rotrelaxfreq, vibrelaxfreq, & dtCell, DoVibRelaxIn) !=================================================================================================================================== @@ -1600,8 +1779,10 @@ SUBROUTINE CalcTEquiPoly(nPart, CellTemp, TRot, TVib, nXiVibDOF, Xi_Vib_DOF, Xi_ DoVibRelax = BGKDoVibRelaxation END IF +! rotational degrees of freedom of polyatomic molecule Xi_Rot = SpecDSMC(1)%Xi_Rot iPolyatMole = SpecDSMC(1)%SpecToPolyArray + ! Xi_rel = 2.*(2. - CollInf%omega(1,1)) ! correctFac = 0.0 ! DO iDOF = 1, PolyatomMolDSMC(iPolyatMole)%VibDOF @@ -1615,8 +1796,13 @@ SUBROUTINE CalcTEquiPoly(nPart, CellTemp, TRot, TVib, nXiVibDOF, Xi_Vib_DOF, Xi_ correctFac = 1. correctFacRot = 1. + +! Calculate number of rotational relaxing molecules with number of molecules * probability of relaxation +! P = 1 - exp(-nu*dt) with relaxation frequency nu and timestep dt RotExp = exp(-rotrelaxfreq*dtCell/correctFacRot) RotFrac = nPart*(1.-RotExp) +! Calculate number of vibrational relaxing molecules if enabled with number of molecules * probability of relaxation +! P = 1 - exp(-nu*dt) with relaxation frequency nu and timestep dt IF(DoVibRelax) THEN VibExp = exp(-vibrelaxfreq*dtCell/correctFac) VibFrac = nPart*(1.-VibExp) @@ -1626,36 +1812,59 @@ SUBROUTINE CalcTEquiPoly(nPart, CellTemp, TRot, TVib, nXiVibDOF, Xi_Vib_DOF, Xi_ Xi_vib_DOF = 0.0 END IF TEqui_Old = 0.0 +! M. Pfeiffer et. al., "Extension of Particle-based BGK Models to Polyatomic Species in Hypersonic Flow around a Flat-faced +! Cylinder", AIP Conference Proceedings 2132, 100001 (2019) +! Solving of equation system for TEqui and betaR and betaV TEqui = (3.*(nPart-1.)*CellTemp+2.*RotFrac*TRot+Xi_Vib_old*VibFrac*TVib)/(3.*(nPart-1.)+2.*RotFrac+Xi_Vib_old*VibFrac) +! Required condition of Landau-Teller relaxation not fulfilled --> relaxation probabilities of rotation and vibration are +! corrected with a parameter beta for rotation and vibration as suggested by Burt: +! J. Burt and I. Boyd, “Evaluation of a particle method for the ellipsoidal statistical Bhatnagar-Gross-Krook equation”, +! 44th AIAA Aerospace Sciences Meeting and Exhibit (AIAA, 2006), p. 989 +! Solving of equation system until accuracy eps_prec is reached DO WHILE ( ABS( TEqui - TEqui_Old ) .GT. eps_prec ) + ! if difference too small: beta is not taken into account IF (ABS(TRot-TEqui).LT.1E-3) THEN RotExp = exp(-rotrelaxfreq*dtCell/correctFacRot) ELSE + ! betaR = beta*nu*dt (= correction parameter rotation * relaxation frequency * time step) betaR = ((TRot-CellTemp)/(TRot-TEqui))*rotrelaxfreq*dtCell/correctFacRot + ! negative betaR would leed to negative relaxation probability! IF (-betaR.GT.0.0) THEN RotExp = 0. + ! Check if the exponent is within the range of machine precision ELSE IF (CHECKEXP(betaR)) THEN RotExp = exp(-betaR) ELSE RotExp = 0. END IF END IF + ! new calculation of number of rotational relaxing molecules RotFrac = nPart*(1.-RotExp) + IF(DoVibRelax) THEN + ! if difference too small: beta is not taken into account IF (ABS(TVib-TEqui).LT.1E-3) THEN VibExp = exp(-vibrelaxfreq*dtCell/correctFac) ELSE + ! betaV = beta*nu*dt (= correction parameter vibration * relaxation frequency * time step) betaV = ((TVib-CellTemp)/(TVib-TEqui))*vibrelaxfreq*dtCell/correctFac + ! negative betaV would leed to negative relaxation probability! IF (-betaV.GT.0.0) THEN VibExp = 0. + ! Check if the exponent is within the range of machine precision ELSEIF(CHECKEXP(betaV))THEN VibExp = exp(-betaV) ELSE VibExp = 0. END IF END IF + ! new calculation of number of vibrational relaxing molecules + VibFrac = nPart*(1.-VibExp) + + ! Loop over all vibrational degrees of freedom to calculate them using TEqui DO iDOF = 1, PolyatomMolDSMC(iPolyatMole)%VibDOF exparg = PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)/TEqui + ! Check if the exponent is within the range of machine precision for calculation of vibrational degrees of freedom IF(CHECKEXP(exparg))THEN IF(exparg.gt.0.)THEN ! positive overflow: exp -> inf Xi_vib_DOF(iDOF) = 2.*exparg/(EXP(exparg)-1.) @@ -1666,17 +1875,22 @@ SUBROUTINE CalcTEquiPoly(nPart, CellTemp, TRot, TVib, nXiVibDOF, Xi_Vib_DOF, Xi_ Xi_vib_DOF(iDOF) = 0.0 END IF ! CHECKEXP(exparg) END DO - VibFrac = nPart*(1.-VibExp) END IF TEqui_Old = TEqui TEqui_Old2 = TEqui + + ! new calculation of equilibrium temperature with new RotFrac, new VibFrac new Xi_vib_DOF(TEqui) in denominator TEqui = (3.*(nPart-1.)*CellTemp+2.*RotFrac*TRot+Xi_Vib_old*VibFrac*TVib) & / (3.*(nPart-1.)+2.*RotFrac+SUM(Xi_vib_DOF(1:PolyatomMolDSMC(iPolyatMole)%VibDOF))*VibFrac) IF(DoVibRelax) THEN + ! accuracy eps_prec not reached yet DO WHILE( ABS( TEqui - TEqui_Old2 ) .GT. eps_prec ) + ! mean value of old and new equilibrium temperature TEqui =(TEqui + TEqui_Old2)*0.5 + ! Loop over all vibrational degrees of freedom DO iDOF = 1, PolyatomMolDSMC(iPolyatMole)%VibDOF exparg = PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)/TEqui + ! Check if the exponent is within the range of machine precision for calculation of vibrational degrees of freedom IF(CHECKEXP(exparg))THEN IF(exparg.gt.0.)THEN ! positive overflow: exp -> inf Xi_vib_DOF(iDOF) = 2.*exparg/(EXP(exparg)-1.) @@ -1688,6 +1902,7 @@ SUBROUTINE CalcTEquiPoly(nPart, CellTemp, TRot, TVib, nXiVibDOF, Xi_Vib_DOF, Xi_ END IF ! CHECKEXP(exparg) END DO TEqui_Old2 = TEqui + ! new calculation of equilibrium temperature with corrected vibrational degrees of freedom in denominator TEqui = (3.*(nPart-1.)*CellTemp+2.*RotFrac*TRot+Xi_Vib_old*VibFrac*TVib) & / (3.*(nPart-1.)+2.*RotFrac+SUM(Xi_vib_DOF(1:PolyatomMolDSMC(iPolyatMole)%VibDOF))*VibFrac) END DO @@ -1696,6 +1911,7 @@ SUBROUTINE CalcTEquiPoly(nPart, CellTemp, TRot, TVib, nXiVibDOF, Xi_Vib_DOF, Xi_ END SUBROUTINE CalcTEquiPoly + SUBROUTINE CalcViscosityThermalCondColIntVHS(CellTemp, Xi, dens, Xi_RotSpec, Xi_VibSpec, Visc, ThermalCond) !=================================================================================================================================== !> Determination of the mixture viscosity and thermal conductivity using collision integrals (derived for the Variable Hard @@ -1764,8 +1980,8 @@ SUBROUTINE CalcViscosityThermalCondColIntVHS(CellTemp, Xi, dens, Xi_RotSpec, Xi_ ! Calculation of collision integral Sigma_11 CALL CalcSigma_11VHS(CellTemp(nSpecies+1),InteractDiam,Mass,TVHS, omegaVHS, Sigma_11) ! Parameters for calculation of contribution of species to mixture transport coefficients - ! Pfeiffer et. al., Physics of Fluids 33, 036106 (2021), - ! "Multi-species modeling in the particle-based ellipsoidal statistical Bhatnagar-Gross-Krook method for monatomic gas species" + ! Pfeiffer et. al., Physics of Fluids 33, 036106 (2021), "Multi-species modeling in the particle-based ellipsoidal + ! statistical Bhatnagar-Gross-Krook method for monatomic gas species" B_12(iSpec,jSpec) = (5.*GAMMA(4.-omegaVHS)-GAMMA(5.-omegaVHS))/(5.*GAMMA(3.-omegaVHS)) B_12(jSpec,iSpec) = B_12(iSpec,jSpec) A_12(iSpec,jSpec) = Sigma_22 / (5.*Sigma_11) @@ -1881,6 +2097,7 @@ SUBROUTINE CalcSigma_11VHS(CellTemp,Dref,Mass,Tref, omegaVHS, Sigma_11) END SUBROUTINE CalcSigma_11VHS + REAL FUNCTION CalcSigma_22VHS(CellTemp,Dref,Mass,Tref, omegaVHS) !=================================================================================================================================== !> From ca162ecd2c7d49dec0670a9223c2970ac2841aac Mon Sep 17 00:00:00 2001 From: Franziska Hild Date: Wed, 1 Feb 2023 15:48:49 +0100 Subject: [PATCH 051/495] BGK CollOperator some more comments in code --- src/particles/bgk/bgk_colloperator.f90 | 163 +++---------------------- 1 file changed, 16 insertions(+), 147 deletions(-) diff --git a/src/particles/bgk/bgk_colloperator.f90 b/src/particles/bgk/bgk_colloperator.f90 index 948a30f77..26cd93e3a 100644 --- a/src/particles/bgk/bgk_colloperator.f90 +++ b/src/particles/bgk/bgk_colloperator.f90 @@ -176,6 +176,8 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume) ! Sum up collision frequencies of species i with itself and the other species ! S. Chapman and T.G. Cowling, "The mathematical Theory of Non-Uniform Gases", Cambridge University Press, 1970, S. 87f ! For SpecBGK(iSpec)%CollFreqPreFactor(jSpec) see bgk_init.f90 + ! VHS according to M. Pfeiffer, "Extending the particle ellipsoidal statistical Bhatnagar-Gross-Krook method to diatomic + ! molecules including quantized vibrational energies", Phys. Fluids 30, 116103 (2018), Eq. (18) collisionfreqSpec(iSpec) = collisionfreqSpec(iSpec) + SpecBGK(iSpec)%CollFreqPreFactor(jSpec) * totalWeightSpec(jSpec) & * (Dens / totalWeight) *CellTemptmp**(-CollInf%omega(iSpec,jSpec) +0.5) END DO @@ -384,8 +386,8 @@ SUBROUTINE CalcMoments(nPart, iPartIndx_Node, nSpec, vBulkAll, totalWeight, tota !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES INTEGER :: iLoop, iPart, iSpec, fillMa1, fillMa2 -REAL :: V_rel(1:3), vmag2, partWeight, EnerTotal, totalWeightSpec2(nSpecies), vBulkSpec(3,nSpecies) -REAL :: tempweight, tempweight2, tempmass, vBulkTemp(3), totalWeight2, totalWeight3 +REAL :: V_rel(1:3), vmag2, EnerTotal, ThermEner, totalWeightSpec2(nSpecies), vBulkSpec(3,nSpecies) +REAL :: partWeight, tempweight, tempweight2, tempmass, vBulkTemp(3), totalWeight2, totalWeight3 LOGICAL :: validSpec(nSpecies) !=================================================================================================================================== totalWeightSpec = 0.0; totalWeightSpec2=0.0; vBulkAll=0.0; TotalMass=0.0; vBulkSpec=0.0; nSpec=0; dtCell=0.0 @@ -441,7 +443,7 @@ SUBROUTINE CalcMoments(nPart, iPartIndx_Node, nSpec, vBulkAll, totalWeight, tota totalWeight3 = totalWeight3 + partWeight*partWeight*partWeight END IF - ! Sum up old energy of thermal velocities and sum up internal energies + ! Sum up old energy of thermal velocities and sum up internal energies --> E_T OldEn = OldEn + 0.5*Species(iSpec)%MassIC * vmag2*partWeight IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN IF(BGKDoVibRelaxation) THEN @@ -453,9 +455,11 @@ SUBROUTINE CalcMoments(nPart, iPartIndx_Node, nSpec, vBulkAll, totalWeight, tota END DO IF (BGKCollModel.EQ.1) THEN ! ESBGK + ! Pressure tensor u0ij = u0ij* totalWeight / (TotalMass*(totalWeight - totalWeight2/totalWeight)) END IF IF (BGKCollModel.EQ.2) THEN ! Shakhov + ! Heatflux u2i = u2i*totalWeight**3/(TotalMass*(totalWeight**3-3.*totalWeight*totalWeight2+2.*totalWeight3)) END IF @@ -469,7 +473,7 @@ SUBROUTINE CalcMoments(nPart, iPartIndx_Node, nSpec, vBulkAll, totalWeight, tota ! At least two particles and non-zero squared thermal velocity needed for a valid species IF ((nSpec(iSpec).GE.2).AND.(.NOT.ALMOSTZERO(u2Spec(iSpec)))) THEN validSpec = .TRUE. - ! Calculation of the species temperature + ! Calculation of the species temperature --> translational temperatures of the different species SpecTemp(iSpec) = Species(iSpec)%MassIC * u2Spec(iSpec) & /(3.0*BoltzmannConst*(totalWeightSpec(iSpec) - totalWeightSpec2(iSpec)/totalWeightSpec(iSpec))) ! Thermal energy @@ -485,11 +489,13 @@ SUBROUTINE CalcMoments(nPart, iPartIndx_Node, nSpec, vBulkAll, totalWeight, tota END DO IF (ANY(validSpec)) THEN vBulkTemp(1:3) = vBulkTemp(1:3) / tempmass + ! Squared bulk velocity of the mixture vmag2 = DOTPRODUCT(vBulkTemp(1:3)) ! EnerTotal = kinetic energy (tempmass / 2. * vmag2) + thermal energy (3. * tempweight * BoltzmannConst * CellTemp / 2) - EnerTotal = EnerTotal - tempmass / 2. * vmag2 - ! Calculation of the cell temperature from the thermal energy - CellTemp = 2. * EnerTotal / (3.*tempweight*BoltzmannConst) + ThermEner = EnerTotal - tempmass / 2. * vmag2 + ! Calculation of the cell temperature from the thermal energy --> translational temperature of the mixture + CellTemp = 2. * ThermEner / (3.*tempweight*BoltzmannConst) + ! Mean squared thermal velocity c^2 of a particle, calculated with the cell temperature and the density-averaged mass u2 = 3. * CellTemp * BoltzmannConst * (tempweight - tempweight2/tempweight) / tempmass ELSE ! only one part per species or cloned species with u2spec = 0 because PartState(4:6) = vBulkAll u2 = OldEn / (TotalMass*(1. - totalWeight2/totalWeight**2)) * 2. ! variance-free @@ -789,7 +795,7 @@ SUBROUTINE DetermineRelaxPart(nPart, iPartIndx_Node, relaxfreq, dtCell, RotExpSp nVibRelax = nVibRelax + 1 nVibRelaxSpec(iSpec) = nVibRelaxSpec(iSpec) + 1 iPartIndx_NodeRelaxVib(nVibRelax) = iPart - ! Sum up total vibrational energy, considering zero-point energy + ! Sum up total vibrational energy of all relaxing particles, considering zero-point energy, and add to translational energy OldEn = OldEn + (PartStateIntEn(1,iPartIndx_NodeRelaxVib(nVibRelax)) - SpecDSMC(iSpec)%EZeroPoint) * partWeight END IF END IF @@ -980,7 +986,6 @@ SUBROUTINE SampleFromTargetDistr(nRelax, iPartIndx_NodeRelax, Prandtl, u2, u0ij, END IF CASE (2) ! Shakov BGK -! CALL MetropolisShakhov(nRelax, iRanPart, u2/3., u2i, Prandtl) ! Acceptance-rejection method CALL ARShakhov(nRelax, iRanPart, u2/3., u2i, Prandtl) @@ -1000,7 +1005,7 @@ SUBROUTINE SampleFromTargetDistr(nRelax, iPartIndx_NodeRelax, Prandtl, u2, u0ij, tempVelo(1:3) = SQRT(BoltzmannConst*CellTemp/Species(iSpec)%MassIC)*iRanPart(1:3,iLoop) PartState(4:6,iPart) = vBulkAll(1:3) + MATMUL(SMat,tempVelo) ELSE - ! New thermal velocity of particles is sqrt(k_B*T/m) multiplied by normal distributed random vector + ! New thermal velocity (in x,y,z) of particle is sqrt(k_B*T/m) multiplied by normal distributed random vector PartState(4:6,iPart) = vBulkAll(1:3) + SQRT(BoltzmannConst*CellTemp/Species(iSpec)%MassIC)*iRanPart(1:3,iLoop) END IF partWeight = GetParticleWeight(iPart) @@ -1062,7 +1067,7 @@ SUBROUTINE EnergyConsVib(nPart, nVibRelax, nVibRelaxSpec, iPartIndx_NodeRelaxVib iPart = iPartIndx_NodeRelaxVib(iLoop) partWeight = GetParticleWeight(iPart) iSpec = PartSpecies(iPart) - ! Polyatomic ------------------------------------ TBC, noch nicht mit verschiedenen alpha pro Spezies + ! Polyatomic molecules IF(SpecDSMC(iSpec)%PolyatomicMol) THEN PartStateIntEn(1,iPart) = 0.0 iPolyatMole = SpecDSMC(iSpec)%SpecToPolyArray @@ -1163,142 +1168,6 @@ SUBROUTINE EnergyConsVib(nPart, nVibRelax, nVibRelaxSpec, iPartIndx_NodeRelaxVib END SUBROUTINE EnergyConsVib -#ifdef WIP -SUBROUTINE ARGrads13(nPart, iRanPart, Vtherm, HeatVec, PressTens) -!=================================================================================================================================== -!> description -!=================================================================================================================================== -! MODULES -USE Ziggurat -! IMPLICIT VARIABLE HANDLING -IMPLICIT NONE -!----------------------------------------------------------------------------------------------------------------------------------- -! INPUT VARIABLES -INTEGER, INTENT(IN) :: nPart -REAL, INTENT(IN) :: HeatVec(3), Vtherm, PressTens(3,3) -!----------------------------------------------------------------------------------------------------------------------------------- -! OUTPUT VARIABLES -REAL, INTENT(OUT) :: iRanPart(:,:) -!----------------------------------------------------------------------------------------------------------------------------------- -! LOCAL VARIABLES -REAL :: Vheat, V2, iRan, OldProb, Envelope, Envelope2, cMat, KronDelta -INTEGER :: iPart, fillMa1, fillMa2 -!=================================================================================================================================== -Envelope = MAX(ABS(HeatVec(1)),ABS(HeatVec(2)),ABS(HeatVec(3)))/Vtherm**(3./2.) -Envelope2 = MAX(ABS(PressTens(1,2)),ABS(PressTens(1,3)),ABS(PressTens(2,3)))/Vtherm -Envelope = 1.+3.*MAX(Envelope, Envelope2) - -DO iPart = 1, nPart - iRanPart(1,iPart) = rnor() - iRanPart(2,iPart) = rnor() - iRanPart(3,iPart) = rnor() - cMat = 0.0 - DO fillMa1 =1, 3 - DO fillMa2 =1, 3 - IF (fillMa1.EQ.fillMa2) THEN - KronDelta = 1.0 - ELSE - KronDelta = 0.0 - END IF - cMat = cMat + iRanPart(fillMa1,iPart)*iRanPart(fillMa2,iPart)*(PressTens(fillMa1,fillMa2)-KronDelta*Vtherm) - END DO - END DO -! cMat=cMat + iRanPart(1,iPart)*iRanPart(2,iPart)*PressTens(1,2) -! cMat=cMat + iRanPart(1,iPart)*iRanPart(3,iPart)*PressTens(1,3) -! cMat=cMat + iRanPart(2,iPart)*iRanPart(3,iPart)*PressTens(2,3) - V2 = iRanPart(1,iPart)*iRanPart(1,iPart) + iRanPart(2,iPart)*iRanPart(2,iPart) + iRanPart(3,iPart)*iRanPart(3,iPart) - Vheat = iRanPart(1,iPart)*HeatVec(1) + iRanPart(2,iPart)*HeatVec(2) + iRanPart(3,iPart)*HeatVec(3) - OldProb = (1. + cMat/(2.*Vtherm) + VHeat/(Vtherm**(3./2.))*(V2/5.-1.)) - CALL RANDOM_NUMBER(iRan) - DO WHILE (Envelope*iRan.GT.OldProb) - iRanPart(1,iPart) = rnor() - iRanPart(2,iPart) = rnor() - iRanPart(3,iPart) = rnor() - cMat = 0.0 - DO fillMa1 =1, 3 - DO fillMa2 =1, 3 - IF (fillMa1.EQ.fillMa2) THEN - KronDelta = 1.0 - ELSE - KronDelta = 0.0 - END IF - cMat = cMat + iRanPart(fillMa1,iPart)*iRanPart(fillMa2,iPart)*(PressTens(fillMa1,fillMa2)-KronDelta*Vtherm) - END DO - END DO -! cMat=cMat + iRanPart(1,iPart)*iRanPart(2,iPart)*PressTens(1,2) -! cMat=cMat + iRanPart(1,iPart)*iRanPart(3,iPart)*PressTens(1,3) -! cMat=cMat + iRanPart(2,iPart)*iRanPart(3,iPart)*PressTens(2,3) - V2 = iRanPart(1,iPart)*iRanPart(1,iPart) + iRanPart(2,iPart)*iRanPart(2,iPart) + iRanPart(3,iPart)*iRanPart(3,iPart) - Vheat = iRanPart(1,iPart)*HeatVec(1) + iRanPart(2,iPart)*HeatVec(2) + iRanPart(3,iPart)*HeatVec(3) - OldProb = (1. + cMat/(2.*Vtherm) + VHeat/(Vtherm**(3./2.))*(V2/5.-1.)) - CALL RANDOM_NUMBER(iRan) - END DO -END DO - -END SUBROUTINE ARGrads13 - - -SUBROUTINE ARChapEnsk(nPart, iRanPart, Vtherm, HeatVec, PressTens) -!=================================================================================================================================== -!> description -!=================================================================================================================================== -! MODULES -USE Ziggurat -! IMPLICIT VARIABLE HANDLING -IMPLICIT NONE -!----------------------------------------------------------------------------------------------------------------------------------- -! INPUT VARIABLES -INTEGER, INTENT(IN) :: nPart -REAL, INTENT(IN) :: HeatVec(3), Vtherm, PressTens(3,3) -!----------------------------------------------------------------------------------------------------------------------------------- -! OUTPUT VARIABLES -REAL, INTENT(OUT) :: iRanPart(:,:) -!----------------------------------------------------------------------------------------------------------------------------------- -! LOCAL VARIABLES -REAL :: Vheat, V2, iRan, OldProb, Envelope, Envelope2, cMat, cPress -INTEGER :: iPart -!=================================================================================================================================== -Envelope = MAX(ABS(HeatVec(1)),ABS(HeatVec(2)),ABS(HeatVec(3)))/Vtherm**(3./2.) -Envelope2 = MAX(ABS(PressTens(1,2)),ABS(PressTens(1,3)),ABS(PressTens(2,3)))/Vtherm -Envelope = 1.+4.*MAX(Envelope, Envelope2) - -DO iPart = 1, nPart - iRanPart(1,iPart) = rnor() - iRanPart(2,iPart) = rnor() - iRanPart(3,iPart) = rnor() - cMat = 0.0 - cPress = 0.0 - cMat=cMat + iRanPart(1,iPart)*iRanPart(2,iPart)*PressTens(1,2) - cMat=cMat + iRanPart(1,iPart)*iRanPart(3,iPart)*PressTens(1,3) - cMat=cMat + iRanPart(2,iPart)*iRanPart(3,iPart)*PressTens(2,3) - cPress=cPress + (PressTens(1,1)-Vtherm)*(iRanPart(1,iPart)*iRanPart(1,iPart)-iRanPart(3,iPart)*iRanPart(3,iPart)) - cPress=cPress + (PressTens(2,2)-Vtherm)*(iRanPart(2,iPart)*iRanPart(2,iPart)-iRanPart(3,iPart)*iRanPart(3,iPart)) - V2 = iRanPart(1,iPart)*iRanPart(1,iPart) + iRanPart(2,iPart)*iRanPart(2,iPart) + iRanPart(3,iPart)*iRanPart(3,iPart) - Vheat = iRanPart(1,iPart)*HeatVec(1) + iRanPart(2,iPart)*HeatVec(2) + iRanPart(3,iPart)*HeatVec(3) - OldProb = (1. + cMat/Vtherm + cPress/(2.*Vtherm) + VHeat/(2.*Vtherm**(3./2.))*(V2/5.-1.)) - CALL RANDOM_NUMBER(iRan) - DO WHILE (Envelope*iRan.GT.OldProb) - iRanPart(1,iPart) = rnor() - iRanPart(2,iPart) = rnor() - iRanPart(3,iPart) = rnor() - cMat = 0.0 - cPress = 0.0 - cMat=cMat + iRanPart(1,iPart)*iRanPart(2,iPart)*PressTens(1,2) - cMat=cMat + iRanPart(1,iPart)*iRanPart(3,iPart)*PressTens(1,3) - cMat=cMat + iRanPart(2,iPart)*iRanPart(3,iPart)*PressTens(2,3) - cPress=cPress + (PressTens(1,1)-Vtherm)*(iRanPart(1,iPart)*iRanPart(1,iPart)-iRanPart(3,iPart)*iRanPart(3,iPart)) - cPress=cPress + (PressTens(2,2)-Vtherm)*(iRanPart(2,iPart)*iRanPart(2,iPart)-iRanPart(3,iPart)*iRanPart(3,iPart)) - V2 = iRanPart(1,iPart)*iRanPart(1,iPart) + iRanPart(2,iPart)*iRanPart(2,iPart) + iRanPart(3,iPart)*iRanPart(3,iPart) - Vheat = iRanPart(1,iPart)*HeatVec(1) + iRanPart(2,iPart)*HeatVec(2) + iRanPart(3,iPart)*HeatVec(3) - OldProb = (1. + cMat/Vtherm + cPress/(2.*Vtherm) + VHeat/(2.*Vtherm**(3./2.))*(V2/5.-1.)) - CALL RANDOM_NUMBER(iRan) - END DO -END DO - -END SUBROUTINE ARChapEnsk -#endif /*WIP*/ - - SUBROUTINE MetropolisES(nPart, iRanPart, A) !=================================================================================================================================== !> Sampling from ESBGK target distribution function by using a Metropolis-Hastings method From 11e68592177b065b99973a25c09982a5bd2cda09 Mon Sep 17 00:00:00 2001 From: Julian Beyer Date: Tue, 7 Feb 2023 23:01:08 +0100 Subject: [PATCH 052/495] output binning to match units of measurement devices --- .../radiation_solver/radiation_init.f90 | 10 ++++ .../radiation_solver/radiation_vars.f90 | 2 + .../radiative_transfer/radtrans_init.f90 | 4 +- .../radiative_transfer/radtrans_output.f90 | 57 ++++++++++++++++--- 4 files changed, 63 insertions(+), 10 deletions(-) diff --git a/src/radiation/radiation_solver/radiation_init.f90 b/src/radiation/radiation_solver/radiation_init.f90 index 8455d605f..54493b00e 100644 --- a/src/radiation/radiation_solver/radiation_init.f90 +++ b/src/radiation/radiation_solver/radiation_init.f90 @@ -71,6 +71,7 @@ SUBROUTINE DefineParametersRadiation() CALL prms%CreateRealOption( 'Radiation-MaxWaveLen', 'Upper wavelength limit for radiation calculation','1000.0') CALL prms%CreateIntOption( 'Radiation-WaveLenDiscr', 'Number of discretization points', '10000') CALL prms%CreateIntOption( 'Radiation-WaveLenReductionFactor', 'Number of discretization points', '1') +CALL prms%CreateIntOption( 'Radiation-WaveLenReductionFactorOutput', 'Number of discretization points', '1') CALL prms%CreateIntOption( 'Radiation-RadType', 'Select radiation type:\n'//& '1: particle radiation\n'//& '2: black body radiation\n'//& @@ -168,6 +169,7 @@ SUBROUTINE InitRadiation() RadiationParameter%MaxWaveLen = RadiationParameter%MaxWaveLen*1.E-9 RadiationParameter%WaveLenDiscr = GETINT('Radiation-WaveLenDiscr') RadiationParameter%WaveLenReductionFactor = GETINT('Radiation-WaveLenReductionFactor') +RadiationParameter%WaveLenReductionFactorOutput = GETINT('Radiation-WaveLenReductionFactorOutput') IF((RadiationSwitches%RadType.EQ.3) .AND. (nGlobalElems.EQ.1)) RadiationParameter%WaveLenReductionFactor = 1 IF(RadiationSwitches%RadType.EQ.2) RadiationParameter%WaveLenReductionFactor = 1 IF (RadiationParameter%WaveLenReductionFactor.NE.1) THEN @@ -179,6 +181,13 @@ SUBROUTINE InitRadiation() ELSE RadiationParameter%WaveLenDiscrCoarse = RadiationParameter%WaveLenDiscr END IF +IF (RadiationParameter%WaveLenReductionFactorOutput.GT.1) THEN + RadiationParameter%WaveLenDiscrOutput = NINT(REAL(RadiationParameter%WaveLenDiscr)/ REAL(RadiationParameter%WaveLenReductionFactorOutput)) + RadiationParameter%WaveLenReductionFactorOutput = INT(RadiationParameter%WaveLenDiscr/RadiationParameter%WaveLenDiscrOutput) + SWRITE(UNIT_stdOut,'(A)') 'Corrected WaveLenReductionFactorOutput is ', RadiationParameter%WaveLenReductionFactorOutput +ELSE + RadiationParameter%WaveLenDiscrOutput = RadiationParameter%WaveLenDiscr +END IF IF(RadiationParameter%MinWaveLen.GE.RadiationParameter%MaxWaveLen) THEN CALL abort(& __STAMP__& @@ -372,6 +381,7 @@ SUBROUTINE MacroscopicRadiationInput() MacroRadInputParameters(CNElemID,iSpec,2) = MAX(0.,ElemData_HDF5(iVar+ 7,iElem)) !T_vib MacroRadInputParameters(CNElemID,iSpec,3) = MAX(0.,ElemData_HDF5(iVar+ 8,iElem)) !T_rot MacroRadInputParameters(CNElemID,iSpec,4) = MAX(0.,ElemData_HDF5(iVar+ 9,iElem)) !T_elec + !IF((iSpec.EQ.12) .OR. (iSpec.EQ.13)) MacroRadInputParameters(CNElemID,iSpec,4)=MacroRadInputParameters(CNElemID,iSpec,4)*1.1 !Fe Fe+ +-10percent MacroRadInputParameters(CNElemID,iSpec,5) = MAX(0.,ElemData_HDF5(iVar+11,iElem)) !T_mean END DO iVar = iVar + DSMC_NVARS diff --git a/src/radiation/radiation_solver/radiation_vars.f90 b/src/radiation/radiation_solver/radiation_vars.f90 index 812fd1b3d..ee88d62f7 100644 --- a/src/radiation/radiation_solver/radiation_vars.f90 +++ b/src/radiation/radiation_solver/radiation_vars.f90 @@ -47,6 +47,8 @@ MODULE MOD_Radiation_Vars REAL :: MaxWaveLen ! maximum spectral wavelength INTEGER :: WaveLenDiscr ! number of points in calculated spectrum INTEGER :: WaveLenDiscrCoarse ! number of points in calculated spectrum + INTEGER :: WaveLenDiscrOutput ! number of points in calculated spectrum + INTEGER :: WaveLenReductionFactorOutput ! number of points in calculated spectrum INTEGER :: WaveLenReductionFactor REAL :: WaveLenIncr ! wavelength increments REAL :: WaveLenIncrCoarse diff --git a/src/radiation/radiative_transfer/radtrans_init.f90 b/src/radiation/radiative_transfer/radtrans_init.f90 index 8c97b8645..378d49879 100644 --- a/src/radiation/radiative_transfer/radtrans_init.f90 +++ b/src/radiation/radiative_transfer/radtrans_init.f90 @@ -410,8 +410,8 @@ SUBROUTINE InitRadiationTransport() END IF CALL BARRIER_AND_SYNC(Radiation_Absorption_Spec_Shared_Win ,MPI_COMM_SHARED) IF (RadObservationPointMethod.EQ.2) CALL BARRIER_AND_SYNC(RadObservationPOI_Shared_Win ,MPI_COMM_SHARED) - print*, 'AHAAAA', SUM(RadObservationPOI(7,:)) - read* + !print*, 'AHAAAA', SUM(RadObservationPOI(7,:)) + !read* #endif RadTrans%GlobalRadiationPower = 0.0 RadTrans%ScaledGlobalRadiationPower = 0.0 diff --git a/src/radiation/radiative_transfer/radtrans_output.f90 b/src/radiation/radiative_transfer/radtrans_output.f90 index ce19a422f..bc76e0f06 100644 --- a/src/radiation/radiative_transfer/radtrans_output.f90 +++ b/src/radiation/radiative_transfer/radtrans_output.f90 @@ -68,7 +68,8 @@ SUBROUTINE WriteRadiationToHDF5() INTEGER :: nVal, iElem, nVar, iSpec, nVarCount, nVarSpec, CNElemID, iWave REAL, ALLOCATABLE :: TempOutput(:,:) CHARACTER(LEN=255), ALLOCATABLE :: StrVarNames(:) - REAL :: AbsTotal,tempSpecAbs + REAL :: AbsTotal,tempSpecAbs, tmpPartNum, tmpEmission(2) + INTEGER :: iWavetmp(2) !=================================================================================================================================== SWRITE(UNIT_stdOut,'(a)',ADVANCE='NO') ' WRITE Radiation TO HDF5 FILE...' FileString=TRIM(ProjectName)//'_RadiationState.h5' @@ -211,13 +212,33 @@ SUBROUTINE WriteRadiationToHDF5() WRITE(20,*) 'x,y1,y2,y3' IF (RadObservationPointMethod.EQ.1) THEN IF (RadiationParameter%WaveLenReductionFactor.NE.1) THEN - DO iWave=1, RadiationParameter%WaveLenDiscrCoarse + DO iWave=1, RadiationParameter%WaveLenDiscrCoarse WRITE(20,*) RadiationParameter%WaveLenCoarse(iWave)*1.E10,',',RadObservation_Emission(iWave)/RadObservationPoint%Area,',',RadObservation_EmissionPart(iWave),',',RadObservation_Emission_Conv(iWave)/RadObservationPoint%Area END DO ELSE - DO iWave=1, RadiationParameter%WaveLenDiscrCoarse - WRITE(20,*) RadiationParameter%WaveLen(iWave)*1.E10,',',RadObservation_Emission(iWave)/RadObservationPoint%Area,',',RadObservation_EmissionPart(iWave),',',RadObservation_Emission_Conv(iWave)/RadObservationPoint%Area - END DO + IF (RadiationParameter%WaveLenReductionFactorOutput.GT.1) THEN + tmpPartNum=0.; tmpEmission=0.; iWavetmp(1)=0; iWavetmp(2)=1 + DO iWave=1, RadiationParameter%WaveLenDiscrCoarse + IF (MOD(iWave,RadiationParameter%WaveLenReductionFactorOutput).EQ.0) THEN + iWavetmp(1) = iWavetmp(1) + 1 + tmpPartNum = tmpPartNum + RadObservation_EmissionPart(iWave) + tmpEmission(1) = tmpEmission(1) + RadObservation_Emission(iWave) + tmpEmission(2) = tmpEmission(2) + RadObservation_Emission_Conv(iWave) + WRITE(20,*) (RadiationParameter%WaveLen(iWavetmp(2))+RadiationParameter%WaveLen(iWavetmp(2)+iWavetmp(1)-1))/2.*1.E10,',',tmpEmission(1)/RadObservationPoint%Area,',',tmpPartNum,',',tmpEmission(2)/RadObservationPoint%Area + tmpPartNum = 0.; tmpEmission= 0. + iWavetmp(1)=0; iWavetmp(2)=iWave + ELSE + iWavetmp(1) = iWavetmp(1) + 1 + tmpPartNum = tmpPartNum + RadObservation_EmissionPart(iWave) + tmpEmission(1) = tmpEmission(1) + RadObservation_Emission(iWave) + tmpEmission(2) = tmpEmission(2) + RadObservation_Emission_Conv(iWave) + END IF + END DO + ELSE + DO iWave=1, RadiationParameter%WaveLenDiscrCoarse + WRITE(20,*) RadiationParameter%WaveLen(iWave)*1.E10,',',RadObservation_Emission(iWave)/RadObservationPoint%Area,',',RadObservation_EmissionPart(iWave),',',RadObservation_Emission_Conv(iWave)/RadObservationPoint%Area + END DO + END IF END IF ELSEIF (RadObservationPointMethod.EQ.2) THEN IF (RadiationParameter%WaveLenReductionFactor.NE.1) THEN @@ -225,9 +246,29 @@ SUBROUTINE WriteRadiationToHDF5() WRITE(20,*) RadiationParameter%WaveLenCoarse(iWave)*1.E10,',',RadObservation_Emission(iWave),',',RadObservation_EmissionPart(iWave),',',RadObservation_Emission_Conv(iWave) END DO ELSE - DO iWave=1, RadiationParameter%WaveLenDiscrCoarse - WRITE(20,*) RadiationParameter%WaveLen(iWave)*1.E10,',',RadObservation_Emission(iWave),',',RadObservation_EmissionPart(iWave),',',RadObservation_Emission_Conv(iWave) - END DO + IF (RadiationParameter%WaveLenReductionFactorOutput.GT.1) THEN + tmpPartNum=0.; tmpEmission=0.; iWavetmp(1)=0; iWavetmp(2)=1 + DO iWave=1, RadiationParameter%WaveLenDiscrCoarse + IF (MOD(iWave,RadiationParameter%WaveLenReductionFactorOutput).EQ.0) THEN + iWavetmp(1) = iWavetmp(1) + 1 + tmpPartNum = tmpPartNum + RadObservation_EmissionPart(iWave) + tmpEmission(1) = tmpEmission(1) + RadObservation_Emission(iWave) + tmpEmission(2) = tmpEmission(2) + RadObservation_Emission_Conv(iWave) + WRITE(20,*) (RadiationParameter%WaveLen(iWavetmp(2))+RadiationParameter%WaveLen(iWavetmp(2)+iWavetmp(1)-1))/2.*1.E10,',',tmpEmission(1),',',tmpPartNum,',',tmpEmission(2) + tmpPartNum = 0.; tmpEmission= 0. + iWavetmp(1)=0; iWavetmp(2)=iWave + ELSE + iWavetmp(1) = iWavetmp(1) + 1 + tmpPartNum = tmpPartNum + RadObservation_EmissionPart(iWave) + tmpEmission(1) = tmpEmission(1) + RadObservation_Emission(iWave) + tmpEmission(2) = tmpEmission(2) + RadObservation_Emission_Conv(iWave) + END IF + END DO + ELSE + DO iWave=1, RadiationParameter%WaveLenDiscrCoarse + WRITE(20,*) RadiationParameter%WaveLen(iWave)*1.E10,',',RadObservation_Emission(iWave),',',RadObservation_EmissionPart(iWave),',',RadObservation_Emission_Conv(iWave) + END DO + END IF END IF END IF CLOSE(unit=20) From d16466f67ed58bda9209e8b73c7876ed938eceb6 Mon Sep 17 00:00:00 2001 From: Franziska Hild Date: Wed, 1 Mar 2023 11:27:15 +0100 Subject: [PATCH 053/495] BGK colloperator comments --- src/particles/bgk/bgk_colloperator.f90 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/particles/bgk/bgk_colloperator.f90 b/src/particles/bgk/bgk_colloperator.f90 index 26cd93e3a..96c741c23 100644 --- a/src/particles/bgk/bgk_colloperator.f90 +++ b/src/particles/bgk/bgk_colloperator.f90 @@ -1867,7 +1867,7 @@ SUBROUTINE CalcViscosityThermalCondColIntVHS(CellTemp, Xi, dens, Xi_RotSpec, Xi_ END DO IF ((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN ! Calculation of thermal conductivity of rotation and vibration for each molecular species - ! S. Chapman and T.G. Cowling, "The mathematical Theory of Non-Uniform Gases", Cambridge University Press, 1970, S. 254 + ! S. Chapman and T.G. Cowling, "The mathematical Theory of Non-Uniform Gases", Cambridge University Press, 1970, S. 254f Xi_Dij_tot = SUM(Xj_Dij(iSpec,:)) rhoSpec = dens * Species(iSpec)%MassIC * Xi(iSpec) ThermalCondSpec_Rot(iSpec) = (rhoSpec*cv_rot/Xi_Dij_tot) @@ -1878,6 +1878,7 @@ SUBROUTINE CalcViscosityThermalCondColIntVHS(CellTemp, Xi, dens, Xi_RotSpec, Xi_ ! Calculate mixture viscosity by solving a system of linear equations with matrices ! Pfeiffer et. al., Physics of Fluids 33, 036106 (2021), ! "Multi-species modeling in the particle-based ellipsoidal statistical Bhatnagar-Gross-Krook method for monatomic gas species" +! S. Chapman and T.G. Cowling, "The mathematical Theory of Non-Uniform Gases", Cambridge University Press, 1970, S. 352 ViscMat = 0.0 DO iSpec = 1, nSpecies IF (Xi(iSpec).LE.0.0) THEN @@ -1907,6 +1908,7 @@ SUBROUTINE CalcViscosityThermalCondColIntVHS(CellTemp, Xi, dens, Xi_RotSpec, Xi_ ! Calculate mixture thermal conductivity by solving a system of linear equations with matrices ! Pfeiffer et. al., Physics of Fluids 33, 036106 (2021), ! "Multi-species modeling in the particle-based ellipsoidal statistical Bhatnagar-Gross-Krook method for monatomic gas species" +! S. Chapman and T.G. Cowling, "The mathematical Theory of Non-Uniform Gases", Cambridge University Press, 1970, S. 350f pressure = BoltzmannConst*dens*CellTemp(nSpecies+1) ViscMat = 0.0 DO iSpec = 1, nSpecies From eebc699276511d28f4c7998e52fca2ba529cfc13 Mon Sep 17 00:00:00 2001 From: Franziska Hild Date: Wed, 8 Mar 2023 15:45:18 +0100 Subject: [PATCH 054/495] BGK mixture fixed PrandtlCorrection for molecules with inner degrees of freedom --- src/particles/bgk/bgk_colloperator.f90 | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/particles/bgk/bgk_colloperator.f90 b/src/particles/bgk/bgk_colloperator.f90 index 96c741c23..dcfde8def 100644 --- a/src/particles/bgk/bgk_colloperator.f90 +++ b/src/particles/bgk/bgk_colloperator.f90 @@ -604,14 +604,16 @@ SUBROUTINE CalcGasProperties(nSpec, dens, InnerDOF, totalWeightSpec, totalWeight !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES INTEGER :: iSpec, jSpec, INFO -REAL :: MolarFraction(1:nSpecies), MassFraction(1:nSpecies), MassIC_Mixture +REAL :: MolarFraction(1:nSpecies), MassFraction(1:nSpecies), MassIC_Mixture, DOFFraction(1:nSpecies) REAL :: PrandtlCorrection, dynamicvisSpec(nSpecies), thermalcondSpec(nSpecies), Phi(nSpecies) -REAL :: C_P, nu, A(3,3), W(3), Theta, CellTempSpec(nSpecies+1), Work(100) +REAL :: TotalDOFWeight, C_P, nu, A(3,3), W(3), Theta, CellTempSpec(nSpecies+1), Work(100) !=================================================================================================================================== IF (nSpecies.GT.1) THEN ! gas mixture MolarFraction(1:nSpecies) = totalWeightSpec(1:nSpecies) / totalWeight MassIC_Mixture = TotalMass / totalWeight MassFraction(1:nSpecies) = MolarFraction(1:nSpecies) * Species(1:nSpecies)%MassIC / MassIC_Mixture + DOFFraction(1:nSpecies) = totalWeightSpec(1:nSpecies) * (5.+Xi_RotSpec(1:nSpecies)+Xi_VibSpec(1:nSpecies)) + TotalDOFWeight = SUM(DOFFraction) PrandtlCorrection = 0. C_P = 0.0 @@ -619,12 +621,10 @@ SUBROUTINE CalcGasProperties(nSpec, dens, InnerDOF, totalWeightSpec, totalWeight IF (nSpec(iSpec).EQ.0) CYCLE ! Correction of Pr for calculation of relaxation frequency, see alpha - Pfeiffer et. al., Physics of Fluids 33, 036106 (2021), ! "Multi-species modeling in the particle-based ellipsoidal statistical Bhatnagar-Gross-Krook method for monatomic gas species" - PrandtlCorrection = PrandtlCorrection + MolarFraction(iSpec)*MassIC_Mixture/Species(iSpec)%MassIC - IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN ! molecules - C_P = C_P + ((5. + (Xi_VibSpec(iSpec)+Xi_RotSpec(iSpec)))/2.) * BoltzmannConst / Species(iSpec)%MassIC * MassFraction(iSpec) - ELSE ! atoms - C_P = C_P + (5./2.) * BoltzmannConst / Species(iSpec)%MassIC * MassFraction(iSpec) - END IF + ! Extension for inner degrees of freedom using S. Brull, Communications in Mathematical Sciences 19, 2177-2194, 2021, + ! "An Ellipsoidal Statistical Model for a monoatomic and polyatomic gas mixture" + PrandtlCorrection = PrandtlCorrection + DOFFraction(iSpec)*MassIC_Mixture/Species(iSpec)%MassIC/TotalDOFWeight + C_P = C_P + ((5. + (Xi_VibSpec(iSpec)+Xi_RotSpec(iSpec)))/2.) * BoltzmannConst / Species(iSpec)%MassIC * MassFraction(iSpec) END DO SELECT CASE(BGKMixtureModel) From 2710d0864fe26245c91a850262f932a02d03ed58 Mon Sep 17 00:00:00 2001 From: Franziska Hild Date: Thu, 16 Mar 2023 15:57:23 +0100 Subject: [PATCH 055/495] Polyatomic mixtures enabled for ESBGK with subroutine CalcTEquiMultiPoly, subroutines CalcTEqui and CalcTEquiPoly shifted to fpflow_colloperator --- src/particles/bgk/bgk_colloperator.f90 | 452 +++++------------- src/particles/bgk/bgk_init.f90 | 8 - src/particles/fp_flow/fpflow_colloperator.f90 | 272 ++++++++++- 3 files changed, 382 insertions(+), 350 deletions(-) diff --git a/src/particles/bgk/bgk_colloperator.f90 b/src/particles/bgk/bgk_colloperator.f90 index dcfde8def..a7a3af96c 100644 --- a/src/particles/bgk/bgk_colloperator.f90 +++ b/src/particles/bgk/bgk_colloperator.f90 @@ -29,7 +29,7 @@ MODULE MOD_BGK_CollOperator !----------------------------------------------------------------------------------------------------------------------------------- ! Private Part --------------------------------------------------------------------------------------------------------------------- ! Public Part ---------------------------------------------------------------------------------------------------------------------- -PUBLIC :: BGK_CollisionOperator, ARShakhov, CalcTEquiPoly, CalcTEqui +PUBLIC :: BGK_CollisionOperator, ARShakhov !=================================================================================================================================== CONTAINS @@ -78,8 +78,8 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume) REAL :: alpha, alphaRot(nSpecies), CellTemp, dens, InnerDOF, NewEn, OldEn, Prandtl, relaxfreq, TEqui REAL :: dynamicvis, thermalcond INTEGER, ALLOCATABLE :: iPartIndx_NodeRelax(:),iPartIndx_NodeRelaxTemp(:),iPartIndx_NodeRelaxRot(:),iPartIndx_NodeRelaxVib(:) -INTEGER :: iLoop, iPart, nRelax, iPolyatMole, nXiVibDOF -REAL, ALLOCATABLE :: Xi_vib_DOF(:), VibEnergyDOF(:,:) +INTEGER :: iLoop, iPart, nRelax, iPolyatMole, nXiVibDOF, nXiVibDOFSpec(nSpecies) +REAL, ALLOCATABLE :: Xi_vib_DOF(:,:), VibEnergyDOF(:,:) INTEGER :: iSpec, nSpec(nSpecies), jSpec, nRotRelax, nVibRelax REAL :: OldEnRot, NewEnRot(nSpecies), NewEnVib(nSpecies) REAL :: TotalMass, u2Spec(nSpecies), u2i(3), vBulkAll(3) @@ -133,18 +133,19 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume) dens = totalWeight * Species(1)%MacroParticleFactor / NodeVolume END IF -! Calculation of the rotational and vibrational degrees of freedom for molecules -nXiVibDOF=0 ! Initialize -IF (nSpecies.EQ.1) THEN - IF((SpecDSMC(1)%InterID.EQ.2).OR.(SpecDSMC(1)%InterID.EQ.20)) THEN - IF(SpecDSMC(1)%PolyatomicMol) THEN - iPolyatMole = SpecDSMC(1)%SpecToPolyArray - nXiVibDOF = PolyatomMolDSMC(iPolyatMole)%VibDOF - ALLOCATE(Xi_vib_DOF(nXiVibDOF)) - Xi_vib_DOF(:) = 0. +! Allocate Xi_vib_DOF +nXiVibDOF=0.0 ! Initialize +DO iSpec = 1, nSpecies + IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN + IF(SpecDSMC(iSpec)%PolyatomicMol) THEN + iPolyatMole = SpecDSMC(iSpec)%SpecToPolyArray + nXiVibDOFSpec(iSpec) = PolyatomMolDSMC(iPolyatMole)%VibDOF END IF END IF -END IF +END DO +nXiVibDOF = MAXVAL(nXiVibDOFSpec(:)) +ALLOCATE(Xi_vib_DOF(nSpecies,nXiVibDOF)) +Xi_vib_DOF = 0.0 CALL CalcInnerDOFs(nSpec, EVibSpec, ERotSpec, totalWeightSpec, TVibSpec, TRotSpec, InnerDOF, Xi_VibSpec, Xi_Vib_oldSpec & ,Xi_RotSpec) @@ -192,15 +193,17 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume) RotExpSpec=0.; VibExpSpec=0. ! Calculation of the equilibrium temperature - IF(SpecDSMC(1)%PolyatomicMol) THEN ! polyatomic, NO MIXTURES POSSIBLE BY NOW - CALL CalcTEquiPoly(nPart, CellTemp, TRotSpec(1), TVibSpec(1), nXiVibDOF, Xi_vib_DOF, Xi_Vib_oldSpec(1), RotExpSpec(1), VibExpSpec(1), & - TEqui, rotrelaxfreqSpec(1), vibrelaxfreqSpec(1), dtCell) - ! Corrected vibrational degrees of freedom - Xi_VibSpec(1) = SUM(Xi_vib_DOF(1:PolyatomMolDSMC(iPolyatMole)%VibDOF)) - ELSE ! diatomic - CALL CalcTEquiMulti(nPart, nSpec, CellTemp, TRotSpec, TVibSpec, Xi_VibSpec, Xi_Vib_oldSpec, RotExpSpec, VibExpSpec, & + CALL CalcTEquiMultiPoly(nPart, nSpec, nXiVibDOF, Xi_vib_DOF, CellTemp, TRotSpec, TVibSpec, Xi_VibSpec, Xi_Vib_oldSpec, RotExpSpec, VibExpSpec, & TEqui, rotrelaxfreqSpec, vibrelaxfreqSpec, dtCell) - END IF + ! IF(SpecDSMC(1)%PolyatomicMol) THEN ! polyatomic, NO MIXTURES POSSIBLE BY NOW + ! CALL CalcTEquiPoly(nPart, CellTemp, TRotSpec(1), TVibSpec(1), nXiVibDOF, Xi_vib_DOF, Xi_Vib_oldSpec(1), RotExpSpec(1), VibExpSpec(1), & + ! TEqui, rotrelaxfreqSpec(1), vibrelaxfreqSpec(1), dtCell) + ! ! Corrected vibrational degrees of freedom + ! Xi_VibSpec(1) = SUM(Xi_vib_DOF(1:PolyatomMolDSMC(iPolyatMole)%VibDOF)) + ! ELSE ! diatomic + ! CALL CalcTEquiMulti(nPart, nSpec, CellTemp, TRotSpec, TVibSpec, Xi_VibSpec, Xi_Vib_oldSpec, RotExpSpec, VibExpSpec, & + ! TEqui, rotrelaxfreqSpec, vibrelaxfreqSpec, dtCell) + ! END IF IF(DSMC%CalcQualityFactors) THEN BGK_MaxRotRelaxFactor = MAX(BGK_MaxRotRelaxFactor,MAXVAL(rotrelaxfreqSpec(:))*dtCell) END IF @@ -822,7 +825,7 @@ SUBROUTINE RelaxInnerEnergy(nPart, nVibRelax, nRotRelax, iPartIndx_NodeRelaxVib, ! INPUT VARIABLES INTEGER, INTENT(IN) :: nPart,nXiVibDOF INTEGER, INTENT(IN) :: nVibRelax, nRotRelax, iPartIndx_NodeRelaxVib(nPart), iPartIndx_NodeRelaxRot(nPart) -REAL, INTENT(IN) :: Xi_vib_DOF(nXiVibDOF), TEqui, Xi_VibSpec(nSpecies), Xi_RotSpec(nSpecies) +REAL, INTENT(IN) :: Xi_vib_DOF(nSpecies,nXiVibDOF), TEqui, Xi_VibSpec(nSpecies), Xi_RotSpec(nSpecies) REAL, INTENT(INOUT) :: NewEnVib(nSpecies), NewEnRot(nSpecies) !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES @@ -847,7 +850,7 @@ SUBROUTINE RelaxInnerEnergy(nPart, nVibRelax, nRotRelax, iPartIndx_NodeRelaxVib, ! Polyatomic Species in Hypersonic Flow around a Flat-faced Cylinder", AIP Conference Proceedings 2132, 100001 (2019) DO iDOF = 1, PolyatomMolDSMC(iPolyatMole)%VibDOF CALL RANDOM_NUMBER(iRan) - VibEnergyDOF(iLoop,iDOF) = - LOG(iRan)*Xi_vib_DOF(iDOF)/2.*TEqui*BoltzmannConst + VibEnergyDOF(iLoop,iDOF) = - LOG(iRan)*Xi_vib_DOF(iSpec,iDOF)/2.*TEqui*BoltzmannConst PartStateIntEn(1,iPart) = PartStateIntEn(1,iPart)+VibEnergyDOF(iLoop,iDOF) END DO ! ELSE: diatomic, only one vibrational DOF, calculate new vibrational energy according to M. Pfeiffer, "Extending the particle @@ -1141,7 +1144,7 @@ SUBROUTINE EnergyConsVib(nPart, nVibRelax, nVibRelaxSpec, iPartIndx_NodeRelaxVib END IF ! Remaining OldEn for remaining particles OldEn = OldEn - (PartStateIntEn( 1,iPart) - SpecDSMC(iSpec)%EZeroPoint)*partWeight - END IF ! SpecDSMC(1)%PolyatomicMol + END IF END DO ELSE ! Continuous treatment of vibrational energy DO iLoop = 1, nVibRelax @@ -1326,118 +1329,13 @@ SUBROUTINE BGK_BuildTransGaussNums(nPart, iRanPart) END SUBROUTINE BGK_BuildTransGaussNums -SUBROUTINE CalcTEqui(nPart, CellTemp, TRot, TVib, Xi_Vib, Xi_Vib_old, RotExp, VibExp, & - TEqui, rotrelaxfreq, vibrelaxfreq, dtCell, DoVibRelaxIn) +SUBROUTINE CalcTEquiMultiPoly(nPart, nSpec, nXiVibDOF, Xi_vib_DOF, CellTemp, TRotSpec, TVibSpec, Xi_Vib_Spec, Xi_Vib_oldSpec, RotExpSpec, & + VibExpSpec, TEqui, rotrelaxfreqSpec, vibrelaxfreqSpec, dtCell, DoVibRelaxIn) !=================================================================================================================================== -! Calculation of the vibrational temperature (zero-point search) for non-polyatomic molecules for Fokker-Planck +! Calculation of the vibrational temperature (zero-point search) for polyatomic molecule mixtures !=================================================================================================================================== ! MODULES -USE MOD_DSMC_Vars, ONLY: SpecDSMC -USE MOD_BGK_Vars, ONLY: BGKDoVibRelaxation -! IMPLICIT VARIABLE HANDLING -IMPLICIT NONE -!----------------------------------------------------------------------------------------------------------------------------------- -! INPUT VARIABLES -REAL, INTENT(IN) :: CellTemp, TRot, TVib, Xi_Vib_old, rotrelaxfreq, vibrelaxfreq, dtCell -INTEGER, INTENT(IN) :: nPart -LOGICAL, OPTIONAL, INTENT(IN) :: DoVibRelaxIn -!----------------------------------------------------------------------------------------------------------------------------------- -! OUTPUT VARIABLES -REAL, INTENT(OUT) :: Xi_vib, TEqui, RotExp, VibExp -!----------------------------------------------------------------------------------------------------------------------------------- -! LOCAL VARIABLES -!----------------------------------------------------------------------------------------------------------------------------------- -REAL :: TEqui_Old, betaR, betaV, RotFrac, VibFrac, TEqui_Old2 -REAL :: eps_prec=1.0E-0 -REAL :: correctFac, correctFacRot, maxexp !, Xi_rel -LOGICAL :: DoVibRelax -!=================================================================================================================================== -IF (PRESENT(DoVibRelaxIn)) THEN - DoVibRelax = DoVibRelaxIn -ELSE - DoVibRelax = BGKDoVibRelaxation -END IF -maxexp = LOG(HUGE(maxexp)) -! Xi_rel = 2.*(2. - CollInf%omega(1,1)) -! correctFac = 1. + (2.*SpecDSMC(1)%CharaTVib / (CellTemp*(EXP(SpecDSMC(1)%CharaTVib / CellTemp)-1.)))**(2.) & -! * EXP(SpecDSMC(1)%CharaTVib /CellTemp) / (2.*Xi_rel) -! correctFacRot = 1. + 2./Xi_rel - -correctFac = 1. -correctFacRot = 1. -RotExp = exp(-rotrelaxfreq*dtCell/correctFacRot) -RotFrac = nPart*(1.-RotExp) -IF(DoVibRelax) THEN - VibExp = exp(-vibrelaxfreq*dtCell/correctFac) - VibFrac = nPart*(1.-VibExp) -ELSE - VibExp = 0.0 - VibFrac = 0.0 - Xi_vib = 0.0 -END IF -TEqui_Old = 0.0 -TEqui = (3.*(nPart-1.)*CellTemp+2.*RotFrac*TRot+Xi_Vib_old*VibFrac*TVib)/(3.*(nPart-1.)+2.*RotFrac+Xi_Vib_old*VibFrac) -DO WHILE ( ABS( TEqui - TEqui_Old ) .GT. eps_prec ) - IF (ABS(TRot-TEqui).LT.1E-3) THEN - RotExp = exp(-rotrelaxfreq*dtCell/correctFacRot) - ELSE - betaR = ((TRot-CellTemp)/(TRot-TEqui))*rotrelaxfreq*dtCell/correctFacRot - IF (-betaR.GT.0.0) THEN - RotExp = 0. - ELSE IF (betaR.GT.maxexp) THEN - RotExp = 0. - ELSE - RotExp = exp(-betaR) - END IF - END IF - RotFrac = nPart*(1.-RotExp) - IF(DoVibRelax) THEN - IF (ABS(TVib-TEqui).LT.1E-3) THEN - VibExp = exp(-vibrelaxfreq*dtCell/correctFac) - ELSE - betaV = ((TVib-CellTemp)/(TVib-TEqui))*vibrelaxfreq*dtCell/correctFac - IF (-betaV.GT.0.0) THEN - VibExp = 0. - ELSE IF (betaV.GT.maxexp) THEN - VibExp = 0. - ELSE - VibExp = exp(-betaV) - END IF - END IF - IF ((SpecDSMC(1)%CharaTVib/TEqui).GT.maxexp) THEN - Xi_Vib = 0.0 - ELSE - Xi_vib = 2.*SpecDSMC(1)%CharaTVib/TEqui/(EXP(SpecDSMC(1)%CharaTVib/TEqui)-1.) - END IF - VibFrac = nPart*(1.-VibExp) - END IF - TEqui_Old = TEqui - TEqui_Old2 = TEqui - TEqui = (3.*(nPart-1.)*CellTemp+2.*RotFrac*TRot+Xi_Vib_old*VibFrac*TVib)/(3.*(nPart-1.)+2.*RotFrac+Xi_Vib*VibFrac) - IF(DoVibRelax) THEN - DO WHILE( ABS( TEqui - TEqui_Old2 ) .GT. eps_prec ) - TEqui =(TEqui + TEqui_Old2)*0.5 - IF ((SpecDSMC(1)%CharaTVib/TEqui).GT.maxexp) THEN - Xi_Vib = 0.0 - ELSE - Xi_vib = 2.*SpecDSMC(1)%CharaTVib/TEqui/(EXP(SpecDSMC(1)%CharaTVib/TEqui)-1.) - END IF - TEqui_Old2 = TEqui - TEqui = (3.*(nPart-1.)*CellTemp+2.*RotFrac*TRot+Xi_Vib_old*VibFrac*TVib) / (3.*(nPart-1.)+2.*RotFrac+Xi_vib*VibFrac) - END DO - END IF -END DO - -END SUBROUTINE CalcTEqui - - -SUBROUTINE CalcTEquiMulti(nPart, nSpec, CellTemp, TRotSpec, TVibSpec, Xi_VibSpec, Xi_Vib_oldSpec, RotExpSpec, VibExpSpec, & - TEqui, rotrelaxfreqSpec, vibrelaxfreqSpec, dtCell, DoVibRelaxIn) -!=================================================================================================================================== -! Calculation of the vibrational temperature (zero-point search) for diatomic molecule mixtures -!=================================================================================================================================== -! MODULES -USE MOD_DSMC_Vars, ONLY: SpecDSMC +USE MOD_DSMC_Vars, ONLY: SpecDSMC, PolyatomMolDSMC USE MOD_BGK_Vars, ONLY: BGKDoVibRelaxation USE MOD_Particle_Vars, ONLY: nSpecies ! IMPLICIT VARIABLE HANDLING @@ -1446,51 +1344,49 @@ SUBROUTINE CalcTEquiMulti(nPart, nSpec, CellTemp, TRotSpec, TVibSpec, Xi_VibSpec ! INPUT VARIABLES REAL, INTENT(IN) :: CellTemp, TRotSpec(nSpecies), TVibSpec(nSpecies), Xi_Vib_oldSpec(nSpecies) REAL, INTENT(IN) :: rotrelaxfreqSpec(nSpecies), vibrelaxfreqSpec(nSpecies), dtCell -INTEGER, INTENT(IN) :: nPart, nSpec(nSpecies) +INTEGER, INTENT(IN) :: nPart, nSpec(nSpecies), nXiVibDOF LOGICAL, OPTIONAL, INTENT(IN) :: DoVibRelaxIn !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES -REAL, INTENT(OUT) :: Xi_VibSpec(nSpecies), TEqui, RotExpSpec(nSpecies), VibExpSpec(nSpecies) +REAL, INTENT(OUT) :: Xi_Vib_Spec(nSpecies), TEqui, RotExpSpec(nSpecies), VibExpSpec(nSpecies) +REAL, INTENT(OUT) :: Xi_vib_DOF(nSpecies,nXiVibDOF) !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- REAL :: TEqui_Old, betaR, betaV, RotFracSpec(nSpecies), VibFracSpec(nSpecies), TEqui_Old2 +REAL :: Xi_Rot_Spec(nSpecies) REAL :: eps_prec=1.0E-0 -REAL :: correctFac, correctFacRot, exparg, TEquiNumDof !, Xi_rel, +REAL :: exparg, TEquiNumDof LOGICAL :: DoVibRelax -INTEGER :: iSpec +INTEGER :: iSpec, iDOF, iPolyatMole !=================================================================================================================================== IF (PRESENT(DoVibRelaxIn)) THEN DoVibRelax = DoVibRelaxIn ELSE DoVibRelax = BGKDoVibRelaxation END IF -! Xi_rel = 2.*(2. - CollInf%omega(1,1)) -! correctFac = 1. + (2.*SpecDSMC(1)%CharaTVib / (CellTemp*(EXP(SpecDSMC(1)%CharaTVib / CellTemp)-1.)))**(2.) & -! * EXP(SpecDSMC(1)%CharaTVib /CellTemp) / (2.*Xi_rel) -! correctFacRot = 1. + 2./Xi_rel -correctFac = 1. -correctFacRot = 1. RotFracSpec = 0.0 VibFracSpec = 0.0 ! Loop over all molecular species --> only internal energies are relevant here DO iSpec=1, nSpecies IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN + ! rotational degrees of freedom of molecules + Xi_Rot_Spec(iSpec) = SpecDSMC(iSpec)%Xi_Rot ! Calculate number of rotational relaxing molecules with number of molecules * probability of relaxation ! P = 1 - exp(-nu*dt) with relaxation frequency nu and timestep dt - RotExpSpec(iSpec) = exp(-rotrelaxfreqSpec(iSpec)*dtCell/correctFacRot) + RotExpSpec(iSpec) = exp(-rotrelaxfreqSpec(iSpec)*dtCell) RotFracSpec(iSpec) = nSpec(iSpec)*(1.-RotExpSpec(iSpec)) ! Calculate number of vibrational relaxing molecules if enabled with number of molecules * probability of relaxation ! P = 1 - exp(-nu*dt) with relaxation frequency nu and timestep dt IF(DoVibRelax) THEN - VibExpSpec(iSpec) = exp(-vibrelaxfreqSpec(iSpec)*dtCell/correctFac) + VibExpSpec(iSpec) = exp(-vibrelaxfreqSpec(iSpec)*dtCell) VibFracSpec(iSpec) = nSpec(iSpec)*(1.-VibExpSpec(iSpec)) ELSE VibExpSpec(iSpec) = 0.0 VibFracSpec(iSpec) = 0.0 - Xi_VibSpec(iSpec) = 0.0 + Xi_Vib_Spec(iSpec) = 0.0 END IF END IF END DO @@ -1498,13 +1394,15 @@ SUBROUTINE CalcTEquiMulti(nPart, nSpec, CellTemp, TRotSpec, TVibSpec, Xi_VibSpec ! Calculation of equilibrium temperature ! M. Pfeiffer, "Extending the particle ellipsoidal statistical Bhatnagar-Gross-Krook method to diatomic molecules including ! quantized vibrational energies", Phys. Fluids 30, 116103 (2018), Eq. 25 +! M. Pfeiffer et. al., "Extension of Particle-based BGK Models to Polyatomic Species in Hypersonic Flow around a Flat-faced +! Cylinder", AIP Conference Proceedings 2132, 100001 (2019) TEqui = 3.*(nPart-1.)*CellTemp TEquiNumDof = 3.*(nPart-1.) ! Sum up over all species DO iSpec=1, nSpecies IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN - TEqui = TEqui + 2.*RotFracSpec(iSpec)*TRotSpec(iSpec)+Xi_Vib_oldSpec(iSpec)*VibFracSpec(iSpec)*TVibSpec(iSpec) - TEquiNumDof = TEquiNumDof + 2.*RotFracSpec(iSpec) + Xi_Vib_oldSpec(iSpec)*VibFracSpec(iSpec) + TEqui = TEqui + Xi_Rot_Spec(iSpec)*RotFracSpec(iSpec)*TRotSpec(iSpec)+Xi_Vib_oldSpec(iSpec)*VibFracSpec(iSpec)*TVibSpec(iSpec) + TEquiNumDof = TEquiNumDof + Xi_Rot_Spec(iSpec)*RotFracSpec(iSpec) + Xi_Vib_oldSpec(iSpec)*VibFracSpec(iSpec) END IF END DO TEqui = TEqui / TEquiNumDof @@ -1516,12 +1414,12 @@ SUBROUTINE CalcTEquiMulti(nPart, nSpec, CellTemp, TRotSpec, TVibSpec, Xi_VibSpec DO WHILE ( ABS( TEqui - TEqui_Old ) .GT. eps_prec ) DO iSpec = 1, nSpecies IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN - ! if difference too small: beta is not taken into account + ! if difference small: equilibrium, no beta IF (ABS(TRotSpec(iSpec)-TEqui).LT.1E-3) THEN - RotExpSpec(iSpec) = exp(-rotrelaxfreqSpec(iSpec)*dtCell/correctFacRot) + RotExpSpec(iSpec) = exp(-rotrelaxfreqSpec(iSpec)*dtCell) ELSE ! betaR = beta*nu*dt (= correction parameter rotation * relaxation frequency * time step) - betaR = ((TRotSpec(iSpec)-CellTemp)/(TRotSpec(iSpec)-TEqui))*rotrelaxfreqSpec(iSpec)*dtCell/correctFacRot + betaR = ((TRotSpec(iSpec)-CellTemp)/(TRotSpec(iSpec)-TEqui))*rotrelaxfreqSpec(iSpec)*dtCell ! negative betaR would leed to negative relaxation probability! IF (-betaR.GT.0.0) THEN RotExpSpec(iSpec) = 0. @@ -1536,12 +1434,12 @@ SUBROUTINE CalcTEquiMulti(nPart, nSpec, CellTemp, TRotSpec, TVibSpec, Xi_VibSpec RotFracSpec(iSpec) = nSpec(iSpec)*(1.-RotExpSpec(iSpec)) IF(DoVibRelax) THEN - ! if difference too small: beta is not taken into account + ! if difference small: equilibrium, no beta IF (ABS(TVibSpec(iSpec)-TEqui).LT.1E-3) THEN - VibExpSpec(iSpec) = exp(-vibrelaxfreqSpec(iSpec)*dtCell/correctFac) + VibExpSpec(iSpec) = exp(-vibrelaxfreqSpec(iSpec)*dtCell) ELSE ! betaV = beta*nu*dt (= correction parameter vibration * relaxation frequency * time step) - betaV = ((TVibSpec(iSpec)-CellTemp)/(TVibSpec(iSpec)-TEqui))*vibrelaxfreqSpec(iSpec)*dtCell/correctFac + betaV = ((TVibSpec(iSpec)-CellTemp)/(TVibSpec(iSpec)-TEqui))*vibrelaxfreqSpec(iSpec)*dtCell ! negative betaV would leed to negative relaxation probability! IF (-betaV.GT.0.0) THEN VibExpSpec(iSpec) = 0. @@ -1555,14 +1453,33 @@ SUBROUTINE CalcTEquiMulti(nPart, nSpec, CellTemp, TRotSpec, TVibSpec, Xi_VibSpec ! new calculation of number of vibrational relaxing molecules VibFracSpec(iSpec) = nSpec(iSpec)*(1.-VibExpSpec(iSpec)) - ! new calculation of the vibrational degrees of freedom - exparg = SpecDSMC(iSpec)%CharaTVib/TEqui - ! Check if the exponent is within the range of machine precision for calculation of vibrational degrees of freedom - IF(CHECKEXP(exparg))THEN - Xi_VibSpec(iSpec) = 2.*SpecDSMC(iSpec)%CharaTVib/TEqui/(EXP(exparg)-1.) - ELSE - Xi_VibSpec(iSpec) = 0.0 - END IF ! CHECKEXP(exparg) + ! new calculation of the vibrational degrees of freedom per species + IF(SpecDSMC(iSpec)%PolyatomicMol) THEN + iPolyatMole = SpecDSMC(iSpec)%SpecToPolyArray + ! Loop over all vibrational degrees of freedom to calculate them using TEqui + DO iDOF = 1, PolyatomMolDSMC(iPolyatMole)%VibDOF + exparg = PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)/TEqui + ! Check if the exponent is within the range of machine precision for calculation of vibrational degrees of freedom + IF(CHECKEXP(exparg))THEN + IF(exparg.gt.0.)THEN ! positive overflow: exp -> inf + Xi_vib_DOF(iSpec,iDOF) = 2.*exparg/(EXP(exparg)-1.) + ELSE ! negative overflow: exp -> 0 + Xi_vib_DOF(iSpec,iDOF) = 2.*exparg/(-1.) + END IF ! exparg.gt.0. + ELSE + Xi_vib_DOF(iSpec,iDOF) = 0.0 + END IF ! CHECKEXP(exparg) + END DO + Xi_Vib_Spec(iSpec) = SUM(Xi_vib_DOF(iSpec,1:PolyatomMolDSMC(iPolyatMole)%VibDOF)) + ELSE ! diatomic + exparg = SpecDSMC(iSpec)%CharaTVib/TEqui + ! Check if the exponent is within the range of machine precision for calculation of vibrational degrees of freedom + IF(CHECKEXP(exparg))THEN + Xi_Vib_Spec(iSpec) = 2.*SpecDSMC(iSpec)%CharaTVib/TEqui/(EXP(exparg)-1.) + ELSE + Xi_Vib_Spec(iSpec) = 0.0 + END IF ! CHECKEXP(exparg) + END IF END IF END IF END DO @@ -1575,8 +1492,8 @@ SUBROUTINE CalcTEquiMulti(nPart, nSpec, CellTemp, TRotSpec, TVibSpec, Xi_VibSpec ! Sum up over all species DO iSpec=1, nSpecies IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN - TEqui = TEqui + 2.*RotFracSpec(iSpec)*TRotSpec(iSpec)+Xi_Vib_oldSpec(iSpec)*VibFracSpec(iSpec)*TVibSpec(iSpec) - TEquiNumDof = TEquiNumDof + 2.*RotFracSpec(iSpec) + Xi_VibSpec(iSpec)*VibFracSpec(iSpec) + TEqui = TEqui + Xi_Rot_Spec(iSpec)*RotFracSpec(iSpec)*TRotSpec(iSpec)+Xi_Vib_oldSpec(iSpec)*VibFracSpec(iSpec)*TVibSpec(iSpec) + TEquiNumDof = TEquiNumDof + Xi_Rot_Spec(iSpec)*RotFracSpec(iSpec) + Xi_Vib_Spec(iSpec)*VibFracSpec(iSpec) END IF END DO TEqui = TEqui / TEquiNumDof @@ -1587,13 +1504,33 @@ SUBROUTINE CalcTEquiMulti(nPart, nSpec, CellTemp, TRotSpec, TVibSpec, Xi_VibSpec TEqui =(TEqui + TEqui_Old2)*0.5 DO iSpec=1, nSpecies IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN - ! new calculation of the vibrational degrees of freedom - exparg = SpecDSMC(iSpec)%CharaTVib/TEqui - IF(CHECKEXP(exparg))THEN - Xi_VibSpec(iSpec) = 2.*SpecDSMC(iSpec)%CharaTVib/TEqui/(EXP(exparg)-1.) - ELSE - Xi_VibSpec(iSpec) = 0.0 - END IF ! CHECKEXP(exparg) + ! new calculation of the vibrational degrees of freedom per species + IF(SpecDSMC(iSpec)%PolyatomicMol) THEN + iPolyatMole = SpecDSMC(iSpec)%SpecToPolyArray + ! Loop over all vibrational degrees of freedom to calculate them using TEqui + DO iDOF = 1, PolyatomMolDSMC(iPolyatMole)%VibDOF + exparg = PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)/TEqui + ! Check if the exponent is within the range of machine precision for calculation of vibrational degrees of freedom + IF(CHECKEXP(exparg))THEN + IF(exparg.gt.0.)THEN ! positive overflow: exp -> inf + Xi_vib_DOF(iSpec,iDOF) = 2.*exparg/(EXP(exparg)-1.) + ELSE ! negative overflow: exp -> 0 + Xi_vib_DOF(iSpec,iDOF) = 2.*exparg/(-1.) + END IF ! exparg.gt.0. + ELSE + Xi_vib_DOF(iSpec,iDOF) = 0.0 + END IF ! CHECKEXP(exparg) + END DO + Xi_Vib_Spec(iSpec) = SUM(Xi_vib_DOF(iSpec,1:PolyatomMolDSMC(iPolyatMole)%VibDOF)) + ELSE ! diatomic + exparg = SpecDSMC(iSpec)%CharaTVib/TEqui + ! Check if the exponent is within the range of machine precision for calculation of vibrational degrees of freedom + IF(CHECKEXP(exparg))THEN + Xi_Vib_Spec(iSpec) = 2.*SpecDSMC(iSpec)%CharaTVib/TEqui/(EXP(exparg)-1.) + ELSE + Xi_Vib_Spec(iSpec) = 0.0 + END IF ! CHECKEXP(exparg) + END IF END IF END DO ! new calculation of equilibrium temperature with corrected vibrational degrees of freedom in denominator @@ -1603,182 +1540,15 @@ SUBROUTINE CalcTEquiMulti(nPart, nSpec, CellTemp, TRotSpec, TVibSpec, Xi_VibSpec ! Sum up over all species DO iSpec=1, nSpecies IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN - TEqui = TEqui + 2.*RotFracSpec(iSpec)*TRotSpec(iSpec)+Xi_Vib_oldSpec(iSpec)*VibFracSpec(iSpec)*TVibSpec(iSpec) - TEquiNumDof = TEquiNumDof + 2.*RotFracSpec(iSpec) + Xi_VibSpec(iSpec)*VibFracSpec(iSpec) + TEqui = TEqui + Xi_Rot_Spec(iSpec)*RotFracSpec(iSpec)*TRotSpec(iSpec)+Xi_Vib_oldSpec(iSpec)*VibFracSpec(iSpec)*TVibSpec(iSpec) + TEquiNumDof = TEquiNumDof + Xi_Rot_Spec(iSpec)*RotFracSpec(iSpec) + Xi_Vib_Spec(iSpec)*VibFracSpec(iSpec) END IF END DO TEqui = TEqui / TEquiNumDof END DO END IF END DO -END SUBROUTINE CalcTEquiMulti - - -SUBROUTINE CalcTEquiPoly(nPart, CellTemp, TRot, TVib, nXiVibDOF, Xi_Vib_DOF, Xi_Vib_old, RotExp, VibExp, TEqui, rotrelaxfreq, vibrelaxfreq, & - dtCell, DoVibRelaxIn) -!=================================================================================================================================== -! Calculation of the vibrational temperature (zero-point search) for polyatomic molecules -!=================================================================================================================================== -! MODULES -USE MOD_DSMC_Vars, ONLY: SpecDSMC, PolyatomMolDSMC -USE MOD_BGK_Vars, ONLY: BGKDoVibRelaxation -! IMPLICIT VARIABLE HANDLING -IMPLICIT NONE -!----------------------------------------------------------------------------------------------------------------------------------- -! INPUT VARIABLES -REAL, INTENT(IN) :: CellTemp, TRot, TVib, Xi_Vib_old, rotrelaxfreq, vibrelaxfreq -INTEGER, INTENT(IN) :: nPart,nXiVibDOF -REAL, INTENT(IN) :: dtCell -LOGICAL, OPTIONAL, INTENT(IN) :: DoVibRelaxIn -!----------------------------------------------------------------------------------------------------------------------------------- -! OUTPUT VARIABLES -REAL, INTENT(OUT) :: Xi_vib_DOF(nXiVibDOF), TEqui, RotExp, VibExp -!----------------------------------------------------------------------------------------------------------------------------------- -! LOCAL VARIABLES -!----------------------------------------------------------------------------------------------------------------------------------- -REAL :: TEqui_Old, betaR, betaV, RotFrac, VibFrac, Xi_Rot, TEqui_Old2, exparg -REAL :: eps_prec=1.0 -REAL :: correctFac, correctFacRot -INTEGER :: iDOF, iPolyatMole -LOGICAL :: DoVibRelax -!=================================================================================================================================== -IF (PRESENT(DoVibRelaxIn)) THEN - DoVibRelax = DoVibRelaxIn -ELSE - DoVibRelax = BGKDoVibRelaxation -END IF - -! rotational degrees of freedom of polyatomic molecule -Xi_Rot = SpecDSMC(1)%Xi_Rot -iPolyatMole = SpecDSMC(1)%SpecToPolyArray - -! Xi_rel = 2.*(2. - CollInf%omega(1,1)) -! correctFac = 0.0 -! DO iDOF = 1, PolyatomMolDSMC(iPolyatMole)%VibDOF -! correctFac = correctFac & -! + (2.*PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF) / (CellTemp & -! *(EXP(PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF) / CellTemp)-1.)))**(2.) & -! * EXP(PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF) / CellTemp) / 2. -! END DO -! correctFac = 1. + correctFac/Xi_rel -! correctFacRot = 1. + Xi_Rot/Xi_rel - -correctFac = 1. -correctFacRot = 1. - -! Calculate number of rotational relaxing molecules with number of molecules * probability of relaxation -! P = 1 - exp(-nu*dt) with relaxation frequency nu and timestep dt -RotExp = exp(-rotrelaxfreq*dtCell/correctFacRot) -RotFrac = nPart*(1.-RotExp) -! Calculate number of vibrational relaxing molecules if enabled with number of molecules * probability of relaxation -! P = 1 - exp(-nu*dt) with relaxation frequency nu and timestep dt -IF(DoVibRelax) THEN - VibExp = exp(-vibrelaxfreq*dtCell/correctFac) - VibFrac = nPart*(1.-VibExp) -ELSE - VibExp = 0.0 - VibFrac = 0.0 - Xi_vib_DOF = 0.0 -END IF -TEqui_Old = 0.0 -! M. Pfeiffer et. al., "Extension of Particle-based BGK Models to Polyatomic Species in Hypersonic Flow around a Flat-faced -! Cylinder", AIP Conference Proceedings 2132, 100001 (2019) -! Solving of equation system for TEqui and betaR and betaV -TEqui = (3.*(nPart-1.)*CellTemp+2.*RotFrac*TRot+Xi_Vib_old*VibFrac*TVib)/(3.*(nPart-1.)+2.*RotFrac+Xi_Vib_old*VibFrac) -! Required condition of Landau-Teller relaxation not fulfilled --> relaxation probabilities of rotation and vibration are -! corrected with a parameter beta for rotation and vibration as suggested by Burt: -! J. Burt and I. Boyd, “Evaluation of a particle method for the ellipsoidal statistical Bhatnagar-Gross-Krook equation”, -! 44th AIAA Aerospace Sciences Meeting and Exhibit (AIAA, 2006), p. 989 -! Solving of equation system until accuracy eps_prec is reached -DO WHILE ( ABS( TEqui - TEqui_Old ) .GT. eps_prec ) - ! if difference too small: beta is not taken into account - IF (ABS(TRot-TEqui).LT.1E-3) THEN - RotExp = exp(-rotrelaxfreq*dtCell/correctFacRot) - ELSE - ! betaR = beta*nu*dt (= correction parameter rotation * relaxation frequency * time step) - betaR = ((TRot-CellTemp)/(TRot-TEqui))*rotrelaxfreq*dtCell/correctFacRot - ! negative betaR would leed to negative relaxation probability! - IF (-betaR.GT.0.0) THEN - RotExp = 0. - ! Check if the exponent is within the range of machine precision - ELSE IF (CHECKEXP(betaR)) THEN - RotExp = exp(-betaR) - ELSE - RotExp = 0. - END IF - END IF - ! new calculation of number of rotational relaxing molecules - RotFrac = nPart*(1.-RotExp) - - IF(DoVibRelax) THEN - ! if difference too small: beta is not taken into account - IF (ABS(TVib-TEqui).LT.1E-3) THEN - VibExp = exp(-vibrelaxfreq*dtCell/correctFac) - ELSE - ! betaV = beta*nu*dt (= correction parameter vibration * relaxation frequency * time step) - betaV = ((TVib-CellTemp)/(TVib-TEqui))*vibrelaxfreq*dtCell/correctFac - ! negative betaV would leed to negative relaxation probability! - IF (-betaV.GT.0.0) THEN - VibExp = 0. - ! Check if the exponent is within the range of machine precision - ELSEIF(CHECKEXP(betaV))THEN - VibExp = exp(-betaV) - ELSE - VibExp = 0. - END IF - END IF - ! new calculation of number of vibrational relaxing molecules - VibFrac = nPart*(1.-VibExp) - - ! Loop over all vibrational degrees of freedom to calculate them using TEqui - DO iDOF = 1, PolyatomMolDSMC(iPolyatMole)%VibDOF - exparg = PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)/TEqui - ! Check if the exponent is within the range of machine precision for calculation of vibrational degrees of freedom - IF(CHECKEXP(exparg))THEN - IF(exparg.gt.0.)THEN ! positive overflow: exp -> inf - Xi_vib_DOF(iDOF) = 2.*exparg/(EXP(exparg)-1.) - ELSE ! negative overflow: exp -> 0 - Xi_vib_DOF(iDOF) = 2.*exparg/(-1.) - END IF ! exparg.gt.0. - ELSE - Xi_vib_DOF(iDOF) = 0.0 - END IF ! CHECKEXP(exparg) - END DO - END IF - TEqui_Old = TEqui - TEqui_Old2 = TEqui - - ! new calculation of equilibrium temperature with new RotFrac, new VibFrac new Xi_vib_DOF(TEqui) in denominator - TEqui = (3.*(nPart-1.)*CellTemp+2.*RotFrac*TRot+Xi_Vib_old*VibFrac*TVib) & - / (3.*(nPart-1.)+2.*RotFrac+SUM(Xi_vib_DOF(1:PolyatomMolDSMC(iPolyatMole)%VibDOF))*VibFrac) - IF(DoVibRelax) THEN - ! accuracy eps_prec not reached yet - DO WHILE( ABS( TEqui - TEqui_Old2 ) .GT. eps_prec ) - ! mean value of old and new equilibrium temperature - TEqui =(TEqui + TEqui_Old2)*0.5 - ! Loop over all vibrational degrees of freedom - DO iDOF = 1, PolyatomMolDSMC(iPolyatMole)%VibDOF - exparg = PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)/TEqui - ! Check if the exponent is within the range of machine precision for calculation of vibrational degrees of freedom - IF(CHECKEXP(exparg))THEN - IF(exparg.gt.0.)THEN ! positive overflow: exp -> inf - Xi_vib_DOF(iDOF) = 2.*exparg/(EXP(exparg)-1.) - ELSE ! negative overflow: exp -> 0 - Xi_vib_DOF(iDOF) = 2.*exparg/(-1.) - END IF ! exparg.gt.0. - ELSE - Xi_vib_DOF(iDOF) = 0.0 - END IF ! CHECKEXP(exparg) - END DO - TEqui_Old2 = TEqui - ! new calculation of equilibrium temperature with corrected vibrational degrees of freedom in denominator - TEqui = (3.*(nPart-1.)*CellTemp+2.*RotFrac*TRot+Xi_Vib_old*VibFrac*TVib) & - / (3.*(nPart-1.)+2.*RotFrac+SUM(Xi_vib_DOF(1:PolyatomMolDSMC(iPolyatMole)%VibDOF))*VibFrac) - END DO - END IF -END DO - -END SUBROUTINE CalcTEquiPoly +END SUBROUTINE CalcTEquiMultiPoly SUBROUTINE CalcViscosityThermalCondColIntVHS(CellTemp, Xi, dens, Xi_RotSpec, Xi_VibSpec, Visc, ThermalCond) diff --git a/src/particles/bgk/bgk_init.f90 b/src/particles/bgk/bgk_init.f90 index ae7b7ecb0..ae67625be 100644 --- a/src/particles/bgk/bgk_init.f90 +++ b/src/particles/bgk/bgk_init.f90 @@ -126,9 +126,6 @@ SUBROUTINE InitBGK() /(2.*(Species(iSpec)%MassIC * Species(iSpec2)%MassIC)))/CollInf%Tref(iSpec,iSpec2)**(-CollInf%omega(iSpec,iSpec2) +0.5) END DO END DO -IF ((nSpecies.GT.1).AND.(ANY(SpecDSMC(:)%PolyatomicMol))) THEN - CALL abort(__STAMP__,' ERROR Multispec not implemented with polyatomic molecules!') -END IF BGKCollModel = GETINT('Particles-BGK-CollModel') IF ((nSpecies.GT.1).AND.(BGKCollModel.GT.1)) THEN @@ -169,11 +166,6 @@ SUBROUTINE InitBGK() ! Vibrational modelling BGKDoVibRelaxation = GETLOGICAL('Particles-BGK-DoVibRelaxation') BGKUseQuantVibEn = GETLOGICAL('Particles-BGK-UseQuantVibEn') - !IF ((nSpecies.GT.1).AND.(BGKUseQuantVibEn)) THEN - ! CALL abort(& - ! __STAMP__& - ! ,' ERROR Multispec not implemented for quantized vibrational energy!') - !END IF END IF IF(DSMC%CalcQualityFactors) THEN diff --git a/src/particles/fp_flow/fpflow_colloperator.f90 b/src/particles/fp_flow/fpflow_colloperator.f90 index 307b979cc..43485cd8f 100644 --- a/src/particles/fp_flow/fpflow_colloperator.f90 +++ b/src/particles/fp_flow/fpflow_colloperator.f90 @@ -51,7 +51,6 @@ SUBROUTINE FP_CollisionOperator(iPartIndx_Node, nPart, NodeVolume) USE MOD_DSMC_Vars ,ONLY: CollInf, RadialWeighting USE Ziggurat USE MOD_Particle_Analyze_Tools ,ONLY: CalcTVibPoly -USE MOD_BGK_CollOperator ,ONLY: CalcTEquiPoly, CalcTEqui USE MOD_part_tools ,ONLY: GetParticleWeight ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -701,4 +700,275 @@ SUBROUTINE FP_CollisionOperator(iPartIndx_Node, nPart, NodeVolume) END SUBROUTINE FP_CollisionOperator +SUBROUTINE CalcTEqui(nPart, CellTemp, TRot, TVib, Xi_Vib, Xi_Vib_old, RotExp, VibExp, & + TEqui, rotrelaxfreq, vibrelaxfreq, dtCell, DoVibRelaxIn) +!=================================================================================================================================== +! Calculation of the vibrational temperature (zero-point search) for non-polyatomic molecules for Fokker-Planck +!=================================================================================================================================== +! MODULES +USE MOD_DSMC_Vars, ONLY: SpecDSMC +USE MOD_BGK_Vars, ONLY: BGKDoVibRelaxation +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES +REAL, INTENT(IN) :: CellTemp, TRot, TVib, Xi_Vib_old, rotrelaxfreq, vibrelaxfreq, dtCell +INTEGER, INTENT(IN) :: nPart +LOGICAL, OPTIONAL, INTENT(IN) :: DoVibRelaxIn +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +REAL, INTENT(OUT) :: Xi_vib, TEqui, RotExp, VibExp +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +REAL :: TEqui_Old, betaR, betaV, RotFrac, VibFrac, TEqui_Old2 +REAL :: eps_prec=1.0E-0 +REAL :: correctFac, correctFacRot, maxexp !, Xi_rel +LOGICAL :: DoVibRelax +!=================================================================================================================================== +IF (PRESENT(DoVibRelaxIn)) THEN + DoVibRelax = DoVibRelaxIn +ELSE + DoVibRelax = BGKDoVibRelaxation +END IF +maxexp = LOG(HUGE(maxexp)) +! Xi_rel = 2.*(2. - CollInf%omega(1,1)) +! correctFac = 1. + (2.*SpecDSMC(1)%CharaTVib / (CellTemp*(EXP(SpecDSMC(1)%CharaTVib / CellTemp)-1.)))**(2.) & +! * EXP(SpecDSMC(1)%CharaTVib /CellTemp) / (2.*Xi_rel) +! correctFacRot = 1. + 2./Xi_rel + +correctFac = 1. +correctFacRot = 1. +RotExp = exp(-rotrelaxfreq*dtCell/correctFacRot) +RotFrac = nPart*(1.-RotExp) +IF(DoVibRelax) THEN + VibExp = exp(-vibrelaxfreq*dtCell/correctFac) + VibFrac = nPart*(1.-VibExp) +ELSE + VibExp = 0.0 + VibFrac = 0.0 + Xi_vib = 0.0 +END IF +TEqui_Old = 0.0 +TEqui = (3.*(nPart-1.)*CellTemp+2.*RotFrac*TRot+Xi_Vib_old*VibFrac*TVib)/(3.*(nPart-1.)+2.*RotFrac+Xi_Vib_old*VibFrac) +DO WHILE ( ABS( TEqui - TEqui_Old ) .GT. eps_prec ) + IF (ABS(TRot-TEqui).LT.1E-3) THEN + RotExp = exp(-rotrelaxfreq*dtCell/correctFacRot) + ELSE + betaR = ((TRot-CellTemp)/(TRot-TEqui))*rotrelaxfreq*dtCell/correctFacRot + IF (-betaR.GT.0.0) THEN + RotExp = 0. + ELSE IF (betaR.GT.maxexp) THEN + RotExp = 0. + ELSE + RotExp = exp(-betaR) + END IF + END IF + RotFrac = nPart*(1.-RotExp) + IF(DoVibRelax) THEN + IF (ABS(TVib-TEqui).LT.1E-3) THEN + VibExp = exp(-vibrelaxfreq*dtCell/correctFac) + ELSE + betaV = ((TVib-CellTemp)/(TVib-TEqui))*vibrelaxfreq*dtCell/correctFac + IF (-betaV.GT.0.0) THEN + VibExp = 0. + ELSE IF (betaV.GT.maxexp) THEN + VibExp = 0. + ELSE + VibExp = exp(-betaV) + END IF + END IF + IF ((SpecDSMC(1)%CharaTVib/TEqui).GT.maxexp) THEN + Xi_Vib = 0.0 + ELSE + Xi_vib = 2.*SpecDSMC(1)%CharaTVib/TEqui/(EXP(SpecDSMC(1)%CharaTVib/TEqui)-1.) + END IF + VibFrac = nPart*(1.-VibExp) + END IF + TEqui_Old = TEqui + TEqui_Old2 = TEqui + TEqui = (3.*(nPart-1.)*CellTemp+2.*RotFrac*TRot+Xi_Vib_old*VibFrac*TVib)/(3.*(nPart-1.)+2.*RotFrac+Xi_Vib*VibFrac) + IF(DoVibRelax) THEN + DO WHILE( ABS( TEqui - TEqui_Old2 ) .GT. eps_prec ) + TEqui =(TEqui + TEqui_Old2)*0.5 + IF ((SpecDSMC(1)%CharaTVib/TEqui).GT.maxexp) THEN + Xi_Vib = 0.0 + ELSE + Xi_vib = 2.*SpecDSMC(1)%CharaTVib/TEqui/(EXP(SpecDSMC(1)%CharaTVib/TEqui)-1.) + END IF + TEqui_Old2 = TEqui + TEqui = (3.*(nPart-1.)*CellTemp+2.*RotFrac*TRot+Xi_Vib_old*VibFrac*TVib) / (3.*(nPart-1.)+2.*RotFrac+Xi_vib*VibFrac) + END DO + END IF +END DO + +END SUBROUTINE CalcTEqui + + +SUBROUTINE CalcTEquiPoly(nPart, CellTemp, TRot, TVib, nXiVibDOF, Xi_Vib_DOF, Xi_Vib_old, RotExp, VibExp, TEqui, rotrelaxfreq, vibrelaxfreq, & + dtCell, DoVibRelaxIn) +!=================================================================================================================================== +! Calculation of the vibrational temperature (zero-point search) for polyatomic molecules +!=================================================================================================================================== +! MODULES +USE MOD_DSMC_Vars, ONLY: SpecDSMC, PolyatomMolDSMC +USE MOD_BGK_Vars, ONLY: BGKDoVibRelaxation +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES +REAL, INTENT(IN) :: CellTemp, TRot, TVib, Xi_Vib_old, rotrelaxfreq, vibrelaxfreq +INTEGER, INTENT(IN) :: nPart,nXiVibDOF +REAL, INTENT(IN) :: dtCell +LOGICAL, OPTIONAL, INTENT(IN) :: DoVibRelaxIn +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +REAL, INTENT(OUT) :: Xi_vib_DOF(nXiVibDOF), TEqui, RotExp, VibExp +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +REAL :: TEqui_Old, betaR, betaV, RotFrac, VibFrac, Xi_Rot, TEqui_Old2, exparg +REAL :: eps_prec=1.0 +REAL :: correctFac, correctFacRot +INTEGER :: iDOF, iPolyatMole +LOGICAL :: DoVibRelax +!=================================================================================================================================== +IF (PRESENT(DoVibRelaxIn)) THEN + DoVibRelax = DoVibRelaxIn +ELSE + DoVibRelax = BGKDoVibRelaxation +END IF + +! rotational degrees of freedom of polyatomic molecule +Xi_Rot = SpecDSMC(1)%Xi_Rot +iPolyatMole = SpecDSMC(1)%SpecToPolyArray + +! Xi_rel = 2.*(2. - CollInf%omega(1,1)) +! correctFac = 0.0 +! DO iDOF = 1, PolyatomMolDSMC(iPolyatMole)%VibDOF +! correctFac = correctFac & +! + (2.*PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF) / (CellTemp & +! *(EXP(PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF) / CellTemp)-1.)))**(2.) & +! * EXP(PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF) / CellTemp) / 2. +! END DO +! correctFac = 1. + correctFac/Xi_rel +! correctFacRot = 1. + Xi_Rot/Xi_rel + +correctFac = 1. +correctFacRot = 1. + +! Calculate number of rotational relaxing molecules with number of molecules * probability of relaxation +! P = 1 - exp(-nu*dt) with relaxation frequency nu and timestep dt +RotExp = exp(-rotrelaxfreq*dtCell/correctFacRot) +RotFrac = nPart*(1.-RotExp) +! Calculate number of vibrational relaxing molecules if enabled with number of molecules * probability of relaxation +! P = 1 - exp(-nu*dt) with relaxation frequency nu and timestep dt +IF(DoVibRelax) THEN + VibExp = exp(-vibrelaxfreq*dtCell/correctFac) + VibFrac = nPart*(1.-VibExp) +ELSE + VibExp = 0.0 + VibFrac = 0.0 + Xi_vib_DOF = 0.0 +END IF +TEqui_Old = 0.0 +! M. Pfeiffer et. al., "Extension of Particle-based BGK Models to Polyatomic Species in Hypersonic Flow around a Flat-faced +! Cylinder", AIP Conference Proceedings 2132, 100001 (2019) +! Solving of equation system for TEqui and betaR and betaV +TEqui = (3.*(nPart-1.)*CellTemp+2.*RotFrac*TRot+Xi_Vib_old*VibFrac*TVib)/(3.*(nPart-1.)+2.*RotFrac+Xi_Vib_old*VibFrac) +! Required condition of Landau-Teller relaxation not fulfilled --> relaxation probabilities of rotation and vibration are +! corrected with a parameter beta for rotation and vibration as suggested by Burt: +! J. Burt and I. Boyd, “Evaluation of a particle method for the ellipsoidal statistical Bhatnagar-Gross-Krook equation”, +! 44th AIAA Aerospace Sciences Meeting and Exhibit (AIAA, 2006), p. 989 +! Solving of equation system until accuracy eps_prec is reached +DO WHILE ( ABS( TEqui - TEqui_Old ) .GT. eps_prec ) + ! if difference too small: beta is not taken into account + IF (ABS(TRot-TEqui).LT.1E-3) THEN + RotExp = exp(-rotrelaxfreq*dtCell/correctFacRot) + ELSE + ! betaR = beta*nu*dt (= correction parameter rotation * relaxation frequency * time step) + betaR = ((TRot-CellTemp)/(TRot-TEqui))*rotrelaxfreq*dtCell/correctFacRot + ! negative betaR would leed to negative relaxation probability! + IF (-betaR.GT.0.0) THEN + RotExp = 0. + ! Check if the exponent is within the range of machine precision + ELSE IF (CHECKEXP(betaR)) THEN + RotExp = exp(-betaR) + ELSE + RotExp = 0. + END IF + END IF + ! new calculation of number of rotational relaxing molecules + RotFrac = nPart*(1.-RotExp) + + IF(DoVibRelax) THEN + ! if difference too small: beta is not taken into account + IF (ABS(TVib-TEqui).LT.1E-3) THEN + VibExp = exp(-vibrelaxfreq*dtCell/correctFac) + ELSE + ! betaV = beta*nu*dt (= correction parameter vibration * relaxation frequency * time step) + betaV = ((TVib-CellTemp)/(TVib-TEqui))*vibrelaxfreq*dtCell/correctFac + ! negative betaV would leed to negative relaxation probability! + IF (-betaV.GT.0.0) THEN + VibExp = 0. + ! Check if the exponent is within the range of machine precision + ELSEIF(CHECKEXP(betaV))THEN + VibExp = exp(-betaV) + ELSE + VibExp = 0. + END IF + END IF + ! new calculation of number of vibrational relaxing molecules + VibFrac = nPart*(1.-VibExp) + + ! Loop over all vibrational degrees of freedom to calculate them using TEqui + DO iDOF = 1, PolyatomMolDSMC(iPolyatMole)%VibDOF + exparg = PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)/TEqui + ! Check if the exponent is within the range of machine precision for calculation of vibrational degrees of freedom + IF(CHECKEXP(exparg))THEN + IF(exparg.gt.0.)THEN ! positive overflow: exp -> inf + Xi_vib_DOF(iDOF) = 2.*exparg/(EXP(exparg)-1.) + ELSE ! negative overflow: exp -> 0 + Xi_vib_DOF(iDOF) = 2.*exparg/(-1.) + END IF ! exparg.gt.0. + ELSE + Xi_vib_DOF(iDOF) = 0.0 + END IF ! CHECKEXP(exparg) + END DO + END IF + TEqui_Old = TEqui + TEqui_Old2 = TEqui + + ! new calculation of equilibrium temperature with new RotFrac, new VibFrac new Xi_vib_DOF(TEqui) in denominator + TEqui = (3.*(nPart-1.)*CellTemp+2.*RotFrac*TRot+Xi_Vib_old*VibFrac*TVib) & + / (3.*(nPart-1.)+2.*RotFrac+SUM(Xi_vib_DOF(1:PolyatomMolDSMC(iPolyatMole)%VibDOF))*VibFrac) + IF(DoVibRelax) THEN + ! accuracy eps_prec not reached yet + DO WHILE( ABS( TEqui - TEqui_Old2 ) .GT. eps_prec ) + ! mean value of old and new equilibrium temperature + TEqui =(TEqui + TEqui_Old2)*0.5 + ! Loop over all vibrational degrees of freedom + DO iDOF = 1, PolyatomMolDSMC(iPolyatMole)%VibDOF + exparg = PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)/TEqui + ! Check if the exponent is within the range of machine precision for calculation of vibrational degrees of freedom + IF(CHECKEXP(exparg))THEN + IF(exparg.gt.0.)THEN ! positive overflow: exp -> inf + Xi_vib_DOF(iDOF) = 2.*exparg/(EXP(exparg)-1.) + ELSE ! negative overflow: exp -> 0 + Xi_vib_DOF(iDOF) = 2.*exparg/(-1.) + END IF ! exparg.gt.0. + ELSE + Xi_vib_DOF(iDOF) = 0.0 + END IF ! CHECKEXP(exparg) + END DO + TEqui_Old2 = TEqui + ! new calculation of equilibrium temperature with corrected vibrational degrees of freedom in denominator + TEqui = (3.*(nPart-1.)*CellTemp+2.*RotFrac*TRot+Xi_Vib_old*VibFrac*TVib) & + / (3.*(nPart-1.)+2.*RotFrac+SUM(Xi_vib_DOF(1:PolyatomMolDSMC(iPolyatMole)%VibDOF))*VibFrac) + END DO + END IF +END DO + +END SUBROUTINE CalcTEquiPoly + END MODULE MOD_FP_CollOperator From 485e7d2d839344966db6036ea8c9931c9be30449 Mon Sep 17 00:00:00 2001 From: Franziska Hild Date: Thu, 30 Mar 2023 15:30:50 +0200 Subject: [PATCH 056/495] Relaxation according to Mathiaud for molecule mixtures, testing still needs to be done --- src/particles/bgk/bgk_colloperator.f90 | 591 +++++++++++-------------- 1 file changed, 248 insertions(+), 343 deletions(-) diff --git a/src/particles/bgk/bgk_colloperator.f90 b/src/particles/bgk/bgk_colloperator.f90 index 93b94010a..90fc2ec9d 100644 --- a/src/particles/bgk/bgk_colloperator.f90 +++ b/src/particles/bgk/bgk_colloperator.f90 @@ -73,7 +73,7 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume, AveragingVal !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES REAL :: vBulk(3), u0ij(3,3), u2, V_rel(3), dtCell -REAL :: alpha, alphaRot(nSpecies), CellTemp, dens, InnerDOF, NewEn, OldEn, Prandtl, relaxfreq, TEqui +REAL :: alpha, alphaRot(nSpecies), CellTemp, dens, InnerDOF, NewEn, OldEn, Prandtl, relaxfreq REAL :: dynamicvis, thermalcond INTEGER, ALLOCATABLE :: iPartIndx_NodeRelax(:),iPartIndx_NodeRelaxTemp(:),iPartIndx_NodeRelaxRot(:),iPartIndx_NodeRelaxVib(:) INTEGER :: iLoop, iPart, nRelax, iPolyatMole, nXiVibDOF, nXiVibDOFSpec(nSpecies) @@ -88,11 +88,11 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume, AveragingVal REAL,PARAMETER :: RelMomTol=1e-6 ! Relative tolerance applied to conservation of momentum before/after reaction REAL,PARAMETER :: RelEneTol=1e-12 ! Relative tolerance applied to conservation of energy before/after reaction #endif /* CODE_ANALYZE */ -REAL :: totalWeightSpec(nSpecies), totalWeight, partWeight, CellTemptmp +REAL :: totalWeightSpec(nSpecies), totalWeight, partWeight, CellTemptmp, MassIC_Mixture REAL :: EVibSpec(nSpecies), ERotSpec(nSpecies), Xi_VibSpec(nSpecies), Xi_RotSpec(nSpecies),Xi_Vib_oldSpec(nSpecies) -REAL :: TVibSpec(nSpecies), TRotSpec(nSpecies), RotExpSpec(nSpecies), VibExpSpec(nSpecies) -REAL :: collisionfreqSpec(nSpecies),rotrelaxfreqSpec(nSpecies), vibrelaxfreqSpec(nSpecies), Xi_RotTotal -INTEGER :: nVibRelaxSpec(nSpecies), nRotRelaxSpec(nSpecies) +REAL :: ERotTtransSpecMean(nSpecies), EVibTtransSpecMean(nSpecies), Xi_VibRelSpec(nSpecies), CellTempRel +REAL :: TVibSpec(nSpecies), TRotSpec(nSpecies), VibRelaxWeightSpec(nSpecies), RotRelaxWeightSpec(nSpecies) +REAL :: collisionfreqSpec(nSpecies),rotrelaxfreqSpec(nSpecies), vibrelaxfreqSpec(nSpecies) !=================================================================================================================================== #ifdef CODE_ANALYZE ! Momentum and energy conservation check: summing up old values @@ -154,7 +154,7 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume, AveragingVal ! 2.) Calculation of the relaxation frequency of the distribution function towards the target distribution function CALL CalcGasProperties(nSpec, dens, InnerDOF, totalWeightSpec, totalWeight, TotalMass, u2Spec, u0ij, u2, SpecTemp, CellTemp, & - Xi_VibSpec, Xi_RotSpec, Prandtl, relaxfreq, dynamicvis, thermalcond) + Xi_VibSpec, Xi_RotSpec, Prandtl, relaxfreq, dynamicvis, thermalcond, MassIC_Mixture) IF(DSMC%CalcQualityFactors) THEN BGK_MeanRelaxFactor = BGK_MeanRelaxFactor + relaxfreq * dtCell @@ -192,20 +192,7 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume, AveragingVal ! relaxfreqSpec = collisionfreqSpec / collision number Z with RelaxProb = 1/Z rotrelaxfreqSpec(:) = collisionfreqSpec(:) * DSMC%RotRelaxProb vibrelaxfreqSpec(:) = collisionfreqSpec(:) * DSMC%VibRelaxProb - RotExpSpec=0.; VibExpSpec=0. - - ! Calculation of the equilibrium temperature - CALL CalcTEquiMultiPoly(nPart, nSpec, nXiVibDOF, Xi_vib_DOF, CellTemp, TRotSpec, TVibSpec, Xi_VibSpec, Xi_Vib_oldSpec, RotExpSpec, VibExpSpec, & - TEqui, rotrelaxfreqSpec, vibrelaxfreqSpec, dtCell) - ! IF(SpecDSMC(1)%PolyatomicMol) THEN ! polyatomic, NO MIXTURES POSSIBLE BY NOW - ! CALL CalcTEquiPoly(nPart, CellTemp, TRotSpec(1), TVibSpec(1), nXiVibDOF, Xi_vib_DOF, Xi_Vib_oldSpec(1), RotExpSpec(1), VibExpSpec(1), & - ! TEqui, rotrelaxfreqSpec(1), vibrelaxfreqSpec(1), dtCell) - ! ! Corrected vibrational degrees of freedom - ! Xi_VibSpec(1) = SUM(Xi_vib_DOF(1:PolyatomMolDSMC(iPolyatMole)%VibDOF)) - ! ELSE ! diatomic - ! CALL CalcTEquiMulti(nPart, nSpec, CellTemp, TRotSpec, TVibSpec, Xi_VibSpec, Xi_Vib_oldSpec, RotExpSpec, VibExpSpec, & - ! TEqui, rotrelaxfreqSpec, vibrelaxfreqSpec, dtCell) - ! END IF + IF(DSMC%CalcQualityFactors) THEN BGK_MaxRotRelaxFactor = MAX(BGK_MaxRotRelaxFactor,MAXVAL(rotrelaxfreqSpec(:))*dtCell) END IF @@ -217,25 +204,36 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume, AveragingVal ALLOCATE(iPartIndx_NodeRelaxRot(nPart),iPartIndx_NodeRelaxVib(nPart)) iPartIndx_NodeRelaxRot = 0; iPartIndx_NodeRelaxVib = 0 -CALL DetermineRelaxPart(nPart, iPartIndx_Node, relaxfreq, dtCell, RotExpSpec, VibExpSpec, nRelax, nRotRelax, nVibRelax, & - nRotRelaxSpec, nVibRelaxSpec, iPartIndx_NodeRelax, iPartIndx_NodeRelaxTemp, iPartIndx_NodeRelaxRot, & - iPartIndx_NodeRelaxVib, vBulk, OldEnRot, OldEn) +CALL DetermineRelaxPart(nPart, iPartIndx_Node, relaxfreq, dtCell, nRelax, nRotRelax, nVibRelax, & + RotRelaxWeightSpec, VibRelaxWeightSpec, iPartIndx_NodeRelax, iPartIndx_NodeRelaxTemp, iPartIndx_NodeRelaxRot, & + iPartIndx_NodeRelaxVib, vBulk, OldEnRot, OldEn, rotrelaxfreqSpec, vibrelaxfreqSpec) ! Return if no particles are undergoing a relaxation IF ((nRelax.EQ.0).AND.(nRotRelax.EQ.0).AND.(nVibRelax.EQ.0)) RETURN +! Allocate VibEnergyDOF IF(BGKDoVibRelaxation) THEN - IF(SpecDSMC(1)%PolyatomicMol) THEN - ALLOCATE(VibEnergyDOF(nVibRelax,PolyatomMolDSMC(iPolyatMole)%VibDOF)) - END IF + IF(ANY(SpecDSMC(:)%PolyatomicMol)) THEN + ALLOCATE(VibEnergyDOF(nVibRelax,nXiVibDOF)) + END IF END IF ! 5.) Determine the new rotational and vibrational state of molecules undergoing a relaxation -CALL RelaxInnerEnergy(nPart, nVibRelax, nRotRelax, iPartIndx_NodeRelaxVib, iPartIndx_NodeRelaxRot, nXiVibDOF, Xi_vib_DOF, Xi_VibSpec, & - Xi_RotSpec , TEqui, VibEnergyDOF, NewEnVib, NewEnRot) +IF(ANY(SpecDSMC(:)%InterID.EQ.2).OR.ANY(SpecDSMC(:)%InterID.EQ.20)) THEN + + CALL CalcTRelax(ERotSpec, Xi_RotSpec, EVibSpec, totalWeightSpec, CellTemp, relaxfreq, rotrelaxfreqSpec, & + vibrelaxfreqSpec, ERotTtransSpecMean, EVibTtransSpecMean, Xi_VibRelSpec, Xi_vib_DOF, nXiVibDOF, CellTempRel) + + CALL RelaxInnerEnergy(nVibRelax, nRotRelax, iPartIndx_NodeRelaxVib, iPartIndx_NodeRelaxRot, nXiVibDOF, Xi_vib_DOF, & + Xi_VibRelSpec, Xi_RotSpec, VibEnergyDOF, CellTemp, NewEnVib, NewEnRot) + +ELSE + CellTempRel = CellTemp +END IF ! 6.) Sample new particle velocities from the target distribution function, depending on the chosen model -CALL SampleFromTargetDistr(nRelax, iPartIndx_NodeRelax, Prandtl, u2, u0ij, u2i, vBulkAll, CellTemp, vBulk) +CALL SampleFromTargetDistr(nRelax, iPartIndx_NodeRelax, Prandtl, u2, u0ij, u2i, vBulkAll, CellTempRel, CellTemp, vBulk, & + MassIC_Mixture) NewEn = 0. @@ -265,21 +263,20 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume, AveragingVal ! 7.) Vibrational energy of the molecules: Ensure energy conservation by scaling the new vibrational states with the factor alpha IF(ANY(SpecDSMC(:)%InterID.EQ.2).OR.ANY(SpecDSMC(:)%InterID.EQ.20)) THEN - CALL EnergyConsVib(nPart, nVibRelax, nVibRelaxSpec, iPartIndx_NodeRelaxVib, NewEnVib, OldEn, nXiVibDOF, Xi_VibSpec, VibEnergyDOF, TEqui) + CALL EnergyConsVib(nPart, nVibRelax, VibRelaxWeightSpec, iPartIndx_NodeRelaxVib, NewEnVib, OldEn, nXiVibDOF, VibEnergyDOF, & + CellTemp, EVibTtransSpecMean) END IF ! Remaining vibrational (+ translational) energy + rotational energy for translation and rotation OldEn = OldEn + OldEnRot - -! 8.) Determine the new particle state and ensure energy conservation by scaling the new velocities with the factor alpha -Xi_RotTotal = 0.0 -! ! Total number of relaxing rotational degrees of freedom DO iSpec = 1, nSpecies - Xi_RotTotal = Xi_RotTotal + Xi_RotSpec(iSpec)*nRotRelaxSpec(iSpec) + ! ERotTtransSpecMean(iSpec)*RotRelaxWeightSpec(iSpec) is energy that should be in rotation + OldEn = OldEn - ERotTtransSpecMean(iSpec)*RotRelaxWeightSpec(iSpec) END DO -! Calculation of scaling factor alpha, see M. Pfeiffer, "Extending the particle ellipsoidal statistical Bhatnagar-Gross-Krook method -! to diatomic molecules including quantized vibrational energies", Phys. Fluids 30, 116103 (2018) -alpha = SQRT(OldEn/NewEn*(3.*(nPart-1.))/(Xi_RotTotal+3.*(nPart-1.))) + +! 8.) Determine the new particle state and ensure energy conservation by scaling the new velocities with the factor alpha +! Calculation of scaling factor alpha +alpha = SQRT(OldEn/NewEn) ! Calculation of the final particle velocities with vBulkAll (average flow velocity before relaxation), scaling factor alpha, ! the particle velocity PartState(4:6,iPart) after the relaxation but before the energy conservation and vBulk (average value of ! the latter) @@ -297,7 +294,7 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume, AveragingVal ! Calculate scaling factor alpha per species, see M. Pfeiffer, "Extending the particle ellipsoidal statistical Bhatnagar-Gross- ! Krook method to diatomic molecules including quantized vibrational energies", Phys. Fluids 30, 116103 (2018) IF (NewEnRot(iSpec).GT.0.0) THEN - alphaRot(iSpec) = OldEn/NewEnRot(iSpec)*(Xi_RotSpec(iSpec)*nRotRelaxSpec(iSpec)/(Xi_RotTotal+3.*(nPart-1.))) + alphaRot(iSpec) = ERotTtransSpecMean(iSpec)*RotRelaxWeightSpec(iSpec)/NewEnRot(iSpec) ELSE alphaRot(iSpec) = 0.0 END IF @@ -655,7 +652,7 @@ END SUBROUTINE CalcInnerDOFs SUBROUTINE CalcGasProperties(nSpec, dens, InnerDOF, totalWeightSpec, totalWeight, TotalMass, u2Spec, u0ij, u2, SpecTemp, CellTemp, & - Xi_VibSpec, Xi_RotSpec, Prandtl, relaxfreq, dynamicvis, thermalcond) + Xi_VibSpec, Xi_RotSpec, Prandtl, relaxfreq, dynamicvis, thermalcond, MassIC_Mixture) !=================================================================================================================================== !> Calculate the reference dynamic viscosity, Prandtl number and the resulting relaxation frequency of the distribution function !=================================================================================================================================== @@ -673,17 +670,17 @@ SUBROUTINE CalcGasProperties(nSpec, dens, InnerDOF, totalWeightSpec, totalWeight REAL, INTENT(IN) :: u0ij(3,3), u2, Xi_VibSpec(nSpecies), Xi_RotSpec(nSpecies), dens, InnerDOF !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES -REAL, INTENT(OUT) :: Prandtl, relaxfreq, dynamicvis, thermalcond +REAL, INTENT(OUT) :: Prandtl, relaxfreq, dynamicvis, thermalcond, MassIC_Mixture !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES INTEGER :: iSpec, jSpec, INFO -REAL :: MolarFraction(1:nSpecies), MassFraction(1:nSpecies), MassIC_Mixture, DOFFraction(1:nSpecies) +REAL :: MolarFraction(1:nSpecies), DOFFraction(1:nSpecies), MassFraction(1:nSpecies) REAL :: PrandtlCorrection, dynamicvisSpec(nSpecies), thermalcondSpec(nSpecies), Phi(nSpecies) REAL :: TotalDOFWeight, C_P, nu, A(3,3), W(3), Theta, CellTempSpec(nSpecies+1), Work(100) !=================================================================================================================================== +MassIC_Mixture = TotalMass / totalWeight IF (nSpecies.GT.1) THEN ! gas mixture MolarFraction(1:nSpecies) = totalWeightSpec(1:nSpecies) / totalWeight - MassIC_Mixture = TotalMass / totalWeight MassFraction(1:nSpecies) = MolarFraction(1:nSpecies) * Species(1:nSpecies)%MassIC / MassIC_Mixture DOFFraction(1:nSpecies) = totalWeightSpec(1:nSpecies) * (5.+Xi_RotSpec(1:nSpecies)+Xi_VibSpec(1:nSpecies)) TotalDOFWeight = SUM(DOFFraction) @@ -758,7 +755,8 @@ SUBROUTINE CalcGasProperties(nSpec, dens, InnerDOF, totalWeightSpec, totalWeight END IF END DO CellTempSpec(nSpecies+1) = CellTemp - CALL CalcViscosityThermalCondColIntVHS(CellTempSpec(1:nSpecies+1), MolarFraction(1:nSpecies),dens, Xi_RotSpec, Xi_VibSpec, dynamicvis, thermalcond) + CALL CalcViscosityThermalCondColIntVHS(CellTempSpec(1:nSpecies+1), MolarFraction(1:nSpecies),dens, Xi_RotSpec, Xi_VibSpec, & + dynamicvis, thermalcond) END SELECT ! Calculation of Prandtl number @@ -796,9 +794,9 @@ SUBROUTINE CalcGasProperties(nSpec, dens, InnerDOF, totalWeightSpec, totalWeight END SUBROUTINE CalcGasProperties -SUBROUTINE DetermineRelaxPart(nPart, iPartIndx_Node, relaxfreq, dtCell, RotExpSpec, VibExpSpec, nRelax, nRotRelax, nVibRelax, & - nRotRelaxSpec, nVibRelaxSpec, iPartIndx_NodeRelax, iPartIndx_NodeRelaxTemp, iPartIndx_NodeRelaxRot, & - iPartIndx_NodeRelaxVib, vBulk, OldEnRot, OldEn) +SUBROUTINE DetermineRelaxPart(nPart, iPartIndx_Node, relaxfreq, dtCell, nRelax, nRotRelax, nVibRelax, & + RotRelaxWeightSpec, VibRelaxWeightSpec, iPartIndx_NodeRelax, iPartIndx_NodeRelaxTemp, iPartIndx_NodeRelaxRot, & + iPartIndx_NodeRelaxVib, vBulk, OldEnRot, OldEn, rotrelaxfreqSpec, vibrelaxfreqSpec) !=================================================================================================================================== !> Determine the number of particles undergoing a relaxation (including vibration and rotation) !=================================================================================================================================== @@ -812,74 +810,194 @@ SUBROUTINE DetermineRelaxPart(nPart, iPartIndx_Node, relaxfreq, dtCell, RotExpSp !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES INTEGER, INTENT(IN) :: nPart, iPartIndx_Node(nPart) -REAL, INTENT(IN) :: relaxfreq, dtCell, RotExpSpec(nSpecies), VibExpSpec(nSpecies) +REAL, INTENT(IN) :: relaxfreq, dtCell, rotrelaxfreqSpec(nSpecies), vibrelaxfreqSpec(nSpecies) !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES -INTEGER, INTENT(OUT) :: nRelax, iPartIndx_NodeRelax(nPart), iPartIndx_NodeRelaxTemp(nPart) -INTEGER, INTENT(OUT) :: iPartIndx_NodeRelaxRot(nPart), iPartIndx_NodeRelaxVib(nPart) -INTEGER, INTENT(OUT) :: nRotRelax, nVibRelax, nRotRelaxSpec(nSpecies), nVibRelaxSpec(nSpecies) -REAL, INTENT(OUT) :: vBulk(3), OldEnRot +INTEGER, INTENT(OUT) :: iPartIndx_NodeRelax(:), iPartIndx_NodeRelaxTemp(:) +INTEGER, INTENT(OUT) :: iPartIndx_NodeRelaxRot(:), iPartIndx_NodeRelaxVib(:) +INTEGER, INTENT(OUT) :: nRelax, nRotRelax, nVibRelax +REAL, INTENT(OUT) :: vBulk(3), OldEnRot, RotRelaxWeightSpec(nSpecies), VibRelaxWeightSpec(nSpecies) !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT-OUTPUT VARIABLES REAL, INTENT(INOUT) :: OldEn !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -INTEGER :: iPart, nNotRelax, iSpec, iLoop -REAL :: ProbAddPartTrans, iRan, partWeight +INTEGER :: iPart, iSpec, iLoop, iPick, iLoopRot, iLoopVib +REAL :: ProbAddPartTrans, iRan, partWeight, ProbAddPartRot, ProbAddPartVib !=================================================================================================================================== -nVibRelaxSpec =0; nRotRelaxSpec =0; nRelax=0; nNotRelax=0; vBulk=0.0; nRotRelax=0; nVibRelax=0; OldEnRot=0.0 +VibRelaxWeightSpec =0; RotRelaxWeightSpec =0; nRelax=0; vBulk=0.0; nRotRelax=0; nVibRelax=0; OldEnRot=0.0 +iLoopRot=1; iLoopVib=1 ! Calculate probability of relaxation of a particle towards the target distribution function ProbAddPartTrans = 1.-EXP(-relaxfreq*dtCell) -! Loop over all simulation particles -DO iLoop = 1, nPart - iPart = iPartIndx_Node(iLoop) - iSpec = PartSpecies(iPart) - partWeight = GetParticleWeight(iPart) +CALL RANDOM_NUMBER(iRan) +! Calculate the number of relaxing particles +nRelax = INT(REAL(nPart) * ProbAddPartTrans + iRan) +! List of non-relaxing particles +iPartIndx_NodeRelaxTemp(:) = iPartIndx_Node(:) +! Relaxing particles +DO iLoop = 1, nRelax CALL RANDOM_NUMBER(iRan) - ! Count particles that are undergoing a relaxation - IF (ProbAddPartTrans.GT.iRan) THEN - nRelax = nRelax + 1 - iPartIndx_NodeRelax(nRelax) = iPart - ! Count particles that are not undergoing a relaxation - ELSE - nNotRelax = nNotRelax + 1 - iPartIndx_NodeRelaxTemp(nNotRelax) = iPart - ! Sum up velocities of non-relaxing particles for bulk velocity - vBulk(1:3) = vBulk(1:3) + PartState(4:6,iPart)*Species(iSpec)%MassIC*partWeight - END IF - + iPick = INT(iRan * (nPart-iLoop+1)) + 1 + iPart = iPartIndx_NodeRelaxTemp(iPick) + partWeight = GetParticleWeight(iPart) + iSpec = PartSpecies(iPart) + iPartIndx_NodeRelax(iLoop) = iPart + iPartIndx_NodeRelaxTemp(iPick) = iPartIndx_NodeRelaxTemp(nPart-iLoop+1) ! For molecules: relaxation of inner DOF IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN ! Rotation CALL RANDOM_NUMBER(iRan) - ! Count particles that are undergoing a relaxation, in total and per species - IF ((1.-RotExpSpec(iSpec)).GT.iRan) THEN + ! Calculate probability of rotational relaxation of a particle that relaxes towards the target distribution function + ProbAddPartRot = rotrelaxfreqSpec(iSpec)/relaxfreq + IF (ProbAddPartRot.GT.iRan) THEN + ! relaxation + iPartIndx_NodeRelaxRot(iLoopRot) = iPartIndx_NodeRelax(iLoop) nRotRelax = nRotRelax + 1 - nRotRelaxSpec(iSpec) = nRotRelaxSpec(iSpec) + 1 - iPartIndx_NodeRelaxRot(nRotRelax) = iPart + iLoopRot = iLoopRot + 1 + RotRelaxWeightSpec(iSpec) = RotRelaxWeightSpec(iSpec) + partWeight ! Sum up total rotational energy OldEnRot = OldEnRot + PartStateIntEn(2,iPart) * partWeight END IF ! Vibration IF(BGKDoVibRelaxation) THEN CALL RANDOM_NUMBER(iRan) - ! Count particles that are undergoing a relaxation, in total and per species - IF ((1.-VibExpSpec(iSpec)).GT.iRan) THEN + ! Calculate probability of vibrational relaxation of a particle that relaxes towards the target distribution function + ProbAddPartVib = vibrelaxfreqSpec(iSpec)/relaxfreq + IF (ProbAddPartVib.GT.iRan) THEN + ! relaxation + iPartIndx_NodeRelaxVib(iLoopVib) = iPartIndx_NodeRelax(iLoop) nVibRelax = nVibRelax + 1 - nVibRelaxSpec(iSpec) = nVibRelaxSpec(iSpec) + 1 - iPartIndx_NodeRelaxVib(nVibRelax) = iPart + VibRelaxWeightSpec(iSpec) = VibRelaxWeightSpec(iSpec) + partWeight ! Sum up total vibrational energy of all relaxing particles, considering zero-point energy, and add to translational energy - OldEn = OldEn + (PartStateIntEn(1,iPartIndx_NodeRelaxVib(nVibRelax)) - SpecDSMC(iSpec)%EZeroPoint) * partWeight + OldEn = OldEn + (PartStateIntEn(1,iPartIndx_NodeRelaxVib(iLoopVib)) - SpecDSMC(iSpec)%EZeroPoint) * partWeight + iLoopVib = iLoopVib + 1 END IF END IF END IF END DO +! Non-relaxing particles +! nNonRelax = nPart-nRelax +DO iLoop = 1, nPart-nRelax + iPart = iPartIndx_NodeRelaxTemp(iLoop) + partWeight = GetParticleWeight(iPart) + iSpec = PartSpecies(iPart) + ! iPartIndx_NodeNonRelax(iLoop) + ! Sum up velocities of non-relaxing particles for bulk velocity + vBulk(1:3) = vBulk(1:3) + PartState(4:6,iPart)*Species(iSpec)%MassIC*partWeight +END DO + END SUBROUTINE DetermineRelaxPart -SUBROUTINE RelaxInnerEnergy(nPart, nVibRelax, nRotRelax, iPartIndx_NodeRelaxVib, iPartIndx_NodeRelaxRot, nXiVibDOF, Xi_vib_DOF, Xi_VibSpec, & - Xi_RotSpec , TEqui, VibEnergyDOF, NewEnVib, NewEnRot) +SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, EVibSpec, totalWeightSpec, CellTemp, relaxfreq, rotrelaxfreqSpec, & + vibrelaxfreqSpec, ERotTtransSpecMean, EVibTtransSpecMean, Xi_VibRelSpec, Xi_vib_DOF, nXiVibDOF, CellTempRel) +!=================================================================================================================================== +!> Calculate the relaxation energies and temperatures +!=================================================================================================================================== +! MODULES +USE MOD_Particle_Vars ,ONLY: nSpecies +USE MOD_DSMC_Vars ,ONLY: PolyatomMolDSMC, SpecDSMC +USE MOD_BGK_Vars ,ONLY: BGKDoVibRelaxation +USE MOD_Globals_Vars ,ONLY: BoltzmannConst +USE MOD_Globals ,ONLY: abort +! IMPLICIT VARIABLE HANDLING + IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES +INTEGER, INTENT(IN) :: nXiVibDOF +REAL, INTENT(IN) :: ERotSpec(nSpecies), Xi_RotSpec(nSpecies), EVibSpec(nSpecies) +REAL, INTENT(IN) :: totalWeightSpec(nSpecies), CellTemp!, MassFraction(nSpecies) +REAL, INTENT(IN) :: relaxfreq, rotrelaxfreqSpec(nSpecies), vibrelaxfreqSpec(nSpecies) +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +REAL, INTENT(OUT) :: ERotTtransSpecMean(nSpecies), EVibTtransSpecMean(nSpecies) +REAL, INTENT(OUT) :: Xi_VibRelSpec(nSpecies), Xi_vib_DOF(nSpecies,nXiVibDOF), CellTempRel +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +INTEGER :: iSpec, iDOF, iPolyatMole +REAL :: ERotSpecMean(nSpecies), EVibSpecMean(nSpecies), TVibRelSpecMean, ETransRelMean +REAL :: EVibTtransPoly, TVibRelPoly +!=================================================================================================================================== +! According to J. Mathiaud et. al., "An ES-BGK model for diatomic gases with correct relaxation rates for internal energies", +! European Journal of Mechanics - B/Fluids, 96, pp. 65-77, 2022 + +ERotSpecMean=0.0; ERotTtransSpecMean=0.0; EVibSpecMean=0.0; EVibTtransSpecMean=0.0; Xi_VibRelSpec=0.0; Xi_vib_DOF=0.0 +ETransRelMean=0.0; CellTempRel=0.0 + +DO iSpec = 1, nSpecies + IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN + ! Mean rotational energy per particle of a species + ERotSpecMean(iSpec) = ERotSpec(iSpec)/totalWeightSpec(iSpec) + ! Mean rotational energy per particle of a species for the mixture translational temperature, ERot(Ttrans) + ERotTtransSpecMean(iSpec) = CellTemp * Xi_RotSpec(iSpec) * BoltzmannConst /2. + ! Mean rotational energy per particle of a species to satisfy the Landau-Teller equation + + IF(BGKDoVibRelaxation) THEN + ! Mean vibrational energy per particle of a species + EVibSpecMean(iSpec) = EVibSpec(iSpec)/totalWeightSpec(iSpec) + + IF(SpecDSMC(iSpec)%PolyatomicMol) THEN ! polyatomic + iPolyatMole = SpecDSMC(iSpec)%SpecToPolyArray + ! Loop over all vibrational DOF + DO iDOF = 1, PolyatomMolDSMC(iPolyatMole)%VibDOF + ! Mean vibrational energy per DOF for the mixture translational temperature, EVib(Ttrans) + EVibTtransPoly = BoltzmannConst * PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF) / & + (EXP(PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)/CellTemp) - 1.) + ! Mean vibrational energy per particle of a species for the mixture translational temperature, EVib(Ttrans) + EVibTtransSpecMean(iSpec) = EVibTtransSpecMean(iSpec) + EVibTtransPoly + ! Mean vibrational temperature per DOF to satisfy the Landau-Teller equation + TVibRelPoly = EVibTtransPoly / (BoltzmannConst*PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)) + IF (TVibRelPoly.GT.0.0) THEN + TVibRelPoly = PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)/LOG(1. + 1./TVibRelPoly) + ! Calculation of the vibrational degrees of freedeom to satisfy the Landau-Teller equation + Xi_vib_DOF(iSpec,iDOF) = 2.* EVibTtransPoly / (BoltzmannConst*TVibRelPoly) + ELSE + Xi_vib_DOF(iSpec,iDOF) = 0.0 + END IF + END DO + + ELSE ! diatomic + ! Mean vibrational energy per particle of a species for the mixture translational temperature, EVib(Ttrans) + EVibTtransSpecMean(iSpec) = BoltzmannConst * SpecDSMC(iSpec)%CharaTVib / (EXP(SpecDSMC(iSpec)%CharaTVib/CellTemp) - 1.) + ! Mean vibrational temperature per particle of a species to satisfy the Landau-Teller equation + TVibRelSpecMean = EVibTtransSpecMean(iSpec) / (BoltzmannConst*SpecDSMC(iSpec)%CharaTVib) + IF (TVibRelSpecMean.GT.0.0) THEN + TVibRelSpecMean = SpecDSMC(iSpec)%CharaTVib/LOG(1. + 1./(TVibRelSpecMean)) + ! Calculation of the vibrational degrees of freedeom to satisfy the Landau-Teller equation + Xi_VibRelSpec(iSpec) = 2.* EVibTtransSpecMean(iSpec) / (BoltzmannConst*TVibRelSpecMean) + ! No negative temperature possible + ELSE + Xi_VibRelSpec(iSpec) = 0.0 + END IF + END IF + END IF + + ! Mean translational energy per particle to satisfy the Landau-Teller equation + ETransRelMean = ETransRelMean + (3./2. * BoltzmannConst * CellTemp - (rotrelaxfreqSpec(iSpec)/relaxfreq) * & + (ERotTtransSpecMean(iSpec)-ERotSpecMean(iSpec))) * totalWeightSpec(iSpec) + IF (BGKDoVibRelaxation) THEN + ETransRelMean = ETransRelMean - (vibrelaxfreqSpec(iSpec)/relaxfreq)*(EVibTtransSpecMean(iSpec)-EVibSpecMean(iSpec)) * & + totalWeightSpec(iSpec) + END IF + ELSE + ! Mean translational energy per particle to satisfy the Landau-Teller equation + ETransRelMean = ETransRelMean + 3./2. * BoltzmannConst * CellTemp * totalWeightSpec(iSpec) + END IF +END DO + +! Calculation of the cell temperature with ETransRelMean to satisfy the Landau-Teller equation +IF (ETransRelMean.GT.0.0) THEN + CellTempRel = 2. * ETransRelMean / (3. * BoltzmannConst) +ELSE + CALL abort(__STAMP__,'Negative energy for relaxation') +END IF + +END SUBROUTINE CalcTRelax + + +SUBROUTINE RelaxInnerEnergy(nVibRelax, nRotRelax, iPartIndx_NodeRelaxVib, iPartIndx_NodeRelaxRot, nXiVibDOF, Xi_vib_DOF, & + Xi_VibSpec, Xi_RotSpec, VibEnergyDOF, CellTemp, NewEnVib, NewEnRot) !=================================================================================================================================== !> Determine the new rotational and vibrational energy of relaxing particles !=================================================================================================================================== @@ -893,9 +1011,10 @@ SUBROUTINE RelaxInnerEnergy(nPart, nVibRelax, nRotRelax, iPartIndx_NodeRelaxVib, IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES -INTEGER, INTENT(IN) :: nPart,nXiVibDOF -INTEGER, INTENT(IN) :: nVibRelax, nRotRelax, iPartIndx_NodeRelaxVib(nPart), iPartIndx_NodeRelaxRot(nPart) -REAL, INTENT(IN) :: Xi_vib_DOF(nSpecies,nXiVibDOF), TEqui, Xi_VibSpec(nSpecies), Xi_RotSpec(nSpecies) +INTEGER, INTENT(IN) :: nXiVibDOF +INTEGER, INTENT(IN) :: nVibRelax, nRotRelax, iPartIndx_NodeRelaxVib(nVibRelax), iPartIndx_NodeRelaxRot(nRotRelax) +REAL, INTENT(IN) :: Xi_vib_DOF(nSpecies,nXiVibDOF), Xi_VibSpec(nSpecies), Xi_RotSpec(nSpecies) +REAL, INTENT(IN) :: CellTemp REAL, INTENT(INOUT) :: NewEnVib(nSpecies), NewEnRot(nSpecies) !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES @@ -914,21 +1033,21 @@ SUBROUTINE RelaxInnerEnergy(nPart, nVibRelax, nRotRelax, iPartIndx_NodeRelaxVib, partWeight = GetParticleWeight(iPart) ! polyatomic, more than one vibrational DOF IF(SpecDSMC(iSpec)%PolyatomicMol) THEN - iPolyatMole = SpecDSMC(iSpec)%SpecToPolyArray - PartStateIntEn(1,iPart) = 0.0 - ! Sum up the new vibrational energy over all DOFs, see M. Pfeiffer et. al., "Extension of Particle-based BGK Models to - ! Polyatomic Species in Hypersonic Flow around a Flat-faced Cylinder", AIP Conference Proceedings 2132, 100001 (2019) - DO iDOF = 1, PolyatomMolDSMC(iPolyatMole)%VibDOF - CALL RANDOM_NUMBER(iRan) - VibEnergyDOF(iLoop,iDOF) = - LOG(iRan)*Xi_vib_DOF(iSpec,iDOF)/2.*TEqui*BoltzmannConst - PartStateIntEn(1,iPart) = PartStateIntEn(1,iPart)+VibEnergyDOF(iLoop,iDOF) - END DO + iPolyatMole = SpecDSMC(iSpec)%SpecToPolyArray + PartStateIntEn(1,iPart) = 0.0 + ! Sum up the new vibrational energy over all DOFs, see M. Pfeiffer et. al., "Extension of Particle-based BGK Models to + ! Polyatomic Species in Hypersonic Flow around a Flat-faced Cylinder", AIP Conference Proceedings 2132, 100001 (2019) + DO iDOF = 1, PolyatomMolDSMC(iPolyatMole)%VibDOF + CALL RANDOM_NUMBER(iRan) + VibEnergyDOF(iLoop,iDOF) = - LOG(iRan)*Xi_vib_DOF(iSpec,iDOF)/2.*CellTemp*BoltzmannConst + PartStateIntEn(1,iPart) = PartStateIntEn(1,iPart)+VibEnergyDOF(iLoop,iDOF) + END DO ! ELSE: diatomic, only one vibrational DOF, calculate new vibrational energy according to M. Pfeiffer, "Extending the particle ! ellipsoidal statistical Bhatnagar-Gross-Krook method to diatomic molecules including quantized vibrational energies", ! Phys. Fluids 30, 116103 (2018) ELSE CALL RANDOM_NUMBER(iRan) - PartStateIntEn( 1,iPart) = -LOG(iRan)*Xi_VibSpec(iSpec)/2.*TEqui*BoltzmannConst + PartStateIntEn( 1,iPart) = -LOG(iRan)*Xi_VibSpec(iSpec)/2.*CellTemp*BoltzmannConst END IF ! Sum up new vibrational energy per species NewEnVib(iSpec) = NewEnVib(iSpec) + PartStateIntEn(1,iPart) * partWeight @@ -942,7 +1061,7 @@ SUBROUTINE RelaxInnerEnergy(nPart, nVibRelax, nRotRelax, iPartIndx_NodeRelaxVib, CALL RANDOM_NUMBER(iRan) ! Calculate new rotational energy according to M. Pfeiffer et. al., "Extension of Particle-based BGK Models to Polyatomic Species ! in Hypersonic Flow around a Flat-faced Cylinder", AIP Conference Proceedings 2132, 100001 (2019) - PartStateIntEn( 2,iPart) = -Xi_RotSpec(iSpec) / 2. * BoltzmannConst*TEqui*LOG(iRan) + PartStateIntEn( 2,iPart) = -Xi_RotSpec(iSpec) / 2. * BoltzmannConst*CellTemp*LOG(iRan) ! Sum up new rotational energy per species NewEnRot(iSpec) = NewEnRot(iSpec) + PartStateIntEn( 2,iPart) * partWeight END DO @@ -950,7 +1069,8 @@ SUBROUTINE RelaxInnerEnergy(nPart, nVibRelax, nRotRelax, iPartIndx_NodeRelaxVib, END SUBROUTINE RelaxInnerEnergy -SUBROUTINE SampleFromTargetDistr(nRelax, iPartIndx_NodeRelax, Prandtl, u2, u0ij, u2i, vBulkAll, CellTemp, vBulk) +SUBROUTINE SampleFromTargetDistr(nRelax, iPartIndx_NodeRelax, Prandtl, u2, u0ij, u2i, vBulkAll, CellTempRel, CellTemp, vBulk, & + MassIC_Mixture) !=================================================================================================================================== !> Sample new particle velocities from the target distribution function, depending on the chosen model !=================================================================================================================================== @@ -964,7 +1084,7 @@ SUBROUTINE SampleFromTargetDistr(nRelax, iPartIndx_NodeRelax, Prandtl, u2, u0ij, !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES INTEGER, INTENT(IN) :: nRelax, iPartIndx_NodeRelax(:) -REAL, INTENT(IN) :: Prandtl, u2, u0ij(3,3), u2i(3), vBulkAll(3), CellTemp +REAL, INTENT(IN) :: Prandtl, u2, u0ij(3,3), u2i(3), vBulkAll(3), CellTempRel, CellTemp, MassIC_Mixture REAL, INTENT(INOUT) :: vBulk(3) !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES @@ -988,8 +1108,13 @@ SUBROUTINE SampleFromTargetDistr(nRelax, iPartIndx_NodeRelax, Prandtl, u2, u0ij, KronDelta = 0.0 END IF ! Fill symmetric transformation matrix SMat with anisotopic matrix A = SS - SMat(fillMa1, fillMa2)= KronDelta - (1.-Prandtl)/(2.*Prandtl) & - *(3./u2*u0ij(fillMa1, fillMa2)-KronDelta) + ! = Open work: calculation per species? ========================================================================== + SMat(fillMa1, fillMa2)= KronDelta*CellTempRel*BoltzmannConst/MassIC_Mixture - (1.-Prandtl)/(2.*Prandtl) & + *(u0ij(fillMa1, fillMa2)-KronDelta*CellTemp*BoltzmannConst/MassIC_Mixture) + ! SMat(fillMa1, fillMa2)= KronDelta*CellTempRel/CellTemp - (1.-Prandtl)/(2.*Prandtl) & + ! *(3./u2*u0ij(fillMa1, fillMa2)-KronDelta) + ! SMat(fillMa1, fillMa2)= KronDelta*CellTempRel - (1.-Prandtl)/(2.*Prandtl) & + ! *(u0ij(fillMa1, fillMa2)-KronDelta*CellTemp) END DO END DO SMat(2,1)=SMat(1,2) @@ -1006,7 +1131,8 @@ SUBROUTINE SampleFromTargetDistr(nRelax, iPartIndx_NodeRelax, Prandtl, u2, u0ij, KronDelta = 0.0 END IF ! Fill anisotopic matrix A - A(fillMa1, fillMa2) = KronDelta - (1.-Prandtl)/Prandtl*(3.*u0ij(fillMa1, fillMa2)/u2 - KronDelta) + A(fillMa1, fillMa2) = KronDelta*CellTempRel*BoltzmannConst/MassIC_Mixture - (1.-Prandtl)/Prandtl*(u0ij(fillMa1, fillMa2) & + - KronDelta*CellTemp*BoltzmannConst/MassIC_Mixture) END DO END DO IF (ESBGKModel.EQ.2) THEN @@ -1025,8 +1151,8 @@ SUBROUTINE SampleFromTargetDistr(nRelax, iPartIndx_NodeRelax, Prandtl, u2, u0ij, ELSE KronDelta = 0.0 END IF - SMat(fillMa1, fillMa2)= KronDelta - (1.-Prandtl)/(2.*Prandtl) & - *(3./u2*u0ij(fillMa1, fillMa2)-KronDelta) + SMat(fillMa1, fillMa2)= KronDelta*CellTempRel*BoltzmannConst/MassIC_Mixture - (1.-Prandtl)/(2.*Prandtl) & + *(u0ij(fillMa1, fillMa2)-KronDelta*CellTemp*BoltzmannConst/MassIC_Mixture) END DO END DO SMat(2,1)=SMat(1,2) @@ -1075,11 +1201,14 @@ SUBROUTINE SampleFromTargetDistr(nRelax, iPartIndx_NodeRelax, Prandtl, u2, u0ij, IF ((BGKCollModel.EQ.1).AND.(ESBGKModel.NE.3)) THEN ! Transformation of normalized thermal velocity vector tempVelo (sampled from a Maxwellian distribution) to a thermal velocity ! vector sampled from the ESBGK target distribution function (anisotropic Gaussian distribution) - tempVelo(1:3) = SQRT(BoltzmannConst*CellTemp/Species(iSpec)%MassIC)*iRanPart(1:3,iLoop) + tempVelo(1:3) = SQRT(MassIC_Mixture/Species(iSpec)%MassIC)*iRanPart(1:3,iLoop) PartState(4:6,iPart) = vBulkAll(1:3) + MATMUL(SMat,tempVelo) + ELSE IF ((BGKCollModel.EQ.1).AND.(ESBGKModel.EQ.3)) THEN + ! New thermal velocity (in x,y,z) of particle with mass scaling multiplied by normal distributed random vector + PartState(4:6,iPart) = vBulkAll(1:3) + SQRT(MassIC_Mixture/Species(iSpec)%MassIC)*iRanPart(1:3,iLoop) ELSE ! New thermal velocity (in x,y,z) of particle is sqrt(k_B*T/m) multiplied by normal distributed random vector - PartState(4:6,iPart) = vBulkAll(1:3) + SQRT(BoltzmannConst*CellTemp/Species(iSpec)%MassIC)*iRanPart(1:3,iLoop) + PartState(4:6,iPart) = vBulkAll(1:3) + SQRT(BoltzmannConst*CellTempRel/Species(iSpec)%MassIC)*iRanPart(1:3,iLoop) END IF partWeight = GetParticleWeight(iPart) ! Sum up new velocities of relaxing particles for bulk velocity, velocities of non-relaxing particles already calculated in @@ -1091,7 +1220,8 @@ SUBROUTINE SampleFromTargetDistr(nRelax, iPartIndx_NodeRelax, Prandtl, u2, u0ij, END SUBROUTINE SampleFromTargetDistr -SUBROUTINE EnergyConsVib(nPart, nVibRelax, nVibRelaxSpec, iPartIndx_NodeRelaxVib, NewEnVib, OldEn, nXiVibDOF, Xi_VibSpec, VibEnergyDOF, TEqui) +SUBROUTINE EnergyConsVib(nPart, nVibRelax, VibRelaxWeightSpec, iPartIndx_NodeRelaxVib, NewEnVib, OldEn, nXiVibDOF, & + VibEnergyDOF, CellTemp, EVibTtransSpecMean) !=================================================================================================================================== !> Routine to ensure energy conservation when including vibrational degrees of freedom (continuous and quantized) !=================================================================================================================================== @@ -1106,30 +1236,27 @@ SUBROUTINE EnergyConsVib(nPart, nVibRelax, nVibRelaxSpec, iPartIndx_NodeRelaxVib !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES INTEGER, INTENT(IN) :: nPart,nXiVibDOF -INTEGER, INTENT(IN) :: nVibRelax, iPartIndx_NodeRelaxVib(nPart), nVibRelaxSpec(nSpecies) -REAL, INTENT(IN) :: NewEnVib(nSpecies), VibEnergyDOF(nVibRelax,nXiVibDOF), Xi_VibSpec(nSpecies), TEqui +INTEGER, INTENT(IN) :: nVibRelax, iPartIndx_NodeRelaxVib(nPart) +REAL, INTENT(IN) :: VibRelaxWeightSpec(nSpecies) +REAL, INTENT(IN) :: NewEnVib(nSpecies), VibEnergyDOF(nVibRelax,nXiVibDOF), CellTemp, EVibTtransSpecMean(nSpecies) REAL, INTENT(INOUT) :: OldEn !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES INTEGER :: iPart, iLoop, iDOF, iSpec, iQuant, iQuaMax, iPolyatMole -REAL :: alpha(nSpecies), partWeight, betaV, iRan, MaxColQua, Xi_VibTotal +REAL :: alpha(nSpecies), partWeight, betaV, iRan, MaxColQua !=================================================================================================================================== ! According to M. Pfeiffer, "Extending the particle ellipsoidal statistical Bhatnagar-Gross-Krook method to diatomic molecules ! including quantized vibrational energies", Phys. Fluids 30, 116103 (2018) IF(BGKDoVibRelaxation) THEN ! Vibrational energy is positive for at least one species + there are vibrational relaxations IF (ANY(NewEnVib.GT.0.0).AND.(nVibRelax.GT.0)) THEN - Xi_VibTotal = 0.0 - ! Total number of relaxing vibrational degrees of freedom - DO iSpec = 1, nSpecies - Xi_VibTotal = Xi_VibTotal + Xi_VibSpec(iSpec)*nVibRelaxSpec(iSpec) - END DO ! Calculate scaling factor alpha per species + ! EVibTtransSpecMean(iSpec)*VibRelaxWeightSpec(iSpec) is energy that should be in vibration DO iSpec = 1, nSpecies IF (NewEnVib(iSpec).GT.0.0) THEN - alpha(iSpec) = OldEn/NewEnVib(iSpec)*(Xi_VibSpec(iSpec)*nVibRelaxSpec(iSpec)/(3.*(nPart-1.)+Xi_VibTotal)) + alpha(iSpec) = EVibTtransSpecMean(iSpec)*VibRelaxWeightSpec(iSpec)/NewEnVib(iSpec) ELSE alpha(iSpec) = 0. END IF @@ -1162,17 +1289,17 @@ SUBROUTINE EnergyConsVib(nPart, nVibRelax, nVibRelaxSpec, iPartIndx_NodeRelaxVib ELSE CALL RANDOM_NUMBER(iRan) ! Calculation of new iQuant - iQuant = INT(-LOG(iRan)*TEqui/PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)) + iQuant = INT(-LOG(iRan)*CellTemp/PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)) ! Determine maximum quantum number iQuaMax = MIN(INT(MaxColQua)+1, PolyatomMolDSMC(iPolyatMole)%MaxVibQuantDOF(iDOF)) ! Calculation of new iQuant as long as iQuant > maximum quantum number DO WHILE (iQuant.GE.iQuaMax) CALL RANDOM_NUMBER(iRan) - iQuant = INT(-LOG(iRan)*TEqui/PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)) + iQuant = INT(-LOG(iRan)*CellTemp/PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)) END DO END IF END IF - ! Sup up the vibrational energy over all vibrational DOF + ! Sum up the vibrational energy over all vibrational DOF PartStateIntEn( 1,iPart) = PartStateIntEn( 1,iPart) & + iQuant*PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)*BoltzmannConst VibQuantsPar(iPart)%Quants(iDOF) = iQuant @@ -1200,13 +1327,13 @@ SUBROUTINE EnergyConsVib(nPart, nVibRelax, nVibRelaxSpec, iPartIndx_NodeRelaxVib ELSE CALL RANDOM_NUMBER(iRan) ! Calculation of new iQuant - iQuant = INT(-LOG(iRan)*TEqui/SpecDSMC(iSpec)%CharaTVib) + iQuant = INT(-LOG(iRan)*CellTemp/SpecDSMC(iSpec)%CharaTVib) ! Determine maximum quantum number iQuaMax = MIN(INT(MaxColQua)+1, SpecDSMC(iSpec)%MaxVibQuant) ! Calculation of new iQuant as long as iQuant > maximum quantum number DO WHILE (iQuant.GE.iQuaMax) CALL RANDOM_NUMBER(iRan) - iQuant = INT(-LOG(iRan)*TEqui/SpecDSMC(iSpec)%CharaTVib) + iQuant = INT(-LOG(iRan)*CellTemp/SpecDSMC(iSpec)%CharaTVib) END DO END IF ! Calculate vibrational energy including zero-point energy @@ -1399,228 +1526,6 @@ SUBROUTINE BGK_BuildTransGaussNums(nPart, iRanPart) END SUBROUTINE BGK_BuildTransGaussNums -SUBROUTINE CalcTEquiMultiPoly(nPart, nSpec, nXiVibDOF, Xi_vib_DOF, CellTemp, TRotSpec, TVibSpec, Xi_Vib_Spec, Xi_Vib_oldSpec, RotExpSpec, & - VibExpSpec, TEqui, rotrelaxfreqSpec, vibrelaxfreqSpec, dtCell, DoVibRelaxIn) -!=================================================================================================================================== -! Calculation of the vibrational temperature (zero-point search) for polyatomic molecule mixtures -!=================================================================================================================================== -! MODULES -USE MOD_DSMC_Vars, ONLY: SpecDSMC, PolyatomMolDSMC -USE MOD_BGK_Vars, ONLY: BGKDoVibRelaxation -USE MOD_Particle_Vars, ONLY: nSpecies -! IMPLICIT VARIABLE HANDLING -IMPLICIT NONE -!----------------------------------------------------------------------------------------------------------------------------------- -! INPUT VARIABLES -REAL, INTENT(IN) :: CellTemp, TRotSpec(nSpecies), TVibSpec(nSpecies), Xi_Vib_oldSpec(nSpecies) -REAL, INTENT(IN) :: rotrelaxfreqSpec(nSpecies), vibrelaxfreqSpec(nSpecies), dtCell -INTEGER, INTENT(IN) :: nPart, nSpec(nSpecies), nXiVibDOF -LOGICAL, OPTIONAL, INTENT(IN) :: DoVibRelaxIn -!----------------------------------------------------------------------------------------------------------------------------------- -! OUTPUT VARIABLES -REAL, INTENT(OUT) :: Xi_Vib_Spec(nSpecies), TEqui, RotExpSpec(nSpecies), VibExpSpec(nSpecies) -REAL, INTENT(OUT) :: Xi_vib_DOF(nSpecies,nXiVibDOF) -!----------------------------------------------------------------------------------------------------------------------------------- -! LOCAL VARIABLES -!----------------------------------------------------------------------------------------------------------------------------------- -REAL :: TEqui_Old, betaR, betaV, RotFracSpec(nSpecies), VibFracSpec(nSpecies), TEqui_Old2 -REAL :: Xi_Rot_Spec(nSpecies) -REAL :: eps_prec=1.0E-0 -REAL :: exparg, TEquiNumDof -LOGICAL :: DoVibRelax -INTEGER :: iSpec, iDOF, iPolyatMole -!=================================================================================================================================== -IF (PRESENT(DoVibRelaxIn)) THEN - DoVibRelax = DoVibRelaxIn -ELSE - DoVibRelax = BGKDoVibRelaxation -END IF - -RotFracSpec = 0.0 -VibFracSpec = 0.0 - -! Loop over all molecular species --> only internal energies are relevant here -DO iSpec=1, nSpecies - IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN - ! rotational degrees of freedom of molecules - Xi_Rot_Spec(iSpec) = SpecDSMC(iSpec)%Xi_Rot - ! Calculate number of rotational relaxing molecules with number of molecules * probability of relaxation - ! P = 1 - exp(-nu*dt) with relaxation frequency nu and timestep dt - RotExpSpec(iSpec) = exp(-rotrelaxfreqSpec(iSpec)*dtCell) - RotFracSpec(iSpec) = nSpec(iSpec)*(1.-RotExpSpec(iSpec)) - ! Calculate number of vibrational relaxing molecules if enabled with number of molecules * probability of relaxation - ! P = 1 - exp(-nu*dt) with relaxation frequency nu and timestep dt - IF(DoVibRelax) THEN - VibExpSpec(iSpec) = exp(-vibrelaxfreqSpec(iSpec)*dtCell) - VibFracSpec(iSpec) = nSpec(iSpec)*(1.-VibExpSpec(iSpec)) - ELSE - VibExpSpec(iSpec) = 0.0 - VibFracSpec(iSpec) = 0.0 - Xi_Vib_Spec(iSpec) = 0.0 - END IF - END IF -END DO -TEqui_Old = 0.0 -! Calculation of equilibrium temperature -! M. Pfeiffer, "Extending the particle ellipsoidal statistical Bhatnagar-Gross-Krook method to diatomic molecules including -! quantized vibrational energies", Phys. Fluids 30, 116103 (2018), Eq. 25 -! M. Pfeiffer et. al., "Extension of Particle-based BGK Models to Polyatomic Species in Hypersonic Flow around a Flat-faced -! Cylinder", AIP Conference Proceedings 2132, 100001 (2019) -TEqui = 3.*(nPart-1.)*CellTemp -TEquiNumDof = 3.*(nPart-1.) -! Sum up over all species -DO iSpec=1, nSpecies - IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN - TEqui = TEqui + Xi_Rot_Spec(iSpec)*RotFracSpec(iSpec)*TRotSpec(iSpec)+Xi_Vib_oldSpec(iSpec)*VibFracSpec(iSpec)*TVibSpec(iSpec) - TEquiNumDof = TEquiNumDof + Xi_Rot_Spec(iSpec)*RotFracSpec(iSpec) + Xi_Vib_oldSpec(iSpec)*VibFracSpec(iSpec) - END IF -END DO -TEqui = TEqui / TEquiNumDof -! Required condition of Landau-Teller relaxation not fulfilled --> relaxation probabilities of rotation and vibration are -! corrected with a parameter beta for rotation and vibration as suggested by Burt: -! J. Burt and I. Boyd, “Evaluation of a particle method for the ellipsoidal statistical Bhatnagar-Gross-Krook equation”, -! 44th AIAA Aerospace Sciences Meeting and Exhibit (AIAA, 2006), p. 989 -! Solving of equation system until accuracy eps_prec is reached -DO WHILE ( ABS( TEqui - TEqui_Old ) .GT. eps_prec ) - DO iSpec = 1, nSpecies - IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN - ! if difference small: equilibrium, no beta - IF (ABS(TRotSpec(iSpec)-TEqui).LT.1E-3) THEN - RotExpSpec(iSpec) = exp(-rotrelaxfreqSpec(iSpec)*dtCell) - ELSE - ! betaR = beta*nu*dt (= correction parameter rotation * relaxation frequency * time step) - betaR = ((TRotSpec(iSpec)-CellTemp)/(TRotSpec(iSpec)-TEqui))*rotrelaxfreqSpec(iSpec)*dtCell - ! negative betaR would leed to negative relaxation probability! - IF (-betaR.GT.0.0) THEN - RotExpSpec(iSpec) = 0. - ! Check if the exponent is within the range of machine precision - ELSE IF (CHECKEXP(betaR)) THEN - RotExpSpec(iSpec) = exp(-betaR) - ELSE - RotExpSpec(iSpec) = 0. - END IF - END IF - ! new calculation of number of rotational relaxing molecules - RotFracSpec(iSpec) = nSpec(iSpec)*(1.-RotExpSpec(iSpec)) - - IF(DoVibRelax) THEN - ! if difference small: equilibrium, no beta - IF (ABS(TVibSpec(iSpec)-TEqui).LT.1E-3) THEN - VibExpSpec(iSpec) = exp(-vibrelaxfreqSpec(iSpec)*dtCell) - ELSE - ! betaV = beta*nu*dt (= correction parameter vibration * relaxation frequency * time step) - betaV = ((TVibSpec(iSpec)-CellTemp)/(TVibSpec(iSpec)-TEqui))*vibrelaxfreqSpec(iSpec)*dtCell - ! negative betaV would leed to negative relaxation probability! - IF (-betaV.GT.0.0) THEN - VibExpSpec(iSpec) = 0. - ! Check if the exponent is within the range of machine precision - ELSE IF (CHECKEXP(betaV)) THEN - VibExpSpec(iSpec) = exp(-betaV) - ELSE - VibExpSpec(iSpec) = 0. - END IF - END IF - ! new calculation of number of vibrational relaxing molecules - VibFracSpec(iSpec) = nSpec(iSpec)*(1.-VibExpSpec(iSpec)) - - ! new calculation of the vibrational degrees of freedom per species - IF(SpecDSMC(iSpec)%PolyatomicMol) THEN - iPolyatMole = SpecDSMC(iSpec)%SpecToPolyArray - ! Loop over all vibrational degrees of freedom to calculate them using TEqui - DO iDOF = 1, PolyatomMolDSMC(iPolyatMole)%VibDOF - exparg = PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)/TEqui - ! Check if the exponent is within the range of machine precision for calculation of vibrational degrees of freedom - IF(CHECKEXP(exparg))THEN - IF(exparg.gt.0.)THEN ! positive overflow: exp -> inf - Xi_vib_DOF(iSpec,iDOF) = 2.*exparg/(EXP(exparg)-1.) - ELSE ! negative overflow: exp -> 0 - Xi_vib_DOF(iSpec,iDOF) = 2.*exparg/(-1.) - END IF ! exparg.gt.0. - ELSE - Xi_vib_DOF(iSpec,iDOF) = 0.0 - END IF ! CHECKEXP(exparg) - END DO - Xi_Vib_Spec(iSpec) = SUM(Xi_vib_DOF(iSpec,1:PolyatomMolDSMC(iPolyatMole)%VibDOF)) - ELSE ! diatomic - exparg = SpecDSMC(iSpec)%CharaTVib/TEqui - ! Check if the exponent is within the range of machine precision for calculation of vibrational degrees of freedom - IF(CHECKEXP(exparg))THEN - Xi_Vib_Spec(iSpec) = 2.*SpecDSMC(iSpec)%CharaTVib/TEqui/(EXP(exparg)-1.) - ELSE - Xi_Vib_Spec(iSpec) = 0.0 - END IF ! CHECKEXP(exparg) - END IF - END IF - END IF - END DO - TEqui_Old = TEqui - TEqui_Old2 = TEqui - - ! new calculation of equilibrium temperature with new RotFracSpec, new VibFracSpec, new Xi_VibSpec(TEqui) in denominator - TEqui = 3.*(nPart-1.)*CellTemp - TEquiNumDof = 3.*(nPart-1.) - ! Sum up over all species - DO iSpec=1, nSpecies - IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN - TEqui = TEqui + Xi_Rot_Spec(iSpec)*RotFracSpec(iSpec)*TRotSpec(iSpec)+Xi_Vib_oldSpec(iSpec)*VibFracSpec(iSpec)*TVibSpec(iSpec) - TEquiNumDof = TEquiNumDof + Xi_Rot_Spec(iSpec)*RotFracSpec(iSpec) + Xi_Vib_Spec(iSpec)*VibFracSpec(iSpec) - END IF - END DO - TEqui = TEqui / TEquiNumDof - IF(DoVibRelax) THEN - ! accuracy eps_prec not reached yet - DO WHILE( ABS( TEqui - TEqui_Old2 ) .GT. eps_prec ) - ! mean value of old and new equilibrium temperature - TEqui =(TEqui + TEqui_Old2)*0.5 - DO iSpec=1, nSpecies - IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN - ! new calculation of the vibrational degrees of freedom per species - IF(SpecDSMC(iSpec)%PolyatomicMol) THEN - iPolyatMole = SpecDSMC(iSpec)%SpecToPolyArray - ! Loop over all vibrational degrees of freedom to calculate them using TEqui - DO iDOF = 1, PolyatomMolDSMC(iPolyatMole)%VibDOF - exparg = PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)/TEqui - ! Check if the exponent is within the range of machine precision for calculation of vibrational degrees of freedom - IF(CHECKEXP(exparg))THEN - IF(exparg.gt.0.)THEN ! positive overflow: exp -> inf - Xi_vib_DOF(iSpec,iDOF) = 2.*exparg/(EXP(exparg)-1.) - ELSE ! negative overflow: exp -> 0 - Xi_vib_DOF(iSpec,iDOF) = 2.*exparg/(-1.) - END IF ! exparg.gt.0. - ELSE - Xi_vib_DOF(iSpec,iDOF) = 0.0 - END IF ! CHECKEXP(exparg) - END DO - Xi_Vib_Spec(iSpec) = SUM(Xi_vib_DOF(iSpec,1:PolyatomMolDSMC(iPolyatMole)%VibDOF)) - ELSE ! diatomic - exparg = SpecDSMC(iSpec)%CharaTVib/TEqui - ! Check if the exponent is within the range of machine precision for calculation of vibrational degrees of freedom - IF(CHECKEXP(exparg))THEN - Xi_Vib_Spec(iSpec) = 2.*SpecDSMC(iSpec)%CharaTVib/TEqui/(EXP(exparg)-1.) - ELSE - Xi_Vib_Spec(iSpec) = 0.0 - END IF ! CHECKEXP(exparg) - END IF - END IF - END DO - ! new calculation of equilibrium temperature with corrected vibrational degrees of freedom in denominator - TEqui_Old2 = TEqui - TEqui = 3.*(nPart-1.)*CellTemp - TEquiNumDof = 3.*(nPart-1.) - ! Sum up over all species - DO iSpec=1, nSpecies - IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN - TEqui = TEqui + Xi_Rot_Spec(iSpec)*RotFracSpec(iSpec)*TRotSpec(iSpec)+Xi_Vib_oldSpec(iSpec)*VibFracSpec(iSpec)*TVibSpec(iSpec) - TEquiNumDof = TEquiNumDof + Xi_Rot_Spec(iSpec)*RotFracSpec(iSpec) + Xi_Vib_Spec(iSpec)*VibFracSpec(iSpec) - END IF - END DO - TEqui = TEqui / TEquiNumDof - END DO - END IF -END DO -END SUBROUTINE CalcTEquiMultiPoly - - SUBROUTINE CalcViscosityThermalCondColIntVHS(CellTemp, Xi, dens, Xi_RotSpec, Xi_VibSpec, Visc, ThermalCond) !=================================================================================================================================== !> Determination of the mixture viscosity and thermal conductivity using collision integrals (derived for the Variable Hard From eb0d298d3d9de7f7e6aa014d33a0de799573113f Mon Sep 17 00:00:00 2001 From: Franziska Hild Date: Wed, 12 Apr 2023 16:53:11 +0200 Subject: [PATCH 057/495] BGK molecule mixtures with Mathiaud relaxation - bug fix for sampling and cell temperature for relaxation --- src/particles/bgk/bgk_colloperator.f90 | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/src/particles/bgk/bgk_colloperator.f90 b/src/particles/bgk/bgk_colloperator.f90 index 90fc2ec9d..0e9c457ab 100644 --- a/src/particles/bgk/bgk_colloperator.f90 +++ b/src/particles/bgk/bgk_colloperator.f90 @@ -221,7 +221,7 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume, AveragingVal ! 5.) Determine the new rotational and vibrational state of molecules undergoing a relaxation IF(ANY(SpecDSMC(:)%InterID.EQ.2).OR.ANY(SpecDSMC(:)%InterID.EQ.20)) THEN - CALL CalcTRelax(ERotSpec, Xi_RotSpec, EVibSpec, totalWeightSpec, CellTemp, relaxfreq, rotrelaxfreqSpec, & + CALL CalcTRelax(ERotSpec, Xi_RotSpec, EVibSpec, totalWeightSpec, totalWeight, CellTemp, relaxfreq, rotrelaxfreqSpec, & vibrelaxfreqSpec, ERotTtransSpecMean, EVibTtransSpecMean, Xi_VibRelSpec, Xi_vib_DOF, nXiVibDOF, CellTempRel) CALL RelaxInnerEnergy(nVibRelax, nRotRelax, iPartIndx_NodeRelaxVib, iPartIndx_NodeRelaxRot, nXiVibDOF, Xi_vib_DOF, & @@ -890,7 +890,7 @@ SUBROUTINE DetermineRelaxPart(nPart, iPartIndx_Node, relaxfreq, dtCell, nRelax, END SUBROUTINE DetermineRelaxPart -SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, EVibSpec, totalWeightSpec, CellTemp, relaxfreq, rotrelaxfreqSpec, & +SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, EVibSpec, totalWeightSpec, totalWeight, CellTemp, relaxfreq, rotrelaxfreqSpec, & vibrelaxfreqSpec, ERotTtransSpecMean, EVibTtransSpecMean, Xi_VibRelSpec, Xi_vib_DOF, nXiVibDOF, CellTempRel) !=================================================================================================================================== !> Calculate the relaxation energies and temperatures @@ -907,7 +907,7 @@ SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, EVibSpec, totalWeightSpec, CellTemp, ! INPUT VARIABLES INTEGER, INTENT(IN) :: nXiVibDOF REAL, INTENT(IN) :: ERotSpec(nSpecies), Xi_RotSpec(nSpecies), EVibSpec(nSpecies) -REAL, INTENT(IN) :: totalWeightSpec(nSpecies), CellTemp!, MassFraction(nSpecies) +REAL, INTENT(IN) :: totalWeightSpec(nSpecies), totalWeight, CellTemp!, MassFraction(nSpecies) REAL, INTENT(IN) :: relaxfreq, rotrelaxfreqSpec(nSpecies), vibrelaxfreqSpec(nSpecies) !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES @@ -975,14 +975,14 @@ SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, EVibSpec, totalWeightSpec, CellTemp, ! Mean translational energy per particle to satisfy the Landau-Teller equation ETransRelMean = ETransRelMean + (3./2. * BoltzmannConst * CellTemp - (rotrelaxfreqSpec(iSpec)/relaxfreq) * & - (ERotTtransSpecMean(iSpec)-ERotSpecMean(iSpec))) * totalWeightSpec(iSpec) + (ERotTtransSpecMean(iSpec)-ERotSpecMean(iSpec))) * totalWeightSpec(iSpec)/totalWeight IF (BGKDoVibRelaxation) THEN ETransRelMean = ETransRelMean - (vibrelaxfreqSpec(iSpec)/relaxfreq)*(EVibTtransSpecMean(iSpec)-EVibSpecMean(iSpec)) * & - totalWeightSpec(iSpec) + totalWeightSpec(iSpec)/totalWeight END IF ELSE ! Mean translational energy per particle to satisfy the Landau-Teller equation - ETransRelMean = ETransRelMean + 3./2. * BoltzmannConst * CellTemp * totalWeightSpec(iSpec) + ETransRelMean = ETransRelMean + 3./2. * BoltzmannConst * CellTemp * totalWeightSpec(iSpec)/totalWeight END IF END DO @@ -1108,13 +1108,8 @@ SUBROUTINE SampleFromTargetDistr(nRelax, iPartIndx_NodeRelax, Prandtl, u2, u0ij, KronDelta = 0.0 END IF ! Fill symmetric transformation matrix SMat with anisotopic matrix A = SS - ! = Open work: calculation per species? ========================================================================== - SMat(fillMa1, fillMa2)= KronDelta*CellTempRel*BoltzmannConst/MassIC_Mixture - (1.-Prandtl)/(2.*Prandtl) & - *(u0ij(fillMa1, fillMa2)-KronDelta*CellTemp*BoltzmannConst/MassIC_Mixture) - ! SMat(fillMa1, fillMa2)= KronDelta*CellTempRel/CellTemp - (1.-Prandtl)/(2.*Prandtl) & - ! *(3./u2*u0ij(fillMa1, fillMa2)-KronDelta) - ! SMat(fillMa1, fillMa2)= KronDelta*CellTempRel - (1.-Prandtl)/(2.*Prandtl) & - ! *(u0ij(fillMa1, fillMa2)-KronDelta*CellTemp) + SMat(fillMa1, fillMa2)= KronDelta*CellTempRel/CellTemp - (1.-Prandtl)/(2.*Prandtl) & + *(3./u2*u0ij(fillMa1, fillMa2)-KronDelta) END DO END DO SMat(2,1)=SMat(1,2) @@ -1198,9 +1193,12 @@ SUBROUTINE SampleFromTargetDistr(nRelax, iPartIndx_NodeRelax, Prandtl, u2, u0ij, iPart = iPartIndx_NodeRelax(iLoop) iSpec = PartSpecies(iPart) ! Calculation of new velocities of all particles - IF ((BGKCollModel.EQ.1).AND.(ESBGKModel.NE.3)) THEN + IF ((BGKCollModel.EQ.1).AND.(ESBGKModel.EQ.1)) THEN ! Transformation of normalized thermal velocity vector tempVelo (sampled from a Maxwellian distribution) to a thermal velocity ! vector sampled from the ESBGK target distribution function (anisotropic Gaussian distribution) + tempVelo(1:3) = SQRT(BoltzmannConst*CellTempRel/Species(iSpec)%MassIC)*iRanPart(1:3,iLoop) + PartState(4:6,iPart) = vBulkAll(1:3) + MATMUL(SMat,tempVelo) + ELSE IF ((BGKCollModel.EQ.1).AND.(ESBGKModel.EQ.2)) THEN tempVelo(1:3) = SQRT(MassIC_Mixture/Species(iSpec)%MassIC)*iRanPart(1:3,iLoop) PartState(4:6,iPart) = vBulkAll(1:3) + MATMUL(SMat,tempVelo) ELSE IF ((BGKCollModel.EQ.1).AND.(ESBGKModel.EQ.3)) THEN From d8015b7a6f3c9ec9b9a6d3735c236eeb8b54f3f4 Mon Sep 17 00:00:00 2001 From: Franziska Hild Date: Thu, 13 Apr 2023 09:29:02 +0200 Subject: [PATCH 058/495] BGK molecule mixtures with Mathiaud relaxation - bug fix for atomic species --- src/particles/bgk/bgk_colloperator.f90 | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/particles/bgk/bgk_colloperator.f90 b/src/particles/bgk/bgk_colloperator.f90 index 0e9c457ab..b826d04a8 100644 --- a/src/particles/bgk/bgk_colloperator.f90 +++ b/src/particles/bgk/bgk_colloperator.f90 @@ -218,15 +218,14 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume, AveragingVal END IF END IF -! 5.) Determine the new rotational and vibrational state of molecules undergoing a relaxation -IF(ANY(SpecDSMC(:)%InterID.EQ.2).OR.ANY(SpecDSMC(:)%InterID.EQ.20)) THEN - - CALL CalcTRelax(ERotSpec, Xi_RotSpec, EVibSpec, totalWeightSpec, totalWeight, CellTemp, relaxfreq, rotrelaxfreqSpec, & +! 5.) Determine the relaxation temperatures and energies as well as the new rotational and vibrational states of molecules +! undergoing a relaxation +CALL CalcTRelax(ERotSpec, Xi_RotSpec, EVibSpec, totalWeightSpec, totalWeight, CellTemp, relaxfreq, rotrelaxfreqSpec, & vibrelaxfreqSpec, ERotTtransSpecMean, EVibTtransSpecMean, Xi_VibRelSpec, Xi_vib_DOF, nXiVibDOF, CellTempRel) +IF(ANY(SpecDSMC(:)%InterID.EQ.2).OR.ANY(SpecDSMC(:)%InterID.EQ.20)) THEN CALL RelaxInnerEnergy(nVibRelax, nRotRelax, iPartIndx_NodeRelaxVib, iPartIndx_NodeRelaxRot, nXiVibDOF, Xi_vib_DOF, & Xi_VibRelSpec, Xi_RotSpec, VibEnergyDOF, CellTemp, NewEnVib, NewEnRot) - ELSE CellTempRel = CellTemp END IF @@ -926,7 +925,7 @@ SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, EVibSpec, totalWeightSpec, totalWeig ETransRelMean=0.0; CellTempRel=0.0 DO iSpec = 1, nSpecies - IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN + IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN ! molecules ! Mean rotational energy per particle of a species ERotSpecMean(iSpec) = ERotSpec(iSpec)/totalWeightSpec(iSpec) ! Mean rotational energy per particle of a species for the mixture translational temperature, ERot(Ttrans) @@ -980,7 +979,7 @@ SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, EVibSpec, totalWeightSpec, totalWeig ETransRelMean = ETransRelMean - (vibrelaxfreqSpec(iSpec)/relaxfreq)*(EVibTtransSpecMean(iSpec)-EVibSpecMean(iSpec)) * & totalWeightSpec(iSpec)/totalWeight END IF - ELSE + ELSE ! atomic ! Mean translational energy per particle to satisfy the Landau-Teller equation ETransRelMean = ETransRelMean + 3./2. * BoltzmannConst * CellTemp * totalWeightSpec(iSpec)/totalWeight END IF From fceba805f10bc95ae624c3ad5170afde2db8cc0f Mon Sep 17 00:00:00 2001 From: Franziska Hild Date: Thu, 13 Apr 2023 14:57:15 +0200 Subject: [PATCH 059/495] BGK molecule mixtures with Mathiaud relaxation - small clean-up --- src/particles/bgk/bgk_colloperator.f90 | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/particles/bgk/bgk_colloperator.f90 b/src/particles/bgk/bgk_colloperator.f90 index b826d04a8..de27cfa65 100644 --- a/src/particles/bgk/bgk_colloperator.f90 +++ b/src/particles/bgk/bgk_colloperator.f90 @@ -89,7 +89,7 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume, AveragingVal REAL,PARAMETER :: RelEneTol=1e-12 ! Relative tolerance applied to conservation of energy before/after reaction #endif /* CODE_ANALYZE */ REAL :: totalWeightSpec(nSpecies), totalWeight, partWeight, CellTemptmp, MassIC_Mixture -REAL :: EVibSpec(nSpecies), ERotSpec(nSpecies), Xi_VibSpec(nSpecies), Xi_RotSpec(nSpecies),Xi_Vib_oldSpec(nSpecies) +REAL :: EVibSpec(nSpecies), ERotSpec(nSpecies), Xi_VibSpec(nSpecies), Xi_RotSpec(nSpecies) REAL :: ERotTtransSpecMean(nSpecies), EVibTtransSpecMean(nSpecies), Xi_VibRelSpec(nSpecies), CellTempRel REAL :: TVibSpec(nSpecies), TRotSpec(nSpecies), VibRelaxWeightSpec(nSpecies), RotRelaxWeightSpec(nSpecies) REAL :: collisionfreqSpec(nSpecies),rotrelaxfreqSpec(nSpecies), vibrelaxfreqSpec(nSpecies) @@ -139,9 +139,11 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume, AveragingVal nXiVibDOF=0.0 ! Initialize DO iSpec = 1, nSpecies IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN - IF(SpecDSMC(iSpec)%PolyatomicMol) THEN - iPolyatMole = SpecDSMC(iSpec)%SpecToPolyArray - nXiVibDOFSpec(iSpec) = PolyatomMolDSMC(iPolyatMole)%VibDOF + IF(BGKDoVibRelaxation) THEN + IF(SpecDSMC(iSpec)%PolyatomicMol) THEN + iPolyatMole = SpecDSMC(iSpec)%SpecToPolyArray + nXiVibDOFSpec(iSpec) = PolyatomMolDSMC(iPolyatMole)%VibDOF + END IF END IF END IF END DO @@ -149,8 +151,7 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume, AveragingVal ALLOCATE(Xi_vib_DOF(nSpecies,nXiVibDOF)) Xi_vib_DOF = 0.0 -CALL CalcInnerDOFs(nSpec, EVibSpec, ERotSpec, totalWeightSpec, TVibSpec, TRotSpec, InnerDOF, Xi_VibSpec, Xi_Vib_oldSpec & - ,Xi_RotSpec) +CALL CalcInnerDOFs(nSpec, EVibSpec, ERotSpec, totalWeightSpec, TVibSpec, TRotSpec, InnerDOF, Xi_VibSpec, Xi_RotSpec) ! 2.) Calculation of the relaxation frequency of the distribution function towards the target distribution function CALL CalcGasProperties(nSpec, dens, InnerDOF, totalWeightSpec, totalWeight, TotalMass, u2Spec, u0ij, u2, SpecTemp, CellTemp, & @@ -217,6 +218,7 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume, AveragingVal ALLOCATE(VibEnergyDOF(nVibRelax,nXiVibDOF)) END IF END IF +VibEnergyDOF = 0.0 ! 5.) Determine the relaxation temperatures and energies as well as the new rotational and vibrational states of molecules ! undergoing a relaxation @@ -578,8 +580,7 @@ SUBROUTINE DoAveraging(dens, u2, u0ij, u2i, CellTemp, AverageValues) END SUBROUTINE DoAveraging -SUBROUTINE CalcInnerDOFs(nSpec, EVibSpec, ERotSpec, totalWeightSpec, TVibSpec, TRotSpec, InnerDOF, Xi_VibSpec, Xi_Vib_oldSpec & - ,Xi_RotSpec) +SUBROUTINE CalcInnerDOFs(nSpec, EVibSpec, ERotSpec, totalWeightSpec, TVibSpec, TRotSpec, InnerDOF, Xi_VibSpec, Xi_RotSpec) !=================================================================================================================================== !> Determine the internal degrees of freedom and the respective temperature (rotation/vibration) for diatomic/polyatomic species !=================================================================================================================================== @@ -597,14 +598,14 @@ SUBROUTINE CalcInnerDOFs(nSpec, EVibSpec, ERotSpec, totalWeightSpec, TVibSpec, T REAL, INTENT(IN) :: EVibSpec(nSpecies), ERotSpec(nSpecies), totalWeightSpec(nSpecies) !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES -REAL, INTENT(OUT) :: TVibSpec(nSpecies), TRotSpec(nSpecies), InnerDOF, Xi_VibSpec(nSpecies), Xi_Vib_oldSpec(nSpecies) +REAL, INTENT(OUT) :: TVibSpec(nSpecies), TRotSpec(nSpecies), InnerDOF, Xi_VibSpec(nSpecies) REAL, INTENT(OUT) :: Xi_RotSpec(nSpecies) !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES INTEGER :: iPolyatMole, iSpec, iDOF REAL :: exparg !=================================================================================================================================== -Xi_VibSpec=0.; InnerDOF=0.; Xi_RotSpec=0.; Xi_Vib_oldSpec=0.; TVibSpec=0.; TRotSpec=0. +Xi_VibSpec=0.; InnerDOF=0.; Xi_RotSpec=0.; TVibSpec=0.; TRotSpec=0. DO iSpec = 1, nSpecies IF (nSpec(iSpec).EQ.0) CYCLE ! Only for molecules @@ -637,7 +638,6 @@ SUBROUTINE CalcInnerDOFs(nSpec, EVibSpec, ERotSpec, totalWeightSpec, TVibSpec, T Xi_VibSpec(iSpec) = 2.* EVibSpec(iSpec) / (totalWeightSpec(iSpec)*BoltzmannConst*TVibSpec(iSpec)) END IF END IF - Xi_Vib_oldSpec(iSpec) = Xi_VibSpec(iSpec) END IF Xi_RotSpec(iSpec) = SpecDSMC(iSpec)%Xi_Rot ! Calculation of rotational temperature from Pfeiffer, Physics of Fluids 30, 116103 (2018), "Extending the particle ellipsoidal @@ -949,7 +949,7 @@ SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, EVibSpec, totalWeightSpec, totalWeig TVibRelPoly = EVibTtransPoly / (BoltzmannConst*PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)) IF (TVibRelPoly.GT.0.0) THEN TVibRelPoly = PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)/LOG(1. + 1./TVibRelPoly) - ! Calculation of the vibrational degrees of freedeom to satisfy the Landau-Teller equation + ! Calculation of the vibrational degrees of freedom to satisfy the Landau-Teller equation Xi_vib_DOF(iSpec,iDOF) = 2.* EVibTtransPoly / (BoltzmannConst*TVibRelPoly) ELSE Xi_vib_DOF(iSpec,iDOF) = 0.0 @@ -963,7 +963,7 @@ SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, EVibSpec, totalWeightSpec, totalWeig TVibRelSpecMean = EVibTtransSpecMean(iSpec) / (BoltzmannConst*SpecDSMC(iSpec)%CharaTVib) IF (TVibRelSpecMean.GT.0.0) THEN TVibRelSpecMean = SpecDSMC(iSpec)%CharaTVib/LOG(1. + 1./(TVibRelSpecMean)) - ! Calculation of the vibrational degrees of freedeom to satisfy the Landau-Teller equation + ! Calculation of the vibrational degrees of freedom to satisfy the Landau-Teller equation Xi_VibRelSpec(iSpec) = 2.* EVibTtransSpecMean(iSpec) / (BoltzmannConst*TVibRelSpecMean) ! No negative temperature possible ELSE From 5164d40bfcbb694e37d511158aa5ed788bdd1845 Mon Sep 17 00:00:00 2001 From: Franziska Hild Date: Thu, 13 Apr 2023 15:42:43 +0200 Subject: [PATCH 060/495] BGK molecule mixtures with Mathiaud relaxation - bug fix reggie --- src/particles/bgk/bgk_colloperator.f90 | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/particles/bgk/bgk_colloperator.f90 b/src/particles/bgk/bgk_colloperator.f90 index de27cfa65..241fe3cbd 100644 --- a/src/particles/bgk/bgk_colloperator.f90 +++ b/src/particles/bgk/bgk_colloperator.f90 @@ -139,11 +139,9 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume, AveragingVal nXiVibDOF=0.0 ! Initialize DO iSpec = 1, nSpecies IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN - IF(BGKDoVibRelaxation) THEN - IF(SpecDSMC(iSpec)%PolyatomicMol) THEN - iPolyatMole = SpecDSMC(iSpec)%SpecToPolyArray - nXiVibDOFSpec(iSpec) = PolyatomMolDSMC(iPolyatMole)%VibDOF - END IF + IF(SpecDSMC(iSpec)%PolyatomicMol) THEN + iPolyatMole = SpecDSMC(iSpec)%SpecToPolyArray + nXiVibDOFSpec(iSpec) = PolyatomMolDSMC(iPolyatMole)%VibDOF END IF END IF END DO @@ -218,7 +216,6 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume, AveragingVal ALLOCATE(VibEnergyDOF(nVibRelax,nXiVibDOF)) END IF END IF -VibEnergyDOF = 0.0 ! 5.) Determine the relaxation temperatures and energies as well as the new rotational and vibrational states of molecules ! undergoing a relaxation @@ -228,8 +225,6 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume, AveragingVal IF(ANY(SpecDSMC(:)%InterID.EQ.2).OR.ANY(SpecDSMC(:)%InterID.EQ.20)) THEN CALL RelaxInnerEnergy(nVibRelax, nRotRelax, iPartIndx_NodeRelaxVib, iPartIndx_NodeRelaxRot, nXiVibDOF, Xi_vib_DOF, & Xi_VibRelSpec, Xi_RotSpec, VibEnergyDOF, CellTemp, NewEnVib, NewEnRot) -ELSE - CellTempRel = CellTemp END IF ! 6.) Sample new particle velocities from the target distribution function, depending on the chosen model From f0648dc416155f3868181501902a24a553a252a4 Mon Sep 17 00:00:00 2001 From: Franziska Hild Date: Thu, 13 Apr 2023 17:05:00 +0200 Subject: [PATCH 061/495] BGK molecule mixtures with Mathiaud relaxation - better allocation --- src/particles/bgk/bgk_colloperator.f90 | 36 ++++++++++---------------- 1 file changed, 13 insertions(+), 23 deletions(-) diff --git a/src/particles/bgk/bgk_colloperator.f90 b/src/particles/bgk/bgk_colloperator.f90 index 241fe3cbd..05e0738d7 100644 --- a/src/particles/bgk/bgk_colloperator.f90 +++ b/src/particles/bgk/bgk_colloperator.f90 @@ -135,20 +135,6 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume, AveragingVal CALL DoAveraging(dens, u2, u0ij, u2i, CellTemp, AveragingValues) END IF -! Allocate Xi_vib_DOF -nXiVibDOF=0.0 ! Initialize -DO iSpec = 1, nSpecies - IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN - IF(SpecDSMC(iSpec)%PolyatomicMol) THEN - iPolyatMole = SpecDSMC(iSpec)%SpecToPolyArray - nXiVibDOFSpec(iSpec) = PolyatomMolDSMC(iPolyatMole)%VibDOF - END IF - END IF -END DO -nXiVibDOF = MAXVAL(nXiVibDOFSpec(:)) -ALLOCATE(Xi_vib_DOF(nSpecies,nXiVibDOF)) -Xi_vib_DOF = 0.0 - CALL CalcInnerDOFs(nSpec, EVibSpec, ERotSpec, totalWeightSpec, TVibSpec, TRotSpec, InnerDOF, Xi_VibSpec, Xi_RotSpec) ! 2.) Calculation of the relaxation frequency of the distribution function towards the target distribution function @@ -210,10 +196,14 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume, AveragingVal ! Return if no particles are undergoing a relaxation IF ((nRelax.EQ.0).AND.(nRotRelax.EQ.0).AND.(nVibRelax.EQ.0)) RETURN -! Allocate VibEnergyDOF +! Allocate Xi_vib_DOF IF(BGKDoVibRelaxation) THEN - IF(ANY(SpecDSMC(:)%PolyatomicMol)) THEN + IF(DSMC%NumPolyatomMolecs.GT.0) THEN + nXiVibDOF = MAXVAL(PolyatomMolDSMC(:)%VibDOF) + ALLOCATE(Xi_vib_DOF(DSMC%NumPolyatomMolecs,nXiVibDOF)) + ! Allocate VibEnergyDOF ALLOCATE(VibEnergyDOF(nVibRelax,nXiVibDOF)) + VibEnergyDOF = 0.0 END IF END IF @@ -891,7 +881,7 @@ SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, EVibSpec, totalWeightSpec, totalWeig !=================================================================================================================================== ! MODULES USE MOD_Particle_Vars ,ONLY: nSpecies -USE MOD_DSMC_Vars ,ONLY: PolyatomMolDSMC, SpecDSMC +USE MOD_DSMC_Vars ,ONLY: PolyatomMolDSMC, SpecDSMC, DSMC USE MOD_BGK_Vars ,ONLY: BGKDoVibRelaxation USE MOD_Globals_Vars ,ONLY: BoltzmannConst USE MOD_Globals ,ONLY: abort @@ -906,7 +896,7 @@ SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, EVibSpec, totalWeightSpec, totalWeig !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES REAL, INTENT(OUT) :: ERotTtransSpecMean(nSpecies), EVibTtransSpecMean(nSpecies) -REAL, INTENT(OUT) :: Xi_VibRelSpec(nSpecies), Xi_vib_DOF(nSpecies,nXiVibDOF), CellTempRel +REAL, INTENT(OUT) :: Xi_VibRelSpec(nSpecies), Xi_vib_DOF(DSMC%NumPolyatomMolecs,nXiVibDOF), CellTempRel !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES INTEGER :: iSpec, iDOF, iPolyatMole @@ -945,9 +935,9 @@ SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, EVibSpec, totalWeightSpec, totalWeig IF (TVibRelPoly.GT.0.0) THEN TVibRelPoly = PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)/LOG(1. + 1./TVibRelPoly) ! Calculation of the vibrational degrees of freedom to satisfy the Landau-Teller equation - Xi_vib_DOF(iSpec,iDOF) = 2.* EVibTtransPoly / (BoltzmannConst*TVibRelPoly) + Xi_vib_DOF(iPolyatMole,iDOF) = 2.* EVibTtransPoly / (BoltzmannConst*TVibRelPoly) ELSE - Xi_vib_DOF(iSpec,iDOF) = 0.0 + Xi_vib_DOF(iPolyatMole,iDOF) = 0.0 END IF END DO @@ -997,7 +987,7 @@ SUBROUTINE RelaxInnerEnergy(nVibRelax, nRotRelax, iPartIndx_NodeRelaxVib, iPartI !=================================================================================================================================== ! MODULES USE MOD_Particle_Vars ,ONLY: PartSpecies, nSpecies -USE MOD_DSMC_Vars ,ONLY: SpecDSMC, PartStateIntEn, PolyatomMolDSMC +USE MOD_DSMC_Vars ,ONLY: SpecDSMC, PartStateIntEn, PolyatomMolDSMC, DSMC USE MOD_BGK_Vars ,ONLY: BGKDoVibRelaxation USE MOD_part_tools ,ONLY: GetParticleWeight USE MOD_Globals_Vars ,ONLY: BoltzmannConst @@ -1007,7 +997,7 @@ SUBROUTINE RelaxInnerEnergy(nVibRelax, nRotRelax, iPartIndx_NodeRelaxVib, iPartI ! INPUT VARIABLES INTEGER, INTENT(IN) :: nXiVibDOF INTEGER, INTENT(IN) :: nVibRelax, nRotRelax, iPartIndx_NodeRelaxVib(nVibRelax), iPartIndx_NodeRelaxRot(nRotRelax) -REAL, INTENT(IN) :: Xi_vib_DOF(nSpecies,nXiVibDOF), Xi_VibSpec(nSpecies), Xi_RotSpec(nSpecies) +REAL, INTENT(IN) :: Xi_vib_DOF(DSMC%NumPolyatomMolecs,nXiVibDOF), Xi_VibSpec(nSpecies), Xi_RotSpec(nSpecies) REAL, INTENT(IN) :: CellTemp REAL, INTENT(INOUT) :: NewEnVib(nSpecies), NewEnRot(nSpecies) !----------------------------------------------------------------------------------------------------------------------------------- @@ -1033,7 +1023,7 @@ SUBROUTINE RelaxInnerEnergy(nVibRelax, nRotRelax, iPartIndx_NodeRelaxVib, iPartI ! Polyatomic Species in Hypersonic Flow around a Flat-faced Cylinder", AIP Conference Proceedings 2132, 100001 (2019) DO iDOF = 1, PolyatomMolDSMC(iPolyatMole)%VibDOF CALL RANDOM_NUMBER(iRan) - VibEnergyDOF(iLoop,iDOF) = - LOG(iRan)*Xi_vib_DOF(iSpec,iDOF)/2.*CellTemp*BoltzmannConst + VibEnergyDOF(iLoop,iDOF) = - LOG(iRan)*Xi_vib_DOF(iPolyatMole,iDOF)/2.*CellTemp*BoltzmannConst PartStateIntEn(1,iPart) = PartStateIntEn(1,iPart)+VibEnergyDOF(iLoop,iDOF) END DO ! ELSE: diatomic, only one vibrational DOF, calculate new vibrational energy according to M. Pfeiffer, "Extending the particle From 99a7d22425104a8b32378669ccd11f6573a0f594 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Tue, 18 Apr 2023 08:56:04 +0200 Subject: [PATCH 062/495] Ray tracing only WIP --- src/CMakeLists.txt | 3 +- .../emission/particle_emission_tools.f90 | 68 +++ src/radiation/ray_tracing/raytrace_ini.f90 | 134 +++++ src/radiation/ray_tracing/raytrace_main.f90 | 475 ++++++++++++++++++ src/radiation/ray_tracing/raytrace_vars.f90 | 71 +++ 5 files changed, 750 insertions(+), 1 deletion(-) create mode 100644 src/radiation/ray_tracing/raytrace_ini.f90 create mode 100644 src/radiation/ray_tracing/raytrace_main.f90 create mode 100644 src/radiation/ray_tracing/raytrace_vars.f90 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ff4269839..3608e9ef7 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -436,7 +436,8 @@ FILE(GLOB_RECURSE piclasF90 ./src/init/*.f90 ./src/restart/*.f90 ./src/utils/*.f90 ./unitTests/unittest.f90 - ./unitTests/unittest_vars.f90) + ./unitTests/unittest_vars.f90 + ./src/radiation/ray_tracing/*.f90) LIST(APPEND timediscF90 ${timediscF90} ./src/timedisc/timedisc.f90 diff --git a/src/particles/emission/particle_emission_tools.f90 b/src/particles/emission/particle_emission_tools.f90 index d44650b2f..81f7866fe 100644 --- a/src/particles/emission/particle_emission_tools.f90 +++ b/src/particles/emission/particle_emission_tools.f90 @@ -88,6 +88,10 @@ MODULE MOD_part_emission_tools END INTERFACE #endif /*CODE_ANALYZE*/ +INTERFACE InsideQuadrilateral + MODULE PROCEDURE InsideQuadrilateral +END INTERFACE + !=================================================================================================================================== PUBLIC :: CalcVelocity_taylorgreenvortex, CalcVelocity_gyrotroncircle PUBLIC :: IntegerDivide,SetParticleChargeAndMass,SetParticleMPF,CalcVelocity_maxwell_lpn,SamplePoissonDistri @@ -111,6 +115,7 @@ MODULE MOD_part_emission_tools PUBLIC :: CalcVectorAdditionCoeffs #endif /*CODE_ANALYZE*/ PUBLIC :: CountNeutralizationParticles +PUBLIC :: InsideQuadrilateral !=================================================================================================================================== CONTAINS @@ -2156,6 +2161,69 @@ PPURE LOGICAL FUNCTION InsideHexagon(X,R,ri) RESULT(L) END ASSOCIATE END FUNCTION InsideHexagon +!=================================================================================================================================== +!> Calculate determinant of 3 points +!=================================================================================================================================== +PPURE REAL FUNCTION pointDet(P1,P2,P3) +! MODULES +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------! +! INPUT / OUTPUT VARIABLES +REAL,INTENT(IN) :: P1(2),P2(2),P3(2) +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +!=================================================================================================================================== +pointDet = (P1(1)-P3(1))*(P2(2)-P3(2)) - (P2(1)-P3(1))*(P1(2)-P3(2)) +END FUNCTION pointDet + +!=================================================================================================================================== +!> Check if x,y is inside side +!=================================================================================================================================== +PPURE LOGICAL FUNCTION InsideQuadrilateral(X,SideID) RESULT(L) +! MODULES +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES +REAL,INTENT(IN) :: x(2) +INTEGER,INTENT(IN) :: SideID +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +LOGICAL :: pos,neg +INTEGER :: iNode,ElemID,locSideID +REAL :: normal(2),corner(2),P(1:2,1:4),d(3) +!=================================================================================================================================== +ElemID = SideToElem(S2E_ELEM_ID,SideID) +locSideID = SideToElem(S2E_LOC_SIDE_ID,SideID) + +DO iNode = 1,4 + P(1:2,iNode) = NodeCoords_Shared(1:2,ElemSideNodeID_Shared(iNode,locSideID,ElemID)+1) +END DO + +d(1) = pointDet(X,P(1:2,1),P(1:2,2)) +d(2) = pointDet(X,P(1:2,2),P(1:2,3)) +d(3) = pointDet(X,P(1:2,3),P(1:2,1)) + +pos = (d(1).GT.0).OR.(d(2).GT.0).OR.(d(3).GT.0) +neg = (d(1).LT.0).OR.(d(2).LT.0).OR.(d(3).LT.0) + +L = .NOT.(pos.AND.neg) + +IF(.NOT.L)THEN + d(1) = pointDet(X,P(1:2,1),P(1:2,3)) + d(2) = pointDet(X,P(1:2,3),P(1:2,4)) + d(3) = pointDet(X,P(1:2,4),P(1:2,1)) + + pos = (d(1).GT.0).OR.(d(2).GT.0).OR.(d(3).GT.0) + neg = (d(1).LT.0).OR.(d(2).LT.0).OR.(d(3).LT.0) + + L = .NOT.(pos.AND.neg) +END IF ! .NOT.L + +END FUNCTION InsideQuadrilateral + SUBROUTINE SetParticlePositionLandmark(chunkSize,particle_positions,mode) !=================================================================================================================================== diff --git a/src/radiation/ray_tracing/raytrace_ini.f90 b/src/radiation/ray_tracing/raytrace_ini.f90 new file mode 100644 index 000000000..e174860d1 --- /dev/null +++ b/src/radiation/ray_tracing/raytrace_ini.f90 @@ -0,0 +1,134 @@ +!================================================================================================================================== +! Copyright (c) 2023 - 2023 Marcel Pfeiffer, Stephen Copplestone +! +! This file is part of PICLas (gitlab.com/piclas/piclas). PICLas is free software: you can redistribute it and/or modify +! it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 +! of the License, or (at your option) any later version. +! +! PICLas is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty +! of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License v3.0 for more details. +! +! You should have received a copy of the GNU General Public License along with PICLas. If not, see . +!================================================================================================================================== +#include "piclas.h" + +MODULE MOD_RayTracing_Init +!=================================================================================================================================== +! Initialization of Radiation Transport +!=================================================================================================================================== +! MODULES +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +PRIVATE + +INTERFACE InitRayTracing + MODULE PROCEDURE InitRayTracing +END INTERFACE + +!INTERFACE FinalizeRadiationTransport +! MODULE PROCEDURE FinalizeRadiationTransport +!END INTERFACE + +PUBLIC::InitRayTracing, DefineParametersRayTracing +!=================================================================================================================================== + +CONTAINS + +!================================================================================================================================== +!> Define parameters for FP-Flow +!================================================================================================================================== +SUBROUTINE DefineParametersRayTracing() +! MODULES +USE MOD_ReadInTools ,ONLY: prms,addStrListEntry +IMPLICIT NONE +!================================================================================================================================== +CALL prms%SetSection("Ray Tracing") + +CALL prms%CreateIntOption( 'RayTracing-PartBound' , 'TODO' , '0') +CALL prms%CreateLogicalOption( 'RayTracing-AdaptiveRays' , 'TODO' , '.FALSE.') +CALL prms%CreateIntOption( 'RayTracing-NumRays' , 'TODO' , '1') +CALL prms%CreateIntOption( 'RayTracing-RayPosModel' , 'TODO' , '1') +CALL prms%CreateRealArrayOption('RayTracing-RayDirection' , 'TODO' , no=3) + +CALL prms%CreateRealOption(' RayTracing-PulseDuration' , 'Pulse duration tau for a Gaussian-type pulse with I~exp(-(t/tau)^2) [s]' , numberedmulti=.TRUE.) +CALL prms%CreateRealOption(' RayTracing-WaistRadius' , 'Beam waist radius (in focal spot) w_b for Gaussian-type pulse with I~exp(-(r/w_b)^2) [m]' , numberedmulti=.TRUE.) +CALL prms%CreateRealOption(' RayTracing-WaveLength' , 'Beam wavelength [m]' , numberedmulti=.TRUE.) +CALL prms%CreateRealOption(' RayTracing-RepetitionRate' , 'Pulse repetition rate (pulses per second) [Hz]' , numberedmulti=.TRUE.) +CALL prms%CreateRealOption(' RayTracing-Power' , 'Average pulse power (energy of a single pulse times repetition rate) [W]' , '-1.0' , numberedmulti=.TRUE.) + +END SUBROUTINE DefineParametersRayTracing + +SUBROUTINE InitRayTracing() +!=================================================================================================================================== +! Initialization of the radiation transport solver +!=================================================================================================================================== +! MODULES +USE MOD_Globals +USE MOD_ReadInTools +USE MOD_RayTracing_Vars +USE MOD_Particle_Boundary_Vars, ONLY : nComputeNodeSurfTotalSides +USE MOD_Mesh_Vars, ONLY : nGlobalElems +#if USE_MPI +USE MOD_MPI_Shared_Vars +USE MOD_MPI_Shared +#endif /*USE_MPI*/ +! IMPLICIT VARIABLE HANDLING + IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +INTEGER :: iWave, iElem, firstElem, lastElem, ElemDisp, DisplRank, iSpec, currentRank +REAL :: LocTemp, ObsLengt, MaxSumTemp(2), GlobalMaxTemp(2), hilf +LOGICAL :: ElemInCone +REAL,ALLOCATABLE :: Radiation_ShockTube_Spec(:,:) +INTEGER :: w, io_error +!=================================================================================================================================== +SWRITE(UNIT_StdOut,'(132("-"))') +SWRITE(UNIT_stdOut,'(A)') ' INIT RAY TRACING SOLVER ...' + +RayPartBound = GETINT('RayTracing-PartBound') +IF(RayPartBound.EQ.0) RETURN + +! Get ray parameters +Ray%PulseDuration = GETREAL('RayTracing-PulseDuration') +Ray%WaistRadius = GETREAL('RayTracing-WaistRadius') +Ray%WaveLength = GETREAL('RayTracing-WaveLength') +Ray%RepetitionRate = GETREAL('RayTracing-RepetitionRate') +Ray%Power = GETREAL('RayTracing-Power') + +ALLOCATE(RayElemPassedEnergy(1:nGlobalElems)) +RayElemPassedEnergy=0.0 + +AdaptiveRays = GETLOGICAL('RayTracing-AdaptiveRays') +NumRays = GETINT('RayTracing-NumRays') +RayPosModel = GETINT('RayTracing-RayDirection') +RayDirection = GETREALARRAY('RayTracing-RayDirection',3) + +#if USE_MPI +CALL Allocate_Shared((/nGlobalElems/),RayElemPassedEnergy_Shared_Win,RayElemPassedEnergy_Shared) +CALL MPI_WIN_LOCK_ALL(0,RayElemPassedEnergy_Shared_Win,IERROR) +IF (myComputeNodeRank.EQ.0) RayElemPassedEnergy_Shared = 0. +CALL BARRIER_AND_SYNC(RayElemPassedEnergy_Shared_Win,MPI_COMM_SHARED) +#endif /*USE_MPI*/ + +ALLOCATE(RaySampWall(2,1:nComputeNodeSurfTotalSides)) +RaySampWall=0.0 + +#if USE_MPI +!> Then shared arrays for boundary sampling +CALL Allocate_Shared((/2,nComputeNodeSurfTotalSides/),RaySampWall_Shared_Win,RaySampWall_Shared) +CALL MPI_WIN_LOCK_ALL(0,RaySampWall_Shared_Win,IERROR) + +IF (myComputeNodeRank.EQ.0) RaySampWall_Shared = 0. +CALL BARRIER_AND_SYNC(RaySampWall_Shared_Win,MPI_COMM_SHARED) +#endif + +SWRITE(UNIT_stdOut,'(A)')' INIT RAY TRACING SOLVER DONE!' +SWRITE(UNIT_StdOut,'(132("-"))') +END SUBROUTINE InitRayTracing + + +END MODULE MOD_RayTracing_Init diff --git a/src/radiation/ray_tracing/raytrace_main.f90 b/src/radiation/ray_tracing/raytrace_main.f90 new file mode 100644 index 000000000..b983bf094 --- /dev/null +++ b/src/radiation/ray_tracing/raytrace_main.f90 @@ -0,0 +1,475 @@ +!================================================================================================================================== +! Copyright (c) 2018 - 2019 Marcel Pfeiffer +! +! This file is part of PICLas (gitlab.com/piclas/piclas). PICLas is free software: you can redistribute it and/or modify +! it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 +! of the License, or (at your option) any later version. +! +! PICLas is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty +! of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License v3.0 for more details. +! +! You should have received a copy of the GNU General Public License along with PICLas. If not, see . +!================================================================================================================================== +#include "piclas.h" + +MODULE MOD_RayTracing +!=================================================================================================================================== +! Module for the main radiation transport routines +!=================================================================================================================================== +! MODULES +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +PRIVATE + +INTERFACE RayTracing + MODULE PROCEDURE RayTracing +END INTERFACE + +!----------------------------------------------------------------------------------------------------------------------------------- +! GLOBAL VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! Private Part --------------------------------------------------------------------------------------------------------------------- +! Public Part ---------------------------------------------------------------------------------------------------------------------- +PUBLIC :: RayTracing +!=================================================================================================================================== + +CONTAINS + +SUBROUTINE RayTracing() +!=================================================================================================================================== +!> Main routine for the Radiation Transport +!=================================================================================================================================== +! MODULES +USE MOD_Globals +USE MOD_Mesh_Vars ,ONLY : nElems +USE MOD_Particle_Mesh_Vars ,ONLY : GEO, nComputeNodeElems, ElemMidPoint_Shared, ElemVolume_Shared +USE MOD_RadiationTrans_Vars ,ONLY : Radiation_Emission_Spec_Total, RadTrans, RadEmiAdaptPhotonNum, RadTransObsVolumeFrac +USE MOD_RadiationTrans_Vars ,ONLY : PhotonProps, RadiationDirectionModel, RadTransPhotPerCellLoc, RadObservationPoint +USE MOD_RadiationTrans_Vars ,ONLY : RadTransPhotPerCell, RadTransPhotPerCell_Shared_Win, RadiationPhotonWaveLengthModel +USE MOD_RadiationTrans_Vars ,ONLY : RadObservationPointMethod +USE MOD_Photon_Tracking ,ONLY : PhotonTriaTracking, Photon2DSymTracking +USE MOD_Radiation_Vars ,ONLY : RadiationSwitches +USE MOD_DSMC_Vars ,ONLY : RadialWeighting +USE MOD_Mesh_Tools ,ONLY: GetGlobalElemID +USE MOD_Output ,ONLY: PrintStatusLineRadiation +USE MOD_MPI_Shared_Vars +USE MOD_MPI_Shared +USE MOD_Particle_Vars ,ONLY: Symmetry +! IMPLICIT VARIABLE HANDLING + IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +INTEGER :: iElem, nPhotons, iRay, nPhotonsCN, photonCount, iPhotLoc, RayVisCount, LocRayNum, RayDisp +INTEGER :: firstElem, lastElem, firstPhoton, lastPhoton +REAL :: Bounds(1:2,1:3) ! Bounds(1,1:3) --> maxCoords , Bounds(2,1:3) --> minCoords +REAL :: RandRot(3,3) !, PartPos(1:3) +!=================================================================================================================================== + +SWRITE(UNIT_stdOut,'(A)') ' Start Ray Tracing Calculation ...' + + + +photonCount = 0 +RayVisCount = 0 +IF(nProcs.GT.NumRays) CALL abort(__STAMP__,'Use more rays!') +LocRayNum = NumRays/nProcs +IF(myrank.LT.MOD(NumRays,nProcs)) LocRayNum = LocRayNum + 1 +RayDisp = INT(LocRayNum/20) + + + +DO iRay = 1, LocRayNum + IF(MPIroot.AND.(MOD(RayVisCount,RayDisp).EQ.0)) CALL PrintStatusLineRadiation(REAL(RayVisCount),REAL(1),REAL(LocRayNum),.TRUE.) + RayVisCount = RayVisCount + 1 + PhotonProps%PhotonPos(1:3) = SetRayPos() + PhotonProps%PhotonLastPos(1:3) = PhotonProps%PhotonPos(1:3) + + ! Loop over all sides of a specific iPartBoundary and find the side where the ray enters the domain + ! Loop nBCSides + ! count number of nSides connected to iPartBoundary BCSideID + nElem (local) + 1:nBCSides + SideID -> elemID -> glboalElemID->NonUniqueGlobalSideID + NonUniqueGlobalSideID + SideInfo_Shared(SIDE_BCID,NonUniqueGlobalSideID) + + + PhotonProps%ElemID = GetGlobalElemID(iElem) + IF ((photonCount.LT.firstPhoton)) THEN + iPhotLoc = firstPhoton - photonCount + iPhot - 1 + ELSE + iPhotLoc = iPhot + END IF + PhotonProps%PhotonDirection(1:3) = SetPhotonStartDirection(iElem, iPhotLoc, RandRot) + IF ((RadObservationPointMethod.EQ.2).AND.RadObservationPoint%CalcFullSpectra) THEN + PhotonProps%WaveLength = iPhotLoc + ELSE + IF (RadiationPhotonWaveLengthModel.EQ.1) THEN + PhotonProps%WaveLength = SetParticleWavelengthAR(iElem) + ELSE + PhotonProps%WaveLength = SetParticleWavelengthBiSec(iElem) + END IF + END IF + PhotonProps%PhotonEnergy = SetPhotonEnergy(iElem,PhotonProps%PhotonPos(1:3), PhotonProps%WaveLength) + CALL PhotonTriaTracking() +END DO +photonCount = photonCount + RadTransPhotPerCell(iELem) + +END SUBROUTINE RayTracing + + +FUNCTION SetPhotonEnergy(iElem, Point, iWave) +!=================================================================================================================================== +!> Calculation of the vibrational temperature (zero-point search) for the TSHO (Truncated Simple Harmonic Oscillator) +!=================================================================================================================================== +! MODULES +USE MOD_Globals +USE MOD_Globals_Vars, ONLY : Pi +USE MOD_RadiationTrans_Vars ,ONLY : RadEmiAdaptPhotonNum, Radiation_Emission_Spec_Total, RadTrans, RadTransPhotPerCell +USE MOD_RadiationTrans_Vars ,ONLY : RadObservationPoint, RadObservationPointMethod,RadTransObsVolumeFrac,RadObservationPOI +USE MOD_Particle_Mesh_Vars ,ONLY : ElemVolume_Shared +USE MOD_Radiation_Vars ,ONLY : RadiationParameter,Radiation_Emission_spec +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES +INTEGER, INTENT(IN) :: iElem +REAL, INTENT(IN) :: Point(3) +INTEGER, INTENT(IN), OPTIONAL :: iWave +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +REAL :: SetPhotonEnergy +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +!REAL :: ProjectedDist(3), Dist(3), ClosestPoint(3), FarthestPoint(3), Vec1(3), Vec2(3), fullangle +REAL :: cosTheta, Dist(3), DistNorm(3), spaceangle, absdistnorm +!=================================================================================================================================== +IF (RadEmiAdaptPhotonNum) THEN + SetPhotonEnergy = Radiation_Emission_Spec_Total(iElem)*ElemVolume_Shared(iElem)*RadTransObsVolumeFrac(iElem) / RadTransPhotPerCell(iElem) +ELSE + SetPhotonEnergy = Radiation_Emission_Spec_Total(iElem)*ElemVolume_Shared(iElem)*RadTransObsVolumeFrac(iElem) / (RadTrans%NumPhotonsPerCell) +END IF + +IF (RadObservationPointMethod.EQ.1) THEN + Dist(1:3) = Point(1:3) - RadObservationPoint%MidPoint(1:3) + absdistnorm = VECNORM(Dist(1:3)) + DistNorm(1:3) = Dist(1:3)/absdistnorm + cosTheta = DOT_PRODUCT(RadObservationPoint%ViewDirection(1:3),DistNorm(1:3))/(VECNORM(RadObservationPoint%ViewDirection(1:3))*VECNORM(DistNorm(1:3))) + spaceangle = cosTheta * RadObservationPoint%Area/(absdistnorm*absdistnorm) +! ProjectedDist(1:3) = Dist(1:3) - DOT_PRODUCT(RadObservationPoint%ViewDirection(1:3),Dist(1:3))*RadObservationPoint%ViewDirection(1:3) +! ClosestPoint(1:3) = RadObservationPoint%MidPoint(1:3) + RadObservationPoint%Diameter/2.*ProjectedDist(1:3)/VECNORM(ProjectedDist(1:3)) +! FarthestPoint(1:3) = RadObservationPoint%MidPoint(1:3) - RadObservationPoint%Diameter/2.*ProjectedDist(1:3)/VECNORM(ProjectedDist(1:3)) +! Vec1(1:3) = ClosestPoint(1:3) - Point(1:3) +! Vec2(1:3) = FarthestPoint(1:3) - Point(1:3) +! fullangle = ACOS(DOT_PRODUCT(Vec1,Vec2)/(VECNORM(Vec1)*VECNORM(Vec2))) + SetPhotonEnergy = SetPhotonEnergy * spaceangle/(4.*Pi) +ELSEIF (RadObservationPointMethod.EQ.2) THEN + IF (RadObservationPoint%CalcFullSpectra) THEN + SetPhotonEnergy = Radiation_Emission_Spec(iWave, iElem) * RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor & + *ElemVolume_Shared(iElem)*RadTransObsVolumeFrac(iElem) + ELSE + SetPhotonEnergy = SetPhotonEnergy /(4.*Pi) + END IF + SetPhotonEnergy = SetPhotonEnergy / (ElemVolume_Shared(iElem)*RadTransObsVolumeFrac(iElem))*RadObservationPOI(7, iElem) +END IF + +END FUNCTION SetPhotonEnergy + +FUNCTION SetRayPos() +!=================================================================================================================================== +!> Calculation of the vibrational temperature (zero-point search) for the TSHO (Truncated Simple Harmonic Oscillator) +!=================================================================================================================================== +! MODULES +USE MOD_Globals +USE MOD_RadiationTrans_Vars ,ONLY: RadiationPhotonPosModel, RadObservationPointMethod, RadObservationPOI +USE MOD_Particle_Mesh_Tools ,ONLY: ParticleInsideQuad3D +USE MOD_RadiationTrans_Init ,ONLY: HALTON +!USE MOD_PARTICLE_Vars, ONLY : Symmetry2DAxisymmetric ! USE MOD_PARTICLE_Vars, ONLY : Symmetry2DAxisymmetric +USE MOD_Particle_Mesh_Vars ,ONLY: BoundsOfElem_Shared +USE MOD_Mesh_Tools ,ONLY: GetGlobalElemID +USE MOD_Photon_TrackingTools ,ONLY: PointInObsCone +USE MOD_Particle_Mesh_Vars ,ONLY: GEO +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +REAL :: SetPhotonPos(3) +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +REAL :: Particle_pos(3),radius +INTEGER :: i +LOGICAL :: ARM_Gauss +REAL :: RandVal(2),RandVal1 +!=================================================================================================================================== +CALL RANDOM_NUMBER(RandVal) +SetPhotonPos = (/RandVal(1)*(GEO%xmaxglob-GEO%xminglob)+GEO%xminglob,& + RandVal(2)*(GEO%ymaxglob-GEO%yminglob)+GEO%yminglob,& + GEO%zmaxglob/) +END FUNCTION SetRayPos + +FUNCTION SetPhotonStartDirection(iElem, iPhot, RandRot) +!=================================================================================================================================== +! modified particle emmission for LD case +!=================================================================================================================================== +! MODULES +USE MOD_Globals +USE MOD_Globals_Vars, ONLY : Pi +USE MOD_RadiationTrans_Vars ,ONLY : RadiationDirectionModel, RadTransPhotPerCell, RadObservationPointMethod,RadObservationPoint +USE MOD_RadiationTrans_Vars ,ONLY : PhotonProps +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES +INTEGER, INTENT(IN) :: iElem, iPhot +REAL, INTENT(IN) :: RandRot(3,3) +!----------------------------------------------------------------------------------------------------------------------------------- +! INOUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +REAL :: SetPhotonStartDirection(3) +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +REAL :: iRan,RandomDirection(2), X_new, Y_new, start, incr, SpiralPos, SpiralStep +INTEGER :: RadMod +!=================================================================================================================================== + SELECT CASE(RadiationDirectionModel) + CASE(1) + RadMod = RadiationDirectionModel + CASE(2) + IF (RadTransPhotPerCell(iElem).EQ.1) THEN + RadMod = 1 + ELSE + RadMod = RadiationDirectionModel + END IF + CASE DEFAULT + CALL abort(& + __STAMP__& + ,' ERROR: Radiation-DirectionModel not implemented!. (unknown case)') + END SELECT !PartBound%MapToPartBC(BC(SideID) + IF (RadObservationPointMethod.EQ.1) THEN + CALL RANDOM_NUMBER(iRan) + RandomDirection(1) = RadObservationPoint%Diameter/2. * SQRT(iRan) + CALL RANDOM_NUMBER(iRan) + RandomDirection(2) = iRan * 2. * Pi + SetPhotonStartDirection(1) = 0.0 + SetPhotonStartDirection(2) = RandomDirection(1) * COS(RandomDirection(2)) + SetPhotonStartDirection(3) = RandomDirection(1) * SIN(RandomDirection(2)) + SetPhotonStartDirection(1:3) = MATMUL(RadObservationPoint%OrthoNormBasis, SetPhotonStartDirection(1:3)) + SetPhotonStartDirection(1:3) = SetPhotonStartDirection(1:3) + RadObservationPoint%MidPoint(1:3) + SetPhotonStartDirection(1:3) = SetPhotonStartDirection(1:3) - PhotonProps%PhotonPos(1:3) + SetPhotonStartDirection(1:3) = SetPhotonStartDirection(1:3) / VECNORM(SetPhotonStartDirection(1:3)) + ELSEIF (RadObservationPointMethod.EQ.2) THEN +! SetPhotonStartDirection(1:3) = RadObservationPoint%MidPoint(1:3) +! SetPhotonStartDirection(1:3) = SetPhotonStartDirection(1:3) - RadObservationPoint%ViewDirection(1:3) + SetPhotonStartDirection(1:3) = -RadObservationPoint%ViewDirection(1:3) + SetPhotonStartDirection(1:3) = SetPhotonStartDirection(1:3) / VECNORM(SetPhotonStartDirection(1:3)) + ELSE + SELECT CASE(RadMod) + CASE(1) + CALL RANDOM_NUMBER(iRan) + RandomDirection(1) = 2.*iRan - 1. + CALL RANDOM_NUMBER(iRan) + RandomDirection(2) = 2.*Pi*iRan - Pi + SetPhotonStartDirection(1) = SIN(RandomDirection(2))*SQRT(1.-RandomDirection(1)**2.) + SetPhotonStartDirection(2) = COS(RandomDirection(2))*SQRT(1.-RandomDirection(1)**2.) + SetPhotonStartDirection(3) = RandomDirection(1) + CASE(2) + SpiralStep = 0.1+1.2*REAL(RadTransPhotPerCell(iElem)) + start = (-1. + 1./(REAL(RadTransPhotPerCell(iElem))-1.)) + incr = (2.-2./(REAL(RadTransPhotPerCell(iElem))-1.))/(REAL(RadTransPhotPerCell(iElem))-1.) + SpiralPos = start + (REAL(iPhot)-1.) *incr + X_new = SpiralPos * SpiralStep + Y_new = Pi/2.*SIGN(1.,SpiralPos)*(1.-SQRT(1.-ABS(SpiralPos))) + SetPhotonStartDirection(1) = COS(X_new)*COS(Y_new) + SetPhotonStartDirection(2) = SIN(X_new)*COS(Y_new) + SetPhotonStartDirection(3) = SIN(Y_new) + SetPhotonStartDirection(1:3) = MATMUL(RandRot, SetPhotonStartDirection(1:3)) + CASE DEFAULT + CALL abort(& + __STAMP__& + ,' ERROR: Radiation-DirectionModel not implemented!. (unknown case)') + END SELECT !PartBound%MapToPartBC(BC(SideID) + END IF + +END FUNCTION SetPhotonStartDirection + +FUNCTION RandomRotMatrix() +!=================================================================================================================================== +! Calculation of the vibrational temperature (zero-point search) for the TSHO (Truncated Simple Harmonic Oscillator) +!=================================================================================================================================== +! MODULES + USE MOD_Globals_Vars, ONLY : Pi +! IMPLICIT VARIABLE HANDLING + IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES + REAL :: RandomRotMatrix(3,3) +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES + REAL :: alpha(3) , A(3,3) +!=================================================================================================================================== + CALL RANDOM_NUMBER(alpha) + alpha(1:3) = 2.*alpha(1:3)*Pi + RandomRotMatrix = RESHAPE((/1.,0.,0.,0.,COS(alpha(1)),SIN(alpha(1)),0.,-SIN(alpha(1)), COS(alpha(1))/),(/3,3/)) + A = RESHAPE((/COS(alpha(2)),0.,-SIN(alpha(2)),0.,1.,0.,SIN(alpha(2)),0.0, COS(alpha(2))/),(/3,3/)) + RandomRotMatrix = MATMUL(A,RandomRotMatrix) + A = RESHAPE((/COS(alpha(3)),SIN(alpha(3)),0.,-SIN(alpha(3)),COS(alpha(3)),0.,0.,0.0, 1./),(/3,3/)) + RandomRotMatrix = MATMUL(A, RandomRotMatrix) + +END FUNCTION RandomRotMatrix + + +FUNCTION SetParticleWavelengthAR(iElem) +!=================================================================================================================================== +! modified particle emmission for LD case +!=================================================================================================================================== +! MODULES +USE MOD_Globals +USE MOD_Globals_Vars, ONLY : Pi +USE MOD_RadiationTrans_Vars, ONLY : Radiation_Emission_Spec_Max +USE MOD_Radiation_Vars, ONLY: Radiation_Emission_spec, RadiationParameter +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES +INTEGER, INTENT(IN) :: iElem +!----------------------------------------------------------------------------------------------------------------------------------- +! INOUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +INTEGER :: SetParticleWavelengthAR +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +INTEGER :: iWaveLength, iWave +REAL :: iRan, iRadPower +!=================================================================================================================================== + + CALL RANDOM_NUMBER(iRan) + iWaveLength = INT(RadiationParameter%WaveLenDiscrCoarse*iRan) + 1 + IF ((RadiationParameter%WaveLenReductionFactor.GT.1).AND.(iWaveLength.EQ.RadiationParameter%WaveLenDiscrCoarse)) THEN + IF (MOD(RadiationParameter%WaveLenDiscr,RadiationParameter%WaveLenDiscrCoarse).NE.0) THEN + iRadPower = 4.*Pi*Radiation_Emission_Spec(RadiationParameter%WaveLenDiscrCoarse, iElem) * RadiationParameter%WaveLenIncr & + * (1.+RadiationParameter%WaveLenReductionFactor) + ELSE + iRadPower = 4.*Pi*Radiation_Emission_Spec(iWaveLength,iElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor + END IF + ELSE + iRadPower = 4.*Pi*Radiation_Emission_Spec(iWaveLength,iElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor + END IF + CALL RANDOM_NUMBER(iRan) + DO WHILE (iRan.GT.(iRadPower/Radiation_Emission_Spec_Max(iElem))) + CALL RANDOM_NUMBER(iRan) + iWaveLength = INT(RadiationParameter%WaveLenDiscrCoarse*iRan) + 1 + IF ((RadiationParameter%WaveLenReductionFactor.GT.1).AND.(iWaveLength.EQ.RadiationParameter%WaveLenDiscrCoarse)) THEN + IF (MOD(RadiationParameter%WaveLenDiscr,RadiationParameter%WaveLenDiscrCoarse).NE.0) THEN + iRadPower = 4.*Pi*Radiation_Emission_Spec(RadiationParameter%WaveLenDiscrCoarse, iElem) * RadiationParameter%WaveLenIncr & + * (1.+RadiationParameter%WaveLenReductionFactor) + ELSE + iRadPower = 4.*Pi*Radiation_Emission_Spec(iWaveLength,iElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor + END IF + ELSE + iRadPower = 4.*Pi*Radiation_Emission_Spec(iWaveLength,iElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor + END IF + CALL RANDOM_NUMBER(iRan) + END DO + SetParticleWavelengthAR = iWaveLength + +END FUNCTION SetParticleWavelengthAR + + +FUNCTION SetParticleWavelengthBiSec(iElem) +!=================================================================================================================================== +! modified particle emmission for LD case +!=================================================================================================================================== +! MODULES +USE MOD_Globals +USE MOD_Globals_Vars, ONLY : Pi +USE MOD_RadiationTrans_Vars, ONLY : Radiation_Emission_Spec_Total +USE MOD_Radiation_Vars, ONLY: Radiation_Emission_spec, RadiationParameter +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES +INTEGER, INTENT(IN) :: iElem +!----------------------------------------------------------------------------------------------------------------------------------- +! INOUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +INTEGER :: SetParticleWavelengthBiSec +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +INTEGER :: iWaveLength, iWave, iWaveOld, iWaveMin, iWaveMax +REAL :: iRan, iRadPower, iRadPower2 +!=================================================================================================================================== + + CALL RANDOM_NUMBER(iRan) + iWaveOld = 1 + iWaveLength = INT(RadiationParameter%WaveLenDiscrCoarse/2) + iWaveMin = 1 + iWaveMax = RadiationParameter%WaveLenDiscrCoarse + IF (iWaveLength.EQ.RadiationParameter%WaveLenDiscrCoarse) THEN + iRadPower = Radiation_Emission_Spec_Total(iElem) + ELSE + iRadPower = 0.0 + DO iWave = 1, iWaveLength + iRadPower = iRadPower + 4.*Pi*Radiation_Emission_Spec(iWave,iElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor + END DO + END IF + + DO + IF (iRan.GT.(iRadPower/Radiation_Emission_Spec_Total(iElem)))THEN + iWaveMin = iWaveLength + ELSE + iWaveMax = iWaveLength + END IF + iWaveOld = iWaveLength + iWaveLength = INT((iWaveMax+iWaveMin)/2) + IF (iWaveLength.EQ.RadiationParameter%WaveLenDiscrCoarse) THEN + iRadPower = Radiation_Emission_Spec_Total(iElem) + ELSE + iRadPower = 0.0 + DO iWave = 1, iWaveLength + iRadPower = iRadPower + 4.*Pi*Radiation_Emission_Spec(iWave,iElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor + END DO + END IF + IF (ABS(iWaveOld-iWaveLength).LE.1) EXIT + + END DO + + iWaveOld = iWaveLength + IF (iRan.LT.(iRadPower/Radiation_Emission_Spec_Total(iElem))) THEN + IF (iWaveLength.EQ.1) THEN + iWaveLength = iWaveLength + ELSE + iWaveLength = iWaveLength - 1 + iRadPower2 = 0.0 + DO iWave = 1, iWaveLength + iRadPower2 = iRadPower2 + 4.*Pi*Radiation_Emission_Spec(iWave,iElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor + END DO + IF (ABS(iRan-(iRadPower/Radiation_Emission_Spec_Total(iElem))).LT.ABS(iRan-(iRadPower2/Radiation_Emission_Spec_Total(iElem)))) THEN + iWaveLength = iWaveOld + END IF + END IF + ELSE + iWaveLength = iWaveLength + 1 + iRadPower2 = 0.0 + DO iWave = 1, iWaveLength + iRadPower2 = iRadPower2 + 4.*Pi*Radiation_Emission_Spec(iWave,iElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor + END DO + IF (ABS(iRan-(iRadPower/Radiation_Emission_Spec_Total(iElem))).LT.ABS(iRan-(iRadPower2/Radiation_Emission_Spec_Total(iElem)))) THEN + iWaveLength = iWaveOld + END IF + END IF + SetParticleWavelengthBiSec = iWaveLength + +END FUNCTION SetParticleWavelengthBiSec + +END MODULE MOD_RayTracing diff --git a/src/radiation/ray_tracing/raytrace_vars.f90 b/src/radiation/ray_tracing/raytrace_vars.f90 new file mode 100644 index 000000000..8b1241222 --- /dev/null +++ b/src/radiation/ray_tracing/raytrace_vars.f90 @@ -0,0 +1,71 @@ +!================================================================================================================================== +! Copyright (c) 2023 - 2023 Marcel Pfeiffer, Stephen Copplestone +! +! This file is part of PICLas (gitlab.com/piclas/piclas). PICLas is free software: you can redistribute it and/or modify +! it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 +! of the License, or (at your option) any later version. +! +! PICLas is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty +! of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License v3.0 for more details. +! +! You should have received a copy of the GNU General Public License along with PICLas. If not, see . +!================================================================================================================================== +#include "piclas.h" + +MODULE MOD_RayTracing_Vars +!=================================================================================================================================== +! Contains the tadiation transport variables +!=================================================================================================================================== +! MODULES +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +PUBLIC +SAVE +!----------------------------------------------------------------------------------------------------------------------------------- +! GLOBAL VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +TYPE tRayTrace + REAL :: PulseDuration + REAL :: WaistRadius + REAL :: WaveLength + REAL :: RepetitionRate + REAL :: Power +END TYPE + +TYPE (tRayTrace) :: Ray + +TYPE tRadTrans + INTEGER :: NumPhotonsPerCell + REAL :: GlobalRadiationPower + REAL :: ScaledGlobalRadiationPower + INTEGER :: GlobalPhotonNum +END TYPE + +TYPE (tRadTrans) :: RadTrans + +TYPE tPhotonProps + REAL :: PhotonPos(3) + REAL :: PhotonLastPos(3) + REAL :: PhotonDirection(3) + REAL :: PhotonEnergy + INTEGER :: ElemID + INTEGER :: WaveLength +END TYPE + +TYPE (tPhotonProps) :: PhotonProps + +LOGICAL :: AdaptiveRays +INTEGER :: NumRays +INTEGER :: RayPosModel +REAL :: RayDirection(3) + +REAL, ALLOCATABLE :: RayElemPassedEnergy(:) +REAL, ALLOCATABLE :: RaySampWall(:,:) +#if USE_MPI +INTEGER :: RaySampWall_Shared_Win +REAL,POINTER :: RaySampWall_Shared(:,:) +INTEGER :: RayElemPassedEnergy_Shared_Win +REAL,POINTER :: RayElemPassedEnergy_Shared(:) +#endif +!=================================================================================================================================== +END MODULE MOD_RayTracing_Vars From 5525f4768b25eba8f0dc8c435dffc6f87f1c9c0f Mon Sep 17 00:00:00 2001 From: Franziska Hild Date: Wed, 19 Apr 2023 16:00:47 +0200 Subject: [PATCH 063/495] Calculation of TEqui for correction of energy conservation BGK - ongoing, tbc --- src/particles/bgk/bgk_colloperator.f90 | 176 +++++++++++++++++++------ 1 file changed, 134 insertions(+), 42 deletions(-) diff --git a/src/particles/bgk/bgk_colloperator.f90 b/src/particles/bgk/bgk_colloperator.f90 index 05e0738d7..d00209398 100644 --- a/src/particles/bgk/bgk_colloperator.f90 +++ b/src/particles/bgk/bgk_colloperator.f90 @@ -89,10 +89,11 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume, AveragingVal REAL,PARAMETER :: RelEneTol=1e-12 ! Relative tolerance applied to conservation of energy before/after reaction #endif /* CODE_ANALYZE */ REAL :: totalWeightSpec(nSpecies), totalWeight, partWeight, CellTemptmp, MassIC_Mixture -REAL :: EVibSpec(nSpecies), ERotSpec(nSpecies), Xi_VibSpec(nSpecies), Xi_RotSpec(nSpecies) -REAL :: ERotTtransSpecMean(nSpecies), EVibTtransSpecMean(nSpecies), Xi_VibRelSpec(nSpecies), CellTempRel +REAL :: EVibSpec(nSpecies), Xi_VibSpec(nSpecies), Xi_VibRelSpec(nSpecies) +REAL :: ERotSpec(nSpecies), Xi_RotSpec(nSpecies), Xi_RotTotal +REAL :: ERotTtransSpecMean(nSpecies), EVibTtransSpecMean(nSpecies), CellTempRel, TEqui REAL :: TVibSpec(nSpecies), TRotSpec(nSpecies), VibRelaxWeightSpec(nSpecies), RotRelaxWeightSpec(nSpecies) -REAL :: collisionfreqSpec(nSpecies),rotrelaxfreqSpec(nSpecies), vibrelaxfreqSpec(nSpecies) +REAL :: collisionfreqSpec(nSpecies),rotrelaxfreqSpec(nSpecies), vibrelaxfreqSpec(nSpecies), betaR(nSpecies), betaV(nSpecies) !=================================================================================================================================== #ifdef CODE_ANALYZE ! Momentum and energy conservation check: summing up old values @@ -183,19 +184,12 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume, AveragingVal END IF END IF -! 4.) Determine the number of particles undergoing a relaxation (including vibration and rotation) +! 4.) Determine the relaxation temperatures and energies as well as the number of particles undergoing a relaxation (including vibration and rotation) ALLOCATE(iPartIndx_NodeRelax(nPart), iPartIndx_NodeRelaxTemp(nPart)) iPartIndx_NodeRelax = 0; iPartIndx_NodeRelaxTemp = 0 ALLOCATE(iPartIndx_NodeRelaxRot(nPart),iPartIndx_NodeRelaxVib(nPart)) iPartIndx_NodeRelaxRot = 0; iPartIndx_NodeRelaxVib = 0 -CALL DetermineRelaxPart(nPart, iPartIndx_Node, relaxfreq, dtCell, nRelax, nRotRelax, nVibRelax, & - RotRelaxWeightSpec, VibRelaxWeightSpec, iPartIndx_NodeRelax, iPartIndx_NodeRelaxTemp, iPartIndx_NodeRelaxRot, & - iPartIndx_NodeRelaxVib, vBulk, OldEnRot, OldEn, rotrelaxfreqSpec, vibrelaxfreqSpec) - -! Return if no particles are undergoing a relaxation -IF ((nRelax.EQ.0).AND.(nRotRelax.EQ.0).AND.(nVibRelax.EQ.0)) RETURN - ! Allocate Xi_vib_DOF IF(BGKDoVibRelaxation) THEN IF(DSMC%NumPolyatomMolecs.GT.0) THEN @@ -207,14 +201,20 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume, AveragingVal END IF END IF -! 5.) Determine the relaxation temperatures and energies as well as the new rotational and vibrational states of molecules -! undergoing a relaxation -CALL CalcTRelax(ERotSpec, Xi_RotSpec, EVibSpec, totalWeightSpec, totalWeight, CellTemp, relaxfreq, rotrelaxfreqSpec, & - vibrelaxfreqSpec, ERotTtransSpecMean, EVibTtransSpecMean, Xi_VibRelSpec, Xi_vib_DOF, nXiVibDOF, CellTempRel) +CALL CalcTRelax(ERotSpec, Xi_RotSpec, EVibSpec, totalWeightSpec, totalWeight, nPart, dtCell, CellTemp, TRotSpec, relaxfreq, rotrelaxfreqSpec, & + vibrelaxfreqSpec, ERotTtransSpecMean, EVibTtransSpecMean, Xi_VibRelSpec, Xi_vib_DOF, nXiVibDOF, CellTempRel, TEqui, betaR, betaV) + +CALL DetermineRelaxPart(nPart, iPartIndx_Node, relaxfreq, dtCell, nRelax, nRotRelax, nVibRelax, & + RotRelaxWeightSpec, VibRelaxWeightSpec, iPartIndx_NodeRelax, iPartIndx_NodeRelaxTemp, iPartIndx_NodeRelaxRot, & + iPartIndx_NodeRelaxVib, vBulk, OldEnRot, OldEn, rotrelaxfreqSpec, vibrelaxfreqSpec, betaR, betaV) + +! Return if no particles are undergoing a relaxation +IF ((nRelax.EQ.0).AND.(nRotRelax.EQ.0).AND.(nVibRelax.EQ.0)) RETURN +! 5.) Determine the new rotational and vibrational states of molecules undergoing a relaxation IF(ANY(SpecDSMC(:)%InterID.EQ.2).OR.ANY(SpecDSMC(:)%InterID.EQ.20)) THEN CALL RelaxInnerEnergy(nVibRelax, nRotRelax, iPartIndx_NodeRelaxVib, iPartIndx_NodeRelaxRot, nXiVibDOF, Xi_vib_DOF, & - Xi_VibRelSpec, Xi_RotSpec, VibEnergyDOF, CellTemp, NewEnVib, NewEnRot) + Xi_VibRelSpec, Xi_RotSpec, VibEnergyDOF, TEqui, NewEnVib, NewEnRot) END IF ! 6.) Sample new particle velocities from the target distribution function, depending on the chosen model @@ -249,20 +249,23 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume, AveragingVal ! 7.) Vibrational energy of the molecules: Ensure energy conservation by scaling the new vibrational states with the factor alpha IF(ANY(SpecDSMC(:)%InterID.EQ.2).OR.ANY(SpecDSMC(:)%InterID.EQ.20)) THEN + ! = tbc ======= use TEqui ============================================================================================== CALL EnergyConsVib(nPart, nVibRelax, VibRelaxWeightSpec, iPartIndx_NodeRelaxVib, NewEnVib, OldEn, nXiVibDOF, VibEnergyDOF, & - CellTemp, EVibTtransSpecMean) + CellTemp, EVibTtransSpecMean, Xi_VibRelSpec, Xi_vib_DOF) END IF ! Remaining vibrational (+ translational) energy + rotational energy for translation and rotation OldEn = OldEn + OldEnRot DO iSpec = 1, nSpecies + ! = tbd ======= nRotRelaxSpec or RotRelaxWeightSpec? ======================================================================= + Xi_RotTotal = Xi_RotTotal + Xi_RotSpec(iSpec)*RotRelaxWeightSpec(iSpec) ! ERotTtransSpecMean(iSpec)*RotRelaxWeightSpec(iSpec) is energy that should be in rotation - OldEn = OldEn - ERotTtransSpecMean(iSpec)*RotRelaxWeightSpec(iSpec) + !OldEn = OldEn - ERotTtransSpecMean(iSpec)*RotRelaxWeightSpec(iSpec) END DO ! 8.) Determine the new particle state and ensure energy conservation by scaling the new velocities with the factor alpha ! Calculation of scaling factor alpha -alpha = SQRT(OldEn/NewEn) +alpha = SQRT(OldEn/NewEn*(3.*(nPart-1.))/(Xi_RotTotal+3.*(nPart-1.))) ! Calculation of the final particle velocities with vBulkAll (average flow velocity before relaxation), scaling factor alpha, ! the particle velocity PartState(4:6,iPart) after the relaxation but before the energy conservation and vBulk (average value of ! the latter) @@ -280,7 +283,9 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume, AveragingVal ! Calculate scaling factor alpha per species, see M. Pfeiffer, "Extending the particle ellipsoidal statistical Bhatnagar-Gross- ! Krook method to diatomic molecules including quantized vibrational energies", Phys. Fluids 30, 116103 (2018) IF (NewEnRot(iSpec).GT.0.0) THEN - alphaRot(iSpec) = ERotTtransSpecMean(iSpec)*RotRelaxWeightSpec(iSpec)/NewEnRot(iSpec) + ! = tbd ======= nRotRelaxSpec or RotRelaxWeightSpec? ======================================================================= + alphaRot(iSpec) = OldEn/NewEnRot(iSpec)*(Xi_RotSpec(iSpec)*RotRelaxWeightSpec(iSpec)/(Xi_RotTotal+3.*(nPart-1.))) + !alphaRot(iSpec) = ERotTtransSpecMean(iSpec)*RotRelaxWeightSpec(iSpec)/NewEnRot(iSpec) ELSE alphaRot(iSpec) = 0.0 END IF @@ -780,7 +785,7 @@ END SUBROUTINE CalcGasProperties SUBROUTINE DetermineRelaxPart(nPart, iPartIndx_Node, relaxfreq, dtCell, nRelax, nRotRelax, nVibRelax, & RotRelaxWeightSpec, VibRelaxWeightSpec, iPartIndx_NodeRelax, iPartIndx_NodeRelaxTemp, iPartIndx_NodeRelaxRot, & - iPartIndx_NodeRelaxVib, vBulk, OldEnRot, OldEn, rotrelaxfreqSpec, vibrelaxfreqSpec) + iPartIndx_NodeRelaxVib, vBulk, OldEnRot, OldEn, rotrelaxfreqSpec, vibrelaxfreqSpec, betaR, betaV) !=================================================================================================================================== !> Determine the number of particles undergoing a relaxation (including vibration and rotation) !=================================================================================================================================== @@ -794,7 +799,7 @@ SUBROUTINE DetermineRelaxPart(nPart, iPartIndx_Node, relaxfreq, dtCell, nRelax, !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES INTEGER, INTENT(IN) :: nPart, iPartIndx_Node(nPart) -REAL, INTENT(IN) :: relaxfreq, dtCell, rotrelaxfreqSpec(nSpecies), vibrelaxfreqSpec(nSpecies) +REAL, INTENT(IN) :: relaxfreq, dtCell, rotrelaxfreqSpec(nSpecies), vibrelaxfreqSpec(nSpecies), betaR(nSpecies), betaV(nSpecies) !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES INTEGER, INTENT(OUT) :: iPartIndx_NodeRelax(:), iPartIndx_NodeRelaxTemp(:) @@ -832,7 +837,7 @@ SUBROUTINE DetermineRelaxPart(nPart, iPartIndx_Node, relaxfreq, dtCell, nRelax, ! Rotation CALL RANDOM_NUMBER(iRan) ! Calculate probability of rotational relaxation of a particle that relaxes towards the target distribution function - ProbAddPartRot = rotrelaxfreqSpec(iSpec)/relaxfreq + ProbAddPartRot = rotrelaxfreqSpec(iSpec)/relaxfreq*betaR(iSpec) IF (ProbAddPartRot.GT.iRan) THEN ! relaxation iPartIndx_NodeRelaxRot(iLoopRot) = iPartIndx_NodeRelax(iLoop) @@ -846,7 +851,7 @@ SUBROUTINE DetermineRelaxPart(nPart, iPartIndx_Node, relaxfreq, dtCell, nRelax, IF(BGKDoVibRelaxation) THEN CALL RANDOM_NUMBER(iRan) ! Calculate probability of vibrational relaxation of a particle that relaxes towards the target distribution function - ProbAddPartVib = vibrelaxfreqSpec(iSpec)/relaxfreq + ProbAddPartVib = vibrelaxfreqSpec(iSpec)/relaxfreq*betaV(iSpec) IF (ProbAddPartVib.GT.iRan) THEN ! relaxation iPartIndx_NodeRelaxVib(iLoopVib) = iPartIndx_NodeRelax(iLoop) @@ -874,8 +879,8 @@ SUBROUTINE DetermineRelaxPart(nPart, iPartIndx_Node, relaxfreq, dtCell, nRelax, END SUBROUTINE DetermineRelaxPart -SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, EVibSpec, totalWeightSpec, totalWeight, CellTemp, relaxfreq, rotrelaxfreqSpec, & - vibrelaxfreqSpec, ERotTtransSpecMean, EVibTtransSpecMean, Xi_VibRelSpec, Xi_vib_DOF, nXiVibDOF, CellTempRel) +SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, EVibSpec, totalWeightSpec, totalWeight, nPart, dtCell, CellTemp, TRotSpec, relaxfreq, rotrelaxfreqSpec, & + vibrelaxfreqSpec, ERotTtransSpecMean, EVibTtransSpecMean, Xi_VibRelSpec, Xi_vib_DOF, nXiVibDOF, CellTempRel, TEqui, betaR, betaV) !=================================================================================================================================== !> Calculate the relaxation energies and temperatures !=================================================================================================================================== @@ -889,23 +894,28 @@ SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, EVibSpec, totalWeightSpec, totalWeig IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES -INTEGER, INTENT(IN) :: nXiVibDOF -REAL, INTENT(IN) :: ERotSpec(nSpecies), Xi_RotSpec(nSpecies), EVibSpec(nSpecies) -REAL, INTENT(IN) :: totalWeightSpec(nSpecies), totalWeight, CellTemp!, MassFraction(nSpecies) +INTEGER, INTENT(IN) :: nPart, nXiVibDOF +REAL, INTENT(IN) :: TRotSpec(nSpecies), ERotSpec(nSpecies), Xi_RotSpec(nSpecies), EVibSpec(nSpecies) +REAL, INTENT(IN) :: totalWeightSpec(nSpecies), totalWeight, CellTemp, dtCell REAL, INTENT(IN) :: relaxfreq, rotrelaxfreqSpec(nSpecies), vibrelaxfreqSpec(nSpecies) !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES REAL, INTENT(OUT) :: ERotTtransSpecMean(nSpecies), EVibTtransSpecMean(nSpecies) -REAL, INTENT(OUT) :: Xi_VibRelSpec(nSpecies), Xi_vib_DOF(DSMC%NumPolyatomMolecs,nXiVibDOF), CellTempRel +REAL, INTENT(OUT) :: Xi_VibRelSpec(nSpecies), Xi_vib_DOF(DSMC%NumPolyatomMolecs,nXiVibDOF), CellTempRel, TEqui +REAL, INTENT(OUT) :: betaR(nSpecies), betaV(nSpecies) !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES INTEGER :: iSpec, iDOF, iPolyatMole -REAL :: ERotSpecMean(nSpecies), EVibSpecMean(nSpecies), TVibRelSpecMean, ETransRelMean -REAL :: EVibTtransPoly, TVibRelPoly +REAL :: RotFracSpec(nSpecies), VibFracSpec(nSpecies) +REAL :: ERotSpecMean(nSpecies), Xi_Rot_Spec(nSpecies), EVibSpecMean(nSpecies) +REAL :: EVibTtransPoly, TVibRelPoly, TVibRelSpecMean, ETransRelMean +REAL :: TEqui_Old, TEquiNum, TEquiDenom +REAL :: eps_prec=1.0E-0 !=================================================================================================================================== ! According to J. Mathiaud et. al., "An ES-BGK model for diatomic gases with correct relaxation rates for internal energies", ! European Journal of Mechanics - B/Fluids, 96, pp. 65-77, 2022 +RotFracSpec=0.0; VibFracSpec=0.0 ERotSpecMean=0.0; ERotTtransSpecMean=0.0; EVibSpecMean=0.0; EVibTtransSpecMean=0.0; Xi_VibRelSpec=0.0; Xi_vib_DOF=0.0 ETransRelMean=0.0; CellTempRel=0.0 @@ -915,7 +925,10 @@ SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, EVibSpec, totalWeightSpec, totalWeig ERotSpecMean(iSpec) = ERotSpec(iSpec)/totalWeightSpec(iSpec) ! Mean rotational energy per particle of a species for the mixture translational temperature, ERot(Ttrans) ERotTtransSpecMean(iSpec) = CellTemp * Xi_RotSpec(iSpec) * BoltzmannConst /2. - ! Mean rotational energy per particle of a species to satisfy the Landau-Teller equation + ! Rotational degrees of freedom of molecules + Xi_Rot_Spec(iSpec) = SpecDSMC(iSpec)%Xi_Rot + ! Calculate number of rotational relaxing molecules + RotFracSpec(iSpec) = totalWeightSpec(iSpec)*(rotrelaxfreqSpec(iSpec)/relaxfreq)*(1.-EXP(-relaxfreq*dtCell)) IF(BGKDoVibRelaxation) THEN ! Mean vibrational energy per particle of a species @@ -955,6 +968,9 @@ SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, EVibSpec, totalWeightSpec, totalWeig Xi_VibRelSpec(iSpec) = 0.0 END IF END IF + + ! Calculate number of vibrational relaxing molecules + VibFracSpec(iSpec) = totalWeightSpec(iSpec)*(vibrelaxfreqSpec(iSpec)/relaxfreq)*(1.-EXP(-relaxfreq*dtCell)) END IF ! Mean translational energy per particle to satisfy the Landau-Teller equation @@ -977,11 +993,73 @@ SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, EVibSpec, totalWeightSpec, totalWeig CALL abort(__STAMP__,'Negative energy for relaxation') END IF +! Calculation of equilibrium temperature for relaxation and energy conservation +TEqui_Old = 0.0 +TEquiNum = 3.*(nPart-1.)*CellTemp +TEquiDenom = 3.*(nPart-1.) +! Sum up over all species +DO iSpec = 1, nSpecies + IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN + ! - tbc ------ add vibration to calculation of TEqui ------------------------------------------------------------------------ + TEquiNum = TEquiNum + Xi_Rot_Spec(iSpec)*RotFracSpec(iSpec)*TRotSpec(iSpec) + TEquiDenom = TEquiDenom + Xi_Rot_Spec(iSpec)*RotFracSpec(iSpec) + END IF +END DO +TEqui = TEquiNum/TEquiDenom +print*, CellTemp, TEqui, CellTempRel, 'start' + +! Solving of equation system until accuracy eps_prec is reached +DO WHILE ( ABS( TEqui - TEqui_Old ) .GT. eps_prec ) + DO iSpec = 1, nSpecies + IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN + ! if difference small: equilibrium, no beta + IF (ABS(TRotSpec(iSpec)-TEqui).GT.1E-3) THEN + betaR(iSpec) = (TRotSpec(iSpec)-CellTemp)/(TRotSpec(iSpec)-TEqui) + IF (betaR(iSpec).LT.0.0) THEN + betaR(iSpec) = 1. + END IF + ! new calculation of number of rotational relaxing molecules with betaR + RotFracSpec(iSpec) = totalWeightSpec(iSpec)*(rotrelaxfreqSpec(iSpec)/relaxfreq)*(1.-EXP(-relaxfreq*dtCell))*betaR(iSpec) + END IF + ! IF(BGKDoVibRelaxation) + ! ! if difference small: equilibrium, no beta + ! IF (ABS(TVibSpec(iSpec)-TEqui).GT.1E-3) THEN + ! betaV(iSpec) = (TVibSpec(iSpec)-CellTemp)/(TVibSpec(iSpec)-TEqui) + ! IF (betaV(iSpec).LT.0.0) THEN + ! betaV(iSpec) = 1. + ! END IF + ! ! new calculation of number of rotational relaxing molecules + ! VibFracSpec(iSpec) = totalWeightSpec(iSpec)*(vibrelaxfreqSpec(iSpec)/relaxfreq)*(1.-EXP(-relaxfreq*dtCell))*betaV(iSpec) + ! END IF + ! END IF + ! ! new calculation of the vibrational degrees of freedom per species ----------------------------------------------------- + END IF + END DO + TEqui_Old = TEqui + ! new calculation of equilibrium temperature with new RotFracSpec, new VibFracSpec, new VibDOF(TEqui) in denominator + TEquiNum = 3.*(nPart-1.)*CellTemp + TEquiDenom = 3.*(nPart-1.) + ! Sum up over all species + DO iSpec = 1, nSpecies + IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN + ! - tbc - add vibration to calculation of TEqui ----------------------------------------------------------------------------- + TEquiNum = TEquiNum + Xi_Rot_Spec(iSpec)*RotFracSpec(iSpec)*TRotSpec(iSpec) + TEquiDenom = TEquiDenom + Xi_Rot_Spec(iSpec)*RotFracSpec(iSpec) + END IF + END DO + TEqui = TEquiNum/TEquiDenom + print*, TEqui, betaR + read* + ! - tbc - additional round for VibDOF(TEqui) and then TEqui with BGKDoVibRelaxation ------------------------------------------- +END DO + +! - tbc - kommentieren, Zeilenumbrüche, Subroutines tauschen ------------------------------------------------------------- + END SUBROUTINE CalcTRelax SUBROUTINE RelaxInnerEnergy(nVibRelax, nRotRelax, iPartIndx_NodeRelaxVib, iPartIndx_NodeRelaxRot, nXiVibDOF, Xi_vib_DOF, & - Xi_VibSpec, Xi_RotSpec, VibEnergyDOF, CellTemp, NewEnVib, NewEnRot) + Xi_VibSpec, Xi_RotSpec, VibEnergyDOF, TEqui, NewEnVib, NewEnRot) !=================================================================================================================================== !> Determine the new rotational and vibrational energy of relaxing particles !=================================================================================================================================== @@ -998,7 +1076,7 @@ SUBROUTINE RelaxInnerEnergy(nVibRelax, nRotRelax, iPartIndx_NodeRelaxVib, iPartI INTEGER, INTENT(IN) :: nXiVibDOF INTEGER, INTENT(IN) :: nVibRelax, nRotRelax, iPartIndx_NodeRelaxVib(nVibRelax), iPartIndx_NodeRelaxRot(nRotRelax) REAL, INTENT(IN) :: Xi_vib_DOF(DSMC%NumPolyatomMolecs,nXiVibDOF), Xi_VibSpec(nSpecies), Xi_RotSpec(nSpecies) -REAL, INTENT(IN) :: CellTemp +REAL, INTENT(IN) :: TEqui REAL, INTENT(INOUT) :: NewEnVib(nSpecies), NewEnRot(nSpecies) !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES @@ -1023,7 +1101,7 @@ SUBROUTINE RelaxInnerEnergy(nVibRelax, nRotRelax, iPartIndx_NodeRelaxVib, iPartI ! Polyatomic Species in Hypersonic Flow around a Flat-faced Cylinder", AIP Conference Proceedings 2132, 100001 (2019) DO iDOF = 1, PolyatomMolDSMC(iPolyatMole)%VibDOF CALL RANDOM_NUMBER(iRan) - VibEnergyDOF(iLoop,iDOF) = - LOG(iRan)*Xi_vib_DOF(iPolyatMole,iDOF)/2.*CellTemp*BoltzmannConst + VibEnergyDOF(iLoop,iDOF) = - LOG(iRan)*Xi_vib_DOF(iPolyatMole,iDOF)/2.*TEqui*BoltzmannConst PartStateIntEn(1,iPart) = PartStateIntEn(1,iPart)+VibEnergyDOF(iLoop,iDOF) END DO ! ELSE: diatomic, only one vibrational DOF, calculate new vibrational energy according to M. Pfeiffer, "Extending the particle @@ -1031,7 +1109,7 @@ SUBROUTINE RelaxInnerEnergy(nVibRelax, nRotRelax, iPartIndx_NodeRelaxVib, iPartI ! Phys. Fluids 30, 116103 (2018) ELSE CALL RANDOM_NUMBER(iRan) - PartStateIntEn( 1,iPart) = -LOG(iRan)*Xi_VibSpec(iSpec)/2.*CellTemp*BoltzmannConst + PartStateIntEn( 1,iPart) = -LOG(iRan)*Xi_VibSpec(iSpec)/2.*TEqui*BoltzmannConst END IF ! Sum up new vibrational energy per species NewEnVib(iSpec) = NewEnVib(iSpec) + PartStateIntEn(1,iPart) * partWeight @@ -1045,7 +1123,7 @@ SUBROUTINE RelaxInnerEnergy(nVibRelax, nRotRelax, iPartIndx_NodeRelaxVib, iPartI CALL RANDOM_NUMBER(iRan) ! Calculate new rotational energy according to M. Pfeiffer et. al., "Extension of Particle-based BGK Models to Polyatomic Species ! in Hypersonic Flow around a Flat-faced Cylinder", AIP Conference Proceedings 2132, 100001 (2019) - PartStateIntEn( 2,iPart) = -Xi_RotSpec(iSpec) / 2. * BoltzmannConst*CellTemp*LOG(iRan) + PartStateIntEn( 2,iPart) = -Xi_RotSpec(iSpec) / 2. * BoltzmannConst*TEqui*LOG(iRan) ! Sum up new rotational energy per species NewEnRot(iSpec) = NewEnRot(iSpec) + PartStateIntEn( 2,iPart) * partWeight END DO @@ -1203,7 +1281,7 @@ END SUBROUTINE SampleFromTargetDistr SUBROUTINE EnergyConsVib(nPart, nVibRelax, VibRelaxWeightSpec, iPartIndx_NodeRelaxVib, NewEnVib, OldEn, nXiVibDOF, & - VibEnergyDOF, CellTemp, EVibTtransSpecMean) + VibEnergyDOF, CellTemp, EVibTtransSpecMean, Xi_VibRelSpec, Xi_vib_DOF) !=================================================================================================================================== !> Routine to ensure energy conservation when including vibrational degrees of freedom (continuous and quantized) !=================================================================================================================================== @@ -1219,7 +1297,7 @@ SUBROUTINE EnergyConsVib(nPart, nVibRelax, VibRelaxWeightSpec, iPartIndx_NodeRel ! INPUT VARIABLES INTEGER, INTENT(IN) :: nPart,nXiVibDOF INTEGER, INTENT(IN) :: nVibRelax, iPartIndx_NodeRelaxVib(nPart) -REAL, INTENT(IN) :: VibRelaxWeightSpec(nSpecies) +REAL, INTENT(IN) :: VibRelaxWeightSpec(nSpecies), Xi_VibRelSpec(nSpecies), Xi_vib_DOF(DSMC%NumPolyatomMolecs,nXiVibDOF) REAL, INTENT(IN) :: NewEnVib(nSpecies), VibEnergyDOF(nVibRelax,nXiVibDOF), CellTemp, EVibTtransSpecMean(nSpecies) REAL, INTENT(INOUT) :: OldEn !----------------------------------------------------------------------------------------------------------------------------------- @@ -1227,18 +1305,32 @@ SUBROUTINE EnergyConsVib(nPart, nVibRelax, VibRelaxWeightSpec, iPartIndx_NodeRel !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES INTEGER :: iPart, iLoop, iDOF, iSpec, iQuant, iQuaMax, iPolyatMole -REAL :: alpha(nSpecies), partWeight, betaV, iRan, MaxColQua +REAL :: Xi_VibSpec(nSpecies), Xi_VibTotal, alpha(nSpecies), partWeight, betaV, iRan, MaxColQua !=================================================================================================================================== ! According to M. Pfeiffer, "Extending the particle ellipsoidal statistical Bhatnagar-Gross-Krook method to diatomic molecules ! including quantized vibrational energies", Phys. Fluids 30, 116103 (2018) IF(BGKDoVibRelaxation) THEN ! Vibrational energy is positive for at least one species + there are vibrational relaxations IF (ANY(NewEnVib.GT.0.0).AND.(nVibRelax.GT.0)) THEN + Xi_VibTotal = 0.0 + DO iSpec = 1, nSpecies + ! Total number of relaxing vibrational degrees of freedom + ! = tbd ======= nVibRelaxSpec or VibRelaxWeightSpec? ======================================================================= + ! = tbc ======= Xi_VibSpec as output of TEqui ============================================================================== + IF(SpecDSMC(iSpec)%PolyatomicMol) THEN ! polyatomic + iPolyatMole = SpecDSMC(iSpec)%SpecToPolyArray + Xi_VibSpec(iSpec) = SUM(Xi_vib_DOF(iPolyatMole,:)) + ELSE + Xi_VibSpec(iSpec) = Xi_VibRelSpec(iSpec) + END IF + Xi_VibTotal = Xi_VibTotal + Xi_VibSpec(iSpec)*VibRelaxWeightSpec(iSpec) + END DO ! Calculate scaling factor alpha per species ! EVibTtransSpecMean(iSpec)*VibRelaxWeightSpec(iSpec) is energy that should be in vibration DO iSpec = 1, nSpecies IF (NewEnVib(iSpec).GT.0.0) THEN - alpha(iSpec) = EVibTtransSpecMean(iSpec)*VibRelaxWeightSpec(iSpec)/NewEnVib(iSpec) + alpha(iSpec) = OldEn/NewEnVib(iSpec)*(Xi_VibSpec(iSpec)*VibRelaxWeightSpec(iSpec)/(3.*(nPart-1.)+Xi_VibTotal)) + !alpha(iSpec) = EVibTtransSpecMean(iSpec)*VibRelaxWeightSpec(iSpec)/NewEnVib(iSpec) ELSE alpha(iSpec) = 0. END IF From 6631ef7c63cff6b6574afef24a29fd61cb1f08a4 Mon Sep 17 00:00:00 2001 From: Franziska Hild Date: Thu, 20 Apr 2023 15:13:04 +0200 Subject: [PATCH 064/495] Calculation of TEqui for correction of energy conservation BGK - bug fix for calculation of rot dof - vibration tbc --- src/particles/bgk/bgk_colloperator.f90 | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/particles/bgk/bgk_colloperator.f90 b/src/particles/bgk/bgk_colloperator.f90 index d00209398..b6035b974 100644 --- a/src/particles/bgk/bgk_colloperator.f90 +++ b/src/particles/bgk/bgk_colloperator.f90 @@ -256,6 +256,7 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume, AveragingVal ! Remaining vibrational (+ translational) energy + rotational energy for translation and rotation OldEn = OldEn + OldEnRot +Xi_RotTotal = 0.0 DO iSpec = 1, nSpecies ! = tbd ======= nRotRelaxSpec or RotRelaxWeightSpec? ======================================================================= Xi_RotTotal = Xi_RotTotal + Xi_RotSpec(iSpec)*RotRelaxWeightSpec(iSpec) @@ -1006,7 +1007,6 @@ SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, EVibSpec, totalWeightSpec, totalWeig END IF END DO TEqui = TEquiNum/TEquiDenom -print*, CellTemp, TEqui, CellTempRel, 'start' ! Solving of equation system until accuracy eps_prec is reached DO WHILE ( ABS( TEqui - TEqui_Old ) .GT. eps_prec ) @@ -1048,8 +1048,6 @@ SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, EVibSpec, totalWeightSpec, totalWeig END IF END DO TEqui = TEquiNum/TEquiDenom - print*, TEqui, betaR - read* ! - tbc - additional round for VibDOF(TEqui) and then TEqui with BGKDoVibRelaxation ------------------------------------------- END DO From 0fc397c550c5d6c493dfb09b487b08deec0eed86 Mon Sep 17 00:00:00 2001 From: Franziska Hild Date: Fri, 21 Apr 2023 12:51:44 +0200 Subject: [PATCH 065/495] Vibration added for TEqui calculation and energy conservation in BGK --- src/particles/bgk/bgk_colloperator.f90 | 244 ++++++++++++++++--------- 1 file changed, 156 insertions(+), 88 deletions(-) diff --git a/src/particles/bgk/bgk_colloperator.f90 b/src/particles/bgk/bgk_colloperator.f90 index b6035b974..0112d9bcf 100644 --- a/src/particles/bgk/bgk_colloperator.f90 +++ b/src/particles/bgk/bgk_colloperator.f90 @@ -76,7 +76,7 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume, AveragingVal REAL :: alpha, alphaRot(nSpecies), CellTemp, dens, InnerDOF, NewEn, OldEn, Prandtl, relaxfreq REAL :: dynamicvis, thermalcond INTEGER, ALLOCATABLE :: iPartIndx_NodeRelax(:),iPartIndx_NodeRelaxTemp(:),iPartIndx_NodeRelaxRot(:),iPartIndx_NodeRelaxVib(:) -INTEGER :: iLoop, iPart, nRelax, iPolyatMole, nXiVibDOF, nXiVibDOFSpec(nSpecies) +INTEGER :: iLoop, iPart, nRelax, nXiVibDOF REAL, ALLOCATABLE :: Xi_vib_DOF(:,:), VibEnergyDOF(:,:) INTEGER :: iSpec, nSpec(nSpecies), jSpec, nRotRelax, nVibRelax REAL :: OldEnRot, NewEnRot(nSpecies), NewEnVib(nSpecies) @@ -89,9 +89,9 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume, AveragingVal REAL,PARAMETER :: RelEneTol=1e-12 ! Relative tolerance applied to conservation of energy before/after reaction #endif /* CODE_ANALYZE */ REAL :: totalWeightSpec(nSpecies), totalWeight, partWeight, CellTemptmp, MassIC_Mixture -REAL :: EVibSpec(nSpecies), Xi_VibSpec(nSpecies), Xi_VibRelSpec(nSpecies) +REAL :: EVibSpec(nSpecies), Xi_VibSpec(nSpecies), Xi_VibSpecNew(nSpecies) REAL :: ERotSpec(nSpecies), Xi_RotSpec(nSpecies), Xi_RotTotal -REAL :: ERotTtransSpecMean(nSpecies), EVibTtransSpecMean(nSpecies), CellTempRel, TEqui +REAL :: CellTempRel, TEqui REAL :: TVibSpec(nSpecies), TRotSpec(nSpecies), VibRelaxWeightSpec(nSpecies), RotRelaxWeightSpec(nSpecies) REAL :: collisionfreqSpec(nSpecies),rotrelaxfreqSpec(nSpecies), vibrelaxfreqSpec(nSpecies), betaR(nSpecies), betaV(nSpecies) !=================================================================================================================================== @@ -184,7 +184,7 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume, AveragingVal END IF END IF -! 4.) Determine the relaxation temperatures and energies as well as the number of particles undergoing a relaxation (including vibration and rotation) +! 4.) Determine the relaxation temperatures as well as the number of particles undergoing a relaxation (including vibration and rotation) ALLOCATE(iPartIndx_NodeRelax(nPart), iPartIndx_NodeRelaxTemp(nPart)) iPartIndx_NodeRelax = 0; iPartIndx_NodeRelaxTemp = 0 ALLOCATE(iPartIndx_NodeRelaxRot(nPart),iPartIndx_NodeRelaxVib(nPart)) @@ -195,26 +195,31 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume, AveragingVal IF(DSMC%NumPolyatomMolecs.GT.0) THEN nXiVibDOF = MAXVAL(PolyatomMolDSMC(:)%VibDOF) ALLOCATE(Xi_vib_DOF(DSMC%NumPolyatomMolecs,nXiVibDOF)) - ! Allocate VibEnergyDOF - ALLOCATE(VibEnergyDOF(nVibRelax,nXiVibDOF)) - VibEnergyDOF = 0.0 END IF END IF -CALL CalcTRelax(ERotSpec, Xi_RotSpec, EVibSpec, totalWeightSpec, totalWeight, nPart, dtCell, CellTemp, TRotSpec, relaxfreq, rotrelaxfreqSpec, & - vibrelaxfreqSpec, ERotTtransSpecMean, EVibTtransSpecMean, Xi_VibRelSpec, Xi_vib_DOF, nXiVibDOF, CellTempRel, TEqui, betaR, betaV) +CALL CalcTRelax(ERotSpec, Xi_RotSpec, Xi_VibSpec, EVibSpec, totalWeightSpec, totalWeight, nPart, dtCell, CellTemp, TRotSpec, TVibSpec, relaxfreq, rotrelaxfreqSpec, & + vibrelaxfreqSpec, Xi_VibSpecNew, Xi_vib_DOF, nXiVibDOF, CellTempRel, TEqui, betaR, betaV) CALL DetermineRelaxPart(nPart, iPartIndx_Node, relaxfreq, dtCell, nRelax, nRotRelax, nVibRelax, & RotRelaxWeightSpec, VibRelaxWeightSpec, iPartIndx_NodeRelax, iPartIndx_NodeRelaxTemp, iPartIndx_NodeRelaxRot, & iPartIndx_NodeRelaxVib, vBulk, OldEnRot, OldEn, rotrelaxfreqSpec, vibrelaxfreqSpec, betaR, betaV) +! Allocate VibEnergyDOF +IF(BGKDoVibRelaxation) THEN + IF(DSMC%NumPolyatomMolecs.GT.0) THEN + ALLOCATE(VibEnergyDOF(nVibRelax,nXiVibDOF)) + VibEnergyDOF = 0.0 + END IF +END IF + ! Return if no particles are undergoing a relaxation IF ((nRelax.EQ.0).AND.(nRotRelax.EQ.0).AND.(nVibRelax.EQ.0)) RETURN ! 5.) Determine the new rotational and vibrational states of molecules undergoing a relaxation IF(ANY(SpecDSMC(:)%InterID.EQ.2).OR.ANY(SpecDSMC(:)%InterID.EQ.20)) THEN CALL RelaxInnerEnergy(nVibRelax, nRotRelax, iPartIndx_NodeRelaxVib, iPartIndx_NodeRelaxRot, nXiVibDOF, Xi_vib_DOF, & - Xi_VibRelSpec, Xi_RotSpec, VibEnergyDOF, TEqui, NewEnVib, NewEnRot) + Xi_VibSpecNew, Xi_RotSpec, VibEnergyDOF, TEqui, NewEnVib, NewEnRot) END IF ! 6.) Sample new particle velocities from the target distribution function, depending on the chosen model @@ -249,9 +254,8 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume, AveragingVal ! 7.) Vibrational energy of the molecules: Ensure energy conservation by scaling the new vibrational states with the factor alpha IF(ANY(SpecDSMC(:)%InterID.EQ.2).OR.ANY(SpecDSMC(:)%InterID.EQ.20)) THEN - ! = tbc ======= use TEqui ============================================================================================== - CALL EnergyConsVib(nPart, nVibRelax, VibRelaxWeightSpec, iPartIndx_NodeRelaxVib, NewEnVib, OldEn, nXiVibDOF, VibEnergyDOF, & - CellTemp, EVibTtransSpecMean, Xi_VibRelSpec, Xi_vib_DOF) + CALL EnergyConsVib(nPart, totalWeight, nVibRelax, VibRelaxWeightSpec, iPartIndx_NodeRelaxVib, NewEnVib, OldEn, nXiVibDOF, VibEnergyDOF, & + Xi_VibSpecNew, TEqui) END IF ! Remaining vibrational (+ translational) energy + rotational energy for translation and rotation @@ -266,7 +270,8 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume, AveragingVal ! 8.) Determine the new particle state and ensure energy conservation by scaling the new velocities with the factor alpha ! Calculation of scaling factor alpha -alpha = SQRT(OldEn/NewEn*(3.*(nPart-1.))/(Xi_RotTotal+3.*(nPart-1.))) +! = tbd ======= nPart or totalWeight? ======================================================================================== +alpha = SQRT(OldEn/NewEn*(3.*(totalWeight-1.))/(Xi_RotTotal+3.*(totalWeight-1.))) ! Calculation of the final particle velocities with vBulkAll (average flow velocity before relaxation), scaling factor alpha, ! the particle velocity PartState(4:6,iPart) after the relaxation but before the energy conservation and vBulk (average value of ! the latter) @@ -284,8 +289,8 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume, AveragingVal ! Calculate scaling factor alpha per species, see M. Pfeiffer, "Extending the particle ellipsoidal statistical Bhatnagar-Gross- ! Krook method to diatomic molecules including quantized vibrational energies", Phys. Fluids 30, 116103 (2018) IF (NewEnRot(iSpec).GT.0.0) THEN - ! = tbd ======= nRotRelaxSpec or RotRelaxWeightSpec? ======================================================================= - alphaRot(iSpec) = OldEn/NewEnRot(iSpec)*(Xi_RotSpec(iSpec)*RotRelaxWeightSpec(iSpec)/(Xi_RotTotal+3.*(nPart-1.))) + ! = tbd ======= nRotRelaxSpec or RotRelaxWeightSpec? nPart or totalWeight? ================================================ + alphaRot(iSpec) = OldEn/NewEnRot(iSpec)*(Xi_RotSpec(iSpec)*RotRelaxWeightSpec(iSpec)/(Xi_RotTotal+3.*(totalWeight-1.))) !alphaRot(iSpec) = ERotTtransSpecMean(iSpec)*RotRelaxWeightSpec(iSpec)/NewEnRot(iSpec) ELSE alphaRot(iSpec) = 0.0 @@ -880,8 +885,8 @@ SUBROUTINE DetermineRelaxPart(nPart, iPartIndx_Node, relaxfreq, dtCell, nRelax, END SUBROUTINE DetermineRelaxPart -SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, EVibSpec, totalWeightSpec, totalWeight, nPart, dtCell, CellTemp, TRotSpec, relaxfreq, rotrelaxfreqSpec, & - vibrelaxfreqSpec, ERotTtransSpecMean, EVibTtransSpecMean, Xi_VibRelSpec, Xi_vib_DOF, nXiVibDOF, CellTempRel, TEqui, betaR, betaV) +SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, Xi_VibSpec, EVibSpec, totalWeightSpec, totalWeight, nPart, dtCell, CellTemp, TRotSpec, TVibSpec, relaxfreq, rotrelaxfreqSpec, & + vibrelaxfreqSpec, Xi_VibSpecNew, Xi_vib_DOF, nXiVibDOF, CellTempRel, TEqui, betaR, betaV) !=================================================================================================================================== !> Calculate the relaxation energies and temperatures !=================================================================================================================================== @@ -896,28 +901,28 @@ SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, EVibSpec, totalWeightSpec, totalWeig !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES INTEGER, INTENT(IN) :: nPart, nXiVibDOF -REAL, INTENT(IN) :: TRotSpec(nSpecies), ERotSpec(nSpecies), Xi_RotSpec(nSpecies), EVibSpec(nSpecies) +REAL, INTENT(IN) :: TRotSpec(nSpecies), ERotSpec(nSpecies), Xi_RotSpec(nSpecies) +REAL, INTENT(IN) :: TVibSpec(nSpecies), EVibSpec(nSpecies), Xi_VibSpec(nSpecies) REAL, INTENT(IN) :: totalWeightSpec(nSpecies), totalWeight, CellTemp, dtCell REAL, INTENT(IN) :: relaxfreq, rotrelaxfreqSpec(nSpecies), vibrelaxfreqSpec(nSpecies) !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES -REAL, INTENT(OUT) :: ERotTtransSpecMean(nSpecies), EVibTtransSpecMean(nSpecies) -REAL, INTENT(OUT) :: Xi_VibRelSpec(nSpecies), Xi_vib_DOF(DSMC%NumPolyatomMolecs,nXiVibDOF), CellTempRel, TEqui +REAL, INTENT(OUT) :: Xi_vib_DOF(DSMC%NumPolyatomMolecs,nXiVibDOF), Xi_VibSpecNew(nSpecies), CellTempRel, TEqui REAL, INTENT(OUT) :: betaR(nSpecies), betaV(nSpecies) !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES INTEGER :: iSpec, iDOF, iPolyatMole REAL :: RotFracSpec(nSpecies), VibFracSpec(nSpecies) -REAL :: ERotSpecMean(nSpecies), Xi_Rot_Spec(nSpecies), EVibSpecMean(nSpecies) -REAL :: EVibTtransPoly, TVibRelPoly, TVibRelSpecMean, ETransRelMean -REAL :: TEqui_Old, TEquiNum, TEquiDenom +REAL :: ERotSpecMean(nSpecies), EVibSpecMean(nSpecies), ERotTtransSpecMean(nSpecies), EVibTtransSpecMean(nSpecies) +REAL :: EVibTtransPoly, ETransRelMean!, TVibRelPoly, TVibRelSpecMean +REAL :: TEqui_Old, TEquiNum, TEquiDenom, exparg REAL :: eps_prec=1.0E-0 !=================================================================================================================================== ! According to J. Mathiaud et. al., "An ES-BGK model for diatomic gases with correct relaxation rates for internal energies", ! European Journal of Mechanics - B/Fluids, 96, pp. 65-77, 2022 RotFracSpec=0.0; VibFracSpec=0.0 -ERotSpecMean=0.0; ERotTtransSpecMean=0.0; EVibSpecMean=0.0; EVibTtransSpecMean=0.0; Xi_VibRelSpec=0.0; Xi_vib_DOF=0.0 +ERotSpecMean=0.0; ERotTtransSpecMean=0.0; EVibSpecMean=0.0; EVibTtransSpecMean=0.0; Xi_vib_DOF=0.0; Xi_VibSpecNew=0.0!; Xi_VibRelSpec=0.0 ETransRelMean=0.0; CellTempRel=0.0 DO iSpec = 1, nSpecies @@ -926,8 +931,6 @@ SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, EVibSpec, totalWeightSpec, totalWeig ERotSpecMean(iSpec) = ERotSpec(iSpec)/totalWeightSpec(iSpec) ! Mean rotational energy per particle of a species for the mixture translational temperature, ERot(Ttrans) ERotTtransSpecMean(iSpec) = CellTemp * Xi_RotSpec(iSpec) * BoltzmannConst /2. - ! Rotational degrees of freedom of molecules - Xi_Rot_Spec(iSpec) = SpecDSMC(iSpec)%Xi_Rot ! Calculate number of rotational relaxing molecules RotFracSpec(iSpec) = totalWeightSpec(iSpec)*(rotrelaxfreqSpec(iSpec)/relaxfreq)*(1.-EXP(-relaxfreq*dtCell)) @@ -944,32 +947,31 @@ SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, EVibSpec, totalWeightSpec, totalWeig (EXP(PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)/CellTemp) - 1.) ! Mean vibrational energy per particle of a species for the mixture translational temperature, EVib(Ttrans) EVibTtransSpecMean(iSpec) = EVibTtransSpecMean(iSpec) + EVibTtransPoly - ! Mean vibrational temperature per DOF to satisfy the Landau-Teller equation - TVibRelPoly = EVibTtransPoly / (BoltzmannConst*PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)) - IF (TVibRelPoly.GT.0.0) THEN - TVibRelPoly = PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)/LOG(1. + 1./TVibRelPoly) - ! Calculation of the vibrational degrees of freedom to satisfy the Landau-Teller equation - Xi_vib_DOF(iPolyatMole,iDOF) = 2.* EVibTtransPoly / (BoltzmannConst*TVibRelPoly) - ELSE - Xi_vib_DOF(iPolyatMole,iDOF) = 0.0 - END IF + ! ! Mean vibrational temperature per DOF to satisfy the Landau-Teller equation + ! TVibRelPoly = EVibTtransPoly / (BoltzmannConst*PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)) + ! IF (TVibRelPoly.GT.0.0) THEN + ! TVibRelPoly = PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)/LOG(1. + 1./TVibRelPoly) + ! ! Calculation of the vibrational degrees of freedom to satisfy the Landau-Teller equation + ! Xi_vib_DOF(iPolyatMole,iDOF) = 2.* EVibTtransPoly / (BoltzmannConst*TVibRelPoly) + ! ELSE + ! Xi_vib_DOF(iPolyatMole,iDOF) = 0.0 + ! END IF END DO ELSE ! diatomic ! Mean vibrational energy per particle of a species for the mixture translational temperature, EVib(Ttrans) EVibTtransSpecMean(iSpec) = BoltzmannConst * SpecDSMC(iSpec)%CharaTVib / (EXP(SpecDSMC(iSpec)%CharaTVib/CellTemp) - 1.) - ! Mean vibrational temperature per particle of a species to satisfy the Landau-Teller equation - TVibRelSpecMean = EVibTtransSpecMean(iSpec) / (BoltzmannConst*SpecDSMC(iSpec)%CharaTVib) - IF (TVibRelSpecMean.GT.0.0) THEN - TVibRelSpecMean = SpecDSMC(iSpec)%CharaTVib/LOG(1. + 1./(TVibRelSpecMean)) - ! Calculation of the vibrational degrees of freedom to satisfy the Landau-Teller equation - Xi_VibRelSpec(iSpec) = 2.* EVibTtransSpecMean(iSpec) / (BoltzmannConst*TVibRelSpecMean) - ! No negative temperature possible - ELSE - Xi_VibRelSpec(iSpec) = 0.0 - END IF + ! ! Mean vibrational temperature per particle of a species to satisfy the Landau-Teller equation + ! TVibRelSpecMean = EVibTtransSpecMean(iSpec) / (BoltzmannConst*SpecDSMC(iSpec)%CharaTVib) + ! IF (TVibRelSpecMean.GT.0.0) THEN + ! TVibRelSpecMean = SpecDSMC(iSpec)%CharaTVib/LOG(1. + 1./(TVibRelSpecMean)) + ! ! Calculation of the vibrational degrees of freedom to satisfy the Landau-Teller equation + ! Xi_VibRelSpec(iSpec) = 2.* EVibTtransSpecMean(iSpec) / (BoltzmannConst*TVibRelSpecMean) + ! ! No negative temperature possible + ! ELSE + ! Xi_VibRelSpec(iSpec) = 0.0 + ! END IF END IF - ! Calculate number of vibrational relaxing molecules VibFracSpec(iSpec) = totalWeightSpec(iSpec)*(vibrelaxfreqSpec(iSpec)/relaxfreq)*(1.-EXP(-relaxfreq*dtCell)) END IF @@ -1001,9 +1003,8 @@ SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, EVibSpec, totalWeightSpec, totalWeig ! Sum up over all species DO iSpec = 1, nSpecies IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN - ! - tbc ------ add vibration to calculation of TEqui ------------------------------------------------------------------------ - TEquiNum = TEquiNum + Xi_Rot_Spec(iSpec)*RotFracSpec(iSpec)*TRotSpec(iSpec) - TEquiDenom = TEquiDenom + Xi_Rot_Spec(iSpec)*RotFracSpec(iSpec) + TEquiNum = TEquiNum + Xi_RotSpec(iSpec)*RotFracSpec(iSpec)*TRotSpec(iSpec) + Xi_VibSpec(iSpec)*VibFracSpec(iSpec)*TVibSpec(iSpec) + TEquiDenom = TEquiDenom + Xi_RotSpec(iSpec)*RotFracSpec(iSpec) + Xi_VibSpec(iSpec)*VibFracSpec(iSpec) END IF END DO TEqui = TEquiNum/TEquiDenom @@ -1021,18 +1022,45 @@ SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, EVibSpec, totalWeightSpec, totalWeig ! new calculation of number of rotational relaxing molecules with betaR RotFracSpec(iSpec) = totalWeightSpec(iSpec)*(rotrelaxfreqSpec(iSpec)/relaxfreq)*(1.-EXP(-relaxfreq*dtCell))*betaR(iSpec) END IF - ! IF(BGKDoVibRelaxation) - ! ! if difference small: equilibrium, no beta - ! IF (ABS(TVibSpec(iSpec)-TEqui).GT.1E-3) THEN - ! betaV(iSpec) = (TVibSpec(iSpec)-CellTemp)/(TVibSpec(iSpec)-TEqui) - ! IF (betaV(iSpec).LT.0.0) THEN - ! betaV(iSpec) = 1. - ! END IF - ! ! new calculation of number of rotational relaxing molecules - ! VibFracSpec(iSpec) = totalWeightSpec(iSpec)*(vibrelaxfreqSpec(iSpec)/relaxfreq)*(1.-EXP(-relaxfreq*dtCell))*betaV(iSpec) - ! END IF - ! END IF - ! ! new calculation of the vibrational degrees of freedom per species ----------------------------------------------------- + IF(BGKDoVibRelaxation) THEN + ! if difference small: equilibrium, no beta + IF (ABS(TVibSpec(iSpec)-TEqui).GT.1E-3) THEN + betaV(iSpec) = (TVibSpec(iSpec)-CellTemp)/(TVibSpec(iSpec)-TEqui) + IF (betaV(iSpec).LT.0.0) THEN + betaV(iSpec) = 1. + END IF + ! new calculation of number of rotational relaxing molecules + VibFracSpec(iSpec) = totalWeightSpec(iSpec)*(vibrelaxfreqSpec(iSpec)/relaxfreq)*(1.-EXP(-relaxfreq*dtCell))*betaV(iSpec) + END IF + + ! new calculation of the vibrational degrees of freedom per species + IF(SpecDSMC(iSpec)%PolyatomicMol) THEN + iPolyatMole = SpecDSMC(iSpec)%SpecToPolyArray + ! Loop over all vibrational degrees of freedom to calculate them using TEqui + DO iDOF = 1, PolyatomMolDSMC(iPolyatMole)%VibDOF + exparg = PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)/TEqui + ! Check if the exponent is within the range of machine precision for calculation of vibrational degrees of freedom + IF(CHECKEXP(exparg))THEN + IF(exparg.gt.0.)THEN ! positive overflow: exp -> inf + Xi_vib_DOF(iSpec,iDOF) = 2.*exparg/(EXP(exparg)-1.) + ELSE ! negative overflow: exp -> 0 + Xi_vib_DOF(iSpec,iDOF) = 2.*exparg/(-1.) + END IF ! exparg.gt.0. + ELSE + Xi_vib_DOF(iSpec,iDOF) = 0.0 + END IF ! CHECKEXP(exparg) + END DO + Xi_VibSpecNew(iSpec) = SUM(Xi_vib_DOF(iSpec,1:PolyatomMolDSMC(iPolyatMole)%VibDOF)) + ELSE ! diatomic + exparg = SpecDSMC(iSpec)%CharaTVib/TEqui + ! Check if the exponent is within the range of machine precision for calculation of vibrational degrees of freedom + IF(CHECKEXP(exparg))THEN + Xi_VibSpecNew(iSpec) = 2.*SpecDSMC(iSpec)%CharaTVib/TEqui/(EXP(exparg)-1.) + ELSE + Xi_VibSpecNew(iSpec) = 0.0 + END IF ! CHECKEXP(exparg) + END IF + END IF END IF END DO TEqui_Old = TEqui @@ -1042,16 +1070,64 @@ SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, EVibSpec, totalWeightSpec, totalWeig ! Sum up over all species DO iSpec = 1, nSpecies IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN - ! - tbc - add vibration to calculation of TEqui ----------------------------------------------------------------------------- - TEquiNum = TEquiNum + Xi_Rot_Spec(iSpec)*RotFracSpec(iSpec)*TRotSpec(iSpec) - TEquiDenom = TEquiDenom + Xi_Rot_Spec(iSpec)*RotFracSpec(iSpec) + TEquiNum = TEquiNum + Xi_RotSpec(iSpec)*RotFracSpec(iSpec)*TRotSpec(iSpec) + Xi_VibSpec(iSpec)*VibFracSpec(iSpec)*TVibSpec(iSpec) + TEquiDenom = TEquiDenom + Xi_RotSpec(iSpec)*RotFracSpec(iSpec) + Xi_VibSpecNew(iSpec)*VibFracSpec(iSpec) END IF END DO TEqui = TEquiNum/TEquiDenom - ! - tbc - additional round for VibDOF(TEqui) and then TEqui with BGKDoVibRelaxation ------------------------------------------- + IF(BGKDoVibRelaxation) THEN + ! accuracy eps_prec not reached yet + DO WHILE ( ABS( TEqui - TEqui_Old ) .GT. eps_prec ) + ! mean value of old and new equilibrium temperature + TEqui = (TEqui + TEqui_Old) * 0.5 + DO iSpec = 1, nSpecies + IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN + ! new calculation of the vibrational degrees of freedom per species + IF(SpecDSMC(iSpec)%PolyatomicMol) THEN + iPolyatMole = SpecDSMC(iSpec)%SpecToPolyArray + ! Loop over all vibrational degrees of freedom to calculate them using TEqui + DO iDOF = 1, PolyatomMolDSMC(iPolyatMole)%VibDOF + exparg = PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)/TEqui + ! Check if the exponent is within the range of machine precision for calculation of vibrational degrees of freedom + IF(CHECKEXP(exparg))THEN + IF(exparg.gt.0.)THEN ! positive overflow: exp -> inf + Xi_vib_DOF(iSpec,iDOF) = 2.*exparg/(EXP(exparg)-1.) + ELSE ! negative overflow: exp -> 0 + Xi_vib_DOF(iSpec,iDOF) = 2.*exparg/(-1.) + END IF ! exparg.gt.0. + ELSE + Xi_vib_DOF(iSpec,iDOF) = 0.0 + END IF ! CHECKEXP(exparg) + END DO + Xi_VibSpecNew(iSpec) = SUM(Xi_vib_DOF(iSpec,1:PolyatomMolDSMC(iPolyatMole)%VibDOF)) + ELSE ! diatomic + exparg = SpecDSMC(iSpec)%CharaTVib/TEqui + ! Check if the exponent is within the range of machine precision for calculation of vibrational degrees of freedom + IF(CHECKEXP(exparg))THEN + Xi_VibSpecNew(iSpec) = 2.*SpecDSMC(iSpec)%CharaTVib/TEqui/(EXP(exparg)-1.) + ELSE + Xi_VibSpecNew(iSpec) = 0.0 + END IF ! CHECKEXP(exparg) + END IF + END IF + END DO + TEqui_Old = TEqui + ! new calculation of equilibrium temperature with new RotFracSpec, new VibFracSpec, new VibDOF(TEqui) in denominator + TEquiNum = 3.*(nPart-1.)*CellTemp + TEquiDenom = 3.*(nPart-1.) + ! Sum up over all species + DO iSpec = 1, nSpecies + IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN + TEquiNum = TEquiNum + Xi_RotSpec(iSpec)*RotFracSpec(iSpec)*TRotSpec(iSpec) + Xi_VibSpec(iSpec)*VibFracSpec(iSpec)*TVibSpec(iSpec) + TEquiDenom = TEquiDenom + Xi_RotSpec(iSpec)*RotFracSpec(iSpec) + Xi_VibSpecNew(iSpec)*VibFracSpec(iSpec) + END IF + END DO + TEqui = TEquiNum/TEquiDenom + END DO + END IF END DO -! - tbc - kommentieren, Zeilenumbrüche, Subroutines tauschen ------------------------------------------------------------- +! - tbc - kommentieren, Zeilenumbrüche, Subroutines tauschen, wo werden welche Vib-Freiheitsgrade verwendet? --------------------- END SUBROUTINE CalcTRelax @@ -1278,8 +1354,8 @@ SUBROUTINE SampleFromTargetDistr(nRelax, iPartIndx_NodeRelax, Prandtl, u2, u0ij, END SUBROUTINE SampleFromTargetDistr -SUBROUTINE EnergyConsVib(nPart, nVibRelax, VibRelaxWeightSpec, iPartIndx_NodeRelaxVib, NewEnVib, OldEn, nXiVibDOF, & - VibEnergyDOF, CellTemp, EVibTtransSpecMean, Xi_VibRelSpec, Xi_vib_DOF) +SUBROUTINE EnergyConsVib(nPart, totalWeight, nVibRelax, VibRelaxWeightSpec, iPartIndx_NodeRelaxVib, NewEnVib, OldEn, nXiVibDOF, & + VibEnergyDOF, Xi_VibSpec, TEqui) !=================================================================================================================================== !> Routine to ensure energy conservation when including vibrational degrees of freedom (continuous and quantized) !=================================================================================================================================== @@ -1293,17 +1369,17 @@ SUBROUTINE EnergyConsVib(nPart, nVibRelax, VibRelaxWeightSpec, iPartIndx_NodeRel IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES -INTEGER, INTENT(IN) :: nPart,nXiVibDOF +INTEGER, INTENT(IN) :: nPart, nXiVibDOF INTEGER, INTENT(IN) :: nVibRelax, iPartIndx_NodeRelaxVib(nPart) -REAL, INTENT(IN) :: VibRelaxWeightSpec(nSpecies), Xi_VibRelSpec(nSpecies), Xi_vib_DOF(DSMC%NumPolyatomMolecs,nXiVibDOF) -REAL, INTENT(IN) :: NewEnVib(nSpecies), VibEnergyDOF(nVibRelax,nXiVibDOF), CellTemp, EVibTtransSpecMean(nSpecies) +REAL, INTENT(IN) :: VibRelaxWeightSpec(nSpecies), Xi_VibSpec(nSpecies), totalWeight +REAL, INTENT(IN) :: NewEnVib(nSpecies), VibEnergyDOF(nVibRelax,nXiVibDOF), TEqui!, EVibTtransSpecMean(nSpecies) REAL, INTENT(INOUT) :: OldEn !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES INTEGER :: iPart, iLoop, iDOF, iSpec, iQuant, iQuaMax, iPolyatMole -REAL :: Xi_VibSpec(nSpecies), Xi_VibTotal, alpha(nSpecies), partWeight, betaV, iRan, MaxColQua +REAL :: Xi_VibTotal, alpha(nSpecies), partWeight, betaV, iRan, MaxColQua !=================================================================================================================================== ! According to M. Pfeiffer, "Extending the particle ellipsoidal statistical Bhatnagar-Gross-Krook method to diatomic molecules ! including quantized vibrational energies", Phys. Fluids 30, 116103 (2018) @@ -1313,21 +1389,14 @@ SUBROUTINE EnergyConsVib(nPart, nVibRelax, VibRelaxWeightSpec, iPartIndx_NodeRel Xi_VibTotal = 0.0 DO iSpec = 1, nSpecies ! Total number of relaxing vibrational degrees of freedom - ! = tbd ======= nVibRelaxSpec or VibRelaxWeightSpec? ======================================================================= - ! = tbc ======= Xi_VibSpec as output of TEqui ============================================================================== - IF(SpecDSMC(iSpec)%PolyatomicMol) THEN ! polyatomic - iPolyatMole = SpecDSMC(iSpec)%SpecToPolyArray - Xi_VibSpec(iSpec) = SUM(Xi_vib_DOF(iPolyatMole,:)) - ELSE - Xi_VibSpec(iSpec) = Xi_VibRelSpec(iSpec) - END IF + ! = tbd ======= nVibRelaxSpec or VibRelaxWeightSpec? nPart or totalWeight for alpha? ======================================= Xi_VibTotal = Xi_VibTotal + Xi_VibSpec(iSpec)*VibRelaxWeightSpec(iSpec) END DO ! Calculate scaling factor alpha per species ! EVibTtransSpecMean(iSpec)*VibRelaxWeightSpec(iSpec) is energy that should be in vibration DO iSpec = 1, nSpecies IF (NewEnVib(iSpec).GT.0.0) THEN - alpha(iSpec) = OldEn/NewEnVib(iSpec)*(Xi_VibSpec(iSpec)*VibRelaxWeightSpec(iSpec)/(3.*(nPart-1.)+Xi_VibTotal)) + alpha(iSpec) = OldEn/NewEnVib(iSpec)*(Xi_VibSpec(iSpec)*VibRelaxWeightSpec(iSpec)/(3.*(totalWeight-1.)+Xi_VibTotal)) !alpha(iSpec) = EVibTtransSpecMean(iSpec)*VibRelaxWeightSpec(iSpec)/NewEnVib(iSpec) ELSE alpha(iSpec) = 0. @@ -1361,13 +1430,13 @@ SUBROUTINE EnergyConsVib(nPart, nVibRelax, VibRelaxWeightSpec, iPartIndx_NodeRel ELSE CALL RANDOM_NUMBER(iRan) ! Calculation of new iQuant - iQuant = INT(-LOG(iRan)*CellTemp/PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)) + iQuant = INT(-LOG(iRan)*TEqui/PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)) ! Determine maximum quantum number iQuaMax = MIN(INT(MaxColQua)+1, PolyatomMolDSMC(iPolyatMole)%MaxVibQuantDOF(iDOF)) ! Calculation of new iQuant as long as iQuant > maximum quantum number DO WHILE (iQuant.GE.iQuaMax) CALL RANDOM_NUMBER(iRan) - iQuant = INT(-LOG(iRan)*CellTemp/PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)) + iQuant = INT(-LOG(iRan)*TEqui/PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)) END DO END IF END IF @@ -1379,8 +1448,7 @@ SUBROUTINE EnergyConsVib(nPart, nVibRelax, VibRelaxWeightSpec, iPartIndx_NodeRel OldEn = OldEn - iQuant*PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)*BoltzmannConst*partWeight END DO ! Add zero-point energy - PartStateIntEn( 1,iPart) = PartStateIntEn( 1,iPart) & - + SpecDSMC(iSpec)%EZeroPoint + PartStateIntEn( 1,iPart) = PartStateIntEn( 1,iPart) + SpecDSMC(iSpec)%EZeroPoint ELSE ! Diatomic molecules ! Vibrational energy is reformulated to a quantum number iQuant betaV = alpha(iSpec)*PartStateIntEn( 1,iPart)/(SpecDSMC(iSpec)%CharaTVib*BoltzmannConst) @@ -1399,13 +1467,13 @@ SUBROUTINE EnergyConsVib(nPart, nVibRelax, VibRelaxWeightSpec, iPartIndx_NodeRel ELSE CALL RANDOM_NUMBER(iRan) ! Calculation of new iQuant - iQuant = INT(-LOG(iRan)*CellTemp/SpecDSMC(iSpec)%CharaTVib) + iQuant = INT(-LOG(iRan)*TEqui/SpecDSMC(iSpec)%CharaTVib) ! Determine maximum quantum number iQuaMax = MIN(INT(MaxColQua)+1, SpecDSMC(iSpec)%MaxVibQuant) ! Calculation of new iQuant as long as iQuant > maximum quantum number DO WHILE (iQuant.GE.iQuaMax) CALL RANDOM_NUMBER(iRan) - iQuant = INT(-LOG(iRan)*CellTemp/SpecDSMC(iSpec)%CharaTVib) + iQuant = INT(-LOG(iRan)*TEqui/SpecDSMC(iSpec)%CharaTVib) END DO END IF ! Calculate vibrational energy including zero-point energy From fa0a9d9e89e289c6d07d2a509b421fe1c5a140a0 Mon Sep 17 00:00:00 2001 From: Franziska Hild Date: Fri, 21 Apr 2023 13:10:05 +0200 Subject: [PATCH 066/495] BGK Colloperator small clean-up --- src/particles/bgk/bgk_colloperator.f90 | 228 +++++++++++++------------ 1 file changed, 116 insertions(+), 112 deletions(-) diff --git a/src/particles/bgk/bgk_colloperator.f90 b/src/particles/bgk/bgk_colloperator.f90 index 0112d9bcf..960623610 100644 --- a/src/particles/bgk/bgk_colloperator.f90 +++ b/src/particles/bgk/bgk_colloperator.f90 @@ -93,7 +93,8 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume, AveragingVal REAL :: ERotSpec(nSpecies), Xi_RotSpec(nSpecies), Xi_RotTotal REAL :: CellTempRel, TEqui REAL :: TVibSpec(nSpecies), TRotSpec(nSpecies), VibRelaxWeightSpec(nSpecies), RotRelaxWeightSpec(nSpecies) -REAL :: collisionfreqSpec(nSpecies),rotrelaxfreqSpec(nSpecies), vibrelaxfreqSpec(nSpecies), betaR(nSpecies), betaV(nSpecies) +REAL :: collisionfreqSpec(nSpecies), rotrelaxfreqSpec(nSpecies), vibrelaxfreqSpec(nSpecies) +REAL :: betaR(nSpecies), betaV(nSpecies) !=================================================================================================================================== #ifdef CODE_ANALYZE ! Momentum and energy conservation check: summing up old values @@ -184,7 +185,7 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume, AveragingVal END IF END IF -! 4.) Determine the relaxation temperatures as well as the number of particles undergoing a relaxation (including vibration and rotation) +! 4.) Determine the relaxation temperatures and the number of particles undergoing a relaxation (including vibration + rotation) ALLOCATE(iPartIndx_NodeRelax(nPart), iPartIndx_NodeRelaxTemp(nPart)) iPartIndx_NodeRelax = 0; iPartIndx_NodeRelaxTemp = 0 ALLOCATE(iPartIndx_NodeRelaxRot(nPart),iPartIndx_NodeRelaxVib(nPart)) @@ -198,8 +199,8 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume, AveragingVal END IF END IF -CALL CalcTRelax(ERotSpec, Xi_RotSpec, Xi_VibSpec, EVibSpec, totalWeightSpec, totalWeight, nPart, dtCell, CellTemp, TRotSpec, TVibSpec, relaxfreq, rotrelaxfreqSpec, & - vibrelaxfreqSpec, Xi_VibSpecNew, Xi_vib_DOF, nXiVibDOF, CellTempRel, TEqui, betaR, betaV) +CALL CalcTRelax(ERotSpec, Xi_RotSpec, Xi_VibSpec, EVibSpec, totalWeightSpec, totalWeight, nPart, dtCell, CellTemp, TRotSpec, & + TVibSpec, relaxfreq, rotrelaxfreqSpec, vibrelaxfreqSpec, Xi_VibSpecNew, Xi_vib_DOF, nXiVibDOF, CellTempRel, TEqui, betaR, betaV) CALL DetermineRelaxPart(nPart, iPartIndx_Node, relaxfreq, dtCell, nRelax, nRotRelax, nVibRelax, & RotRelaxWeightSpec, VibRelaxWeightSpec, iPartIndx_NodeRelax, iPartIndx_NodeRelaxTemp, iPartIndx_NodeRelaxRot, & @@ -254,8 +255,8 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume, AveragingVal ! 7.) Vibrational energy of the molecules: Ensure energy conservation by scaling the new vibrational states with the factor alpha IF(ANY(SpecDSMC(:)%InterID.EQ.2).OR.ANY(SpecDSMC(:)%InterID.EQ.20)) THEN - CALL EnergyConsVib(nPart, totalWeight, nVibRelax, VibRelaxWeightSpec, iPartIndx_NodeRelaxVib, NewEnVib, OldEn, nXiVibDOF, VibEnergyDOF, & - Xi_VibSpecNew, TEqui) + CALL EnergyConsVib(nPart, totalWeight, nVibRelax, VibRelaxWeightSpec, iPartIndx_NodeRelaxVib, NewEnVib, OldEn, nXiVibDOF, & + VibEnergyDOF, Xi_VibSpecNew, TEqui) END IF ! Remaining vibrational (+ translational) energy + rotational energy for translation and rotation @@ -789,104 +790,8 @@ SUBROUTINE CalcGasProperties(nSpec, dens, InnerDOF, totalWeightSpec, totalWeight END SUBROUTINE CalcGasProperties -SUBROUTINE DetermineRelaxPart(nPart, iPartIndx_Node, relaxfreq, dtCell, nRelax, nRotRelax, nVibRelax, & - RotRelaxWeightSpec, VibRelaxWeightSpec, iPartIndx_NodeRelax, iPartIndx_NodeRelaxTemp, iPartIndx_NodeRelaxRot, & - iPartIndx_NodeRelaxVib, vBulk, OldEnRot, OldEn, rotrelaxfreqSpec, vibrelaxfreqSpec, betaR, betaV) -!=================================================================================================================================== -!> Determine the number of particles undergoing a relaxation (including vibration and rotation) -!=================================================================================================================================== -! MODULES -USE MOD_Particle_Vars ,ONLY: Species, PartSpecies, PartState, nSpecies -USE MOD_DSMC_Vars ,ONLY: SpecDSMC, PartStateIntEn -USE MOD_BGK_Vars ,ONLY: BGKDoVibRelaxation -USE MOD_part_tools ,ONLY: GetParticleWeight -! IMPLICIT VARIABLE HANDLING - IMPLICIT NONE -!----------------------------------------------------------------------------------------------------------------------------------- -! INPUT VARIABLES -INTEGER, INTENT(IN) :: nPart, iPartIndx_Node(nPart) -REAL, INTENT(IN) :: relaxfreq, dtCell, rotrelaxfreqSpec(nSpecies), vibrelaxfreqSpec(nSpecies), betaR(nSpecies), betaV(nSpecies) -!----------------------------------------------------------------------------------------------------------------------------------- -! OUTPUT VARIABLES -INTEGER, INTENT(OUT) :: iPartIndx_NodeRelax(:), iPartIndx_NodeRelaxTemp(:) -INTEGER, INTENT(OUT) :: iPartIndx_NodeRelaxRot(:), iPartIndx_NodeRelaxVib(:) -INTEGER, INTENT(OUT) :: nRelax, nRotRelax, nVibRelax -REAL, INTENT(OUT) :: vBulk(3), OldEnRot, RotRelaxWeightSpec(nSpecies), VibRelaxWeightSpec(nSpecies) -!----------------------------------------------------------------------------------------------------------------------------------- -! INPUT-OUTPUT VARIABLES -REAL, INTENT(INOUT) :: OldEn -!----------------------------------------------------------------------------------------------------------------------------------- -! LOCAL VARIABLES -INTEGER :: iPart, iSpec, iLoop, iPick, iLoopRot, iLoopVib -REAL :: ProbAddPartTrans, iRan, partWeight, ProbAddPartRot, ProbAddPartVib -!=================================================================================================================================== -VibRelaxWeightSpec =0; RotRelaxWeightSpec =0; nRelax=0; vBulk=0.0; nRotRelax=0; nVibRelax=0; OldEnRot=0.0 -iLoopRot=1; iLoopVib=1 -! Calculate probability of relaxation of a particle towards the target distribution function -ProbAddPartTrans = 1.-EXP(-relaxfreq*dtCell) -CALL RANDOM_NUMBER(iRan) -! Calculate the number of relaxing particles -nRelax = INT(REAL(nPart) * ProbAddPartTrans + iRan) -! List of non-relaxing particles -iPartIndx_NodeRelaxTemp(:) = iPartIndx_Node(:) -! Relaxing particles -DO iLoop = 1, nRelax - CALL RANDOM_NUMBER(iRan) - iPick = INT(iRan * (nPart-iLoop+1)) + 1 - iPart = iPartIndx_NodeRelaxTemp(iPick) - partWeight = GetParticleWeight(iPart) - iSpec = PartSpecies(iPart) - iPartIndx_NodeRelax(iLoop) = iPart - iPartIndx_NodeRelaxTemp(iPick) = iPartIndx_NodeRelaxTemp(nPart-iLoop+1) - ! For molecules: relaxation of inner DOF - IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN - ! Rotation - CALL RANDOM_NUMBER(iRan) - ! Calculate probability of rotational relaxation of a particle that relaxes towards the target distribution function - ProbAddPartRot = rotrelaxfreqSpec(iSpec)/relaxfreq*betaR(iSpec) - IF (ProbAddPartRot.GT.iRan) THEN - ! relaxation - iPartIndx_NodeRelaxRot(iLoopRot) = iPartIndx_NodeRelax(iLoop) - nRotRelax = nRotRelax + 1 - iLoopRot = iLoopRot + 1 - RotRelaxWeightSpec(iSpec) = RotRelaxWeightSpec(iSpec) + partWeight - ! Sum up total rotational energy - OldEnRot = OldEnRot + PartStateIntEn(2,iPart) * partWeight - END IF - ! Vibration - IF(BGKDoVibRelaxation) THEN - CALL RANDOM_NUMBER(iRan) - ! Calculate probability of vibrational relaxation of a particle that relaxes towards the target distribution function - ProbAddPartVib = vibrelaxfreqSpec(iSpec)/relaxfreq*betaV(iSpec) - IF (ProbAddPartVib.GT.iRan) THEN - ! relaxation - iPartIndx_NodeRelaxVib(iLoopVib) = iPartIndx_NodeRelax(iLoop) - nVibRelax = nVibRelax + 1 - VibRelaxWeightSpec(iSpec) = VibRelaxWeightSpec(iSpec) + partWeight - ! Sum up total vibrational energy of all relaxing particles, considering zero-point energy, and add to translational energy - OldEn = OldEn + (PartStateIntEn(1,iPartIndx_NodeRelaxVib(iLoopVib)) - SpecDSMC(iSpec)%EZeroPoint) * partWeight - iLoopVib = iLoopVib + 1 - END IF - END IF - END IF -END DO - -! Non-relaxing particles -! nNonRelax = nPart-nRelax -DO iLoop = 1, nPart-nRelax - iPart = iPartIndx_NodeRelaxTemp(iLoop) - partWeight = GetParticleWeight(iPart) - iSpec = PartSpecies(iPart) - ! iPartIndx_NodeNonRelax(iLoop) - ! Sum up velocities of non-relaxing particles for bulk velocity - vBulk(1:3) = vBulk(1:3) + PartState(4:6,iPart)*Species(iSpec)%MassIC*partWeight -END DO - -END SUBROUTINE DetermineRelaxPart - - -SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, Xi_VibSpec, EVibSpec, totalWeightSpec, totalWeight, nPart, dtCell, CellTemp, TRotSpec, TVibSpec, relaxfreq, rotrelaxfreqSpec, & - vibrelaxfreqSpec, Xi_VibSpecNew, Xi_vib_DOF, nXiVibDOF, CellTempRel, TEqui, betaR, betaV) +SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, Xi_VibSpec, EVibSpec, totalWeightSpec, totalWeight, nPart, dtCell, CellTemp, TRotSpec, & + TVibSpec, relaxfreq, rotrelaxfreqSpec, vibrelaxfreqSpec, Xi_VibSpecNew, Xi_vib_DOF, nXiVibDOF, CellTempRel, TEqui, betaR, betaV) !=================================================================================================================================== !> Calculate the relaxation energies and temperatures !=================================================================================================================================== @@ -913,8 +818,8 @@ SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, Xi_VibSpec, EVibSpec, totalWeightSpe ! LOCAL VARIABLES INTEGER :: iSpec, iDOF, iPolyatMole REAL :: RotFracSpec(nSpecies), VibFracSpec(nSpecies) -REAL :: ERotSpecMean(nSpecies), EVibSpecMean(nSpecies), ERotTtransSpecMean(nSpecies), EVibTtransSpecMean(nSpecies) -REAL :: EVibTtransPoly, ETransRelMean!, TVibRelPoly, TVibRelSpecMean +REAL :: ERotSpecMean(nSpecies), EVibSpecMean(nSpecies), EVibTtransPoly, ETransRelMean +REAL :: ERotTtransSpecMean(nSpecies), EVibTtransSpecMean(nSpecies) REAL :: TEqui_Old, TEquiNum, TEquiDenom, exparg REAL :: eps_prec=1.0E-0 !=================================================================================================================================== @@ -922,7 +827,7 @@ SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, Xi_VibSpec, EVibSpec, totalWeightSpe ! European Journal of Mechanics - B/Fluids, 96, pp. 65-77, 2022 RotFracSpec=0.0; VibFracSpec=0.0 -ERotSpecMean=0.0; ERotTtransSpecMean=0.0; EVibSpecMean=0.0; EVibTtransSpecMean=0.0; Xi_vib_DOF=0.0; Xi_VibSpecNew=0.0!; Xi_VibRelSpec=0.0 +ERotSpecMean=0.0; ERotTtransSpecMean=0.0; EVibSpecMean=0.0; EVibTtransSpecMean=0.0; Xi_vib_DOF=0.0; Xi_VibSpecNew=0.0 ETransRelMean=0.0; CellTempRel=0.0 DO iSpec = 1, nSpecies @@ -975,6 +880,7 @@ SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, Xi_VibSpec, EVibSpec, totalWeightSpe ! Calculate number of vibrational relaxing molecules VibFracSpec(iSpec) = totalWeightSpec(iSpec)*(vibrelaxfreqSpec(iSpec)/relaxfreq)*(1.-EXP(-relaxfreq*dtCell)) END IF +! - tbd - Calculation xi necessary here? ----------------------------------------------------------------------------- ! Mean translational energy per particle to satisfy the Landau-Teller equation ETransRelMean = ETransRelMean + (3./2. * BoltzmannConst * CellTemp - (rotrelaxfreqSpec(iSpec)/relaxfreq) * & @@ -1003,7 +909,8 @@ SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, Xi_VibSpec, EVibSpec, totalWeightSpe ! Sum up over all species DO iSpec = 1, nSpecies IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN - TEquiNum = TEquiNum + Xi_RotSpec(iSpec)*RotFracSpec(iSpec)*TRotSpec(iSpec) + Xi_VibSpec(iSpec)*VibFracSpec(iSpec)*TVibSpec(iSpec) + TEquiNum = TEquiNum + Xi_RotSpec(iSpec)*RotFracSpec(iSpec)*TRotSpec(iSpec) + & + Xi_VibSpec(iSpec)*VibFracSpec(iSpec)*TVibSpec(iSpec) TEquiDenom = TEquiDenom + Xi_RotSpec(iSpec)*RotFracSpec(iSpec) + Xi_VibSpec(iSpec)*VibFracSpec(iSpec) END IF END DO @@ -1070,7 +977,8 @@ SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, Xi_VibSpec, EVibSpec, totalWeightSpe ! Sum up over all species DO iSpec = 1, nSpecies IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN - TEquiNum = TEquiNum + Xi_RotSpec(iSpec)*RotFracSpec(iSpec)*TRotSpec(iSpec) + Xi_VibSpec(iSpec)*VibFracSpec(iSpec)*TVibSpec(iSpec) + TEquiNum = TEquiNum + Xi_RotSpec(iSpec)*RotFracSpec(iSpec)*TRotSpec(iSpec) + & + Xi_VibSpec(iSpec)*VibFracSpec(iSpec)*TVibSpec(iSpec) TEquiDenom = TEquiDenom + Xi_RotSpec(iSpec)*RotFracSpec(iSpec) + Xi_VibSpecNew(iSpec)*VibFracSpec(iSpec) END IF END DO @@ -1118,7 +1026,8 @@ SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, Xi_VibSpec, EVibSpec, totalWeightSpe ! Sum up over all species DO iSpec = 1, nSpecies IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN - TEquiNum = TEquiNum + Xi_RotSpec(iSpec)*RotFracSpec(iSpec)*TRotSpec(iSpec) + Xi_VibSpec(iSpec)*VibFracSpec(iSpec)*TVibSpec(iSpec) + TEquiNum = TEquiNum + Xi_RotSpec(iSpec)*RotFracSpec(iSpec)*TRotSpec(iSpec) + & + Xi_VibSpec(iSpec)*VibFracSpec(iSpec)*TVibSpec(iSpec) TEquiDenom = TEquiDenom + Xi_RotSpec(iSpec)*RotFracSpec(iSpec) + Xi_VibSpecNew(iSpec)*VibFracSpec(iSpec) END IF END DO @@ -1127,11 +1036,106 @@ SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, Xi_VibSpec, EVibSpec, totalWeightSpe END IF END DO -! - tbc - kommentieren, Zeilenumbrüche, Subroutines tauschen, wo werden welche Vib-Freiheitsgrade verwendet? --------------------- - END SUBROUTINE CalcTRelax +SUBROUTINE DetermineRelaxPart(nPart, iPartIndx_Node, relaxfreq, dtCell, nRelax, nRotRelax, nVibRelax, & + RotRelaxWeightSpec, VibRelaxWeightSpec, iPartIndx_NodeRelax, iPartIndx_NodeRelaxTemp, iPartIndx_NodeRelaxRot, & + iPartIndx_NodeRelaxVib, vBulk, OldEnRot, OldEn, rotrelaxfreqSpec, vibrelaxfreqSpec, betaR, betaV) +!=================================================================================================================================== +!> Determine the number of particles undergoing a relaxation (including vibration and rotation) +!=================================================================================================================================== +! MODULES +USE MOD_Particle_Vars ,ONLY: Species, PartSpecies, PartState, nSpecies +USE MOD_DSMC_Vars ,ONLY: SpecDSMC, PartStateIntEn +USE MOD_BGK_Vars ,ONLY: BGKDoVibRelaxation +USE MOD_part_tools ,ONLY: GetParticleWeight +! IMPLICIT VARIABLE HANDLING + IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES +INTEGER, INTENT(IN) :: nPart, iPartIndx_Node(nPart) +REAL, INTENT(IN) :: relaxfreq, dtCell, rotrelaxfreqSpec(nSpecies), vibrelaxfreqSpec(nSpecies) +REAL, INTENT(IN) :: betaR(nSpecies), betaV(nSpecies) +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +INTEGER, INTENT(OUT) :: iPartIndx_NodeRelax(:), iPartIndx_NodeRelaxTemp(:) +INTEGER, INTENT(OUT) :: iPartIndx_NodeRelaxRot(:), iPartIndx_NodeRelaxVib(:) +INTEGER, INTENT(OUT) :: nRelax, nRotRelax, nVibRelax +REAL, INTENT(OUT) :: vBulk(3), OldEnRot, RotRelaxWeightSpec(nSpecies), VibRelaxWeightSpec(nSpecies) +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT-OUTPUT VARIABLES +REAL, INTENT(INOUT) :: OldEn +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +INTEGER :: iPart, iSpec, iLoop, iPick, iLoopRot, iLoopVib +REAL :: ProbAddPartTrans, iRan, partWeight, ProbAddPartRot, ProbAddPartVib +!=================================================================================================================================== +VibRelaxWeightSpec =0; RotRelaxWeightSpec =0; nRelax=0; vBulk=0.0; nRotRelax=0; nVibRelax=0; OldEnRot=0.0 +iLoopRot=1; iLoopVib=1 +! Calculate probability of relaxation of a particle towards the target distribution function +ProbAddPartTrans = 1.-EXP(-relaxfreq*dtCell) +CALL RANDOM_NUMBER(iRan) +! Calculate the number of relaxing particles +nRelax = INT(REAL(nPart) * ProbAddPartTrans + iRan) +! List of non-relaxing particles +iPartIndx_NodeRelaxTemp(:) = iPartIndx_Node(:) +! Relaxing particles +DO iLoop = 1, nRelax + CALL RANDOM_NUMBER(iRan) + iPick = INT(iRan * (nPart-iLoop+1)) + 1 + iPart = iPartIndx_NodeRelaxTemp(iPick) + partWeight = GetParticleWeight(iPart) + iSpec = PartSpecies(iPart) + iPartIndx_NodeRelax(iLoop) = iPart + iPartIndx_NodeRelaxTemp(iPick) = iPartIndx_NodeRelaxTemp(nPart-iLoop+1) + ! For molecules: relaxation of inner DOF + IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN + ! Rotation + CALL RANDOM_NUMBER(iRan) + ! Calculate probability of rotational relaxation of a particle that relaxes towards the target distribution function + ProbAddPartRot = rotrelaxfreqSpec(iSpec)/relaxfreq*betaR(iSpec) + IF (ProbAddPartRot.GT.iRan) THEN + ! relaxation + iPartIndx_NodeRelaxRot(iLoopRot) = iPartIndx_NodeRelax(iLoop) + nRotRelax = nRotRelax + 1 + iLoopRot = iLoopRot + 1 + RotRelaxWeightSpec(iSpec) = RotRelaxWeightSpec(iSpec) + partWeight + ! Sum up total rotational energy + OldEnRot = OldEnRot + PartStateIntEn(2,iPart) * partWeight + END IF + ! Vibration + IF(BGKDoVibRelaxation) THEN + CALL RANDOM_NUMBER(iRan) + ! Calculate probability of vibrational relaxation of a particle that relaxes towards the target distribution function + ProbAddPartVib = vibrelaxfreqSpec(iSpec)/relaxfreq*betaV(iSpec) + IF (ProbAddPartVib.GT.iRan) THEN + ! relaxation + iPartIndx_NodeRelaxVib(iLoopVib) = iPartIndx_NodeRelax(iLoop) + nVibRelax = nVibRelax + 1 + VibRelaxWeightSpec(iSpec) = VibRelaxWeightSpec(iSpec) + partWeight + ! Sum up total vibrational energy of all relaxing particles, considering zero-point energy, and add to translational energy + OldEn = OldEn + (PartStateIntEn(1,iPartIndx_NodeRelaxVib(iLoopVib)) - SpecDSMC(iSpec)%EZeroPoint) * partWeight + iLoopVib = iLoopVib + 1 + END IF + END IF + END IF +END DO + +! Non-relaxing particles +! nNonRelax = nPart-nRelax +DO iLoop = 1, nPart-nRelax + iPart = iPartIndx_NodeRelaxTemp(iLoop) + partWeight = GetParticleWeight(iPart) + iSpec = PartSpecies(iPart) + ! iPartIndx_NodeNonRelax(iLoop) + ! Sum up velocities of non-relaxing particles for bulk velocity + vBulk(1:3) = vBulk(1:3) + PartState(4:6,iPart)*Species(iSpec)%MassIC*partWeight +END DO + +END SUBROUTINE DetermineRelaxPart + + SUBROUTINE RelaxInnerEnergy(nVibRelax, nRotRelax, iPartIndx_NodeRelaxVib, iPartIndx_NodeRelaxRot, nXiVibDOF, Xi_vib_DOF, & Xi_VibSpec, Xi_RotSpec, VibEnergyDOF, TEqui, NewEnVib, NewEnRot) !=================================================================================================================================== From d626483a0f1bd6436da05aa7db24bda0f1e946ce Mon Sep 17 00:00:00 2001 From: Franziska Hild Date: Fri, 21 Apr 2023 16:13:17 +0200 Subject: [PATCH 067/495] BGK calculation TEqui correction of do while --- src/particles/bgk/bgk_colloperator.f90 | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/particles/bgk/bgk_colloperator.f90 b/src/particles/bgk/bgk_colloperator.f90 index 960623610..10e7e4490 100644 --- a/src/particles/bgk/bgk_colloperator.f90 +++ b/src/particles/bgk/bgk_colloperator.f90 @@ -820,8 +820,8 @@ SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, Xi_VibSpec, EVibSpec, totalWeightSpe REAL :: RotFracSpec(nSpecies), VibFracSpec(nSpecies) REAL :: ERotSpecMean(nSpecies), EVibSpecMean(nSpecies), EVibTtransPoly, ETransRelMean REAL :: ERotTtransSpecMean(nSpecies), EVibTtransSpecMean(nSpecies) -REAL :: TEqui_Old, TEquiNum, TEquiDenom, exparg -REAL :: eps_prec=1.0E-0 +REAL :: TEqui_Old, TEqui_Old2, TEquiNum, TEquiDenom, exparg +REAL :: eps_prec=1.0E-1 !=================================================================================================================================== ! According to J. Mathiaud et. al., "An ES-BGK model for diatomic gases with correct relaxation rates for internal energies", ! European Journal of Mechanics - B/Fluids, 96, pp. 65-77, 2022 @@ -880,7 +880,7 @@ SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, Xi_VibSpec, EVibSpec, totalWeightSpe ! Calculate number of vibrational relaxing molecules VibFracSpec(iSpec) = totalWeightSpec(iSpec)*(vibrelaxfreqSpec(iSpec)/relaxfreq)*(1.-EXP(-relaxfreq*dtCell)) END IF -! - tbd - Calculation xi necessary here? ----------------------------------------------------------------------------- + ! - tbd - Calculation xi necessary here? ----------------------------------------------------------------------------- ! Mean translational energy per particle to satisfy the Landau-Teller equation ETransRelMean = ETransRelMean + (3./2. * BoltzmannConst * CellTemp - (rotrelaxfreqSpec(iSpec)/relaxfreq) * & @@ -971,6 +971,7 @@ SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, Xi_VibSpec, EVibSpec, totalWeightSpe END IF END DO TEqui_Old = TEqui + TEqui_Old2 = TEqui ! new calculation of equilibrium temperature with new RotFracSpec, new VibFracSpec, new VibDOF(TEqui) in denominator TEquiNum = 3.*(nPart-1.)*CellTemp TEquiDenom = 3.*(nPart-1.) @@ -985,9 +986,9 @@ SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, Xi_VibSpec, EVibSpec, totalWeightSpe TEqui = TEquiNum/TEquiDenom IF(BGKDoVibRelaxation) THEN ! accuracy eps_prec not reached yet - DO WHILE ( ABS( TEqui - TEqui_Old ) .GT. eps_prec ) + DO WHILE ( ABS( TEqui - TEqui_Old2 ) .GT. eps_prec ) ! mean value of old and new equilibrium temperature - TEqui = (TEqui + TEqui_Old) * 0.5 + TEqui = (TEqui + TEqui_Old2) * 0.5 DO iSpec = 1, nSpecies IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN ! new calculation of the vibrational degrees of freedom per species @@ -1019,7 +1020,7 @@ SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, Xi_VibSpec, EVibSpec, totalWeightSpe END IF END IF END DO - TEqui_Old = TEqui + TEqui_Old2 = TEqui ! new calculation of equilibrium temperature with new RotFracSpec, new VibFracSpec, new VibDOF(TEqui) in denominator TEquiNum = 3.*(nPart-1.)*CellTemp TEquiDenom = 3.*(nPart-1.) From 3c167d43020ba838140749c8b8d1f1c2898bf7a3 Mon Sep 17 00:00:00 2001 From: Franziska Hild Date: Wed, 26 Apr 2023 14:23:12 +0200 Subject: [PATCH 068/495] BGK relax Mathiaud - small clean up and bug fix sampling (testing tbc) --- src/particles/bgk/bgk_colloperator.f90 | 95 ++++++++++---------------- 1 file changed, 36 insertions(+), 59 deletions(-) diff --git a/src/particles/bgk/bgk_colloperator.f90 b/src/particles/bgk/bgk_colloperator.f90 index 10e7e4490..525365aee 100644 --- a/src/particles/bgk/bgk_colloperator.f90 +++ b/src/particles/bgk/bgk_colloperator.f90 @@ -572,7 +572,7 @@ SUBROUTINE DoAveraging(dens, u2, u0ij, u2i, CellTemp, AverageValues) dens = AverageValues(1) u2 = AverageValues(2) END IF - CellTemp = Species(1)%MassIC * u2 / (3.0*BoltzmannConst) +CellTemp = Species(1)%MassIC * u2 / (3.0*BoltzmannConst) END SUBROUTINE DoAveraging @@ -818,17 +818,16 @@ SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, Xi_VibSpec, EVibSpec, totalWeightSpe ! LOCAL VARIABLES INTEGER :: iSpec, iDOF, iPolyatMole REAL :: RotFracSpec(nSpecies), VibFracSpec(nSpecies) -REAL :: ERotSpecMean(nSpecies), EVibSpecMean(nSpecies), EVibTtransPoly, ETransRelMean +REAL :: ERotSpecMean(nSpecies), EVibSpecMean(nSpecies), ETransRelMean REAL :: ERotTtransSpecMean(nSpecies), EVibTtransSpecMean(nSpecies) REAL :: TEqui_Old, TEqui_Old2, TEquiNum, TEquiDenom, exparg -REAL :: eps_prec=1.0E-1 +REAL :: eps_prec=1.0E-0 !=================================================================================================================================== ! According to J. Mathiaud et. al., "An ES-BGK model for diatomic gases with correct relaxation rates for internal energies", ! European Journal of Mechanics - B/Fluids, 96, pp. 65-77, 2022 -RotFracSpec=0.0; VibFracSpec=0.0 -ERotSpecMean=0.0; ERotTtransSpecMean=0.0; EVibSpecMean=0.0; EVibTtransSpecMean=0.0; Xi_vib_DOF=0.0; Xi_VibSpecNew=0.0 -ETransRelMean=0.0; CellTempRel=0.0 +RotFracSpec=0.0; VibFracSpec=0.0; Xi_vib_DOF=0.0; Xi_VibSpecNew=0.0; betaR=1.0; betaV=1.0 +ERotSpecMean=0.0; ERotTtransSpecMean=0.0; EVibSpecMean=0.0; EVibTtransSpecMean=0.0; ETransRelMean=0.0; CellTempRel=0.0 DO iSpec = 1, nSpecies IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN ! molecules @@ -842,45 +841,21 @@ SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, Xi_VibSpec, EVibSpec, totalWeightSpe IF(BGKDoVibRelaxation) THEN ! Mean vibrational energy per particle of a species EVibSpecMean(iSpec) = EVibSpec(iSpec)/totalWeightSpec(iSpec) - IF(SpecDSMC(iSpec)%PolyatomicMol) THEN ! polyatomic iPolyatMole = SpecDSMC(iSpec)%SpecToPolyArray ! Loop over all vibrational DOF DO iDOF = 1, PolyatomMolDSMC(iPolyatMole)%VibDOF - ! Mean vibrational energy per DOF for the mixture translational temperature, EVib(Ttrans) - EVibTtransPoly = BoltzmannConst * PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF) / & - (EXP(PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)/CellTemp) - 1.) ! Mean vibrational energy per particle of a species for the mixture translational temperature, EVib(Ttrans) - EVibTtransSpecMean(iSpec) = EVibTtransSpecMean(iSpec) + EVibTtransPoly - ! ! Mean vibrational temperature per DOF to satisfy the Landau-Teller equation - ! TVibRelPoly = EVibTtransPoly / (BoltzmannConst*PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)) - ! IF (TVibRelPoly.GT.0.0) THEN - ! TVibRelPoly = PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)/LOG(1. + 1./TVibRelPoly) - ! ! Calculation of the vibrational degrees of freedom to satisfy the Landau-Teller equation - ! Xi_vib_DOF(iPolyatMole,iDOF) = 2.* EVibTtransPoly / (BoltzmannConst*TVibRelPoly) - ! ELSE - ! Xi_vib_DOF(iPolyatMole,iDOF) = 0.0 - ! END IF + EVibTtransSpecMean(iSpec) = EVibTtransSpecMean(iSpec) + BoltzmannConst*PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF) / & + (EXP(PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)/CellTemp) - 1.) END DO - ELSE ! diatomic ! Mean vibrational energy per particle of a species for the mixture translational temperature, EVib(Ttrans) EVibTtransSpecMean(iSpec) = BoltzmannConst * SpecDSMC(iSpec)%CharaTVib / (EXP(SpecDSMC(iSpec)%CharaTVib/CellTemp) - 1.) - ! ! Mean vibrational temperature per particle of a species to satisfy the Landau-Teller equation - ! TVibRelSpecMean = EVibTtransSpecMean(iSpec) / (BoltzmannConst*SpecDSMC(iSpec)%CharaTVib) - ! IF (TVibRelSpecMean.GT.0.0) THEN - ! TVibRelSpecMean = SpecDSMC(iSpec)%CharaTVib/LOG(1. + 1./(TVibRelSpecMean)) - ! ! Calculation of the vibrational degrees of freedom to satisfy the Landau-Teller equation - ! Xi_VibRelSpec(iSpec) = 2.* EVibTtransSpecMean(iSpec) / (BoltzmannConst*TVibRelSpecMean) - ! ! No negative temperature possible - ! ELSE - ! Xi_VibRelSpec(iSpec) = 0.0 - ! END IF END IF ! Calculate number of vibrational relaxing molecules VibFracSpec(iSpec) = totalWeightSpec(iSpec)*(vibrelaxfreqSpec(iSpec)/relaxfreq)*(1.-EXP(-relaxfreq*dtCell)) END IF - ! - tbd - Calculation xi necessary here? ----------------------------------------------------------------------------- ! Mean translational energy per particle to satisfy the Landau-Teller equation ETransRelMean = ETransRelMean + (3./2. * BoltzmannConst * CellTemp - (rotrelaxfreqSpec(iSpec)/relaxfreq) * & @@ -947,8 +922,8 @@ SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, Xi_VibSpec, EVibSpec, totalWeightSpe DO iDOF = 1, PolyatomMolDSMC(iPolyatMole)%VibDOF exparg = PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)/TEqui ! Check if the exponent is within the range of machine precision for calculation of vibrational degrees of freedom - IF(CHECKEXP(exparg))THEN - IF(exparg.gt.0.)THEN ! positive overflow: exp -> inf + IF(CHECKEXP(exparg)) THEN + IF(exparg.gt.0.) THEN ! positive overflow: exp -> inf Xi_vib_DOF(iSpec,iDOF) = 2.*exparg/(EXP(exparg)-1.) ELSE ! negative overflow: exp -> 0 Xi_vib_DOF(iSpec,iDOF) = 2.*exparg/(-1.) @@ -961,7 +936,7 @@ SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, Xi_VibSpec, EVibSpec, totalWeightSpe ELSE ! diatomic exparg = SpecDSMC(iSpec)%CharaTVib/TEqui ! Check if the exponent is within the range of machine precision for calculation of vibrational degrees of freedom - IF(CHECKEXP(exparg))THEN + IF(CHECKEXP(exparg)) THEN Xi_VibSpecNew(iSpec) = 2.*SpecDSMC(iSpec)%CharaTVib/TEqui/(EXP(exparg)-1.) ELSE Xi_VibSpecNew(iSpec) = 0.0 @@ -998,8 +973,8 @@ SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, Xi_VibSpec, EVibSpec, totalWeightSpe DO iDOF = 1, PolyatomMolDSMC(iPolyatMole)%VibDOF exparg = PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)/TEqui ! Check if the exponent is within the range of machine precision for calculation of vibrational degrees of freedom - IF(CHECKEXP(exparg))THEN - IF(exparg.gt.0.)THEN ! positive overflow: exp -> inf + IF(CHECKEXP(exparg)) THEN + IF(exparg.gt.0.) THEN ! positive overflow: exp -> inf Xi_vib_DOF(iSpec,iDOF) = 2.*exparg/(EXP(exparg)-1.) ELSE ! negative overflow: exp -> 0 Xi_vib_DOF(iSpec,iDOF) = 2.*exparg/(-1.) @@ -1012,7 +987,7 @@ SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, Xi_VibSpec, EVibSpec, totalWeightSpe ELSE ! diatomic exparg = SpecDSMC(iSpec)%CharaTVib/TEqui ! Check if the exponent is within the range of machine precision for calculation of vibrational degrees of freedom - IF(CHECKEXP(exparg))THEN + IF(CHECKEXP(exparg)) THEN Xi_VibSpecNew(iSpec) = 2.*SpecDSMC(iSpec)%CharaTVib/TEqui/(EXP(exparg)-1.) ELSE Xi_VibSpecNew(iSpec) = 0.0 @@ -1220,6 +1195,7 @@ SUBROUTINE SampleFromTargetDistr(nRelax, iPartIndx_NodeRelax, Prandtl, u2, u0ij, USE MOD_BGK_Vars ,ONLY: BGKCollModel, ESBGKModel USE MOD_part_tools ,ONLY: GetParticleWeight USE MOD_Globals_Vars ,ONLY: BoltzmannConst +USE MOD_Globals ,ONLY: abort ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -1241,15 +1217,15 @@ SUBROUTINE SampleFromTargetDistr(nRelax, iPartIndx_NodeRelax, Prandtl, u2, u0ij, CASE (1) ! Ellipsoidal Statistical BGK IF (ESBGKModel.EQ.1) THEN ! Approximated solution - DO fillMa1 =1, 3 - DO fillMa2 =fillMa1, 3 + DO fillMa1 = 1, 3 + DO fillMa2 = fillMa1, 3 IF (fillMa1.EQ.fillMa2) THEN KronDelta = 1.0 ELSE KronDelta = 0.0 END IF ! Fill symmetric transformation matrix SMat with anisotopic matrix A = SS - SMat(fillMa1, fillMa2)= KronDelta*CellTempRel/CellTemp - (1.-Prandtl)/(2.*Prandtl) & + SMat(fillMa1, fillMa2) = KronDelta - (1.-Prandtl)/(2.*Prandtl) & *(3./u2*u0ij(fillMa1, fillMa2)-KronDelta) END DO END DO @@ -1259,8 +1235,8 @@ SUBROUTINE SampleFromTargetDistr(nRelax, iPartIndx_NodeRelax, Prandtl, u2, u0ij, ! Generate random normals for the sampling of new velocities of all relaxing particles CALL BGK_BuildTransGaussNums(nRelax, iRanPart) ELSE - DO fillMa1 =1, 3 - DO fillMa2 =fillMa1, 3 + DO fillMa1 = 1, 3 + DO fillMa2 = fillMa1, 3 IF (fillMa1.EQ.fillMa2) THEN KronDelta = 1.0 ELSE @@ -1278,22 +1254,23 @@ SUBROUTINE SampleFromTargetDistr(nRelax, iPartIndx_NodeRelax, Prandtl, u2, u0ij, CALL DSYEV('V','U',3,A,3,W,Work,100,INFO) SMat = 0.0 IF (W(3).LT.0.0) THEN - ! Due to ascending order of eigenvalues, all three eigenvalues are lower than zero here - ! Same calculation as for approximate solution (ESBGKModel.EQ.1) - DO fillMa1 =1, 3 - DO fillMa2 =fillMa1, 3 - IF (fillMa1.EQ.fillMa2) THEN - KronDelta = 1.0 - ELSE - KronDelta = 0.0 - END IF - SMat(fillMa1, fillMa2)= KronDelta*CellTempRel*BoltzmannConst/MassIC_Mixture - (1.-Prandtl)/(2.*Prandtl) & - *(u0ij(fillMa1, fillMa2)-KronDelta*CellTemp*BoltzmannConst/MassIC_Mixture) - END DO - END DO - SMat(2,1)=SMat(1,2) - SMat(3,1)=SMat(1,3) - SMat(3,2)=SMat(2,3) + ! ! Due to ascending order of eigenvalues, all three eigenvalues are lower than zero here + ! ! Same calculation as for approximate solution (ESBGKModel.EQ.1) + ! DO fillMa1 = 1, 3 + ! DO fillMa2 = fillMa1, 3 + ! IF (fillMa1.EQ.fillMa2) THEN + ! KronDelta = 1.0 + ! ELSE + ! KronDelta = 0.0 + ! END IF + ! SMat(fillMa1, fillMa2) = KronDelta*CellTempRel*BoltzmannConst/MassIC_Mixture - (1.-Prandtl)/(2.*Prandtl) & + ! *(u0ij(fillMa1, fillMa2)-KronDelta*CellTemp*BoltzmannConst/MassIC_Mixture) + ! END DO + ! END DO + ! SMat(2,1)=SMat(1,2) + ! SMat(3,1)=SMat(1,3) + ! SMat(3,2)=SMat(2,3) + CALL abort(__STAMP__,'Sampling ESBGK 2') ELSE ! At least W(3) is not negative ! Set negative eigenvalues to zero From 961ff9b35a4d0fd462578c06796818f0ed49b5f4 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Wed, 26 Apr 2023 16:55:48 +0200 Subject: [PATCH 069/495] Ray tracing WIP --- .../DSMC.ini | 52 +++++ .../analyze.ini | 17 ++ .../command_line.ini | 2 + .../hopr.ini | 40 ++++ .../parameter.ini | 163 ++++++++++++++ src/CMakeLists.txt | 6 +- src/init/define_parameters_init.f90 | 2 + .../emission/particle_emission_tools.f90 | 28 ++- src/piclaslib.f90 | 2 + src/radiation/ray_tracing/raytrace_ini.f90 | 49 ++-- src/radiation/ray_tracing/raytrace_main.f90 | 211 ++++++++++-------- src/radiation/ray_tracing/raytrace_vars.f90 | 62 ++--- 12 files changed, 480 insertions(+), 154 deletions(-) create mode 100644 regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/DSMC.ini create mode 100644 regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/analyze.ini create mode 100644 regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/command_line.ini create mode 100644 regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/hopr.ini create mode 100644 regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/parameter.ini diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/DSMC.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/DSMC.ini new file mode 100644 index 000000000..75c0cfeaf --- /dev/null +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/DSMC.ini @@ -0,0 +1,52 @@ + +! =============================================================================== ! +! Species1, H2 +! =============================================================================== ! +Part-Species1-SpeciesName = H2 +Part-Species1-InteractionID = 2 +Part-Species1-Tref = 1000 +Part-Species1-dref = 2.68E-10 +Part-Species1-omega = 0.407 +Part-Species1-HeatOfFormation_K = 0.0 +Part-Species1-CharaTempVib = 6332.37 +Part-Species1-Ediss_eV = 4.47 +! =============================================================================== ! +! Species2, H +! =============================================================================== ! +Part-Species2-SpeciesName = H +Part-Species2-InteractionID = 1 +Part-Species2-Tref = 1000 +Part-Species2-dref = 2.581E-10 +Part-Species2-omega = 0.407 +Part-Species2-HeatOfFormation_K = 26159.76 +! =============================================================================== ! +! Species3, e +! =============================================================================== ! +Part-Species3-SpeciesName = electron +Part-Species3-InteractionID = 4 +Part-Species3-Tref = 1000 +Part-Species3-dref = 2.817920E-15 +Part-Species3-omega = 0.407 +! =============================================================================== ! +! Species4, H2Ion +! =============================================================================== ! +Part-Species4-SpeciesName = H2Ion1 +Part-Species4-InteractionID = 20 +Part-Species4-Tref = 1000 +Part-Species4-dref = 3.883E-10 +Part-Species4-omega = 0.407 +Part-Species4-CharaTempVib = 3341.01 +Part-Species4-Ediss_eV = 2.65 +Part-Species4-PreviousState = 1 +! =============================================================================== ! +! Species5, HIon +! =============================================================================== ! +Part-Species5-SpeciesName = HIon1 +Part-Species5-InteractionID = 10 +Part-Species5-Tref = 1000 +Part-Species5-dref = 3.912E-10 +Part-Species5-omega = 0.407 +Part-Species5-PreviousState = 2 + + + diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/analyze.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/analyze.ini new file mode 100644 index 000000000..0fed3775f --- /dev/null +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/analyze.ini @@ -0,0 +1,17 @@ +! =================================================================================================================== +! compare column +! =================================================================================================================== +compare_column_file = PartAnalyze.csv ! data file name +compare_column_reference_file = Electrons_ref.csv ! data file name +compare_column_index = 9 ! column index for comparison +compare_column_tolerance_value = 1e9 ! tolerance (depends on machine accuracy and MPI) +compare_column_tolerance_type = absolute ! absolute or relative tolerance + +! =================================================================================================================== +! integrate columns x:y in a data file as integral(y(x), x, x(1), x(end)) +! =================================================================================================================== +integrate_line_file = SurfaceAnalyze.csv ! data file name +integrate_line_columns = 0:1 ! columns x:y [time:nPart_in] +integrate_line_integral_value = 8.065565e-07 ! Ampere +integrate_line_tolerance_value = 0.8e-2 ! tolerance +integrate_line_tolerance_type = relative ! special option diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/command_line.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/command_line.ini new file mode 100644 index 000000000..73e8d46c3 --- /dev/null +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/command_line.ini @@ -0,0 +1,2 @@ +MPI = 1,2,5,8 +cmd_suffix = DSMC.ini diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/hopr.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/hopr.ini new file mode 100644 index 000000000..e0433ad89 --- /dev/null +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/hopr.ini @@ -0,0 +1,40 @@ +!=============================================================================== ! +! OUTPUT +!=============================================================================== ! +ProjectName = box ! name of the project (used for filenames) +Debugvisu = T ! Write debug mesh to file +Logging = F ! Write log files + +!=============================================================================== ! +! MESH +!=============================================================================== ! +Mode =1 ! 1 Cartesian 2 gambit file 3 CGNS +nZones =1 ! number of zones +Corner =(/0.,0.,0.,,1.0,0.,0.,,1.0,1.0,0.,,0.,1.0,0.,,0.,0.,1.0,,1.0,0.,1.0,,1.0,1.0,1.0,,0.,1.0,1.0/) +nElems =(/5,5,5/) ! number of elements in each direction (30x30x30) +BCIndex =(/5,3,2,4,1,6/) ! Indices of UserDefinedBoundaries +elemtype =108 ! Elementform (108: Hexaeder) +useCurveds =F ! T if curved boundaries defined +SpaceQuandt =1. ! characteristic length of the mesh +ConformConnect=T + +!=============================================================================== ! +! BOUNDARY CONDITIONS +!=============================================================================== ! +nUserDefinedBoundaries=6 +BoundaryName=BC_periodicx- ! Periodic (+vv1) +BoundaryType=(/1,0,0,1/) ! Periodic (+vv1) +BoundaryName=BC_periodicx+ ! Periodic (-vv1) +BoundaryType=(/1,0,0,-1/) ! Periodic (-vv1) +BoundaryName=BC_periodicy- ! Periodic (+vv2) +BoundaryType=(/1,0,0,2/) ! Periodic (+vv2) +BoundaryName=BC_periodicy+ ! Periodic (-vv2) +BoundaryType=(/1,0,0,-2/) ! Periodic (-vv2) +BoundaryName=BC_WALL +BoundaryType=(/4,0,0,0/) +BoundaryName=BC_TOP +BoundaryType=(/4,0,0,0/) + +nVV=2 +VV=(/1.0 , 0. , 0./) +VV=(/0. , 1.0 , 0./) diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/parameter.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/parameter.ini new file mode 100644 index 000000000..24d729ca6 --- /dev/null +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/parameter.ini @@ -0,0 +1,163 @@ +! =============================================================================== ! +! POSTI +! =============================================================================== ! +VisuParticles = T +NVisu = 1 +TimeStampLength = 21 +! =============================================================================== ! +! VARIABLES +! =============================================================================== ! +CFLscale = 0.2 +IniExactFunc = 0 +N = 1 + +DoLoadBalance = T +Load-DeviationThreshold = 0.15 +LoadBalanceMaxSteps = 20 +DoInitialAutoRestart = T +! =============================================================================== ! +! MESH +! =============================================================================== ! +MeshFile = box_mesh.h5 +Logging = F +WriteErrorFiles = F +useCurveds = F +! if boundaries have to be changed (else they are used from Mesh directly): +TrackingMethod = triatracking +! =============================================================================== ! +! OUTPUT / VISUALIZATION +! =============================================================================== ! +ProjectName = photoionization +IterDisplayStep = 10 +Part-AnalyzeStep = 1 + +CalcNumSpec = T +CalcNumDens = T + +CalcElectronSEE = T + +!CheckExchangeProcs = T ! deactivate the asymmetric communicator check +! =============================================================================== ! +! CALCULATION +! =============================================================================== ! +ManualTimeStep = 5.0E-9 +tend = 100e-9 +Analyze_dt = 100e-9 + +PIC-DoDeposition = F + +PIC-DoInterpolation = F +Part-LorentzType = 0 + +epsCG = 1e-2 + +! Change boundary conditions from definition in hopr.ini +!BoundaryName = WALL +!BoundaryType = (/5,0/) +! =============================================================================== ! +! DSMC +! =============================================================================== ! +UseDSMC = T +Particles-DSMC-CollisMode = 0 +Part-NumberOfRandomSeeds = 2 +Particles-RandomSeed1 = 1 +Particles-RandomSeed2 = 2 +Particles-HaloEpsVelo = 3E7 + +Particles-DSMC-ElectronicModel = 1 +Particles-DSMCElectronicDatabase = Electronic-State-Database.h5 +EpsMergeElectronicState = 1E-2 +Part-Species$-ElecRelaxProb = 1. +! =============================================================================== ! +! PARTICLES +! =============================================================================== ! +Part-nSpecies = 5 +Part-maxParticleNumber = 4000000 +Part-nBounds = 6 + +Part-Boundary1-SourceName = BC_periodicx- +Part-Boundary1-Condition = periodic +Part-Boundary2-SourceName = BC_periodicx+ +Part-Boundary2-Condition = periodic +Part-Boundary3-SourceName = BC_periodicy- +Part-Boundary3-Condition = periodic +Part-Boundary4-SourceName = BC_periodicy+ +Part-Boundary4-Condition = periodic + +Part-Boundary5-SourceName = BC_WALL +Part-Boundary5-Condition = reflective +Part-Boundary5-BoundaryParticleOutput = T + +Part-Boundary6-SourceName = BC_TOP +Part-Boundary6-Condition = reflective +Part-Boundary6-BoundaryParticleOutput = T + +Part-nPeriodicVectors = 2 +Part-FIBGMdeltas = (/ 1.0 , 1.0 , 1.0 /) +Part-FactorFIBGM = (/ 5 , 5 , 5 /) + +! =============================================================================== ! +! Ray Tracing +! =============================================================================== ! +RayTracing-PartBound = 6 ! -> iBC=6 + +RayTracing-PulseDuration = 15e-9 +RayTracing-WaveLength = 10e-9 +RayTracing-Power = 1.0 +RayTracing-RepetitionRate = 1000 +RayTracing-RayDirection = (/ 0. , 0. , -1.0 /) + +! SEE parameters +RayTracing-WorkFunctionSEE = 10.0 +RayTracing-YieldSEE = 0.1 +! =============================================================================== ! +! Weighting Factor +! =============================================================================== ! +Part-Species$-MacroParticleFactor = 1e4 + +! Change MPF of SEE particles +Part-vMPF = T +Part-Species3-Init1-MacroParticleFactor = 1e7,1e8,1e9 + +! =============================================================================== ! +! Species1 | H2 +! =============================================================================== ! +Part-Species1-MassIC = 3.348E-27 +Part-Species1-ChargeIC = 0.0 + +Part-Species1-nInits = 1 + +Part-Species1-Init1-velocityDistribution = maxwell_lpn +Part-Species1-Init1-SpaceIC = background +Part-Species1-Init1-VeloIC = 0. +Part-Species1-Init1-PartDensity = 10.0e20 +Part-Species1-Init1-VeloVecIC = (/0.,1.,0./) +Part-Species1-Init1-MWTemperatureIC = 300. +Part-Species1-Init1-TempVib = 300. +Part-Species1-Init1-TempRot = 300. +Part-Species1-Init1-TempElec = 300. +! =============================================================================== ! +! Species2 | H +! =============================================================================== ! +Part-Species2-MassIC = 1.674E-27 +Part-Species2-ChargeIC = 0.0 +Part-Species2-TempElec = 300. +! =============================================================================== ! +! Species3 | e +! =============================================================================== ! +Part-Species3-MassIC = 9.11E-31 +Part-Species3-ChargeIC = -1.60217653E-19 +! =============================================================================== ! +! Species4 | H2Ion +! =============================================================================== ! +Part-Species4-MassIC = 3.3470890E-27 +Part-Species4-ChargeIC = 1.60217653E-19 +!Part-Species4-TempVib = 300. +!Part-Species4-TempRot = 300. +!Part-Species4-TempElec = 300. +! =============================================================================== ! +! Species5 | HIon +! =============================================================================== ! +Part-Species5-MassIC = 1.673089E-27 +Part-Species5-ChargeIC = 1.60217653E-19 +!Part-Species5-TempElec = 300. diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 3608e9ef7..767889e44 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -437,7 +437,11 @@ FILE(GLOB_RECURSE piclasF90 ./src/init/*.f90 ./src/utils/*.f90 ./unitTests/unittest.f90 ./unitTests/unittest_vars.f90 - ./src/radiation/ray_tracing/*.f90) + ./src/radiation/ray_tracing/*.f90 + ./src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 + ./src/radiation/radiative_transfer/radtrans_vars.f90 + ./src/radiation/radiative_transfer/tracking/radtrans_tools.f90 + ./src/radiation/radiation_solver/radiation_vars.f90) LIST(APPEND timediscF90 ${timediscF90} ./src/timedisc/timedisc.f90 diff --git a/src/init/define_parameters_init.f90 b/src/init/define_parameters_init.f90 index 3d9fee493..6371741dc 100644 --- a/src/init/define_parameters_init.f90 +++ b/src/init/define_parameters_init.f90 @@ -80,6 +80,7 @@ SUBROUTINE InitDefineParameters() USE MOD_Particle_TimeStep ,ONLY: DefineParametersVariableTimeStep USE MOD_DSMC_Symmetry ,ONLY: DefineParametersParticleSymmetry USE MOD_SuperB_Init ,ONLY: DefineParametersSuperB +USE MOD_RayTracing_Init ,ONLY: DefineParametersRayTracing #if USE_MPI USE mod_readIMD ,ONLY: DefineParametersReadIMDdata #endif @@ -128,6 +129,7 @@ SUBROUTINE InitDefineParameters() CALL DefineParametersAnalyze() CALL DefineParametersRecordPoints() #ifdef PARTICLES +CALL DefineParametersRayTracing() CALL DefineParametersSuperB() CALL DefineParametersParticles() CALL DefineParametersParticleEmission() diff --git a/src/particles/emission/particle_emission_tools.f90 b/src/particles/emission/particle_emission_tools.f90 index 81f7866fe..afe74013a 100644 --- a/src/particles/emission/particle_emission_tools.f90 +++ b/src/particles/emission/particle_emission_tools.f90 @@ -2179,29 +2179,43 @@ END FUNCTION pointDet !=================================================================================================================================== !> Check if x,y is inside side !=================================================================================================================================== -PPURE LOGICAL FUNCTION InsideQuadrilateral(X,SideID) RESULT(L) +PPURE LOGICAL FUNCTION InsideQuadrilateral(X,NonUniqueGlobalSideID) RESULT(L) ! MODULES +USE MOD_Particle_Mesh_Vars ,ONLY: NodeCoords_Shared,SideInfo_Shared,ElemSideNodeID_Shared +USE MOD_Mesh_Tools ,ONLY: GetCNElemID ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES -REAL,INTENT(IN) :: x(2) -INTEGER,INTENT(IN) :: SideID +REAL,INTENT(IN) :: X(2) +INTEGER,INTENT(IN) :: NonUniqueGlobalSideID !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES LOGICAL :: pos,neg -INTEGER :: iNode,ElemID,locSideID +INTEGER :: iNode,CNElemID,locSideID REAL :: normal(2),corner(2),P(1:2,1:4),d(3) !=================================================================================================================================== -ElemID = SideToElem(S2E_ELEM_ID,SideID) -locSideID = SideToElem(S2E_LOC_SIDE_ID,SideID) +CNElemID = GetCNElemID(SideInfo_Shared(SIDE_ELEMID,NonUniqueGlobalSideID)) +locSideID = SideInfo_Shared(SIDE_LOCALID,NonUniqueGlobalSideID) DO iNode = 1,4 - P(1:2,iNode) = NodeCoords_Shared(1:2,ElemSideNodeID_Shared(iNode,locSideID,ElemID)+1) + P(1:2,iNode) = NodeCoords_Shared(1:2,ElemSideNodeID_Shared(iNode,locSideID,CNElemID)+1) END DO +! sorted +P(1:2,1) = (/0,0/) +P(1:2,2) = (/1,0/) +P(1:2,3) = (/1,1/) +P(1:2,4) = (/0,1/) + +! not sorted +P(1:2,1) = (/0,0/) +P(1:2,2) = (/1,1/) +P(1:2,3) = (/1,0/) +P(1:2,4) = (/0,1/) + d(1) = pointDet(X,P(1:2,1),P(1:2,2)) d(2) = pointDet(X,P(1:2,2),P(1:2,3)) d(3) = pointDet(X,P(1:2,3),P(1:2,1)) diff --git a/src/piclaslib.f90 b/src/piclaslib.f90 index c4aeb51ea..8d17f0d35 100644 --- a/src/piclaslib.f90 +++ b/src/piclaslib.f90 @@ -60,6 +60,7 @@ SUBROUTINE InitializePiclas() #ifdef PARTICLES USE MOD_Particle_Vars ,ONLY: DoInitialIonization USE MOD_ParticleInit ,ONLY: InitialIonization +USE MOD_RayTracing_Init ,ONLY: InitRayTracing #endif /*PARTICLES*/ ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -206,6 +207,7 @@ SUBROUTINE InitializePiclas() #ifdef PARTICLES ! Ionize the current particles IF(DoInitialIonization) CALL InitialIonization() +CALL InitRayTracing() #endif /*PARTICLES*/ ! Measure init duration diff --git a/src/radiation/ray_tracing/raytrace_ini.f90 b/src/radiation/ray_tracing/raytrace_ini.f90 index e174860d1..0e280853a 100644 --- a/src/radiation/ray_tracing/raytrace_ini.f90 +++ b/src/radiation/ray_tracing/raytrace_ini.f90 @@ -21,14 +21,6 @@ MODULE MOD_RayTracing_Init IMPLICIT NONE PRIVATE -INTERFACE InitRayTracing - MODULE PROCEDURE InitRayTracing -END INTERFACE - -!INTERFACE FinalizeRadiationTransport -! MODULE PROCEDURE FinalizeRadiationTransport -!END INTERFACE - PUBLIC::InitRayTracing, DefineParametersRayTracing !=================================================================================================================================== @@ -48,16 +40,18 @@ SUBROUTINE DefineParametersRayTracing() CALL prms%CreateLogicalOption( 'RayTracing-AdaptiveRays' , 'TODO' , '.FALSE.') CALL prms%CreateIntOption( 'RayTracing-NumRays' , 'TODO' , '1') CALL prms%CreateIntOption( 'RayTracing-RayPosModel' , 'TODO' , '1') -CALL prms%CreateRealArrayOption('RayTracing-RayDirection' , 'TODO' , no=3) +CALL prms%CreateRealArrayOption('RayTracing-RayDirection' , 'Direction vector for ray emission. Will be normalized after read-in.' , no=3) +CALL prms%CreateIntOption( 'RayTracing-PartBound' , 'Particle boundary ID where rays are emitted from' , '0') -CALL prms%CreateRealOption(' RayTracing-PulseDuration' , 'Pulse duration tau for a Gaussian-type pulse with I~exp(-(t/tau)^2) [s]' , numberedmulti=.TRUE.) -CALL prms%CreateRealOption(' RayTracing-WaistRadius' , 'Beam waist radius (in focal spot) w_b for Gaussian-type pulse with I~exp(-(r/w_b)^2) [m]' , numberedmulti=.TRUE.) -CALL prms%CreateRealOption(' RayTracing-WaveLength' , 'Beam wavelength [m]' , numberedmulti=.TRUE.) -CALL prms%CreateRealOption(' RayTracing-RepetitionRate' , 'Pulse repetition rate (pulses per second) [Hz]' , numberedmulti=.TRUE.) -CALL prms%CreateRealOption(' RayTracing-Power' , 'Average pulse power (energy of a single pulse times repetition rate) [W]' , '-1.0' , numberedmulti=.TRUE.) +CALL prms%CreateRealOption( 'RayTracing-PulseDuration' , 'Pulse duration tau for a Gaussian-type pulse with I~exp(-(t/tau)^2) [s]' ) +CALL prms%CreateRealOption( 'RayTracing-WaistRadius' , 'Beam waist radius (in focal spot) w_b for Gaussian-type pulse with I~exp(-(r/w_b)^2) [m]' , '0.0') +CALL prms%CreateRealOption( 'RayTracing-WaveLength' , 'Beam wavelength [m]' ) +CALL prms%CreateRealOption( 'RayTracing-RepetitionRate' , 'Pulse repetition rate (pulses per second) [Hz]' ) +CALL prms%CreateRealOption( 'RayTracing-Power' , 'Average pulse power (energy of a single pulse times repetition rate) [W]' ) END SUBROUTINE DefineParametersRayTracing + SUBROUTINE InitRayTracing() !=================================================================================================================================== ! Initialization of the radiation transport solver @@ -66,8 +60,10 @@ SUBROUTINE InitRayTracing() USE MOD_Globals USE MOD_ReadInTools USE MOD_RayTracing_Vars -USE MOD_Particle_Boundary_Vars, ONLY : nComputeNodeSurfTotalSides -USE MOD_Mesh_Vars, ONLY : nGlobalElems +USE MOD_Mesh_Vars ,ONLY: nGlobalElems +USE MOD_Globals_Vars ,ONLY: Pi +USE MOD_Particle_Mesh_Vars ,ONLY: GEO +USE MOD_Particle_Boundary_Vars ,ONLY: nComputeNodeSurfTotalSides #if USE_MPI USE MOD_MPI_Shared_Vars USE MOD_MPI_Shared @@ -80,17 +76,13 @@ SUBROUTINE InitRayTracing() ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -INTEGER :: iWave, iElem, firstElem, lastElem, ElemDisp, DisplRank, iSpec, currentRank -REAL :: LocTemp, ObsLengt, MaxSumTemp(2), GlobalMaxTemp(2), hilf -LOGICAL :: ElemInCone -REAL,ALLOCATABLE :: Radiation_ShockTube_Spec(:,:) -INTEGER :: w, io_error !=================================================================================================================================== SWRITE(UNIT_StdOut,'(132("-"))') SWRITE(UNIT_stdOut,'(A)') ' INIT RAY TRACING SOLVER ...' RayPartBound = GETINT('RayTracing-PartBound') IF(RayPartBound.EQ.0) RETURN +IF(RayPartBound.LT.0) CALL CollectiveStop(__STAMP__,'RayTracing-PartBound must be > 0!') ! Get ray parameters Ray%PulseDuration = GETREAL('RayTracing-PulseDuration') @@ -99,12 +91,25 @@ SUBROUTINE InitRayTracing() Ray%RepetitionRate = GETREAL('RayTracing-RepetitionRate') Ray%Power = GETREAL('RayTracing-Power') +ASSOCIATE( & + E0 => Ray%Energy ,& + wb => Ray%WaistRadius ,& + tau => Ray%PulseDuration ,& + I0 => Ray%IntensityAmplitude ,& + A => Ray%Area ) + ! Derived quantities + E0 = Ray%Power / Ray%RepetitionRate + ! Rectangle + A = (GEO%xmaxglob-GEO%xminglob) * (GEO%ymaxglob-GEO%xminglob) + I0 = E0 / (SQRT(PI)*tau*A) +END ASSOCIATE + ALLOCATE(RayElemPassedEnergy(1:nGlobalElems)) RayElemPassedEnergy=0.0 AdaptiveRays = GETLOGICAL('RayTracing-AdaptiveRays') NumRays = GETINT('RayTracing-NumRays') -RayPosModel = GETINT('RayTracing-RayDirection') +RayPosModel = GETINT('RayTracing-RayPosModel') RayDirection = GETREALARRAY('RayTracing-RayDirection',3) #if USE_MPI diff --git a/src/radiation/ray_tracing/raytrace_main.f90 b/src/radiation/ray_tracing/raytrace_main.f90 index b983bf094..a0e7ccb8f 100644 --- a/src/radiation/ray_tracing/raytrace_main.f90 +++ b/src/radiation/ray_tracing/raytrace_main.f90 @@ -41,20 +41,24 @@ SUBROUTINE RayTracing() !=================================================================================================================================== ! MODULES USE MOD_Globals -USE MOD_Mesh_Vars ,ONLY : nElems -USE MOD_Particle_Mesh_Vars ,ONLY : GEO, nComputeNodeElems, ElemMidPoint_Shared, ElemVolume_Shared -USE MOD_RadiationTrans_Vars ,ONLY : Radiation_Emission_Spec_Total, RadTrans, RadEmiAdaptPhotonNum, RadTransObsVolumeFrac -USE MOD_RadiationTrans_Vars ,ONLY : PhotonProps, RadiationDirectionModel, RadTransPhotPerCellLoc, RadObservationPoint -USE MOD_RadiationTrans_Vars ,ONLY : RadTransPhotPerCell, RadTransPhotPerCell_Shared_Win, RadiationPhotonWaveLengthModel -USE MOD_RadiationTrans_Vars ,ONLY : RadObservationPointMethod -USE MOD_Photon_Tracking ,ONLY : PhotonTriaTracking, Photon2DSymTracking -USE MOD_Radiation_Vars ,ONLY : RadiationSwitches -USE MOD_DSMC_Vars ,ONLY : RadialWeighting -USE MOD_Mesh_Tools ,ONLY: GetGlobalElemID -USE MOD_Output ,ONLY: PrintStatusLineRadiation +!USE MOD_Mesh_Vars ,ONLY: nElems +!USE MOD_Particle_Mesh_Vars ,ONLY: GEO, nComputeNodeElems, ElemMidPoint_Shared, ElemVolume_Shared +!USE MOD_RadiationTrans_Vars ,ONLY : Radiation_Emission_Spec_Total, RadTrans, RadEmiAdaptPhotonNum, RadTransObsVolumeFrac ! USE MOD_RadiationTrans_Vars ,ONLY : Radiation_Emission_Spec_Total, RadTrans, RadEmiAdaptPhotonNum, RadTransObsVolumeFrac +USE MOD_RayTracing_Vars ,ONLY: PhotonProps,RayPartBound,NumRays +!USE MOD_RadiationTrans_Vars ,ONLY : RadTransPhotPerCell, RadTransPhotPerCell_Shared_Win, RadiationPhotonWaveLengthModel ! USE MOD_RadiationTrans_Vars ,ONLY : RadTransPhotPerCell, RadTransPhotPerCell_Shared_Win, RadiationPhotonWaveLengthModel +!USE MOD_RadiationTrans_Vars ,ONLY : RadObservationPointMethod ! USE MOD_RadiationTrans_Vars ,ONLY : RadObservationPointMethod +USE MOD_Photon_Tracking ,ONLY: PhotonTriaTracking +!USE MOD_Radiation_Vars ,ONLY: RadiationSwitches +!USE MOD_DSMC_Vars ,ONLY: RadialWeighting +USE MOD_Mesh_Tools ,ONLY: GetGlobalElemID +USE MOD_Output ,ONLY: PrintStatusLineRadiation USE MOD_MPI_Shared_Vars USE MOD_MPI_Shared -USE MOD_Particle_Vars ,ONLY: Symmetry +!USE MOD_Particle_Vars ,ONLY: Symmetry +USE MOD_Mesh_Tools ,ONLY: GetCNElemID +USE MOD_part_emission_tools ,ONLY: InsideQuadrilateral +USE MOD_Particle_Boundary_Vars ,ONLY: nComputeNodeSurfSides,PartBound,SurfSide2GlobalSide +USE MOD_Particle_Mesh_Vars ,ONLY: SideInfo_Shared ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -63,24 +67,34 @@ SUBROUTINE RayTracing() ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -INTEGER :: iElem, nPhotons, iRay, nPhotonsCN, photonCount, iPhotLoc, RayVisCount, LocRayNum, RayDisp -INTEGER :: firstElem, lastElem, firstPhoton, lastPhoton -REAL :: Bounds(1:2,1:3) ! Bounds(1,1:3) --> maxCoords , Bounds(2,1:3) --> minCoords -REAL :: RandRot(3,3) !, PartPos(1:3) +INTEGER :: NonUniqueGlobalSideID,iSurfSide,iBC +INTEGER :: CNElemID, iRay, photonCount, iPhot, iPhotLoc, RayVisCount, LocRayNum, RayDisp +!INTEGER :: firstElem, lastElem, firstPhoton, lastPhoton +!REAL :: Bounds(1:2,1:3) ! Bounds(1,1:3) --> maxCoords , Bounds(2,1:3) --> minCoords +!REAL :: RandRot(3,3) !, PartPos(1:3) +LOGICAL :: found !=================================================================================================================================== SWRITE(UNIT_stdOut,'(A)') ' Start Ray Tracing Calculation ...' - - photonCount = 0 RayVisCount = 0 -IF(nProcs.GT.NumRays) CALL abort(__STAMP__,'Use more rays!') -LocRayNum = NumRays/nProcs -IF(myrank.LT.MOD(NumRays,nProcs)) LocRayNum = LocRayNum + 1 +IF(nProcessors.GT.NumRays) CALL abort(__STAMP__,'Use more rays! Number of processes > Number of rays') +LocRayNum = NumRays/nProcessors +IF(myrank.LT.MOD(NumRays,nProcessors)) LocRayNum = LocRayNum + 1 +! Output to screen every 20 rays to show that the tool is still running RayDisp = INT(LocRayNum/20) +PhotonProps%PhotonPos(1:3) = (/0.5,0.01,0.99/) +found = InsideQuadrilateral(PhotonProps%PhotonPos(1:2),1) +WRITE (*,*) "PhotonProps%PhotonPos(1:3),found =", PhotonProps%PhotonPos(1:3),found + + + + +write(*,*) "DONE" +IF(myrank.eq.0) read*; CALL MPI_BARRIER(MPI_COMM_WORLD,iError) DO iRay = 1, LocRayNum IF(MPIroot.AND.(MOD(RayVisCount,RayDisp).EQ.0)) CALL PrintStatusLineRadiation(REAL(RayVisCount),REAL(1),REAL(LocRayNum),.TRUE.) @@ -89,40 +103,57 @@ SUBROUTINE RayTracing() PhotonProps%PhotonLastPos(1:3) = PhotonProps%PhotonPos(1:3) ! Loop over all sides of a specific iPartBoundary and find the side where the ray enters the domain - ! Loop nBCSides ! count number of nSides connected to iPartBoundary BCSideID - nElem (local) - 1:nBCSides - SideID -> elemID -> glboalElemID->NonUniqueGlobalSideID - NonUniqueGlobalSideID - SideInfo_Shared(SIDE_BCID,NonUniqueGlobalSideID) - - PhotonProps%ElemID = GetGlobalElemID(iElem) - IF ((photonCount.LT.firstPhoton)) THEN - iPhotLoc = firstPhoton - photonCount + iPhot - 1 - ELSE + PhotonProps%ElemID = -1 ! Initialize + + SurfLoop: DO iSurfSide = 1,nComputeNodeSurfSides + NonUniqueGlobalSideID = SurfSide2GlobalSide(SURF_SIDEID,iSurfSide) + ! Check if the surface side has a neighbor (and is therefore an inner BCs) + IF(SideInfo_Shared(SIDE_NBSIDEID,NonUniqueGlobalSideID).LE.0) THEN ! BC side + ! Get field BC index of side and compare with BC index of the corresponding particle boundary index of the emission side + iBC = SideInfo_Shared(SIDE_BCID,NonUniqueGlobalSideID) ! Get field BC index from non-unique global side index + IF(iBC.NE.PartBound%MapToFieldBC(RayPartBound)) CYCLE SurfLoop ! Correct BC not found, check next side + ! Check if ray starting position is within the quadrilateral that is spanned by the four corner nodes of the side + IF(InsideQuadrilateral(PhotonProps%PhotonPos(1:2),NonUniqueGlobalSideID))THEN + ! Found CN element index + CNElemID = GetCNElemID(SideInfo_Shared(SIDE_ELEMID,NonUniqueGlobalSideID)) + ! Set global element index for current ray + PhotonProps%ElemID = GetGlobalElemID(CNElemID) + EXIT SurfLoop + END IF ! InsideQuadrilateral(X,NonUniqueGlobalSideID) + END IF ! SideInfo_Shared(SIDE_NBSIDEID,NonUniqueGlobalSideID).LE.0 + END DO SurfLoop! iSurfSide = 1,nComputeNodeSurfSides + + ! Sanity check + IF(PhotonProps%ElemID.LE.0) CALL abort(__STAMP__,'Ray starting element not found!') + + + + !IF ((photonCount.LT.firstPhoton)) THEN + !iPhotLoc = firstPhoton - photonCount + iPhot - 1 + !ELSE iPhotLoc = iPhot - END IF - PhotonProps%PhotonDirection(1:3) = SetPhotonStartDirection(iElem, iPhotLoc, RandRot) - IF ((RadObservationPointMethod.EQ.2).AND.RadObservationPoint%CalcFullSpectra) THEN + !END IF + PhotonProps%PhotonDirection(1:3) = (/0,0,-1/)! SetPhotonStartDirection(iCNElem, iPhotLoc, RandRot) + !IF ((RadObservationPointMethod.EQ.2).AND.RadObservationPoint%CalcFullSpectra) THEN PhotonProps%WaveLength = iPhotLoc - ELSE - IF (RadiationPhotonWaveLengthModel.EQ.1) THEN - PhotonProps%WaveLength = SetParticleWavelengthAR(iElem) - ELSE - PhotonProps%WaveLength = SetParticleWavelengthBiSec(iElem) - END IF - END IF - PhotonProps%PhotonEnergy = SetPhotonEnergy(iElem,PhotonProps%PhotonPos(1:3), PhotonProps%WaveLength) + !ELSE + !IF (RadiationPhotonWaveLengthModel.EQ.1) THEN + !PhotonProps%WaveLength = SetParticleWavelengthAR(iCNElem) + !ELSE + !PhotonProps%WaveLength = SetParticleWavelengthBiSec(iCNElem) + !END IF + !END IF + PhotonProps%PhotonEnergy = SetPhotonEnergy(CNElemID,PhotonProps%PhotonPos(1:3), PhotonProps%WaveLength) CALL PhotonTriaTracking() END DO -photonCount = photonCount + RadTransPhotPerCell(iELem) +!photonCount = photonCount + RadTransPhotPerCell(iELem) END SUBROUTINE RayTracing -FUNCTION SetPhotonEnergy(iElem, Point, iWave) +FUNCTION SetPhotonEnergy(iCNElem, Point, iWave) !=================================================================================================================================== !> Calculation of the vibrational temperature (zero-point search) for the TSHO (Truncated Simple Harmonic Oscillator) !=================================================================================================================================== @@ -137,7 +168,7 @@ FUNCTION SetPhotonEnergy(iElem, Point, iWave) IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES -INTEGER, INTENT(IN) :: iElem +INTEGER, INTENT(IN) :: iCNElem REAL, INTENT(IN) :: Point(3) INTEGER, INTENT(IN), OPTIONAL :: iWave !----------------------------------------------------------------------------------------------------------------------------------- @@ -149,9 +180,9 @@ FUNCTION SetPhotonEnergy(iElem, Point, iWave) REAL :: cosTheta, Dist(3), DistNorm(3), spaceangle, absdistnorm !=================================================================================================================================== IF (RadEmiAdaptPhotonNum) THEN - SetPhotonEnergy = Radiation_Emission_Spec_Total(iElem)*ElemVolume_Shared(iElem)*RadTransObsVolumeFrac(iElem) / RadTransPhotPerCell(iElem) + SetPhotonEnergy = Radiation_Emission_Spec_Total(iCNElem)*ElemVolume_Shared(iCNElem)*RadTransObsVolumeFrac(iCNElem) / RadTransPhotPerCell(iCNElem) ELSE - SetPhotonEnergy = Radiation_Emission_Spec_Total(iElem)*ElemVolume_Shared(iElem)*RadTransObsVolumeFrac(iElem) / (RadTrans%NumPhotonsPerCell) + SetPhotonEnergy = Radiation_Emission_Spec_Total(iCNElem)*ElemVolume_Shared(iCNElem)*RadTransObsVolumeFrac(iCNElem) / (RadTrans%NumPhotonsPerCell) END IF IF (RadObservationPointMethod.EQ.1) THEN @@ -169,29 +200,22 @@ FUNCTION SetPhotonEnergy(iElem, Point, iWave) SetPhotonEnergy = SetPhotonEnergy * spaceangle/(4.*Pi) ELSEIF (RadObservationPointMethod.EQ.2) THEN IF (RadObservationPoint%CalcFullSpectra) THEN - SetPhotonEnergy = Radiation_Emission_Spec(iWave, iElem) * RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor & - *ElemVolume_Shared(iElem)*RadTransObsVolumeFrac(iElem) + SetPhotonEnergy = Radiation_Emission_Spec(iWave, iCNElem) * RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor & + *ElemVolume_Shared(iCNElem)*RadTransObsVolumeFrac(iCNElem) ELSE SetPhotonEnergy = SetPhotonEnergy /(4.*Pi) END IF - SetPhotonEnergy = SetPhotonEnergy / (ElemVolume_Shared(iElem)*RadTransObsVolumeFrac(iElem))*RadObservationPOI(7, iElem) + SetPhotonEnergy = SetPhotonEnergy / (ElemVolume_Shared(iCNElem)*RadTransObsVolumeFrac(iCNElem))*RadObservationPOI(7, iCNElem) END IF END FUNCTION SetPhotonEnergy + FUNCTION SetRayPos() !=================================================================================================================================== !> Calculation of the vibrational temperature (zero-point search) for the TSHO (Truncated Simple Harmonic Oscillator) !=================================================================================================================================== ! MODULES -USE MOD_Globals -USE MOD_RadiationTrans_Vars ,ONLY: RadiationPhotonPosModel, RadObservationPointMethod, RadObservationPOI -USE MOD_Particle_Mesh_Tools ,ONLY: ParticleInsideQuad3D -USE MOD_RadiationTrans_Init ,ONLY: HALTON -!USE MOD_PARTICLE_Vars, ONLY : Symmetry2DAxisymmetric ! USE MOD_PARTICLE_Vars, ONLY : Symmetry2DAxisymmetric -USE MOD_Particle_Mesh_Vars ,ONLY: BoundsOfElem_Shared -USE MOD_Mesh_Tools ,ONLY: GetGlobalElemID -USE MOD_Photon_TrackingTools ,ONLY: PointInObsCone USE MOD_Particle_Mesh_Vars ,ONLY: GEO ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -199,21 +223,18 @@ FUNCTION SetRayPos() ! INPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES -REAL :: SetPhotonPos(3) +REAL :: SetRayPos(3) !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -REAL :: Particle_pos(3),radius -INTEGER :: i -LOGICAL :: ARM_Gauss -REAL :: RandVal(2),RandVal1 +REAL :: RandVal(2) !=================================================================================================================================== CALL RANDOM_NUMBER(RandVal) -SetPhotonPos = (/RandVal(1)*(GEO%xmaxglob-GEO%xminglob)+GEO%xminglob,& - RandVal(2)*(GEO%ymaxglob-GEO%yminglob)+GEO%yminglob,& - GEO%zmaxglob/) +SetRayPos = (/RandVal(1)*(GEO%xmaxglob-GEO%xminglob)+GEO%xminglob,& + RandVal(2)*(GEO%ymaxglob-GEO%yminglob)+GEO%yminglob,& + GEO%zmaxglob/) END FUNCTION SetRayPos -FUNCTION SetPhotonStartDirection(iElem, iPhot, RandRot) +FUNCTION SetPhotonStartDirection(iCNElem, iPhot, RandRot) !=================================================================================================================================== ! modified particle emmission for LD case !=================================================================================================================================== @@ -226,7 +247,7 @@ FUNCTION SetPhotonStartDirection(iElem, iPhot, RandRot) IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES -INTEGER, INTENT(IN) :: iElem, iPhot +INTEGER, INTENT(IN) :: iCNElem, iPhot REAL, INTENT(IN) :: RandRot(3,3) !----------------------------------------------------------------------------------------------------------------------------------- ! INOUTPUT VARIABLES @@ -242,7 +263,7 @@ FUNCTION SetPhotonStartDirection(iElem, iPhot, RandRot) CASE(1) RadMod = RadiationDirectionModel CASE(2) - IF (RadTransPhotPerCell(iElem).EQ.1) THEN + IF (RadTransPhotPerCell(iCNElem).EQ.1) THEN RadMod = 1 ELSE RadMod = RadiationDirectionModel @@ -280,9 +301,9 @@ FUNCTION SetPhotonStartDirection(iElem, iPhot, RandRot) SetPhotonStartDirection(2) = COS(RandomDirection(2))*SQRT(1.-RandomDirection(1)**2.) SetPhotonStartDirection(3) = RandomDirection(1) CASE(2) - SpiralStep = 0.1+1.2*REAL(RadTransPhotPerCell(iElem)) - start = (-1. + 1./(REAL(RadTransPhotPerCell(iElem))-1.)) - incr = (2.-2./(REAL(RadTransPhotPerCell(iElem))-1.))/(REAL(RadTransPhotPerCell(iElem))-1.) + SpiralStep = 0.1+1.2*REAL(RadTransPhotPerCell(iCNElem)) + start = (-1. + 1./(REAL(RadTransPhotPerCell(iCNElem))-1.)) + incr = (2.-2./(REAL(RadTransPhotPerCell(iCNElem))-1.))/(REAL(RadTransPhotPerCell(iCNElem))-1.) SpiralPos = start + (REAL(iPhot)-1.) *incr X_new = SpiralPos * SpiralStep Y_new = Pi/2.*SIGN(1.,SpiralPos)*(1.-SQRT(1.-ABS(SpiralPos))) @@ -327,7 +348,7 @@ FUNCTION RandomRotMatrix() END FUNCTION RandomRotMatrix -FUNCTION SetParticleWavelengthAR(iElem) +FUNCTION SetParticleWavelengthAR(iCNElem) !=================================================================================================================================== ! modified particle emmission for LD case !=================================================================================================================================== @@ -340,7 +361,7 @@ FUNCTION SetParticleWavelengthAR(iElem) IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES -INTEGER, INTENT(IN) :: iElem +INTEGER, INTENT(IN) :: iCNElem !----------------------------------------------------------------------------------------------------------------------------------- ! INOUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- @@ -348,7 +369,7 @@ FUNCTION SetParticleWavelengthAR(iElem) INTEGER :: SetParticleWavelengthAR !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -INTEGER :: iWaveLength, iWave +INTEGER :: iWaveLength REAL :: iRan, iRadPower !=================================================================================================================================== @@ -356,27 +377,27 @@ FUNCTION SetParticleWavelengthAR(iElem) iWaveLength = INT(RadiationParameter%WaveLenDiscrCoarse*iRan) + 1 IF ((RadiationParameter%WaveLenReductionFactor.GT.1).AND.(iWaveLength.EQ.RadiationParameter%WaveLenDiscrCoarse)) THEN IF (MOD(RadiationParameter%WaveLenDiscr,RadiationParameter%WaveLenDiscrCoarse).NE.0) THEN - iRadPower = 4.*Pi*Radiation_Emission_Spec(RadiationParameter%WaveLenDiscrCoarse, iElem) * RadiationParameter%WaveLenIncr & + iRadPower = 4.*Pi*Radiation_Emission_Spec(RadiationParameter%WaveLenDiscrCoarse, iCNElem) * RadiationParameter%WaveLenIncr & * (1.+RadiationParameter%WaveLenReductionFactor) ELSE - iRadPower = 4.*Pi*Radiation_Emission_Spec(iWaveLength,iElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor + iRadPower = 4.*Pi*Radiation_Emission_Spec(iWaveLength,iCNElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor END IF ELSE - iRadPower = 4.*Pi*Radiation_Emission_Spec(iWaveLength,iElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor + iRadPower = 4.*Pi*Radiation_Emission_Spec(iWaveLength,iCNElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor END IF CALL RANDOM_NUMBER(iRan) - DO WHILE (iRan.GT.(iRadPower/Radiation_Emission_Spec_Max(iElem))) + DO WHILE (iRan.GT.(iRadPower/Radiation_Emission_Spec_Max(iCNElem))) CALL RANDOM_NUMBER(iRan) iWaveLength = INT(RadiationParameter%WaveLenDiscrCoarse*iRan) + 1 IF ((RadiationParameter%WaveLenReductionFactor.GT.1).AND.(iWaveLength.EQ.RadiationParameter%WaveLenDiscrCoarse)) THEN IF (MOD(RadiationParameter%WaveLenDiscr,RadiationParameter%WaveLenDiscrCoarse).NE.0) THEN - iRadPower = 4.*Pi*Radiation_Emission_Spec(RadiationParameter%WaveLenDiscrCoarse, iElem) * RadiationParameter%WaveLenIncr & + iRadPower = 4.*Pi*Radiation_Emission_Spec(RadiationParameter%WaveLenDiscrCoarse, iCNElem) * RadiationParameter%WaveLenIncr & * (1.+RadiationParameter%WaveLenReductionFactor) ELSE - iRadPower = 4.*Pi*Radiation_Emission_Spec(iWaveLength,iElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor + iRadPower = 4.*Pi*Radiation_Emission_Spec(iWaveLength,iCNElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor END IF ELSE - iRadPower = 4.*Pi*Radiation_Emission_Spec(iWaveLength,iElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor + iRadPower = 4.*Pi*Radiation_Emission_Spec(iWaveLength,iCNElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor END IF CALL RANDOM_NUMBER(iRan) END DO @@ -385,7 +406,7 @@ FUNCTION SetParticleWavelengthAR(iElem) END FUNCTION SetParticleWavelengthAR -FUNCTION SetParticleWavelengthBiSec(iElem) +FUNCTION SetParticleWavelengthBiSec(iCNElem) !=================================================================================================================================== ! modified particle emmission for LD case !=================================================================================================================================== @@ -398,7 +419,7 @@ FUNCTION SetParticleWavelengthBiSec(iElem) IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES -INTEGER, INTENT(IN) :: iElem +INTEGER, INTENT(IN) :: iCNElem !----------------------------------------------------------------------------------------------------------------------------------- ! INOUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- @@ -416,16 +437,16 @@ FUNCTION SetParticleWavelengthBiSec(iElem) iWaveMin = 1 iWaveMax = RadiationParameter%WaveLenDiscrCoarse IF (iWaveLength.EQ.RadiationParameter%WaveLenDiscrCoarse) THEN - iRadPower = Radiation_Emission_Spec_Total(iElem) + iRadPower = Radiation_Emission_Spec_Total(iCNElem) ELSE iRadPower = 0.0 DO iWave = 1, iWaveLength - iRadPower = iRadPower + 4.*Pi*Radiation_Emission_Spec(iWave,iElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor + iRadPower = iRadPower + 4.*Pi*Radiation_Emission_Spec(iWave,iCNElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor END DO END IF DO - IF (iRan.GT.(iRadPower/Radiation_Emission_Spec_Total(iElem)))THEN + IF (iRan.GT.(iRadPower/Radiation_Emission_Spec_Total(iCNElem)))THEN iWaveMin = iWaveLength ELSE iWaveMax = iWaveLength @@ -433,11 +454,11 @@ FUNCTION SetParticleWavelengthBiSec(iElem) iWaveOld = iWaveLength iWaveLength = INT((iWaveMax+iWaveMin)/2) IF (iWaveLength.EQ.RadiationParameter%WaveLenDiscrCoarse) THEN - iRadPower = Radiation_Emission_Spec_Total(iElem) + iRadPower = Radiation_Emission_Spec_Total(iCNElem) ELSE iRadPower = 0.0 DO iWave = 1, iWaveLength - iRadPower = iRadPower + 4.*Pi*Radiation_Emission_Spec(iWave,iElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor + iRadPower = iRadPower + 4.*Pi*Radiation_Emission_Spec(iWave,iCNElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor END DO END IF IF (ABS(iWaveOld-iWaveLength).LE.1) EXIT @@ -445,16 +466,16 @@ FUNCTION SetParticleWavelengthBiSec(iElem) END DO iWaveOld = iWaveLength - IF (iRan.LT.(iRadPower/Radiation_Emission_Spec_Total(iElem))) THEN + IF (iRan.LT.(iRadPower/Radiation_Emission_Spec_Total(iCNElem))) THEN IF (iWaveLength.EQ.1) THEN iWaveLength = iWaveLength ELSE iWaveLength = iWaveLength - 1 iRadPower2 = 0.0 DO iWave = 1, iWaveLength - iRadPower2 = iRadPower2 + 4.*Pi*Radiation_Emission_Spec(iWave,iElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor + iRadPower2 = iRadPower2 + 4.*Pi*Radiation_Emission_Spec(iWave,iCNElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor END DO - IF (ABS(iRan-(iRadPower/Radiation_Emission_Spec_Total(iElem))).LT.ABS(iRan-(iRadPower2/Radiation_Emission_Spec_Total(iElem)))) THEN + IF (ABS(iRan-(iRadPower/Radiation_Emission_Spec_Total(iCNElem))).LT.ABS(iRan-(iRadPower2/Radiation_Emission_Spec_Total(iCNElem)))) THEN iWaveLength = iWaveOld END IF END IF @@ -462,9 +483,9 @@ FUNCTION SetParticleWavelengthBiSec(iElem) iWaveLength = iWaveLength + 1 iRadPower2 = 0.0 DO iWave = 1, iWaveLength - iRadPower2 = iRadPower2 + 4.*Pi*Radiation_Emission_Spec(iWave,iElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor + iRadPower2 = iRadPower2 + 4.*Pi*Radiation_Emission_Spec(iWave,iCNElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor END DO - IF (ABS(iRan-(iRadPower/Radiation_Emission_Spec_Total(iElem))).LT.ABS(iRan-(iRadPower2/Radiation_Emission_Spec_Total(iElem)))) THEN + IF (ABS(iRan-(iRadPower/Radiation_Emission_Spec_Total(iCNElem))).LT.ABS(iRan-(iRadPower2/Radiation_Emission_Spec_Total(iCNElem)))) THEN iWaveLength = iWaveOld END IF END IF diff --git a/src/radiation/ray_tracing/raytrace_vars.f90 b/src/radiation/ray_tracing/raytrace_vars.f90 index 8b1241222..d0d818cac 100644 --- a/src/radiation/ray_tracing/raytrace_vars.f90 +++ b/src/radiation/ray_tracing/raytrace_vars.f90 @@ -22,50 +22,54 @@ MODULE MOD_RayTracing_Vars PUBLIC SAVE !----------------------------------------------------------------------------------------------------------------------------------- -! GLOBAL VARIABLES +! GLOBAL RAY TRACING VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- TYPE tRayTrace - REAL :: PulseDuration - REAL :: WaistRadius - REAL :: WaveLength - REAL :: RepetitionRate - REAL :: Power + REAL :: PulseDuration !> + REAL :: WaistRadius !> + REAL :: WaveLength !> + REAL :: RepetitionRate !> + REAL :: Power !> + REAL :: Area !> + REAL :: Energy !> + REAL :: IntensityAmplitude !> END TYPE -TYPE (tRayTrace) :: Ray +TYPE (tRayTrace) :: Ray !> TYPE tRadTrans - INTEGER :: NumPhotonsPerCell - REAL :: GlobalRadiationPower - REAL :: ScaledGlobalRadiationPower - INTEGER :: GlobalPhotonNum + INTEGER :: NumPhotonsPerCell !> + REAL :: GlobalRadiationPower !> + REAL :: ScaledGlobalRadiationPower !> + INTEGER :: GlobalPhotonNum !> END TYPE -TYPE (tRadTrans) :: RadTrans +TYPE (tRadTrans) :: RadTrans !> TYPE tPhotonProps - REAL :: PhotonPos(3) - REAL :: PhotonLastPos(3) - REAL :: PhotonDirection(3) - REAL :: PhotonEnergy - INTEGER :: ElemID - INTEGER :: WaveLength + REAL :: PhotonPos(3) !> + REAL :: PhotonLastPos(3) !> + REAL :: PhotonDirection(3) !> + REAL :: PhotonEnergy !> + INTEGER :: ElemID !> + INTEGER :: WaveLength !> END TYPE -TYPE (tPhotonProps) :: PhotonProps +TYPE (tPhotonProps) :: PhotonProps !> -LOGICAL :: AdaptiveRays -INTEGER :: NumRays -INTEGER :: RayPosModel -REAL :: RayDirection(3) +LOGICAL :: AdaptiveRays !> +INTEGER :: NumRays !> +INTEGER :: RayPosModel !> +INTEGER :: RayPartBound !> Particle boundary ID where rays are emitted from +REAL :: RayDirection(3) !> -REAL, ALLOCATABLE :: RayElemPassedEnergy(:) -REAL, ALLOCATABLE :: RaySampWall(:,:) +REAL, ALLOCATABLE :: RayElemPassedEnergy(:) !> +REAL, ALLOCATABLE :: RaySampWall(:,:) !> #if USE_MPI -INTEGER :: RaySampWall_Shared_Win -REAL,POINTER :: RaySampWall_Shared(:,:) -INTEGER :: RayElemPassedEnergy_Shared_Win -REAL,POINTER :: RayElemPassedEnergy_Shared(:) +INTEGER :: RaySampWall_Shared_Win !> +REAL,POINTER :: RaySampWall_Shared(:,:) !> +INTEGER :: RayElemPassedEnergy_Shared_Win !> +REAL,POINTER :: RayElemPassedEnergy_Shared(:) !> #endif !=================================================================================================================================== END MODULE MOD_RayTracing_Vars From 7f77aa8fa79015db7aa23aa94dbc90102dc32d20 Mon Sep 17 00:00:00 2001 From: Franziska Hild Date: Thu, 27 Apr 2023 16:47:39 +0200 Subject: [PATCH 070/495] BGK sampling - correction of matrix A off-diagonals for new relaxation model --- src/particles/bgk/bgk_colloperator.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/particles/bgk/bgk_colloperator.f90 b/src/particles/bgk/bgk_colloperator.f90 index 525365aee..0d84d2b2b 100644 --- a/src/particles/bgk/bgk_colloperator.f90 +++ b/src/particles/bgk/bgk_colloperator.f90 @@ -1243,8 +1243,8 @@ SUBROUTINE SampleFromTargetDistr(nRelax, iPartIndx_NodeRelax, Prandtl, u2, u0ij, KronDelta = 0.0 END IF ! Fill anisotopic matrix A - A(fillMa1, fillMa2) = KronDelta*CellTempRel*BoltzmannConst/MassIC_Mixture - (1.-Prandtl)/Prandtl*(u0ij(fillMa1, fillMa2) & - - KronDelta*CellTemp*BoltzmannConst/MassIC_Mixture) + A(fillMa1, fillMa2) = KronDelta*CellTempRel*BoltzmannConst/MassIC_Mixture - (1.-Prandtl)/Prandtl * & + (CellTempRel/CellTemp*u0ij(fillMa1, fillMa2) - KronDelta*CellTempRel*BoltzmannConst/MassIC_Mixture) END DO END DO IF (ESBGKModel.EQ.2) THEN From ea41ba32b8ad76fa7cd6f6bd6ce9ce58f9a67d14 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Fri, 5 May 2023 19:29:23 +0200 Subject: [PATCH 071/495] Ray tracing emission of rays on particle boundaries. Only tested single core with LIBS_USE_MPI=OFF. --- .../parameter.ini | 6 ++- src/io_hdf5/hdf5_output_particle.f90 | 7 ++- .../boundary/particle_boundary_tools.f90 | 9 +++- .../emission/particle_emission_tools.f90 | 22 ++++---- src/radiation/ray_tracing/raytrace_ini.f90 | 42 ++++++++++++--- src/radiation/ray_tracing/raytrace_main.f90 | 53 +++++++++++++++---- src/radiation/ray_tracing/raytrace_vars.f90 | 20 ++++--- src/timedisc/timedisc.f90 | 6 +++ 8 files changed, 126 insertions(+), 39 deletions(-) diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/parameter.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/parameter.ini index 24d729ca6..6d31c9132 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/parameter.ini +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/parameter.ini @@ -86,11 +86,11 @@ Part-Boundary4-Condition = periodic Part-Boundary5-SourceName = BC_WALL Part-Boundary5-Condition = reflective -Part-Boundary5-BoundaryParticleOutput = T +!Part-Boundary5-BoundaryParticleOutput = T Part-Boundary6-SourceName = BC_TOP Part-Boundary6-Condition = reflective -Part-Boundary6-BoundaryParticleOutput = T +!Part-Boundary6-BoundaryParticleOutput = T Part-nPeriodicVectors = 2 Part-FIBGMdeltas = (/ 1.0 , 1.0 , 1.0 /) @@ -99,7 +99,9 @@ Part-FactorFIBGM = (/ 5 , 5 , 5 /) ! =============================================================================== ! ! Ray Tracing ! =============================================================================== ! +Particles-DSMC-CalcSurfaceVal = T ! activate InitParticleBoundarySampling RayTracing-PartBound = 6 ! -> iBC=6 +RayTracing-NumRays = 1000 RayTracing-PulseDuration = 15e-9 RayTracing-WaveLength = 10e-9 diff --git a/src/io_hdf5/hdf5_output_particle.f90 b/src/io_hdf5/hdf5_output_particle.f90 index 571b6d591..5318aebea 100644 --- a/src/io_hdf5/hdf5_output_particle.f90 +++ b/src/io_hdf5/hdf5_output_particle.f90 @@ -687,7 +687,12 @@ SUBROUTINE WriteBoundaryParticleToHDF5(MeshFileName,OutputTime,PreviousTime) ! Take ABS() from SpecID as is might be negative (for storing particles that are emitted from a surface) SpecID = INT(ABS(PartStateBoundary(7,pcount))) IF(SpecID.EQ.0) CALL abort(__STAMP__,'Error in WriteBoundaryParticleToHDF5: SpecID = PartStateBoundary(7,pcount) = 0') - PartData(8,iPart)=CalcEkinPart2(PartStateBoundary(4:6,pcount),SpecID,1.0) / ElementaryCharge + ! Check if photon is emitted during ray tracing + IF(SpecID.EQ.999)THEN + PartData(8,iPart)=0 ! insert photon energy here + ELSE + PartData(8,iPart)=CalcEkinPart2(PartStateBoundary(4:6,pcount),SpecID,1.0) / ElementaryCharge + END IF ! SpecID.EQ.999 ! MPF: Macro particle factor PartData(9,iPart)=PartStateBoundary(8,pcount) diff --git a/src/particles/boundary/particle_boundary_tools.f90 b/src/particles/boundary/particle_boundary_tools.f90 index 660189877..c3d21ddfb 100644 --- a/src/particles/boundary/particle_boundary_tools.f90 +++ b/src/particles/boundary/particle_boundary_tools.f90 @@ -221,7 +221,7 @@ SUBROUTINE SampleImpactProperties(SurfSideID,SpecID,MPF,ETrans,EVib,ERot,EElec,P END SUBROUTINE SampleImpactProperties -SUBROUTINE StoreBoundaryParticleProperties(iPart,SpecID,PartPos,PartTrajectory,SurfaceNormal,iPartBound,mode,MPF_optIN) +SUBROUTINE StoreBoundaryParticleProperties(iPart,SpecID,PartPos,PartTrajectory,SurfaceNormal,iPartBound,mode,MPF_optIN,Velo_optIN) !----------------------------------------------------------------------------------------------------------------------------------! ! Save particle position, velocity and species to PartDataBoundary container for writing to .h5 later !----------------------------------------------------------------------------------------------------------------------------------! @@ -244,6 +244,7 @@ SUBROUTINE StoreBoundaryParticleProperties(iPart,SpecID,PartPos,PartTrajectory,S INTEGER,INTENT(IN) :: mode ! 1: particle impacts on BC (species is stored as positive value) ! 2: particles is emitted from the BC into the simulation domain (species is stored as negative value) REAL,INTENT(IN),OPTIONAL :: MPF_optIN ! Supply the MPF in special cases +REAL,INTENT(IN),OPTIONAL :: Velo_optIN(1:3) ! Supply the velocity in special cases !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES REAL :: MPF @@ -291,7 +292,11 @@ SUBROUTINE StoreBoundaryParticleProperties(iPart,SpecID,PartPos,PartTrajectory,S END IF PartStateBoundary(1:3,iMax) = PartPos - PartStateBoundary(4:6,iMax) = PartState(4:6,iPart) + IF(PRESENT(Velo_optIN))THEN + PartStateBoundary(4:6,iMax) = Velo_optIN + ELSE + PartStateBoundary(4:6,iMax) = PartState(4:6,iPart) + END IF ! PRESENT(Velo_optIN) ! Mode 1: store normal species ID, mode 2: store negative species ID (special analysis of emitted particles in/from volume/surface) IF(mode.EQ.1)THEN PartStateBoundary(7 ,iMax) = REAL(SpecID) diff --git a/src/particles/emission/particle_emission_tools.f90 b/src/particles/emission/particle_emission_tools.f90 index afe74013a..34458cab2 100644 --- a/src/particles/emission/particle_emission_tools.f90 +++ b/src/particles/emission/particle_emission_tools.f90 @@ -2204,17 +2204,17 @@ PPURE LOGICAL FUNCTION InsideQuadrilateral(X,NonUniqueGlobalSideID) RESULT(L) P(1:2,iNode) = NodeCoords_Shared(1:2,ElemSideNodeID_Shared(iNode,locSideID,CNElemID)+1) END DO -! sorted -P(1:2,1) = (/0,0/) -P(1:2,2) = (/1,0/) -P(1:2,3) = (/1,1/) -P(1:2,4) = (/0,1/) - -! not sorted -P(1:2,1) = (/0,0/) -P(1:2,2) = (/1,1/) -P(1:2,3) = (/1,0/) -P(1:2,4) = (/0,1/) +! ! sorted +! P(1:2,1) = (/0,0/) +! P(1:2,2) = (/1,0/) +! P(1:2,3) = (/1,1/) +! P(1:2,4) = (/0,1/) +! +! ! not sorted +! P(1:2,1) = (/0,0/) +! P(1:2,2) = (/1,1/) +! P(1:2,3) = (/1,0/) +! P(1:2,4) = (/0,1/) d(1) = pointDet(X,P(1:2,1),P(1:2,2)) d(2) = pointDet(X,P(1:2,2),P(1:2,3)) diff --git a/src/radiation/ray_tracing/raytrace_ini.f90 b/src/radiation/ray_tracing/raytrace_ini.f90 index 0e280853a..6123e1b3c 100644 --- a/src/radiation/ray_tracing/raytrace_ini.f90 +++ b/src/radiation/ray_tracing/raytrace_ini.f90 @@ -44,6 +44,7 @@ SUBROUTINE DefineParametersRayTracing() CALL prms%CreateIntOption( 'RayTracing-PartBound' , 'Particle boundary ID where rays are emitted from' , '0') CALL prms%CreateRealOption( 'RayTracing-PulseDuration' , 'Pulse duration tau for a Gaussian-type pulse with I~exp(-(t/tau)^2) [s]' ) +CALL prms%CreateIntOption( 'RayTracing-NbrOfPulses' , 'Number of pulses [-]','1') CALL prms%CreateRealOption( 'RayTracing-WaistRadius' , 'Beam waist radius (in focal spot) w_b for Gaussian-type pulse with I~exp(-(r/w_b)^2) [m]' , '0.0') CALL prms%CreateRealOption( 'RayTracing-WaveLength' , 'Beam wavelength [m]' ) CALL prms%CreateRealOption( 'RayTracing-RepetitionRate' , 'Pulse repetition rate (pulses per second) [Hz]' ) @@ -76,6 +77,7 @@ SUBROUTINE InitRayTracing() ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES +REAL :: factor !=================================================================================================================================== SWRITE(UNIT_StdOut,'(132("-"))') SWRITE(UNIT_stdOut,'(A)') ' INIT RAY TRACING SOLVER ...' @@ -86,24 +88,52 @@ SUBROUTINE InitRayTracing() ! Get ray parameters Ray%PulseDuration = GETREAL('RayTracing-PulseDuration') +Ray%NbrOfPulses = GETINT('RayTracing-NbrOfPulses') +Ray%tShift = SQRT(8.0) * Ray%PulseDuration Ray%WaistRadius = GETREAL('RayTracing-WaistRadius') Ray%WaveLength = GETREAL('RayTracing-WaveLength') Ray%RepetitionRate = GETREAL('RayTracing-RepetitionRate') +Ray%Period = 1./Ray%RepetitionRate Ray%Power = GETREAL('RayTracing-Power') ASSOCIATE( & - E0 => Ray%Energy ,& - wb => Ray%WaistRadius ,& - tau => Ray%PulseDuration ,& - I0 => Ray%IntensityAmplitude ,& - A => Ray%Area ) + E0 => Ray%Energy ,& + wb => Ray%WaistRadius ,& + tau => Ray%PulseDuration ,& + I0 => Ray%IntensityAmplitude ,& + tShift => Ray%tShift ,& + Period => Ray%Period ,& + tActive => Ray%tActive ,& + A => Ray%Area ) ! Derived quantities E0 = Ray%Power / Ray%RepetitionRate ! Rectangle - A = (GEO%xmaxglob-GEO%xminglob) * (GEO%ymaxglob-GEO%xminglob) + A = (GEO%xmaxglob-GEO%xminglob) * (GEO%ymaxglob-GEO%yminglob) I0 = E0 / (SQRT(PI)*tau*A) + + ! Correction factor due to temporal cut-off of the Gaussian pulse + ! no need for correction in space because the function is not cut-off in space + ! just consider the temporal cut-off for the rectangle + factor = ERF(tShift/tau) + factor = SQRT(PI)*tau*A + I0 = E0 / factor + + ! Sanity check: overlapping of pulses is not implemented (use multiple emissions for this) + IF(2.0*tShift.GT.Period) CALL abort(__STAMP__,'Pulse length (2*tShift) is greater than the pulse period. This is not implemented!') + + ! Active pulse time + tActive = REAL(Ray%NbrOfPulses - 1)*Period + 2.0*tShift END ASSOCIATE +CALL PrintOption('Rectangular ray emission area: A [m2]' , 'CALCUL.' , RealOpt=Ray%Area) +CALL PrintOption('Single pulse energy [J]' , 'CALCUL.' , RealOpt=Ray%Energy) +CALL PrintOption('Intensity amplitude: I0 [W/m^2]' , 'CALCUL.' , RealOpt=Ray%IntensityAmplitude) +CALL PrintOption('Corrected Intensity amplitude: I0_corr [W/m^2]' , 'CALCUL.' , RealOpt=Ray%IntensityAmplitude) +CALL PrintOption('Pulse period (Time between maximum of two pulses) [s]' , 'CALCUL.' , RealOpt=Ray%Period) +CALL PrintOption('Temporal pulse width (pulse time 2x tShift) [s]' , 'CALCUL.' , RealOpt=2.0*Ray%tShift) +CALL PrintOption('Pulse will end at tActive (pulse final time) [s]' , 'CALCUL.' , RealOpt=Ray%tActive) + + ALLOCATE(RayElemPassedEnergy(1:nGlobalElems)) RayElemPassedEnergy=0.0 diff --git a/src/radiation/ray_tracing/raytrace_main.f90 b/src/radiation/ray_tracing/raytrace_main.f90 index a0e7ccb8f..98921b680 100644 --- a/src/radiation/ray_tracing/raytrace_main.f90 +++ b/src/radiation/ray_tracing/raytrace_main.f90 @@ -59,6 +59,8 @@ SUBROUTINE RayTracing() USE MOD_part_emission_tools ,ONLY: InsideQuadrilateral USE MOD_Particle_Boundary_Vars ,ONLY: nComputeNodeSurfSides,PartBound,SurfSide2GlobalSide USE MOD_Particle_Mesh_Vars ,ONLY: SideInfo_Shared +USE MOD_Particle_Boundary_Tools,ONLY: StoreBoundaryParticleProperties +USE MOD_Particle_Boundary_Vars ,ONLY: PartStateBoundary,nVarPartStateBoundary ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -73,6 +75,8 @@ SUBROUTINE RayTracing() !REAL :: Bounds(1:2,1:3) ! Bounds(1,1:3) --> maxCoords , Bounds(2,1:3) --> minCoords !REAL :: RandRot(3,3) !, PartPos(1:3) LOGICAL :: found +LOGICAL :: FoundComputeNodeSurfSide +INTEGER :: ALLOCSTAT !=================================================================================================================================== SWRITE(UNIT_stdOut,'(A)') ' Start Ray Tracing Calculation ...' @@ -86,15 +90,23 @@ SUBROUTINE RayTracing() RayDisp = INT(LocRayNum/20) -PhotonProps%PhotonPos(1:3) = (/0.5,0.01,0.99/) -found = InsideQuadrilateral(PhotonProps%PhotonPos(1:2),1) -WRITE (*,*) "PhotonProps%PhotonPos(1:3),found =", PhotonProps%PhotonPos(1:3),found +!PhotonProps%PhotonPos(1:3) = (/0.5,0.01,0.99/) +!found = InsideQuadrilateral(PhotonProps%PhotonPos(1:2),1) +!WRITE (*,*) "PhotonProps%PhotonPos(1:3),found =", PhotonProps%PhotonPos(1:3),found +PhotonProps%PhotonDirection(1:3) = (/0.0,0.0,-1.0/)! SetPhotonStartDirection(iCNElem, iPhotLoc, RandRot) -write(*,*) "DONE" -IF(myrank.eq.0) read*; CALL MPI_BARRIER(MPI_COMM_WORLD,iError) +!write(*,*) "DONE" +!IF(myrank.eq.0) read*; CALL MPI_BARRIER(MPI_COMM_WORLD,iError) + + ! This array is not de-allocated during load balance as it is only written to .h5 during WriteStateToHDF5() + IF(.NOT.ALLOCATED(PartStateBoundary))THEN + ALLOCATE(PartStateBoundary(1:nVarPartStateBoundary,1:LocRayNum), STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL abort(__STAMP__,'ERROR in particle_init.f90: Cannot allocate PartStateBoundary array!') + PartStateBoundary=0. + END IF ! .NOT.ALLOCATED(PartStateBoundary) DO iRay = 1, LocRayNum IF(MPIroot.AND.(MOD(RayVisCount,RayDisp).EQ.0)) CALL PrintStatusLineRadiation(REAL(RayVisCount),REAL(1),REAL(LocRayNum),.TRUE.) @@ -107,6 +119,7 @@ SUBROUTINE RayTracing() PhotonProps%ElemID = -1 ! Initialize + FoundComputeNodeSurfSide = .FALSE. SurfLoop: DO iSurfSide = 1,nComputeNodeSurfSides NonUniqueGlobalSideID = SurfSide2GlobalSide(SURF_SIDEID,iSurfSide) ! Check if the surface side has a neighbor (and is therefore an inner BCs) @@ -114,6 +127,7 @@ SUBROUTINE RayTracing() ! Get field BC index of side and compare with BC index of the corresponding particle boundary index of the emission side iBC = SideInfo_Shared(SIDE_BCID,NonUniqueGlobalSideID) ! Get field BC index from non-unique global side index IF(iBC.NE.PartBound%MapToFieldBC(RayPartBound)) CYCLE SurfLoop ! Correct BC not found, check next side + FoundComputeNodeSurfSide = .TRUE. ! Check if ray starting position is within the quadrilateral that is spanned by the four corner nodes of the side IF(InsideQuadrilateral(PhotonProps%PhotonPos(1:2),NonUniqueGlobalSideID))THEN ! Found CN element index @@ -125,8 +139,30 @@ SUBROUTINE RayTracing() END IF ! SideInfo_Shared(SIDE_NBSIDEID,NonUniqueGlobalSideID).LE.0 END DO SurfLoop! iSurfSide = 1,nComputeNodeSurfSides + ! Sanity check: nComputeNodeSurfSides > 0 and the correct PartBCIndex for those sides + IF(.NOT.FoundComputeNodeSurfSide)THEN + IPWRITE(UNIT_StdOut,*) ": nComputeNodeSurfSides =", nComputeNodeSurfSides + IPWRITE(UNIT_StdOut,*) ": RayPartBound =", RayPartBound + !IPWRITE(UNIT_StdOut,'(I0,A,I0,A)') ": Set Part-Boundary",RayPartBound,"-BoundaryParticleOutput = T" + IPWRITE(UNIT_StdOut,*) ": Set Particles-DSMC-CalcSurfaceVal = T" + CALL abort(__STAMP__,'No boundary found in list of nComputeNodeSurfSides for defined RayPartBound!') + END IF ! FoundComputeNodeSurfSide + ! Sanity check - IF(PhotonProps%ElemID.LE.0) CALL abort(__STAMP__,'Ray starting element not found!') + IF(PhotonProps%ElemID.LE.0)THEN + IPWRITE(UNIT_StdOut,*) "PhotonProps%PhotonPos(1:3) =", PhotonProps%PhotonPos(1:3) + CALL abort(__STAMP__,'Ray starting element not found!') + ELSE + ! Output to .h5 for debugging + CALL StoreBoundaryParticleProperties(iRay,& + 999,& + PhotonProps%PhotonPos(1:3),& + UNITVECTOR(PhotonProps%PhotonDirection(1:3)),(/0.0,0.0,1.0/),& + iPartBound=RayPartBound,& + mode=2,& + MPF_optIN=0.0,& + Velo_optIN=PhotonProps%PhotonDirection(1:3)) + END IF !PhotonProps%ElemID.LE.0 @@ -135,7 +171,6 @@ SUBROUTINE RayTracing() !ELSE iPhotLoc = iPhot !END IF - PhotonProps%PhotonDirection(1:3) = (/0,0,-1/)! SetPhotonStartDirection(iCNElem, iPhotLoc, RandRot) !IF ((RadObservationPointMethod.EQ.2).AND.RadObservationPoint%CalcFullSpectra) THEN PhotonProps%WaveLength = iPhotLoc !ELSE @@ -145,8 +180,8 @@ SUBROUTINE RayTracing() !PhotonProps%WaveLength = SetParticleWavelengthBiSec(iCNElem) !END IF !END IF - PhotonProps%PhotonEnergy = SetPhotonEnergy(CNElemID,PhotonProps%PhotonPos(1:3), PhotonProps%WaveLength) - CALL PhotonTriaTracking() + !PhotonProps%PhotonEnergy = SetPhotonEnergy(CNElemID,PhotonProps%PhotonPos(1:3), PhotonProps%WaveLength) + !CALL PhotonTriaTracking() END DO !photonCount = photonCount + RadTransPhotPerCell(iELem) diff --git a/src/radiation/ray_tracing/raytrace_vars.f90 b/src/radiation/ray_tracing/raytrace_vars.f90 index d0d818cac..c1d5f5b7a 100644 --- a/src/radiation/ray_tracing/raytrace_vars.f90 +++ b/src/radiation/ray_tracing/raytrace_vars.f90 @@ -25,14 +25,18 @@ MODULE MOD_RayTracing_Vars ! GLOBAL RAY TRACING VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- TYPE tRayTrace - REAL :: PulseDuration !> - REAL :: WaistRadius !> - REAL :: WaveLength !> - REAL :: RepetitionRate !> - REAL :: Power !> - REAL :: Area !> - REAL :: Energy !> - REAL :: IntensityAmplitude !> + REAL :: PulseDuration !> + REAL :: tShift !> + REAL :: tActive !> + REAL :: Period !> + INTEGER :: NbrOfPulses !> + REAL :: WaistRadius !> + REAL :: WaveLength !> + REAL :: RepetitionRate !> + REAL :: Power !> + REAL :: Area !> + REAL :: Energy !> + REAL :: IntensityAmplitude !> END TYPE TYPE (tRayTrace) :: Ray !> diff --git a/src/timedisc/timedisc.f90 b/src/timedisc/timedisc.f90 index 26455c182..64e556918 100644 --- a/src/timedisc/timedisc.f90 +++ b/src/timedisc/timedisc.f90 @@ -90,6 +90,7 @@ SUBROUTINE TimeDisc() USE MOD_HDF5_Output_Particles ,ONLY: FillParticleData #endif /*PARTICLES*/ #ifdef PARTICLES +USE MOD_RayTracing ,ONLY: RayTracing !USE MOD_PICDepo ,ONLY: Deposition USE MOD_Particle_Vars ,ONLY: DoImportIMDFile #if USE_MPI @@ -199,6 +200,11 @@ SUBROUTINE TimeDisc() ! fill recordpoints buffer (first iteration) !IF(RP_onProc) CALL RecordPoints(iter,t,forceSampling=.TRUE.) +! Ray tracing +#if defined(PARTICLES) +IF(.NOT.DoRestart) CALL RayTracing() +#endif /*defined(PARTICLES)*/ + CALL PrintStatusLine(time,dt,tStart,tEnd,1) #if defined(PARTICLES) && defined(CODE_ANALYZE) From 01365b0f67a28b07b30d01531283c060aa5b2265 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Mon, 15 May 2023 18:46:39 +0200 Subject: [PATCH 072/495] Ray tracing output to PartStateBoundary (currently also all intersection points within the volume, add flag for turning this on/off) and to DSMC surface state to visualize the photon count on each BC. Works single and parallel on one node. --- .../hopr.ini | 33 +- .../parameter.ini | 38 +- src/CMakeLists.txt | 3 +- src/posti/piclas2vtk/piclas2vtk.f90 | 4 +- .../radiative_transfer/radtrans_main.f90 | 31 +- .../radiative_transfer/radtrans_output.f90 | 285 +------------- .../radiative_transfer/radtrans_vars.f90 | 15 - .../tracking/radtrans_tracking.f90 | 41 +- .../tracking/radtrans_tracking_output.f90 | 321 ++++++++++++++++ ..._tools.f90 => radtrans_tracking_tools.f90} | 97 +++-- .../tracking/radtrans_tracking_vars.f90 | 45 +++ .../{raytrace_main.f90 => raytrace.f90} | 351 +++++++++--------- src/radiation/ray_tracing/raytrace_ini.f90 | 46 ++- src/radiation/ray_tracing/raytrace_vars.f90 | 16 +- 14 files changed, 713 insertions(+), 613 deletions(-) create mode 100644 src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 rename src/radiation/radiative_transfer/tracking/{radtrans_tools.f90 => radtrans_tracking_tools.f90} (95%) create mode 100644 src/radiation/radiative_transfer/tracking/radtrans_tracking_vars.f90 rename src/radiation/ray_tracing/{raytrace_main.f90 => raytrace.f90} (69%) diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/hopr.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/hopr.ini index e0433ad89..5704c1882 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/hopr.ini +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/hopr.ini @@ -23,18 +23,37 @@ ConformConnect=T !=============================================================================== ! nUserDefinedBoundaries=6 BoundaryName=BC_periodicx- ! Periodic (+vv1) -BoundaryType=(/1,0,0,1/) ! Periodic (+vv1) +BoundaryType=(/4,0,0,0/) ! Periodic (+vv1) BoundaryName=BC_periodicx+ ! Periodic (-vv1) -BoundaryType=(/1,0,0,-1/) ! Periodic (-vv1) +BoundaryType=(/4,0,0,0/) ! Periodic (-vv1) BoundaryName=BC_periodicy- ! Periodic (+vv2) -BoundaryType=(/1,0,0,2/) ! Periodic (+vv2) +BoundaryType=(/4,0,0,0/) ! Periodic (+vv2) BoundaryName=BC_periodicy+ ! Periodic (-vv2) -BoundaryType=(/1,0,0,-2/) ! Periodic (-vv2) +BoundaryType=(/4,0,0,0/) ! Periodic (-vv2) BoundaryName=BC_WALL BoundaryType=(/4,0,0,0/) BoundaryName=BC_TOP BoundaryType=(/4,0,0,0/) -nVV=2 -VV=(/1.0 , 0. , 0./) -VV=(/0. , 1.0 , 0./) + +! PERIODIC +! !=============================================================================== ! +! ! BOUNDARY CONDITIONS +! !=============================================================================== ! +! nUserDefinedBoundaries=6 +! BoundaryName=BC_periodicx- ! Periodic (+vv1) +! BoundaryType=(/1,0,0,1/) ! Periodic (+vv1) +! BoundaryName=BC_periodicx+ ! Periodic (-vv1) +! BoundaryType=(/1,0,0,-1/) ! Periodic (-vv1) +! BoundaryName=BC_periodicy- ! Periodic (+vv2) +! BoundaryType=(/1,0,0,2/) ! Periodic (+vv2) +! BoundaryName=BC_periodicy+ ! Periodic (-vv2) +! BoundaryType=(/1,0,0,-2/) ! Periodic (-vv2) +! BoundaryName=BC_WALL +! BoundaryType=(/4,0,0,0/) +! BoundaryName=BC_TOP +! BoundaryType=(/4,0,0,0/) +! +! nVV=2 +! VV=(/1.0 , 0. , 0./) +! VV=(/0. , 1.0 , 0./) diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/parameter.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/parameter.ini index 6d31c9132..0c563bf8c 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/parameter.ini +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/parameter.ini @@ -41,8 +41,8 @@ CalcElectronSEE = T ! CALCULATION ! =============================================================================== ! ManualTimeStep = 5.0E-9 -tend = 100e-9 -Analyze_dt = 100e-9 +tend = 5.0E-9 +Analyze_dt = 5.0E-9 PIC-DoDeposition = F @@ -76,23 +76,33 @@ Part-maxParticleNumber = 4000000 Part-nBounds = 6 Part-Boundary1-SourceName = BC_periodicx- -Part-Boundary1-Condition = periodic +!Part-Boundary1-Condition = periodic +Part-Boundary1-Condition = open + Part-Boundary2-SourceName = BC_periodicx+ -Part-Boundary2-Condition = periodic +!Part-Boundary2-Condition = periodic +Part-Boundary2-Condition = open + Part-Boundary3-SourceName = BC_periodicy- -Part-Boundary3-Condition = periodic +!Part-Boundary3-Condition = periodic +Part-Boundary3-Condition = open + Part-Boundary4-SourceName = BC_periodicy+ -Part-Boundary4-Condition = periodic +!Part-Boundary4-Condition = periodic +Part-Boundary4-Condition = open -Part-Boundary5-SourceName = BC_WALL -Part-Boundary5-Condition = reflective -!Part-Boundary5-BoundaryParticleOutput = T +Part-Boundary5-SourceName = BC_WALL +!Part-Boundary5-Condition = open +Part-Boundary5-Condition = reflective +Part-Boundary5-BoundaryParticleOutput = T +Part-Boundary5-PhotonEnACC = 1.0 +Part-Boundary5-PhotonSpecularReflection = F ! F: diffuse with PhotonEnACC, T: perfect mirror -Part-Boundary6-SourceName = BC_TOP -Part-Boundary6-Condition = reflective -!Part-Boundary6-BoundaryParticleOutput = T +Part-Boundary6-SourceName = BC_TOP +Part-Boundary6-Condition = reflective +!Part-Boundary6-BoundaryParticleOutput = T -Part-nPeriodicVectors = 2 +!Part-nPeriodicVectors = 2 Part-FIBGMdeltas = (/ 1.0 , 1.0 , 1.0 /) Part-FactorFIBGM = (/ 5 , 5 , 5 /) @@ -101,7 +111,7 @@ Part-FactorFIBGM = (/ 5 , 5 , 5 /) ! =============================================================================== ! Particles-DSMC-CalcSurfaceVal = T ! activate InitParticleBoundarySampling RayTracing-PartBound = 6 ! -> iBC=6 -RayTracing-NumRays = 1000 +RayTracing-NumRays = 200000 RayTracing-PulseDuration = 15e-9 RayTracing-WaveLength = 10e-9 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 767889e44..83f3660d0 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -438,9 +438,8 @@ FILE(GLOB_RECURSE piclasF90 ./src/init/*.f90 ./unitTests/unittest.f90 ./unitTests/unittest_vars.f90 ./src/radiation/ray_tracing/*.f90 - ./src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 ./src/radiation/radiative_transfer/radtrans_vars.f90 - ./src/radiation/radiative_transfer/tracking/radtrans_tools.f90 + ./src/radiation/radiative_transfer/tracking/*.f90 ./src/radiation/radiation_solver/radiation_vars.f90) LIST(APPEND timediscF90 ${timediscF90} diff --git a/src/posti/piclas2vtk/piclas2vtk.f90 b/src/posti/piclas2vtk/piclas2vtk.f90 index 00c5615ae..886213faf 100644 --- a/src/posti/piclas2vtk/piclas2vtk.f90 +++ b/src/posti/piclas2vtk/piclas2vtk.f90 @@ -1061,8 +1061,8 @@ SUBROUTINE ConvertSurfaceData(InputStateFile) ELSE nSurfSample = 1 END IF -CALL ReadAttribute(File_ID,'Time',1,RealScalar=OutputTime) -CALL ReadAttribute(File_ID,'DSMC_nSurfSample',1,IntScalar=nSurfSample) +!CALL ReadAttribute(File_ID,'Time',1,RealScalar=OutputTime) +!CALL ReadAttribute(File_ID,'DSMC_nSurfSample',1,IntScalar=nSurfSample) IF(nSurfSample.NE.1) THEN CALL abort(& __STAMP__& diff --git a/src/radiation/radiative_transfer/radtrans_main.f90 b/src/radiation/radiative_transfer/radtrans_main.f90 index 677918689..0bab4031a 100644 --- a/src/radiation/radiative_transfer/radtrans_main.f90 +++ b/src/radiation/radiative_transfer/radtrans_main.f90 @@ -41,20 +41,21 @@ SUBROUTINE RadTrans_main() !=================================================================================================================================== ! MODULES USE MOD_Globals -USE MOD_Mesh_Vars ,ONLY : nElems -USE MOD_Particle_Mesh_Vars ,ONLY : GEO, nComputeNodeElems, ElemMidPoint_Shared, ElemVolume_Shared -USE MOD_RadiationTrans_Vars ,ONLY : Radiation_Emission_Spec_Total, RadTrans, RadEmiAdaptPhotonNum, RadTransObsVolumeFrac -USE MOD_RadiationTrans_Vars ,ONLY : PhotonProps, RadiationDirectionModel, RadTransPhotPerCellLoc, RadObservationPoint -USE MOD_RadiationTrans_Vars ,ONLY : RadTransPhotPerCell, RadTransPhotPerCell_Shared_Win, RadiationPhotonWaveLengthModel -USE MOD_RadiationTrans_Vars ,ONLY : RadObservationPointMethod -USE MOD_Photon_Tracking ,ONLY : PhotonTriaTracking, Photon2DSymTracking -USE MOD_Radiation_Vars ,ONLY : RadiationSwitches -USE MOD_DSMC_Vars ,ONLY : RadialWeighting -USE MOD_Mesh_Tools ,ONLY: GetGlobalElemID -USE MOD_Output ,ONLY: PrintStatusLineRadiation +USE MOD_Mesh_Vars ,ONLY: nElems +USE MOD_Particle_Mesh_Vars ,ONLY: GEO, nComputeNodeElems, ElemMidPoint_Shared, ElemVolume_Shared +USE MOD_RadiationTrans_Vars ,ONLY: Radiation_Emission_Spec_Total, RadTrans, RadEmiAdaptPhotonNum, RadTransObsVolumeFrac +USE MOD_RadiationTrans_Vars ,ONLY: RadiationDirectionModel, RadTransPhotPerCellLoc, RadObservationPoint +USE MOD_Photon_TrackingVars ,ONLY: PhotonProps +USE MOD_RadiationTrans_Vars ,ONLY: RadTransPhotPerCell, RadTransPhotPerCell_Shared_Win, RadiationPhotonWaveLengthModel +USE MOD_RadiationTrans_Vars ,ONLY: RadObservationPointMethod +USE MOD_Photon_Tracking ,ONLY: PhotonTriaTracking, Photon2DSymTracking +USE MOD_Radiation_Vars ,ONLY: RadiationSwitches +USE MOD_DSMC_Vars ,ONLY: RadialWeighting +USE MOD_Mesh_Tools ,ONLY: GetGlobalElemID +USE MOD_Output ,ONLY: PrintStatusLineRadiation USE MOD_MPI_Shared_Vars USE MOD_MPI_Shared -USE MOD_Particle_Vars ,ONLY: Symmetry +USE MOD_Particle_Vars ,ONLY: Symmetry ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -319,9 +320,9 @@ FUNCTION SetPhotonStartDirection(iElem, iPhot, RandRot) !=================================================================================================================================== ! MODULES USE MOD_Globals -USE MOD_Globals_Vars, ONLY : Pi -USE MOD_RadiationTrans_Vars ,ONLY : RadiationDirectionModel, RadTransPhotPerCell, RadObservationPointMethod,RadObservationPoint -USE MOD_RadiationTrans_Vars ,ONLY : PhotonProps +USE MOD_Globals_Vars ,ONLY: Pi +USE MOD_RadiationTrans_Vars ,ONLY: RadiationDirectionModel, RadTransPhotPerCell, RadObservationPointMethod,RadObservationPoint +USE MOD_Photon_TrackingVars ,ONLY: PhotonProps ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- diff --git a/src/radiation/radiative_transfer/radtrans_output.f90 b/src/radiation/radiative_transfer/radtrans_output.f90 index bc76e0f06..0f4c29f96 100644 --- a/src/radiation/radiative_transfer/radtrans_output.f90 +++ b/src/radiation/radiative_transfer/radtrans_output.f90 @@ -31,7 +31,7 @@ MODULE MOD_RadTrans_Output !----------------------------------------------------------------------------------------------------------------------------------- ! Private Part --------------------------------------------------------------------------------------------------------------------- ! Public Part ---------------------------------------------------------------------------------------------------------------------- -PUBLIC :: WriteRadiationToHDF5 , WriteSurfSampleToHDF5 +PUBLIC :: WriteRadiationToHDF5 !=================================================================================================================================== CONTAINS @@ -54,6 +54,7 @@ SUBROUTINE WriteRadiationToHDF5() USE MOD_Radiation_Vars ,ONLY: RadiationSwitches, Radiation_ElemEnergy_Species, RadiationParameter, Radiation_Absorption_Spec USE MOD_Particle_Vars ,ONLY: nSpecies USE MOD_Mesh_Tools ,ONLY: GetCNElemID + USE MOD_Photon_TrackingOutput,ONLY:WritePhotonSurfSampleToHDF5 ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -192,7 +193,7 @@ SUBROUTINE WriteRadiationToHDF5() CALL CloseDataFile() SWRITE(*,*) 'DONE' - CALL WriteSurfSampleToHDF5() + CALL WritePhotonSurfSampleToHDF5() IF (RadObservationPointMethod.GT.0) THEN IF (myRank.EQ.0) THEN @@ -306,7 +307,6 @@ END SUBROUTINE WriteRadiationToHDF5 #if USE_MPI - SUBROUTINE MPI_ExchangeRadiationInfo() !=================================================================================================================================== ! Writes DSMC state values to HDF5 @@ -348,288 +348,9 @@ SUBROUTINE MPI_ExchangeRadiationInfo() END IF END SUBROUTINE MPI_ExchangeRadiationInfo - - -SUBROUTINE MPI_ExchangeRadiationSurfData() -!=================================================================================================================================== -! exchange the surface data -! only processes with samling sides in their halo region and the original process participate on the communication -! structure is similar to particle communication -! each process sends his halo-information directly to the origin process by use of a list, containing the surfsideids for sending -! the receiving process adds the new data to his own sides -!=================================================================================================================================== -! MODULES ! -!----------------------------------------------------------------------------------------------------------------------------------! -USE MOD_Globals -USE MOD_Particle_Boundary_Vars ,ONLY:SurfOnNode, SurfMapping, nComputeNodeSurfTotalSides, GlobalSide2SurfSide -USE MOD_Particle_MPI_Vars ,ONLY:SurfSendBuf,SurfRecvBuf -USE MOD_RadiationTrans_Vars ,ONLY:PhotonSampWall, PhotonSampWall_Shared, PhotonSampWall_Shared_Win -USE MOD_MPI_Shared_Vars ,ONLY:MPI_COMM_LEADERS_SURF, MPI_COMM_SHARED, nSurfLeaders,myComputeNodeRank,mySurfRank -USE MOD_MPI_Shared -!----------------------------------------------------------------------------------------------------------------------------------! -! IMPLICIT VARIABLE HANDLING -IMPLICIT NONE -! INPUT VARIABLES -!----------------------------------------------------------------------------------------------------------------------------------! -! OUTPUT VARIABLES -!----------------------------------------------------------------------------------------------------------------------------------- -! LOCAL VARIABLES -INTEGER :: MessageSize,nValues,iSurfSide,SurfSideID, SideID -INTEGER :: iPos,iProc -INTEGER :: RecvRequest(0:nSurfLeaders-1),SendRequest(0:nSurfLeaders-1) -!=================================================================================================================================== -! nodes without sampling surfaces do not take part in this routine -IF (.NOT.SurfOnNode) RETURN - -MessageSize = 2*nComputeNodeSurfTotalSides -IF (myComputeNodeRank.EQ.0) THEN - CALL MPI_REDUCE(PhotonSampWall,PhotonSampWall_Shared,MessageSize,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_SHARED,IERROR) -ELSE - CALL MPI_REDUCE(PhotonSampWall,0 ,MessageSize,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_SHARED,IERROR) -ENDIF - -CALL BARRIER_AND_SYNC(PhotonSampWall_Shared_Win ,MPI_COMM_SHARED) - -! prepare buffers for surf leader communication -IF (myComputeNodeRank.EQ.0) THEN - nValues = 2 - - ! open receive buffer - DO iProc = 0,nSurfLeaders-1 - ! ignore myself - IF (iProc.EQ.mySurfRank) CYCLE - - ! Only open recv buffer if we are expecting sides from this leader node - IF (SurfMapping(iProc)%nRecvSurfSides.EQ.0) CYCLE - - ! Message is sent on MPI_COMM_LEADERS_SURF, so rank is indeed iProc - MessageSize = SurfMapping(iProc)%nRecvSurfSides * nValues - CALL MPI_IRECV( SurfRecvBuf(iProc)%content & - , MessageSize & - , MPI_DOUBLE_PRECISION & - , iProc & - , 1209 & - , MPI_COMM_LEADERS_SURF & - , RecvRequest(iProc) & - , IERROR) - END DO ! iProc - - ! build message - DO iProc = 0,nSurfLeaders-1 - ! Ignore myself - IF (iProc .EQ. mySurfRank) CYCLE - ! Only assemble message if we are expecting sides to send to this leader node - IF (SurfMapping(iProc)%nSendSurfSides.EQ.0) CYCLE - - ! Nullify everything - iPos = 0 - SurfSendBuf(iProc)%content = 0. - DO iSurfSide = 1,SurfMapping(iProc)%nSendSurfSides - SideID = SurfMapping(iProc)%SendSurfGlobalID(iSurfSide) - SurfSideID = GlobalSide2SurfSide(SURF_SIDEID,SideID) - ! Assemble message - SurfSendBuf(iProc)%content(iPos+1:iPos+2) = PhotonSampWall_Shared(:,SurfSideID) - iPos = iPos + 2 - PhotonSampWall_Shared(:,SurfSideID)=0. - END DO ! iSurfSide = 1,SurfMapping(iProc)%nSendSurfSides - END DO - - ! send message - DO iProc = 0,nSurfLeaders-1 - ! ignore myself - IF (iProc.EQ.mySurfRank) CYCLE - ! Only open recv buffer if we are expecting sides from this leader node - IF (SurfMapping(iProc)%nSendSurfSides.EQ.0) CYCLE - - ! Message is sent on MPI_COMM_LEADERS_SURF, so rank is indeed iProc - MessageSize = SurfMapping(iProc)%nSendSurfSides * nValues - CALL MPI_ISEND( SurfSendBuf(iProc)%content & - , MessageSize & - , MPI_DOUBLE_PRECISION & - , iProc & - , 1209 & - , MPI_COMM_LEADERS_SURF & - , SendRequest(iProc) & - , IERROR) - END DO ! iProc - - ! Finish received number of sampling surfaces - DO iProc = 0,nSurfLeaders-1 - ! ignore myself - IF (iProc.EQ.mySurfRank) CYCLE - - IF (SurfMapping(iProc)%nSendSurfSides.NE.0) THEN - CALL MPI_WAIT(SendRequest(iProc),MPIStatus,IERROR) - IF (IERROR.NE.MPI_SUCCESS) CALL ABORT(__STAMP__,' MPI Communication error',IERROR) - END IF - - IF (SurfMapping(iProc)%nRecvSurfSides.NE.0) THEN - CALL MPI_WAIT(RecvRequest(iProc),MPIStatus,IERROR) - IF (IERROR.NE.MPI_SUCCESS) CALL ABORT(__STAMP__,' MPI Communication error',IERROR) - END IF - END DO ! iProc - - ! add data do my list - DO iProc = 0,nSurfLeaders-1 - ! ignore myself - IF (iProc.EQ.mySurfRank) CYCLE - ! Only open recv buffer if we are expecting sides from this leader node - IF (SurfMapping(iProc)%nRecvSurfSides.EQ.0) CYCLE - - iPos=0 - DO iSurfSide = 1,SurfMapping(iProc)%nRecvSurfSides - SideID = SurfMapping(iProc)%RecvSurfGlobalID(iSurfSide) - SurfSideID = GlobalSide2SurfSide(SURF_SIDEID,SideID) - PhotonSampWall_Shared(:,SurfSideID) = PhotonSampWall_Shared(:,SurfSideID) & - + SurfRecvBuf(iProc)%content(iPos+1:iPos+2) - iPos = iPos + 2 - END DO ! iSurfSide = 1,SurfMapping(iProc)%nRecvSurfSides - ! Nullify buffer - SurfRecvBuf(iProc)%content = 0. - END DO ! iProc -END IF - -CALL BARRIER_AND_SYNC(PhotonSampWall_Shared_Win ,MPI_COMM_SHARED) - -END SUBROUTINE MPI_ExchangeRadiationSurfData #endif /*USE_MPI*/ -SUBROUTINE WriteSurfSampleToHDF5() -!=================================================================================================================================== -!> write the final values of the surface sampling to a HDF5 state file -!> additional performs all the final required computations -!=================================================================================================================================== -! MODULES ! -!----------------------------------------------------------------------------------------------------------------------------------! -USE MOD_Globals -USE MOD_IO_HDF5 -USE MOD_Globals_Vars, ONLY:ProjectName -USE MOD_Particle_Boundary_Vars, ONLY:SurfSideArea, nComputeNodeSurfOutputSides,noutputsides, nSurfTotalSides, nSurfBC -USE MOD_Particle_Boundary_Vars, ONLY:offsetComputeNodeSurfOutputSide, SurfBCName, SurfSideArea_Shared, nComputeNodeSurfSides -USE MOD_Particle_Boundary_Vars, ONLY:SurfSide2GlobalSide, GlobalSide2SurfSide -USE MOD_HDF5_Output, ONLY:WriteAttributeToHDF5,WriteArrayToHDF5,WriteHDF5Header -USE MOD_Mesh_Vars, ONLY:MeshFile -USE MOD_Particle_Mesh_Vars, ONLY:SideInfo_Shared -USE MOD_RadiationTrans_Vars, ONLY:PhotonSampWall, PhotonSampWall_Shared -USE MOD_MPI_Shared_Vars, ONLY:MPI_COMM_LEADERS_SURF,mySurfRank -!----------------------------------------------------------------------------------------------------------------------------------! -! IMPLICIT VARIABLE HANDLING -IMPLICIT NONE -! INPUT VARIABLES -!----------------------------------------------------------------------------------------------------------------------------------! -! OUTPUT VARIABLES -!----------------------------------------------------------------------------------------------------------------------------------- -! LOCAL VARIABLES -CHARACTER(LEN=255) :: FileString,Statedummy -CHARACTER(LEN=255) :: H5_Name -CHARACTER(LEN=255) :: NodeTypeTemp -CHARACTER(LEN=255),ALLOCATABLE :: Str2DVarNames(:) -INTEGER :: nVar2D, GlobalSideID, iSurfSide, OutputCounter, SurfSideNb -REAL :: tstart,tend -REAL, ALLOCATABLE :: helpArray(:,:) -!=================================================================================================================================== -#if USE_MPI -CALL MPI_ExchangeRadiationSurfData() -! Return if not a sampling leader -IF (MPI_COMM_LEADERS_SURF.EQ.MPI_COMM_NULL) RETURN -CALL MPI_BARRIER(MPI_COMM_LEADERS_SURF,iERROR) - -! Return if no sampling sides -IF (nSurfTotalSides .EQ.0) RETURN -#endif /*USE_MPI*/ -IF (mySurfRank.EQ.0) THEN - WRITE(UNIT_stdOut,'(a)',ADVANCE='NO')' WRITE Radiation SurfSTATE TO HDF5 FILE...' - tstart=LOCALTIME() -END IF - -FileString=TRIM(ProjectName)//'_RadiationSurfState.h5' -nVar2D = 2 - -! Generate skeleton for the file with all relevant data on a single proc (MPIRoot) -#if USE_MPI -IF (mySurfRank.EQ.0) THEN -#endif /*USE_MPI*/ - CALL OpenDataFile(FileString,create=.TRUE.,single=.TRUE.,readOnly=.FALSE.) - Statedummy = 'RadiationSurfState' - ! Write file header - CALL WriteHDF5Header(Statedummy,File_ID) - CALL WriteAttributeToHDF5(File_ID,'RadiationnSurfSample',1,IntegerScalar=1) - CALL WriteAttributeToHDF5(File_ID,'MeshFile',1,StrScalar=(/TRIM(MeshFile)/)) - CALL WriteAttributeToHDF5(File_ID,'BC_Surf',nSurfBC,StrArray=SurfBCName) - CALL WriteAttributeToHDF5(File_ID,'N',1,IntegerScalar=1) - NodeTypeTemp='VISU' - CALL WriteAttributeToHDF5(File_ID,'NodeType',1,StrScalar=(/NodeTypeTemp/)) - - ALLOCATE(Str2DVarNames(1:nVar2D)) - ! fill varnames for total values - Str2DVarNames(1) ='PhotonCount' - Str2DVarNames(2) ='HeatFlux' - - CALL WriteAttributeToHDF5(File_ID,'VarNamesSurface',nVar2D,StrArray=Str2DVarNames) - - CALL CloseDataFile() - DEALLOCATE(Str2DVarNames) -#if USE_MPI -END IF -CALL MPI_BARRIER(MPI_COMM_LEADERS_SURF,iERROR) -CALL OpenDataFile(FileString,create=.FALSE.,single=.FALSE.,readOnly=.FALSE.,communicatorOpt=MPI_COMM_LEADERS_SURF) -#else -CALL OpenDataFile(FileString,create=.FALSE.,single=.FALSE.,readOnly=.FALSE.) -#endif /*USE_MPI*/ - - -WRITE(H5_Name,'(A)') 'SurfaceData' -#if USE_MPI -ASSOCIATE(PhotonSampWall => PhotonSampWall_Shared ,& - SurfSideArea => SurfSideArea_Shared) -#endif - -ASSOCIATE (& - nGlobalSides => INT(nOutputSides,IK) ,& - LocalnBCSides => INT(nComputeNodeSurfOutputSides,IK) ,& - offsetSurfSide => INT(offsetComputeNodeSurfOutputSide,IK) ,& - nVar2D => INT(nVar2D,IK)) - - ALLOCATE(helpArray(nVar2D,LocalnBCSides)) - OutputCounter = 0 - DO iSurfSide = 1,nComputeNodeSurfSides - GlobalSideID = SurfSide2GlobalSide(SURF_SIDEID,iSurfSide) - IF(SideInfo_Shared(SIDE_NBSIDEID,GlobalSideID).GT.0) THEN - IF(GlobalSideID.LT.SideInfo_Shared(SIDE_NBSIDEID,GlobalSideID)) THEN - SurfSideNb = GlobalSide2SurfSide(SURF_SIDEID,SideInfo_Shared(SIDE_NBSIDEID,GlobalSideID)) - PhotonSampWall(:,iSurfSide) = PhotonSampWall(:,iSurfSide) + PhotonSampWall(:,SurfSideNb) - ELSE - CYCLE - END IF - END IF - OutputCounter = OutputCounter + 1 - helpArray(1,OutputCounter)= PhotonSampWall(1,iSurfSide) - ! SurfaceArea should be changed to 1:SurfMesh%nSides if inner sampling sides exist... - helpArray(2,OutputCounter)= PhotonSampWall(2,iSurfSide)/SurfSideArea(1,1,iSurfSide) - END DO - CALL WriteArrayToHDF5(DataSetName=H5_Name , rank=4 , & - nValGlobal =(/nVar2D , 1_IK, 1_IK , nGlobalSides/) , & - nVal =(/nVar2D , 1_IK, 1_IK , LocalnBCSides/) , & - offset =(/0_IK, 0_IK , 0_IK , offsetSurfSide/), & - collective =.TRUE. ,& - RealArray=helpArray(1:nVar2D,1:LocalnBCSides)) - DEALLOCATE(helpArray) -END ASSOCIATE - -#if USE_MPI -END ASSOCIATE -#endif /*USE_MPI*/ - -CALL CloseDataFile() - -IF (mySurfRank.EQ.0) THEN - tend=LOCALTIME() - WRITE(UNIT_stdOut,'(A,F0.3,A)',ADVANCE='YES')'DONE [',tend-tstart,'s]' -END IF - -END SUBROUTINE WriteSurfSampleToHDF5 - SUBROUTINE SpectralConvolution(RadObservation_Emission, RadObservation_Emission_Conv) !=================================================================================================================================== ! calculates spectral concolution with slit function/instrumental broadening profile/spectral resolution function diff --git a/src/radiation/radiative_transfer/radtrans_vars.f90 b/src/radiation/radiative_transfer/radtrans_vars.f90 index 60584d050..69cf75a9b 100644 --- a/src/radiation/radiative_transfer/radtrans_vars.f90 +++ b/src/radiation/radiative_transfer/radtrans_vars.f90 @@ -55,18 +55,6 @@ MODULE MOD_RadiationTrans_Vars TYPE (tRadTrans) :: RadTrans - -TYPE tPhotonProps - REAL :: PhotonPos(3) - REAL :: PhotonLastPos(3) - REAL :: PhotonDirection(3) - REAL :: PhotonEnergy - INTEGER :: ElemID - INTEGER :: WaveLength -END TYPE - -TYPE (tPhotonProps) :: PhotonProps - INTEGER :: RadiationAbsorptionModel INTEGER :: RadiationDirectionModel INTEGER :: RadiationPhotonPosModel @@ -79,7 +67,6 @@ MODULE MOD_RadiationTrans_Vars INTEGER,ALLOCPOINT :: RadTransPhotPerCell(:) ! (WaveLen(:), number of mesh elements) INTEGER, ALLOCATABLE :: RadTransPhotPerCellLoc(:) REAL, ALLOCPOINT :: RadTransObsVolumeFrac(:) -REAL, ALLOCATABLE :: PhotonSampWall(:,:) REAL, ALLOCPOINT :: RadObservationPOI(:,:) #if USE_MPI INTEGER :: RadTransPhotPerCell_Shared_Win @@ -90,8 +77,6 @@ MODULE MOD_RadiationTrans_Vars REAL,ALLOCPOINT :: Radiation_Emission_Spec_Total_Shared(:) INTEGER :: Radiation_Emission_Spec_Max_Shared_Win REAL,ALLOCPOINT :: Radiation_Emission_Spec_Max_Shared(:) -INTEGER :: PhotonSampWall_Shared_Win -REAL,POINTER :: PhotonSampWall_Shared(:,:) INTEGER :: RadiationElemAbsEnergy_Shared_Win REAL,POINTER :: RadiationElemAbsEnergy_Shared(:) INTEGER :: RadObservationPOI_Shared_Win diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 index b87d0f986..82a134ce1 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 @@ -51,10 +51,12 @@ SUBROUTINE PhotonTriaTracking() USE MOD_Globals USE MOD_Particle_Mesh_Vars USE MOD_Particle_Boundary_Vars, ONLY:PartBound -USE MOD_RadiationTrans_Vars, ONLY:PhotonProps,RadObservation_Emission, RadObservationPointMethod, RadObservation_EmissionPart +USE MOD_Photon_TrackingVars, ONLY:PhotonProps +USE MOD_RadiationTrans_Vars, ONLY:RadObservation_Emission, RadObservationPointMethod, RadObservation_EmissionPart USE MOD_Photon_TrackingTools, ONLY:PhotonThroughSideCheck3DFast, PhotonIntersectionWithSide,CalcAbsoprtion,PhotonOnLineOfSight USE MOD_Photon_TrackingTools, ONLY:PerfectPhotonReflection, DiffusePhotonReflection, CalcWallAbsoprtion, PointInObsCone USE MOD_Photon_TrackingTools, ONLY:PhotonIntersectSensor +USE MOD_Particle_Boundary_Tools,ONLY: StoreBoundaryParticleProperties IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES @@ -74,10 +76,11 @@ SUBROUTINE PhotonTriaTracking() LOGICAL :: oldElemIsMortar, isMortarSideTemp(1:6), doCheckSide REAL :: minRatio, intersecDist, intersecDistVec(3) REAL :: IntersectionPos(1:3), IntersectionPosTemp(1:3) - +!INTEGER :: StartElemID !=================================================================================================================================== Done = .FALSE. ElemID = PhotonProps%ElemID +!StartElemID = ElemID SideID = 0 DoneLastElem(:,:) = 0 ! 1) Loop tracking until Photon is considered "done" (either absorbed or deleted) @@ -257,9 +260,7 @@ SUBROUTINE PhotonTriaTracking() IF (.NOT.DONE) CALL CalcWallAbsoprtion(SideID, DONE) END IF CASE DEFAULT - CALL abort(& - __STAMP__& - ,' ERROR: PartBound not associated!. (unknown case)',BCType,999.) + CALL abort(__STAMP__,' ERROR: PartBound not associated!. (unknown case)',BCType,999.) END SELECT !PartBound%MapToPartBC(BC(SideID) @@ -292,11 +293,18 @@ SUBROUTINE PhotonTriaTracking() ElemID = SideInfo_Shared(SIDE_NBELEMID,SideID) END IF END IF ! BC(SideID).GT./.LE. 0 - IF (ElemID.LT.1) THEN - CALL abort(& - __STAMP__ & - ,'ERROR: Element not defined! Please increase the size of the halo region (HaloEpsVelo)!') - END IF + !IF(StartElemID.EQ.125)THEN + CALL StoreBoundaryParticleProperties(0,& + 999,& + IntersectionPos,& + UNITVECTOR(PhotonProps%PhotonDirection(1:3)),(/0.0,0.0,1.0/),& + iPartBound=0,& + mode=2,& + MPF_optIN=0.0,& + Velo_optIN=PhotonProps%PhotonDirection(1:3)) + !END IF ! StartElemID.EQ.125 + !IPWRITE(UNIT_StdOut,*) "ElemID =", ElemID + IF (ElemID.LT.1) CALL abort(__STAMP__ ,'ERROR: Element not defined! Please increase the size of the halo region (HaloEpsVelo)!') END DO ! .NOT.PartisDone @@ -323,7 +331,8 @@ SUBROUTINE Photon2DSymTracking() USE MOD_Globals USE MOD_Particle_Mesh_Vars USE MOD_Particle_Boundary_Vars, ONLY:PartBound -USE MOD_RadiationTrans_Vars, ONLY:PhotonProps, RadObservation_Emission, RadObservationPointMethod,RadObservation_EmissionPart +USE MOD_Photon_TrackingVars, ONLY:PhotonProps +USE MOD_RadiationTrans_Vars, ONLY:RadObservation_Emission, RadObservationPointMethod,RadObservation_EmissionPart USE MOD_Photon_TrackingTools, ONLY:CalcAbsoprtion, CalcWallAbsoprtion, DiffusePhotonReflection2D, PointInObsCone USE MOD_Photon_TrackingTools, ONLY:PhotonIntersectionWithSide2D, RotatePhotonIn2DPlane, PerfectPhotonReflection2D USE MOD_Photon_TrackingTools, ONLY:PhotonIntersectSensor, PhotonOnLineOfSight @@ -377,7 +386,7 @@ SUBROUTINE Photon2DSymTracking() ! If small mortar element not defined, abort. Every available information on the compute-node is kept in shared memory, so ! no way to recover it during runtime IF (LastSide.EQ.nbSideID) isLastSide = .TRUE. - IF (NbElemID.LT.1) CALL ABORT(__STAMP__,'Small mortar element not defined!',ElemID) + IF (NbElemID.LT.1) CALL abort(__STAMP__,'Small mortar element not defined!',ElemID) ! For small mortar sides, SIDE_NBSIDEID contains the SideID of the corresponding big mortar side nbSideID = SideInfo_Shared(SIDE_NBSIDEID,nbSideID) NblocSideID = SideInfo_Shared(SIDE_LOCALID,nbSideID) @@ -468,9 +477,7 @@ SUBROUTINE Photon2DSymTracking() END IF LastSide = SideID CASE DEFAULT - CALL abort(& - __STAMP__& - ,' ERROR: PartBound not associated!. (unknown case)',999,999.) + CALL abort(__STAMP__,' ERROR: PartBound not associated!. (unknown case)',999,999.) END SELECT !PartBound%MapToPartBC(BC(SideID) ELSE ! BC(SideID).LE.0 IF (oldElemIsMortar) THEN @@ -486,9 +493,7 @@ SUBROUTINE Photon2DSymTracking() IF (.NOT.DONE) CALL RotatePhotonIn2DPlane(IntersectionPos(1:3)) IF (ElemID.LT.1) THEN - CALL abort(& - __STAMP__ & - ,'ERROR: Element not defined! Please increase the size of the halo region (HaloEpsVelo)!') + CALL abort(__STAMP__ ,'ERROR: Element not defined! Please increase the size of the halo region (HaloEpsVelo)!') END IF END DO ! .NOT.PartisDone END SUBROUTINE Photon2DSymTracking diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 new file mode 100644 index 000000000..d778ad8d6 --- /dev/null +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 @@ -0,0 +1,321 @@ +!================================================================================================================================== +! Copyright (c) 2018 - 2019 Marcel Pfeiffer +! +! This file is part of PICLas (gitlab.com/piclas/piclas). PICLas is free software: you can redistribute it and/or modify +! it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 +! of the License, or (at your option) any later version. +! +! PICLas is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty +! of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License v3.0 for more details. +! +! You should have received a copy of the GNU General Public License along with PICLas. If not, see . +!================================================================================================================================== +#include "piclas.h" + +MODULE MOD_Photon_TrackingOutput +!=================================================================================================================================== +! Module for the main radiation transport routines +!=================================================================================================================================== +! MODULES +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +PRIVATE + +!----------------------------------------------------------------------------------------------------------------------------------- +! GLOBAL VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! Private Part --------------------------------------------------------------------------------------------------------------------- +! Public Part ---------------------------------------------------------------------------------------------------------------------- +PUBLIC :: WritePhotonSurfSampleToHDF5 +!=================================================================================================================================== + +CONTAINS + + +SUBROUTINE WritePhotonSurfSampleToHDF5() +!=================================================================================================================================== +!> write the final values of the surface sampling to a HDF5 state file +!> additional performs all the final required computations +!=================================================================================================================================== +! MODULES ! +!----------------------------------------------------------------------------------------------------------------------------------! +USE MOD_Globals +USE MOD_IO_HDF5 +USE MOD_Globals_Vars, ONLY:ProjectName +USE MOD_Particle_Boundary_Vars, ONLY:SurfSideArea, nComputeNodeSurfOutputSides,noutputsides, nSurfTotalSides, nSurfBC +USE MOD_Particle_Boundary_Vars, ONLY:offsetComputeNodeSurfOutputSide, SurfBCName, nComputeNodeSurfSides +USE MOD_Particle_Boundary_Vars, ONLY:SurfSide2GlobalSide, GlobalSide2SurfSide +USE MOD_HDF5_Output, ONLY:WriteAttributeToHDF5,WriteArrayToHDF5,WriteHDF5Header +USE MOD_Mesh_Vars, ONLY:MeshFile +USE MOD_Particle_Mesh_Vars, ONLY:SideInfo_Shared +USE MOD_Photon_TrackingVars, ONLY:PhotonSampWall +USE MOD_MPI_Shared_Vars, ONLY:mySurfRank +#if USE_MPI +USE MOD_MPI_Shared_Vars, ONLY:MPI_COMM_LEADERS_SURF +USE MOD_Particle_Boundary_Vars, ONLY:SurfSideArea_Shared +USE MOD_Photon_TrackingVars, ONLY:PhotonSampWall_Shared +#endif /*USE_MPI*/ +!----------------------------------------------------------------------------------------------------------------------------------! +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +! INPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------! +! OUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +CHARACTER(LEN=255) :: FileString,Statedummy +CHARACTER(LEN=255) :: H5_Name +CHARACTER(LEN=255) :: NodeTypeTemp +CHARACTER(LEN=255),ALLOCATABLE :: Str2DVarNames(:) +INTEGER :: nVar2D, GlobalSideID, iSurfSide, OutputCounter, SurfSideNb +REAL :: tstart,tend +REAL, ALLOCATABLE :: helpArray(:,:) +!=================================================================================================================================== +#if USE_MPI +CALL MPI_ExchangeRadiationSurfData() +! Return if not a sampling leader +IF (MPI_COMM_LEADERS_SURF.EQ.MPI_COMM_NULL) RETURN +CALL MPI_BARRIER(MPI_COMM_LEADERS_SURF,iERROR) + +! Return if no sampling sides +IF (nSurfTotalSides .EQ.0) RETURN +#endif /*USE_MPI*/ +IF (mySurfRank.EQ.0) THEN + WRITE(UNIT_stdOut,'(a)',ADVANCE='NO')' WRITE Radiation SurfSTATE TO HDF5 FILE...' + tstart=LOCALTIME() +END IF + +FileString=TRIM(ProjectName)//'_RadiationSurfState.h5' +nVar2D = 2 + +! Generate skeleton for the file with all relevant data on a single proc (MPIRoot) +#if USE_MPI +IF (mySurfRank.EQ.0) THEN +#endif /*USE_MPI*/ + CALL OpenDataFile(FileString,create=.TRUE.,single=.TRUE.,readOnly=.FALSE.) + Statedummy = 'RadiationSurfState' + ! Write file header + CALL WriteHDF5Header(Statedummy,File_ID) + CALL WriteAttributeToHDF5(File_ID,'RadiationnSurfSample',1,IntegerScalar=1) + CALL WriteAttributeToHDF5(File_ID,'MeshFile',1,StrScalar=(/TRIM(MeshFile)/)) + CALL WriteAttributeToHDF5(File_ID,'BC_Surf',nSurfBC,StrArray=SurfBCName) + CALL WriteAttributeToHDF5(File_ID,'N',1,IntegerScalar=1) + NodeTypeTemp='VISU' + CALL WriteAttributeToHDF5(File_ID,'NodeType',1,StrScalar=(/NodeTypeTemp/)) + CALL WriteAttributeToHDF5(File_ID,'Time',1,RealScalar=0.) + + ALLOCATE(Str2DVarNames(1:nVar2D)) + ! fill varnames for total values + Str2DVarNames(1) ='PhotonCount' + Str2DVarNames(2) ='HeatFlux' + + CALL WriteAttributeToHDF5(File_ID,'VarNamesSurface',nVar2D,StrArray=Str2DVarNames) + + CALL CloseDataFile() + DEALLOCATE(Str2DVarNames) +#if USE_MPI +END IF +CALL MPI_BARRIER(MPI_COMM_LEADERS_SURF,iERROR) +CALL OpenDataFile(FileString,create=.FALSE.,single=.FALSE.,readOnly=.FALSE.,communicatorOpt=MPI_COMM_LEADERS_SURF) +#else +CALL OpenDataFile(FileString,create=.FALSE.,single=.FALSE.,readOnly=.FALSE.) +#endif /*USE_MPI*/ + + +WRITE(H5_Name,'(A)') 'SurfaceData' +#if USE_MPI +ASSOCIATE(PhotonSampWall => PhotonSampWall_Shared ,& + SurfSideArea => SurfSideArea_Shared) +#endif + +ASSOCIATE (& + nGlobalSides => INT(nOutputSides,IK) ,& + LocalnBCSides => INT(nComputeNodeSurfOutputSides,IK) ,& + offsetSurfSide => INT(offsetComputeNodeSurfOutputSide,IK) ,& + nVar2D => INT(nVar2D,IK)) + + ALLOCATE(helpArray(nVar2D,LocalnBCSides)) + OutputCounter = 0 + DO iSurfSide = 1,nComputeNodeSurfSides + GlobalSideID = SurfSide2GlobalSide(SURF_SIDEID,iSurfSide) + IF(SideInfo_Shared(SIDE_NBSIDEID,GlobalSideID).GT.0) THEN + IF(GlobalSideID.LT.SideInfo_Shared(SIDE_NBSIDEID,GlobalSideID)) THEN + SurfSideNb = GlobalSide2SurfSide(SURF_SIDEID,SideInfo_Shared(SIDE_NBSIDEID,GlobalSideID)) + PhotonSampWall(:,iSurfSide) = PhotonSampWall(:,iSurfSide) + PhotonSampWall(:,SurfSideNb) + ELSE + CYCLE + END IF + END IF + OutputCounter = OutputCounter + 1 + helpArray(1,OutputCounter)= PhotonSampWall(1,iSurfSide) + ! SurfaceArea should be changed to 1:SurfMesh%nSides if inner sampling sides exist... + helpArray(2,OutputCounter)= PhotonSampWall(2,iSurfSide)/SurfSideArea(1,1,iSurfSide) + END DO + CALL WriteArrayToHDF5(DataSetName=H5_Name , rank=4 , & + nValGlobal =(/nVar2D , 1_IK, 1_IK , nGlobalSides/) , & + nVal =(/nVar2D , 1_IK, 1_IK , LocalnBCSides/) , & + offset =(/0_IK, 0_IK , 0_IK , offsetSurfSide/), & + collective =.TRUE. ,& + RealArray=helpArray(1:nVar2D,1:LocalnBCSides)) + DEALLOCATE(helpArray) +END ASSOCIATE + +#if USE_MPI +END ASSOCIATE +#endif /*USE_MPI*/ + +CALL CloseDataFile() + +IF (mySurfRank.EQ.0) THEN + tend=LOCALTIME() + WRITE(UNIT_stdOut,'(A,F0.3,A)',ADVANCE='YES')'DONE [',tend-tstart,'s]' +END IF + +END SUBROUTINE WritePhotonSurfSampleToHDF5 + +#if USE_MPI +SUBROUTINE MPI_ExchangeRadiationSurfData() +!=================================================================================================================================== +! exchange the surface data +! only processes with samling sides in their halo region and the original process participate on the communication +! structure is similar to particle communication +! each process sends his halo-information directly to the origin process by use of a list, containing the surfsideids for sending +! the receiving process adds the new data to his own sides +!=================================================================================================================================== +! MODULES ! +!----------------------------------------------------------------------------------------------------------------------------------! +USE MOD_Globals +USE MOD_Particle_Boundary_Vars ,ONLY: SurfOnNode, SurfMapping, nComputeNodeSurfTotalSides, GlobalSide2SurfSide +USE MOD_Particle_MPI_Vars ,ONLY: SurfSendBuf,SurfRecvBuf +USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall, PhotonSampWall_Shared, PhotonSampWall_Shared_Win +USE MOD_MPI_Shared_Vars ,ONLY: MPI_COMM_LEADERS_SURF, MPI_COMM_SHARED, nSurfLeaders,myComputeNodeRank,mySurfRank +USE MOD_MPI_Shared +!----------------------------------------------------------------------------------------------------------------------------------! +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +! INPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------! +! OUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +INTEGER :: MessageSize,nValues,iSurfSide,SurfSideID, SideID +INTEGER :: iPos,iProc +INTEGER :: RecvRequest(0:nSurfLeaders-1),SendRequest(0:nSurfLeaders-1) +!=================================================================================================================================== +! nodes without sampling surfaces do not take part in this routine +IF (.NOT.SurfOnNode) RETURN + +MessageSize = 2*nComputeNodeSurfTotalSides +IF (myComputeNodeRank.EQ.0) THEN + CALL MPI_REDUCE(PhotonSampWall,PhotonSampWall_Shared,MessageSize,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_SHARED,IERROR) +ELSE + CALL MPI_REDUCE(PhotonSampWall,0 ,MessageSize,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_SHARED,IERROR) +ENDIF + +CALL BARRIER_AND_SYNC(PhotonSampWall_Shared_Win ,MPI_COMM_SHARED) + +! prepare buffers for surf leader communication +IF (myComputeNodeRank.EQ.0) THEN + nValues = 2 + + ! open receive buffer + DO iProc = 0,nSurfLeaders-1 + ! ignore myself + IF (iProc.EQ.mySurfRank) CYCLE + + ! Only open recv buffer if we are expecting sides from this leader node + IF (SurfMapping(iProc)%nRecvSurfSides.EQ.0) CYCLE + + ! Message is sent on MPI_COMM_LEADERS_SURF, so rank is indeed iProc + MessageSize = SurfMapping(iProc)%nRecvSurfSides * nValues + CALL MPI_IRECV( SurfRecvBuf(iProc)%content & + , MessageSize & + , MPI_DOUBLE_PRECISION & + , iProc & + , 1209 & + , MPI_COMM_LEADERS_SURF & + , RecvRequest(iProc) & + , IERROR) + END DO ! iProc + + ! build message + DO iProc = 0,nSurfLeaders-1 + ! Ignore myself + IF (iProc .EQ. mySurfRank) CYCLE + ! Only assemble message if we are expecting sides to send to this leader node + IF (SurfMapping(iProc)%nSendSurfSides.EQ.0) CYCLE + + ! Nullify everything + iPos = 0 + SurfSendBuf(iProc)%content = 0. + DO iSurfSide = 1,SurfMapping(iProc)%nSendSurfSides + SideID = SurfMapping(iProc)%SendSurfGlobalID(iSurfSide) + SurfSideID = GlobalSide2SurfSide(SURF_SIDEID,SideID) + ! Assemble message + SurfSendBuf(iProc)%content(iPos+1:iPos+2) = PhotonSampWall_Shared(:,SurfSideID) + iPos = iPos + 2 + PhotonSampWall_Shared(:,SurfSideID)=0. + END DO ! iSurfSide = 1,SurfMapping(iProc)%nSendSurfSides + END DO + + ! send message + DO iProc = 0,nSurfLeaders-1 + ! ignore myself + IF (iProc.EQ.mySurfRank) CYCLE + ! Only open recv buffer if we are expecting sides from this leader node + IF (SurfMapping(iProc)%nSendSurfSides.EQ.0) CYCLE + + ! Message is sent on MPI_COMM_LEADERS_SURF, so rank is indeed iProc + MessageSize = SurfMapping(iProc)%nSendSurfSides * nValues + CALL MPI_ISEND( SurfSendBuf(iProc)%content & + , MessageSize & + , MPI_DOUBLE_PRECISION & + , iProc & + , 1209 & + , MPI_COMM_LEADERS_SURF & + , SendRequest(iProc) & + , IERROR) + END DO ! iProc + + ! Finish received number of sampling surfaces + DO iProc = 0,nSurfLeaders-1 + ! ignore myself + IF (iProc.EQ.mySurfRank) CYCLE + + IF (SurfMapping(iProc)%nSendSurfSides.NE.0) THEN + CALL MPI_WAIT(SendRequest(iProc),MPIStatus,IERROR) + IF (IERROR.NE.MPI_SUCCESS) CALL ABORT(__STAMP__,' MPI Communication error',IERROR) + END IF + + IF (SurfMapping(iProc)%nRecvSurfSides.NE.0) THEN + CALL MPI_WAIT(RecvRequest(iProc),MPIStatus,IERROR) + IF (IERROR.NE.MPI_SUCCESS) CALL ABORT(__STAMP__,' MPI Communication error',IERROR) + END IF + END DO ! iProc + + ! add data do my list + DO iProc = 0,nSurfLeaders-1 + ! ignore myself + IF (iProc.EQ.mySurfRank) CYCLE + ! Only open recv buffer if we are expecting sides from this leader node + IF (SurfMapping(iProc)%nRecvSurfSides.EQ.0) CYCLE + + iPos=0 + DO iSurfSide = 1,SurfMapping(iProc)%nRecvSurfSides + SideID = SurfMapping(iProc)%RecvSurfGlobalID(iSurfSide) + SurfSideID = GlobalSide2SurfSide(SURF_SIDEID,SideID) + PhotonSampWall_Shared(:,SurfSideID) = PhotonSampWall_Shared(:,SurfSideID) & + + SurfRecvBuf(iProc)%content(iPos+1:iPos+2) + iPos = iPos + 2 + END DO ! iSurfSide = 1,SurfMapping(iProc)%nRecvSurfSides + ! Nullify buffer + SurfRecvBuf(iProc)%content = 0. + END DO ! iProc +END IF + +CALL BARRIER_AND_SYNC(PhotonSampWall_Shared_Win ,MPI_COMM_SHARED) + +END SUBROUTINE MPI_ExchangeRadiationSurfData +#endif /*USE_MPI*/ + +END MODULE MOD_Photon_TrackingOutput diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tools.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 similarity index 95% rename from src/radiation/radiative_transfer/tracking/radtrans_tools.f90 rename to src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 index 2edcea1d1..aa2b979de 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tools.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 @@ -44,10 +44,10 @@ SUBROUTINE PhotonThroughSideCheck3DFast(iLocSide,Element,ThroughSide,TriNum, IsM !> is reversed. !=================================================================================================================================== ! MODULES -USE MOD_Globals_Vars ,ONLY: EpsMach -USE MOD_Particle_Mesh_Vars, ONLY : NodeCoords_Shared, ElemSideNodeID_Shared -USE MOD_RadiationTrans_Vars, ONLY:PhotonProps -USE MOD_Mesh_Tools ,ONLY: GetCNElemID +USE MOD_Globals_Vars ,ONLY: EpsMach +USE MOD_Particle_Mesh_Vars ,ONLY: NodeCoords_Shared, ElemSideNodeID_Shared +USE MOD_Photon_TrackingVars ,ONLY: PhotonProps +USE MOD_Mesh_Tools ,ONLY: GetCNElemID ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE ! INPUT VARIABLES @@ -228,9 +228,9 @@ SUBROUTINE PhotonIntersectionWithSide2D(iLocSide,Element,ThroughSide,Intersectio !> Routine to check whether a photon crossed the given side. !=================================================================================================================================== ! MODULES -USE MOD_Particle_Mesh_Vars, ONLY : ElemSideNodeID2D_Shared, NodeCoords_Shared -USE MOD_RadiationTrans_Vars, ONLY : PhotonProps -USE MOD_Mesh_Tools ,ONLY: GetCNElemID +USE MOD_Particle_Mesh_Vars ,ONLY: ElemSideNodeID2D_Shared, NodeCoords_Shared +USE MOD_Photon_TrackingVars ,ONLY: PhotonProps +USE MOD_Mesh_Tools ,ONLY: GetCNElemID ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE ! INPUT VARIABLES @@ -481,7 +481,7 @@ SUBROUTINE RotatePhotonIn2DPlane(IntersectionPos) !> Routine to check whether a photon crossed the given side. !=================================================================================================================================== ! MODULES -USE MOD_RadiationTrans_Vars, ONLY:PhotonProps +USE MOD_Photon_TrackingVars ,ONLY: PhotonProps ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -515,7 +515,7 @@ SUBROUTINE PhotonIntersectionWithSide(iLocSide,Element,TriNum, IntersectionPos, !Based on PerfectReflection3D !--------------------------------------------------------------------------------------------------! USE MOD_Particle_Mesh_Vars, ONLY : ElemSideNodeID_Shared, NodeCoords_Shared -USE MOD_RadiationTrans_Vars, ONLY:PhotonProps +USE MOD_Photon_TrackingVars ,ONLY: PhotonProps USE MOD_Mesh_Tools ,ONLY: GetCNElemID !--------------------------------------------------------------------------------------------------! IMPLICIT NONE ! @@ -611,8 +611,9 @@ SUBROUTINE CalcAbsoprtionMC(IntersectionPos,Element, DONE) !--------------------------------------------------------------------------------------------------! !Based on PerfectReflection3D !--------------------------------------------------------------------------------------------------! -USE MOD_RadiationTrans_Vars, ONLY:PhotonProps,RadiationElemAbsEnergy -USE MOD_Radiation_Vars, ONLY:Radiation_Absorption_spec +USE MOD_Photon_TrackingVars ,ONLY: PhotonProps +USE MOD_RadiationTrans_Vars ,ONLY: RadiationElemAbsEnergy +USE MOD_Radiation_Vars ,ONLY: Radiation_Absorption_spec !--------------------------------------------------------------------------------------------------! IMPLICIT NONE ! !--------------------------------------------------------------------------------------------------! @@ -639,7 +640,7 @@ END SUBROUTINE CalcAbsoprtionMC SUBROUTINE CalcAbsoprtionAnalytic(IntersectionPos,Element, DONE) !DEC$ ATTRIBUTES FORCEINLINE :: ParticleThroughSideLastPosCheck USE MOD_Globals - USE MOD_RadiationTrans_Vars, ONLY:PhotonProps, RadTrans +USE MOD_Photon_TrackingVars ,ONLY: PhotonProps USE MOD_RadiationTrans_Vars, ONLY:RadiationElemAbsEnergy USE MOD_Radiation_Vars, ONLY:Radiation_Absorption_spec !--------------------------------------------------------------------------------------------------! @@ -673,28 +674,26 @@ SUBROUTINE CalcAbsoprtionAnalytic(IntersectionPos,Element, DONE) END SUBROUTINE CalcAbsoprtionAnalytic SUBROUTINE CalcAbsoprtion(IntersectionPos,Element, DONE) - USE MOD_Globals - USE MOD_RadiationTrans_Vars, ONLY : RadiationAbsorptionModel +USE MOD_Globals +USE MOD_RadiationTrans_Vars ,ONLY: RadiationAbsorptionModel !--------------------------------------------------------------------------------------------------! - IMPLICIT NONE ! +IMPLICIT NONE ! !--------------------------------------------------------------------------------------------------! ! argument list declaration ! - INTEGER, INTENT(IN) :: Element - REAL, INTENT(IN) :: IntersectionPos(3) - LOGICAL, INTENT(INOUT) :: DONE +INTEGER, INTENT(IN) :: Element +REAL, INTENT(IN) :: IntersectionPos(3) +LOGICAL, INTENT(INOUT) :: DONE ! Local variable declaration ! !--------------------------------------------------------------------------------------------------! -!--------------------------------------------------------------------------------------------------! - IF (RadiationAbsorptionModel.EQ.1) THEN - CALL CalcAbsoprtionAnalytic(IntersectionPos,Element, DONE) - ELSE IF (RadiationAbsorptionModel.EQ.2) THEN - CALL CalcAbsoprtionMC(IntersectionPos,Element, DONE) - ELSE - CALL Abort(& - __STAMP__,& - 'AbsorptionModel must be 1 or 2!') - END IF - +IF (RadiationAbsorptionModel.EQ.0) THEN + RETURN +ELSEIF (RadiationAbsorptionModel.EQ.1) THEN + CALL CalcAbsoprtionAnalytic(IntersectionPos,Element, DONE) +ELSEIF (RadiationAbsorptionModel.EQ.2) THEN + CALL CalcAbsoprtionMC(IntersectionPos,Element, DONE) +ELSE + CALL Abort(__STAMP__,'AbsorptionModel must be 1 or 2!') +END IF END SUBROUTINE CalcAbsoprtion SUBROUTINE PerfectPhotonReflection(iLocSide,Element,TriNum, IntersectionPos, IntersecAlreadyCalc) @@ -702,7 +701,7 @@ SUBROUTINE PerfectPhotonReflection(iLocSide,Element,TriNum, IntersectionPos, Int !Based on PerfectReflection3D !--------------------------------------------------------------------------------------------------! USE MOD_Particle_Mesh_Vars, ONLY : NodeCoords_Shared, ElemSideNodeID_Shared - USE MOD_RadiationTrans_Vars, ONLY : PhotonProps +USE MOD_Photon_TrackingVars ,ONLY: PhotonProps USE MOD_Mesh_Tools ,ONLY: GetCNElemID !--------------------------------------------------------------------------------------------------! IMPLICIT NONE ! @@ -798,7 +797,7 @@ SUBROUTINE PerfectPhotonReflection2D(iLocSide,Element, IntersectionPos) !Based on PerfectReflection3D !--------------------------------------------------------------------------------------------------! USE MOD_Particle_Mesh_Vars, ONLY : SideNormalEdge2D_Shared - USE MOD_RadiationTrans_Vars, ONLY : PhotonProps +USE MOD_Photon_TrackingVars ,ONLY: PhotonProps USE MOD_Mesh_Tools ,ONLY: GetCNElemID !--------------------------------------------------------------------------------------------------! IMPLICIT NONE ! @@ -844,7 +843,7 @@ SUBROUTINE DiffusePhotonReflection(iLocSide,Element,TriNum, IntersectionPos, Int !Based on PerfectReflection3D !--------------------------------------------------------------------------------------------------! USE MOD_Particle_Mesh_Vars, ONLY : ElemSideNodeID_Shared, NodeCoords_Shared - USE MOD_RadiationTrans_Vars, ONLY : PhotonProps +USE MOD_Photon_TrackingVars ,ONLY: PhotonProps USE Ziggurat USE MOD_Mesh_Tools ,ONLY: GetCNElemID !--------------------------------------------------------------------------------------------------! @@ -952,7 +951,7 @@ SUBROUTINE DiffusePhotonReflection2D(iLocSide,Element, IntersectionPos) !Based on PerfectReflection3D !--------------------------------------------------------------------------------------------------! USE MOD_Particle_Mesh_Vars, ONLY : SideNormalEdge2D_Shared - USE MOD_RadiationTrans_Vars, ONLY : PhotonProps +USE MOD_Photon_TrackingVars ,ONLY: PhotonProps USE Ziggurat USE MOD_Mesh_Tools ,ONLY: GetCNElemID !--------------------------------------------------------------------------------------------------! @@ -1002,30 +1001,30 @@ SUBROUTINE DiffusePhotonReflection2D(iLocSide,Element, IntersectionPos) END SUBROUTINE DiffusePhotonReflection2D SUBROUTINE CalcWallAbsoprtion(GlobSideID, DONE) - USE MOD_RadiationTrans_Vars, ONLY : PhotonSampWall, PhotonProps - USE MOD_Particle_Boundary_Vars, ONLY:PartBound, GlobalSide2SurfSide - USE MOD_Particle_Mesh_Vars ,ONLY: SideInfo_Shared +USE MOD_Photon_TrackingVars ,ONLY: PhotonProps,PhotonSampWall +USE MOD_Particle_Boundary_Vars ,ONLY: PartBound, GlobalSide2SurfSide +USE MOD_Particle_Mesh_Vars ,ONLY: SideInfo_Shared !--------------------------------------------------------------------------------------------------! - IMPLICIT NONE ! +IMPLICIT NONE ! !--------------------------------------------------------------------------------------------------! ! argument list declaration ! - INTEGER, INTENT(IN) :: GlobSideID - LOGICAL, INTENT(OUT) :: DONE +INTEGER, INTENT(IN) :: GlobSideID +LOGICAL, INTENT(OUT) :: DONE ! Local variable declaration ! !--------------------------------------------------------------------------------------------------! - REAL :: iRan - INTEGER :: SurfSideID +REAL :: iRan +INTEGER :: SurfSideID !--------------------------------------------------------------------------------------------------! - SurfSideID = GlobalSide2SurfSide(SURF_SIDEID,GlobSideID) - CALL RANDOM_NUMBER(iRan) - IF (PartBound%PhotonEnACC(PartBound%MapToPartBC(SideInfo_Shared(SIDE_BCID,GlobSideID))).GT.iRan) THEN - DONE = .TRUE. - PhotonSampWall(1,SurfSideID) = PhotonSampWall(1,SurfSideID) + 1. - PhotonSampWall(2,SurfSideID) = PhotonSampWall(2,SurfSideID) + PhotonProps%PhotonEnergy - END IF - +SurfSideID = GlobalSide2SurfSide(SURF_SIDEID,GlobSideID) +CALL RANDOM_NUMBER(iRan) +IF (PartBound%PhotonEnACC(PartBound%MapToPartBC(SideInfo_Shared(SIDE_BCID,GlobSideID))).GT.iRan) THEN + DONE = .TRUE. + PhotonSampWall(1,SurfSideID) = PhotonSampWall(1,SurfSideID) + 1. + PhotonSampWall(2,SurfSideID) = PhotonSampWall(2,SurfSideID) + PhotonProps%PhotonEnergy +END IF END SUBROUTINE CalcWallAbsoprtion + LOGICAL FUNCTION PointInObsCone(Point) !=================================================================================================================================== ! modified particle emmission for LD case diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_vars.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_vars.f90 new file mode 100644 index 000000000..9796203f4 --- /dev/null +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_vars.f90 @@ -0,0 +1,45 @@ +!================================================================================================================================== +! Copyright (c) 2023 - 2023 Marcel Pfeiffer, Stephen Copplestone +! +! This file is part of PICLas (gitlab.com/piclas/piclas). PICLas is free software: you can redistribute it and/or modify +! it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 +! of the License, or (at your option) any later version. +! +! PICLas is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty +! of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License v3.0 for more details. +! +! You should have received a copy of the GNU General Public License along with PICLas. If not, see . +!================================================================================================================================== +#include "piclas.h" + +MODULE MOD_Photon_TrackingVars +!=================================================================================================================================== +! Contains the tadiation transport variables +!=================================================================================================================================== +! MODULES +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +PUBLIC +SAVE +!----------------------------------------------------------------------------------------------------------------------------------- +! GLOBAL RAY TRACING VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +TYPE tPhotonProps + REAL :: PhotonPos(3) !> + REAL :: PhotonLastPos(3) !> + REAL :: PhotonDirection(3) !> + REAL :: PhotonEnergy !> + INTEGER :: ElemID !> + INTEGER :: WaveLength !> +END TYPE + +TYPE (tPhotonProps) :: PhotonProps !> + +REAL, ALLOCATABLE :: PhotonSampWall(:,:) + +#if USE_MPI +INTEGER :: PhotonSampWall_Shared_Win +REAL,POINTER :: PhotonSampWall_Shared(:,:) +#endif /*USE_MPI*/ +!=================================================================================================================================== +END MODULE MOD_Photon_TrackingVars diff --git a/src/radiation/ray_tracing/raytrace_main.f90 b/src/radiation/ray_tracing/raytrace.f90 similarity index 69% rename from src/radiation/ray_tracing/raytrace_main.f90 rename to src/radiation/ray_tracing/raytrace.f90 index 98921b680..a09ae2057 100644 --- a/src/radiation/ray_tracing/raytrace_main.f90 +++ b/src/radiation/ray_tracing/raytrace.f90 @@ -26,7 +26,7 @@ MODULE MOD_RayTracing END INTERFACE !----------------------------------------------------------------------------------------------------------------------------------- -! GLOBAL VARIABLES +! GLOBAL VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! Private Part --------------------------------------------------------------------------------------------------------------------- ! Public Part ---------------------------------------------------------------------------------------------------------------------- @@ -41,26 +41,20 @@ SUBROUTINE RayTracing() !=================================================================================================================================== ! MODULES USE MOD_Globals -!USE MOD_Mesh_Vars ,ONLY: nElems -!USE MOD_Particle_Mesh_Vars ,ONLY: GEO, nComputeNodeElems, ElemMidPoint_Shared, ElemVolume_Shared -!USE MOD_RadiationTrans_Vars ,ONLY : Radiation_Emission_Spec_Total, RadTrans, RadEmiAdaptPhotonNum, RadTransObsVolumeFrac ! USE MOD_RadiationTrans_Vars ,ONLY : Radiation_Emission_Spec_Total, RadTrans, RadEmiAdaptPhotonNum, RadTransObsVolumeFrac -USE MOD_RayTracing_Vars ,ONLY: PhotonProps,RayPartBound,NumRays -!USE MOD_RadiationTrans_Vars ,ONLY : RadTransPhotPerCell, RadTransPhotPerCell_Shared_Win, RadiationPhotonWaveLengthModel ! USE MOD_RadiationTrans_Vars ,ONLY : RadTransPhotPerCell, RadTransPhotPerCell_Shared_Win, RadiationPhotonWaveLengthModel -!USE MOD_RadiationTrans_Vars ,ONLY : RadObservationPointMethod ! USE MOD_RadiationTrans_Vars ,ONLY : RadObservationPointMethod -USE MOD_Photon_Tracking ,ONLY: PhotonTriaTracking -!USE MOD_Radiation_Vars ,ONLY: RadiationSwitches -!USE MOD_DSMC_Vars ,ONLY: RadialWeighting -USE MOD_Mesh_Tools ,ONLY: GetGlobalElemID -USE MOD_Output ,ONLY: PrintStatusLineRadiation USE MOD_MPI_Shared_Vars USE MOD_MPI_Shared -!USE MOD_Particle_Vars ,ONLY: Symmetry -USE MOD_Mesh_Tools ,ONLY: GetCNElemID -USE MOD_part_emission_tools ,ONLY: InsideQuadrilateral -USE MOD_Particle_Boundary_Vars ,ONLY: nComputeNodeSurfSides,PartBound,SurfSide2GlobalSide -USE MOD_Particle_Mesh_Vars ,ONLY: SideInfo_Shared -USE MOD_Particle_Boundary_Tools,ONLY: StoreBoundaryParticleProperties -USE MOD_Particle_Boundary_Vars ,ONLY: PartStateBoundary,nVarPartStateBoundary +USE MOD_RayTracing_Vars ,ONLY: RayPartBound,NumRays,Ray +USE MOD_Photon_TrackingVars ,ONLY: PhotonProps +USE MOD_Photon_Tracking ,ONLY: PhotonTriaTracking +USE MOD_Mesh_Tools ,ONLY: GetGlobalElemID +USE MOD_Output ,ONLY: PrintStatusLineRadiation +USE MOD_Mesh_Tools ,ONLY: GetCNElemID +USE MOD_part_emission_tools ,ONLY: InsideQuadrilateral +USE MOD_Particle_Boundary_Vars ,ONLY: nComputeNodeSurfSides,PartBound,SurfSide2GlobalSide +USE MOD_Particle_Mesh_Vars ,ONLY: SideInfo_Shared +USE MOD_Particle_Boundary_Tools ,ONLY: StoreBoundaryParticleProperties +USE MOD_Particle_Boundary_Vars ,ONLY: PartStateBoundary,nVarPartStateBoundary +USE MOD_Photon_TrackingOutput ,ONLY: WritePhotonSurfSampleToHDF5 ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -77,8 +71,11 @@ SUBROUTINE RayTracing() LOGICAL :: found LOGICAL :: FoundComputeNodeSurfSide INTEGER :: ALLOCSTAT +REAL :: RectPower +REAL :: StartT,EndT ! Timer !=================================================================================================================================== +GETTIME(StartT) SWRITE(UNIT_stdOut,'(A)') ' Start Ray Tracing Calculation ...' photonCount = 0 @@ -90,13 +87,7 @@ SUBROUTINE RayTracing() RayDisp = INT(LocRayNum/20) -!PhotonProps%PhotonPos(1:3) = (/0.5,0.01,0.99/) -!found = InsideQuadrilateral(PhotonProps%PhotonPos(1:2),1) -!WRITE (*,*) "PhotonProps%PhotonPos(1:3),found =", PhotonProps%PhotonPos(1:3),found - - - -PhotonProps%PhotonDirection(1:3) = (/0.0,0.0,-1.0/)! SetPhotonStartDirection(iCNElem, iPhotLoc, RandRot) +RectPower = Ray%IntensityAmplitude * Ray%Area / REAL(NumRays) !write(*,*) "DONE" !IF(myrank.eq.0) read*; CALL MPI_BARRIER(MPI_COMM_WORLD,iError) @@ -113,6 +104,7 @@ SUBROUTINE RayTracing() RayVisCount = RayVisCount + 1 PhotonProps%PhotonPos(1:3) = SetRayPos() PhotonProps%PhotonLastPos(1:3) = PhotonProps%PhotonPos(1:3) + PhotonProps%PhotonDirection(1:3) = Ray%Direction ! (/0.0,0.0,-1.0/)! SetPhotonStartDirection(iCNElem, iPhotLoc, RandRot) ! Loop over all sides of a specific iPartBoundary and find the side where the ray enters the domain ! count number of nSides connected to iPartBoundary BCSideID @@ -134,6 +126,7 @@ SUBROUTINE RayTracing() CNElemID = GetCNElemID(SideInfo_Shared(SIDE_ELEMID,NonUniqueGlobalSideID)) ! Set global element index for current ray PhotonProps%ElemID = GetGlobalElemID(CNElemID) + PhotonProps%PhotonEnergy = RectPower EXIT SurfLoop END IF ! InsideQuadrilateral(X,NonUniqueGlobalSideID) END IF ! SideInfo_Shared(SIDE_NBSIDEID,NonUniqueGlobalSideID).LE.0 @@ -142,7 +135,7 @@ SUBROUTINE RayTracing() ! Sanity check: nComputeNodeSurfSides > 0 and the correct PartBCIndex for those sides IF(.NOT.FoundComputeNodeSurfSide)THEN IPWRITE(UNIT_StdOut,*) ": nComputeNodeSurfSides =", nComputeNodeSurfSides - IPWRITE(UNIT_StdOut,*) ": RayPartBound =", RayPartBound + IPWRITE(UNIT_StdOut,*) ": RayPartBound =", RayPartBound !IPWRITE(UNIT_StdOut,'(I0,A,I0,A)') ": Set Part-Boundary",RayPartBound,"-BoundaryParticleOutput = T" IPWRITE(UNIT_StdOut,*) ": Set Particles-DSMC-CalcSurfaceVal = T" CALL abort(__STAMP__,'No boundary found in list of nComputeNodeSurfSides for defined RayPartBound!') @@ -172,7 +165,7 @@ SUBROUTINE RayTracing() iPhotLoc = iPhot !END IF !IF ((RadObservationPointMethod.EQ.2).AND.RadObservationPoint%CalcFullSpectra) THEN - PhotonProps%WaveLength = iPhotLoc + !PhotonProps%WaveLength = Ray%WaveLength !ELSE !IF (RadiationPhotonWaveLengthModel.EQ.1) THEN !PhotonProps%WaveLength = SetParticleWavelengthAR(iCNElem) @@ -180,11 +173,21 @@ SUBROUTINE RayTracing() !PhotonProps%WaveLength = SetParticleWavelengthBiSec(iCNElem) !END IF !END IF - !PhotonProps%PhotonEnergy = SetPhotonEnergy(CNElemID,PhotonProps%PhotonPos(1:3), PhotonProps%WaveLength) - !CALL PhotonTriaTracking() + !PhotonProps%PhotonEnergy = SetPhotonEnergy(CNElemID,PhotonProps%PhotonPos(1:3), PhotonProps%WaveLength) + !IPWRITE(UNIT_StdOut,*) "iRay =", iRay + CALL PhotonTriaTracking() + !IF(myrank.eq.0) read* END DO !photonCount = photonCount + RadTransPhotPerCell(iELem) +! Print 100% +IF(MPIroot) CALL PrintStatusLineRadiation(REAL(RayVisCount),REAL(1),REAL(LocRayNum),.TRUE.) + +CALL WritePhotonSurfSampleToHDF5() + +GETTIME(EndT) +CALL DisplayMessageAndTime(EndT-StartT, ' DONE!', DisplayDespiteLB=.TRUE., DisplayLine=.FALSE.) + END SUBROUTINE RayTracing @@ -194,21 +197,21 @@ FUNCTION SetPhotonEnergy(iCNElem, Point, iWave) !=================================================================================================================================== ! MODULES USE MOD_Globals -USE MOD_Globals_Vars, ONLY : Pi -USE MOD_RadiationTrans_Vars ,ONLY : RadEmiAdaptPhotonNum, Radiation_Emission_Spec_Total, RadTrans, RadTransPhotPerCell -USE MOD_RadiationTrans_Vars ,ONLY : RadObservationPoint, RadObservationPointMethod,RadTransObsVolumeFrac,RadObservationPOI -USE MOD_Particle_Mesh_Vars ,ONLY : ElemVolume_Shared -USE MOD_Radiation_Vars ,ONLY : RadiationParameter,Radiation_Emission_spec +USE MOD_Globals_Vars ,ONLY: Pi +USE MOD_RadiationTrans_Vars ,ONLY: RadEmiAdaptPhotonNum, Radiation_Emission_Spec_Total, RadTrans, RadTransPhotPerCell +USE MOD_RadiationTrans_Vars ,ONLY: RadObservationPoint, RadObservationPointMethod,RadTransObsVolumeFrac,RadObservationPOI +USE MOD_Particle_Mesh_Vars ,ONLY: ElemVolume_Shared +USE MOD_Radiation_Vars ,ONLY: RadiationParameter,Radiation_Emission_spec ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- -! INPUT VARIABLES -INTEGER, INTENT(IN) :: iCNElem +! INPUT VARIABLES +INTEGER, INTENT(IN) :: iCNElem REAL, INTENT(IN) :: Point(3) -INTEGER, INTENT(IN), OPTIONAL :: iWave +INTEGER, INTENT(IN), OPTIONAL :: iWave !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES -REAL :: SetPhotonEnergy +REAL :: SetPhotonEnergy !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES !REAL :: ProjectedDist(3), Dist(3), ClosestPoint(3), FarthestPoint(3), Vec1(3), Vec2(3), fullangle @@ -220,7 +223,7 @@ FUNCTION SetPhotonEnergy(iCNElem, Point, iWave) SetPhotonEnergy = Radiation_Emission_Spec_Total(iCNElem)*ElemVolume_Shared(iCNElem)*RadTransObsVolumeFrac(iCNElem) / (RadTrans%NumPhotonsPerCell) END IF -IF (RadObservationPointMethod.EQ.1) THEN +IF (RadObservationPointMethod.EQ.1) THEN Dist(1:3) = Point(1:3) - RadObservationPoint%MidPoint(1:3) absdistnorm = VECNORM(Dist(1:3)) DistNorm(1:3) = Dist(1:3)/absdistnorm @@ -275,9 +278,9 @@ FUNCTION SetPhotonStartDirection(iCNElem, iPhot, RandRot) !=================================================================================================================================== ! MODULES USE MOD_Globals -USE MOD_Globals_Vars, ONLY : Pi -USE MOD_RadiationTrans_Vars ,ONLY : RadiationDirectionModel, RadTransPhotPerCell, RadObservationPointMethod,RadObservationPoint -USE MOD_RadiationTrans_Vars ,ONLY : PhotonProps +USE MOD_Globals_Vars ,ONLY: Pi +USE MOD_RadiationTrans_Vars ,ONLY: RadiationDirectionModel, RadTransPhotPerCell, RadObservationPointMethod,RadObservationPoint +USE MOD_Photon_TrackingVars ,ONLY: PhotonProps ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -294,64 +297,64 @@ FUNCTION SetPhotonStartDirection(iCNElem, iPhot, RandRot) REAL :: iRan,RandomDirection(2), X_new, Y_new, start, incr, SpiralPos, SpiralStep INTEGER :: RadMod !=================================================================================================================================== - SELECT CASE(RadiationDirectionModel) - CASE(1) +SELECT CASE(RadiationDirectionModel) +CASE(1) + RadMod = RadiationDirectionModel +CASE(2) + IF (RadTransPhotPerCell(iCNElem).EQ.1) THEN + RadMod = 1 + ELSE RadMod = RadiationDirectionModel + END IF +CASE DEFAULT + CALL abort(& + __STAMP__& + ,' ERROR: Radiation-DirectionModel not implemented!. (unknown case)') +END SELECT !PartBound%MapToPartBC(BC(SideID) +IF (RadObservationPointMethod.EQ.1) THEN + CALL RANDOM_NUMBER(iRan) + RandomDirection(1) = RadObservationPoint%Diameter/2. * SQRT(iRan) + CALL RANDOM_NUMBER(iRan) + RandomDirection(2) = iRan * 2. * Pi + SetPhotonStartDirection(1) = 0.0 + SetPhotonStartDirection(2) = RandomDirection(1) * COS(RandomDirection(2)) + SetPhotonStartDirection(3) = RandomDirection(1) * SIN(RandomDirection(2)) + SetPhotonStartDirection(1:3) = MATMUL(RadObservationPoint%OrthoNormBasis, SetPhotonStartDirection(1:3)) + SetPhotonStartDirection(1:3) = SetPhotonStartDirection(1:3) + RadObservationPoint%MidPoint(1:3) + SetPhotonStartDirection(1:3) = SetPhotonStartDirection(1:3) - PhotonProps%PhotonPos(1:3) + SetPhotonStartDirection(1:3) = SetPhotonStartDirection(1:3) / VECNORM(SetPhotonStartDirection(1:3)) +ELSEIF (RadObservationPointMethod.EQ.2) THEN +! SetPhotonStartDirection(1:3) = RadObservationPoint%MidPoint(1:3) +! SetPhotonStartDirection(1:3) = SetPhotonStartDirection(1:3) - RadObservationPoint%ViewDirection(1:3) + SetPhotonStartDirection(1:3) = -RadObservationPoint%ViewDirection(1:3) + SetPhotonStartDirection(1:3) = SetPhotonStartDirection(1:3) / VECNORM(SetPhotonStartDirection(1:3)) +ELSE + SELECT CASE(RadMod) + CASE(1) + CALL RANDOM_NUMBER(iRan) + RandomDirection(1) = 2.*iRan - 1. + CALL RANDOM_NUMBER(iRan) + RandomDirection(2) = 2.*Pi*iRan - Pi + SetPhotonStartDirection(1) = SIN(RandomDirection(2))*SQRT(1.-RandomDirection(1)**2.) + SetPhotonStartDirection(2) = COS(RandomDirection(2))*SQRT(1.-RandomDirection(1)**2.) + SetPhotonStartDirection(3) = RandomDirection(1) CASE(2) - IF (RadTransPhotPerCell(iCNElem).EQ.1) THEN - RadMod = 1 - ELSE - RadMod = RadiationDirectionModel - END IF + SpiralStep = 0.1+1.2*REAL(RadTransPhotPerCell(iCNElem)) + start = (-1. + 1./(REAL(RadTransPhotPerCell(iCNElem))-1.)) + incr = (2.-2./(REAL(RadTransPhotPerCell(iCNElem))-1.))/(REAL(RadTransPhotPerCell(iCNElem))-1.) + SpiralPos = start + (REAL(iPhot)-1.) *incr + X_new = SpiralPos * SpiralStep + Y_new = Pi/2.*SIGN(1.,SpiralPos)*(1.-SQRT(1.-ABS(SpiralPos))) + SetPhotonStartDirection(1) = COS(X_new)*COS(Y_new) + SetPhotonStartDirection(2) = SIN(X_new)*COS(Y_new) + SetPhotonStartDirection(3) = SIN(Y_new) + SetPhotonStartDirection(1:3) = MATMUL(RandRot, SetPhotonStartDirection(1:3)) CASE DEFAULT CALL abort(& __STAMP__& ,' ERROR: Radiation-DirectionModel not implemented!. (unknown case)') END SELECT !PartBound%MapToPartBC(BC(SideID) - IF (RadObservationPointMethod.EQ.1) THEN - CALL RANDOM_NUMBER(iRan) - RandomDirection(1) = RadObservationPoint%Diameter/2. * SQRT(iRan) - CALL RANDOM_NUMBER(iRan) - RandomDirection(2) = iRan * 2. * Pi - SetPhotonStartDirection(1) = 0.0 - SetPhotonStartDirection(2) = RandomDirection(1) * COS(RandomDirection(2)) - SetPhotonStartDirection(3) = RandomDirection(1) * SIN(RandomDirection(2)) - SetPhotonStartDirection(1:3) = MATMUL(RadObservationPoint%OrthoNormBasis, SetPhotonStartDirection(1:3)) - SetPhotonStartDirection(1:3) = SetPhotonStartDirection(1:3) + RadObservationPoint%MidPoint(1:3) - SetPhotonStartDirection(1:3) = SetPhotonStartDirection(1:3) - PhotonProps%PhotonPos(1:3) - SetPhotonStartDirection(1:3) = SetPhotonStartDirection(1:3) / VECNORM(SetPhotonStartDirection(1:3)) - ELSEIF (RadObservationPointMethod.EQ.2) THEN -! SetPhotonStartDirection(1:3) = RadObservationPoint%MidPoint(1:3) -! SetPhotonStartDirection(1:3) = SetPhotonStartDirection(1:3) - RadObservationPoint%ViewDirection(1:3) - SetPhotonStartDirection(1:3) = -RadObservationPoint%ViewDirection(1:3) - SetPhotonStartDirection(1:3) = SetPhotonStartDirection(1:3) / VECNORM(SetPhotonStartDirection(1:3)) - ELSE - SELECT CASE(RadMod) - CASE(1) - CALL RANDOM_NUMBER(iRan) - RandomDirection(1) = 2.*iRan - 1. - CALL RANDOM_NUMBER(iRan) - RandomDirection(2) = 2.*Pi*iRan - Pi - SetPhotonStartDirection(1) = SIN(RandomDirection(2))*SQRT(1.-RandomDirection(1)**2.) - SetPhotonStartDirection(2) = COS(RandomDirection(2))*SQRT(1.-RandomDirection(1)**2.) - SetPhotonStartDirection(3) = RandomDirection(1) - CASE(2) - SpiralStep = 0.1+1.2*REAL(RadTransPhotPerCell(iCNElem)) - start = (-1. + 1./(REAL(RadTransPhotPerCell(iCNElem))-1.)) - incr = (2.-2./(REAL(RadTransPhotPerCell(iCNElem))-1.))/(REAL(RadTransPhotPerCell(iCNElem))-1.) - SpiralPos = start + (REAL(iPhot)-1.) *incr - X_new = SpiralPos * SpiralStep - Y_new = Pi/2.*SIGN(1.,SpiralPos)*(1.-SQRT(1.-ABS(SpiralPos))) - SetPhotonStartDirection(1) = COS(X_new)*COS(Y_new) - SetPhotonStartDirection(2) = SIN(X_new)*COS(Y_new) - SetPhotonStartDirection(3) = SIN(Y_new) - SetPhotonStartDirection(1:3) = MATMUL(RandRot, SetPhotonStartDirection(1:3)) - CASE DEFAULT - CALL abort(& - __STAMP__& - ,' ERROR: Radiation-DirectionModel not implemented!. (unknown case)') - END SELECT !PartBound%MapToPartBC(BC(SideID) - END IF +END IF END FUNCTION SetPhotonStartDirection @@ -359,26 +362,26 @@ FUNCTION RandomRotMatrix() !=================================================================================================================================== ! Calculation of the vibrational temperature (zero-point search) for the TSHO (Truncated Simple Harmonic Oscillator) !=================================================================================================================================== -! MODULES - USE MOD_Globals_Vars, ONLY : Pi +! MODULES +USE MOD_Globals_Vars, ONLY : Pi ! IMPLICIT VARIABLE HANDLING - IMPLICIT NONE +IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES - REAL :: RandomRotMatrix(3,3) +REAL :: RandomRotMatrix(3,3) !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES - REAL :: alpha(3) , A(3,3) +REAL :: alpha(3) , A(3,3) !=================================================================================================================================== - CALL RANDOM_NUMBER(alpha) - alpha(1:3) = 2.*alpha(1:3)*Pi - RandomRotMatrix = RESHAPE((/1.,0.,0.,0.,COS(alpha(1)),SIN(alpha(1)),0.,-SIN(alpha(1)), COS(alpha(1))/),(/3,3/)) - A = RESHAPE((/COS(alpha(2)),0.,-SIN(alpha(2)),0.,1.,0.,SIN(alpha(2)),0.0, COS(alpha(2))/),(/3,3/)) - RandomRotMatrix = MATMUL(A,RandomRotMatrix) - A = RESHAPE((/COS(alpha(3)),SIN(alpha(3)),0.,-SIN(alpha(3)),COS(alpha(3)),0.,0.,0.0, 1./),(/3,3/)) - RandomRotMatrix = MATMUL(A, RandomRotMatrix) +CALL RANDOM_NUMBER(alpha) +alpha(1:3) = 2.*alpha(1:3)*Pi +RandomRotMatrix = RESHAPE((/1.,0.,0.,0.,COS(alpha(1)),SIN(alpha(1)),0.,-SIN(alpha(1)), COS(alpha(1))/),(/3,3/)) +A = RESHAPE((/COS(alpha(2)),0.,-SIN(alpha(2)),0.,1.,0.,SIN(alpha(2)),0.0, COS(alpha(2))/),(/3,3/)) +RandomRotMatrix = MATMUL(A,RandomRotMatrix) +A = RESHAPE((/COS(alpha(3)),SIN(alpha(3)),0.,-SIN(alpha(3)),COS(alpha(3)),0.,0.,0.0, 1./),(/3,3/)) +RandomRotMatrix = MATMUL(A, RandomRotMatrix) END FUNCTION RandomRotMatrix @@ -407,36 +410,36 @@ FUNCTION SetParticleWavelengthAR(iCNElem) INTEGER :: iWaveLength REAL :: iRan, iRadPower !=================================================================================================================================== - + +CALL RANDOM_NUMBER(iRan) +iWaveLength = INT(RadiationParameter%WaveLenDiscrCoarse*iRan) + 1 +IF ((RadiationParameter%WaveLenReductionFactor.GT.1).AND.(iWaveLength.EQ.RadiationParameter%WaveLenDiscrCoarse)) THEN + IF (MOD(RadiationParameter%WaveLenDiscr,RadiationParameter%WaveLenDiscrCoarse).NE.0) THEN + iRadPower = 4.*Pi*Radiation_Emission_Spec(RadiationParameter%WaveLenDiscrCoarse, iCNElem) * RadiationParameter%WaveLenIncr & + * (1.+RadiationParameter%WaveLenReductionFactor) + ELSE + iRadPower = 4.*Pi*Radiation_Emission_Spec(iWaveLength,iCNElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor + END IF +ELSE + iRadPower = 4.*Pi*Radiation_Emission_Spec(iWaveLength,iCNElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor +END IF +CALL RANDOM_NUMBER(iRan) +DO WHILE (iRan.GT.(iRadPower/Radiation_Emission_Spec_Max(iCNElem))) CALL RANDOM_NUMBER(iRan) iWaveLength = INT(RadiationParameter%WaveLenDiscrCoarse*iRan) + 1 IF ((RadiationParameter%WaveLenReductionFactor.GT.1).AND.(iWaveLength.EQ.RadiationParameter%WaveLenDiscrCoarse)) THEN IF (MOD(RadiationParameter%WaveLenDiscr,RadiationParameter%WaveLenDiscrCoarse).NE.0) THEN iRadPower = 4.*Pi*Radiation_Emission_Spec(RadiationParameter%WaveLenDiscrCoarse, iCNElem) * RadiationParameter%WaveLenIncr & * (1.+RadiationParameter%WaveLenReductionFactor) - ELSE - iRadPower = 4.*Pi*Radiation_Emission_Spec(iWaveLength,iCNElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor + ELSE + iRadPower = 4.*Pi*Radiation_Emission_Spec(iWaveLength,iCNElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor END IF ELSE - iRadPower = 4.*Pi*Radiation_Emission_Spec(iWaveLength,iCNElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor + iRadPower = 4.*Pi*Radiation_Emission_Spec(iWaveLength,iCNElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor END IF - CALL RANDOM_NUMBER(iRan) - DO WHILE (iRan.GT.(iRadPower/Radiation_Emission_Spec_Max(iCNElem))) - CALL RANDOM_NUMBER(iRan) - iWaveLength = INT(RadiationParameter%WaveLenDiscrCoarse*iRan) + 1 - IF ((RadiationParameter%WaveLenReductionFactor.GT.1).AND.(iWaveLength.EQ.RadiationParameter%WaveLenDiscrCoarse)) THEN - IF (MOD(RadiationParameter%WaveLenDiscr,RadiationParameter%WaveLenDiscrCoarse).NE.0) THEN - iRadPower = 4.*Pi*Radiation_Emission_Spec(RadiationParameter%WaveLenDiscrCoarse, iCNElem) * RadiationParameter%WaveLenIncr & - * (1.+RadiationParameter%WaveLenReductionFactor) - ELSE - iRadPower = 4.*Pi*Radiation_Emission_Spec(iWaveLength,iCNElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor - END IF - ELSE - iRadPower = 4.*Pi*Radiation_Emission_Spec(iWaveLength,iCNElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor - END IF - CALL RANDOM_NUMBER(iRan) - END DO - SetParticleWavelengthAR = iWaveLength + CALL RANDOM_NUMBER(iRan) +END DO +SetParticleWavelengthAR = iWaveLength END FUNCTION SetParticleWavelengthAR @@ -465,66 +468,66 @@ FUNCTION SetParticleWavelengthBiSec(iCNElem) INTEGER :: iWaveLength, iWave, iWaveOld, iWaveMin, iWaveMax REAL :: iRan, iRadPower, iRadPower2 !=================================================================================================================================== - - CALL RANDOM_NUMBER(iRan) - iWaveOld = 1 - iWaveLength = INT(RadiationParameter%WaveLenDiscrCoarse/2) - iWaveMin = 1 - iWaveMax = RadiationParameter%WaveLenDiscrCoarse + +CALL RANDOM_NUMBER(iRan) +iWaveOld = 1 +iWaveLength = INT(RadiationParameter%WaveLenDiscrCoarse/2) +iWaveMin = 1 +iWaveMax = RadiationParameter%WaveLenDiscrCoarse +IF (iWaveLength.EQ.RadiationParameter%WaveLenDiscrCoarse) THEN + iRadPower = Radiation_Emission_Spec_Total(iCNElem) +ELSE + iRadPower = 0.0 + DO iWave = 1, iWaveLength + iRadPower = iRadPower + 4.*Pi*Radiation_Emission_Spec(iWave,iCNElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor + END DO +END IF + +DO + IF (iRan.GT.(iRadPower/Radiation_Emission_Spec_Total(iCNElem)))THEN + iWaveMin = iWaveLength + ELSE + iWaveMax = iWaveLength + END IF + iWaveOld = iWaveLength + iWaveLength = INT((iWaveMax+iWaveMin)/2) IF (iWaveLength.EQ.RadiationParameter%WaveLenDiscrCoarse) THEN iRadPower = Radiation_Emission_Spec_Total(iCNElem) ELSE iRadPower = 0.0 DO iWave = 1, iWaveLength - iRadPower = iRadPower + 4.*Pi*Radiation_Emission_Spec(iWave,iCNElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor + iRadPower = iRadPower + 4.*Pi*Radiation_Emission_Spec(iWave,iCNElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor END DO END IF - - DO - IF (iRan.GT.(iRadPower/Radiation_Emission_Spec_Total(iCNElem)))THEN - iWaveMin = iWaveLength - ELSE - iWaveMax = iWaveLength - END IF - iWaveOld = iWaveLength - iWaveLength = INT((iWaveMax+iWaveMin)/2) - IF (iWaveLength.EQ.RadiationParameter%WaveLenDiscrCoarse) THEN - iRadPower = Radiation_Emission_Spec_Total(iCNElem) - ELSE - iRadPower = 0.0 - DO iWave = 1, iWaveLength - iRadPower = iRadPower + 4.*Pi*Radiation_Emission_Spec(iWave,iCNElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor - END DO - END IF - IF (ABS(iWaveOld-iWaveLength).LE.1) EXIT - - END DO - - iWaveOld = iWaveLength - IF (iRan.LT.(iRadPower/Radiation_Emission_Spec_Total(iCNElem))) THEN - IF (iWaveLength.EQ.1) THEN - iWaveLength = iWaveLength - ELSE - iWaveLength = iWaveLength - 1 - iRadPower2 = 0.0 - DO iWave = 1, iWaveLength - iRadPower2 = iRadPower2 + 4.*Pi*Radiation_Emission_Spec(iWave,iCNElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor - END DO - IF (ABS(iRan-(iRadPower/Radiation_Emission_Spec_Total(iCNElem))).LT.ABS(iRan-(iRadPower2/Radiation_Emission_Spec_Total(iCNElem)))) THEN - iWaveLength = iWaveOld - END IF - END IF - ELSE - iWaveLength = iWaveLength + 1 + IF (ABS(iWaveOld-iWaveLength).LE.1) EXIT + +END DO + +iWaveOld = iWaveLength +IF (iRan.LT.(iRadPower/Radiation_Emission_Spec_Total(iCNElem))) THEN + IF (iWaveLength.EQ.1) THEN + iWaveLength = iWaveLength + ELSE + iWaveLength = iWaveLength - 1 iRadPower2 = 0.0 DO iWave = 1, iWaveLength - iRadPower2 = iRadPower2 + 4.*Pi*Radiation_Emission_Spec(iWave,iCNElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor + iRadPower2 = iRadPower2 + 4.*Pi*Radiation_Emission_Spec(iWave,iCNElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor END DO IF (ABS(iRan-(iRadPower/Radiation_Emission_Spec_Total(iCNElem))).LT.ABS(iRan-(iRadPower2/Radiation_Emission_Spec_Total(iCNElem)))) THEN iWaveLength = iWaveOld END IF - END IF - SetParticleWavelengthBiSec = iWaveLength + END IF +ELSE + iWaveLength = iWaveLength + 1 + iRadPower2 = 0.0 + DO iWave = 1, iWaveLength + iRadPower2 = iRadPower2 + 4.*Pi*Radiation_Emission_Spec(iWave,iCNElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor + END DO + IF (ABS(iRan-(iRadPower/Radiation_Emission_Spec_Total(iCNElem))).LT.ABS(iRan-(iRadPower2/Radiation_Emission_Spec_Total(iCNElem)))) THEN + iWaveLength = iWaveOld + END IF +END IF +SetParticleWavelengthBiSec = iWaveLength END FUNCTION SetParticleWavelengthBiSec diff --git a/src/radiation/ray_tracing/raytrace_ini.f90 b/src/radiation/ray_tracing/raytrace_ini.f90 index 6123e1b3c..486f05009 100644 --- a/src/radiation/ray_tracing/raytrace_ini.f90 +++ b/src/radiation/ray_tracing/raytrace_ini.f90 @@ -36,19 +36,18 @@ SUBROUTINE DefineParametersRayTracing() !================================================================================================================================== CALL prms%SetSection("Ray Tracing") -CALL prms%CreateIntOption( 'RayTracing-PartBound' , 'TODO' , '0') -CALL prms%CreateLogicalOption( 'RayTracing-AdaptiveRays' , 'TODO' , '.FALSE.') -CALL prms%CreateIntOption( 'RayTracing-NumRays' , 'TODO' , '1') -CALL prms%CreateIntOption( 'RayTracing-RayPosModel' , 'TODO' , '1') -CALL prms%CreateRealArrayOption('RayTracing-RayDirection' , 'Direction vector for ray emission. Will be normalized after read-in.' , no=3) -CALL prms%CreateIntOption( 'RayTracing-PartBound' , 'Particle boundary ID where rays are emitted from' , '0') - -CALL prms%CreateRealOption( 'RayTracing-PulseDuration' , 'Pulse duration tau for a Gaussian-type pulse with I~exp(-(t/tau)^2) [s]' ) -CALL prms%CreateIntOption( 'RayTracing-NbrOfPulses' , 'Number of pulses [-]','1') -CALL prms%CreateRealOption( 'RayTracing-WaistRadius' , 'Beam waist radius (in focal spot) w_b for Gaussian-type pulse with I~exp(-(r/w_b)^2) [m]' , '0.0') -CALL prms%CreateRealOption( 'RayTracing-WaveLength' , 'Beam wavelength [m]' ) -CALL prms%CreateRealOption( 'RayTracing-RepetitionRate' , 'Pulse repetition rate (pulses per second) [Hz]' ) -CALL prms%CreateRealOption( 'RayTracing-Power' , 'Average pulse power (energy of a single pulse times repetition rate) [W]' ) +CALL prms%CreateIntOption( 'RayTracing-PartBound' , 'TODO' , '0') +CALL prms%CreateLogicalOption( 'RayTracing-AdaptiveRays' , 'TODO' , '.FALSE.') +CALL prms%CreateIntOption( 'RayTracing-NumRays' , 'TODO' , '1') +CALL prms%CreateIntOption( 'RayTracing-RayPosModel' , 'TODO' , '1') +CALL prms%CreateRealArrayOption( 'RayTracing-RayDirection' , 'Direction vector for ray emission. Will be normalized after read-in.' , no=3) +CALL prms%CreateIntOption( 'RayTracing-PartBound' , 'Particle boundary ID where rays are emitted from' , '0') +CALL prms%CreateRealOption( 'RayTracing-PulseDuration' , 'Pulse duration tau for a Gaussian-type pulse with I~exp(-(t/tau)^2) [s]' ) +CALL prms%CreateIntOption( 'RayTracing-NbrOfPulses' , 'Number of pulses [-]' , '1') +CALL prms%CreateRealOption( 'RayTracing-WaistRadius' , 'Beam waist radius (in focal spot) w_b for Gaussian-type pulse with I~exp(-(r/w_b)^2) [m]' , '0.0') +CALL prms%CreateRealOption( 'RayTracing-WaveLength' , 'Beam wavelength [m]' ) +CALL prms%CreateRealOption( 'RayTracing-RepetitionRate' , 'Pulse repetition rate (pulses per second) [Hz]' ) +CALL prms%CreateRealOption( 'RayTracing-Power' , 'Average pulse power (energy of a single pulse times repetition rate) [W]' ) END SUBROUTINE DefineParametersRayTracing @@ -68,7 +67,10 @@ SUBROUTINE InitRayTracing() #if USE_MPI USE MOD_MPI_Shared_Vars USE MOD_MPI_Shared +USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall_Shared, PhotonSampWall_Shared_Win #endif /*USE_MPI*/ +USE MOD_RadiationTrans_Vars ,ONLY: RadiationAbsorptionModel,RadObservationPointMethod +USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -82,6 +84,10 @@ SUBROUTINE InitRayTracing() SWRITE(UNIT_StdOut,'(132("-"))') SWRITE(UNIT_stdOut,'(A)') ' INIT RAY TRACING SOLVER ...' +! Do not absorb rays within the volume! +RadiationAbsorptionModel = 0 +RadObservationPointMethod = 0 + RayPartBound = GETINT('RayTracing-PartBound') IF(RayPartBound.EQ.0) RETURN IF(RayPartBound.LT.0) CALL CollectiveStop(__STAMP__,'RayTracing-PartBound must be > 0!') @@ -95,6 +101,7 @@ SUBROUTINE InitRayTracing() Ray%RepetitionRate = GETREAL('RayTracing-RepetitionRate') Ray%Period = 1./Ray%RepetitionRate Ray%Power = GETREAL('RayTracing-Power') +Ray%Direction = GETREALARRAY('RayTracing-RayDirection',3) ASSOCIATE( & E0 => Ray%Energy ,& @@ -140,7 +147,6 @@ SUBROUTINE InitRayTracing() AdaptiveRays = GETLOGICAL('RayTracing-AdaptiveRays') NumRays = GETINT('RayTracing-NumRays') RayPosModel = GETINT('RayTracing-RayPosModel') -RayDirection = GETREALARRAY('RayTracing-RayDirection',3) #if USE_MPI CALL Allocate_Shared((/nGlobalElems/),RayElemPassedEnergy_Shared_Win,RayElemPassedEnergy_Shared) @@ -149,16 +155,16 @@ SUBROUTINE InitRayTracing() CALL BARRIER_AND_SYNC(RayElemPassedEnergy_Shared_Win,MPI_COMM_SHARED) #endif /*USE_MPI*/ -ALLOCATE(RaySampWall(2,1:nComputeNodeSurfTotalSides)) -RaySampWall=0.0 +ALLOCATE(PhotonSampWall(2,1:nComputeNodeSurfTotalSides)) +PhotonSampWall=0.0 #if USE_MPI !> Then shared arrays for boundary sampling -CALL Allocate_Shared((/2,nComputeNodeSurfTotalSides/),RaySampWall_Shared_Win,RaySampWall_Shared) -CALL MPI_WIN_LOCK_ALL(0,RaySampWall_Shared_Win,IERROR) +CALL Allocate_Shared((/2,nComputeNodeSurfTotalSides/),PhotonSampWall_Shared_Win,PhotonSampWall_Shared) +CALL MPI_WIN_LOCK_ALL(0,PhotonSampWall_Shared_Win,IERROR) -IF (myComputeNodeRank.EQ.0) RaySampWall_Shared = 0. -CALL BARRIER_AND_SYNC(RaySampWall_Shared_Win,MPI_COMM_SHARED) +IF (myComputeNodeRank.EQ.0) PhotonSampWall_Shared = 0. +CALL BARRIER_AND_SYNC(PhotonSampWall_Shared_Win,MPI_COMM_SHARED) #endif SWRITE(UNIT_stdOut,'(A)')' INIT RAY TRACING SOLVER DONE!' diff --git a/src/radiation/ray_tracing/raytrace_vars.f90 b/src/radiation/ray_tracing/raytrace_vars.f90 index c1d5f5b7a..236705452 100644 --- a/src/radiation/ray_tracing/raytrace_vars.f90 +++ b/src/radiation/ray_tracing/raytrace_vars.f90 @@ -37,6 +37,7 @@ MODULE MOD_RayTracing_Vars REAL :: Area !> REAL :: Energy !> REAL :: IntensityAmplitude !> + REAL :: Direction(3) !> END TYPE TYPE (tRayTrace) :: Ray !> @@ -50,28 +51,13 @@ MODULE MOD_RayTracing_Vars TYPE (tRadTrans) :: RadTrans !> -TYPE tPhotonProps - REAL :: PhotonPos(3) !> - REAL :: PhotonLastPos(3) !> - REAL :: PhotonDirection(3) !> - REAL :: PhotonEnergy !> - INTEGER :: ElemID !> - INTEGER :: WaveLength !> -END TYPE - -TYPE (tPhotonProps) :: PhotonProps !> - LOGICAL :: AdaptiveRays !> INTEGER :: NumRays !> INTEGER :: RayPosModel !> INTEGER :: RayPartBound !> Particle boundary ID where rays are emitted from -REAL :: RayDirection(3) !> REAL, ALLOCATABLE :: RayElemPassedEnergy(:) !> -REAL, ALLOCATABLE :: RaySampWall(:,:) !> #if USE_MPI -INTEGER :: RaySampWall_Shared_Win !> -REAL,POINTER :: RaySampWall_Shared(:,:) !> INTEGER :: RayElemPassedEnergy_Shared_Win !> REAL,POINTER :: RayElemPassedEnergy_Shared(:) !> #endif From c10ad9df6c4dcf5fc9e3d22ec5f8b1001f1c2bca Mon Sep 17 00:00:00 2001 From: Franziska Hild Date: Tue, 16 May 2023 16:32:11 +0200 Subject: [PATCH 073/495] BGK CalcTRelax check totalweightspec --- src/particles/bgk/bgk_colloperator.f90 | 66 +++++++++++++------------- 1 file changed, 34 insertions(+), 32 deletions(-) diff --git a/src/particles/bgk/bgk_colloperator.f90 b/src/particles/bgk/bgk_colloperator.f90 index 0d84d2b2b..2d0f97540 100644 --- a/src/particles/bgk/bgk_colloperator.f90 +++ b/src/particles/bgk/bgk_colloperator.f90 @@ -830,43 +830,45 @@ SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, Xi_VibSpec, EVibSpec, totalWeightSpe ERotSpecMean=0.0; ERotTtransSpecMean=0.0; EVibSpecMean=0.0; EVibTtransSpecMean=0.0; ETransRelMean=0.0; CellTempRel=0.0 DO iSpec = 1, nSpecies - IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN ! molecules - ! Mean rotational energy per particle of a species - ERotSpecMean(iSpec) = ERotSpec(iSpec)/totalWeightSpec(iSpec) - ! Mean rotational energy per particle of a species for the mixture translational temperature, ERot(Ttrans) - ERotTtransSpecMean(iSpec) = CellTemp * Xi_RotSpec(iSpec) * BoltzmannConst /2. - ! Calculate number of rotational relaxing molecules - RotFracSpec(iSpec) = totalWeightSpec(iSpec)*(rotrelaxfreqSpec(iSpec)/relaxfreq)*(1.-EXP(-relaxfreq*dtCell)) + IF(totalWeightSpec(iSpec).GT.0.) THEN + IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN ! molecules + ! Mean rotational energy per particle of a species + ERotSpecMean(iSpec) = ERotSpec(iSpec)/totalWeightSpec(iSpec) + ! Mean rotational energy per particle of a species for the mixture translational temperature, ERot(Ttrans) + ERotTtransSpecMean(iSpec) = CellTemp * Xi_RotSpec(iSpec) * BoltzmannConst /2. + ! Calculate number of rotational relaxing molecules + RotFracSpec(iSpec) = totalWeightSpec(iSpec)*(rotrelaxfreqSpec(iSpec)/relaxfreq)*(1.-EXP(-relaxfreq*dtCell)) - IF(BGKDoVibRelaxation) THEN - ! Mean vibrational energy per particle of a species - EVibSpecMean(iSpec) = EVibSpec(iSpec)/totalWeightSpec(iSpec) - IF(SpecDSMC(iSpec)%PolyatomicMol) THEN ! polyatomic - iPolyatMole = SpecDSMC(iSpec)%SpecToPolyArray - ! Loop over all vibrational DOF - DO iDOF = 1, PolyatomMolDSMC(iPolyatMole)%VibDOF + IF(BGKDoVibRelaxation) THEN + ! Mean vibrational energy per particle of a species + EVibSpecMean(iSpec) = EVibSpec(iSpec)/totalWeightSpec(iSpec) + IF(SpecDSMC(iSpec)%PolyatomicMol) THEN ! polyatomic + iPolyatMole = SpecDSMC(iSpec)%SpecToPolyArray + ! Loop over all vibrational DOF + DO iDOF = 1, PolyatomMolDSMC(iPolyatMole)%VibDOF + ! Mean vibrational energy per particle of a species for the mixture translational temperature, EVib(Ttrans) + EVibTtransSpecMean(iSpec) = EVibTtransSpecMean(iSpec) + BoltzmannConst*PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF) / & + (EXP(PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)/CellTemp) - 1.) + END DO + ELSE ! diatomic ! Mean vibrational energy per particle of a species for the mixture translational temperature, EVib(Ttrans) - EVibTtransSpecMean(iSpec) = EVibTtransSpecMean(iSpec) + BoltzmannConst*PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF) / & - (EXP(PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)/CellTemp) - 1.) - END DO - ELSE ! diatomic - ! Mean vibrational energy per particle of a species for the mixture translational temperature, EVib(Ttrans) - EVibTtransSpecMean(iSpec) = BoltzmannConst * SpecDSMC(iSpec)%CharaTVib / (EXP(SpecDSMC(iSpec)%CharaTVib/CellTemp) - 1.) + EVibTtransSpecMean(iSpec) = BoltzmannConst * SpecDSMC(iSpec)%CharaTVib / (EXP(SpecDSMC(iSpec)%CharaTVib/CellTemp) - 1.) + END IF + ! Calculate number of vibrational relaxing molecules + VibFracSpec(iSpec) = totalWeightSpec(iSpec)*(vibrelaxfreqSpec(iSpec)/relaxfreq)*(1.-EXP(-relaxfreq*dtCell)) END IF - ! Calculate number of vibrational relaxing molecules - VibFracSpec(iSpec) = totalWeightSpec(iSpec)*(vibrelaxfreqSpec(iSpec)/relaxfreq)*(1.-EXP(-relaxfreq*dtCell)) - END IF - ! Mean translational energy per particle to satisfy the Landau-Teller equation - ETransRelMean = ETransRelMean + (3./2. * BoltzmannConst * CellTemp - (rotrelaxfreqSpec(iSpec)/relaxfreq) * & - (ERotTtransSpecMean(iSpec)-ERotSpecMean(iSpec))) * totalWeightSpec(iSpec)/totalWeight - IF (BGKDoVibRelaxation) THEN - ETransRelMean = ETransRelMean - (vibrelaxfreqSpec(iSpec)/relaxfreq)*(EVibTtransSpecMean(iSpec)-EVibSpecMean(iSpec)) * & - totalWeightSpec(iSpec)/totalWeight + ! Mean translational energy per particle to satisfy the Landau-Teller equation + ETransRelMean = ETransRelMean + (3./2. * BoltzmannConst * CellTemp - (rotrelaxfreqSpec(iSpec)/relaxfreq) * & + (ERotTtransSpecMean(iSpec)-ERotSpecMean(iSpec))) * totalWeightSpec(iSpec)/totalWeight + IF (BGKDoVibRelaxation) THEN + ETransRelMean = ETransRelMean - (vibrelaxfreqSpec(iSpec)/relaxfreq)*(EVibTtransSpecMean(iSpec)-EVibSpecMean(iSpec)) * & + totalWeightSpec(iSpec)/totalWeight + END IF + ELSE ! atomic + ! Mean translational energy per particle to satisfy the Landau-Teller equation + ETransRelMean = ETransRelMean + 3./2. * BoltzmannConst * CellTemp * totalWeightSpec(iSpec)/totalWeight END IF - ELSE ! atomic - ! Mean translational energy per particle to satisfy the Landau-Teller equation - ETransRelMean = ETransRelMean + 3./2. * BoltzmannConst * CellTemp * totalWeightSpec(iSpec)/totalWeight END IF END DO From 99908d481575031dec946c7e6a30fa7606581218 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Tue, 16 May 2023 17:30:59 +0200 Subject: [PATCH 074/495] Fixed ray tracing search that now uses nComputeNodeSurfTotalSides instead of nComputeNodeSurfSides + fixed function call to WriteStateToHDF5, which requires collective =.FALSE. if it is not 100% sure that all processes enter this routine. Otherwise the resulting .h5 will might be corrupt, i.e., that entries in an array can contain wrong values. --- .../analyze.ini | 32 ++++++++------- .../command_line.ini | 2 +- .../parameter.ini | 5 ++- .../reference_RadiationSurfState.h5 | Bin 0 -> 6904 bytes src/init/piclas_init.f90 | 2 + src/particles/particle_mesh/particle_bgm.f90 | 3 +- src/piclaslib.f90 | 2 - .../tracking/radtrans_tracking_output.f90 | 19 +++++---- src/radiation/ray_tracing/raytrace.f90 | 37 +++++++++--------- src/radiation/ray_tracing/raytrace_ini.f90 | 12 +++--- 10 files changed, 62 insertions(+), 52 deletions(-) create mode 100644 regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/reference_RadiationSurfState.h5 diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/analyze.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/analyze.ini index 0fed3775f..fea43d272 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/analyze.ini +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/analyze.ini @@ -1,17 +1,21 @@ -! =================================================================================================================== ! compare column -! =================================================================================================================== -compare_column_file = PartAnalyze.csv ! data file name -compare_column_reference_file = Electrons_ref.csv ! data file name -compare_column_index = 9 ! column index for comparison -compare_column_tolerance_value = 1e9 ! tolerance (depends on machine accuracy and MPI) -compare_column_tolerance_type = absolute ! absolute or relative tolerance +!compare_column_file = PartAnalyze.csv ! data file name +!compare_column_reference_file = Electrons_ref.csv ! data file name +!compare_column_index = 9 ! column index for comparison +!compare_column_tolerance_value = 1e9 ! tolerance (depends on machine accuracy and MPI) +!compare_column_tolerance_type = absolute ! absolute or relative tolerance -! =================================================================================================================== ! integrate columns x:y in a data file as integral(y(x), x, x(1), x(end)) -! =================================================================================================================== -integrate_line_file = SurfaceAnalyze.csv ! data file name -integrate_line_columns = 0:1 ! columns x:y [time:nPart_in] -integrate_line_integral_value = 8.065565e-07 ! Ampere -integrate_line_tolerance_value = 0.8e-2 ! tolerance -integrate_line_tolerance_type = relative ! special option +!integrate_line_file = SurfaceAnalyze.csv ! data file name +!integrate_line_columns = 0:1 ! columns x:y [time:nPart_in] +!integrate_line_integral_value = 0.0 ! X +!integrate_line_tolerance_value = 1.0e-7 ! tolerance +!integrate_line_tolerance_type = absolute ! special option + +! hdf5 diff +h5diff_file = photoionization_RadiationSurfState.h5 +h5diff_reference_file = reference_RadiationSurfState.h5 +h5diff_data_set = SurfaceData +h5diff_tolerance_value = 10E-2 +h5diff_tolerance_type = relative +!h5diff_max_differences = 5 diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/command_line.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/command_line.ini index 73e8d46c3..6f94bea14 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/command_line.ini +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/command_line.ini @@ -1,2 +1,2 @@ -MPI = 1,2,5,8 +MPI = 1,2,5,8,11,25 cmd_suffix = DSMC.ini diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/parameter.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/parameter.ini index 0c563bf8c..2d9e0fbb8 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/parameter.ini +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/parameter.ini @@ -36,6 +36,7 @@ CalcNumDens = T CalcElectronSEE = T +!Surf-CalcCollCounter = T ! To Activate output of SurfaceAnalyze.csv !CheckExchangeProcs = T ! deactivate the asymmetric communicator check ! =============================================================================== ! ! CALCULATION @@ -62,7 +63,7 @@ Particles-DSMC-CollisMode = 0 Part-NumberOfRandomSeeds = 2 Particles-RandomSeed1 = 1 Particles-RandomSeed2 = 2 -Particles-HaloEpsVelo = 3E7 +Particles-HaloEpsVelo = 3E8 ! 3e7 is enough for single-node run, but multi-node requires 3e8 Particles-DSMC-ElectronicModel = 1 Particles-DSMCElectronicDatabase = Electronic-State-Database.h5 @@ -129,7 +130,7 @@ Part-Species$-MacroParticleFactor = 1e4 ! Change MPF of SEE particles Part-vMPF = T -Part-Species3-Init1-MacroParticleFactor = 1e7,1e8,1e9 +Part-Species3-Init1-MacroParticleFactor = 1e7!,1e8,1e9 ! =============================================================================== ! ! Species1 | H2 diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/reference_RadiationSurfState.h5 b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/reference_RadiationSurfState.h5 new file mode 100644 index 0000000000000000000000000000000000000000..a3eb4a527014288a9d23fa9034e2cd14fce0a999 GIT binary patch literal 6904 zcmeHLT}V_x6rQ{Oux^T*C5jbjKadb+{)7hAn7U}1F0FqL(t2BOy0W|1cJGF*M$|)O zMFmCl|6n~t5cF0r?bt(5)RP2-1eH%g1r`)Wh0V_ycS}SIAA-9h+%w4*K(x#K8S@ zAzOCW)*?Dn>X#Chp?7dBs~kv3Q!!9iTjgX1cYxJ0o*qM-NitmF;6Bx()u@Kbhh$u0 zIpHtmQi#_-<2oG`bJYs6(!X5f4C*~W)sL3Z^Gwq{6h-VT_m|RHU)`vN^3B>%I;sHP zY@9cT*QdE#4)$x{m-+bHt#*4=!>b3Fqg{q-Xr`hvj=u~UcYT`2a5t%bPT_p~_4n$A zPU-VTIE$ttj~Yw)<7tFenhdm@-di4jZCWryIbk8VG=Dqgl{JjYmY}j}s8e&@XFe5K zaV)Mgg#b)zH%-%S^WYIp&r@!%6A20;b$WEP;%=`KLIhS9G z!(u_q-`QO6O#ToFMD_Rk_`O-EUYWF6$u6s3?vvxFpyy2e`Fw+;4K%+d|8eO z%#Zglicd5IDnDfbP8r2L=YY2n{Oxu5$(~NYhX}qr@aUue2;j2>53O_@x_Aok z9)j;h3cr@?fC~s7T~QzDYyezA@RySHFWz(jzE1GQyY^>e=K-1+%5;7)?msv?OqV4c1Oz29br}@l|(@uC1KF3?|zD!@w_XF*=6; literal 0 HcmV?d00001 diff --git a/src/init/piclas_init.f90 b/src/init/piclas_init.f90 index dd045f3cf..817df5a6d 100644 --- a/src/init/piclas_init.f90 +++ b/src/init/piclas_init.f90 @@ -83,6 +83,7 @@ SUBROUTINE InitPiclas(IsLoadBalance) USE MOD_MPI ,ONLY: InitMPIvars #endif /*USE_MPI*/ #ifdef PARTICLES +USE MOD_RayTracing_Init ,ONLY: InitRayTracing USE MOD_DSMC_Vars ,ONLY: UseDSMC USE MOD_Particle_Vars ,ONLY: UseVarTimeStep, VarTimeStep USE MOD_Particle_TimeStep ,ONLY: InitPartTimeStep @@ -218,6 +219,7 @@ SUBROUTINE InitPiclas(IsLoadBalance) CALL initReadIMDdata() CALL read_IMD_results() #endif /* USE_MPI */ +CALL InitRayTracing() #endif /*PARTICLES*/ CALL InitInterfaces() ! set Riemann solver identifier for face connectivity (vacuum, dielectric, PML ...) diff --git a/src/particles/particle_mesh/particle_bgm.f90 b/src/particles/particle_mesh/particle_bgm.f90 index 0a88af1a1..2ad225842 100644 --- a/src/particles/particle_mesh/particle_bgm.f90 +++ b/src/particles/particle_mesh/particle_bgm.f90 @@ -391,8 +391,7 @@ SUBROUTINE BuildBGMAndIdentifyHaloRegion() #if !(USE_HDG) deltaT = CalcTimeStep() #else - CALL abort(__STAMP__& - , 'ManualTimeStep.LLE0.0 -> ManualTimeStep is not defined correctly! ManualTimeStep = ',RealInfoOpt=ManualTimeStep) + CALL abort(__STAMP__, 'ManualTimeStep<=0.0: time step is not defined correctly! ManualTimeStep = ',RealInfoOpt=ManualTimeStep) #endif /*USE_HDG*/ ELSE deltaT=ManualTimeStep diff --git a/src/piclaslib.f90 b/src/piclaslib.f90 index 8d17f0d35..c4aeb51ea 100644 --- a/src/piclaslib.f90 +++ b/src/piclaslib.f90 @@ -60,7 +60,6 @@ SUBROUTINE InitializePiclas() #ifdef PARTICLES USE MOD_Particle_Vars ,ONLY: DoInitialIonization USE MOD_ParticleInit ,ONLY: InitialIonization -USE MOD_RayTracing_Init ,ONLY: InitRayTracing #endif /*PARTICLES*/ ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -207,7 +206,6 @@ SUBROUTINE InitializePiclas() #ifdef PARTICLES ! Ionize the current particles IF(DoInitialIonization) CALL InitialIonization() -CALL InitRayTracing() #endif /*PARTICLES*/ ! Measure init duration diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 index d778ad8d6..57c79aea2 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 @@ -67,7 +67,8 @@ SUBROUTINE WritePhotonSurfSampleToHDF5() CHARACTER(LEN=255) :: H5_Name CHARACTER(LEN=255) :: NodeTypeTemp CHARACTER(LEN=255),ALLOCATABLE :: Str2DVarNames(:) -INTEGER :: nVar2D, GlobalSideID, iSurfSide, OutputCounter, SurfSideNb +INTEGER :: GlobalSideID, iSurfSide, OutputCounter, SurfSideNb +INTEGER,PARAMETER :: nVar2D=2 REAL :: tstart,tend REAL, ALLOCATABLE :: helpArray(:,:) !=================================================================================================================================== @@ -86,7 +87,6 @@ SUBROUTINE WritePhotonSurfSampleToHDF5() END IF FileString=TRIM(ProjectName)//'_RadiationSurfState.h5' -nVar2D = 2 ! Generate skeleton for the file with all relevant data on a single proc (MPIRoot) #if USE_MPI @@ -136,6 +136,8 @@ SUBROUTINE WritePhotonSurfSampleToHDF5() ALLOCATE(helpArray(nVar2D,LocalnBCSides)) OutputCounter = 0 + IPWRITE(UNIT_StdOut,*) "offsetSurfSide =", offsetSurfSide + !IF(myrank.eq.0) read* DO iSurfSide = 1,nComputeNodeSurfSides GlobalSideID = SurfSide2GlobalSide(SURF_SIDEID,iSurfSide) IF(SideInfo_Shared(SIDE_NBSIDEID,GlobalSideID).GT.0) THEN @@ -148,14 +150,17 @@ SUBROUTINE WritePhotonSurfSampleToHDF5() END IF OutputCounter = OutputCounter + 1 helpArray(1,OutputCounter)= PhotonSampWall(1,iSurfSide) + IF(offsetSurfSide.eq.0)THEN + IPWRITE(UNIT_StdOut,*) "iSurfSide,PhotonSampWall(1,iSurfSide) =", iSurfSide,PhotonSampWall(1,iSurfSide) + END IF ! offsetSurfSide.eq.0 ! SurfaceArea should be changed to 1:SurfMesh%nSides if inner sampling sides exist... helpArray(2,OutputCounter)= PhotonSampWall(2,iSurfSide)/SurfSideArea(1,1,iSurfSide) END DO - CALL WriteArrayToHDF5(DataSetName=H5_Name , rank=4 , & - nValGlobal =(/nVar2D , 1_IK, 1_IK , nGlobalSides/) , & - nVal =(/nVar2D , 1_IK, 1_IK , LocalnBCSides/) , & - offset =(/0_IK, 0_IK , 0_IK , offsetSurfSide/), & - collective =.TRUE. ,& + CALL WriteArrayToHDF5(DataSetName=H5_Name , rank=4 , & + nValGlobal =(/nVar2D , 1_IK , 1_IK , nGlobalSides/) , & + nVal =(/nVar2D , 1_IK , 1_IK , LocalnBCSides/) , & + offset =(/0_IK , 0_IK , 0_IK , offsetSurfSide/) , & + collective =.FALSE. ,& RealArray=helpArray(1:nVar2D,1:LocalnBCSides)) DEALLOCATE(helpArray) END ASSOCIATE diff --git a/src/radiation/ray_tracing/raytrace.f90 b/src/radiation/ray_tracing/raytrace.f90 index a09ae2057..32c13cfe1 100644 --- a/src/radiation/ray_tracing/raytrace.f90 +++ b/src/radiation/ray_tracing/raytrace.f90 @@ -50,7 +50,7 @@ SUBROUTINE RayTracing() USE MOD_Output ,ONLY: PrintStatusLineRadiation USE MOD_Mesh_Tools ,ONLY: GetCNElemID USE MOD_part_emission_tools ,ONLY: InsideQuadrilateral -USE MOD_Particle_Boundary_Vars ,ONLY: nComputeNodeSurfSides,PartBound,SurfSide2GlobalSide +USE MOD_Particle_Boundary_Vars ,ONLY: nComputeNodeSurfTotalSides,PartBound,SurfSide2GlobalSide USE MOD_Particle_Mesh_Vars ,ONLY: SideInfo_Shared USE MOD_Particle_Boundary_Tools ,ONLY: StoreBoundaryParticleProperties USE MOD_Particle_Boundary_Vars ,ONLY: PartStateBoundary,nVarPartStateBoundary @@ -68,13 +68,14 @@ SUBROUTINE RayTracing() !INTEGER :: firstElem, lastElem, firstPhoton, lastPhoton !REAL :: Bounds(1:2,1:3) ! Bounds(1,1:3) --> maxCoords , Bounds(2,1:3) --> minCoords !REAL :: RandRot(3,3) !, PartPos(1:3) -LOGICAL :: found +!LOGICAL :: found LOGICAL :: FoundComputeNodeSurfSide INTEGER :: ALLOCSTAT REAL :: RectPower REAL :: StartT,EndT ! Timer !=================================================================================================================================== +IF(RayPartBound.EQ.0) RETURN GETTIME(StartT) SWRITE(UNIT_stdOut,'(A)') ' Start Ray Tracing Calculation ...' @@ -89,15 +90,12 @@ SUBROUTINE RayTracing() RectPower = Ray%IntensityAmplitude * Ray%Area / REAL(NumRays) -!write(*,*) "DONE" -!IF(myrank.eq.0) read*; CALL MPI_BARRIER(MPI_COMM_WORLD,iError) - - ! This array is not de-allocated during load balance as it is only written to .h5 during WriteStateToHDF5() - IF(.NOT.ALLOCATED(PartStateBoundary))THEN - ALLOCATE(PartStateBoundary(1:nVarPartStateBoundary,1:LocRayNum), STAT=ALLOCSTAT) - IF (ALLOCSTAT.NE.0) CALL abort(__STAMP__,'ERROR in particle_init.f90: Cannot allocate PartStateBoundary array!') - PartStateBoundary=0. - END IF ! .NOT.ALLOCATED(PartStateBoundary) +! This array is not de-allocated during load balance as it is only written to .h5 during WriteStateToHDF5() +IF(.NOT.ALLOCATED(PartStateBoundary))THEN + ALLOCATE(PartStateBoundary(1:nVarPartStateBoundary,1:LocRayNum), STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL abort(__STAMP__,'ERROR in particle_init.f90: Cannot allocate PartStateBoundary array!') + PartStateBoundary=0. +END IF ! .NOT.ALLOCATED(PartStateBoundary) DO iRay = 1, LocRayNum IF(MPIroot.AND.(MOD(RayVisCount,RayDisp).EQ.0)) CALL PrintStatusLineRadiation(REAL(RayVisCount),REAL(1),REAL(LocRayNum),.TRUE.) @@ -112,7 +110,7 @@ SUBROUTINE RayTracing() PhotonProps%ElemID = -1 ! Initialize FoundComputeNodeSurfSide = .FALSE. - SurfLoop: DO iSurfSide = 1,nComputeNodeSurfSides + SurfLoop: DO iSurfSide = 1,nComputeNodeSurfTotalSides NonUniqueGlobalSideID = SurfSide2GlobalSide(SURF_SIDEID,iSurfSide) ! Check if the surface side has a neighbor (and is therefore an inner BCs) IF(SideInfo_Shared(SIDE_NBSIDEID,NonUniqueGlobalSideID).LE.0) THEN ! BC side @@ -130,15 +128,15 @@ SUBROUTINE RayTracing() EXIT SurfLoop END IF ! InsideQuadrilateral(X,NonUniqueGlobalSideID) END IF ! SideInfo_Shared(SIDE_NBSIDEID,NonUniqueGlobalSideID).LE.0 - END DO SurfLoop! iSurfSide = 1,nComputeNodeSurfSides + END DO SurfLoop! iSurfSide = 1,nComputeNodeSurfTotalSides - ! Sanity check: nComputeNodeSurfSides > 0 and the correct PartBCIndex for those sides + ! Sanity check: nComputeNodeSurfTotalSides > 0 and the correct PartBCIndex for those sides IF(.NOT.FoundComputeNodeSurfSide)THEN - IPWRITE(UNIT_StdOut,*) ": nComputeNodeSurfSides =", nComputeNodeSurfSides - IPWRITE(UNIT_StdOut,*) ": RayPartBound =", RayPartBound + IPWRITE(UNIT_StdOut,*) ": nComputeNodeSurfTotalSides =", nComputeNodeSurfTotalSides + IPWRITE(UNIT_StdOut,*) ": RayPartBound =", RayPartBound !IPWRITE(UNIT_StdOut,'(I0,A,I0,A)') ": Set Part-Boundary",RayPartBound,"-BoundaryParticleOutput = T" IPWRITE(UNIT_StdOut,*) ": Set Particles-DSMC-CalcSurfaceVal = T" - CALL abort(__STAMP__,'No boundary found in list of nComputeNodeSurfSides for defined RayPartBound!') + CALL abort(__STAMP__,'No boundary found in list of nComputeNodeSurfTotalSides for defined RayPartBound!') END IF ! FoundComputeNodeSurfSide ! Sanity check @@ -181,7 +179,10 @@ SUBROUTINE RayTracing() !photonCount = photonCount + RadTransPhotPerCell(iELem) ! Print 100% -IF(MPIroot) CALL PrintStatusLineRadiation(REAL(RayVisCount),REAL(1),REAL(LocRayNum),.TRUE.) +IF(MPIroot)THEN + CALL PrintStatusLineRadiation(REAL(RayVisCount),REAL(1),REAL(LocRayNum),.TRUE.) + WRITE(UNIT_StdOut,'(A)') " " +END IF CALL WritePhotonSurfSampleToHDF5() diff --git a/src/radiation/ray_tracing/raytrace_ini.f90 b/src/radiation/ray_tracing/raytrace_ini.f90 index 486f05009..e896bbae5 100644 --- a/src/radiation/ray_tracing/raytrace_ini.f90 +++ b/src/radiation/ray_tracing/raytrace_ini.f90 @@ -90,7 +90,7 @@ SUBROUTINE InitRayTracing() RayPartBound = GETINT('RayTracing-PartBound') IF(RayPartBound.EQ.0) RETURN -IF(RayPartBound.LT.0) CALL CollectiveStop(__STAMP__,'RayTracing-PartBound must be > 0!') +IF(RayPartBound.LT.0) CALL CollectiveStop(__STAMP__,'RayTracing-PartBound must be > 0 to activate ray tracing on this boundary!') ! Get ray parameters Ray%PulseDuration = GETREAL('RayTracing-PulseDuration') @@ -103,6 +103,10 @@ SUBROUTINE InitRayTracing() Ray%Power = GETREAL('RayTracing-Power') Ray%Direction = GETREALARRAY('RayTracing-RayDirection',3) +AdaptiveRays = GETLOGICAL('RayTracing-AdaptiveRays') +NumRays = GETINT('RayTracing-NumRays') +RayPosModel = GETINT('RayTracing-RayPosModel') + ASSOCIATE( & E0 => Ray%Energy ,& wb => Ray%WaistRadius ,& @@ -140,14 +144,10 @@ SUBROUTINE InitRayTracing() CALL PrintOption('Temporal pulse width (pulse time 2x tShift) [s]' , 'CALCUL.' , RealOpt=2.0*Ray%tShift) CALL PrintOption('Pulse will end at tActive (pulse final time) [s]' , 'CALCUL.' , RealOpt=Ray%tActive) - +! Allocate arrays ALLOCATE(RayElemPassedEnergy(1:nGlobalElems)) RayElemPassedEnergy=0.0 -AdaptiveRays = GETLOGICAL('RayTracing-AdaptiveRays') -NumRays = GETINT('RayTracing-NumRays') -RayPosModel = GETINT('RayTracing-RayPosModel') - #if USE_MPI CALL Allocate_Shared((/nGlobalElems/),RayElemPassedEnergy_Shared_Win,RayElemPassedEnergy_Shared) CALL MPI_WIN_LOCK_ALL(0,RayElemPassedEnergy_Shared_Win,IERROR) From f169fefd02e103501567980c22a20f4078fe8274 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Tue, 16 May 2023 18:20:26 +0200 Subject: [PATCH 075/495] Fixed indentation and removed needless white spaces --- .../tracking/radtrans_tracking.f90 | 32 +- .../tracking/radtrans_tracking_tools.f90 | 1108 +++++++++-------- 2 files changed, 574 insertions(+), 566 deletions(-) diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 index 82a134ce1..3a10d3e3a 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 @@ -99,7 +99,7 @@ SUBROUTINE PhotonTriaTracking() IF (localSideID.LE.0) CYCLE NbElemID = SideInfo_Shared(SIDE_NBELEMID,TempSideID) IF (NbElemID.LT.0) THEN ! Mortar side - nMortarElems = MERGE(4,2,SideInfo_Shared(SIDE_NBELEMID,TempSideID).EQ.-1) + nMortarElems = MERGE(4,2,SideInfo_Shared(SIDE_NBELEMID,TempSideID).EQ.-1) DO ind = 1, nMortarElems nbSideID = ElemInfo_Shared(ELEM_FIRSTSIDEIND,ElemID) + iLocSide + ind NbElemID = SideInfo_Shared(SIDE_NBELEMID,nbSideID) @@ -179,7 +179,7 @@ SUBROUTINE PhotonTriaTracking() CALL PhotonIntersectionWithSide(LocSidesTemp(ind2),NbElemID,TriNumTemp(ind2), IntersectionPosTemp, .TRUE.) intersecDistVec(1:3) = IntersectionPosTemp(1:3) - PhotonProps%PhotonLastPos(1:3) intersecDist = DOT_PRODUCT(intersecDistVec, intersecDistVec) - ! If the particle is inside the neighboring mortar element, it moved through this side + ! If the particle is inside the neighboring mortar element, it moved through this side ! Ratio is always negative since detM(=detLastPartPos) is negative or zero, i.e. maximum abs is wanted ! The closer the intersected side is to the last particle position the greater the absolute ratio will be IF (intersecDist.LT.minRatio) THEN @@ -246,16 +246,16 @@ SUBROUTINE PhotonTriaTracking() IF (PartBound%PhotonSpecularReflection(PartBound%MapToPartBC(SideInfo_Shared(SIDE_BCID,SideID)))) THEN IF (NrOfThroughSides.LT.2) THEN CALL PerfectPhotonReflection(LocalSide,ElemID,TriNum, IntersectionPos, .FALSE.) - ELSE + ELSE CALL PerfectPhotonReflection(LocalSide,ElemID,TriNum, IntersectionPos, .TRUE.) END IF CALL CalcAbsoprtion(IntersectionPos(1:3),ElemID, DONE) ELSE IF (NrOfThroughSides.LT.2) THEN CALL DiffusePhotonReflection(LocalSide,ElemID,TriNum, IntersectionPos, .FALSE.) - ELSE + ELSE CALL DiffusePhotonReflection(LocalSide,ElemID,TriNum, IntersectionPos, .TRUE.) - END IF + END IF CALL CalcAbsoprtion(IntersectionPos(1:3),ElemID, DONE) IF (.NOT.DONE) CALL CalcWallAbsoprtion(SideID, DONE) END IF @@ -366,7 +366,7 @@ SUBROUTINE Photon2DSymTracking() isMortarSideTemp = .FALSE. nlocSides = ElemInfo_Shared(ELEM_LASTSIDEIND,ElemID) - ElemInfo_Shared(ELEM_FIRSTSIDEIND,ElemID) DO iLocSide=1,nlocSides - isLastSide = .FALSE. + isLastSide = .FALSE. TempSideID = ElemInfo_Shared(ELEM_FIRSTSIDEIND,ElemID) + iLocSide localSideID = SideInfo_Shared(SIDE_LOCALID,TempSideID) ! Side is not one of the 6 local sides @@ -378,9 +378,9 @@ SUBROUTINE Photon2DSymTracking() IF (LastSide.EQ.TempSideID) isLastSide = .TRUE. NbElemID = SideInfo_Shared(SIDE_NBELEMID,TempSideID) IF (NbElemID.LT.0) THEN ! Mortar side - nMortarElems = MERGE(4,2,SideInfo_Shared(SIDE_NBELEMID,TempSideID).EQ.-1) + nMortarElems = MERGE(4,2,SideInfo_Shared(SIDE_NBELEMID,TempSideID).EQ.-1) DO ind = 1, nMortarElems - isLastSide = .FALSE. + isLastSide = .FALSE. nbSideID = ElemInfo_Shared(ELEM_FIRSTSIDEIND,ElemID) + iLocSide + ind NbElemID = SideInfo_Shared(SIDE_NBELEMID,nbSideID) ! If small mortar element not defined, abort. Every available information on the compute-node is kept in shared memory, so @@ -391,8 +391,8 @@ SUBROUTINE Photon2DSymTracking() nbSideID = SideInfo_Shared(SIDE_NBSIDEID,nbSideID) NblocSideID = SideInfo_Shared(SIDE_LOCALID,nbSideID) ThroughSide = .FALSE. - CALL PhotonIntersectionWithSide2D(NblocSideID,NbElemID,ThroughSide,IntersectionPos, isLastSide,Distance) - IF (ThroughSide) THEN + CALL PhotonIntersectionWithSide2D(NblocSideID,NbElemID,ThroughSide,IntersectionPos, isLastSide,Distance) + IF (ThroughSide) THEN ! Store the information for this side for future checks, if this side was already treated oldElemIsMortar = .TRUE. NrOfThroughSides = NrOfThroughSides + 1 @@ -452,7 +452,7 @@ SUBROUTINE Photon2DSymTracking() CASE(1) !PartBound%OpenBC) CALL CalcAbsoprtion(IntersectionPos(1:3),ElemID, DONE) DONE = .TRUE. - IF (RadObservationPointMethod.EQ.1) THEN + IF (RadObservationPointMethod.EQ.1) THEN IF (PointInObsCone(IntersectionPos(1:3))) THEN IF (PhotonIntersectSensor(IntersectionPos(1:3), PhotonProps%PhotonDirection(1:3))) THEN RadObservation_Emission(PhotonProps%WaveLength) = RadObservation_Emission(PhotonProps%WaveLength) + PhotonProps%PhotonEnergy @@ -469,16 +469,16 @@ SUBROUTINE Photon2DSymTracking() CASE(2) IF (PartBound%PhotonSpecularReflection(PartBound%MapToPartBC(SideInfo_Shared(SIDE_BCID,SideID)))) THEN CALL CalcAbsoprtion(IntersectionPos(1:3),ElemID, DONE) - IF (.NOT.DONE) CALL PerfectPhotonReflection2D(LocalSide,ElemID, IntersectionPos) + IF (.NOT.DONE) CALL PerfectPhotonReflection2D(LocalSide,ElemID, IntersectionPos) ELSE - CALL CalcAbsoprtion(IntersectionPos(1:3),ElemID, DONE) + CALL CalcAbsoprtion(IntersectionPos(1:3),ElemID, DONE) IF (.NOT.DONE) CALL CalcWallAbsoprtion(SideID, DONE) - IF (.NOT.DONE) CALL DiffusePhotonReflection2D(LocalSide,ElemID, IntersectionPos) + IF (.NOT.DONE) CALL DiffusePhotonReflection2D(LocalSide,ElemID, IntersectionPos) END IF LastSide = SideID CASE DEFAULT CALL abort(__STAMP__,' ERROR: PartBound not associated!. (unknown case)',999,999.) - END SELECT !PartBound%MapToPartBC(BC(SideID) + END SELECT !PartBound%MapToPartBC(BC(SideID) ELSE ! BC(SideID).LE.0 IF (oldElemIsMortar) THEN CALL CalcAbsoprtion(IntersectionPos(1:3),ElemID, DONE) @@ -490,7 +490,7 @@ SUBROUTINE Photon2DSymTracking() LastSide = SideInfo_Shared(SIDE_NBSIDEID,SideID) END IF END IF ! BC(SideID).GT./.LE. 0 - + IF (.NOT.DONE) CALL RotatePhotonIn2DPlane(IntersectionPos(1:3)) IF (ElemID.LT.1) THEN CALL abort(__STAMP__ ,'ERROR: Element not defined! Please increase the size of the halo region (HaloEpsVelo)!') diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 index aa2b979de..24a0dda6f 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 @@ -240,7 +240,7 @@ SUBROUTINE PhotonIntersectionWithSide2D(iLocSide,Element,ThroughSide,Intersectio INTEGER,INTENT(IN) :: iLocSide, Element REAL, INTENT(OUT) :: IntersectionPos(3) REAL, INTENT(OUT) :: Distance -LOGICAL, INTENT(IN) :: isLastSide +LOGICAL, INTENT(IN) :: isLastSide !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES INTEGER :: CNElemID @@ -248,123 +248,123 @@ SUBROUTINE PhotonIntersectionWithSide2D(iLocSide,Element,ThroughSide,Intersectio REAL :: l1,S1,l2,S2,l,S REAL :: beta, alpha, deltay, a, b, c, tmpsqrt !=================================================================================================================================== - CNElemID = GetCNElemID(Element) - ThroughSide = .FALSE. - - xNode1 = NodeCoords_Shared(1,ElemSideNodeID2D_Shared(1,iLocSide, CNElemID)) - yNode1 = NodeCoords_Shared(2,ElemSideNodeID2D_Shared(1,iLocSide, CNElemID)) - xNode2 = NodeCoords_Shared(1,ElemSideNodeID2D_Shared(2,iLocSide, CNElemID)) - yNode2 = NodeCoords_Shared(2,ElemSideNodeID2D_Shared(2,iLocSide, CNElemID)) - - x_photon_start=PhotonProps%PhotonLastPos(1) - y_photon_start=PhotonProps%PhotonLastPos(2) - - sx=PhotonProps%PhotonDirection(1) - sy=PhotonProps%PhotonDirection(2) - sz=PhotonProps%PhotonDirection(3) - - IF (sx .EQ. 0.0) THEN - l = (x_photon_start-xNode1)/(xNode2-xNode1) - a = sy*sy + sz*sz - b = 2*sy*y_photon_start - c = y_photon_start*y_photon_start - yNode1*yNode1 + 2.*l*yNode1*yNode1 - l*l*yNode1*yNode1 & - - 2.*yNode1*yNode2*l + 2.*yNode1*yNode2*l*l - yNode2*yNode2*l*l - tmpsqrt = b*b - 4.*a*c - IF (tmpsqrt.LE.0.0) THEN - RETURN +CNElemID = GetCNElemID(Element) +ThroughSide = .FALSE. + +xNode1 = NodeCoords_Shared(1,ElemSideNodeID2D_Shared(1,iLocSide, CNElemID)) +yNode1 = NodeCoords_Shared(2,ElemSideNodeID2D_Shared(1,iLocSide, CNElemID)) +xNode2 = NodeCoords_Shared(1,ElemSideNodeID2D_Shared(2,iLocSide, CNElemID)) +yNode2 = NodeCoords_Shared(2,ElemSideNodeID2D_Shared(2,iLocSide, CNElemID)) + +x_photon_start=PhotonProps%PhotonLastPos(1) +y_photon_start=PhotonProps%PhotonLastPos(2) + +sx=PhotonProps%PhotonDirection(1) +sy=PhotonProps%PhotonDirection(2) +sz=PhotonProps%PhotonDirection(3) + +IF (sx .EQ. 0.0) THEN + l = (x_photon_start-xNode1)/(xNode2-xNode1) + a = sy*sy + sz*sz + b = 2*sy*y_photon_start + c = y_photon_start*y_photon_start - yNode1*yNode1 + 2.*l*yNode1*yNode1 - l*l*yNode1*yNode1 & + - 2.*yNode1*yNode2*l + 2.*yNode1*yNode2*l*l - yNode2*yNode2*l*l + tmpsqrt = b*b - 4.*a*c + IF (tmpsqrt.LE.0.0) THEN + RETURN + END IF + S1 = (-b+SQRT(tmpsqrt))/(2.*a) + S2 = (-b-SQRT(tmpsqrt))/(2.*a) + + IF(isLastSide) THEN + IF (ALMOSTEQUAL(S1,S2)) THEN + RETURN ! TODO + ELSE IF (ABS(S1).GT.ABS(S2)) THEN + S=S1 + ELSE + S=S2 END IF - S1 = (-b+SQRT(tmpsqrt))/(2.*a) - S2 = (-b-SQRT(tmpsqrt))/(2.*a) - - IF(isLastSide) THEN - IF (ALMOSTEQUAL(S1,S2)) THEN - RETURN ! TODO - ELSE IF (ABS(S1).GT.ABS(S2)) THEN - S=S1 - ELSE - S=S2 - END IF + ELSE + IF (S1.LE.0.0) THEN + S = S2 ELSE - IF (S1.LE.0.0) THEN - S = S2 - ELSE - IF (S2.GT.0.0) THEN - IF(S2.GT.S1) THEN - S = S1 - ELSE - S = S2 - END IF - ELSE + IF (S2.GT.0.0) THEN + IF(S2.GT.S1) THEN S = S1 + ELSE + S = S2 END IF + ELSE + S = S1 END IF END IF + END IF - ELSE - alpha = (xNode1 - x_photon_start) / sx - beta = (xNode2 - xNode1) / sx - deltay = (yNode2 - yNode1) - a = beta*beta*sy*sy - deltay*deltay + beta*beta*sz*sz - b = 2.*beta*sy*y_photon_start + 2.*alpha*beta*sy*sy - 2.*deltay*yNode1 + 2.*alpha*beta*sz*sz - c = y_photon_start*y_photon_start - yNode1*yNode1 + 2.*alpha*sy*y_photon_start + alpha*alpha*sy*sy + sz*sz*alpha*alpha - tmpsqrt = b*b - 4.*a*c - IF (tmpsqrt.LE.0.0) THEN +ELSE + alpha = (xNode1 - x_photon_start) / sx + beta = (xNode2 - xNode1) / sx + deltay = (yNode2 - yNode1) + a = beta*beta*sy*sy - deltay*deltay + beta*beta*sz*sz + b = 2.*beta*sy*y_photon_start + 2.*alpha*beta*sy*sy - 2.*deltay*yNode1 + 2.*alpha*beta*sz*sz + c = y_photon_start*y_photon_start - yNode1*yNode1 + 2.*alpha*sy*y_photon_start + alpha*alpha*sy*sy + sz*sz*alpha*alpha + tmpsqrt = b*b - 4.*a*c + IF (tmpsqrt.LE.0.0) THEN + RETURN + END IF + l1 = (-b + SQRT(tmpsqrt))/(2.*a) + S1 = (xNode1-x_photon_start+(xNode2-xNode1)*l1)/sx + l2 = (-b - SQRT(tmpsqrt))/(2.*a) + S2 = (xNode1-x_photon_start+(xNode2-xNode1)*l2)/sx + + IF (isLastSide) THEN + IF (ALMOSTEQUAL(S1,S2).AND.ALMOSTEQUAL(ABS(l1),ABS(l2))) THEN RETURN - END IF - l1 = (-b + SQRT(tmpsqrt))/(2.*a) - S1 = (xNode1-x_photon_start+(xNode2-xNode1)*l1)/sx - l2 = (-b - SQRT(tmpsqrt))/(2.*a) - S2 = (xNode1-x_photon_start+(xNode2-xNode1)*l2)/sx - - IF (isLastSide) THEN - IF (ALMOSTEQUAL(S1,S2).AND.ALMOSTEQUAL(ABS(l1),ABS(l2))) THEN - RETURN - ELSE IF (ALMOSTEQUAL(S1,S2)) THEN - IF (ABS(l1).GT.ABS(l2)) THEN - l=l1; S=S1 - ELSE - l=l2; S=S2 - END IF - ELSE IF (ALMOSTZERO(S1).AND.ALMOSTZERO(S2)) THEN - IF (ABS(l1).GT.ABS(l2)) THEN - l=l1; S=S1 - ELSE - l=l2; S=S2 - END IF - ELSE IF (ABS(S1).GT.ABS(S2)) THEN !though same spot again, caused by numerical inaccuray (discard shorter solution) + ELSE IF (ALMOSTEQUAL(S1,S2)) THEN + IF (ABS(l1).GT.ABS(l2)) THEN l=l1; S=S1 ELSE l=l2; S=S2 END IF - ELSE IF ((l1.LE.0.0).OR.(l1.GE.1.0)) THEN !if 1 is not a valid intersection -> 2 - l = l2; S = S2 - ELSE !1 is valid intersection - IF ((S1.LE.0.0)) THEN !1 would be moving backwards -> 2 - l = l2; S = S2 + ELSE IF (ALMOSTZERO(S1).AND.ALMOSTZERO(S2)) THEN + IF (ABS(l1).GT.ABS(l2)) THEN + l=l1; S=S1 ELSE - IF ((l2.GT.0.0).AND.(l2.LT.1.0).AND.(S2.GT.0.0)) THEN !1 and 2 valid -> chose shorter one - IF (S2.GT.S1) THEN - l=l1; S=S1 - ELSE - l=l2; S=S2 - END IF - ELSE !1 is only valid intersection -> 1 + l=l2; S=S2 + END IF + ELSE IF (ABS(S1).GT.ABS(S2)) THEN !though same spot again, caused by numerical inaccuray (discard shorter solution) + l=l1; S=S1 + ELSE + l=l2; S=S2 + END IF + ELSE IF ((l1.LE.0.0).OR.(l1.GE.1.0)) THEN !if 1 is not a valid intersection -> 2 + l = l2; S = S2 + ELSE !1 is valid intersection + IF ((S1.LE.0.0)) THEN !1 would be moving backwards -> 2 + l = l2; S = S2 + ELSE + IF ((l2.GT.0.0).AND.(l2.LT.1.0).AND.(S2.GT.0.0)) THEN !1 and 2 valid -> chose shorter one + IF (S2.GT.S1) THEN l=l1; S=S1 + ELSE + l=l2; S=S2 END IF + ELSE !1 is only valid intersection -> 1 + l=l1; S=S1 END IF END IF - END IF - IF((S .GT. 0.0) .AND. (0.0 .LE. l) .AND. (l .LE. 1.0)) THEN - ThroughSide = .TRUE. - IntersectionPos(1) = PhotonProps%PhotonLastPos(1) + S*sx - IntersectionPos(2) = PhotonProps%PhotonLastPos(2) + S*sy - IntersectionPos(3) = S*sz - Distance = S - END IF - +END IF + +IF((S .GT. 0.0) .AND. (0.0 .LE. l) .AND. (l .LE. 1.0)) THEN + ThroughSide = .TRUE. + IntersectionPos(1) = PhotonProps%PhotonLastPos(1) + S*sx + IntersectionPos(2) = PhotonProps%PhotonLastPos(2) + S*sy + IntersectionPos(3) = S*sz + Distance = S +END IF + END SUBROUTINE PhotonIntersectionWithSide2D @@ -389,93 +389,94 @@ SUBROUTINE PhotonIntersectionWithSide2DDir(iLocSide,CNElemID,ThroughSide,StartPo REAL :: l1,S1,l2,S2,l,S REAL :: beta, alpha, deltay, a, b, c, tmpsqrt !=================================================================================================================================== - ThroughSide = .FALSE. - - xNode1 = NodeCoords_Shared(1,ElemSideNodeID2D_Shared(1,iLocSide, CNElemID)) - yNode1 = NodeCoords_Shared(2,ElemSideNodeID2D_Shared(1,iLocSide, CNElemID)) - xNode2 = NodeCoords_Shared(1,ElemSideNodeID2D_Shared(2,iLocSide, CNElemID)) - yNode2 = NodeCoords_Shared(2,ElemSideNodeID2D_Shared(2,iLocSide, CNElemID)) - - x_photon_start=StartPoint(1) - y_photon_start=StartPoint(2) - - sx=Dir(1) - sy=Dir(2) - sz=Dir(3) - - IF (sx .EQ. 0.0) THEN - l = (x_photon_start-xNode1)/(xNode2-xNode1) - a = sy*sy + sz*sz - b = 2*sy*y_photon_start - c = y_photon_start*y_photon_start - yNode1*yNode1 + 2.*l*yNode1*yNode1 - l*l*yNode1*yNode1 & - - 2.*yNode1*yNode2*l + 2.*yNode1*yNode2*l*l - yNode2*yNode2*l*l - tmpsqrt = b*b - 4.*a*c - IF (tmpsqrt.LE.0.0) THEN - RETURN - END IF - S1 = (-b+SQRT(tmpsqrt))/(2.*a) - S2 = (-b-SQRT(tmpsqrt))/(2.*a) +ThroughSide = .FALSE. - IF (S1.LE.0.0) THEN - S = S2 - ELSE - IF (S2.GT.0.0) THEN - IF(S2.GT.S1) THEN - S = S1 - ELSE - S = S2 - END IF - ELSE +xNode1 = NodeCoords_Shared(1,ElemSideNodeID2D_Shared(1,iLocSide, CNElemID)) +yNode1 = NodeCoords_Shared(2,ElemSideNodeID2D_Shared(1,iLocSide, CNElemID)) +xNode2 = NodeCoords_Shared(1,ElemSideNodeID2D_Shared(2,iLocSide, CNElemID)) +yNode2 = NodeCoords_Shared(2,ElemSideNodeID2D_Shared(2,iLocSide, CNElemID)) + +x_photon_start=StartPoint(1) +y_photon_start=StartPoint(2) + +sx=Dir(1) +sy=Dir(2) +sz=Dir(3) + +IF (sx .EQ. 0.0) THEN + l = (x_photon_start-xNode1)/(xNode2-xNode1) + a = sy*sy + sz*sz + b = 2*sy*y_photon_start + c = y_photon_start*y_photon_start - yNode1*yNode1 + 2.*l*yNode1*yNode1 - l*l*yNode1*yNode1 & + - 2.*yNode1*yNode2*l + 2.*yNode1*yNode2*l*l - yNode2*yNode2*l*l + tmpsqrt = b*b - 4.*a*c + IF (tmpsqrt.LE.0.0) THEN + RETURN + END IF + S1 = (-b+SQRT(tmpsqrt))/(2.*a) + S2 = (-b-SQRT(tmpsqrt))/(2.*a) + + IF (S1.LE.0.0) THEN + S = S2 + ELSE + IF (S2.GT.0.0) THEN + IF(S2.GT.S1) THEN S = S1 + ELSE + S = S2 END IF + ELSE + S = S1 END IF - ELSE - alpha = (xNode1 - x_photon_start) / sx - beta = (xNode2 - xNode1) / sx - deltay = (yNode2 - yNode1) - a = beta*beta*sy*sy - deltay*deltay + beta*beta*sz*sz - b = 2.*beta*sy*y_photon_start + 2.*alpha*beta*sy*sy - 2.*deltay*yNode1 + 2.*alpha*beta*sz*sz - c = y_photon_start*y_photon_start - yNode1*yNode1 + 2.*alpha*sy*y_photon_start + alpha*alpha*sy*sy + sz*sz*alpha*alpha - tmpsqrt = b*b - 4.*a*c - IF (tmpsqrt.LE.0.0) THEN - RETURN - END IF - l1 = (-b + SQRT(tmpsqrt))/(2.*a) - S1 = (xNode1-x_photon_start+(xNode2-xNode1)*l1)/sx - l2 = (-b - SQRT(tmpsqrt))/(2.*a) - S2 = (xNode1-x_photon_start+(xNode2-xNode1)*l2)/sx - - IF ((l1.LE.0.0).OR.(l1.GE.1.0)) THEN !if 1 is not a valid intersection -> 2 + END IF +ELSE + alpha = (xNode1 - x_photon_start) / sx + beta = (xNode2 - xNode1) / sx + deltay = (yNode2 - yNode1) + a = beta*beta*sy*sy - deltay*deltay + beta*beta*sz*sz + b = 2.*beta*sy*y_photon_start + 2.*alpha*beta*sy*sy - 2.*deltay*yNode1 + 2.*alpha*beta*sz*sz + c = y_photon_start*y_photon_start - yNode1*yNode1 + 2.*alpha*sy*y_photon_start + alpha*alpha*sy*sy + sz*sz*alpha*alpha + tmpsqrt = b*b - 4.*a*c + IF (tmpsqrt.LE.0.0) THEN + RETURN + END IF + l1 = (-b + SQRT(tmpsqrt))/(2.*a) + S1 = (xNode1-x_photon_start+(xNode2-xNode1)*l1)/sx + l2 = (-b - SQRT(tmpsqrt))/(2.*a) + S2 = (xNode1-x_photon_start+(xNode2-xNode1)*l2)/sx + + IF ((l1.LE.0.0).OR.(l1.GE.1.0)) THEN !if 1 is not a valid intersection -> 2 + l = l2; S = S2 + ELSE !1 is valid intersection + IF ((S1.LE.0.0)) THEN !1 would be moving backwards -> 2 l = l2; S = S2 - ELSE !1 is valid intersection - IF ((S1.LE.0.0)) THEN !1 would be moving backwards -> 2 - l = l2; S = S2 - ELSE - IF ((l2.GT.0.0).AND.(l2.LT.1.0).AND.(S2.GT.0.0)) THEN !1 and 2 valid -> chose shorter one - IF (S2.GT.S1) THEN - l=l1; S=S1 - ELSE - l=l2; S=S2 - END IF - ELSE !1 is only valid intersection -> 1 + ELSE + IF ((l2.GT.0.0).AND.(l2.LT.1.0).AND.(S2.GT.0.0)) THEN !1 and 2 valid -> chose shorter one + IF (S2.GT.S1) THEN l=l1; S=S1 + ELSE + l=l2; S=S2 END IF + ELSE !1 is only valid intersection -> 1 + l=l1; S=S1 END IF END IF - END IF - IF((S .GT. 0.0) .AND. (0.0 .LE. l) .AND. (l .LE. 1.0)) THEN - ThroughSide = .TRUE. - IF (PRESENT(IntersectionPos)) THEN - IntersectionPos(1) = StartPoint(1) + S*sx - IntersectionPos(2) = StartPoint(2) + S*sy - IntersectionPos(3) = S*sz - Distance = S - END IF - END IF +END IF + +IF((S .GT. 0.0) .AND. (0.0 .LE. l) .AND. (l .LE. 1.0)) THEN + ThroughSide = .TRUE. + IF (PRESENT(IntersectionPos)) THEN + IntersectionPos(1) = StartPoint(1) + S*sx + IntersectionPos(2) = StartPoint(2) + S*sy + IntersectionPos(3) = S*sz + Distance = S + END IF +END IF END SUBROUTINE PhotonIntersectionWithSide2DDir + SUBROUTINE RotatePhotonIn2DPlane(IntersectionPos) !=================================================================================================================================== !> Routine to check whether a photon crossed the given side. @@ -491,26 +492,25 @@ SUBROUTINE RotatePhotonIn2DPlane(IntersectionPos) ! LOCAL VARIABLES REAL :: NewYPho, NewYVelo !=================================================================================================================================== -PhotonProps%PhotonLastPos(1:3) = IntersectionPos(1:3) +PhotonProps%PhotonLastPos(1:3) = IntersectionPos(1:3) NewYPho = SQRT(PhotonProps%PhotonLastPos(2)**2 + PhotonProps%PhotonLastPos(3)**2) ! Rotation: Vy' = Vy * cos(alpha) + Vz * sin(alpha) = Vy * y/y' + Vz * z/y' ! Vz' = - Vy * sin(alpha) + Vz * cos(alpha) = - Vy * z/y' + Vz * y/y' ! Right-hand system, using new y and z positions after tracking, position vector and velocity vector DO NOT have to ! coincide (as opposed to Bird 1994, p. 391, where new positions are calculated with the velocity vector) -NewYVelo = (PhotonProps%PhotonDirection(2)*PhotonProps%PhotonLastPos(2) & +NewYVelo = (PhotonProps%PhotonDirection(2)*PhotonProps%PhotonLastPos(2) & + PhotonProps%PhotonDirection(3)*PhotonProps%PhotonLastPos(3))/NewYPho -PhotonProps%PhotonDirection(3) = (-PhotonProps%PhotonDirection(2)*PhotonProps%PhotonLastPos(3) & +PhotonProps%PhotonDirection(3) = (-PhotonProps%PhotonDirection(2)*PhotonProps%PhotonLastPos(3) & + PhotonProps%PhotonDirection(3)*PhotonProps%PhotonLastPos(2))/NewYPho PhotonProps%PhotonLastPos(2) = NewYPho PhotonProps%PhotonLastPos(3) = 0.0 PhotonProps%PhotonDirection(2) = NewYVelo PhotonProps%PhotonPos(1:3) = PhotonProps%PhotonLastPos(1:3) - -END SUBROUTINE RotatePhotonIn2DPlane +END SUBROUTINE RotatePhotonIn2DPlane -SUBROUTINE PhotonIntersectionWithSide(iLocSide,Element,TriNum, IntersectionPos, IsMortar) +SUBROUTINE PhotonIntersectionWithSide(iLocSide,Element,TriNum, IntersectionPos, IsMortar) !--------------------------------------------------------------------------------------------------! !Based on PerfectReflection3D !--------------------------------------------------------------------------------------------------! @@ -518,92 +518,92 @@ SUBROUTINE PhotonIntersectionWithSide(iLocSide,Element,TriNum, IntersectionPos, USE MOD_Photon_TrackingVars ,ONLY: PhotonProps USE MOD_Mesh_Tools ,ONLY: GetCNElemID !--------------------------------------------------------------------------------------------------! - IMPLICIT NONE ! + IMPLICIT NONE !--------------------------------------------------------------------------------------------------! -! argument list declaration ! - INTEGER,INTENT(IN) :: iLocSide ! - INTEGER,INTENT(IN) :: Element ! - INTEGER,INTENT(IN) :: TriNum ! - REAL,INTENT(OUT) :: IntersectionPos(1:3) - LOGICAL, INTENT(IN), OPTIONAL :: IsMortar -! Local variable declaration ! - INTEGER :: CNElemID - INTEGER :: Node1, Node2 ! - REAL :: PoldX, PoldY, PoldZ, nx, ny, nz, nVal ! - REAL :: bx,by,bz, ax,ay,az, dist - REAL :: xNod, yNod, zNod,IntersecPara ! - REAL :: Vector1(1:3), Vector2(1:3), VectorShift(1:3) ! +! argument list declaration +INTEGER,INTENT(IN) :: iLocSide +INTEGER,INTENT(IN) :: Element +INTEGER,INTENT(IN) :: TriNum +REAL,INTENT(OUT) :: IntersectionPos(1:3) +LOGICAL, INTENT(IN), OPTIONAL :: IsMortar +! Local variable declaration +INTEGER :: CNElemID +INTEGER :: Node1, Node2 +REAL :: PoldX, PoldY, PoldZ, nx, ny, nz, nVal +REAL :: bx,by,bz, ax,ay,az, dist +REAL :: xNod, yNod, zNod,IntersecPara +REAL :: Vector1(1:3), Vector2(1:3), VectorShift(1:3) !--------------------------------------------------------------------------------------------------! !--------------------------------------------------------------------------------------------------! - CNElemID = GetCNElemID(Element) - - PoldX = PhotonProps%PhotonLastPos(1) - PoldY = PhotonProps%PhotonLastPos(2) - PoldZ = PhotonProps%PhotonLastPos(3) +CNElemID = GetCNElemID(Element) + +PoldX = PhotonProps%PhotonLastPos(1) +PoldY = PhotonProps%PhotonLastPos(2) +PoldZ = PhotonProps%PhotonLastPos(3) - xNod = NodeCoords_Shared(1,ElemSideNodeID_Shared(1,iLocSide,CNElemID)+1) - yNod = NodeCoords_Shared(2,ElemSideNodeID_Shared(1,iLocSide,CNElemID)+1) - zNod = NodeCoords_Shared(3,ElemSideNodeID_Shared(1,iLocSide,CNElemID)+1) +xNod = NodeCoords_Shared(1,ElemSideNodeID_Shared(1,iLocSide,CNElemID)+1) +yNod = NodeCoords_Shared(2,ElemSideNodeID_Shared(1,iLocSide,CNElemID)+1) +zNod = NodeCoords_Shared(3,ElemSideNodeID_Shared(1,iLocSide,CNElemID)+1) - !---- Calculate normal vector: - IF(PRESENT(IsMortar)) THEN - Node1 = TriNum+2 ! normal = cross product of 1-2 and 1-3 for first triangle - Node2 = TriNum+1 ! and 1-3 and 1-4 for second triangle - ELSE - Node1 = TriNum+1 ! normal = cross product of 1-2 and 1-3 for first triangle - Node2 = TriNum+2 ! and 1-3 and 1-4 for second triangle - END IF +!---- Calculate normal vector: +IF(PRESENT(IsMortar)) THEN + Node1 = TriNum+2 ! normal = cross product of 1-2 and 1-3 for first triangle + Node2 = TriNum+1 ! and 1-3 and 1-4 for second triangle +ELSE + Node1 = TriNum+1 ! normal = cross product of 1-2 and 1-3 for first triangle + Node2 = TriNum+2 ! and 1-3 and 1-4 for second triangle +END IF - Vector1(1) = NodeCoords_Shared(1,ElemSideNodeID_Shared(Node1,iLocSide,CNElemID)+1) - xNod - Vector1(2) = NodeCoords_Shared(2,ElemSideNodeID_Shared(Node1,iLocSide,CNElemID)+1) - yNod - Vector1(3) = NodeCoords_Shared(3,ElemSideNodeID_Shared(Node1,iLocSide,CNElemID)+1) - zNod +Vector1(1) = NodeCoords_Shared(1,ElemSideNodeID_Shared(Node1,iLocSide,CNElemID)+1) - xNod +Vector1(2) = NodeCoords_Shared(2,ElemSideNodeID_Shared(Node1,iLocSide,CNElemID)+1) - yNod +Vector1(3) = NodeCoords_Shared(3,ElemSideNodeID_Shared(Node1,iLocSide,CNElemID)+1) - zNod - Vector2(1) = NodeCoords_Shared(1,ElemSideNodeID_Shared(Node2,iLocSide,CNElemID)+1) - xNod - Vector2(2) = NodeCoords_Shared(2,ElemSideNodeID_Shared(Node2,iLocSide,CNElemID)+1) - yNod - Vector2(3) = NodeCoords_Shared(3,ElemSideNodeID_Shared(Node2,iLocSide,CNElemID)+1) - zNod +Vector2(1) = NodeCoords_Shared(1,ElemSideNodeID_Shared(Node2,iLocSide,CNElemID)+1) - xNod +Vector2(2) = NodeCoords_Shared(2,ElemSideNodeID_Shared(Node2,iLocSide,CNElemID)+1) - yNod +Vector2(3) = NodeCoords_Shared(3,ElemSideNodeID_Shared(Node2,iLocSide,CNElemID)+1) - zNod - nx = Vector1(2) * Vector2(3) - Vector1(3) * Vector2(2) - ny = Vector1(3) * Vector2(1) - Vector1(1) * Vector2(3) - nz = Vector1(1) * Vector2(2) - Vector1(2) * Vector2(1) +nx = Vector1(2) * Vector2(3) - Vector1(3) * Vector2(2) +ny = Vector1(3) * Vector2(1) - Vector1(1) * Vector2(3) +nz = Vector1(1) * Vector2(2) - Vector1(2) * Vector2(1) - nVal = SQRT(nx*nx + ny*ny + nz*nz) +nVal = SQRT(nx*nx + ny*ny + nz*nz) - nx = nx/nVal - ny = ny/nVal - nz = nz/nVal +nx = nx/nVal +ny = ny/nVal +nz = nz/nVal - !---- Calculate Intersection +!---- Calculate Intersection - bx = PoldX - xNod - by = PoldY - yNod - bz = PoldZ - zNod +bx = PoldX - xNod +by = PoldY - yNod +bz = PoldZ - zNod - ax = bx - nx * (bx * nx + by * ny + bz * nz) - ay = by - ny * (bx * nx + by * ny + bz * nz) - az = bz - nz * (bx * nx + by * ny + bz * nz) +ax = bx - nx * (bx * nx + by * ny + bz * nz) +ay = by - ny * (bx * nx + by * ny + bz * nz) +az = bz - nz * (bx * nx + by * ny + bz * nz) - dist = SQRT(((ay * bz - az * by) * (ay * bz - az * by) + & - (az * bx - ax * bz) * (az * bx - ax * bz) + & - (ax * by - ay * bx) * (ax * by - ay * bx))/ & - (ax * ax + ay * ay + az * az)) +dist = SQRT(((ay * bz - az * by) * (ay * bz - az * by) + & + (az * bx - ax * bz) * (az * bx - ax * bz) + & + (ax * by - ay * bx) * (ax * by - ay * bx))/ & + (ax * ax + ay * ay + az * az)) - ! If vector from old point to new point goes through the node, a will be x_photon_startro - ! dist is then simply length of vector b instead of |axb|/|a| - IF (dist.NE.dist) dist = SQRT(bx*bx+by*by+bz*bz) +! If vector from old point to new point goes through the node, a will be x_photon_startro +! dist is then simply length of vector b instead of |axb|/|a| +IF (dist.NE.dist) dist = SQRT(bx*bx+by*by+bz*bz) - VectorShift(1) = PhotonProps%PhotonDirection(1) - VectorShift(2) = PhotonProps%PhotonDirection(2) - VectorShift(3) = PhotonProps%PhotonDirection(3) +VectorShift(1) = PhotonProps%PhotonDirection(1) +VectorShift(2) = PhotonProps%PhotonDirection(2) +VectorShift(3) = PhotonProps%PhotonDirection(3) - IntersecPara = VectorShift(1) * nx + VectorShift(2) * ny + VectorShift(3) * nz - IntersecPara = dist / IntersecPara +IntersecPara = VectorShift(1) * nx + VectorShift(2) * ny + VectorShift(3) * nz +IntersecPara = dist / IntersecPara - IntersectionPos(1) = PoldX + IntersecPara * VectorShift(1) - IntersectionPos(2) = PoldY + IntersecPara * VectorShift(2) - IntersectionPos(3) = PoldZ + IntersecPara * VectorShift(3) +IntersectionPos(1) = PoldX + IntersecPara * VectorShift(1) +IntersectionPos(2) = PoldY + IntersecPara * VectorShift(2) +IntersectionPos(3) = PoldZ + IntersecPara * VectorShift(3) - RETURN +RETURN END SUBROUTINE PhotonIntersectionWithSide @@ -615,75 +615,77 @@ SUBROUTINE CalcAbsoprtionMC(IntersectionPos,Element, DONE) USE MOD_RadiationTrans_Vars ,ONLY: RadiationElemAbsEnergy USE MOD_Radiation_Vars ,ONLY: Radiation_Absorption_spec !--------------------------------------------------------------------------------------------------! - IMPLICIT NONE ! +IMPLICIT NONE !--------------------------------------------------------------------------------------------------! -! argument list declaration ! - INTEGER, INTENT(IN) :: Element - REAL, INTENT(IN) :: IntersectionPos(3) - LOGICAL, INTENT(OUT) :: DONE -! Local variable declaration ! +! argument list declaration +INTEGER, INTENT(IN) :: Element +REAL, INTENT(IN) :: IntersectionPos(3) +LOGICAL, INTENT(OUT) :: DONE +! Local variable declaration !--------------------------------------------------------------------------------------------------! - REAL :: iRan, DistanceVec(3), Distance +REAL :: iRan, DistanceVec(3), Distance !--------------------------------------------------------------------------------------------------! - DistanceVec(1:3) = PhotonProps%PhotonPos(1:3) - IntersectionPos(1:3) - Distance = SQRT(DistanceVec(1)*DistanceVec(1) + DistanceVec(2)*DistanceVec(2) + DistanceVec(3)*DistanceVec(3)) - CALL RANDOM_NUMBER(iRan) - IF (-LOG(iRan).LT.(Distance*Radiation_Absorption_Spec(PhotonProps%WaveLength,Element))) THEN - RadiationElemAbsEnergy(Element) = RadiationElemAbsEnergy(Element) + PhotonProps%PhotonEnergy - DONE = .TRUE. - ELSE - PhotonProps%PhotonPos(1:3) = IntersectionPos(1:3) - END IF +DistanceVec(1:3) = PhotonProps%PhotonPos(1:3) - IntersectionPos(1:3) +Distance = SQRT(DistanceVec(1)*DistanceVec(1) + DistanceVec(2)*DistanceVec(2) + DistanceVec(3)*DistanceVec(3)) +CALL RANDOM_NUMBER(iRan) +IF (-LOG(iRan).LT.(Distance*Radiation_Absorption_Spec(PhotonProps%WaveLength,Element))) THEN + RadiationElemAbsEnergy(Element) = RadiationElemAbsEnergy(Element) + PhotonProps%PhotonEnergy + DONE = .TRUE. +ELSE + PhotonProps%PhotonPos(1:3) = IntersectionPos(1:3) +END IF END SUBROUTINE CalcAbsoprtionMC + SUBROUTINE CalcAbsoprtionAnalytic(IntersectionPos,Element, DONE) !DEC$ ATTRIBUTES FORCEINLINE :: ParticleThroughSideLastPosCheck - USE MOD_Globals +USE MOD_Globals USE MOD_Photon_TrackingVars ,ONLY: PhotonProps - USE MOD_RadiationTrans_Vars, ONLY:RadiationElemAbsEnergy - USE MOD_Radiation_Vars, ONLY:Radiation_Absorption_spec +USE MOD_RadiationTrans_Vars ,ONLY: RadiationElemAbsEnergy +USE MOD_Radiation_Vars ,ONLY: Radiation_Absorption_spec !--------------------------------------------------------------------------------------------------! - IMPLICIT NONE ! +IMPLICIT NONE !--------------------------------------------------------------------------------------------------! -! argument list declaration ! - INTEGER, INTENT(IN) :: Element - REAL, INTENT(IN) :: IntersectionPos(3) - LOGICAL, INTENT(OUT) :: DONE -! Local variable declaration ! +! argument list declaration +INTEGER, INTENT(IN) :: Element +REAL, INTENT(IN) :: IntersectionPos(3) +LOGICAL, INTENT(OUT) :: DONE +! Local variable declaration !--------------------------------------------------------------------------------------------------! - REAL :: DistanceVec(3), Distance, LostEnergy, maz_photon_startxp, opticalPath +REAL :: DistanceVec(3), Distance, LostEnergy, maz_photon_startxp, opticalPath !--------------------------------------------------------------------------------------------------! - maz_photon_startxp = LOG(HUGE(maz_photon_startxp)) - DistanceVec(1:3) = PhotonProps%PhotonPos(1:3) - IntersectionPos(1:3) - Distance = SQRT(DistanceVec(1)*DistanceVec(1) + DistanceVec(2)*DistanceVec(2) + DistanceVec(3)*DistanceVec(3)) - opticalPath = Distance*Radiation_Absorption_Spec(PhotonProps%WaveLength,Element) - IF (opticalPath.GT.maz_photon_startxp) THEN - LostEnergy = PhotonProps%PhotonEnergy - ELSE - LostEnergy = PhotonProps%PhotonEnergy *(1.-EXP(-opticalPath)) - END IF - PhotonProps%PhotonEnergy = PhotonProps%PhotonEnergy - LostEnergy - RadiationElemAbsEnergy(Element) = RadiationElemAbsEnergy(Element) + LostEnergy +maz_photon_startxp = LOG(HUGE(maz_photon_startxp)) +DistanceVec(1:3) = PhotonProps%PhotonPos(1:3) - IntersectionPos(1:3) +Distance = SQRT(DistanceVec(1)*DistanceVec(1) + DistanceVec(2)*DistanceVec(2) + DistanceVec(3)*DistanceVec(3)) +opticalPath = Distance*Radiation_Absorption_Spec(PhotonProps%WaveLength,Element) +IF (opticalPath.GT.maz_photon_startxp) THEN + LostEnergy = PhotonProps%PhotonEnergy +ELSE + LostEnergy = PhotonProps%PhotonEnergy *(1.-EXP(-opticalPath)) +END IF +PhotonProps%PhotonEnergy = PhotonProps%PhotonEnergy - LostEnergy +RadiationElemAbsEnergy(Element) = RadiationElemAbsEnergy(Element) + LostEnergy ! IF (PhotonProps%PhotonEnergy.LE.(RadTrans%GlobalRadiationPower/(1000.*RadTrans%GlobalPhotonNum))) THEN -! DONE = .TRUE. -! ELSE - PhotonProps%PhotonPos(1:3) = IntersectionPos(1:3) +! DONE = .TRUE. +! ELSE +PhotonProps%PhotonPos(1:3) = IntersectionPos(1:3) ! END IF END SUBROUTINE CalcAbsoprtionAnalytic + SUBROUTINE CalcAbsoprtion(IntersectionPos,Element, DONE) USE MOD_Globals USE MOD_RadiationTrans_Vars ,ONLY: RadiationAbsorptionModel !--------------------------------------------------------------------------------------------------! -IMPLICIT NONE ! +IMPLICIT NONE !--------------------------------------------------------------------------------------------------! -! argument list declaration ! +! argument list declaration INTEGER, INTENT(IN) :: Element REAL, INTENT(IN) :: IntersectionPos(3) LOGICAL, INTENT(INOUT) :: DONE -! Local variable declaration ! +! Local variable declaration !--------------------------------------------------------------------------------------------------! IF (RadiationAbsorptionModel.EQ.0) THEN RETURN @@ -696,253 +698,256 @@ SUBROUTINE CalcAbsoprtion(IntersectionPos,Element, DONE) END IF END SUBROUTINE CalcAbsoprtion + SUBROUTINE PerfectPhotonReflection(iLocSide,Element,TriNum, IntersectionPos, IntersecAlreadyCalc) !--------------------------------------------------------------------------------------------------! !Based on PerfectReflection3D !--------------------------------------------------------------------------------------------------! - USE MOD_Particle_Mesh_Vars, ONLY : NodeCoords_Shared, ElemSideNodeID_Shared +USE MOD_Particle_Mesh_Vars ,ONLY: NodeCoords_Shared, ElemSideNodeID_Shared USE MOD_Photon_TrackingVars ,ONLY: PhotonProps - USE MOD_Mesh_Tools ,ONLY: GetCNElemID +USE MOD_Mesh_Tools ,ONLY: GetCNElemID !--------------------------------------------------------------------------------------------------! - IMPLICIT NONE ! +IMPLICIT NONE !--------------------------------------------------------------------------------------------------! -! argument list declaration ! - INTEGER,INTENT(IN) :: iLocSide ! - INTEGER,INTENT(IN) :: Element ! - INTEGER,INTENT(IN) :: TriNum ! - REAL, INTENT(INOUT) :: IntersectionPos(1:3) - LOGICAL, INTENT(IN) :: IntersecAlreadyCalc - ! Local variable declaration - INTEGER :: CNElemID - INTEGER :: Node1, Node2 ! - REAL :: PoldX, PoldY, PoldZ, nx, ny, nz, nVal ! - REAL :: xNod, yNod, zNod - REAL :: VelX, VelY, VelZ - REAL :: Vector1(1:3), Vector2(1:3), POI_fak, ProjVel +! argument list declaration +INTEGER,INTENT(IN) :: iLocSide +INTEGER,INTENT(IN) :: Element +INTEGER,INTENT(IN) :: TriNum +REAL, INTENT(INOUT) :: IntersectionPos(1:3) +LOGICAL, INTENT(IN) :: IntersecAlreadyCalc +! Local variable declaration +INTEGER :: CNElemID +INTEGER :: Node1, Node2 +REAL :: PoldX, PoldY, PoldZ, nx, ny, nz, nVal +REAL :: xNod, yNod, zNod +REAL :: VelX, VelY, VelZ +REAL :: Vector1(1:3), Vector2(1:3), POI_fak, ProjVel !--------------------------------------------------------------------------------------------------! !--------------------------------------------------------------------------------------------------! - CNElemID = GetCNElemID(Element) - PoldX = PhotonProps%PhotonLastPos(1) - PoldY = PhotonProps%PhotonLastPos(2) - PoldZ = PhotonProps%PhotonLastPos(3) - - VelX = PhotonProps%PhotonDirection(1) - VelY = PhotonProps%PhotonDirection(2) - VelZ = PhotonProps%PhotonDirection(3) - - xNod = NodeCoords_Shared(1,ElemSideNodeID_Shared(1,iLocSide,CNElemID)+1) - yNod = NodeCoords_Shared(2,ElemSideNodeID_Shared(1,iLocSide,CNElemID)+1) - zNod = NodeCoords_Shared(3,ElemSideNodeID_Shared(1,iLocSide,CNElemID)+1) - - !---- Calculate normal vector: - - Node1 = TriNum+1 ! normal = cross product of 1-2 and 1-3 for first triangle - Node2 = TriNum+2 ! and 1-3 and 1-4 for second triangle - - Vector1(1) = NodeCoords_Shared(1,ElemSideNodeID_Shared(Node1,iLocSide,CNElemID)+1) - xNod - Vector1(2) = NodeCoords_Shared(2,ElemSideNodeID_Shared(Node1,iLocSide,CNElemID)+1) - yNod - Vector1(3) = NodeCoords_Shared(3,ElemSideNodeID_Shared(Node1,iLocSide,CNElemID)+1) - zNod - - Vector2(1) = NodeCoords_Shared(1,ElemSideNodeID_Shared(Node2,iLocSide,CNElemID)+1) - xNod - Vector2(2) = NodeCoords_Shared(2,ElemSideNodeID_Shared(Node2,iLocSide,CNElemID)+1) - yNod - Vector2(3) = NodeCoords_Shared(3,ElemSideNodeID_Shared(Node2,iLocSide,CNElemID)+1) - zNod - - nx = Vector1(2) * Vector2(3) - Vector1(3) * Vector2(2) - ny = Vector1(3) * Vector2(1) - Vector1(1) * Vector2(3) - nz = Vector1(1) * Vector2(2) - Vector1(2) * Vector2(1) - - nVal = SQRT(nx*nx + ny*ny + nz*nz) - - nx = nx/nVal - ny = ny/nVal - nz = nz/nVal - - !---- Calculate Point of Intersection (POI) - IF (.NOT.IntersecAlreadyCalc) THEN - POI_fak = (Vector2(2)*(Vector1(1)*(zNod-PoldZ)+Vector1(3)*(PoldX-xNod)) & - +Vector1(2)*(Vector2(1)*(PoldZ-zNod)+Vector2(3)*(xNod-PoldX)) & - +yNod*(Vector1(3)*Vector2(1)-Vector1(1)*Vector2(3)) & - +PoldY*(Vector1(1)*Vector2(3)-Vector1(3)*Vector2(1))) & - /(Vector1(2)*(Vector2(3)*VelX-Vector2(1)*VelZ) & - + Vector2(2)*(Vector1(1)*VelZ-Vector1(3)*VelX) & - + VelY*(Vector1(3)*Vector2(1)-Vector1(1)*Vector2(3))) - - IntersectionPos(1) = PoldX + POI_fak * VelX - IntersectionPos(2) = PoldY + POI_fak * VelY - IntersectionPos(3) = PoldZ + POI_fak * VelZ - END IF - - !---- Calculate new velocity vector - ProjVel = nx*PhotonProps%PhotonDirection(1)+ny*PhotonProps%PhotonDirection(2) & - +nz*PhotonProps%PhotonDirection(3) - VelX=PhotonProps%PhotonDirection(1)-2.*ProjVel*nx - VelY=PhotonProps%PhotonDirection(2)-2.*ProjVel*ny - VelZ=PhotonProps%PhotonDirection(3)-2.*ProjVel*nz - - !---- Assign new values to "old" variables to continue loop - - PhotonProps%PhotonLastPos(1) = IntersectionPos(1) - PhotonProps%PhotonLastPos(2) = IntersectionPos(2) - PhotonProps%PhotonLastPos(3) = IntersectionPos(3) - - PhotonProps%PhotonDirection(1) = VelX - PhotonProps%PhotonDirection(2) = VelY - PhotonProps%PhotonDirection(3) = VelZ - RETURN +CNElemID = GetCNElemID(Element) +PoldX = PhotonProps%PhotonLastPos(1) +PoldY = PhotonProps%PhotonLastPos(2) +PoldZ = PhotonProps%PhotonLastPos(3) + +VelX = PhotonProps%PhotonDirection(1) +VelY = PhotonProps%PhotonDirection(2) +VelZ = PhotonProps%PhotonDirection(3) + +xNod = NodeCoords_Shared(1,ElemSideNodeID_Shared(1,iLocSide,CNElemID)+1) +yNod = NodeCoords_Shared(2,ElemSideNodeID_Shared(1,iLocSide,CNElemID)+1) +zNod = NodeCoords_Shared(3,ElemSideNodeID_Shared(1,iLocSide,CNElemID)+1) + +!---- Calculate normal vector: + +Node1 = TriNum+1 ! normal = cross product of 1-2 and 1-3 for first triangle +Node2 = TriNum+2 ! and 1-3 and 1-4 for second triangle + +Vector1(1) = NodeCoords_Shared(1,ElemSideNodeID_Shared(Node1,iLocSide,CNElemID)+1) - xNod +Vector1(2) = NodeCoords_Shared(2,ElemSideNodeID_Shared(Node1,iLocSide,CNElemID)+1) - yNod +Vector1(3) = NodeCoords_Shared(3,ElemSideNodeID_Shared(Node1,iLocSide,CNElemID)+1) - zNod + +Vector2(1) = NodeCoords_Shared(1,ElemSideNodeID_Shared(Node2,iLocSide,CNElemID)+1) - xNod +Vector2(2) = NodeCoords_Shared(2,ElemSideNodeID_Shared(Node2,iLocSide,CNElemID)+1) - yNod +Vector2(3) = NodeCoords_Shared(3,ElemSideNodeID_Shared(Node2,iLocSide,CNElemID)+1) - zNod + +nx = Vector1(2) * Vector2(3) - Vector1(3) * Vector2(2) +ny = Vector1(3) * Vector2(1) - Vector1(1) * Vector2(3) +nz = Vector1(1) * Vector2(2) - Vector1(2) * Vector2(1) + +nVal = SQRT(nx*nx + ny*ny + nz*nz) + +nx = nx/nVal +ny = ny/nVal +nz = nz/nVal + +!---- Calculate Point of Intersection (POI) +IF (.NOT.IntersecAlreadyCalc) THEN + POI_fak = (Vector2(2)*(Vector1(1)*(zNod-PoldZ)+Vector1(3)*(PoldX-xNod)) & + +Vector1(2)*(Vector2(1)*(PoldZ-zNod)+Vector2(3)*(xNod-PoldX)) & + +yNod*(Vector1(3)*Vector2(1)-Vector1(1)*Vector2(3)) & + +PoldY*(Vector1(1)*Vector2(3)-Vector1(3)*Vector2(1))) & + /(Vector1(2)*(Vector2(3)*VelX-Vector2(1)*VelZ) & + + Vector2(2)*(Vector1(1)*VelZ-Vector1(3)*VelX) & + + VelY*(Vector1(3)*Vector2(1)-Vector1(1)*Vector2(3))) + + IntersectionPos(1) = PoldX + POI_fak * VelX + IntersectionPos(2) = PoldY + POI_fak * VelY + IntersectionPos(3) = PoldZ + POI_fak * VelZ +END IF + +!---- Calculate new velocity vector +ProjVel = nx*PhotonProps%PhotonDirection(1)+ny*PhotonProps%PhotonDirection(2) & + +nz*PhotonProps%PhotonDirection(3) +VelX=PhotonProps%PhotonDirection(1)-2.*ProjVel*nx +VelY=PhotonProps%PhotonDirection(2)-2.*ProjVel*ny +VelZ=PhotonProps%PhotonDirection(3)-2.*ProjVel*nz + +!---- Assign new values to "old" variables to continue loop + +PhotonProps%PhotonLastPos(1) = IntersectionPos(1) +PhotonProps%PhotonLastPos(2) = IntersectionPos(2) +PhotonProps%PhotonLastPos(3) = IntersectionPos(3) + +PhotonProps%PhotonDirection(1) = VelX +PhotonProps%PhotonDirection(2) = VelY +PhotonProps%PhotonDirection(3) = VelZ +RETURN END SUBROUTINE PerfectPhotonReflection + SUBROUTINE PerfectPhotonReflection2D(iLocSide,Element, IntersectionPos) !--------------------------------------------------------------------------------------------------! !Based on PerfectReflection3D !--------------------------------------------------------------------------------------------------! - USE MOD_Particle_Mesh_Vars, ONLY : SideNormalEdge2D_Shared +USE MOD_Particle_Mesh_Vars, ONLY : SideNormalEdge2D_Shared USE MOD_Photon_TrackingVars ,ONLY: PhotonProps - USE MOD_Mesh_Tools ,ONLY: GetCNElemID +USE MOD_Mesh_Tools ,ONLY: GetCNElemID !--------------------------------------------------------------------------------------------------! - IMPLICIT NONE ! +IMPLICIT NONE +!--------------------------------------------------------------------------------------------------! +! argument list declaration +INTEGER,INTENT(IN) :: iLocSide +INTEGER,INTENT(IN) :: Element +REAL, INTENT(INOUT) :: IntersectionPos(1:3) +! Local variable declaration +INTEGER :: CNElemID +REAL :: nx, ny, nz, nValIntersec +REAL :: VelX, VelY, VelZ +REAL :: ProjVel !--------------------------------------------------------------------------------------------------! -! argument list declaration ! - INTEGER,INTENT(IN) :: iLocSide ! - INTEGER,INTENT(IN) :: Element ! - REAL, INTENT(INOUT) :: IntersectionPos(1:3) - ! Local variable declaration ! - INTEGER :: CNElemID ! - REAL :: nx, ny, nz, nValIntersec - REAL :: VelX, VelY, VelZ - REAL :: ProjVel -!--------------------------------------------------------- -----------------------------------------! !--------------------------------------------------------------------------------------------------! - CNElemID = GetCNElemID(Element) +CNElemID = GetCNElemID(Element) - nx = SideNormalEdge2D_Shared(1,iLocSide, CNElemID) - nValIntersec = SQRT(IntersectionPos(2)*IntersectionPos(2) + IntersectionPos(3)*IntersectionPos(3)) - ny = IntersectionPos(2)/nValIntersec * SideNormalEdge2D_Shared(2,iLocSide, CNElemID) - nz = IntersectionPos(3)/nValIntersec * SideNormalEdge2D_Shared(2,iLocSide, CNElemID) +nx = SideNormalEdge2D_Shared(1,iLocSide, CNElemID) +nValIntersec = SQRT(IntersectionPos(2)*IntersectionPos(2) + IntersectionPos(3)*IntersectionPos(3)) +ny = IntersectionPos(2)/nValIntersec * SideNormalEdge2D_Shared(2,iLocSide, CNElemID) +nz = IntersectionPos(3)/nValIntersec * SideNormalEdge2D_Shared(2,iLocSide, CNElemID) - !---- Calculate new velocity vector - ProjVel = nx*PhotonProps%PhotonDirection(1)+ny*PhotonProps%PhotonDirection(2) & - +nz*PhotonProps%PhotonDirection(3) - VelX=PhotonProps%PhotonDirection(1)-2.*ProjVel*nx - VelY=PhotonProps%PhotonDirection(2)-2.*ProjVel*ny - VelZ=PhotonProps%PhotonDirection(3)-2.*ProjVel*nz +!---- Calculate new velocity vector +ProjVel = nx*PhotonProps%PhotonDirection(1)+ny*PhotonProps%PhotonDirection(2) & + +nz*PhotonProps%PhotonDirection(3) +VelX=PhotonProps%PhotonDirection(1)-2.*ProjVel*nx +VelY=PhotonProps%PhotonDirection(2)-2.*ProjVel*ny +VelZ=PhotonProps%PhotonDirection(3)-2.*ProjVel*nz - !---- Assign new values to "old" variables to continue loop +!---- Assign new values to "old" variables to continue loop - PhotonProps%PhotonLastPos(1) = IntersectionPos(1) - PhotonProps%PhotonLastPos(2) = IntersectionPos(2) - PhotonProps%PhotonLastPos(3) = IntersectionPos(3) +PhotonProps%PhotonLastPos(1) = IntersectionPos(1) +PhotonProps%PhotonLastPos(2) = IntersectionPos(2) +PhotonProps%PhotonLastPos(3) = IntersectionPos(3) - PhotonProps%PhotonDirection(1) = VelX - PhotonProps%PhotonDirection(2) = VelY - PhotonProps%PhotonDirection(3) = VelZ +PhotonProps%PhotonDirection(1) = VelX +PhotonProps%PhotonDirection(2) = VelY +PhotonProps%PhotonDirection(3) = VelZ END SUBROUTINE PerfectPhotonReflection2D + SUBROUTINE DiffusePhotonReflection(iLocSide,Element,TriNum, IntersectionPos, IntersecAlreadyCalc) !--------------------------------------------------------------------------------------------------! !Based on PerfectReflection3D !--------------------------------------------------------------------------------------------------! - USE MOD_Particle_Mesh_Vars, ONLY : ElemSideNodeID_Shared, NodeCoords_Shared +USE MOD_Particle_Mesh_Vars ,ONLY: ElemSideNodeID_Shared, NodeCoords_Shared USE MOD_Photon_TrackingVars ,ONLY: PhotonProps - USE Ziggurat - USE MOD_Mesh_Tools ,ONLY: GetCNElemID +USE Ziggurat +USE MOD_Mesh_Tools ,ONLY: GetCNElemID !--------------------------------------------------------------------------------------------------! - IMPLICIT NONE ! +IMPLICIT NONE !--------------------------------------------------------------------------------------------------! -! argument list declaration ! - INTEGER,INTENT(IN) :: iLocSide ! - INTEGER,INTENT(IN) :: Element ! - INTEGER,INTENT(IN) :: TriNum ! - REAL, INTENT(INOUT) :: IntersectionPos(1:3) - LOGICAL, INTENT(IN) :: IntersecAlreadyCalc - ! Local variable declaration ! - INTEGER :: CNElemID - INTEGER :: Node1, Node2 ! - REAL :: PoldX, PoldY, PoldZ, nx, ny, nz, nVal ! - REAL :: xNod, yNod, zNod, VecX, VecY, VecZ - REAL :: VelX, VelY, VelZ, VeloCx, VeloCy, VeloCz, NormVec, RanNum - REAL :: Vector1(1:3), Vector2(1:3), POI_fak +! argument list declaration +INTEGER,INTENT(IN) :: iLocSide +INTEGER,INTENT(IN) :: Element +INTEGER,INTENT(IN) :: TriNum +REAL, INTENT(INOUT) :: IntersectionPos(1:3) +LOGICAL, INTENT(IN) :: IntersecAlreadyCalc +! Local variable declaration +INTEGER :: CNElemID +INTEGER :: Node1, Node2 +REAL :: PoldX, PoldY, PoldZ, nx, ny, nz, nVal +REAL :: xNod, yNod, zNod, VecX, VecY, VecZ +REAL :: VelX, VelY, VelZ, VeloCx, VeloCy, VeloCz, NormVec, RanNum +REAL :: Vector1(1:3), Vector2(1:3), POI_fak !--------------------------------------------------------------------------------------------------! !--------------------------------------------------------------------------------------------------! - CNElemID = GetCNElemID(Element) - PoldX = PhotonProps%PhotonLastPos(1) - PoldY = PhotonProps%PhotonLastPos(2) - PoldZ = PhotonProps%PhotonLastPos(3) - - VelX = PhotonProps%PhotonDirection(1) - VelY = PhotonProps%PhotonDirection(2) - VelZ = PhotonProps%PhotonDirection(3) - - xNod = NodeCoords_Shared(1,ElemSideNodeID_Shared(1,iLocSide,CNElemID)+1) - yNod = NodeCoords_Shared(2,ElemSideNodeID_Shared(1,iLocSide,CNElemID)+1) - zNod = NodeCoords_Shared(3,ElemSideNodeID_Shared(1,iLocSide,CNElemID)+1) - - !---- Calculate normal vector: - - Node1 = TriNum+1 ! normal = cross product of 1-2 and 1-3 for first triangle - Node2 = TriNum+2 ! and 1-3 and 1-4 for second triangle - - Vector1(1) = NodeCoords_Shared(1,ElemSideNodeID_Shared(Node1,iLocSide,CNElemID)+1) - xNod - Vector1(2) = NodeCoords_Shared(2,ElemSideNodeID_Shared(Node1,iLocSide,CNElemID)+1) - yNod - Vector1(3) = NodeCoords_Shared(3,ElemSideNodeID_Shared(Node1,iLocSide,CNElemID)+1) - zNod - - Vector2(1) = NodeCoords_Shared(1,ElemSideNodeID_Shared(Node2,iLocSide,CNElemID)+1) - xNod - Vector2(2) = NodeCoords_Shared(2,ElemSideNodeID_Shared(Node2,iLocSide,CNElemID)+1) - yNod - Vector2(3) = NodeCoords_Shared(3,ElemSideNodeID_Shared(Node2,iLocSide,CNElemID)+1) - zNod - - nx = Vector1(2) * Vector2(3) - Vector1(3) * Vector2(2) - ny = Vector1(3) * Vector2(1) - Vector1(1) * Vector2(3) - nz = Vector1(1) * Vector2(2) - Vector1(2) * Vector2(1) - - nVal = SQRT(nx*nx + ny*ny + nz*nz) - - nx = nx/nVal - ny = ny/nVal - nz = nz/nVal - - !---- Calculate Point of Intersection (POI) - !---- Calculate Point of Intersection (POI) - IF (.NOT.IntersecAlreadyCalc) THEN - POI_fak = (Vector2(2)*(Vector1(1)*(zNod-PoldZ)+Vector1(3)*(PoldX-xNod)) & - +Vector1(2)*(Vector2(1)*(PoldZ-zNod)+Vector2(3)*(xNod-PoldX)) & - +yNod*(Vector1(3)*Vector2(1)-Vector1(1)*Vector2(3)) & - +PoldY*(Vector1(1)*Vector2(3)-Vector1(3)*Vector2(1))) & - /(Vector1(2)*(Vector2(3)*VelX-Vector2(1)*VelZ) & - + Vector2(2)*(Vector1(1)*VelZ-Vector1(3)*VelX) & - + VelY*(Vector1(3)*Vector2(1)-Vector1(1)*Vector2(3))) - - IntersectionPos(1) = PoldX + POI_fak * VelX - IntersectionPos(2) = PoldY + POI_fak * VelY - IntersectionPos(3) = PoldZ + POI_fak * VelZ - END IF - !---- Calculate new velocity vector (Extended Maxwellian Model) - - VeloCx = rnor() !normal distri - VeloCy = rnor() !normal distri - CALL RANDOM_NUMBER(RanNum) - VeloCz = SQRT(-2.*LOG(RanNum)) ! rayleigh distri - - !---- Transformation local distribution -> global coordinates - VecX = Vector1(1) / SQRT( Vector1(1)**2 + Vector1(2)**2 + Vector1(3)**2 ) - VecY = Vector1(2) / SQRT( Vector1(1)**2 + Vector1(2)**2 + Vector1(3)**2 ) - VecZ = Vector1(3) / SQRT( Vector1(1)**2 + Vector1(2)**2 + Vector1(3)**2 ) - - VelX = VecX*VeloCx + (nz*VecY-ny*VecZ)*VeloCy - nx*VeloCz - VelY = VecY*VeloCx + (nx*VecZ-nz*VecX)*VeloCy - ny*VeloCz - VelZ = VecZ*VeloCx + (ny*VecX-nx*VecY)*VeloCy - nz*VeloCz - !---- Assign new values to "old" variables to continue loop - - PhotonProps%PhotonLastPos(1) = IntersectionPos(1) - PhotonProps%PhotonLastPos(2) = IntersectionPos(2) - PhotonProps%PhotonLastPos(3) = IntersectionPos(3) - - !---- saving new particle velocity - NormVec = SQRT(VelX*VelX + VelY*VelY + VelZ*VelZ) - PhotonProps%PhotonDirection(1) = VelX / NormVec - PhotonProps%PhotonDirection(2) = VelY / NormVec - PhotonProps%PhotonDirection(3) = VelZ / NormVec - - RETURN +CNElemID = GetCNElemID(Element) +PoldX = PhotonProps%PhotonLastPos(1) +PoldY = PhotonProps%PhotonLastPos(2) +PoldZ = PhotonProps%PhotonLastPos(3) + +VelX = PhotonProps%PhotonDirection(1) +VelY = PhotonProps%PhotonDirection(2) +VelZ = PhotonProps%PhotonDirection(3) + +xNod = NodeCoords_Shared(1,ElemSideNodeID_Shared(1,iLocSide,CNElemID)+1) +yNod = NodeCoords_Shared(2,ElemSideNodeID_Shared(1,iLocSide,CNElemID)+1) +zNod = NodeCoords_Shared(3,ElemSideNodeID_Shared(1,iLocSide,CNElemID)+1) + +!---- Calculate normal vector: + +Node1 = TriNum+1 ! normal = cross product of 1-2 and 1-3 for first triangle +Node2 = TriNum+2 ! and 1-3 and 1-4 for second triangle + +Vector1(1) = NodeCoords_Shared(1,ElemSideNodeID_Shared(Node1,iLocSide,CNElemID)+1) - xNod +Vector1(2) = NodeCoords_Shared(2,ElemSideNodeID_Shared(Node1,iLocSide,CNElemID)+1) - yNod +Vector1(3) = NodeCoords_Shared(3,ElemSideNodeID_Shared(Node1,iLocSide,CNElemID)+1) - zNod + +Vector2(1) = NodeCoords_Shared(1,ElemSideNodeID_Shared(Node2,iLocSide,CNElemID)+1) - xNod +Vector2(2) = NodeCoords_Shared(2,ElemSideNodeID_Shared(Node2,iLocSide,CNElemID)+1) - yNod +Vector2(3) = NodeCoords_Shared(3,ElemSideNodeID_Shared(Node2,iLocSide,CNElemID)+1) - zNod + +nx = Vector1(2) * Vector2(3) - Vector1(3) * Vector2(2) +ny = Vector1(3) * Vector2(1) - Vector1(1) * Vector2(3) +nz = Vector1(1) * Vector2(2) - Vector1(2) * Vector2(1) + +nVal = SQRT(nx*nx + ny*ny + nz*nz) + +nx = nx/nVal +ny = ny/nVal +nz = nz/nVal + +!---- Calculate Point of Intersection (POI) +!---- Calculate Point of Intersection (POI) +IF (.NOT.IntersecAlreadyCalc) THEN + POI_fak = (Vector2(2)*(Vector1(1)*(zNod-PoldZ)+Vector1(3)*(PoldX-xNod)) & + +Vector1(2)*(Vector2(1)*(PoldZ-zNod)+Vector2(3)*(xNod-PoldX)) & + +yNod*(Vector1(3)*Vector2(1)-Vector1(1)*Vector2(3)) & + +PoldY*(Vector1(1)*Vector2(3)-Vector1(3)*Vector2(1))) & + /(Vector1(2)*(Vector2(3)*VelX-Vector2(1)*VelZ) & + + Vector2(2)*(Vector1(1)*VelZ-Vector1(3)*VelX) & + + VelY*(Vector1(3)*Vector2(1)-Vector1(1)*Vector2(3))) + + IntersectionPos(1) = PoldX + POI_fak * VelX + IntersectionPos(2) = PoldY + POI_fak * VelY + IntersectionPos(3) = PoldZ + POI_fak * VelZ +END IF +!---- Calculate new velocity vector (Extended Maxwellian Model) + +VeloCx = rnor() !normal distri +VeloCy = rnor() !normal distri +CALL RANDOM_NUMBER(RanNum) +VeloCz = SQRT(-2.*LOG(RanNum)) ! rayleigh distri + +!---- Transformation local distribution -> global coordinates +VecX = Vector1(1) / SQRT( Vector1(1)**2 + Vector1(2)**2 + Vector1(3)**2 ) +VecY = Vector1(2) / SQRT( Vector1(1)**2 + Vector1(2)**2 + Vector1(3)**2 ) +VecZ = Vector1(3) / SQRT( Vector1(1)**2 + Vector1(2)**2 + Vector1(3)**2 ) + +VelX = VecX*VeloCx + (nz*VecY-ny*VecZ)*VeloCy - nx*VeloCz +VelY = VecY*VeloCx + (nx*VecZ-nz*VecX)*VeloCy - ny*VeloCz +VelZ = VecZ*VeloCx + (ny*VecX-nx*VecY)*VeloCy - nz*VeloCz +!---- Assign new values to "old" variables to continue loop + +PhotonProps%PhotonLastPos(1) = IntersectionPos(1) +PhotonProps%PhotonLastPos(2) = IntersectionPos(2) +PhotonProps%PhotonLastPos(3) = IntersectionPos(3) + +!---- saving new particle velocity +NormVec = SQRT(VelX*VelX + VelY*VelY + VelZ*VelZ) +PhotonProps%PhotonDirection(1) = VelX / NormVec +PhotonProps%PhotonDirection(2) = VelY / NormVec +PhotonProps%PhotonDirection(3) = VelZ / NormVec + +RETURN END SUBROUTINE DiffusePhotonReflection @@ -950,67 +955,68 @@ SUBROUTINE DiffusePhotonReflection2D(iLocSide,Element, IntersectionPos) !--------------------------------------------------------------------------------------------------! !Based on PerfectReflection3D !--------------------------------------------------------------------------------------------------! - USE MOD_Particle_Mesh_Vars, ONLY : SideNormalEdge2D_Shared +USE MOD_Particle_Mesh_Vars ,ONLY: SideNormalEdge2D_Shared USE MOD_Photon_TrackingVars ,ONLY: PhotonProps - USE Ziggurat - USE MOD_Mesh_Tools ,ONLY: GetCNElemID +USE Ziggurat +USE MOD_Mesh_Tools ,ONLY: GetCNElemID !--------------------------------------------------------------------------------------------------! - IMPLICIT NONE ! +IMPLICIT NONE !--------------------------------------------------------------------------------------------------! -! argument list declaration ! - INTEGER,INTENT(IN) :: iLocSide ! - INTEGER,INTENT(IN) :: Element ! - REAL, INTENT(IN) :: IntersectionPos(1:3) - ! Local variable declaration - INTEGER :: CNElemID - REAL :: nx, ny, nz, nValIntersec, VecX, VecY, VecZ - REAL :: VelX, VelY, VelZ, VeloCx, VeloCy, VeloCz, NormVec, RanNum +! argument list declaration +INTEGER,INTENT(IN) :: iLocSide +INTEGER,INTENT(IN) :: Element +REAL, INTENT(IN) :: IntersectionPos(1:3) +! Local variable declaration +INTEGER :: CNElemID +REAL :: nx, ny, nz, nValIntersec, VecX, VecY, VecZ +REAL :: VelX, VelY, VelZ, VeloCx, VeloCy, VeloCz, NormVec, RanNum !--------------------------------------------------------------------------------------------------! !--------------------------------------------------------------------------------------------------! - CNElemID = GetCNElemID(Element) - nx = SideNormalEdge2D_Shared(1,iLocSide, CNElemID) - nValIntersec = SQRT(IntersectionPos(2)*IntersectionPos(2) + IntersectionPos(3)*IntersectionPos(3)) - ny = IntersectionPos(2)/nValIntersec * SideNormalEdge2D_Shared(2,iLocSide, CNElemID) - nz = IntersectionPos(3)/nValIntersec * SideNormalEdge2D_Shared(2,iLocSide, CNElemID) - - VecX = SideNormalEdge2D_Shared(3,iLocSide, CNElemID) - VecY = IntersectionPos(2)/nValIntersec * SideNormalEdge2D_Shared(4,iLocSide, CNElemID) - VecZ = IntersectionPos(3)/nValIntersec * SideNormalEdge2D_Shared(4,iLocSide, CNElemID) - !---- Calculate new velocity vector (Extended Maxwellian Model) - - VeloCx = rnor() !normal distri - VeloCy = rnor() !normal distri - CALL RANDOM_NUMBER(RanNum) - VeloCz = SQRT(-2.*LOG(RanNum)) ! rayleigh distri - - VelX = VecX*VeloCx + (nz*VecY-ny*VecZ)*VeloCy - nx*VeloCz - VelY = VecY*VeloCx + (nx*VecZ-nz*VecX)*VeloCy - ny*VeloCz - VelZ = VecZ*VeloCx + (ny*VecX-nx*VecY)*VeloCy - nz*VeloCz - !---- Assign new values to "old" variables to continue loop - - PhotonProps%PhotonLastPos(1) = IntersectionPos(1) - PhotonProps%PhotonLastPos(2) = IntersectionPos(2) - PhotonProps%PhotonLastPos(3) = IntersectionPos(3) - - !---- saving new particle velocity - NormVec = SQRT(VelX*VelX + VelY*VelY + VelZ*VelZ) - PhotonProps%PhotonDirection(1) = VelX / NormVec - PhotonProps%PhotonDirection(2) = VelY / NormVec - PhotonProps%PhotonDirection(3) = VelZ / NormVec +CNElemID = GetCNElemID(Element) +nx = SideNormalEdge2D_Shared(1,iLocSide, CNElemID) +nValIntersec = SQRT(IntersectionPos(2)*IntersectionPos(2) + IntersectionPos(3)*IntersectionPos(3)) +ny = IntersectionPos(2)/nValIntersec * SideNormalEdge2D_Shared(2,iLocSide, CNElemID) +nz = IntersectionPos(3)/nValIntersec * SideNormalEdge2D_Shared(2,iLocSide, CNElemID) + +VecX = SideNormalEdge2D_Shared(3,iLocSide, CNElemID) +VecY = IntersectionPos(2)/nValIntersec * SideNormalEdge2D_Shared(4,iLocSide, CNElemID) +VecZ = IntersectionPos(3)/nValIntersec * SideNormalEdge2D_Shared(4,iLocSide, CNElemID) +!---- Calculate new velocity vector (Extended Maxwellian Model) + +VeloCx = rnor() !normal distri +VeloCy = rnor() !normal distri +CALL RANDOM_NUMBER(RanNum) +VeloCz = SQRT(-2.*LOG(RanNum)) ! rayleigh distri + +VelX = VecX*VeloCx + (nz*VecY-ny*VecZ)*VeloCy - nx*VeloCz +VelY = VecY*VeloCx + (nx*VecZ-nz*VecX)*VeloCy - ny*VeloCz +VelZ = VecZ*VeloCx + (ny*VecX-nx*VecY)*VeloCy - nz*VeloCz +!---- Assign new values to "old" variables to continue loop + +PhotonProps%PhotonLastPos(1) = IntersectionPos(1) +PhotonProps%PhotonLastPos(2) = IntersectionPos(2) +PhotonProps%PhotonLastPos(3) = IntersectionPos(3) + +!---- saving new particle velocity +NormVec = SQRT(VelX*VelX + VelY*VelY + VelZ*VelZ) +PhotonProps%PhotonDirection(1) = VelX / NormVec +PhotonProps%PhotonDirection(2) = VelY / NormVec +PhotonProps%PhotonDirection(3) = VelZ / NormVec END SUBROUTINE DiffusePhotonReflection2D + SUBROUTINE CalcWallAbsoprtion(GlobSideID, DONE) USE MOD_Photon_TrackingVars ,ONLY: PhotonProps,PhotonSampWall USE MOD_Particle_Boundary_Vars ,ONLY: PartBound, GlobalSide2SurfSide USE MOD_Particle_Mesh_Vars ,ONLY: SideInfo_Shared !--------------------------------------------------------------------------------------------------! -IMPLICIT NONE ! +IMPLICIT NONE !--------------------------------------------------------------------------------------------------! -! argument list declaration ! +! argument list declaration INTEGER, INTENT(IN) :: GlobSideID LOGICAL, INTENT(OUT) :: DONE -! Local variable declaration ! +! Local variable declaration !--------------------------------------------------------------------------------------------------! REAL :: iRan INTEGER :: SurfSideID @@ -1018,7 +1024,7 @@ SUBROUTINE CalcWallAbsoprtion(GlobSideID, DONE) SurfSideID = GlobalSide2SurfSide(SURF_SIDEID,GlobSideID) CALL RANDOM_NUMBER(iRan) IF (PartBound%PhotonEnACC(PartBound%MapToPartBC(SideInfo_Shared(SIDE_BCID,GlobSideID))).GT.iRan) THEN - DONE = .TRUE. + DONE = .TRUE. PhotonSampWall(1,SurfSideID) = PhotonSampWall(1,SurfSideID) + 1. PhotonSampWall(2,SurfSideID) = PhotonSampWall(2,SurfSideID) + PhotonProps%PhotonEnergy END IF @@ -1051,13 +1057,14 @@ LOGICAL FUNCTION PointInObsCone(Point) END FUNCTION PointInObsCone + LOGICAL FUNCTION PhotonIntersectSensor(Point, Direction) !=================================================================================================================================== ! modified particle emmission for LD case !=================================================================================================================================== ! MODULES - USE MOD_Globals - USE MOD_RadiationTrans_Vars, ONLY: RadObservationPoint +USE MOD_Globals +USE MOD_RadiationTrans_Vars, ONLY: RadObservationPoint ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -1082,18 +1089,19 @@ LOGICAL FUNCTION PhotonIntersectSensor(Point, Direction) DirectionVec(1:3) = DirectionVec(1:3) - RadObservationPoint%MidPoint(1:3) !distance to midpoint projectedDist = VECNORM(DirectionVec(1:3)) - IF (projectedDist.LE.RadObservationPoint%Diameter/2.) PhotonIntersectSensor = .TRUE. + IF (projectedDist.LE.RadObservationPoint%Diameter/2.) PhotonIntersectSensor = .TRUE. END IF END FUNCTION PhotonIntersectSensor + LOGICAL FUNCTION PhotonOnLineOfSight(Direction) !=================================================================================================================================== ! modified particle emmission for LD case !=================================================================================================================================== ! MODULES - USE MOD_Globals - USE MOD_RadiationTrans_Vars, ONLY: RadObservationPoint +USE MOD_Globals +USE MOD_RadiationTrans_Vars, ONLY: RadObservationPoint ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -1112,7 +1120,7 @@ LOGICAL FUNCTION PhotonOnLineOfSight(Direction) IF (RadObservationPoint%ViewDirection(iDir).NE.0.0) THEN RETURN ELSE - SkalarFactors(iDir) = 0.0 + SkalarFactors(iDir) = 0.0 END IF ELSE IF (RadObservationPoint%ViewDirection(iDir).EQ.0.0) THEN From 6a6c5c5ae13a794fedc88c2d3ed2b7e3647b34a7 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Tue, 16 May 2023 20:00:12 +0200 Subject: [PATCH 076/495] Volume sampling output for ray tracing --- .../analyze.ini | 10 +- .../reference_RadiationVolState.h5 | Bin 0 -> 42648 bytes src/posti/piclas2vtk/piclas2vtk.f90 | 1 + .../radiative_transfer/radtrans_output.f90 | 28 ++-- .../tracking/radtrans_tracking_output.f90 | 139 +++++++++++++++--- .../tracking/radtrans_tracking_tools.f90 | 53 +++++-- src/radiation/ray_tracing/raytrace.f90 | 65 ++++---- src/radiation/ray_tracing/raytrace_ini.f90 | 31 ---- 8 files changed, 211 insertions(+), 116 deletions(-) create mode 100644 regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/reference_RadiationVolState.h5 diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/analyze.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/analyze.ini index fea43d272..11234d391 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/analyze.ini +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/analyze.ini @@ -13,9 +13,9 @@ !integrate_line_tolerance_type = absolute ! special option ! hdf5 diff -h5diff_file = photoionization_RadiationSurfState.h5 -h5diff_reference_file = reference_RadiationSurfState.h5 -h5diff_data_set = SurfaceData -h5diff_tolerance_value = 10E-2 -h5diff_tolerance_type = relative +h5diff_file = photoionization_RadiationSurfState.h5 , photoionization_RadiationVolState.h5 +h5diff_reference_file = reference_RadiationSurfState.h5 , reference_RadiationVolState.h5 +h5diff_data_set = SurfaceData , ElemData +h5diff_tolerance_value = 10E-2 , 10E-1 +h5diff_tolerance_type = relative , relative !h5diff_max_differences = 5 diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/reference_RadiationVolState.h5 b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/reference_RadiationVolState.h5 new file mode 100644 index 0000000000000000000000000000000000000000..d7a063644a984913b543ff5f2e57b94707e0c5ae GIT binary patch literal 42648 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

cmh8$+Gbs&v*F(#x4is(S2qR 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 PhotonSampWall_Shared ,& - SurfSideArea => SurfSideArea_Shared) +ASSOCIATE(PhotonSampWall => PhotonSampWall_Shared ,& + SurfSideArea => SurfSideArea_Shared) #endif ASSOCIATE (& - nGlobalSides => INT(nOutputSides,IK) ,& - LocalnBCSides => INT(nComputeNodeSurfOutputSides,IK) ,& - offsetSurfSide => INT(offsetComputeNodeSurfOutputSide,IK) ,& - nVar2D => INT(nVar2D,IK)) + nGlobalSides => INT(nOutputSides , IK) , & + LocalnBCSides => INT(nComputeNodeSurfOutputSides , IK) , & + offsetSurfSide => INT(offsetComputeNodeSurfOutputSide , IK) , & + nVar2D => INT(nVar2D , IK)) ALLOCATE(helpArray(nVar2D,LocalnBCSides)) OutputCounter = 0 - IPWRITE(UNIT_StdOut,*) "offsetSurfSide =", offsetSurfSide !IF(myrank.eq.0) read* DO iSurfSide = 1,nComputeNodeSurfSides GlobalSideID = SurfSide2GlobalSide(SURF_SIDEID,iSurfSide) @@ -150,9 +209,6 @@ SUBROUTINE WritePhotonSurfSampleToHDF5() END IF OutputCounter = OutputCounter + 1 helpArray(1,OutputCounter)= PhotonSampWall(1,iSurfSide) - IF(offsetSurfSide.eq.0)THEN - IPWRITE(UNIT_StdOut,*) "iSurfSide,PhotonSampWall(1,iSurfSide) =", iSurfSide,PhotonSampWall(1,iSurfSide) - END IF ! offsetSurfSide.eq.0 ! SurfaceArea should be changed to 1:SurfMesh%nSides if inner sampling sides exist... helpArray(2,OutputCounter)= PhotonSampWall(2,iSurfSide)/SurfSideArea(1,1,iSurfSide) END DO @@ -179,7 +235,7 @@ SUBROUTINE WritePhotonSurfSampleToHDF5() END SUBROUTINE WritePhotonSurfSampleToHDF5 #if USE_MPI -SUBROUTINE MPI_ExchangeRadiationSurfData() +SUBROUTINE ExchangeRadiationSurfData() !=================================================================================================================================== ! exchange the surface data ! only processes with samling sides in their halo region and the original process participate on the communication @@ -194,11 +250,11 @@ SUBROUTINE MPI_ExchangeRadiationSurfData() USE MOD_Particle_MPI_Vars ,ONLY: SurfSendBuf,SurfRecvBuf USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall, PhotonSampWall_Shared, PhotonSampWall_Shared_Win USE MOD_MPI_Shared_Vars ,ONLY: MPI_COMM_LEADERS_SURF, MPI_COMM_SHARED, nSurfLeaders,myComputeNodeRank,mySurfRank -USE MOD_MPI_Shared +USE MOD_MPI_Shared !----------------------------------------------------------------------------------------------------------------------------------! ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE -! INPUT VARIABLES +! INPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------! ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- @@ -222,7 +278,7 @@ SUBROUTINE MPI_ExchangeRadiationSurfData() ! prepare buffers for surf leader communication IF (myComputeNodeRank.EQ.0) THEN nValues = 2 - + ! open receive buffer DO iProc = 0,nSurfLeaders-1 ! ignore myself @@ -320,7 +376,50 @@ SUBROUTINE MPI_ExchangeRadiationSurfData() CALL BARRIER_AND_SYNC(PhotonSampWall_Shared_Win ,MPI_COMM_SHARED) -END SUBROUTINE MPI_ExchangeRadiationSurfData +END SUBROUTINE ExchangeRadiationSurfData + + +SUBROUTINE ExchangeRayVolInfo() +!=================================================================================================================================== +! Writes DSMC state values to HDF5 +!=================================================================================================================================== +! MODULES +USE MOD_Globals +USE MOD_PreProc +USE MOD_MPI_Shared_Vars +USE MOD_MPI_Shared +USE MOD_RayTracing_Vars ,ONLY: RayElemPassedEnergy,RayElemPassedEnergy_Shared,RayElemPassedEnergy_Shared_Win +USE MOD_Mesh_Vars ,ONLY: nGlobalElems +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +INTEGER :: MessageSize +!=================================================================================================================================== +! Collect the information from the process-local shadow arrays in the compute-node shared array +MessageSize = nGlobalElems + +IF (myComputeNodeRank.EQ.0) THEN + CALL MPI_REDUCE(RayElemPassedEnergy , RayElemPassedEnergy_Shared , MessageSize , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_SHARED , IERROR) +ELSE + CALL MPI_REDUCE(RayElemPassedEnergy , 0 , MessageSize , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_SHARED , IERROR) +ENDIF +CALL BARRIER_AND_SYNC(RayElemPassedEnergy_Shared_Win, MPI_COMM_SHARED) + +IF(nLeaderGroupProcs.GT.1)THEN + IF(myComputeNodeRank.EQ.0)THEN + CALL MPI_ALLREDUCE(MPI_IN_PLACE,RayElemPassedEnergy_Shared,MessageSize,MPI_DOUBLE_PRECISION,MPI_SUM,MPI_COMM_LEADERS_SHARED,iError) + END IF + + CALL BARRIER_AND_SYNC(RayElemPassedEnergy_Shared_Win, MPI_COMM_SHARED) +END IF + +END SUBROUTINE ExchangeRayVolInfo #endif /*USE_MPI*/ END MODULE MOD_Photon_TrackingOutput diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 index 24a0dda6f..1a3b486ae 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 @@ -223,10 +223,10 @@ SUBROUTINE PhotonThroughSideCheck3DDir(iLocSide,CNElemID,ThroughSide,TriNum,Star END SUBROUTINE PhotonThroughSideCheck3DDir -SUBROUTINE PhotonIntersectionWithSide2D(iLocSide,Element,ThroughSide,IntersectionPos,isLastSide,Distance) !=================================================================================================================================== !> Routine to check whether a photon crossed the given side. !=================================================================================================================================== +SUBROUTINE PhotonIntersectionWithSide2D(iLocSide,Element,ThroughSide,IntersectionPos,isLastSide,Distance) ! MODULES USE MOD_Particle_Mesh_Vars ,ONLY: ElemSideNodeID2D_Shared, NodeCoords_Shared USE MOD_Photon_TrackingVars ,ONLY: PhotonProps @@ -368,10 +368,10 @@ SUBROUTINE PhotonIntersectionWithSide2D(iLocSide,Element,ThroughSide,Intersectio END SUBROUTINE PhotonIntersectionWithSide2D -SUBROUTINE PhotonIntersectionWithSide2DDir(iLocSide,CNElemID,ThroughSide,StartPoint, Dir, IntersectionPos, Distance) !=================================================================================================================================== !> Routine to check whether a photon crossed the given side. !=================================================================================================================================== +SUBROUTINE PhotonIntersectionWithSide2DDir(iLocSide,CNElemID,ThroughSide,StartPoint, Dir, IntersectionPos, Distance) ! MODULES USE MOD_Particle_Mesh_Vars, ONLY : ElemSideNodeID2D_Shared, NodeCoords_Shared ! IMPLICIT VARIABLE HANDLING @@ -477,10 +477,10 @@ SUBROUTINE PhotonIntersectionWithSide2DDir(iLocSide,CNElemID,ThroughSide,StartPo END SUBROUTINE PhotonIntersectionWithSide2DDir -SUBROUTINE RotatePhotonIn2DPlane(IntersectionPos) !=================================================================================================================================== !> Routine to check whether a photon crossed the given side. !=================================================================================================================================== +SUBROUTINE RotatePhotonIn2DPlane(IntersectionPos) ! MODULES USE MOD_Photon_TrackingVars ,ONLY: PhotonProps ! IMPLICIT VARIABLE HANDLING @@ -491,7 +491,7 @@ SUBROUTINE RotatePhotonIn2DPlane(IntersectionPos) !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES REAL :: NewYPho, NewYVelo - !=================================================================================================================================== +!=================================================================================================================================== PhotonProps%PhotonLastPos(1:3) = IntersectionPos(1:3) NewYPho = SQRT(PhotonProps%PhotonLastPos(2)**2 + PhotonProps%PhotonLastPos(3)**2) ! Rotation: Vy' = Vy * cos(alpha) + Vz * sin(alpha) = Vy * y/y' + Vz * z/y' @@ -510,10 +510,10 @@ SUBROUTINE RotatePhotonIn2DPlane(IntersectionPos) END SUBROUTINE RotatePhotonIn2DPlane +!=================================================================================================================================== +!> +!=================================================================================================================================== SUBROUTINE PhotonIntersectionWithSide(iLocSide,Element,TriNum, IntersectionPos, IsMortar) -!--------------------------------------------------------------------------------------------------! -!Based on PerfectReflection3D -!--------------------------------------------------------------------------------------------------! USE MOD_Particle_Mesh_Vars, ONLY : ElemSideNodeID_Shared, NodeCoords_Shared USE MOD_Photon_TrackingVars ,ONLY: PhotonProps USE MOD_Mesh_Tools ,ONLY: GetCNElemID @@ -607,10 +607,27 @@ SUBROUTINE PhotonIntersectionWithSide(iLocSide,Element,TriNum, IntersectionPos, END SUBROUTINE PhotonIntersectionWithSide -SUBROUTINE CalcAbsoprtionMC(IntersectionPos,Element, DONE) +!=================================================================================================================================== +!> +!=================================================================================================================================== +SUBROUTINE CalcAbsorptionRayTrace(GlobalElemID) +USE MOD_RayTracing_Vars ,ONLY: RayElemPassedEnergy +USE MOD_Photon_TrackingVars ,ONLY: PhotonProps !--------------------------------------------------------------------------------------------------! -!Based on PerfectReflection3D +IMPLICIT NONE +!--------------------------------------------------------------------------------------------------! +! argument list declaration +INTEGER, INTENT(IN) :: GlobalElemID +! Local variable declaration !--------------------------------------------------------------------------------------------------! +RayElemPassedEnergy(GlobalElemID) = RayElemPassedEnergy(GlobalElemID) + PhotonProps%PhotonEnergy +END SUBROUTINE CalcAbsorptionRayTrace + + +!=================================================================================================================================== +!> +!=================================================================================================================================== +SUBROUTINE CalcAbsoprtionMC(IntersectionPos,Element, DONE) USE MOD_Photon_TrackingVars ,ONLY: PhotonProps USE MOD_RadiationTrans_Vars ,ONLY: RadiationElemAbsEnergy USE MOD_Radiation_Vars ,ONLY: Radiation_Absorption_spec @@ -638,6 +655,9 @@ SUBROUTINE CalcAbsoprtionMC(IntersectionPos,Element, DONE) END SUBROUTINE CalcAbsoprtionMC +!=================================================================================================================================== +!> +!=================================================================================================================================== SUBROUTINE CalcAbsoprtionAnalytic(IntersectionPos,Element, DONE) !DEC$ ATTRIBUTES FORCEINLINE :: ParticleThroughSideLastPosCheck USE MOD_Globals @@ -675,6 +695,9 @@ SUBROUTINE CalcAbsoprtionAnalytic(IntersectionPos,Element, DONE) END SUBROUTINE CalcAbsoprtionAnalytic +!=================================================================================================================================== +!> +!=================================================================================================================================== SUBROUTINE CalcAbsoprtion(IntersectionPos,Element, DONE) USE MOD_Globals USE MOD_RadiationTrans_Vars ,ONLY: RadiationAbsorptionModel @@ -688,7 +711,7 @@ SUBROUTINE CalcAbsoprtion(IntersectionPos,Element, DONE) ! Local variable declaration !--------------------------------------------------------------------------------------------------! IF (RadiationAbsorptionModel.EQ.0) THEN - RETURN + CALL CalcAbsorptionRayTrace(Element) ELSEIF (RadiationAbsorptionModel.EQ.1) THEN CALL CalcAbsoprtionAnalytic(IntersectionPos,Element, DONE) ELSEIF (RadiationAbsorptionModel.EQ.2) THEN @@ -699,10 +722,10 @@ SUBROUTINE CalcAbsoprtion(IntersectionPos,Element, DONE) END SUBROUTINE CalcAbsoprtion +!=================================================================================================================================== +!> Based on PerfectReflection3D +!=================================================================================================================================== SUBROUTINE PerfectPhotonReflection(iLocSide,Element,TriNum, IntersectionPos, IntersecAlreadyCalc) -!--------------------------------------------------------------------------------------------------! -!Based on PerfectReflection3D -!--------------------------------------------------------------------------------------------------! USE MOD_Particle_Mesh_Vars ,ONLY: NodeCoords_Shared, ElemSideNodeID_Shared USE MOD_Photon_TrackingVars ,ONLY: PhotonProps USE MOD_Mesh_Tools ,ONLY: GetCNElemID @@ -800,9 +823,9 @@ SUBROUTINE PerfectPhotonReflection2D(iLocSide,Element, IntersectionPos) !--------------------------------------------------------------------------------------------------! !Based on PerfectReflection3D !--------------------------------------------------------------------------------------------------! -USE MOD_Particle_Mesh_Vars, ONLY : SideNormalEdge2D_Shared +USE MOD_Particle_Mesh_Vars ,ONLY: SideNormalEdge2D_Shared USE MOD_Photon_TrackingVars ,ONLY: PhotonProps -USE MOD_Mesh_Tools ,ONLY: GetCNElemID +USE MOD_Mesh_Tools ,ONLY: GetCNElemID !--------------------------------------------------------------------------------------------------! IMPLICIT NONE !--------------------------------------------------------------------------------------------------! diff --git a/src/radiation/ray_tracing/raytrace.f90 b/src/radiation/ray_tracing/raytrace.f90 index 32c13cfe1..783728458 100644 --- a/src/radiation/ray_tracing/raytrace.f90 +++ b/src/radiation/ray_tracing/raytrace.f90 @@ -35,15 +35,16 @@ MODULE MOD_RayTracing CONTAINS -SUBROUTINE RayTracing() !=================================================================================================================================== !> Main routine for the Radiation Transport !=================================================================================================================================== +SUBROUTINE RayTracing() ! MODULES USE MOD_Globals USE MOD_MPI_Shared_Vars USE MOD_MPI_Shared -USE MOD_RayTracing_Vars ,ONLY: RayPartBound,NumRays,Ray +USE MOD_RayTracing_Vars ,ONLY: RayPartBound,NumRays,Ray,RayElemPassedEnergy,RayElemPassedEnergy_Shared_Win +USE MOD_RayTracing_Vars ,ONLY: RayElemPassedEnergy_Shared USE MOD_Photon_TrackingVars ,ONLY: PhotonProps USE MOD_Photon_Tracking ,ONLY: PhotonTriaTracking USE MOD_Mesh_Tools ,ONLY: GetGlobalElemID @@ -54,7 +55,14 @@ SUBROUTINE RayTracing() USE MOD_Particle_Mesh_Vars ,ONLY: SideInfo_Shared USE MOD_Particle_Boundary_Tools ,ONLY: StoreBoundaryParticleProperties USE MOD_Particle_Boundary_Vars ,ONLY: PartStateBoundary,nVarPartStateBoundary -USE MOD_Photon_TrackingOutput ,ONLY: WritePhotonSurfSampleToHDF5 +USE MOD_Photon_TrackingOutput ,ONLY: WritePhotonSurfSampleToHDF5,WritePhotonVolSampleToHDF5 +#if USE_MPI +USE MOD_MPI_Shared_Vars +USE MOD_MPI_Shared +USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall_Shared, PhotonSampWall_Shared_Win +#endif /*USE_MPI*/ +USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall +USE MOD_Mesh_Vars ,ONLY: nGlobalElems ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -63,22 +71,37 @@ SUBROUTINE RayTracing() ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -INTEGER :: NonUniqueGlobalSideID,iSurfSide,iBC -INTEGER :: CNElemID, iRay, photonCount, iPhot, iPhotLoc, RayVisCount, LocRayNum, RayDisp -!INTEGER :: firstElem, lastElem, firstPhoton, lastPhoton -!REAL :: Bounds(1:2,1:3) ! Bounds(1,1:3) --> maxCoords , Bounds(2,1:3) --> minCoords -!REAL :: RandRot(3,3) !, PartPos(1:3) -!LOGICAL :: found +INTEGER :: NonUniqueGlobalSideID,iSurfSide,iBC +INTEGER :: CNElemID, iRay, photonCount, iPhot, iPhotLoc, RayVisCount, LocRayNum, RayDisp LOGICAL :: FoundComputeNodeSurfSide INTEGER :: ALLOCSTAT REAL :: RectPower -REAL :: StartT,EndT ! Timer +REAL :: StartT,EndT ! Timer !=================================================================================================================================== IF(RayPartBound.EQ.0) RETURN GETTIME(StartT) SWRITE(UNIT_stdOut,'(A)') ' Start Ray Tracing Calculation ...' +! Allocate arrays +ALLOCATE(RayElemPassedEnergy(1:nGlobalElems)) +RayElemPassedEnergy=0.0 +ALLOCATE(PhotonSampWall(2,1:nComputeNodeSurfTotalSides)) +PhotonSampWall=0.0 + +#if USE_MPI +!> Shared arrays for volume sampling +CALL Allocate_Shared((/nGlobalElems/),RayElemPassedEnergy_Shared_Win,RayElemPassedEnergy_Shared) +CALL MPI_WIN_LOCK_ALL(0,RayElemPassedEnergy_Shared_Win,IERROR) +!> Shared arrays for boundary sampling +CALL Allocate_Shared((/2,nComputeNodeSurfTotalSides/),PhotonSampWall_Shared_Win,PhotonSampWall_Shared) +CALL MPI_WIN_LOCK_ALL(0,PhotonSampWall_Shared_Win,IERROR) +IF (myComputeNodeRank.EQ.0) RayElemPassedEnergy_Shared = 0. +IF (myComputeNodeRank.EQ.0) PhotonSampWall_Shared = 0. +CALL BARRIER_AND_SYNC(RayElemPassedEnergy_Shared_Win,MPI_COMM_SHARED) +CALL BARRIER_AND_SYNC(PhotonSampWall_Shared_Win,MPI_COMM_SHARED) +#endif + photonCount = 0 RayVisCount = 0 IF(nProcessors.GT.NumRays) CALL abort(__STAMP__,'Use more rays! Number of processes > Number of rays') @@ -155,28 +178,8 @@ SUBROUTINE RayTracing() Velo_optIN=PhotonProps%PhotonDirection(1:3)) END IF !PhotonProps%ElemID.LE.0 - - - !IF ((photonCount.LT.firstPhoton)) THEN - !iPhotLoc = firstPhoton - photonCount + iPhot - 1 - !ELSE - iPhotLoc = iPhot - !END IF - !IF ((RadObservationPointMethod.EQ.2).AND.RadObservationPoint%CalcFullSpectra) THEN - !PhotonProps%WaveLength = Ray%WaveLength - !ELSE - !IF (RadiationPhotonWaveLengthModel.EQ.1) THEN - !PhotonProps%WaveLength = SetParticleWavelengthAR(iCNElem) - !ELSE - !PhotonProps%WaveLength = SetParticleWavelengthBiSec(iCNElem) - !END IF - !END IF - !PhotonProps%PhotonEnergy = SetPhotonEnergy(CNElemID,PhotonProps%PhotonPos(1:3), PhotonProps%WaveLength) - !IPWRITE(UNIT_StdOut,*) "iRay =", iRay CALL PhotonTriaTracking() - !IF(myrank.eq.0) read* END DO -!photonCount = photonCount + RadTransPhotPerCell(iELem) ! Print 100% IF(MPIroot)THEN @@ -186,6 +189,8 @@ SUBROUTINE RayTracing() CALL WritePhotonSurfSampleToHDF5() +CALL WritePhotonVolSampleToHDF5() + GETTIME(EndT) CALL DisplayMessageAndTime(EndT-StartT, ' DONE!', DisplayDespiteLB=.TRUE., DisplayLine=.FALSE.) diff --git a/src/radiation/ray_tracing/raytrace_ini.f90 b/src/radiation/ray_tracing/raytrace_ini.f90 index e896bbae5..293636340 100644 --- a/src/radiation/ray_tracing/raytrace_ini.f90 +++ b/src/radiation/ray_tracing/raytrace_ini.f90 @@ -60,17 +60,9 @@ SUBROUTINE InitRayTracing() USE MOD_Globals USE MOD_ReadInTools USE MOD_RayTracing_Vars -USE MOD_Mesh_Vars ,ONLY: nGlobalElems USE MOD_Globals_Vars ,ONLY: Pi USE MOD_Particle_Mesh_Vars ,ONLY: GEO -USE MOD_Particle_Boundary_Vars ,ONLY: nComputeNodeSurfTotalSides -#if USE_MPI -USE MOD_MPI_Shared_Vars -USE MOD_MPI_Shared -USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall_Shared, PhotonSampWall_Shared_Win -#endif /*USE_MPI*/ USE MOD_RadiationTrans_Vars ,ONLY: RadiationAbsorptionModel,RadObservationPointMethod -USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -144,29 +136,6 @@ SUBROUTINE InitRayTracing() CALL PrintOption('Temporal pulse width (pulse time 2x tShift) [s]' , 'CALCUL.' , RealOpt=2.0*Ray%tShift) CALL PrintOption('Pulse will end at tActive (pulse final time) [s]' , 'CALCUL.' , RealOpt=Ray%tActive) -! Allocate arrays -ALLOCATE(RayElemPassedEnergy(1:nGlobalElems)) -RayElemPassedEnergy=0.0 - -#if USE_MPI -CALL Allocate_Shared((/nGlobalElems/),RayElemPassedEnergy_Shared_Win,RayElemPassedEnergy_Shared) -CALL MPI_WIN_LOCK_ALL(0,RayElemPassedEnergy_Shared_Win,IERROR) -IF (myComputeNodeRank.EQ.0) RayElemPassedEnergy_Shared = 0. -CALL BARRIER_AND_SYNC(RayElemPassedEnergy_Shared_Win,MPI_COMM_SHARED) -#endif /*USE_MPI*/ - -ALLOCATE(PhotonSampWall(2,1:nComputeNodeSurfTotalSides)) -PhotonSampWall=0.0 - -#if USE_MPI -!> Then shared arrays for boundary sampling -CALL Allocate_Shared((/2,nComputeNodeSurfTotalSides/),PhotonSampWall_Shared_Win,PhotonSampWall_Shared) -CALL MPI_WIN_LOCK_ALL(0,PhotonSampWall_Shared_Win,IERROR) - -IF (myComputeNodeRank.EQ.0) PhotonSampWall_Shared = 0. -CALL BARRIER_AND_SYNC(PhotonSampWall_Shared_Win,MPI_COMM_SHARED) -#endif - SWRITE(UNIT_stdOut,'(A)')' INIT RAY TRACING SOLVER DONE!' SWRITE(UNIT_StdOut,'(132("-"))') END SUBROUTINE InitRayTracing From 67f59928755125f12f07f9ffefc950d7e540e6df Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Tue, 16 May 2023 20:02:22 +0200 Subject: [PATCH 077/495] Fixed MPI=OFF --- .../tracking/radtrans_tracking_output.f90 | 8 ++++++++ src/radiation/ray_tracing/raytrace.f90 | 4 ++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 index b38db16a8..9405de4a7 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 @@ -40,7 +40,11 @@ SUBROUTINE WritePhotonVolSampleToHDF5() USE MOD_PreProc USE MOD_Mesh_Vars ,ONLY: nElems,MeshFile,offSetElem USE MOD_Globals_Vars ,ONLY: ProjectName +#if USE_MPI USE MOD_RayTracing_Vars ,ONLY: RayElemPassedEnergy_Shared +#else +USE MOD_RayTracing_Vars ,ONLY: RayElemPassedEnergy +#endif /*USE_MPI*/ USE MOD_io_HDF5 USE MOD_HDF5_output ,ONLY: GenerateFileSkeleton USE MOD_HDF5_Output_ElemData ,ONLY: WriteAdditionalElemData @@ -80,7 +84,11 @@ SUBROUTINE WritePhotonVolSampleToHDF5() #endif /*USE_MPI*/ DO iElem=1,PP_nElems +#if USE_MPI RayElemPassedEnergyLoc(iElem) = RayElemPassedEnergy_Shared(iElem+offSetElem) +#else + RayElemPassedEnergyLoc(iElem) = RayElemPassedEnergy(iElem+offSetElem) +#endif /*USE_MPI*/ END DO ! Write all 'ElemData' arrays to a single container in the state.h5 file diff --git a/src/radiation/ray_tracing/raytrace.f90 b/src/radiation/ray_tracing/raytrace.f90 index 783728458..f61a3e6ce 100644 --- a/src/radiation/ray_tracing/raytrace.f90 +++ b/src/radiation/ray_tracing/raytrace.f90 @@ -43,8 +43,7 @@ SUBROUTINE RayTracing() USE MOD_Globals USE MOD_MPI_Shared_Vars USE MOD_MPI_Shared -USE MOD_RayTracing_Vars ,ONLY: RayPartBound,NumRays,Ray,RayElemPassedEnergy,RayElemPassedEnergy_Shared_Win -USE MOD_RayTracing_Vars ,ONLY: RayElemPassedEnergy_Shared +USE MOD_RayTracing_Vars ,ONLY: RayPartBound,NumRays,Ray,RayElemPassedEnergy USE MOD_Photon_TrackingVars ,ONLY: PhotonProps USE MOD_Photon_Tracking ,ONLY: PhotonTriaTracking USE MOD_Mesh_Tools ,ONLY: GetGlobalElemID @@ -60,6 +59,7 @@ SUBROUTINE RayTracing() USE MOD_MPI_Shared_Vars USE MOD_MPI_Shared USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall_Shared, PhotonSampWall_Shared_Win +USE MOD_RayTracing_Vars ,ONLY: RayElemPassedEnergy_Shared,RayElemPassedEnergy_Shared_Win #endif /*USE_MPI*/ USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall USE MOD_Mesh_Vars ,ONLY: nGlobalElems From ce4f6a14c13b565f276791fc1b668ded944e80d6 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Tue, 16 May 2023 21:43:30 +0200 Subject: [PATCH 078/495] Periodic ray tracing --- .../boundary/particle_boundary_condition.f90 | 4 +- .../tracking/radtrans_tracking.f90 | 10 +- .../tracking/radtrans_tracking_tools.f90 | 96 +++++++++++++++++++ 3 files changed, 106 insertions(+), 4 deletions(-) diff --git a/src/particles/boundary/particle_boundary_condition.f90 b/src/particles/boundary/particle_boundary_condition.f90 index c23e297f8..437d59231 100644 --- a/src/particles/boundary/particle_boundary_condition.f90 +++ b/src/particles/boundary/particle_boundary_condition.f90 @@ -185,8 +185,6 @@ SUBROUTINE GetBoundaryInteraction(iPart,SideID,flip,ElemID,crossedBC,TriNum) END SUBROUTINE GetBoundaryInteraction - - SUBROUTINE PeriodicBC(PartID,SideID,ElemID) !----------------------------------------------------------------------------------------------------------------------------------! ! Computes the perfect reflection in 3D @@ -241,7 +239,7 @@ SUBROUTINE PeriodicBC(PartID,SideID,ElemID) LastPartPos(1:3,PartID) = LastPartPos(1:3,PartID) + TrackInfo%PartTrajectory(1:3)*TrackInfo%alpha ! perform the periodic movement LastPartPos(1:3,PartID) = LastPartPos(1:3,PartID) + SIGN( GEO%PeriodicVectors(1:3,ABS(PVID)),REAL(PVID)) -! update particle positon after periodic BC +! update particle position after periodic BC PartState(1:3,PartID) = LastPartPos(1:3,PartID) + (TrackInfo%lengthPartTrajectory-TrackInfo%alpha)*TrackInfo%PartTrajectory TrackInfo%lengthPartTrajectory = TrackInfo%lengthPartTrajectory - TrackInfo%alpha diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 index 3a10d3e3a..737fe5347 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 @@ -55,6 +55,7 @@ SUBROUTINE PhotonTriaTracking() USE MOD_RadiationTrans_Vars, ONLY:RadObservation_Emission, RadObservationPointMethod, RadObservation_EmissionPart USE MOD_Photon_TrackingTools, ONLY:PhotonThroughSideCheck3DFast, PhotonIntersectionWithSide,CalcAbsoprtion,PhotonOnLineOfSight USE MOD_Photon_TrackingTools, ONLY:PerfectPhotonReflection, DiffusePhotonReflection, CalcWallAbsoprtion, PointInObsCone +USE MOD_Photon_TrackingTools, ONLY:PeriodicPhotonBC USE MOD_Photon_TrackingTools, ONLY:PhotonIntersectSensor USE MOD_Particle_Boundary_Tools,ONLY: StoreBoundaryParticleProperties IMPLICIT NONE @@ -242,7 +243,7 @@ SUBROUTINE PhotonTriaTracking() END IF END IF DONE = .TRUE. - CASE(2) + CASE(2) ! PartBound%ReflectiveBC IF (PartBound%PhotonSpecularReflection(PartBound%MapToPartBC(SideInfo_Shared(SIDE_BCID,SideID)))) THEN IF (NrOfThroughSides.LT.2) THEN CALL PerfectPhotonReflection(LocalSide,ElemID,TriNum, IntersectionPos, .FALSE.) @@ -259,6 +260,13 @@ SUBROUTINE PhotonTriaTracking() CALL CalcAbsoprtion(IntersectionPos(1:3),ElemID, DONE) IF (.NOT.DONE) CALL CalcWallAbsoprtion(SideID, DONE) END IF + CASE(3) ! PartBound%PeriodicBC + CALL CalcAbsoprtion(IntersectionPos(1:3),ElemID, DONE) + IF (NrOfThroughSides.LT.2) THEN + CALL PeriodicPhotonBC(LocalSide,ElemID,TriNum,IntersectionPos,.FALSE.,SideID) + ELSE + CALL PeriodicPhotonBC(LocalSide,ElemID,TriNum,IntersectionPos,.TRUE.,SideID) + END IF CASE DEFAULT CALL abort(__STAMP__,' ERROR: PartBound not associated!. (unknown case)',BCType,999.) END SELECT !PartBound%MapToPartBC(BC(SideID) diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 index 1a3b486ae..48c640baa 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 @@ -28,6 +28,7 @@ MODULE MOD_Photon_TrackingTools PUBLIC :: PhotonThroughSideCheck3DFast, PhotonIntersectionWithSide, CalcAbsoprtion, PerfectPhotonReflection, DiffusePhotonReflection PUBLIC :: CalcWallAbsoprtion, PointInObsCone, PhotonIntersectSensor, PhotonThroughSideCheck3DDir, PhotonIntersectionWithSide2DDir PUBLIC :: PhotonIntersectionWithSide2D, RotatePhotonIn2DPlane, PerfectPhotonReflection2D,DiffusePhotonReflection2D, PhotonOnLineOfSight +PUBLIC :: PeriodicPhotonBC !----------------------------------------------------------------------------------------------------------------------------------- !----------------------------------------------------------------------------------------------------------------------------------- !=================================================================================================================================== @@ -1029,6 +1030,101 @@ SUBROUTINE DiffusePhotonReflection2D(iLocSide,Element, IntersectionPos) END SUBROUTINE DiffusePhotonReflection2D +SUBROUTINE PeriodicPhotonBC(iLocSide, Element, TriNum, IntersectionPos, IntersecAlreadyCalc, SideID) +!----------------------------------------------------------------------------------------------------------------------------------! +! Computes the perfect reflection in 3D +!----------------------------------------------------------------------------------------------------------------------------------! +! MODULES ! +!----------------------------------------------------------------------------------------------------------------------------------! +USE MOD_Globals +USE MOD_Particle_Mesh_Vars ,ONLY: ElemSideNodeID_Shared, NodeCoords_Shared +USE MOD_Mesh_Vars ,ONLY: BoundaryType +USE MOD_Particle_Mesh_Vars ,ONLY: GEO +USE MOD_Photon_TrackingVars ,ONLY: PhotonProps +USE MOD_Particle_Tracking_Vars ,ONLY: TrackInfo +USE MOD_Particle_Mesh_Vars ,ONLY: SideInfo_Shared +USE MOD_Mesh_Tools ,ONLY: GetCNElemID +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------! +! INPUT VARIABLES +INTEGER,INTENT(IN) :: iLocSide +INTEGER,INTENT(IN) :: TriNum +INTEGER,INTENT(IN) :: SideID +LOGICAL,INTENT(IN) :: IntersecAlreadyCalc +!----------------------------------------------------------------------------------------------------------------------------------! +! OUTPUT VARIABLES +INTEGER,INTENT(INOUT) :: Element +REAL, INTENT(INOUT) :: IntersectionPos(1:3) +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +INTEGER :: PVID +!INTEGER :: moved(2),locSideID +! Local variable declaration +INTEGER :: CNElemID +INTEGER :: Node1, Node2 +REAL :: PoldX, PoldY, PoldZ, nx, ny, nz, nVal +REAL :: xNod, yNod, zNod, VecX, VecY, VecZ +REAL :: VelX, VelY, VelZ, VeloCx, VeloCy, VeloCz, NormVec, RanNum +REAL :: Vector1(1:3), Vector2(1:3), POI_fak +!=================================================================================================================================== +CNElemID = GetCNElemID(Element) +PoldX = PhotonProps%PhotonLastPos(1) +PoldY = PhotonProps%PhotonLastPos(2) +PoldZ = PhotonProps%PhotonLastPos(3) + +VelX = PhotonProps%PhotonDirection(1) +VelY = PhotonProps%PhotonDirection(2) +VelZ = PhotonProps%PhotonDirection(3) + +xNod = NodeCoords_Shared(1,ElemSideNodeID_Shared(1,iLocSide,CNElemID)+1) +yNod = NodeCoords_Shared(2,ElemSideNodeID_Shared(1,iLocSide,CNElemID)+1) +zNod = NodeCoords_Shared(3,ElemSideNodeID_Shared(1,iLocSide,CNElemID)+1) + +!---- Calculate normal vector: + +Node1 = TriNum+1 ! normal = cross product of 1-2 and 1-3 for first triangle +Node2 = TriNum+2 ! and 1-3 and 1-4 for second triangle + +Vector1(1) = NodeCoords_Shared(1,ElemSideNodeID_Shared(Node1,iLocSide,CNElemID)+1) - xNod +Vector1(2) = NodeCoords_Shared(2,ElemSideNodeID_Shared(Node1,iLocSide,CNElemID)+1) - yNod +Vector1(3) = NodeCoords_Shared(3,ElemSideNodeID_Shared(Node1,iLocSide,CNElemID)+1) - zNod + +Vector2(1) = NodeCoords_Shared(1,ElemSideNodeID_Shared(Node2,iLocSide,CNElemID)+1) - xNod +Vector2(2) = NodeCoords_Shared(2,ElemSideNodeID_Shared(Node2,iLocSide,CNElemID)+1) - yNod +Vector2(3) = NodeCoords_Shared(3,ElemSideNodeID_Shared(Node2,iLocSide,CNElemID)+1) - zNod + +!---- Calculate Point of Intersection (POI) +IF (.NOT.IntersecAlreadyCalc) THEN + POI_fak = (Vector2(2)*(Vector1(1)*(zNod-PoldZ)+Vector1(3)*(PoldX-xNod)) & + +Vector1(2)*(Vector2(1)*(PoldZ-zNod)+Vector2(3)*(xNod-PoldX)) & + +yNod*(Vector1(3)*Vector2(1)-Vector1(1)*Vector2(3)) & + +PoldY*(Vector1(1)*Vector2(3)-Vector1(3)*Vector2(1))) & + /(Vector1(2)*(Vector2(3)*VelX-Vector2(1)*VelZ) & + + Vector2(2)*(Vector1(1)*VelZ-Vector1(3)*VelX) & + + VelY*(Vector1(3)*Vector2(1)-Vector1(1)*Vector2(3))) + + IntersectionPos(1) = PoldX + POI_fak * VelX + IntersectionPos(2) = PoldY + POI_fak * VelY + IntersectionPos(3) = PoldZ + POI_fak * VelZ +END IF + +! set last particle position on face +PhotonProps%PhotonLastPos = IntersectionPos +! perform the periodic movement +PVID = BoundaryType(SideInfo_Shared(SIDE_BCID,SideID),BC_ALPHA) +PhotonProps%PhotonLastPos = PhotonProps%PhotonLastPos + SIGN( GEO%PeriodicVectors(1:3,ABS(PVID)),REAL(PVID)) +! update particle positon after periodic BC +!PartState(1:3,PartID) = PhotonProps%PhotonLastPos + (TrackInfo%lengthPartTrajectory-TrackInfo%alpha)*TrackInfo%PartTrajectory +!TrackInfo%lengthPartTrajectory = TrackInfo%lengthPartTrajectory - TrackInfo%alpha + +! refmapping and tracing +! move particle from old element to new element +Element = SideInfo_Shared(SIDE_NBELEMID,SideID) + +END SUBROUTINE PeriodicPhotonBC + + SUBROUTINE CalcWallAbsoprtion(GlobSideID, DONE) USE MOD_Photon_TrackingVars ,ONLY: PhotonProps,PhotonSampWall USE MOD_Particle_Boundary_Vars ,ONLY: PartBound, GlobalSide2SurfSide From e876cec1d5d86ae24e0efe8716f1df29f63fbdef Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Wed, 17 May 2023 14:32:53 +0200 Subject: [PATCH 079/495] Added info of ray tracing angle between ray direction vector and ray emission surface area normal vector to std.out --- src/radiation/ray_tracing/raytrace_ini.f90 | 46 +++++++++++++--------- 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/src/radiation/ray_tracing/raytrace_ini.f90 b/src/radiation/ray_tracing/raytrace_ini.f90 index 293636340..e9a63946f 100644 --- a/src/radiation/ray_tracing/raytrace_ini.f90 +++ b/src/radiation/ray_tracing/raytrace_ini.f90 @@ -71,7 +71,7 @@ SUBROUTINE InitRayTracing() ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -REAL :: factor +REAL :: factor,SurfaceNormal(3),alpha !=================================================================================================================================== SWRITE(UNIT_StdOut,'(132("-"))') SWRITE(UNIT_stdOut,'(A)') ' INIT RAY TRACING SOLVER ...' @@ -85,15 +85,16 @@ SUBROUTINE InitRayTracing() IF(RayPartBound.LT.0) CALL CollectiveStop(__STAMP__,'RayTracing-PartBound must be > 0 to activate ray tracing on this boundary!') ! Get ray parameters -Ray%PulseDuration = GETREAL('RayTracing-PulseDuration') -Ray%NbrOfPulses = GETINT('RayTracing-NbrOfPulses') -Ray%tShift = SQRT(8.0) * Ray%PulseDuration -Ray%WaistRadius = GETREAL('RayTracing-WaistRadius') -Ray%WaveLength = GETREAL('RayTracing-WaveLength') -Ray%RepetitionRate = GETREAL('RayTracing-RepetitionRate') -Ray%Period = 1./Ray%RepetitionRate -Ray%Power = GETREAL('RayTracing-Power') -Ray%Direction = GETREALARRAY('RayTracing-RayDirection',3) +Ray%PulseDuration = GETREAL('RayTracing-PulseDuration') +Ray%NbrOfPulses = GETINT('RayTracing-NbrOfPulses') +Ray%tShift = SQRT(8.0) * Ray%PulseDuration +Ray%WaistRadius = GETREAL('RayTracing-WaistRadius') +Ray%WaveLength = GETREAL('RayTracing-WaveLength') +Ray%RepetitionRate = GETREAL('RayTracing-RepetitionRate') +Ray%Period = 1./Ray%RepetitionRate +Ray%Power = GETREAL('RayTracing-Power') +Ray%Direction = GETREALARRAY('RayTracing-RayDirection',3) +Ray%Direction = UNITVECTOR(Ray%Direction) AdaptiveRays = GETLOGICAL('RayTracing-AdaptiveRays') NumRays = GETINT('RayTracing-NumRays') @@ -110,8 +111,16 @@ SUBROUTINE InitRayTracing() A => Ray%Area ) ! Derived quantities E0 = Ray%Power / Ray%RepetitionRate + ! Rectangle - A = (GEO%xmaxglob-GEO%xminglob) * (GEO%ymaxglob-GEO%yminglob) + ! Ray emission area + A = (GEO%xmaxglob-GEO%xminglob) * (GEO%ymaxglob-GEO%yminglob) + ! Normal vector of the ray emission area + SurfaceNormal = (/ 0., 0., 1. /) + ! Angle between emitted rays and emission area + alpha = (90.-ABS(90.-(180./PI)*ACOS(DOT_PRODUCT(Ray%Direction,SurfaceNormal)))) + + ! Calculate the peak intensity (uncorrected) I0 = E0 / (SQRT(PI)*tau*A) ! Correction factor due to temporal cut-off of the Gaussian pulse @@ -128,13 +137,14 @@ SUBROUTINE InitRayTracing() tActive = REAL(Ray%NbrOfPulses - 1)*Period + 2.0*tShift END ASSOCIATE -CALL PrintOption('Rectangular ray emission area: A [m2]' , 'CALCUL.' , RealOpt=Ray%Area) -CALL PrintOption('Single pulse energy [J]' , 'CALCUL.' , RealOpt=Ray%Energy) -CALL PrintOption('Intensity amplitude: I0 [W/m^2]' , 'CALCUL.' , RealOpt=Ray%IntensityAmplitude) -CALL PrintOption('Corrected Intensity amplitude: I0_corr [W/m^2]' , 'CALCUL.' , RealOpt=Ray%IntensityAmplitude) -CALL PrintOption('Pulse period (Time between maximum of two pulses) [s]' , 'CALCUL.' , RealOpt=Ray%Period) -CALL PrintOption('Temporal pulse width (pulse time 2x tShift) [s]' , 'CALCUL.' , RealOpt=2.0*Ray%tShift) -CALL PrintOption('Pulse will end at tActive (pulse final time) [s]' , 'CALCUL.' , RealOpt=Ray%tActive) +CALL PrintOption('Rectangular ray emission area: A [m2]' , 'CALCUL.' , RealOpt=Ray%Area) +CALL PrintOption('Angle between emission area normal and ray direction: alpha [deg]' , 'CALCUL.' , RealOpt=alpha) +CALL PrintOption('Single pulse energy [J]' , 'CALCUL.' , RealOpt=Ray%Energy) +CALL PrintOption('Intensity amplitude: I0 [W/m^2]' , 'CALCUL.' , RealOpt=Ray%IntensityAmplitude) +CALL PrintOption('Corrected Intensity amplitude: I0_corr [W/m^2]' , 'CALCUL.' , RealOpt=Ray%IntensityAmplitude) +CALL PrintOption('Pulse period (Time between maximum of two pulses) [s]' , 'CALCUL.' , RealOpt=Ray%Period) +CALL PrintOption('Temporal pulse width (pulse time 2x tShift) [s]' , 'CALCUL.' , RealOpt=2.0*Ray%tShift) +CALL PrintOption('Pulse will end at tActive (pulse final time) [s]' , 'CALCUL.' , RealOpt=Ray%tActive) SWRITE(UNIT_stdOut,'(A)')' INIT RAY TRACING SOLVER DONE!' SWRITE(UNIT_StdOut,'(132("-"))') From 93e7255bf49024a24bdd19a8c8105e5dacf5e7cc Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Mon, 22 May 2023 21:38:44 +0200 Subject: [PATCH 080/495] Updated ray tracing reggie for periodic sides --- .../hopr.ini | 52 +++++++++---------- .../parameter.ini | 22 ++++---- 2 files changed, 37 insertions(+), 37 deletions(-) diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/hopr.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/hopr.ini index 5704c1882..26d400d3e 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/hopr.ini +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/hopr.ini @@ -18,42 +18,42 @@ useCurveds =F ! T if curved boundaries defined SpaceQuandt =1. ! characteristic length of the mesh ConformConnect=T -!=============================================================================== ! -! BOUNDARY CONDITIONS -!=============================================================================== ! -nUserDefinedBoundaries=6 -BoundaryName=BC_periodicx- ! Periodic (+vv1) -BoundaryType=(/4,0,0,0/) ! Periodic (+vv1) -BoundaryName=BC_periodicx+ ! Periodic (-vv1) -BoundaryType=(/4,0,0,0/) ! Periodic (-vv1) -BoundaryName=BC_periodicy- ! Periodic (+vv2) -BoundaryType=(/4,0,0,0/) ! Periodic (+vv2) -BoundaryName=BC_periodicy+ ! Periodic (-vv2) -BoundaryType=(/4,0,0,0/) ! Periodic (-vv2) -BoundaryName=BC_WALL -BoundaryType=(/4,0,0,0/) -BoundaryName=BC_TOP -BoundaryType=(/4,0,0,0/) - - -! PERIODIC ! !=============================================================================== ! ! ! BOUNDARY CONDITIONS ! !=============================================================================== ! ! nUserDefinedBoundaries=6 ! BoundaryName=BC_periodicx- ! Periodic (+vv1) -! BoundaryType=(/1,0,0,1/) ! Periodic (+vv1) +! BoundaryType=(/4,0,0,0/) ! Periodic (+vv1) ! BoundaryName=BC_periodicx+ ! Periodic (-vv1) -! BoundaryType=(/1,0,0,-1/) ! Periodic (-vv1) +! BoundaryType=(/4,0,0,0/) ! Periodic (-vv1) ! BoundaryName=BC_periodicy- ! Periodic (+vv2) -! BoundaryType=(/1,0,0,2/) ! Periodic (+vv2) +! BoundaryType=(/4,0,0,0/) ! Periodic (+vv2) ! BoundaryName=BC_periodicy+ ! Periodic (-vv2) -! BoundaryType=(/1,0,0,-2/) ! Periodic (-vv2) +! BoundaryType=(/4,0,0,0/) ! Periodic (-vv2) ! BoundaryName=BC_WALL ! BoundaryType=(/4,0,0,0/) ! BoundaryName=BC_TOP ! BoundaryType=(/4,0,0,0/) ! -! nVV=2 -! VV=(/1.0 , 0. , 0./) -! VV=(/0. , 1.0 , 0./) +! +! PERIODIC +! !=============================================================================== ! +! ! BOUNDARY CONDITIONS +!=============================================================================== ! +nUserDefinedBoundaries=6 +BoundaryName=BC_periodicx- ! Periodic (+vv1) +BoundaryType=(/1,0,0,1/) ! Periodic (+vv1) +BoundaryName=BC_periodicx+ ! Periodic (-vv1) +BoundaryType=(/1,0,0,-1/) ! Periodic (-vv1) +BoundaryName=BC_periodicy- ! Periodic (+vv2) +BoundaryType=(/1,0,0,2/) ! Periodic (+vv2) +BoundaryName=BC_periodicy+ ! Periodic (-vv2) +BoundaryType=(/1,0,0,-2/) ! Periodic (-vv2) +BoundaryName=BC_WALL +BoundaryType=(/4,0,0,0/) +BoundaryName=BC_TOP +BoundaryType=(/4,0,0,0/) + +nVV=2 +VV=(/1.0 , 0. , 0./) +VV=(/0. , 1.0 , 0./) diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/parameter.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/parameter.ini index 2d9e0fbb8..3ee754334 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/parameter.ini +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/parameter.ini @@ -77,20 +77,20 @@ Part-maxParticleNumber = 4000000 Part-nBounds = 6 Part-Boundary1-SourceName = BC_periodicx- -!Part-Boundary1-Condition = periodic -Part-Boundary1-Condition = open +Part-Boundary1-Condition = periodic +!Part-Boundary1-Condition = open Part-Boundary2-SourceName = BC_periodicx+ -!Part-Boundary2-Condition = periodic -Part-Boundary2-Condition = open +Part-Boundary2-Condition = periodic +!Part-Boundary2-Condition = open Part-Boundary3-SourceName = BC_periodicy- -!Part-Boundary3-Condition = periodic -Part-Boundary3-Condition = open +Part-Boundary3-Condition = periodic +!Part-Boundary3-Condition = open Part-Boundary4-SourceName = BC_periodicy+ -!Part-Boundary4-Condition = periodic -Part-Boundary4-Condition = open +Part-Boundary4-Condition = periodic +!Part-Boundary4-Condition = open Part-Boundary5-SourceName = BC_WALL !Part-Boundary5-Condition = open @@ -103,7 +103,7 @@ Part-Boundary6-SourceName = BC_TOP Part-Boundary6-Condition = reflective !Part-Boundary6-BoundaryParticleOutput = T -!Part-nPeriodicVectors = 2 +Part-nPeriodicVectors = 2 Part-FIBGMdeltas = (/ 1.0 , 1.0 , 1.0 /) Part-FactorFIBGM = (/ 5 , 5 , 5 /) @@ -112,13 +112,13 @@ Part-FactorFIBGM = (/ 5 , 5 , 5 /) ! =============================================================================== ! Particles-DSMC-CalcSurfaceVal = T ! activate InitParticleBoundarySampling RayTracing-PartBound = 6 ! -> iBC=6 -RayTracing-NumRays = 200000 +RayTracing-NumRays = 20000 RayTracing-PulseDuration = 15e-9 RayTracing-WaveLength = 10e-9 RayTracing-Power = 1.0 RayTracing-RepetitionRate = 1000 -RayTracing-RayDirection = (/ 0. , 0. , -1.0 /) +RayTracing-RayDirection = (/ 0. , 0.5 , -1.0 /) ! SEE parameters RayTracing-WorkFunctionSEE = 10.0 From d50cef2ae0c45e6ff5e697b6b8063ce43868b036 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Wed, 24 May 2023 11:05:49 +0200 Subject: [PATCH 081/495] Moved init for ray tracing between halo calculation (where also GEO%min/max is determined) and DSMC init (where photon information is required for chemical reactions). Fixed MOD error when using to few rays as compared with the number of processes. --- src/init/piclas_init.f90 | 2 - src/particles/dsmc/dsmc_chemical_init.f90 | 88 +++++++++++++------ src/particles/particle_init.f90 | 6 +- .../particle_mpi/particle_mpi_halo.f90 | 2 +- src/radiation/ray_tracing/raytrace.f90 | 11 ++- 5 files changed, 73 insertions(+), 36 deletions(-) diff --git a/src/init/piclas_init.f90 b/src/init/piclas_init.f90 index 817df5a6d..dd045f3cf 100644 --- a/src/init/piclas_init.f90 +++ b/src/init/piclas_init.f90 @@ -83,7 +83,6 @@ SUBROUTINE InitPiclas(IsLoadBalance) USE MOD_MPI ,ONLY: InitMPIvars #endif /*USE_MPI*/ #ifdef PARTICLES -USE MOD_RayTracing_Init ,ONLY: InitRayTracing USE MOD_DSMC_Vars ,ONLY: UseDSMC USE MOD_Particle_Vars ,ONLY: UseVarTimeStep, VarTimeStep USE MOD_Particle_TimeStep ,ONLY: InitPartTimeStep @@ -219,7 +218,6 @@ SUBROUTINE InitPiclas(IsLoadBalance) CALL initReadIMDdata() CALL read_IMD_results() #endif /* USE_MPI */ -CALL InitRayTracing() #endif /*PARTICLES*/ CALL InitInterfaces() ! set Riemann solver identifier for face connectivity (vacuum, dielectric, PML ...) diff --git a/src/particles/dsmc/dsmc_chemical_init.f90 b/src/particles/dsmc/dsmc_chemical_init.f90 index a86b1b577..ef42f2ad3 100644 --- a/src/particles/dsmc/dsmc_chemical_init.f90 +++ b/src/particles/dsmc/dsmc_chemical_init.f90 @@ -137,7 +137,6 @@ SUBROUTINE DSMC_chemical_init() USE MOD_PARTICLE_Vars ,ONLY: nSpecies, Species USE MOD_Particle_Analyze_Vars ,ONLY: ChemEnergySum USE MOD_DSMC_ChemReact ,ONLY: CalcPartitionFunction -USE MOD_part_emission_tools ,ONLY: CalcPhotonEnergy USE MOD_DSMC_QK_Chemistry ,ONLY: QK_Init USE MOD_MCC_Vars ,ONLY: NbrOfPhotonXsecReactions #if USE_LOADBALANCE @@ -152,10 +151,10 @@ SUBROUTINE DSMC_chemical_init() !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES CHARACTER(LEN=3) :: hilf -INTEGER :: iReac, iReac2, iSpec, iPart, iReacDiss, iSpec2, iInit +INTEGER :: iReac, iReac2, iSpec, iPart, iReacDiss, iSpec2 INTEGER, ALLOCATABLE :: DummyRecomb(:,:) LOGICAL :: DoScat -REAL :: BGGasEVib, PhotonEnergy, omega, ChargeProducts, ChargeReactants +REAL :: BGGasEVib, omega, ChargeProducts, ChargeReactants INTEGER :: Reactant1, Reactant2, Reactant3, MaxSpecies, ReadInNumOfReact !=================================================================================================================================== @@ -407,26 +406,11 @@ SUBROUTINE DSMC_chemical_init() __STAMP__,'ERROR: Ionization reactions require the definition of at least the ionization energy as electronic level!',iReac) END IF END DO - ! Check whether the photon energy is sufficient to trigger the chemical reaction - IF(TRIM(ChemReac%ReactModel(iReac)).EQ.'phIon') THEN - PhotonEnergy = 0. - DO iSpec = 1, nSpecies - DO iInit = 1, Species(iSpec)%NumberOfInits - SELECT CASE(TRIM(Species(iSpec)%Init(iInit)%SpaceIC)) - CASE('photon_cylinder','photon_honeycomb','photon_rectangle') - PhotonEnergy = CalcPhotonEnergy(Species(iSpec)%Init(iInit)%WaveLength) - EXIT - END SELECT - END DO - END DO - - ChemReac%EForm(iReac) = ChemReac%EForm(iReac) + PhotonEnergy - IF(ChemReac%EForm(iReac).LE.0.0) THEN - CALL abort(__STAMP__,'ERROR: Photon energy is not sufficient for the given ionization reaction: ',iReac) - END IF - END IF ! TRIM(ChemReac%ReactModel(iReac)).EQ.'phIon' END DO ! iReac = 1, ChemReac%NumOfReact +! Photoionization +CALL InitPhotonReactions() + ! Populate the background reaction arrays and initialize the required partition functions IF(DSMC%BackwardReacRate) THEN CALL DSMC_BackwardRate_init() @@ -778,6 +762,58 @@ SUBROUTINE DSMC_BackwardRate_init() END SUBROUTINE DSMC_BackwardRate_init +!=================================================================================================================================== +!> Calculation and sanity check of ChemReac%EForm(iReac) for photoionization reactions, i.e., ChemReac%ReactModel(iReac).EQ.'phIon' +!> The sanity check will determine if the photon energy is sufficient to trigger any reactions. +!=================================================================================================================================== +SUBROUTINE InitPhotonReactions() +! MODULES +USE MOD_Globals ,ONLY: abort +USE MOD_DSMC_Vars ,ONLY: ChemReac,CollisMode,UseDSMC +USE MOD_part_emission_tools ,ONLY: CalcPhotonEnergy +USE MOD_PARTICLE_Vars ,ONLY: nSpecies +USE MOD_RayTracing_Vars ,ONLY: RayPartBound,Ray +USE MOD_Particle_Vars ,ONLY: Species +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------! +! INPUT / OUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +REAL :: PhotonEnergy +INTEGER :: iInit, iSpec, iReac +!=================================================================================================================================== +IF(.NOT.UseDSMC) RETURN +IF(CollisMode.NE.3) RETURN + +DO iReac = 1, ChemReac%NumOfReact + ! Check whether the photon energy is sufficient to trigger the chemical reaction + IF(TRIM(ChemReac%ReactModel(iReac)).EQ.'phIon') THEN + PhotonEnergy = 0. + + ! Const. photon energy from wavelength given in ray tracing model + IF(RayPartBound.GT.0)THEN + PhotonEnergy = CalcPhotonEnergy(Ray%WaveLength) + END IF ! RayPartBound.GT.0 + + ! Const. photon energy from wavelength given in particle emission model + DO iSpec = 1, nSpecies + DO iInit = 1, Species(iSpec)%NumberOfInits + SELECT CASE(TRIM(Species(iSpec)%Init(iInit)%SpaceIC)) + CASE('photon_cylinder','photon_honeycomb','photon_rectangle') + PhotonEnergy = CalcPhotonEnergy(Species(iSpec)%Init(iInit)%WaveLength) + EXIT + END SELECT + END DO + END DO + + ChemReac%EForm(iReac) = ChemReac%EForm(iReac) + PhotonEnergy + IF(ChemReac%EForm(iReac).LE.0.0) THEN + CALL abort(__STAMP__,'ERROR: Photon energy is not sufficient for the given ionization reaction: ',iReac) + END IF + END IF ! TRIM(ChemReac%ReactModel(iReac)).EQ.'phIon' +END DO ! iReac = 1, ChemReac%NumOfReact +END SUBROUTINE InitPhotonReactions + ! SUBROUTINE Init_TLU_Data ! !=================================================================================================================================== @@ -788,19 +824,19 @@ END SUBROUTINE DSMC_BackwardRate_init ! USE MOD_DSMC_Vars, ONLY : TLU_Data, ChemReac ! ! IMPLICIT VARIABLE HANDLING ! IMPLICIT NONE -! +! ! !-- parameters ! INTEGER,PARAMETER :: unit1=20 ! !DOUBLE PRECISION, PARAMETER :: mass_ion=2.180d-25 !Xenon ! !DOUBLE PRECISION, PARAMETER :: mass_neutral=2.180d-25 !Xenon -! +! ! !-- local variables ! INTEGER :: io_error1,read_error,iLine ! CHARACTER(LEN=1000000) :: string1 ! INTEGER :: N_b, N_E ! DOUBLE PRECISION :: real1, real2 ! !=================================================================================================================================== -! +! ! OPEN(UNIT=unit1,file=TRIM(ChemReac%TLU_FileName(ChemReac%NumOfReact)),STATUS='old',ACTION='READ',IOSTAT=io_error1) ! IF ( io_error1 .EQ. 0) THEN ! !----------------------------------Schleife ueber alle Zeilen in file1----------------------------------! @@ -846,10 +882,10 @@ END SUBROUTINE DSMC_BackwardRate_init ! 'Chemistry - Error in Init_TLU_Data, Error while opening of Test_Lookup_komplett.txt, Error:',io_error1) ! !WRITE(*,'(A,I0,A)') 'Beim Oeffenen der Datei Test_Lookup_komplett.txt ist Fehler Nr. ', io_error1,' aufgetreten!' ! END IF -! +! ! ! Force Chi at N_b to be 0 ! TLU_Data%Chitable(:,N_b) = 0 -! +! ! CLOSE(unit=unit1) ! END SUBROUTINE Init_TLU_Data diff --git a/src/particles/particle_init.f90 b/src/particles/particle_init.f90 index 670e42532..125d5be9d 100644 --- a/src/particles/particle_init.f90 +++ b/src/particles/particle_init.f90 @@ -292,6 +292,7 @@ SUBROUTINE InitParticles() #if USE_LOADBALANCE USE MOD_LoadBalance_Vars ,ONLY: PerformLoadBalance #endif /*USE_LOADBALANCE*/ +USE MOD_RayTracing_Init ,ONLY: InitRayTracing ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -355,9 +356,12 @@ SUBROUTINE InitParticles() ! Allocate sampling of near adaptive boundary element values IF(UseAdaptive.OR.(nPorousBC.GT.0)) CALL InitAdaptiveBCSampling() -! Initialize backrgound gas regions (requires completed InitParticleGeometry for ElemMidPoint_Shared) +! Initialize background gas regions (requires completed InitParticleGeometry for ElemMidPoint_Shared) IF(BGGas%UseRegions) CALL BGGas_InitRegions() +! Ray tracing +CALL InitRayTracing() + IF (useDSMC) THEN CALL InitDSMC() CALL InitMCC() diff --git a/src/particles/particle_mpi/particle_mpi_halo.f90 b/src/particles/particle_mpi/particle_mpi_halo.f90 index 84da90d1f..564684c39 100644 --- a/src/particles/particle_mpi/particle_mpi_halo.f90 +++ b/src/particles/particle_mpi/particle_mpi_halo.f90 @@ -37,7 +37,7 @@ MODULE MOD_Particle_MPI_Halo CONTAINS -SUBROUTINE IdentifyPartExchangeProcs +SUBROUTINE IdentifyPartExchangeProcs() !=================================================================================================================================== ! Identifies processors in physical range for particle exchange communication. This communication has to occur at every RK step and ! would be too costly if done as an all-to-all communication diff --git a/src/radiation/ray_tracing/raytrace.f90 b/src/radiation/ray_tracing/raytrace.f90 index f61a3e6ce..982587b04 100644 --- a/src/radiation/ray_tracing/raytrace.f90 +++ b/src/radiation/ray_tracing/raytrace.f90 @@ -72,7 +72,7 @@ SUBROUTINE RayTracing() !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES INTEGER :: NonUniqueGlobalSideID,iSurfSide,iBC -INTEGER :: CNElemID, iRay, photonCount, iPhot, iPhotLoc, RayVisCount, LocRayNum, RayDisp +INTEGER :: CNElemID, iRay, photonCount, RayVisCount, LocRayNum, RayDisp LOGICAL :: FoundComputeNodeSurfSide INTEGER :: ALLOCSTAT REAL :: RectPower @@ -108,8 +108,7 @@ SUBROUTINE RayTracing() LocRayNum = NumRays/nProcessors IF(myrank.LT.MOD(NumRays,nProcessors)) LocRayNum = LocRayNum + 1 ! Output to screen every 20 rays to show that the tool is still running -RayDisp = INT(LocRayNum/20) - +RayDisp = MAX(1,INT(LocRayNum/20)) ! This value cannot be zero RectPower = Ray%IntensityAmplitude * Ray%Area / REAL(NumRays) @@ -121,7 +120,7 @@ SUBROUTINE RayTracing() END IF ! .NOT.ALLOCATED(PartStateBoundary) DO iRay = 1, LocRayNum - IF(MPIroot.AND.(MOD(RayVisCount,RayDisp).EQ.0)) CALL PrintStatusLineRadiation(REAL(RayVisCount),REAL(1),REAL(LocRayNum),.TRUE.) + IF(MPIroot.AND.(MOD(RayVisCount,RayDisp).EQ.0)) CALL PrintStatusLineRadiation(REAL(RayVisCount),0.0,REAL(LocRayNum),.TRUE.) RayVisCount = RayVisCount + 1 PhotonProps%PhotonPos(1:3) = SetRayPos() PhotonProps%PhotonLastPos(1:3) = PhotonProps%PhotonPos(1:3) @@ -167,7 +166,7 @@ SUBROUTINE RayTracing() IPWRITE(UNIT_StdOut,*) "PhotonProps%PhotonPos(1:3) =", PhotonProps%PhotonPos(1:3) CALL abort(__STAMP__,'Ray starting element not found!') ELSE - ! Output to .h5 for debugging + ! Output ray starting position and direction vector to .h5 for debugging CALL StoreBoundaryParticleProperties(iRay,& 999,& PhotonProps%PhotonPos(1:3),& @@ -183,7 +182,7 @@ SUBROUTINE RayTracing() ! Print 100% IF(MPIroot)THEN - CALL PrintStatusLineRadiation(REAL(RayVisCount),REAL(1),REAL(LocRayNum),.TRUE.) + CALL PrintStatusLineRadiation(REAL(RayVisCount),0.0,REAL(LocRayNum),.TRUE.) WRITE(UNIT_StdOut,'(A)') " " END IF From aa1a6eb9b8c85b759980e300ec238b54dac48d3e Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Wed, 24 May 2023 14:53:03 +0200 Subject: [PATCH 082/495] Save position, direction etc. of lost photons during tracking via StoreLostPhotonProperties() and output to PartStateLost.h5 and use the pre-existing variables DisplayLostParticles and CountNbrOfLostParts to analyze lost photons. Additionally, added new INT option PhotonModeBPO (default=0): Output mode to store position, direction, host element etc. of rays/photons in PartStateBoundary.h5 from radiation transport or ray tracing solver - 0: Output nothing to PartStateBoundary.h5 - 1: Output the initial position of the rays and their direction vector - 2: Output initial position and all calculated intersection points calculated in radtrans tracking --- .../boundary/particle_boundary_init.f90 | 37 ++++++--- src/particles/particle_mesh/particle_mesh.f90 | 22 +++++- src/particles/particle_tools.f90 | 76 +++++++++++++++++++ .../tracking/radtrans_tracking.f90 | 69 +++++++++++------ .../tracking/radtrans_tracking_vars.f90 | 18 +++-- src/radiation/ray_tracing/raytrace.f90 | 23 +++--- 6 files changed, 191 insertions(+), 54 deletions(-) diff --git a/src/particles/boundary/particle_boundary_init.f90 b/src/particles/boundary/particle_boundary_init.f90 index e54ac341f..674178c1a 100644 --- a/src/particles/boundary/particle_boundary_init.f90 +++ b/src/particles/boundary/particle_boundary_init.f90 @@ -28,6 +28,7 @@ MODULE MOD_Particle_Boundary_Init ! Public Part ---------------------------------------------------------------------------------------------------------------------- PUBLIC :: DefineParametersParticleBoundary, InitializeVariablesPartBoundary, FinalizeParticleBoundary PUBLIC :: InitParticleBoundaryRotPeriodic, InitAdaptiveWallTemp +PUBLIC :: InitPartStateBoundary !=================================================================================================================================== CONTAINS @@ -171,7 +172,6 @@ SUBROUTINE InitializeVariablesPartBoundary() USE MOD_Particle_Vars ,ONLY: PDM, nSpecies, PartMeshHasPeriodicBCs, RotRefFrameAxis, SpeciesDatabase, Species USE MOD_SurfaceModel_Vars ,ONLY: nPorousBC USE MOD_Particle_Boundary_Vars ,ONLY: PartBound,nPartBound,DoBoundaryParticleOutputHDF5,PartStateBoundary, AdaptWallTemp -USE MOD_Particle_Boundary_Vars ,ONLY: nVarPartStateBoundary USE MOD_Particle_Tracking_Vars ,ONLY: TrackingMethod USE MOD_Particle_Surfaces_Vars ,ONLY: BCdata_auxSF USE MOD_Particle_Mesh_Vars ,ONLY: GEO @@ -194,7 +194,7 @@ SUBROUTINE InitializeVariablesPartBoundary() !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES INTEGER :: iPartBound, iBC, iPBC, iSwaps, MaxNbrOfSpeciesSwaps, RotAxis, nRotPeriodicBCs -INTEGER :: ALLOCSTAT, dummy_int +INTEGER :: dummy_int REAL :: omegaTemp, RotFreq CHARACTER(32) :: hilf , hilf2 CHARACTER(200) :: tmpString @@ -461,14 +461,7 @@ SUBROUTINE InitializeVariablesPartBoundary() END IF ! Surface particle output to .h5 -IF(DoBoundaryParticleOutputHDF5)THEN - ! This array is not de-allocated during load balance as it is only written to .h5 during WriteStateToHDF5() - IF(.NOT.ALLOCATED(PartStateBoundary))THEN - ALLOCATE(PartStateBoundary(1:nVarPartStateBoundary,1:PDM%maxParticleNumber), STAT=ALLOCSTAT) - IF (ALLOCSTAT.NE.0) CALL abort(__STAMP__,'ERROR in particle_init.f90: Cannot allocate PartStateBoundary array!') - PartStateBoundary=0. - END IF ! .NOT.ALLOCATED(PartStateBoundary) -END IF +IF(DoBoundaryParticleOutputHDF5) CALL InitPartStateBoundary() ! Set mapping from field boundary to particle boundary index and vice versa ALLOCATE(PartBound%MapToPartBC(1:nBCs)) @@ -530,6 +523,30 @@ SUBROUTINE InitializeVariablesPartBoundary() END SUBROUTINE InitializeVariablesPartBoundary +!=================================================================================================================================== +!> Check if PartStateBoundary is already allocated (e.g. if this routine is called during load balance) and if not allocate it +!=================================================================================================================================== +SUBROUTINE InitPartStateBoundary() +! MODULES +USE MOD_Globals ,ONLY: abort +USE MOD_Particle_Boundary_Vars ,ONLY: PartStateBoundary +USE MOD_Particle_Vars ,ONLY: PDM +USE MOD_Particle_Boundary_Vars ,ONLY: nVarPartStateBoundary +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------! +! INPUT / OUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +INTEGER :: ALLOCSTAT +!=================================================================================================================================== +! This array is not de-allocated during load balance as it is only written to .h5 during WriteStateToHDF5() +IF(ALLOCATED(PartStateBoundary)) RETURN +ALLOCATE(PartStateBoundary(1:nVarPartStateBoundary,1:PDM%maxParticleNumber), STAT=ALLOCSTAT) +IF (ALLOCSTAT.NE.0) CALL abort(__STAMP__,'ERROR in particle_init.f90: Cannot allocate PartStateBoundary array!') +PartStateBoundary=0. +END SUBROUTINE InitPartStateBoundary + + !=================================================================================================================================== !> Read mapping for rotational periodicity from mesh file. If it does not yet exist, build the mapping and store in mesh.h5 for !> faster initialization later on. diff --git a/src/particles/particle_mesh/particle_mesh.f90 b/src/particles/particle_mesh/particle_mesh.f90 index 853224fc0..3bd2bf766 100644 --- a/src/particles/particle_mesh/particle_mesh.f90 +++ b/src/particles/particle_mesh/particle_mesh.f90 @@ -75,14 +75,17 @@ SUBROUTINE DefineParametersParticleMesh() CALL prms%CreateLogicalOption( 'TriaSurfaceFlux'& , 'Using Triangle-aproximation [T] or (bi-)linear and bezier (curved) description [F] of sides for surfaceflux.'//& ' Default is set to TriaTracking') -CALL prms%CreateLogicalOption( 'DisplayLostParticles'& - , 'Display position, velocity, species and host element of particles lost during particle tracking (TrackingMethod = '//& - 'triatracking, tracing)','.FALSE.') +CALL prms%CreateLogicalOption( 'DisplayLostParticles' , 'Display position, velocity, species and host element of particles lost during particle tracking (TrackingMethod = triatracking, tracing)','.FALSE.') CALL prms%CreateLogicalOption( 'CountNbrOfLostParts'& , 'Count the number of lost particles during tracking that cannot be found with fallbacks. Additionally, the lost particle '//& 'information is stored in a PartStateLost*.h5 file. When particles are not found during restart in their host cell '//& '(sanity check), they are marked missing and are also written to PartStateLost*.h5 file even if they are re-located '//& 'on a different processor.','.TRUE.') +CALL prms%CreateIntOption( 'PhotonModeBPO' , 'Output mode to store position, direction, host element etc. of rays/photons in PartStateBoundary.h5 from radiation transport or ray tracing solver:\n'& + '0: Output nothing to PartStateBoundary.h5\n'& + '1: Output the initial position of the rays and their direction vector\n'& + '2: Output initial position and all calculated intersection points calculated in radtrans tracking\n'& + ,'0') CALL prms%CreateIntOption( 'PartOut'& , 'If compiled with CODE_ANALYZE flag: For This particle number every tracking information is written as STDOUT.','0') CALL prms%CreateIntOption( 'MPIRankOut'& @@ -191,6 +194,9 @@ SUBROUTINE InitParticleMesh() USE MOD_PICDepo_Shapefunction_Tools, ONLY:InitShapeFunctionDimensionalty USE MOD_IO_HDF5 ,ONLY: AddToElemData,ElementOut USE MOD_Mesh_Vars ,ONLY: nElems +USE MOD_Particle_Boundary_Init ,ONLY: InitPartStateBoundary +USE MOD_Particle_Boundary_Vars ,ONLY: DoBoundaryParticleOutputHDF5 +USE MOD_Photon_TrackingVars ,ONLY: PhotonModeBPO !USE MOD_DSMC_Vars ,ONLY: DSMC ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -290,7 +296,15 @@ SUBROUTINE InitParticleMesh() #if USE_LOADBALANCE END IF #endif -DisplayLostParticles = GETLOGICAL('DisplayLostParticles') +DisplayLostParticles = GETLOGICAL('DisplayLostParticles') + +! Ray tracing information to .h5 for debugging when using the radiation transport model or pure ray tracing +PhotonModeBPO = GETINT('PhotonModeBPO') +! Check if DoBoundaryParticleOutputHDF5 is already activated and PartStateBoundary therefore already allocated +IF((PhotonModeBPO.GE.1).AND.(.NOT.DoBoundaryParticleOutputHDF5))THEN + DoBoundaryParticleOutputHDF5 = .TRUE. + CALL InitPartStateBoundary() +END IF ! (PhotonModeBPO.GE.1 #ifdef CODE_ANALYZE PARTOUT = GETINT('PartOut','0') diff --git a/src/particles/particle_tools.f90 b/src/particles/particle_tools.f90 index e446119a6..dd256d283 100644 --- a/src/particles/particle_tools.f90 +++ b/src/particles/particle_tools.f90 @@ -77,6 +77,7 @@ MODULE MOD_part_tools PUBLIC :: InterpolateEmissionDistribution2D PUBLIC :: MergeCells,InRotRefFrameCheck PUBLIC :: CalcPartSymmetryPos +PUBLIC :: StoreLostPhotonProperties !=================================================================================================================================== CONTAINS @@ -227,6 +228,81 @@ SUBROUTINE UpdateNextFreePosition(WithOutMPIParts) END SUBROUTINE UpdateNextFreePosition +SUBROUTINE StoreLostPhotonProperties(LastPhotPos,Pos,Dir,ElemID) +!----------------------------------------------------------------------------------------------------------------------------------! +! Store information of a lost particle (during restart and during the simulation) +!----------------------------------------------------------------------------------------------------------------------------------! +! MODULES ! +USE MOD_Globals ,ONLY: abort,myrank +USE MOD_Particle_Tracking_Vars ,ONLY: PartStateLost,PartLostDataSize,PartStateLostVecLength +USE MOD_TimeDisc_Vars ,ONLY: time +!----------------------------------------------------------------------------------------------------------------------------------! +! insert modules here +!----------------------------------------------------------------------------------------------------------------------------------! +IMPLICIT NONE +! INPUT / OUTPUT VARIABLES +REAL,INTENT(IN) :: LastPhotPos(1:3) +REAL,INTENT(IN) :: Pos(1:3) +REAL,INTENT(IN) :: Dir(1:3) +INTEGER,INTENT(IN) :: ElemID ! Global element index +INTEGER :: dims(2) +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +! Temporary arrays +REAL, ALLOCATABLE :: PartStateLost_tmp(:,:) ! (1:11,1:NParts) 1st index: x,y,z,vx,vy,vz,SpecID,MPF,time,ElemID,iPart +! ! 2nd index: 1 to number of lost particles +INTEGER :: ALLOCSTAT +!=================================================================================================================================== +dims = SHAPE(PartStateLost) + +ASSOCIATE( iMax => PartStateLostVecLength ) + ! Increase maximum number of boundary-impact particles + iMax = iMax + 1 + + ! Check if array maximum is reached. + ! If this happens, re-allocate the arrays and increase their size (every time this barrier is reached, double the size) + IF(iMax.GT.dims(2))THEN + + ! --- PartStateLost --- + ALLOCATE(PartStateLost_tmp(1:PartLostDataSize,1:dims(2)), STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL abort(__STAMP__,'ERROR in particle_boundary_tools.f90: Cannot allocate PartStateLost_tmp array!') + ! Save old data + PartStateLost_tmp(1:PartLostDataSize,1:dims(2)) = PartStateLost(1:PartLostDataSize,1:dims(2)) + + ! Re-allocate PartStateLost to twice the size + DEALLOCATE(PartStateLost) + ALLOCATE(PartStateLost(1:PartLostDataSize,1:2*dims(2)), STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL abort(__STAMP__,'ERROR in particle_boundary_tools.f90: Cannot allocate PartStateLost array!') + PartStateLost(1:PartLostDataSize, 1: dims(2)) = PartStateLost_tmp(1:PartLostDataSize,1:dims(2)) + PartStateLost(1:PartLostDataSize,dims(2)+1:2*dims(2)) = 0. + + END IF + + ! 1-3: Particle position (last valid position) + PartStateLost(1:3,iMax) = LastPhotPos(1:3) + ! 4-6: Particle velocity + PartStateLost(4:6 ,iMax) = Dir(1:3) + ! 7: SpeciesID + PartStateLost(7 ,iMax) = REAL(999) + ! 8: Macro particle factor + PartStateLost(8 ,iMax) = 0.0 + ! 9: time of loss + PartStateLost(9 ,iMax) = time + ! 10: Global element ID + PartStateLost(10 ,iMax) = REAL(ElemID) + ! 11: Particle ID + PartStateLost(11 ,iMax) = REAL(0) + ! 12-14: Particle position (position of loss) + PartStateLost(12:14,iMax) = Pos(1:3) + ! 15: myrank + PartStateLost(15,iMax) = myrank + ! 16: missing type, i.e., 0: lost, 1: missing & found once, >1: missing & multiply found + PartStateLost(16,iMax) = 0 +END ASSOCIATE + +END SUBROUTINE StoreLostPhotonProperties + + SUBROUTINE StoreLostParticleProperties(iPart,ElemID,UsePartState_opt,PartMissingType_opt) !----------------------------------------------------------------------------------------------------------------------------------! ! Store information of a lost particle (during restart and during the simulation) diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 index 737fe5347..2ce53cc45 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 @@ -50,14 +50,16 @@ SUBROUTINE PhotonTriaTracking() USE MOD_Preproc USE MOD_Globals USE MOD_Particle_Mesh_Vars -USE MOD_Particle_Boundary_Vars, ONLY:PartBound -USE MOD_Photon_TrackingVars, ONLY:PhotonProps -USE MOD_RadiationTrans_Vars, ONLY:RadObservation_Emission, RadObservationPointMethod, RadObservation_EmissionPart -USE MOD_Photon_TrackingTools, ONLY:PhotonThroughSideCheck3DFast, PhotonIntersectionWithSide,CalcAbsoprtion,PhotonOnLineOfSight -USE MOD_Photon_TrackingTools, ONLY:PerfectPhotonReflection, DiffusePhotonReflection, CalcWallAbsoprtion, PointInObsCone -USE MOD_Photon_TrackingTools, ONLY:PeriodicPhotonBC -USE MOD_Photon_TrackingTools, ONLY:PhotonIntersectSensor -USE MOD_Particle_Boundary_Tools,ONLY: StoreBoundaryParticleProperties +USE MOD_Particle_Boundary_Vars ,ONLY: PartBound +USE MOD_Photon_TrackingVars ,ONLY: PhotonProps,PhotonModeBPO +USE MOD_RadiationTrans_Vars ,ONLY: RadObservation_Emission, RadObservationPointMethod, RadObservation_EmissionPart +USE MOD_Photon_TrackingTools ,ONLY: PhotonThroughSideCheck3DFast, PhotonIntersectionWithSide,CalcAbsoprtion,PhotonOnLineOfSight +USE MOD_Photon_TrackingTools ,ONLY: PerfectPhotonReflection, DiffusePhotonReflection, CalcWallAbsoprtion, PointInObsCone +USE MOD_Photon_TrackingTools ,ONLY: PeriodicPhotonBC +USE MOD_Photon_TrackingTools ,ONLY: PhotonIntersectSensor +USE MOD_Particle_Boundary_Tools ,ONLY: StoreBoundaryParticleProperties +USE MOD_part_tools ,ONLY: StoreLostPhotonProperties +USE MOD_Particle_Tracking_Vars ,ONLY: NbrOfLostParticles,DisplayLostParticles IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES @@ -77,11 +79,9 @@ SUBROUTINE PhotonTriaTracking() LOGICAL :: oldElemIsMortar, isMortarSideTemp(1:6), doCheckSide REAL :: minRatio, intersecDist, intersecDistVec(3) REAL :: IntersectionPos(1:3), IntersectionPosTemp(1:3) -!INTEGER :: StartElemID !=================================================================================================================================== Done = .FALSE. ElemID = PhotonProps%ElemID -!StartElemID = ElemID SideID = 0 DoneLastElem(:,:) = 0 ! 1) Loop tracking until Photon is considered "done" (either absorbed or deleted) @@ -150,11 +150,19 @@ SUBROUTINE PhotonTriaTracking() ! the determinants IF (NrOfThroughSides.EQ.0) THEN ! Particle appears to have not crossed any of the checked sides. Deleted! - IPWRITE(*,*) 'Error in Photon TriaTracking! Photon lost. Element:', ElemID - IPWRITE(*,*) 'LastPos: ', PhotonProps%PhotonLastPos(1:3) - IPWRITE(*,*) 'Pos: ', PhotonProps%PhotonPos(1:3) - IPWRITE(*,*) 'Direction:', PhotonProps%PhotonDirection(1:3) - IPWRITE(*,*) 'Photon deleted!' + ASSOCIATE( LastPhotPos => PhotonProps%PhotonLastPos(1:3), & + Pos => PhotonProps%PhotonPos(1:3), & + Dir => PhotonProps%PhotonDirection(1:3) ) + CALL StoreLostPhotonProperties(LastPhotPos,Pos,Dir,ElemID) + NbrOfLostParticles=NbrOfLostParticles+1 + IF(DisplayLostParticles)THEN + IPWRITE(*,*) 'Error in Photon TriaTracking! Photon lost. Element:', ElemID + IPWRITE(*,*) 'LastPos: ', PhotonProps%PhotonLastPos(1:3) + IPWRITE(*,*) 'Pos: ', PhotonProps%PhotonPos(1:3) + IPWRITE(*,*) 'Direction:', PhotonProps%PhotonDirection(1:3) + IPWRITE(*,*) 'Photon deleted!' + END IF ! DisplayLostParticles + END ASSOCIATE Done = .TRUE. EXIT ELSE IF (NrOfThroughSides.GT.1) THEN @@ -174,9 +182,15 @@ SUBROUTINE PhotonTriaTracking() END IF END DO IF (doCheckSide) THEN + IF(ind2.gt.6)THEN + IPWRITE(UNIT_StdOut,*) "ind2 =", ind2 + END IF ! ind2.gt.6 IF (isMortarSideTemp(ind2)) THEN ! Mortar side NbElemID = SideInfo_Shared(SIDE_ELEMID,GlobSideTemp(ind2)) ! Get the determinant between the old and new particle position and the nodes of the triangle which was crossed + IF(ind2.gt.6)THEN + IPWRITE(UNIT_StdOut,*) "ind2 =", ind2 + END IF ! ind2.gt.6 CALL PhotonIntersectionWithSide(LocSidesTemp(ind2),NbElemID,TriNumTemp(ind2), IntersectionPosTemp, .TRUE.) intersecDistVec(1:3) = IntersectionPosTemp(1:3) - PhotonProps%PhotonLastPos(1:3) intersecDist = DOT_PRODUCT(intersecDistVec, intersecDistVec) @@ -210,11 +224,19 @@ SUBROUTINE PhotonTriaTracking() END DO ! ind2 = 1, NrOfThroughSides ! Particle that went through multiple sides first, but did not cross any sides during the second check -> Deleted! IF (SecondNrOfThroughSides.EQ.0) THEN - IPWRITE(*,*) 'Error in Photon TriaTracking! Photon lost on second check. Element:', ElemID - IPWRITE(*,*) 'LastPos: ', PhotonProps%PhotonLastPos(1:3) - IPWRITE(*,*) 'Pos: ', PhotonProps%PhotonPos(1:3) - IPWRITE(*,*) 'Direction:', PhotonProps%PhotonDirection(1:3) - IPWRITE(*,*) 'Photon deleted!' + ASSOCIATE( LastPhotPos => PhotonProps%PhotonLastPos(1:3), & + Pos => PhotonProps%PhotonPos(1:3), & + Dir => PhotonProps%PhotonDirection(1:3) ) + CALL StoreLostPhotonProperties(LastPhotPos,Pos,Dir,ElemID) + NbrOfLostParticles=NbrOfLostParticles+1 + IF(DisplayLostParticles)THEN + IPWRITE(*,*) 'Error in Photon TriaTracking! Photon lost on second check. Element:', ElemID + IPWRITE(*,*) 'LastPos: ', PhotonProps%PhotonLastPos(1:3) + IPWRITE(*,*) 'Pos: ', PhotonProps%PhotonPos(1:3) + IPWRITE(*,*) 'Direction:', PhotonProps%PhotonDirection(1:3) + IPWRITE(*,*) 'Photon deleted!' + END IF ! DisplayLostParticles + END ASSOCIATE Done = .TRUE. EXIT END IF @@ -251,6 +273,7 @@ SUBROUTINE PhotonTriaTracking() CALL PerfectPhotonReflection(LocalSide,ElemID,TriNum, IntersectionPos, .TRUE.) END IF CALL CalcAbsoprtion(IntersectionPos(1:3),ElemID, DONE) + IF (.NOT.DONE) CALL CalcWallAbsoprtion(SideID, DONE) ELSE IF (NrOfThroughSides.LT.2) THEN CALL DiffusePhotonReflection(LocalSide,ElemID,TriNum, IntersectionPos, .FALSE.) @@ -301,7 +324,8 @@ SUBROUTINE PhotonTriaTracking() ElemID = SideInfo_Shared(SIDE_NBELEMID,SideID) END IF END IF ! BC(SideID).GT./.LE. 0 - !IF(StartElemID.EQ.125)THEN + ! Check if output to PartStateBoundary is activated + IF(PhotonModeBPO.EQ.2)THEN CALL StoreBoundaryParticleProperties(0,& 999,& IntersectionPos,& @@ -310,8 +334,7 @@ SUBROUTINE PhotonTriaTracking() mode=2,& MPF_optIN=0.0,& Velo_optIN=PhotonProps%PhotonDirection(1:3)) - !END IF ! StartElemID.EQ.125 - !IPWRITE(UNIT_StdOut,*) "ElemID =", ElemID + END IF ! PhotonModeBPO.EQ.2 IF (ElemID.LT.1) CALL abort(__STAMP__ ,'ERROR: Element not defined! Please increase the size of the halo region (HaloEpsVelo)!') END DO ! .NOT.PartisDone diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_vars.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_vars.f90 index 9796203f4..23bbc9a7d 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_vars.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_vars.f90 @@ -25,18 +25,22 @@ MODULE MOD_Photon_TrackingVars ! GLOBAL RAY TRACING VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- TYPE tPhotonProps - REAL :: PhotonPos(3) !> - REAL :: PhotonLastPos(3) !> - REAL :: PhotonDirection(3) !> - REAL :: PhotonEnergy !> - INTEGER :: ElemID !> - INTEGER :: WaveLength !> + REAL :: PhotonPos(3) !> + REAL :: PhotonLastPos(3) !> + REAL :: PhotonDirection(3) !> + REAL :: PhotonEnergy !> + INTEGER :: ElemID !> + INTEGER :: WaveLength !> END TYPE -TYPE (tPhotonProps) :: PhotonProps !> +TYPE (tPhotonProps) :: PhotonProps !> REAL, ALLOCATABLE :: PhotonSampWall(:,:) +INTEGER :: PhotonModeBPO !> 0: Output nothing to PartStateBoundary.h5 + !> 1: Output the initial position of the rays and their direction vector + !> 2: Output initial position and all calculated intersection points calculated in radtrans_tracking.f90 + #if USE_MPI INTEGER :: PhotonSampWall_Shared_Win REAL,POINTER :: PhotonSampWall_Shared(:,:) diff --git a/src/radiation/ray_tracing/raytrace.f90 b/src/radiation/ray_tracing/raytrace.f90 index 982587b04..18df11fd4 100644 --- a/src/radiation/ray_tracing/raytrace.f90 +++ b/src/radiation/ray_tracing/raytrace.f90 @@ -61,7 +61,7 @@ SUBROUTINE RayTracing() USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall_Shared, PhotonSampWall_Shared_Win USE MOD_RayTracing_Vars ,ONLY: RayElemPassedEnergy_Shared,RayElemPassedEnergy_Shared_Win #endif /*USE_MPI*/ -USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall +USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall,PhotonModeBPO USE MOD_Mesh_Vars ,ONLY: nGlobalElems ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -166,15 +166,18 @@ SUBROUTINE RayTracing() IPWRITE(UNIT_StdOut,*) "PhotonProps%PhotonPos(1:3) =", PhotonProps%PhotonPos(1:3) CALL abort(__STAMP__,'Ray starting element not found!') ELSE - ! Output ray starting position and direction vector to .h5 for debugging - CALL StoreBoundaryParticleProperties(iRay,& - 999,& - PhotonProps%PhotonPos(1:3),& - UNITVECTOR(PhotonProps%PhotonDirection(1:3)),(/0.0,0.0,1.0/),& - iPartBound=RayPartBound,& - mode=2,& - MPF_optIN=0.0,& - Velo_optIN=PhotonProps%PhotonDirection(1:3)) + ! Check if output to PartStateBoundary is activated + IF(PhotonModeBPO.GE.1)THEN + ! Output ray starting position and direction vector to .h5 for debugging + CALL StoreBoundaryParticleProperties(iRay,& + 999,& + PhotonProps%PhotonPos(1:3),& + UNITVECTOR(PhotonProps%PhotonDirection(1:3)),(/0.0,0.0,1.0/),& + iPartBound=RayPartBound,& + mode=2,& + MPF_optIN=0.0,& + Velo_optIN=PhotonProps%PhotonDirection(1:3)) + END IF ! PhotonModeBPO.GE.1 END IF !PhotonProps%ElemID.LE.0 CALL PhotonTriaTracking() From e6b4dff5c49cead4d973e3525a31b18cc5df30d7 Mon Sep 17 00:00:00 2001 From: Franziska Hild Date: Thu, 25 May 2023 15:52:32 +0200 Subject: [PATCH 083/495] BGK corrected determinerelaxpart --- src/particles/bgk/bgk_colloperator.f90 | 73 +++++++++++--------------- 1 file changed, 32 insertions(+), 41 deletions(-) diff --git a/src/particles/bgk/bgk_colloperator.f90 b/src/particles/bgk/bgk_colloperator.f90 index 2d0f97540..13eac9fa7 100644 --- a/src/particles/bgk/bgk_colloperator.f90 +++ b/src/particles/bgk/bgk_colloperator.f90 @@ -1046,71 +1046,62 @@ SUBROUTINE DetermineRelaxPart(nPart, iPartIndx_Node, relaxfreq, dtCell, nRelax, REAL, INTENT(INOUT) :: OldEn !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -INTEGER :: iPart, iSpec, iLoop, iPick, iLoopRot, iLoopVib -REAL :: ProbAddPartTrans, iRan, partWeight, ProbAddPartRot, ProbAddPartVib +INTEGER :: iPart, iSpec, iLoop, nNotRelax +REAL :: ProbAddPartTrans, iRan, partWeight, ProbAddPartRot(nSpecies), ProbAddPartVib(nSpecies) !=================================================================================================================================== -VibRelaxWeightSpec =0; RotRelaxWeightSpec =0; nRelax=0; vBulk=0.0; nRotRelax=0; nVibRelax=0; OldEnRot=0.0 -iLoopRot=1; iLoopVib=1 +VibRelaxWeightSpec=0.0; RotRelaxWeightSpec=0.0; nRelax=0; nNotRelax=0; vBulk=0.0; nRotRelax=0; nVibRelax=0; OldEnRot=0.0 + ! Calculate probability of relaxation of a particle towards the target distribution function ProbAddPartTrans = 1.-EXP(-relaxfreq*dtCell) -CALL RANDOM_NUMBER(iRan) -! Calculate the number of relaxing particles -nRelax = INT(REAL(nPart) * ProbAddPartTrans + iRan) -! List of non-relaxing particles -iPartIndx_NodeRelaxTemp(:) = iPartIndx_Node(:) -! Relaxing particles -DO iLoop = 1, nRelax - CALL RANDOM_NUMBER(iRan) - iPick = INT(iRan * (nPart-iLoop+1)) + 1 - iPart = iPartIndx_NodeRelaxTemp(iPick) - partWeight = GetParticleWeight(iPart) +! Calculate probabilities of relaxation of a particle in the rotation and vibration +ProbAddPartRot(:) = ProbAddPartTrans * rotrelaxfreqSpec(:)/relaxfreq*betaR(:) +ProbAddPartVib(:) = ProbAddPartTrans * vibrelaxfreqSpec(:)/relaxfreq*betaV(:) + +! Loop over all simulation particles +DO iLoop = 1, nPart + iPart = iPartIndx_Node(iLoop) iSpec = PartSpecies(iPart) - iPartIndx_NodeRelax(iLoop) = iPart - iPartIndx_NodeRelaxTemp(iPick) = iPartIndx_NodeRelaxTemp(nPart-iLoop+1) + partWeight = GetParticleWeight(iPart) + CALL RANDOM_NUMBER(iRan) + ! Count particles that are undergoing a relaxation + IF (ProbAddPartTrans.GT.iRan) THEN + nRelax = nRelax + 1 + iPartIndx_NodeRelax(nRelax) = iPart + ! Count particles that are not undergoing a relaxation + ELSE + nNotRelax = nNotRelax + 1 + iPartIndx_NodeRelaxTemp(nNotRelax) = iPart + ! Sum up velocities of non-relaxing particles for bulk velocity + vBulk(1:3) = vBulk(1:3) + PartState(4:6,iPart)*Species(iSpec)%MassIC*partWeight + END IF + ! For molecules: relaxation of inner DOF IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN ! Rotation CALL RANDOM_NUMBER(iRan) - ! Calculate probability of rotational relaxation of a particle that relaxes towards the target distribution function - ProbAddPartRot = rotrelaxfreqSpec(iSpec)/relaxfreq*betaR(iSpec) - IF (ProbAddPartRot.GT.iRan) THEN - ! relaxation - iPartIndx_NodeRelaxRot(iLoopRot) = iPartIndx_NodeRelax(iLoop) + ! Count particles that are undergoing a relaxation, in total and per species + IF (ProbAddPartRot(iSpec).GT.iRan) THEN nRotRelax = nRotRelax + 1 - iLoopRot = iLoopRot + 1 RotRelaxWeightSpec(iSpec) = RotRelaxWeightSpec(iSpec) + partWeight + iPartIndx_NodeRelaxRot(nRotRelax) = iPart ! Sum up total rotational energy OldEnRot = OldEnRot + PartStateIntEn(2,iPart) * partWeight END IF ! Vibration IF(BGKDoVibRelaxation) THEN CALL RANDOM_NUMBER(iRan) - ! Calculate probability of vibrational relaxation of a particle that relaxes towards the target distribution function - ProbAddPartVib = vibrelaxfreqSpec(iSpec)/relaxfreq*betaV(iSpec) - IF (ProbAddPartVib.GT.iRan) THEN - ! relaxation - iPartIndx_NodeRelaxVib(iLoopVib) = iPartIndx_NodeRelax(iLoop) + ! Count particles that are undergoing a relaxation, in total and per species + IF (ProbAddPartVib(iSpec).GT.iRan) THEN nVibRelax = nVibRelax + 1 VibRelaxWeightSpec(iSpec) = VibRelaxWeightSpec(iSpec) + partWeight + iPartIndx_NodeRelaxVib(nVibRelax) = iPart ! Sum up total vibrational energy of all relaxing particles, considering zero-point energy, and add to translational energy - OldEn = OldEn + (PartStateIntEn(1,iPartIndx_NodeRelaxVib(iLoopVib)) - SpecDSMC(iSpec)%EZeroPoint) * partWeight - iLoopVib = iLoopVib + 1 + OldEn = OldEn + (PartStateIntEn(1,iPartIndx_NodeRelaxVib(nVibRelax)) - SpecDSMC(iSpec)%EZeroPoint) * partWeight END IF END IF END IF END DO -! Non-relaxing particles -! nNonRelax = nPart-nRelax -DO iLoop = 1, nPart-nRelax - iPart = iPartIndx_NodeRelaxTemp(iLoop) - partWeight = GetParticleWeight(iPart) - iSpec = PartSpecies(iPart) - ! iPartIndx_NodeNonRelax(iLoop) - ! Sum up velocities of non-relaxing particles for bulk velocity - vBulk(1:3) = vBulk(1:3) + PartState(4:6,iPart)*Species(iSpec)%MassIC*partWeight -END DO - END SUBROUTINE DetermineRelaxPart From 2bef5c244efaaa87e4a66373fda05ed303458abf Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Sat, 27 May 2023 01:06:29 +0200 Subject: [PATCH 084/495] Output timer info in epsOneCell for TRIATRACKING --- src/particles/particle_mesh/particle_mesh_build.f90 | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/particles/particle_mesh/particle_mesh_build.f90 b/src/particles/particle_mesh/particle_mesh_build.f90 index c64b6bc30..4601451b3 100644 --- a/src/particles/particle_mesh/particle_mesh_build.f90 +++ b/src/particles/particle_mesh/particle_mesh_build.f90 @@ -523,7 +523,14 @@ SUBROUTINE BuildEpsOneCell() ElemsJ => sJ #endif /* USE_MPI*/ -IF (TrackingMethod.EQ.TRIATRACKING) RETURN +! Exit routine here if TriaTracking is active +IF (TrackingMethod.EQ.TRIATRACKING)THEN + IF(MPIRoot)THEN + GETTIME(EndT) + CALL DisplayMessageAndTime(EndT-StartT, 'DONE!') + END IF ! MPIRoot + RETURN +END IF ! allocate epsOneCell #if USE_MPI From e9662dff358fbb98d278929115ff28670babcd7e Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Sat, 27 May 2023 01:17:57 +0200 Subject: [PATCH 085/495] Added secondary ray direction (after reflection) and split volume energy into primary and secondary energy depending on the orientation of the ray. --- .../parameter.ini | 4 +- .../reference_RadiationVolState.h5 | Bin 42648 -> 47672 bytes .../tracking/radtrans_tracking.f90 | 138 +++++++++++++++--- .../tracking/radtrans_tracking_output.f90 | 63 ++++++-- .../tracking/radtrans_tracking_tools.f90 | 108 +++++++++++--- .../tracking/radtrans_tracking_vars.f90 | 1 + src/radiation/ray_tracing/raytrace.f90 | 6 +- src/radiation/ray_tracing/raytrace_vars.f90 | 5 +- 8 files changed, 261 insertions(+), 64 deletions(-) diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/parameter.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/parameter.ini index 3ee754334..b53e010c6 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/parameter.ini +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/parameter.ini @@ -101,6 +101,7 @@ Part-Boundary5-PhotonSpecularReflection = F ! F: diffuse with PhotonEnACC, T: pe Part-Boundary6-SourceName = BC_TOP Part-Boundary6-Condition = reflective +Part-Boundary6-PhotonEnACC = 1.0 !Part-Boundary6-BoundaryParticleOutput = T Part-nPeriodicVectors = 2 @@ -112,7 +113,8 @@ Part-FactorFIBGM = (/ 5 , 5 , 5 /) ! =============================================================================== ! Particles-DSMC-CalcSurfaceVal = T ! activate InitParticleBoundarySampling RayTracing-PartBound = 6 ! -> iBC=6 -RayTracing-NumRays = 20000 +RayTracing-NumRays = 200000 +PhotonModeBPO = 1 RayTracing-PulseDuration = 15e-9 RayTracing-WaveLength = 10e-9 diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/reference_RadiationVolState.h5 b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/reference_RadiationVolState.h5 index d7a063644a984913b543ff5f2e57b94707e0c5ae..15c9b52472c34c81352ed541ff41f1e68ebdad1f 100644 GIT binary patch delta 14109 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 delta 19020 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

;v51`pazU;}&JCzI8M|hw>@E!F2sL1@Dyfskp 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 XC6@Q_zf{#i|D4=k4F3cEZvy`hNtx-p diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 index 2ce53cc45..c670caa2c 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 @@ -60,6 +60,7 @@ SUBROUTINE PhotonTriaTracking() USE MOD_Particle_Boundary_Tools ,ONLY: StoreBoundaryParticleProperties USE MOD_part_tools ,ONLY: StoreLostPhotonProperties USE MOD_Particle_Tracking_Vars ,ONLY: NbrOfLostParticles,DisplayLostParticles +USE MOD_RadiationTrans_Vars ,ONLY: RadiationAbsorptionModel IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES @@ -67,7 +68,7 @@ SUBROUTINE PhotonTriaTracking() ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -INTEGER :: NblocSideID, NbElemID, ind, nbSideID, nMortarElems, BCType, localSideID +INTEGER :: NblocSideID, NbElemID, ind, nbSideID, nMortarElems, BCType, localSideID, iPBC INTEGER :: ElemID,OldElemID,nlocSides INTEGER :: LocalSide INTEGER :: NrOfThroughSides, ind2 @@ -79,6 +80,7 @@ SUBROUTINE PhotonTriaTracking() LOGICAL :: oldElemIsMortar, isMortarSideTemp(1:6), doCheckSide REAL :: minRatio, intersecDist, intersecDistVec(3) REAL :: IntersectionPos(1:3), IntersectionPosTemp(1:3) +LOGICAL :: PhotonLost !=================================================================================================================================== Done = .FALSE. ElemID = PhotonProps%ElemID @@ -182,16 +184,28 @@ SUBROUTINE PhotonTriaTracking() END IF END DO IF (doCheckSide) THEN - IF(ind2.gt.6)THEN - IPWRITE(UNIT_StdOut,*) "ind2 =", ind2 - END IF ! ind2.gt.6 IF (isMortarSideTemp(ind2)) THEN ! Mortar side NbElemID = SideInfo_Shared(SIDE_ELEMID,GlobSideTemp(ind2)) ! Get the determinant between the old and new particle position and the nodes of the triangle which was crossed - IF(ind2.gt.6)THEN - IPWRITE(UNIT_StdOut,*) "ind2 =", ind2 - END IF ! ind2.gt.6 - CALL PhotonIntersectionWithSide(LocSidesTemp(ind2),NbElemID,TriNumTemp(ind2), IntersectionPosTemp, .TRUE.) + CALL PhotonIntersectionWithSide(LocSidesTemp(ind2),NbElemID,TriNumTemp(ind2), IntersectionPosTemp, PhotonLost, .TRUE.) + IF(PhotonLost)THEN + ASSOCIATE( LastPhotPos => PhotonProps%PhotonLastPos(1:3), & + Pos => PhotonProps%PhotonPos(1:3), & + Dir => PhotonProps%PhotonDirection(1:3) ) + CALL StoreLostPhotonProperties(LastPhotPos,Pos,Dir,ElemID) + NbrOfLostParticles=NbrOfLostParticles+1 + IF(DisplayLostParticles)THEN + IPWRITE(*,*) 'Error in Photon TriaTracking! PhotonIntersectionWithSide() cannot determine intersection'& + //' because photon is parallel to side. NbElemID:', NbElemID + IPWRITE(*,*) 'LastPos: ', PhotonProps%PhotonLastPos(1:3) + IPWRITE(*,*) 'Pos: ', PhotonProps%PhotonPos(1:3) + IPWRITE(*,*) 'Direction:', PhotonProps%PhotonDirection(1:3) + IPWRITE(*,*) 'Photon deleted!' + END IF ! DisplayLostParticles + END ASSOCIATE + Done = .TRUE. + EXIT + END IF ! PhotonLost intersecDistVec(1:3) = IntersectionPosTemp(1:3) - PhotonProps%PhotonLastPos(1:3) intersecDist = DOT_PRODUCT(intersecDistVec, intersecDistVec) ! If the particle is inside the neighboring mortar element, it moved through this side @@ -207,7 +221,25 @@ SUBROUTINE PhotonTriaTracking() oldElemIsMortar = .TRUE. END IF ELSE ! Regular side - CALL PhotonIntersectionWithSide(LocSidesTemp(ind2),NbElemID,TriNumTemp(ind2), IntersectionPosTemp) + CALL PhotonIntersectionWithSide(LocSidesTemp(ind2),ElemID,TriNumTemp(ind2), IntersectionPosTemp, PhotonLost) + IF(PhotonLost)THEN + ASSOCIATE( LastPhotPos => PhotonProps%PhotonLastPos(1:3), & + Pos => PhotonProps%PhotonPos(1:3), & + Dir => PhotonProps%PhotonDirection(1:3) ) + CALL StoreLostPhotonProperties(LastPhotPos,Pos,Dir,ElemID) + NbrOfLostParticles=NbrOfLostParticles+1 + IF(DisplayLostParticles)THEN + IPWRITE(*,*) 'Error in Photon TriaTracking! PhotonIntersectionWithSide() cannot determine intersection'& + //' because photon is parallel to side. ElemID:', ElemID + IPWRITE(*,*) 'LastPos: ', PhotonProps%PhotonLastPos(1:3) + IPWRITE(*,*) 'Pos: ', PhotonProps%PhotonPos(1:3) + IPWRITE(*,*) 'Direction:', PhotonProps%PhotonDirection(1:3) + IPWRITE(*,*) 'Photon deleted!' + END IF ! DisplayLostParticles + END ASSOCIATE + Done = .TRUE. + EXIT + END IF ! PhotonLost intersecDistVec(1:3) = IntersectionPosTemp(1:3) - PhotonProps%PhotonLastPos(1:3) intersecDist = DOT_PRODUCT(intersecDistVec, intersecDistVec) IF (intersecDist.LT.minRatio) THEN @@ -246,10 +278,31 @@ SUBROUTINE PhotonTriaTracking() ! 3) In case of a boundary, perform the appropriate boundary interaction IF (SideInfo_Shared(SIDE_BCID,SideID).GT.0) THEN OldElemID=ElemID - BCType = PartBound%TargetBoundCond(PartBound%MapToPartBC(SideInfo_Shared(SIDE_BCID,SideID))) + iPBC = PartBound%MapToPartBC(SideInfo_Shared(SIDE_BCID,SideID)) + BCType = PartBound%TargetBoundCond(iPBC) SELECT CASE(BCType) CASE(1) !PartBound%OpenBC) - IF (NrOfThroughSides.LT.2) CALL PhotonIntersectionWithSide(LocalSide,ElemID,TriNum, IntersectionPos) + IF(NrOfThroughSides.LT.2)THEN + CALL PhotonIntersectionWithSide(LocalSide,ElemID,TriNum, IntersectionPos, PhotonLost) + IF(PhotonLost)THEN + ASSOCIATE( LastPhotPos => PhotonProps%PhotonLastPos(1:3), & + Pos => PhotonProps%PhotonPos(1:3), & + Dir => PhotonProps%PhotonDirection(1:3) ) + CALL StoreLostPhotonProperties(LastPhotPos,Pos,Dir,ElemID) + NbrOfLostParticles=NbrOfLostParticles+1 + IF(DisplayLostParticles)THEN + IPWRITE(*,*) 'Error in Photon TriaTracking! PhotonIntersectionWithSide() cannot determine intersection'& + //' because photon is parallel to side. ElemID:', ElemID + IPWRITE(*,*) 'LastPos: ', PhotonProps%PhotonLastPos(1:3) + IPWRITE(*,*) 'Pos: ', PhotonProps%PhotonPos(1:3) + IPWRITE(*,*) 'Direction:', PhotonProps%PhotonDirection(1:3) + IPWRITE(*,*) 'Photon deleted!' + END IF ! DisplayLostParticles + END ASSOCIATE + Done = .TRUE. + EXIT + END IF ! PhotonLost + END IF ! NrOfThroughSides.LT.2 CALL CalcAbsoprtion(IntersectionPos(1:3),ElemID, DONE) IF (RadObservationPointMethod.EQ.1) THEN IF (PointInObsCone(IntersectionPos(1:3))) THEN @@ -266,25 +319,40 @@ SUBROUTINE PhotonTriaTracking() END IF DONE = .TRUE. CASE(2) ! PartBound%ReflectiveBC - IF (PartBound%PhotonSpecularReflection(PartBound%MapToPartBC(SideInfo_Shared(SIDE_BCID,SideID)))) THEN + ! Backup photon direction for ray tracing + PhotonProps%PhotonDirectionBeforeReflection(1:3) = PhotonProps%PhotonDirection(1:3) + + ! Check if specular of diffuse reflection + IF (PartBound%PhotonSpecularReflection(iPBC)) THEN + ! Specular reflection IF (NrOfThroughSides.LT.2) THEN CALL PerfectPhotonReflection(LocalSide,ElemID,TriNum, IntersectionPos, .FALSE.) ELSE CALL PerfectPhotonReflection(LocalSide,ElemID,TriNum, IntersectionPos, .TRUE.) END IF - CALL CalcAbsoprtion(IntersectionPos(1:3),ElemID, DONE) - IF (.NOT.DONE) CALL CalcWallAbsoprtion(SideID, DONE) ELSE + ! Diffuse reflection IF (NrOfThroughSides.LT.2) THEN CALL DiffusePhotonReflection(LocalSide,ElemID,TriNum, IntersectionPos, .FALSE.) ELSE CALL DiffusePhotonReflection(LocalSide,ElemID,TriNum, IntersectionPos, .TRUE.) END IF - CALL CalcAbsoprtion(IntersectionPos(1:3),ElemID, DONE) - IF (.NOT.DONE) CALL CalcWallAbsoprtion(SideID, DONE) END IF + + ! Check if ray tracing is active + IF(RadiationAbsorptionModel.EQ.0)THEN + CALL CalcAbsoprtion(IntersectionPos(1:3), ElemID, DONE, before = .TRUE.) + IF (.NOT.DONE) THEN + CALL CalcWallAbsoprtion(SideID, DONE) + CALL CalcAbsoprtion(IntersectionPos(1:3), ElemID, DONE, before = .FALSE.) + END IF ! .NOT.DONE + ELSE + CALL CalcAbsoprtion(IntersectionPos(1:3), ElemID, DONE) + IF (.NOT.DONE) CALL CalcWallAbsoprtion(SideID, DONE) + END IF ! RadiationAbsorptionModel.EQ.0 + CASE(3) ! PartBound%PeriodicBC - CALL CalcAbsoprtion(IntersectionPos(1:3),ElemID, DONE) + CALL CalcAbsoprtion(IntersectionPos(1:3), ElemID, DONE) IF (NrOfThroughSides.LT.2) THEN CALL PeriodicPhotonBC(LocalSide,ElemID,TriNum,IntersectionPos,.FALSE.,SideID) ELSE @@ -314,15 +382,41 @@ SUBROUTINE PhotonTriaTracking() DoneLastElem(2,1) = LocalSide DoneLastElem(3,1) = TriNum DoneLastElem(4,1) = SideID + IF (oldElemIsMortar) THEN ElemID = SideInfo_Shared(SIDE_ELEMID,SideID) - CALL PhotonIntersectionWithSide(LocalSide,ElemID,TriNum, IntersectionPos,.TRUE.) - CALL CalcAbsoprtion(IntersectionPos(1:3),DoneLastElem(1,1), DONE) + CALL PhotonIntersectionWithSide(LocalSide,ElemID,TriNum, IntersectionPos, PhotonLost,.TRUE.) ELSE - CALL PhotonIntersectionWithSide(LocalSide,ElemID,TriNum, IntersectionPos) - CALL CalcAbsoprtion(IntersectionPos(1:3),ElemID, DONE) - ElemID = SideInfo_Shared(SIDE_NBELEMID,SideID) + CALL PhotonIntersectionWithSide(LocalSide,ElemID,TriNum, IntersectionPos, PhotonLost) END IF + + ! Check if lost during intersection + IF(PhotonLost)THEN + ASSOCIATE( LastPhotPos => PhotonProps%PhotonLastPos(1:3), & + Pos => PhotonProps%PhotonPos(1:3), & + Dir => PhotonProps%PhotonDirection(1:3) ) + CALL StoreLostPhotonProperties(LastPhotPos,Pos,Dir,ElemID) + NbrOfLostParticles=NbrOfLostParticles+1 + IF(DisplayLostParticles)THEN + IPWRITE(*,*) 'Error in Photon TriaTracking! PhotonIntersectionWithSide() cannot determine intersection'& + //' because photon is parallel to side. ElemID:', ElemID + IPWRITE(*,*) 'LastPos: ', PhotonProps%PhotonLastPos(1:3) + IPWRITE(*,*) 'Pos: ', PhotonProps%PhotonPos(1:3) + IPWRITE(*,*) 'Direction:', PhotonProps%PhotonDirection(1:3) + IPWRITE(*,*) 'Photon deleted!' + END IF ! DisplayLostParticles + END ASSOCIATE + Done = .TRUE. + EXIT + ELSE + ! Absorption + IF (oldElemIsMortar) THEN + CALL CalcAbsoprtion(IntersectionPos(1:3),DoneLastElem(1,1), DONE) + ELSE + CALL CalcAbsoprtion(IntersectionPos(1:3),ElemID, DONE) + ElemID = SideInfo_Shared(SIDE_NBELEMID,SideID) + END IF + END IF ! PhotonLost END IF ! BC(SideID).GT./.LE. 0 ! Check if output to PartStateBoundary is activated IF(PhotonModeBPO.EQ.2)THEN diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 index 9405de4a7..6001a8d1d 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 @@ -61,14 +61,27 @@ SUBROUTINE WritePhotonVolSampleToHDF5() CHARACTER(LEN=255) :: FileName INTEGER :: iElem INTEGER,PARAMETER :: nVar=1 -REAL, ALLOCATABLE :: RayElemPassedEnergyLoc(:) +REAL, ALLOCATABLE :: RayElemPassedEnergyLoc1st(:),RayElemPassedEnergyLoc2nd(:) +REAL, ALLOCATABLE :: RaySecondaryVectorX(:),RaySecondaryVectorY(:),RaySecondaryVectorZ(:) CHARACTER(LEN=255), ALLOCATABLE :: StrVarNames(:) !=================================================================================================================================== SWRITE(UNIT_stdOut,'(a)',ADVANCE='NO') ' WRITE Radiation TO HDF5 FILE...' -ALLOCATE(RayElemPassedEnergyLoc(1:nElems)) -RayElemPassedEnergyLoc=-1 -CALL AddToElemData(ElementOut,'RayElemPassedEnergy',RealArray=RayElemPassedEnergyLoc) +ALLOCATE(RayElemPassedEnergyLoc1st(1:nElems)) +ALLOCATE(RayElemPassedEnergyLoc2nd(1:nElems)) +ALLOCATE(RaySecondaryVectorX(1:nElems)) +ALLOCATE(RaySecondaryVectorY(1:nElems)) +ALLOCATE(RaySecondaryVectorZ(1:nElems)) +RayElemPassedEnergyLoc1st=-1.0 +RayElemPassedEnergyLoc2nd=-1.0 +RaySecondaryVectorX=-1.0 +RaySecondaryVectorY=-1.0 +RaySecondaryVectorZ=-1.0 +CALL AddToElemData(ElementOut,'RayElemPassedEnergy1st',RealArray=RayElemPassedEnergyLoc1st) +CALL AddToElemData(ElementOut,'RayElemPassedEnergy2nd',RealArray=RayElemPassedEnergyLoc2nd) +CALL AddToElemData(ElementOut,'RaySecondaryVectorX',RealArray=RaySecondaryVectorX) +CALL AddToElemData(ElementOut,'RaySecondaryVectorY',RealArray=RaySecondaryVectorY) +CALL AddToElemData(ElementOut,'RaySecondaryVectorZ',RealArray=RaySecondaryVectorZ) ALLOCATE(StrVarNames(1:nVar)) StrVarNames(1)='dummy' @@ -83,13 +96,30 @@ SUBROUTINE WritePhotonVolSampleToHDF5() CALL ExchangeRayVolInfo() #endif /*USE_MPI*/ -DO iElem=1,PP_nElems #if USE_MPI - RayElemPassedEnergyLoc(iElem) = RayElemPassedEnergy_Shared(iElem+offSetElem) -#else - RayElemPassedEnergyLoc(iElem) = RayElemPassedEnergy(iElem+offSetElem) +ASSOCIATE( RayElemPassedEnergy => RayElemPassedEnergy_Shared ) +#endif /*USE_MPI*/ + DO iElem=1,PP_nElems + ! Primary energy + RayElemPassedEnergyLoc1st(iElem) = RayElemPassedEnergy(1,iElem+offSetElem) + ! Secondary energy + RayElemPassedEnergyLoc2nd(iElem) = RayElemPassedEnergy(2,iElem+offSetElem) + ! Check if secondary energy is greater than zero + IF(RayElemPassedEnergyLoc2nd(iElem).GT.0.0)THEN + IF(RayElemPassedEnergy(6,iElem+offSetElem).LE.0.0) CALL abort(__STAMP__,'Secondary ray counter is zero but energy is not!') + ! x-, y- and z-direction of secondary energy + RaySecondaryVectorX(iElem) = RayElemPassedEnergy(3,iElem+offSetElem) / RayElemPassedEnergy(6,iElem+offSetElem) + RaySecondaryVectorY(iElem) = RayElemPassedEnergy(4,iElem+offSetElem) / RayElemPassedEnergy(6,iElem+offSetElem) + RaySecondaryVectorZ(iElem) = RayElemPassedEnergy(5,iElem+offSetElem) / RayElemPassedEnergy(6,iElem+offSetElem) + ELSE + RaySecondaryVectorX(iElem) = 0. + RaySecondaryVectorY(iElem) = 0. + RaySecondaryVectorZ(iElem) = 0. + END IF ! RayElemPassedEnergyLoc2nd(iElem).GT.0 + END DO +#if USE_MPI +END ASSOCIATE #endif /*USE_MPI*/ -END DO ! Write all 'ElemData' arrays to a single container in the state.h5 file CALL WriteAdditionalElemData(FileName,ElementOut) @@ -276,12 +306,13 @@ SUBROUTINE ExchangeRadiationSurfData() MessageSize = 2*nComputeNodeSurfTotalSides IF (myComputeNodeRank.EQ.0) THEN - CALL MPI_REDUCE(PhotonSampWall,PhotonSampWall_Shared,MessageSize,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_SHARED,IERROR) + CALL MPI_REDUCE(PhotonSampWall, PhotonSampWall_Shared, MessageSize, MPI_DOUBLE_PRECISION, MPI_SUM, 0, MPI_COMM_SHARED, IERROR) ELSE - CALL MPI_REDUCE(PhotonSampWall,0 ,MessageSize,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_SHARED,IERROR) + CALL MPI_REDUCE(PhotonSampWall, 0 , MessageSize, MPI_DOUBLE_PRECISION, MPI_SUM, 0, MPI_COMM_SHARED, IERROR) ENDIF -CALL BARRIER_AND_SYNC(PhotonSampWall_Shared_Win ,MPI_COMM_SHARED) +! Update +CALL BARRIER_AND_SYNC(PhotonSampWall_Shared_Win,MPI_COMM_SHARED) ! prepare buffers for surf leader communication IF (myComputeNodeRank.EQ.0) THEN @@ -396,7 +427,7 @@ SUBROUTINE ExchangeRayVolInfo() USE MOD_PreProc USE MOD_MPI_Shared_Vars USE MOD_MPI_Shared -USE MOD_RayTracing_Vars ,ONLY: RayElemPassedEnergy,RayElemPassedEnergy_Shared,RayElemPassedEnergy_Shared_Win +USE MOD_RayTracing_Vars ,ONLY: RayElemPassedEnergy,RayElemPassedEnergy_Shared,RayElemPassedEnergy_Shared_Win,RayElemSize USE MOD_Mesh_Vars ,ONLY: nGlobalElems ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -410,12 +441,12 @@ SUBROUTINE ExchangeRayVolInfo() INTEGER :: MessageSize !=================================================================================================================================== ! Collect the information from the process-local shadow arrays in the compute-node shared array -MessageSize = nGlobalElems +MessageSize = RayElemSize*nGlobalElems IF (myComputeNodeRank.EQ.0) THEN - CALL MPI_REDUCE(RayElemPassedEnergy , RayElemPassedEnergy_Shared , MessageSize , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_SHARED , IERROR) + CALL MPI_REDUCE(RayElemPassedEnergy, RayElemPassedEnergy_Shared, MessageSize, MPI_DOUBLE_PRECISION, MPI_SUM, 0, MPI_COMM_SHARED, IERROR) ELSE - CALL MPI_REDUCE(RayElemPassedEnergy , 0 , MessageSize , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_SHARED , IERROR) + CALL MPI_REDUCE(RayElemPassedEnergy, 0 , MessageSize, MPI_DOUBLE_PRECISION, MPI_SUM, 0, MPI_COMM_SHARED, IERROR) ENDIF CALL BARRIER_AND_SYNC(RayElemPassedEnergy_Shared_Win, MPI_COMM_SHARED) diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 index 48c640baa..a81dede79 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 @@ -46,6 +46,7 @@ SUBROUTINE PhotonThroughSideCheck3DFast(iLocSide,Element,ThroughSide,TriNum, IsM !=================================================================================================================================== ! MODULES USE MOD_Globals_Vars ,ONLY: EpsMach +USE MOD_Globals ,ONLY: abort USE MOD_Particle_Mesh_Vars ,ONLY: NodeCoords_Shared, ElemSideNodeID_Shared USE MOD_Photon_TrackingVars ,ONLY: PhotonProps USE MOD_Mesh_Tools ,ONLY: GetCNElemID @@ -66,9 +67,13 @@ SUBROUTINE PhotonThroughSideCheck3DFast(iLocSide,Element,ThroughSide,TriNum, IsM REAL :: Px, Py, Pz REAL :: Vx, Vy, Vz!, Vall REAL :: xNode(3), yNode(3), zNode(3), Ax(3), Ay(3), Az(3) -REAL :: det(3) +REAL :: det(3),tolerance !=================================================================================================================================== CNElemID = GetCNElemID(Element) + +! Sanity check +IF(CNElemID.LE.0) CALL abort(__STAMP__,'PhotonThroughSideCheck3DFast() found CNElemID<=0') + ThroughSide = .FALSE. Px = PhotonProps%PhotonLastPos(1) @@ -131,13 +136,17 @@ SUBROUTINE PhotonThroughSideCheck3DFast(iLocSide,Element,ThroughSide,TriNum, IsM (Az(3) * Vx - Ax(3) * Vz) * Ay(2) + & (Ax(3) * Vy - Ay(3) * Vx) * Az(2)) +! Changed tolerance from -epsMach to -0.1*epsMach because this check finds intersections, but when PhotonIntersectionWithSide() is +! called, the photon vector and the side normal vector are perfectly parallel, e.g., v = (/0,0,-1/) and n=(/0,-1,0./), hence, the +! scalar product is exactly zero and the routine breakes. +tolerance = -0.1*epsMach ! Comparison of the determinants with eps, where a x_photon_startro is stored (due to machine precision) -IF ((det(1).ge.-epsMach).AND.(det(2).ge.-epsMach).AND.(det(3).ge.-epsMach)) THEN - ThroughSide = .TRUE. -END IF +IF(det(1).LT.tolerance) RETURN +IF(det(2).LT.tolerance) RETURN +IF(det(3).LT.tolerance) RETURN +ThroughSide = .TRUE. RETURN - END SUBROUTINE PhotonThroughSideCheck3DFast @@ -229,6 +238,7 @@ END SUBROUTINE PhotonThroughSideCheck3DDir !=================================================================================================================================== SUBROUTINE PhotonIntersectionWithSide2D(iLocSide,Element,ThroughSide,IntersectionPos,isLastSide,Distance) ! MODULES +USE MOD_Globals ,ONLY: abort USE MOD_Particle_Mesh_Vars ,ONLY: ElemSideNodeID2D_Shared, NodeCoords_Shared USE MOD_Photon_TrackingVars ,ONLY: PhotonProps USE MOD_Mesh_Tools ,ONLY: GetCNElemID @@ -250,6 +260,10 @@ SUBROUTINE PhotonIntersectionWithSide2D(iLocSide,Element,ThroughSide,Intersectio REAL :: beta, alpha, deltay, a, b, c, tmpsqrt !=================================================================================================================================== CNElemID = GetCNElemID(Element) + +! Sanity check +IF(CNElemID.LE.0) CALL abort(__STAMP__,'PhotonIntersectionWithSide2D() found CNElemID<=0') + ThroughSide = .FALSE. xNode1 = NodeCoords_Shared(1,ElemSideNodeID2D_Shared(1,iLocSide, CNElemID)) @@ -514,10 +528,11 @@ END SUBROUTINE RotatePhotonIn2DPlane !=================================================================================================================================== !> !=================================================================================================================================== -SUBROUTINE PhotonIntersectionWithSide(iLocSide,Element,TriNum, IntersectionPos, IsMortar) -USE MOD_Particle_Mesh_Vars, ONLY : ElemSideNodeID_Shared, NodeCoords_Shared +SUBROUTINE PhotonIntersectionWithSide(iLocSide,Element,TriNum, IntersectionPos, PhotonLost, IsMortar) +USE MOD_Globals ,ONLY: abort,UNIT_StdOut,myrank +USE MOD_Particle_Mesh_Vars ,ONLY: ElemSideNodeID_Shared, NodeCoords_Shared USE MOD_Photon_TrackingVars ,ONLY: PhotonProps -USE MOD_Mesh_Tools ,ONLY: GetCNElemID +USE MOD_Mesh_Tools ,ONLY: GetCNElemID !--------------------------------------------------------------------------------------------------! IMPLICIT NONE !--------------------------------------------------------------------------------------------------! @@ -525,6 +540,7 @@ SUBROUTINE PhotonIntersectionWithSide(iLocSide,Element,TriNum, IntersectionPos, INTEGER,INTENT(IN) :: iLocSide INTEGER,INTENT(IN) :: Element INTEGER,INTENT(IN) :: TriNum +LOGICAL,INTENT(OUT) :: PhotonLost REAL,INTENT(OUT) :: IntersectionPos(1:3) LOGICAL, INTENT(IN), OPTIONAL :: IsMortar ! Local variable declaration @@ -539,6 +555,13 @@ SUBROUTINE PhotonIntersectionWithSide(iLocSide,Element,TriNum, IntersectionPos, CNElemID = GetCNElemID(Element) +! Sanity check +IF(CNElemID.LE.0) THEN + IPWRITE(UNIT_StdOut,*) "Element =", Element + IPWRITE(UNIT_StdOut,*) "CNElemID =", CNElemID + CALL abort(__STAMP__,'PhotonIntersectionWithSide() found CNElemID<=0') +END IF + PoldX = PhotonProps%PhotonLastPos(1) PoldY = PhotonProps%PhotonLastPos(2) PoldZ = PhotonProps%PhotonLastPos(3) @@ -564,6 +587,7 @@ SUBROUTINE PhotonIntersectionWithSide(iLocSide,Element,TriNum, IntersectionPos, Vector2(2) = NodeCoords_Shared(2,ElemSideNodeID_Shared(Node2,iLocSide,CNElemID)+1) - yNod Vector2(3) = NodeCoords_Shared(3,ElemSideNodeID_Shared(Node2,iLocSide,CNElemID)+1) - zNod +! Normal vector of side (one of the two triangles) nx = Vector1(2) * Vector2(3) - Vector1(3) * Vector2(2) ny = Vector1(3) * Vector2(1) - Vector1(1) * Vector2(3) nz = Vector1(1) * Vector2(2) - Vector1(2) * Vector2(1) @@ -597,8 +621,17 @@ SUBROUTINE PhotonIntersectionWithSide(iLocSide,Element,TriNum, IntersectionPos, VectorShift(2) = PhotonProps%PhotonDirection(2) VectorShift(3) = PhotonProps%PhotonDirection(3) +! IntersecPara is zero when photon is perfectly perpendicular to side (cannot actually happen) +PhotonLost=.FALSE. IntersecPara = VectorShift(1) * nx + VectorShift(2) * ny + VectorShift(3) * nz -IntersecPara = dist / IntersecPara +IF(ABS(IntersecPara).GT.0.0)THEN + IntersecPara = dist / IntersecPara +ELSE + ! Mark photon as lost so that it is written to PartStateLost.h5 + PhotonLost = .TRUE. + IntersectionPos = HUGE(1.0) + RETURN +END IF ! ABS(IntersecPara).GT.0.0 IntersectionPos(1) = PoldX + IntersecPara * VectorShift(1) IntersectionPos(2) = PoldY + IntersecPara * VectorShift(2) @@ -611,17 +644,25 @@ END SUBROUTINE PhotonIntersectionWithSide !=================================================================================================================================== !> !=================================================================================================================================== -SUBROUTINE CalcAbsorptionRayTrace(GlobalElemID) -USE MOD_RayTracing_Vars ,ONLY: RayElemPassedEnergy +SUBROUTINE CalcAbsorptionRayTrace(GlobalElemID,PhotonDir) +USE MOD_RayTracing_Vars ,ONLY: RayElemPassedEnergy,Ray USE MOD_Photon_TrackingVars ,ONLY: PhotonProps !--------------------------------------------------------------------------------------------------! IMPLICIT NONE !--------------------------------------------------------------------------------------------------! ! argument list declaration -INTEGER, INTENT(IN) :: GlobalElemID +INTEGER, INTENT(IN) :: GlobalElemID +REAL, INTENT(IN) :: PhotonDir(3) ! Local variable declaration !--------------------------------------------------------------------------------------------------! -RayElemPassedEnergy(GlobalElemID) = RayElemPassedEnergy(GlobalElemID) + PhotonProps%PhotonEnergy +! Check primary or secondary direction +IF(DOT_PRODUCT(PhotonDir,Ray%Direction).GT.0.0)THEN + RayElemPassedEnergy(1,GlobalElemID) = RayElemPassedEnergy(1,GlobalElemID) + PhotonProps%PhotonEnergy +ELSE + RayElemPassedEnergy(2,GlobalElemID) = RayElemPassedEnergy(2,GlobalElemID) + PhotonProps%PhotonEnergy + RayElemPassedEnergy(3:5,GlobalElemID) = RayElemPassedEnergy(3:5,GlobalElemID) + PhotonDir(1:3) + RayElemPassedEnergy(6,GlobalElemID) = RayElemPassedEnergy(6,GlobalElemID) + 1.0 +END IF END SUBROUTINE CalcAbsorptionRayTrace @@ -699,20 +740,41 @@ END SUBROUTINE CalcAbsoprtionAnalytic !=================================================================================================================================== !> !=================================================================================================================================== -SUBROUTINE CalcAbsoprtion(IntersectionPos,Element, DONE) +SUBROUTINE CalcAbsoprtion(IntersectionPos, Element, DONE, before) USE MOD_Globals USE MOD_RadiationTrans_Vars ,ONLY: RadiationAbsorptionModel +USE MOD_Photon_TrackingVars ,ONLY: PhotonProps !--------------------------------------------------------------------------------------------------! IMPLICIT NONE !--------------------------------------------------------------------------------------------------! ! argument list declaration -INTEGER, INTENT(IN) :: Element -REAL, INTENT(IN) :: IntersectionPos(3) -LOGICAL, INTENT(INOUT) :: DONE +INTEGER, INTENT(IN) :: Element +REAL, INTENT(IN) :: IntersectionPos(3) +LOGICAL, INTENT(INOUT) :: DONE +LOGICAL, INTENT(IN), OPTIONAL :: before !> before=T (before reflection), before=F (after reflection), before=NOT PRESENT (volume) ! Local variable declaration !--------------------------------------------------------------------------------------------------! IF (RadiationAbsorptionModel.EQ.0) THEN - CALL CalcAbsorptionRayTrace(Element) + ! For ray tracing, check if routine is called be + IF(PRESENT(before))THEN + IF(before)THEN + ! Before reflection: Nothing to do as it is not yet known if the ray is absorbed at the surface + RETURN + ELSE + ! After reflection: Use old or new ray direction depending on whether the ray was absorbed + IF(DONE)THEN + ! Ray was absorbed at the wall + CALL CalcAbsorptionRayTrace(Element,PhotonProps%PhotonDirectionBeforeReflection) + ELSE + ! Ray was reflected at the wall + ! TODO: Not sure which ray vector should be used + !CALL CalcAbsorptionRayTrace(Element,PhotonProps%PhotonDirection) + CALL CalcAbsorptionRayTrace(Element,PhotonProps%PhotonDirectionBeforeReflection) + END IF ! DONE + END IF ! before + ELSE + CALL CalcAbsorptionRayTrace(Element,PhotonProps%PhotonDirection) + END IF ! PRESENT(before) ELSEIF (RadiationAbsorptionModel.EQ.1) THEN CALL CalcAbsoprtionAnalytic(IntersectionPos,Element, DONE) ELSEIF (RadiationAbsorptionModel.EQ.2) THEN @@ -1125,6 +1187,9 @@ SUBROUTINE PeriodicPhotonBC(iLocSide, Element, TriNum, IntersectionPos, Intersec END SUBROUTINE PeriodicPhotonBC +!=================================================================================================================================== +!> +!=================================================================================================================================== SUBROUTINE CalcWallAbsoprtion(GlobSideID, DONE) USE MOD_Photon_TrackingVars ,ONLY: PhotonProps,PhotonSampWall USE MOD_Particle_Boundary_Vars ,ONLY: PartBound, GlobalSide2SurfSide @@ -1137,12 +1202,15 @@ SUBROUTINE CalcWallAbsoprtion(GlobSideID, DONE) LOGICAL, INTENT(OUT) :: DONE ! Local variable declaration !--------------------------------------------------------------------------------------------------! -REAL :: iRan +REAL :: iRan,PhotonEnACC INTEGER :: SurfSideID !--------------------------------------------------------------------------------------------------! +DONE = .FALSE. ! initialize +PhotonEnACC = PartBound%PhotonEnACC(PartBound%MapToPartBC(SideInfo_Shared(SIDE_BCID,GlobSideID))) +IF(PhotonEnACC.LE.0.0) RETURN ! Skip sides without absorption (pure reflection) SurfSideID = GlobalSide2SurfSide(SURF_SIDEID,GlobSideID) CALL RANDOM_NUMBER(iRan) -IF (PartBound%PhotonEnACC(PartBound%MapToPartBC(SideInfo_Shared(SIDE_BCID,GlobSideID))).GT.iRan) THEN +IF (PhotonEnACC.GT.iRan) THEN DONE = .TRUE. PhotonSampWall(1,SurfSideID) = PhotonSampWall(1,SurfSideID) + 1. PhotonSampWall(2,SurfSideID) = PhotonSampWall(2,SurfSideID) + PhotonProps%PhotonEnergy diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_vars.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_vars.f90 index 23bbc9a7d..50dabc905 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_vars.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_vars.f90 @@ -28,6 +28,7 @@ MODULE MOD_Photon_TrackingVars REAL :: PhotonPos(3) !> REAL :: PhotonLastPos(3) !> REAL :: PhotonDirection(3) !> + REAL :: PhotonDirectionBeforeReflection(3) !> REAL :: PhotonEnergy !> INTEGER :: ElemID !> INTEGER :: WaveLength !> diff --git a/src/radiation/ray_tracing/raytrace.f90 b/src/radiation/ray_tracing/raytrace.f90 index 18df11fd4..97a0fafac 100644 --- a/src/radiation/ray_tracing/raytrace.f90 +++ b/src/radiation/ray_tracing/raytrace.f90 @@ -43,7 +43,7 @@ SUBROUTINE RayTracing() USE MOD_Globals USE MOD_MPI_Shared_Vars USE MOD_MPI_Shared -USE MOD_RayTracing_Vars ,ONLY: RayPartBound,NumRays,Ray,RayElemPassedEnergy +USE MOD_RayTracing_Vars ,ONLY: RayPartBound,NumRays,Ray,RayElemPassedEnergy,RayElemSize USE MOD_Photon_TrackingVars ,ONLY: PhotonProps USE MOD_Photon_Tracking ,ONLY: PhotonTriaTracking USE MOD_Mesh_Tools ,ONLY: GetGlobalElemID @@ -84,14 +84,14 @@ SUBROUTINE RayTracing() SWRITE(UNIT_stdOut,'(A)') ' Start Ray Tracing Calculation ...' ! Allocate arrays -ALLOCATE(RayElemPassedEnergy(1:nGlobalElems)) +ALLOCATE(RayElemPassedEnergy(RayElemSize,1:nGlobalElems)) RayElemPassedEnergy=0.0 ALLOCATE(PhotonSampWall(2,1:nComputeNodeSurfTotalSides)) PhotonSampWall=0.0 #if USE_MPI !> Shared arrays for volume sampling -CALL Allocate_Shared((/nGlobalElems/),RayElemPassedEnergy_Shared_Win,RayElemPassedEnergy_Shared) +CALL Allocate_Shared((/RayElemSize,nGlobalElems/),RayElemPassedEnergy_Shared_Win,RayElemPassedEnergy_Shared) CALL MPI_WIN_LOCK_ALL(0,RayElemPassedEnergy_Shared_Win,IERROR) !> Shared arrays for boundary sampling CALL Allocate_Shared((/2,nComputeNodeSurfTotalSides/),PhotonSampWall_Shared_Win,PhotonSampWall_Shared) diff --git a/src/radiation/ray_tracing/raytrace_vars.f90 b/src/radiation/ray_tracing/raytrace_vars.f90 index 236705452..82617528e 100644 --- a/src/radiation/ray_tracing/raytrace_vars.f90 +++ b/src/radiation/ray_tracing/raytrace_vars.f90 @@ -56,10 +56,11 @@ MODULE MOD_RayTracing_Vars INTEGER :: RayPosModel !> INTEGER :: RayPartBound !> Particle boundary ID where rays are emitted from -REAL, ALLOCATABLE :: RayElemPassedEnergy(:) !> +INTEGER,PARAMETER :: RayElemSize=6 +REAL, ALLOCATABLE :: RayElemPassedEnergy(:,:) !> #if USE_MPI INTEGER :: RayElemPassedEnergy_Shared_Win !> -REAL,POINTER :: RayElemPassedEnergy_Shared(:) !> +REAL,POINTER :: RayElemPassedEnergy_Shared(:,:)!> #endif !=================================================================================================================================== END MODULE MOD_RayTracing_Vars From 2b9a5a8bfff7b87a17ca62aa42a1079d1a879dbe Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Sat, 27 May 2023 17:22:42 +0200 Subject: [PATCH 086/495] Moved ray tracing cmake include files to particlesF90 --- src/CMakeLists.txt | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 83f3660d0..190c8f5b0 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -436,11 +436,7 @@ FILE(GLOB_RECURSE piclasF90 ./src/init/*.f90 ./src/restart/*.f90 ./src/utils/*.f90 ./unitTests/unittest.f90 - ./unitTests/unittest_vars.f90 - ./src/radiation/ray_tracing/*.f90 - ./src/radiation/radiative_transfer/radtrans_vars.f90 - ./src/radiation/radiative_transfer/tracking/*.f90 - ./src/radiation/radiation_solver/radiation_vars.f90) + ./unitTests/unittest_vars.f90) LIST(APPEND timediscF90 ${timediscF90} ./src/timedisc/timedisc.f90 @@ -498,7 +494,12 @@ ENDIF() #./src/piclaslib.f90) FILE(GLOB_RECURSE particlesF90 ./src/particles/*.f90 ./src/posti/superB/*.f90 - ./src/interpolation/eval_xyz.f90) + ./src/interpolation/eval_xyz.f90 + ./src/radiation/ray_tracing/*.f90 + ./src/radiation/radiative_transfer/radtrans_vars.f90 + ./src/radiation/radiative_transfer/tracking/*.f90 + ./src/radiation/radiation_solver/radiation_vars.f90) + FILE(GLOB noparticlesF90 ./src/particles/analyze/particle_analyze_vars.f90 ./src/particles/particle_mesh/particle_surfaces_vars.f90 ./src/particles/particle_mesh/particle_mesh_vars.f90 From c2aaf613cc94ee6868ab81d824513e65104cca89 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Sat, 27 May 2023 17:41:26 +0200 Subject: [PATCH 087/495] - fixed WriteArrayToHDF5(collective=.false.) for radiation transport output (collective only T if absolutely sure that all processes enter the routine) - fixed MOD(X,0) so that it prevented that zero is passed as 2nd argument, which was used for PhotDisp=INT(LocPhotNum/20), which is zero when LocRayNum<20 - fixed call to PhotonIntersectionWithSide() in case of regular (non-Mortar) sides, where NbElemID was used instead of ElemID (copy/pasta) - fixed CalcWallAbsoprtion() where the INTENT(OUT) variable DONE is not initialized, hence, may be returned without defined value (photon is reflected and not absorbed) - WIP: In routine PhotonIntersectionWithSide(), the variable IntersecPara can be exactly zero when the photon is travelling parallel to a side (which previously was detected as intersection side by a different algorithm). This leads to a division by zero. In branch feature.radtrans.ray.tracing such photons are marked "lost" and removed from further consideration. --- src/radiation/radiative_transfer/radtrans_main.f90 | 1 + src/radiation/radiative_transfer/radtrans_output.f90 | 2 +- src/radiation/radiative_transfer/tracking/radtrans_tools.f90 | 1 + src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 | 2 +- 4 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/radiation/radiative_transfer/radtrans_main.f90 b/src/radiation/radiative_transfer/radtrans_main.f90 index 677918689..156726528 100644 --- a/src/radiation/radiative_transfer/radtrans_main.f90 +++ b/src/radiation/radiative_transfer/radtrans_main.f90 @@ -153,6 +153,7 @@ SUBROUTINE RadTrans_main() photVisCount = 0 LocPhotNum = SUM(RadTransPhotPerCellLoc(:)) PhotDisp = INT(LocPhotNum/20) + PhotDisp = MAX(1,PhotDisp) DO iElem = 1, nComputeNodeElems IF (RadTransPhotPerCellLoc(iElem).GT.0) THEN IF (RadiationDirectionModel.EQ.2) RandRot = RandomRotMatrix() diff --git a/src/radiation/radiative_transfer/radtrans_output.f90 b/src/radiation/radiative_transfer/radtrans_output.f90 index bc76e0f06..280322126 100644 --- a/src/radiation/radiative_transfer/radtrans_output.f90 +++ b/src/radiation/radiative_transfer/radtrans_output.f90 @@ -612,7 +612,7 @@ SUBROUTINE WriteSurfSampleToHDF5() nValGlobal =(/nVar2D , 1_IK, 1_IK , nGlobalSides/) , & nVal =(/nVar2D , 1_IK, 1_IK , LocalnBCSides/) , & offset =(/0_IK, 0_IK , 0_IK , offsetSurfSide/), & - collective =.TRUE. ,& + collective =.FALSE. ,& RealArray=helpArray(1:nVar2D,1:LocalnBCSides)) DEALLOCATE(helpArray) END ASSOCIATE diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tools.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tools.f90 index 2edcea1d1..bff824b6a 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tools.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tools.f90 @@ -1018,6 +1018,7 @@ SUBROUTINE CalcWallAbsoprtion(GlobSideID, DONE) !--------------------------------------------------------------------------------------------------! SurfSideID = GlobalSide2SurfSide(SURF_SIDEID,GlobSideID) CALL RANDOM_NUMBER(iRan) + DONE = .FALSE. IF (PartBound%PhotonEnACC(PartBound%MapToPartBC(SideInfo_Shared(SIDE_BCID,GlobSideID))).GT.iRan) THEN DONE = .TRUE. PhotonSampWall(1,SurfSideID) = PhotonSampWall(1,SurfSideID) + 1. diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 index b87d0f986..3cb76881a 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 @@ -189,7 +189,7 @@ SUBROUTINE PhotonTriaTracking() oldElemIsMortar = .TRUE. END IF ELSE ! Regular side - CALL PhotonIntersectionWithSide(LocSidesTemp(ind2),NbElemID,TriNumTemp(ind2), IntersectionPosTemp) + CALL PhotonIntersectionWithSide(LocSidesTemp(ind2),ElemID,TriNumTemp(ind2), IntersectionPosTemp) intersecDistVec(1:3) = IntersectionPosTemp(1:3) - PhotonProps%PhotonLastPos(1:3) intersecDist = DOT_PRODUCT(intersecDistVec, intersecDistVec) IF (intersecDist.LT.minRatio) THEN From 178c4bf890d40f7c5ce59c8faa007e1a82a6d53d Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Sat, 27 May 2023 18:37:23 +0200 Subject: [PATCH 088/495] Added flag to sample surface photons independent of their absorption/reflection outcome with RayTracing-ForceAbsorption=T (default=T) --- .../tracking/radtrans_tracking.f90 | 3 ++- .../tracking/radtrans_tracking_tools.f90 | 27 ++++++++++++++++--- src/radiation/ray_tracing/raytrace_ini.f90 | 8 +++--- src/radiation/ray_tracing/raytrace_vars.f90 | 1 + 4 files changed, 31 insertions(+), 8 deletions(-) diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 index c670caa2c..c68be41ae 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 @@ -61,6 +61,7 @@ SUBROUTINE PhotonTriaTracking() USE MOD_part_tools ,ONLY: StoreLostPhotonProperties USE MOD_Particle_Tracking_Vars ,ONLY: NbrOfLostParticles,DisplayLostParticles USE MOD_RadiationTrans_Vars ,ONLY: RadiationAbsorptionModel +USE MOD_RayTracing_Vars ,ONLY: RayForceAbsorption IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES @@ -343,7 +344,7 @@ SUBROUTINE PhotonTriaTracking() IF(RadiationAbsorptionModel.EQ.0)THEN CALL CalcAbsoprtion(IntersectionPos(1:3), ElemID, DONE, before = .TRUE.) IF (.NOT.DONE) THEN - CALL CalcWallAbsoprtion(SideID, DONE) + CALL CalcWallAbsoprtion(SideID, DONE, RayForceAbsorption) CALL CalcAbsoprtion(IntersectionPos(1:3), ElemID, DONE, before = .FALSE.) END IF ! .NOT.DONE ELSE diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 index a81dede79..678b7d73b 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 @@ -1188,9 +1188,12 @@ END SUBROUTINE PeriodicPhotonBC !=================================================================================================================================== +!> Photon interactions with walls: +!> Compare random number with photon accommodation and absorb/reflect depending on the outcome !> +!> ForceWallSample (OPTIONAL): When true, the sampling is performed independent of the actual absorption/reflection outcome !=================================================================================================================================== -SUBROUTINE CalcWallAbsoprtion(GlobSideID, DONE) +SUBROUTINE CalcWallAbsoprtion(GlobSideID, DONE, ForceWallSample) USE MOD_Photon_TrackingVars ,ONLY: PhotonProps,PhotonSampWall USE MOD_Particle_Boundary_Vars ,ONLY: PartBound, GlobalSide2SurfSide USE MOD_Particle_Mesh_Vars ,ONLY: SideInfo_Shared @@ -1200,20 +1203,36 @@ SUBROUTINE CalcWallAbsoprtion(GlobSideID, DONE) ! argument list declaration INTEGER, INTENT(IN) :: GlobSideID LOGICAL, INTENT(OUT) :: DONE +LOGICAL, INTENT(IN), OPTIONAL :: ForceWallSample !> ! Local variable declaration !--------------------------------------------------------------------------------------------------! REAL :: iRan,PhotonEnACC INTEGER :: SurfSideID +LOGICAL :: ForceWallSampleLoc !--------------------------------------------------------------------------------------------------! +SurfSideID = GlobalSide2SurfSide(SURF_SIDEID,GlobSideID) +! Check if photon is to be added to PhotonSampWall independent of the actual absorption/reflection +IF(PRESENT(ForceWallSample))THEN + ForceWallSampleLoc = ForceWallSample + ! Sample impact + IF(ForceWallSampleLoc)THEN + PhotonSampWall(1,SurfSideID) = PhotonSampWall(1,SurfSideID) + 1. + PhotonSampWall(2,SurfSideID) = PhotonSampWall(2,SurfSideID) + PhotonProps%PhotonEnergy + END IF ! ForceWallSampleLoc +ELSE + ForceWallSampleLoc = .FALSE. +END IF ! PRESENT(ForceWallSample) DONE = .FALSE. ! initialize PhotonEnACC = PartBound%PhotonEnACC(PartBound%MapToPartBC(SideInfo_Shared(SIDE_BCID,GlobSideID))) IF(PhotonEnACC.LE.0.0) RETURN ! Skip sides without absorption (pure reflection) -SurfSideID = GlobalSide2SurfSide(SURF_SIDEID,GlobSideID) CALL RANDOM_NUMBER(iRan) IF (PhotonEnACC.GT.iRan) THEN DONE = .TRUE. - PhotonSampWall(1,SurfSideID) = PhotonSampWall(1,SurfSideID) + 1. - PhotonSampWall(2,SurfSideID) = PhotonSampWall(2,SurfSideID) + PhotonProps%PhotonEnergy + ! Do not sample twice + IF(.NOT.ForceWallSampleLoc)THEN + PhotonSampWall(1,SurfSideID) = PhotonSampWall(1,SurfSideID) + 1. + PhotonSampWall(2,SurfSideID) = PhotonSampWall(2,SurfSideID) + PhotonProps%PhotonEnergy + END IF ! .NOT.ForceWallSampleLoc END IF END SUBROUTINE CalcWallAbsoprtion diff --git a/src/radiation/ray_tracing/raytrace_ini.f90 b/src/radiation/ray_tracing/raytrace_ini.f90 index e9a63946f..7d1188a22 100644 --- a/src/radiation/ray_tracing/raytrace_ini.f90 +++ b/src/radiation/ray_tracing/raytrace_ini.f90 @@ -48,6 +48,7 @@ SUBROUTINE DefineParametersRayTracing() CALL prms%CreateRealOption( 'RayTracing-WaveLength' , 'Beam wavelength [m]' ) CALL prms%CreateRealOption( 'RayTracing-RepetitionRate' , 'Pulse repetition rate (pulses per second) [Hz]' ) CALL prms%CreateRealOption( 'RayTracing-Power' , 'Average pulse power (energy of a single pulse times repetition rate) [W]' ) +CALL prms%CreateLogicalOption( 'RayTracing-ForceAbsorption', 'Surface photon sampling is performed independent of the actual absorption/reflection outcome (default=T)', '.TRUE.') END SUBROUTINE DefineParametersRayTracing @@ -96,9 +97,10 @@ SUBROUTINE InitRayTracing() Ray%Direction = GETREALARRAY('RayTracing-RayDirection',3) Ray%Direction = UNITVECTOR(Ray%Direction) -AdaptiveRays = GETLOGICAL('RayTracing-AdaptiveRays') -NumRays = GETINT('RayTracing-NumRays') -RayPosModel = GETINT('RayTracing-RayPosModel') +AdaptiveRays = GETLOGICAL('RayTracing-AdaptiveRays') +NumRays = GETINT('RayTracing-NumRays') +RayPosModel = GETINT('RayTracing-RayPosModel') +RayForceAbsorption = GETLOGICAL('RayTracing-ForceAbsorption') ASSOCIATE( & E0 => Ray%Energy ,& diff --git a/src/radiation/ray_tracing/raytrace_vars.f90 b/src/radiation/ray_tracing/raytrace_vars.f90 index 82617528e..b275831ef 100644 --- a/src/radiation/ray_tracing/raytrace_vars.f90 +++ b/src/radiation/ray_tracing/raytrace_vars.f90 @@ -52,6 +52,7 @@ MODULE MOD_RayTracing_Vars TYPE (tRadTrans) :: RadTrans !> LOGICAL :: AdaptiveRays !> +LOGICAL :: RayForceAbsorption !> Surface photon sampling is performed independent of the actual absorption/reflection outcome (default=T) INTEGER :: NumRays !> INTEGER :: RayPosModel !> INTEGER :: RayPartBound !> Particle boundary ID where rays are emitted from From 32218432642ea9574a24488fcaee98ded396904c Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Sat, 27 May 2023 20:07:10 +0200 Subject: [PATCH 089/495] Added timer to BuildNodeNeighbourhood() with "Building node neighbourhood ..." --- src/mesh/mesh.f90 | 2 +- src/particles/particle_mesh/particle_mesh.f90 | 2 +- .../particle_mesh/particle_mesh_build.f90 | 15 +++++++++++---- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/mesh/mesh.f90 b/src/mesh/mesh.f90 index ce7a24ba4..a671372d8 100644 --- a/src/mesh/mesh.f90 +++ b/src/mesh/mesh.f90 @@ -364,7 +364,7 @@ SUBROUTINE InitMesh(meshMode,MeshFile_IN) #ifndef PARTICLES ! dealloacte pointers - LBWRITE(UNIT_stdOut,'(A)') "NOW CALLING deleteMeshPointer..." + LBWRITE(UNIT_stdOut,'(A)') "InitMesh: NOW CALLING deleteMeshPointer..." CALL deleteMeshPointer() #endif diff --git a/src/particles/particle_mesh/particle_mesh.f90 b/src/particles/particle_mesh/particle_mesh.f90 index 3bd2bf766..421f6dab9 100644 --- a/src/particles/particle_mesh/particle_mesh.f90 +++ b/src/particles/particle_mesh/particle_mesh.f90 @@ -512,7 +512,7 @@ SUBROUTINE InitParticleMesh() ParticleMeshInitIsDone=.TRUE. -LBWRITE(UNIT_stdOut,'(A)') " NOW CALLING deleteMeshPointer..." +LBWRITE(UNIT_stdOut,'(A)') " InitParticleMesh: NOW CALLING deleteMeshPointer..." CALL deleteMeshPointer() DEALLOCATE(NodeCoords) diff --git a/src/particles/particle_mesh/particle_mesh_build.f90 b/src/particles/particle_mesh/particle_mesh_build.f90 index 4601451b3..be8077d13 100644 --- a/src/particles/particle_mesh/particle_mesh_build.f90 +++ b/src/particles/particle_mesh/particle_mesh_build.f90 @@ -1039,7 +1039,7 @@ SUBROUTINE BuildNodeNeighbourhood() !----------------------------------------------------------------------------------------------------------------------------------! ! MODULES ! !----------------------------------------------------------------------------------------------------------------------------------! -USE MOD_Globals ,ONLY: abort!,myRank +USE MOD_Globals ,ONLY: abort,MPIRoot,UNIT_stdOUt,DisplayMessageAndTime!,myRank USE MOD_Particle_Mesh_Vars ,ONLY: nUniqueGlobalNodes USE MOD_Particle_Mesh_Vars ,ONLY: ElemNodeID_Shared,NodeInfo_Shared USE MOD_Particle_Mesh_Vars ,ONLY: NodeToElemMapping,NodeToElemInfo,ElemToElemMapping,ElemToElemInfo @@ -1056,6 +1056,9 @@ SUBROUTINE BuildNodeNeighbourhood() #else USE MOD_Mesh_Vars ,ONLY: nElems #endif /*USE_MPI*/ +#if USE_LOADBALANCE +USE MOD_LoadBalance_Vars ,ONLY: PerformLoadBalance,UseH5IOLoadBalance +#endif /*USE_LOADBALANCE*/ !----------------------------------------------------------------------------------------------------------------------------------! IMPLICIT NONE ! INPUT / OUTPUT VARIABLES @@ -1069,7 +1072,10 @@ SUBROUTINE BuildNodeNeighbourhood() #if USE_MPI INTEGER :: sendbuf,recvbuf,iError #endif /*USE_MPI*/ +REAL :: StartT,EndT !=================================================================================================================================== +LBWRITE(UNIT_StdOut,'(A)',ADVANCE='NO') ' Building node neighbourhood ...' +GETTIME(StartT) ! 1.1 Get number of CN elements attached to each UNIQUE node and store in NbrOfElemsOnUniqueNode(UniqueNodeID) ! 1.2 Store the total number of counted elements in nNodeToElemMapping = SUM(NbrOfElemsOnUniqueNode) @@ -1285,9 +1291,7 @@ SUBROUTINE BuildNodeNeighbourhood() CountElems = CountElems + 1 OffsetElemToElemCounter = OffsetElemToElemCounter + 1 - IF(CountElems.GT.500) CALL abort(& - __STAMP__& - ,'CountElems > 500. Inrease the number and try again!') + IF(CountElems.GT.500) CALL abort(__STAMP__,'CountElems > 500. Inrease the number and try again!') CheckedElemIDs(CountElems) = TestElemID ElemToElemInfo(OffsetElemToElemCounter) = TestElemID @@ -1302,6 +1306,9 @@ SUBROUTINE BuildNodeNeighbourhood() CALL BARRIER_AND_SYNC(ElemToElemMapping_Shared_Win,MPI_COMM_SHARED) #endif /*USE_MPI*/ +GETTIME(EndT) +CALL DisplayMessageAndTime(EndT-StartT, 'DONE!') + END SUBROUTINE BuildNodeNeighbourhood From 5d4ac09c74019cad84d33c6af041599e20fda7e7 Mon Sep 17 00:00:00 2001 From: Julian Beyer Date: Tue, 30 May 2023 14:36:13 +0200 Subject: [PATCH 090/495] fix default values readin --- src/radiation/radiative_transfer/radtrans_init.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/radiation/radiative_transfer/radtrans_init.f90 b/src/radiation/radiative_transfer/radtrans_init.f90 index 378d49879..9c32cf257 100644 --- a/src/radiation/radiative_transfer/radtrans_init.f90 +++ b/src/radiation/radiative_transfer/radtrans_init.f90 @@ -51,10 +51,10 @@ SUBROUTINE DefineParametersRadiationTrans() CALL prms%CreateIntOption( 'Radiation-AbsorptionModel', 'HM','1') CALL prms%CreateIntOption( 'Radiation-PhotonPosModel', 'HM','1') CALL prms%CreateIntOption( 'Radiation-PhotonWaveLengthModel', 'HM','1') -CALL prms%CreateRealArrayOption('Radiation-ObservationMidPoint', 'HM') +CALL prms%CreateRealArrayOption('Radiation-ObservationMidPoint', 'HM', '0.,0.,0.') CALL prms%CreateRealArrayOption('Radiation-ObservationSlitFunction', 'Slit function for convolution, trapezoid, 1:topwidth[A] 2:basewidth[A]', '0.,0.') CALL prms%CreateRealOption('Radiation-ObservationDiameter', 'HM') -CALL prms%CreateRealArrayOption('Radiation-ObservationViewDirection', 'HM') +CALL prms%CreateRealArrayOption('Radiation-ObservationViewDirection', 'HM', '0.,0.,0.') CALL prms%CreateRealOption('Radiation-ObservationAngularAperture', 'HM') CALL prms%CreateLogicalOption('Radiation-ObservationCalcFullSpectra','.FALSE.') CALL prms%CreateLogicalOption('Radiation-ObservationDoConvolution','Consider instrumental broadening?','.FALSE.') From 799face4c54cac0b4572b4a6a459a9faa91acea5 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Tue, 13 Jun 2023 10:38:32 +0200 Subject: [PATCH 091/495] Updated readme for ray tracing SEE reggie --- .../surface_emission_rectangle_ray_trace/readme.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/readme.md diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/readme.md b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/readme.md new file mode 100644 index 000000000..9c5f0253e --- /dev/null +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/readme.md @@ -0,0 +1,7 @@ +# Photoionization: Surface Emission via SEE ++ Ray tracing model from which surface emission is calculated +* Particle emission due to secondary electron emission from a surface +* No deposition, no interpolation +* Comparison of the number of emitted electrons with the reference solution +* Different MPF and number of MPI ranks are tested to yield the same result +* Note: Because the volume is exactly 1 cubic metre, the calculated electron density is exactly the number of real electrons in the system From 9b5e2541f11a4879cc035f9647c43cdf753be5f5 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Fri, 16 Jun 2023 10:14:10 +0200 Subject: [PATCH 092/495] high-order ray tracing with p-adaption that currently only considers intersections with element faces. --- .../DSMC.ini | 52 ++++ .../analyze.ini | 21 ++ .../command_line.ini | 2 + .../hopr.ini | 58 +++++ .../parameter.ini | 188 +++++++++++++++ .../readme.md | 7 + src/particles/particle_init.f90 | 6 +- src/particles/particle_mesh/particle_mesh.f90 | 2 +- .../tracking/radtrans_tracking_output.f90 | 47 +++- .../tracking/radtrans_tracking_tools.f90 | 87 ++++++- src/radiation/ray_tracing/raytrace_ini.f90 | 225 +++++++++++++++++- src/radiation/ray_tracing/raytrace_vars.f90 | 116 ++++++--- src/timedisc/timedisc.f90 | 6 +- 13 files changed, 766 insertions(+), 51 deletions(-) create mode 100644 regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/DSMC.ini create mode 100644 regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/analyze.ini create mode 100644 regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/command_line.ini create mode 100644 regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/hopr.ini create mode 100644 regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini create mode 100644 regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/readme.md diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/DSMC.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/DSMC.ini new file mode 100644 index 000000000..75c0cfeaf --- /dev/null +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/DSMC.ini @@ -0,0 +1,52 @@ + +! =============================================================================== ! +! Species1, H2 +! =============================================================================== ! +Part-Species1-SpeciesName = H2 +Part-Species1-InteractionID = 2 +Part-Species1-Tref = 1000 +Part-Species1-dref = 2.68E-10 +Part-Species1-omega = 0.407 +Part-Species1-HeatOfFormation_K = 0.0 +Part-Species1-CharaTempVib = 6332.37 +Part-Species1-Ediss_eV = 4.47 +! =============================================================================== ! +! Species2, H +! =============================================================================== ! +Part-Species2-SpeciesName = H +Part-Species2-InteractionID = 1 +Part-Species2-Tref = 1000 +Part-Species2-dref = 2.581E-10 +Part-Species2-omega = 0.407 +Part-Species2-HeatOfFormation_K = 26159.76 +! =============================================================================== ! +! Species3, e +! =============================================================================== ! +Part-Species3-SpeciesName = electron +Part-Species3-InteractionID = 4 +Part-Species3-Tref = 1000 +Part-Species3-dref = 2.817920E-15 +Part-Species3-omega = 0.407 +! =============================================================================== ! +! Species4, H2Ion +! =============================================================================== ! +Part-Species4-SpeciesName = H2Ion1 +Part-Species4-InteractionID = 20 +Part-Species4-Tref = 1000 +Part-Species4-dref = 3.883E-10 +Part-Species4-omega = 0.407 +Part-Species4-CharaTempVib = 3341.01 +Part-Species4-Ediss_eV = 2.65 +Part-Species4-PreviousState = 1 +! =============================================================================== ! +! Species5, HIon +! =============================================================================== ! +Part-Species5-SpeciesName = HIon1 +Part-Species5-InteractionID = 10 +Part-Species5-Tref = 1000 +Part-Species5-dref = 3.912E-10 +Part-Species5-omega = 0.407 +Part-Species5-PreviousState = 2 + + + diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/analyze.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/analyze.ini new file mode 100644 index 000000000..11234d391 --- /dev/null +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/analyze.ini @@ -0,0 +1,21 @@ +! compare column +!compare_column_file = PartAnalyze.csv ! data file name +!compare_column_reference_file = Electrons_ref.csv ! data file name +!compare_column_index = 9 ! column index for comparison +!compare_column_tolerance_value = 1e9 ! tolerance (depends on machine accuracy and MPI) +!compare_column_tolerance_type = absolute ! absolute or relative tolerance + +! integrate columns x:y in a data file as integral(y(x), x, x(1), x(end)) +!integrate_line_file = SurfaceAnalyze.csv ! data file name +!integrate_line_columns = 0:1 ! columns x:y [time:nPart_in] +!integrate_line_integral_value = 0.0 ! X +!integrate_line_tolerance_value = 1.0e-7 ! tolerance +!integrate_line_tolerance_type = absolute ! special option + +! hdf5 diff +h5diff_file = photoionization_RadiationSurfState.h5 , photoionization_RadiationVolState.h5 +h5diff_reference_file = reference_RadiationSurfState.h5 , reference_RadiationVolState.h5 +h5diff_data_set = SurfaceData , ElemData +h5diff_tolerance_value = 10E-2 , 10E-1 +h5diff_tolerance_type = relative , relative +!h5diff_max_differences = 5 diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/command_line.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/command_line.ini new file mode 100644 index 000000000..6f94bea14 --- /dev/null +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/command_line.ini @@ -0,0 +1,2 @@ +MPI = 1,2,5,8,11,25 +cmd_suffix = DSMC.ini diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/hopr.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/hopr.ini new file mode 100644 index 000000000..c289054a5 --- /dev/null +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/hopr.ini @@ -0,0 +1,58 @@ +!=============================================================================== ! +! OUTPUT +!=============================================================================== ! +ProjectName = box ! name of the project (used for filenames) +Debugvisu = T ! Write debug mesh to file +Logging = F ! Write log files + +!=============================================================================== ! +! MESH +!=============================================================================== ! +Mode =1 ! 1 Cartesian 2 gambit file 3 CGNS +nZones =1 ! number of zones +Corner =(/0.,0.,0.,,1.0,0.,0.,,1.0,1.0,0.,,0.,1.0,0.,,0.,0.,1.0,,1.0,0.,1.0,,1.0,1.0,1.0,,0.,1.0,1.0/) +nElems =(/5,5,5/) ! number of elements in each direction (30x30x30) +BCIndex =(/5,3,2,4,1,6/) ! Indices of UserDefinedBoundaries +elemtype =108 ! Elementform (108: Hexaeder) +useCurveds =F ! T if curved boundaries defined +SpaceQuandt =1. ! characteristic length of the mesh +ConformConnect=T + +!=============================================================================== ! +! NON-PERIODIC BOUNDARY CONDITIONS +!=============================================================================== ! +nUserDefinedBoundaries=6 +BoundaryName=BC_periodicx- ! Periodic (+vv1) +BoundaryType=(/4,0,0,0/) ! Periodic (+vv1) +BoundaryName=BC_periodicx+ ! Periodic (-vv1) +BoundaryType=(/4,0,0,0/) ! Periodic (-vv1) +BoundaryName=BC_periodicy- ! Periodic (+vv2) +BoundaryType=(/4,0,0,0/) ! Periodic (+vv2) +BoundaryName=BC_periodicy+ ! Periodic (-vv2) +BoundaryType=(/4,0,0,0/) ! Periodic (-vv2) +BoundaryName=BC_WALL +BoundaryType=(/4,0,0,0/) +BoundaryName=BC_TOP +BoundaryType=(/4,0,0,0/) + + +! !=============================================================================== ! +! ! PERIODIC BOUNDARY CONDITIONS +! !=============================================================================== ! +! nUserDefinedBoundaries=6 +! BoundaryName=BC_periodicx- ! Periodic (+vv1) +! BoundaryType=(/1,0,0,1/) ! Periodic (+vv1) +! BoundaryName=BC_periodicx+ ! Periodic (-vv1) +! BoundaryType=(/1,0,0,-1/) ! Periodic (-vv1) +! BoundaryName=BC_periodicy- ! Periodic (+vv2) +! BoundaryType=(/1,0,0,2/) ! Periodic (+vv2) +! BoundaryName=BC_periodicy+ ! Periodic (-vv2) +! BoundaryType=(/1,0,0,-2/) ! Periodic (-vv2) +! BoundaryName=BC_WALL +! BoundaryType=(/4,0,0,0/) +! BoundaryName=BC_TOP +! BoundaryType=(/4,0,0,0/) +! +! nVV=2 +! VV=(/1.0 , 0. , 0./) +! VV=(/0. , 1.0 , 0./) diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini new file mode 100644 index 000000000..41e862e7a --- /dev/null +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini @@ -0,0 +1,188 @@ +! =============================================================================== ! +! POSTI +! =============================================================================== ! +VisuParticles = T +NVisu = 3 +TimeStampLength = 21 +! =============================================================================== ! +! VARIABLES +! =============================================================================== ! +CFLscale = 0.2 +IniExactFunc = 0 +N = 2 + +DoLoadBalance = T +Load-DeviationThreshold = 0.15 +LoadBalanceMaxSteps = 20 +DoInitialAutoRestart = T +! =============================================================================== ! +! MESH +! =============================================================================== ! +MeshFile = box_mesh.h5 +Logging = F +WriteErrorFiles = F +useCurveds = F +! if boundaries have to be changed (else they are used from Mesh directly): +TrackingMethod = triatracking +! =============================================================================== ! +! OUTPUT / VISUALIZATION +! =============================================================================== ! +ProjectName = photoionization +IterDisplayStep = 10 +Part-AnalyzeStep = 1 + +CalcNumSpec = T +CalcNumDens = T + +CalcElectronSEE = T + +!Surf-CalcCollCounter = T ! To Activate output of SurfaceAnalyze.csv +!CheckExchangeProcs = T ! deactivate the asymmetric communicator check +! =============================================================================== ! +! CALCULATION +! =============================================================================== ! +ManualTimeStep = 5.0E-9 +tend = 5.0E-9 +Analyze_dt = 5.0E-9 + +PIC-DoDeposition = F + +!PIC-DoInterpolation = F +Part-LorentzType = 0 + +epsCG = 1e-2 + +! Change boundary conditions from definition in hopr.ini +!BoundaryName = WALL +!BoundaryType = (/5,0/) +! =============================================================================== ! +! DSMC +! =============================================================================== ! +UseDSMC = T +Particles-DSMC-CollisMode = 0 +Part-NumberOfRandomSeeds = 2 +Particles-RandomSeed1 = 1 +Particles-RandomSeed2 = 2 +Particles-HaloEpsVelo = 3E8 ! 3e7 is enough for single-node run, but multi-node requires 3e8 + +Particles-DSMC-ElectronicModel = 1 +Particles-DSMCElectronicDatabase = Electronic-State-Database.h5 +EpsMergeElectronicState = 1E-2 +Part-Species$-ElecRelaxProb = 1. +! =============================================================================== ! +! PARTICLES +! =============================================================================== ! +Part-nSpecies = 5 +Part-maxParticleNumber = 4000000 +Part-nBounds = 6 + +Part-Boundary1-SourceName = BC_periodicx- +!Part-Boundary1-Condition = periodic +!Part-Boundary1-Condition = open +Part-Boundary1-Condition = reflective +Part-Boundary1-PhotonEnACC = 1.0 + +Part-Boundary2-SourceName = BC_periodicx+ +!Part-Boundary2-Condition = periodic +!Part-Boundary2-Condition = open +Part-Boundary2-Condition = reflective +Part-Boundary2-PhotonEnACC = 1.0 + +Part-Boundary3-SourceName = BC_periodicy- +!Part-Boundary3-Condition = periodic +!Part-Boundary3-Condition = open +Part-Boundary3-Condition = reflective +Part-Boundary3-PhotonEnACC = 1.0 + +Part-Boundary4-SourceName = BC_periodicy+ +!Part-Boundary4-Condition = periodic +!Part-Boundary4-Condition = open +Part-Boundary4-Condition = reflective +Part-Boundary4-PhotonEnACC = 1.0 + +Part-Boundary5-SourceName = BC_WALL +!Part-Boundary5-Condition = open +Part-Boundary5-Condition = reflective +Part-Boundary5-BoundaryParticleOutput = T +Part-Boundary5-PhotonEnACC = 1.0 +Part-Boundary5-PhotonSpecularReflection = F ! F: diffuse with PhotonEnACC, T: perfect mirror + +Part-Boundary6-SourceName = BC_TOP +Part-Boundary6-Condition = reflective +Part-Boundary6-PhotonEnACC = 1.0 +!Part-Boundary6-BoundaryParticleOutput = T + +!Part-nPeriodicVectors = 2 +!Part-FIBGMdeltas = (/ 1.0 , 1.0 , 1.0 /) +!Part-FactorFIBGM = (/ 5 , 5 , 5 /) + +! =============================================================================== ! +! Ray Tracing +! =============================================================================== ! +PIC-DoInterpolation = T ! activate ElemCurved, XiEtaZetaBasis and slenXiEtaZetaBasis (requires XCL_NGeo_Shared) +RayTracing-RayPosModel = 1 +Particles-DSMC-CalcSurfaceVal = T ! activate InitParticleBoundarySampling +RayTracing-PartBound = 6 ! -> iBC=6 +RayTracing-NumRays = 200000 +PhotonModeBPO = 1 + +RayTracing-PulseDuration = 15e-9 +RayTracing-WaveLength = 10e-9 +RayTracing-Power = 1.0 +RayTracing-RepetitionRate = 1000 +RayTracing-RayDirection = (/ 0. , 1.0 , -1.0 /) + +! SEE parameters +RayTracing-WorkFunctionSEE = 10.0 +RayTracing-YieldSEE = 0.1 +! =============================================================================== ! +! Weighting Factor +! =============================================================================== ! +Part-Species$-MacroParticleFactor = 1e4 + +! Change MPF of SEE particles +Part-vMPF = T +Part-Species3-Init1-MacroParticleFactor = 1e7!,1e8,1e9 + +! =============================================================================== ! +! Species1 | H2 +! =============================================================================== ! +Part-Species1-MassIC = 3.348E-27 +Part-Species1-ChargeIC = 0.0 + +Part-Species1-nInits = 1 + +Part-Species1-Init1-velocityDistribution = maxwell_lpn +Part-Species1-Init1-SpaceIC = background +Part-Species1-Init1-VeloIC = 0. +Part-Species1-Init1-PartDensity = 10.0e20 +Part-Species1-Init1-VeloVecIC = (/0.,1.,0./) +Part-Species1-Init1-MWTemperatureIC = 300. +Part-Species1-Init1-TempVib = 300. +Part-Species1-Init1-TempRot = 300. +Part-Species1-Init1-TempElec = 300. +! =============================================================================== ! +! Species2 | H +! =============================================================================== ! +Part-Species2-MassIC = 1.674E-27 +Part-Species2-ChargeIC = 0.0 +Part-Species2-TempElec = 300. +! =============================================================================== ! +! Species3 | e +! =============================================================================== ! +Part-Species3-MassIC = 9.11E-31 +Part-Species3-ChargeIC = -1.60217653E-19 +! =============================================================================== ! +! Species4 | H2Ion +! =============================================================================== ! +Part-Species4-MassIC = 3.3470890E-27 +Part-Species4-ChargeIC = 1.60217653E-19 +!Part-Species4-TempVib = 300. +!Part-Species4-TempRot = 300. +!Part-Species4-TempElec = 300. +! =============================================================================== ! +! Species5 | HIon +! =============================================================================== ! +Part-Species5-MassIC = 1.673089E-27 +Part-Species5-ChargeIC = 1.60217653E-19 +!Part-Species5-TempElec = 300. diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/readme.md b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/readme.md new file mode 100644 index 000000000..9c5f0253e --- /dev/null +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/readme.md @@ -0,0 +1,7 @@ +# Photoionization: Surface Emission via SEE ++ Ray tracing model from which surface emission is calculated +* Particle emission due to secondary electron emission from a surface +* No deposition, no interpolation +* Comparison of the number of emitted electrons with the reference solution +* Different MPF and number of MPI ranks are tested to yield the same result +* Note: Because the volume is exactly 1 cubic metre, the calculated electron density is exactly the number of real electrons in the system diff --git a/src/particles/particle_init.f90 b/src/particles/particle_init.f90 index 125d5be9d..6c3ebba83 100644 --- a/src/particles/particle_init.f90 +++ b/src/particles/particle_init.f90 @@ -278,7 +278,7 @@ SUBROUTINE InitParticles() USE MOD_DSMC_BGGas ,ONLY: BGGas_InitRegions #if USE_MPI USE MOD_Particle_MPI ,ONLY: InitParticleCommSize -!USE MOD_Particle_MPI_Emission ,ONLY: InitEmissionParticlesToProcs +!USE MOD_Particle_MPI_Emission ,ONLY: InitEmissionParticlesToProcs ! USE MOD_Particle_MPI_Emission ,ONLY: InitEmissionParticlesToProcs #endif #if (PP_TimeDiscMethod==300) USE MOD_FPFlow_Init ,ONLY: InitFPFlow @@ -293,6 +293,7 @@ SUBROUTINE InitParticles() USE MOD_LoadBalance_Vars ,ONLY: PerformLoadBalance #endif /*USE_LOADBALANCE*/ USE MOD_RayTracing_Init ,ONLY: InitRayTracing +USE MOD_Mesh_Vars ,ONLY: NodeCoords ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -362,6 +363,9 @@ SUBROUTINE InitParticles() ! Ray tracing CALL InitRayTracing() +! Was deallocated in InitParticleMesh previously +DEALLOCATE(NodeCoords) + IF (useDSMC) THEN CALL InitDSMC() CALL InitMCC() diff --git a/src/particles/particle_mesh/particle_mesh.f90 b/src/particles/particle_mesh/particle_mesh.f90 index 421f6dab9..f19f0d8bb 100644 --- a/src/particles/particle_mesh/particle_mesh.f90 +++ b/src/particles/particle_mesh/particle_mesh.f90 @@ -514,7 +514,7 @@ SUBROUTINE InitParticleMesh() LBWRITE(UNIT_stdOut,'(A)') " InitParticleMesh: NOW CALLING deleteMeshPointer..." CALL deleteMeshPointer() -DEALLOCATE(NodeCoords) +!DEALLOCATE(NodeCoords) LBWRITE(UNIT_stdOut,'(A)')' INIT PARTICLE MESH DONE!' LBWRITE(UNIT_StdOut,'(132("-"))') diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 index 6001a8d1d..11a79d4eb 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 @@ -40,6 +40,8 @@ SUBROUTINE WritePhotonVolSampleToHDF5() USE MOD_PreProc USE MOD_Mesh_Vars ,ONLY: nElems,MeshFile,offSetElem USE MOD_Globals_Vars ,ONLY: ProjectName +USE MOD_RayTracing_Vars ,ONLY: Ray,nVarRay,U_N_Ray,N_DG_Ray,PREF_VDM_Ray +USE MOD_HDF5_output ,ONLY: GatheredWriteArray #if USE_MPI USE MOD_RayTracing_Vars ,ONLY: RayElemPassedEnergy_Shared #else @@ -48,7 +50,8 @@ SUBROUTINE WritePhotonVolSampleToHDF5() USE MOD_io_HDF5 USE MOD_HDF5_output ,ONLY: GenerateFileSkeleton USE MOD_HDF5_Output_ElemData ,ONLY: WriteAdditionalElemData -!USE MOD_IO_HDF5 ,ONLY: AddToElemData,ElementOut +USE MOD_Mesh_Vars ,ONLY: offsetElem,nGlobalElems +USE MOD_ChangeBasis ,ONLY: ChangeBasis3D ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -59,11 +62,12 @@ SUBROUTINE WritePhotonVolSampleToHDF5() ! LOCAL VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- CHARACTER(LEN=255) :: FileName -INTEGER :: iElem -INTEGER,PARAMETER :: nVar=1 +INTEGER :: iElem,Nloc +INTEGER,PARAMETER :: nVar=2 REAL, ALLOCATABLE :: RayElemPassedEnergyLoc1st(:),RayElemPassedEnergyLoc2nd(:) REAL, ALLOCATABLE :: RaySecondaryVectorX(:),RaySecondaryVectorY(:),RaySecondaryVectorZ(:) CHARACTER(LEN=255), ALLOCATABLE :: StrVarNames(:) +REAL :: U(nVarRay,0:Ray%NMax,0:Ray%NMax,0:Ray%NMax,PP_nElems) !=================================================================================================================================== SWRITE(UNIT_stdOut,'(a)',ADVANCE='NO') ' WRITE Radiation TO HDF5 FILE...' @@ -83,8 +87,11 @@ SUBROUTINE WritePhotonVolSampleToHDF5() CALL AddToElemData(ElementOut,'RaySecondaryVectorY',RealArray=RaySecondaryVectorY) CALL AddToElemData(ElementOut,'RaySecondaryVectorZ',RealArray=RaySecondaryVectorZ) +CALL AddToElemData(ElementOut,'Nloc',IntArray=N_DG_Ray) + ALLOCATE(StrVarNames(1:nVar)) -StrVarNames(1)='dummy' +StrVarNames(1)='RayElemPassedEnergy1st' +StrVarNames(2)='RayElemPassedEnergy2nd' ! Generate skeleton for the file with all relevant data on a single proc (MPIRoot) FileName=TRIM(ProjectName)//'_RadiationVolState.h5' @@ -100,6 +107,8 @@ SUBROUTINE WritePhotonVolSampleToHDF5() ASSOCIATE( RayElemPassedEnergy => RayElemPassedEnergy_Shared ) #endif /*USE_MPI*/ DO iElem=1,PP_nElems + + ! 1. Elem-constant data ! Primary energy RayElemPassedEnergyLoc1st(iElem) = RayElemPassedEnergy(1,iElem+offSetElem) ! Secondary energy @@ -116,7 +125,33 @@ SUBROUTINE WritePhotonVolSampleToHDF5() RaySecondaryVectorY(iElem) = 0. RaySecondaryVectorZ(iElem) = 0. END IF ! RayElemPassedEnergyLoc2nd(iElem).GT.0 + + ! 2. Variable polynomial degree data + Nloc = N_DG_Ray(iElem) + !U_N_Ray(iElem)%U(1:1,:,:,:) = RayElemPassedEnergy(1,iElem+offSetElem) + !U_N_Ray(iElem)%U(2:2,:,:,:) = RayElemPassedEnergy(2,iElem+offSetElem) + IF(Nloc.Eq.Ray%Nmax)THEN + U(:,:,:,:,iElem) = U_N_Ray(iElem)%U(:,:,:,:) + ELSE + CALL ChangeBasis3D(nVarRay, Nloc, Ray%NMax, PREF_VDM_Ray(Nloc,Ray%NMax)%Vdm, U_N_Ray(iElem)%U(:,:,:,:), U(:,:,:,:,iElem)) + END IF ! Nloc.Eq.Nmax + END DO + + ! Associate construct for integer KIND=8 possibility + ASSOCIATE (& + nVarRay => INT(nVarRay,IK) ,& + NMax => INT(Ray%NMax,IK) ,& + nGlobalElems => INT(nGlobalElems,IK) ,& + PP_nElems => INT(PP_nElems,IK) ,& + offsetElem => INT(offsetElem,IK) ) + CALL GatheredWriteArray(FileName,create=.FALSE.,& + DataSetName='DG_Solution', rank=5,& + nValGlobal=(/nVarRay , NMax+1_IK , NMax+1_IK , NMax+1_IK , nGlobalElems/) , & + nVal= (/nVarRay , NMax+1_IK , NMax+1_IK , NMax+1_IK , PP_nElems/) , & + offset= (/0_IK , 0_IK , 0_IK , 0_IK , offsetElem/) , & + collective=.TRUE.,RealArray=U) + END ASSOCIATE #if USE_MPI END ASSOCIATE #endif /*USE_MPI*/ @@ -138,7 +173,7 @@ SUBROUTINE WritePhotonSurfSampleToHDF5() USE MOD_Globals USE MOD_IO_HDF5 USE MOD_Globals_Vars, ONLY:ProjectName -USE MOD_Particle_Boundary_Vars, ONLY:nComputeNodeSurfOutputSides,noutputsides, nSurfTotalSides, nSurfBC +USE MOD_Particle_Boundary_Vars, ONLY:nComputeNodeSurfOutputSides,noutputsides, nSurfBC USE MOD_Particle_Boundary_Vars, ONLY:offsetComputeNodeSurfOutputSide, SurfBCName, nComputeNodeSurfSides USE MOD_Particle_Boundary_Vars, ONLY:SurfSide2GlobalSide, GlobalSide2SurfSide USE MOD_HDF5_Output, ONLY:WriteAttributeToHDF5,WriteArrayToHDF5,WriteHDF5Header @@ -147,7 +182,7 @@ SUBROUTINE WritePhotonSurfSampleToHDF5() USE MOD_MPI_Shared_Vars, ONLY:mySurfRank #if USE_MPI USE MOD_MPI_Shared_Vars, ONLY:MPI_COMM_LEADERS_SURF -USE MOD_Particle_Boundary_Vars, ONLY:SurfSideArea_Shared +USE MOD_Particle_Boundary_Vars, ONLY:SurfSideArea_Shared,nSurfTotalSides USE MOD_Photon_TrackingVars, ONLY:PhotonSampWall_Shared #else USE MOD_Photon_TrackingVars, ONLY:PhotonSampWall diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 index 678b7d73b..58e4bf03c 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 @@ -529,7 +529,7 @@ END SUBROUTINE RotatePhotonIn2DPlane !> !=================================================================================================================================== SUBROUTINE PhotonIntersectionWithSide(iLocSide,Element,TriNum, IntersectionPos, PhotonLost, IsMortar) -USE MOD_Globals ,ONLY: abort,UNIT_StdOut,myrank +USE MOD_Globals ,ONLY: abort,UNIT_StdOut USE MOD_Particle_Mesh_Vars ,ONLY: ElemSideNodeID_Shared, NodeCoords_Shared USE MOD_Photon_TrackingVars ,ONLY: PhotonProps USE MOD_Mesh_Tools ,ONLY: GetCNElemID @@ -644,16 +644,22 @@ END SUBROUTINE PhotonIntersectionWithSide !=================================================================================================================================== !> !=================================================================================================================================== -SUBROUTINE CalcAbsorptionRayTrace(GlobalElemID,PhotonDir) -USE MOD_RayTracing_Vars ,ONLY: RayElemPassedEnergy,Ray +SUBROUTINE CalcAbsorptionRayTrace(IntersectionPos,GlobalElemID,PhotonDir) +USE MOD_globals +USE MOD_RayTracing_Vars ,ONLY: RayElemPassedEnergy,Ray,U_N_Ray,N_DG_Ray,N_VolMesh_Ray USE MOD_Photon_TrackingVars ,ONLY: PhotonProps +USE MOD_Eval_xyz ,ONLY: GetPositionInRefElem +USE MOD_Mesh_Vars ,ONLY: nElems !--------------------------------------------------------------------------------------------------! IMPLICIT NONE !--------------------------------------------------------------------------------------------------! ! argument list declaration INTEGER, INTENT(IN) :: GlobalElemID REAL, INTENT(IN) :: PhotonDir(3) +REAL, INTENT(IN) :: IntersectionPos(3) ! Local variable declaration +INTEGER :: a,b,ii,k,l,m,iElem,Nloc +REAL :: IntersectionPosRef(3),scaleFac !--------------------------------------------------------------------------------------------------! ! Check primary or secondary direction IF(DOT_PRODUCT(PhotonDir,Ray%Direction).GT.0.0)THEN @@ -663,6 +669,61 @@ SUBROUTINE CalcAbsorptionRayTrace(GlobalElemID,PhotonDir) RayElemPassedEnergy(3:5,GlobalElemID) = RayElemPassedEnergy(3:5,GlobalElemID) + PhotonDir(1:3) RayElemPassedEnergy(6,GlobalElemID) = RayElemPassedEnergy(6,GlobalElemID) + 1.0 END IF + +! High-order sampling: Use nearest Gauss point (NGP) from PIC deposition +! todo: parallelize this +IF(GlobalElemID.gt.nelems)THEN + CALL abort(__STAMP__,'this works only single-core') +END IF ! GlobalElemID.gt.nelems +iElem = GlobalElemID +Nloc = N_DG_Ray(iElem) +IF(MOD(Nloc,2).EQ.0) THEN + a = Nloc/2 + b = a +ELSE + a = (Nloc+1)/2 + b = a-1 +END IF + +! Get position in reference element +CALL GetPositionInRefElem(IntersectionPos(1:3),IntersectionPosRef(1:3),GlobalElemID) + +k = a +DO ii = 0,b-1 + IF(ABS(IntersectionPosRef(1)).GE.N_VolMesh_Ray(iElem)%GaussBorder(Nloc-ii))THEN + k = Nloc-ii + EXIT + END IF +END DO +k = NINT((Nloc+SIGN(2.0*k-Nloc,IntersectionPosRef(1)))/2) +!! y-direction +l = a +DO ii = 0,b-1 + IF(ABS(IntersectionPosRef(2)).GE.N_VolMesh_Ray(iElem)%GaussBorder(Nloc-ii))THEN + l = Nloc-ii + EXIT + END IF +END DO +l = NINT((Nloc+SIGN(2.0*l-Nloc,IntersectionPosRef(2)))/2) +!! z-direction +m = a +DO ii = 0,b-1 + IF(ABS(IntersectionPosRef(3)).GE.N_VolMesh_Ray(iElem)%GaussBorder(Nloc-ii))THEN + m = Nloc-ii + EXIT + END IF +END DO +m = NINT((Nloc+SIGN(2.0*m-Nloc,IntersectionPosRef(3)))/2) + +! Scaling factor to ensure that rays that are counted multiple times in high-order elements do not increase the total energy +! deposited in the corresponding element +scaleFac = 1./(REAL(Nloc)+1.0) +scaleFac = 1. +IF(DOT_PRODUCT(PhotonDir,Ray%Direction).GT.0.0)THEN + U_N_Ray(iElem)%U(1,k,l,m) = U_N_Ray(iElem)%U(1,k,l,m) + PhotonProps%PhotonEnergy * scaleFac +ELSE + U_N_Ray(iElem)%U(2,k,l,m) = U_N_Ray(iElem)%U(2,k,l,m) + PhotonProps%PhotonEnergy * scaleFac +END IF END SUBROUTINE CalcAbsorptionRayTrace @@ -700,7 +761,7 @@ END SUBROUTINE CalcAbsoprtionMC !=================================================================================================================================== !> !=================================================================================================================================== -SUBROUTINE CalcAbsoprtionAnalytic(IntersectionPos,Element, DONE) +SUBROUTINE CalcAbsoprtionAnalytic(IntersectionPos,Element)!, DONE) !DEC$ ATTRIBUTES FORCEINLINE :: ParticleThroughSideLastPosCheck USE MOD_Globals USE MOD_Photon_TrackingVars ,ONLY: PhotonProps @@ -712,7 +773,7 @@ SUBROUTINE CalcAbsoprtionAnalytic(IntersectionPos,Element, DONE) ! argument list declaration INTEGER, INTENT(IN) :: Element REAL, INTENT(IN) :: IntersectionPos(3) -LOGICAL, INTENT(OUT) :: DONE +!LOGICAL, INTENT(OUT) :: DONE ! Local variable declaration !--------------------------------------------------------------------------------------------------! REAL :: DistanceVec(3), Distance, LostEnergy, maz_photon_startxp, opticalPath @@ -764,19 +825,19 @@ SUBROUTINE CalcAbsoprtion(IntersectionPos, Element, DONE, before) ! After reflection: Use old or new ray direction depending on whether the ray was absorbed IF(DONE)THEN ! Ray was absorbed at the wall - CALL CalcAbsorptionRayTrace(Element,PhotonProps%PhotonDirectionBeforeReflection) + CALL CalcAbsorptionRayTrace(IntersectionPos, Element,PhotonProps%PhotonDirectionBeforeReflection) ELSE ! Ray was reflected at the wall ! TODO: Not sure which ray vector should be used !CALL CalcAbsorptionRayTrace(Element,PhotonProps%PhotonDirection) - CALL CalcAbsorptionRayTrace(Element,PhotonProps%PhotonDirectionBeforeReflection) + CALL CalcAbsorptionRayTrace(IntersectionPos, Element,PhotonProps%PhotonDirectionBeforeReflection) END IF ! DONE END IF ! before ELSE - CALL CalcAbsorptionRayTrace(Element,PhotonProps%PhotonDirection) + CALL CalcAbsorptionRayTrace(IntersectionPos, Element,PhotonProps%PhotonDirection) END IF ! PRESENT(before) ELSEIF (RadiationAbsorptionModel.EQ.1) THEN - CALL CalcAbsoprtionAnalytic(IntersectionPos,Element, DONE) + CALL CalcAbsoprtionAnalytic(IntersectionPos,Element)!, DONE) ELSEIF (RadiationAbsorptionModel.EQ.2) THEN CALL CalcAbsoprtionMC(IntersectionPos,Element, DONE) ELSE @@ -1103,7 +1164,7 @@ SUBROUTINE PeriodicPhotonBC(iLocSide, Element, TriNum, IntersectionPos, Intersec USE MOD_Mesh_Vars ,ONLY: BoundaryType USE MOD_Particle_Mesh_Vars ,ONLY: GEO USE MOD_Photon_TrackingVars ,ONLY: PhotonProps -USE MOD_Particle_Tracking_Vars ,ONLY: TrackInfo +!USE MOD_Particle_Tracking_Vars ,ONLY: TrackInfo USE MOD_Particle_Mesh_Vars ,ONLY: SideInfo_Shared USE MOD_Mesh_Tools ,ONLY: GetCNElemID ! IMPLICIT VARIABLE HANDLING @@ -1125,9 +1186,9 @@ SUBROUTINE PeriodicPhotonBC(iLocSide, Element, TriNum, IntersectionPos, Intersec ! Local variable declaration INTEGER :: CNElemID INTEGER :: Node1, Node2 -REAL :: PoldX, PoldY, PoldZ, nx, ny, nz, nVal -REAL :: xNod, yNod, zNod, VecX, VecY, VecZ -REAL :: VelX, VelY, VelZ, VeloCx, VeloCy, VeloCz, NormVec, RanNum +REAL :: PoldX, PoldY, PoldZ +REAL :: xNod, yNod, zNod +REAL :: VelX, VelY, VelZ REAL :: Vector1(1:3), Vector2(1:3), POI_fak !=================================================================================================================================== CNElemID = GetCNElemID(Element) diff --git a/src/radiation/ray_tracing/raytrace_ini.f90 b/src/radiation/ray_tracing/raytrace_ini.f90 index 7d1188a22..7581bddfe 100644 --- a/src/radiation/ray_tracing/raytrace_ini.f90 +++ b/src/radiation/ray_tracing/raytrace_ini.f90 @@ -21,7 +21,7 @@ MODULE MOD_RayTracing_Init IMPLICIT NONE PRIVATE -PUBLIC::InitRayTracing, DefineParametersRayTracing +PUBLIC :: InitRayTracing, DefineParametersRayTracing, FinalizeRayTracing !=================================================================================================================================== CONTAINS @@ -36,7 +36,6 @@ SUBROUTINE DefineParametersRayTracing() !================================================================================================================================== CALL prms%SetSection("Ray Tracing") -CALL prms%CreateIntOption( 'RayTracing-PartBound' , 'TODO' , '0') CALL prms%CreateLogicalOption( 'RayTracing-AdaptiveRays' , 'TODO' , '.FALSE.') CALL prms%CreateIntOption( 'RayTracing-NumRays' , 'TODO' , '1') CALL prms%CreateIntOption( 'RayTracing-RayPosModel' , 'TODO' , '1') @@ -50,6 +49,8 @@ SUBROUTINE DefineParametersRayTracing() CALL prms%CreateRealOption( 'RayTracing-Power' , 'Average pulse power (energy of a single pulse times repetition rate) [W]' ) CALL prms%CreateLogicalOption( 'RayTracing-ForceAbsorption', 'Surface photon sampling is performed independent of the actual absorption/reflection outcome (default=T)', '.TRUE.') +CALL prms%CreateIntOption( 'RayTracing-NMax' , 'Maximum polynomial degree within refined volume elements for photon tracking (p-adaption)') + END SUBROUTINE DefineParametersRayTracing @@ -59,6 +60,7 @@ SUBROUTINE InitRayTracing() !=================================================================================================================================== ! MODULES USE MOD_Globals +USE MOD_Preproc USE MOD_ReadInTools USE MOD_RayTracing_Vars USE MOD_Globals_Vars ,ONLY: Pi @@ -73,6 +75,7 @@ SUBROUTINE InitRayTracing() !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES REAL :: factor,SurfaceNormal(3),alpha +CHARACTER(LEN=3) :: hilf ! auxiliary variable for INTEGER -> CHARACTER conversion !=================================================================================================================================== SWRITE(UNIT_StdOut,'(132("-"))') SWRITE(UNIT_stdOut,'(A)') ' INIT RAY TRACING SOLVER ...' @@ -102,6 +105,14 @@ SUBROUTINE InitRayTracing() RayPosModel = GETINT('RayTracing-RayPosModel') RayForceAbsorption = GETLOGICAL('RayTracing-ForceAbsorption') +! Output of high-order p-adaptive info +Ray%NMin = 1 ! GETINT('RayTracing-NMin') +WRITE(UNIT=hilf,FMT='(I3)') PP_N +Ray%Nmax = GETINT('RayTracing-Nmax',hilf) + +! Build all mappings +CALL InitHighOrderRaySampling() + ASSOCIATE( & E0 => Ray%Energy ,& wb => Ray%WaistRadius ,& @@ -153,4 +164,214 @@ SUBROUTINE InitRayTracing() END SUBROUTINE InitRayTracing +!=================================================================================================================================== +!> Build all high-order mappings required for ray trace sampling in the volume on a p-adaptive polynomial basis +!=================================================================================================================================== +SUBROUTINE InitHighOrderRaySampling() +! MODULES +USE MOD_PreProc +USE MOD_Mesh_Vars ,ONLY: NodeCoords,nElems,ElemBaryNGeo +USE MOD_RayTracing_Vars ,ONLY: N_VolMesh_Ray,N_DG_Ray,Ray,N_Inter_Ray,PREF_VDM_Ray,U_N_Ray,nVarRay +USE MOD_Mesh_Tools ,ONLY: GetCNElemID +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------! +! INPUT / OUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +INTEGER :: Nloc,iElem,CNElemID +LOGICAL,PARAMETER :: debugRay=.FALSE. +!=================================================================================================================================== +ALLOCATE(N_DG_Ray(nElems)) +N_DG_Ray = PP_N +IF(debugRay)THEN + N_DG_Ray = Ray%Nmax + DO iElem = 1, PP_nElems + CNElemID = GetCNElemID(iElem) + ASSOCIATE( & + x => ElemBaryNGeo(1,CNElemID),& + y => ElemBaryNGeo(2,CNElemID),& + z => ElemBaryNGeo(3,CNElemID)) + IF(y+z.GE.1.40)THEN + N_DG_Ray(iElem) = 1 + CYCLE + END IF ! y+z.GT.1.5 + + IF(y+z.LE.0.6)THEN + N_DG_Ray(iElem) = 1 + CYCLE + END IF ! y+z.LT.0.5 + + IF(y+z.LT.0.9)THEN + N_DG_Ray(iElem) = Ray%Nmax-1 + CYCLE + END IF ! y+z.GT.1.00001 + + IF(y+z.GT.1.1)THEN + N_DG_Ray(iElem) = Ray%Nmax-1 + CYCLE + END IF ! y+z.GT.1.00001 + END ASSOCIATE + END DO ! iElem = 1, PP_nElems + END IF ! debugRay + +! Allocate interpolation variables +ALLOCATE(N_Inter_Ray(Ray%Nmin:Ray%Nmax)) +! Allocate Vandermonde matrices for p-refinement +ALLOCATE(PREF_VDM_Ray(Ray%Nmin:Ray%Nmax,Ray%Nmin:Ray%Nmax)) +CALL BuildNInterAndVandermonde() + +ALLOCATE(N_VolMesh_Ray(1:nElems)) +CALL BuildElem_xGP_RayTrace(NodeCoords) + +! the local DG solution in physical and reference space +ALLOCATE(U_N_Ray(1:PP_nElems)) +DO iElem = 1, PP_nElems + Nloc = N_DG_Ray(iElem) + ALLOCATE(U_N_Ray(iElem)%U(nVarRay,0:Nloc,0:Nloc,0:Nloc)) + U_N_Ray(iElem)%U = 0. +END DO ! iElem = 1, PP_nElems + +END SUBROUTINE InitHighOrderRaySampling + + +!================================================================================================================================== +!> This routine takes the equidistant node coordinates of the mesh (on NGeo+1 points) and uses them to build the coordinates +!> of solution/interpolation points of type NodeType on polynomial degree Nloc (Nloc+1 points per direction). +!> Output: Elem_xGP(:,:,:,:) for each element with variably N +!================================================================================================================================== +SUBROUTINE BuildElem_xGP_RayTrace(NodeCoords) +! MODULES +USE MOD_Globals +USE MOD_PreProc +USE MOD_Mesh_Vars ,ONLY: NGeo,nElems +USE MOD_Interpolation_Vars ,ONLY: NodeTypeCL,NodeTypeVISU,NodeType +USE MOD_RayTracing_Vars ,ONLY: Ray,N_VolMesh_Ray,N_DG_Ray,N_Inter_Ray +USE MOD_Interpolation ,ONLY: GetVandermonde,GetNodesAndWeights +USE MOD_ChangeBasis ,ONLY: ChangeBasis3D_XYZ, ChangeBasis3D +USE MOD_Basis ,ONLY: LagrangeInterpolationPolys +!---------------------------------------------------------------------------------------------------------------------------------- +IMPLICIT NONE +!---------------------------------------------------------------------------------------------------------------------------------- +! INPUT/OUTPUT VARIABLES +REAL,INTENT(IN) :: NodeCoords(3,0:NGeo,0:NGeo,0:NGeo,nElems) !< Equidistant mesh coordinates +!---------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +INTEGER :: iElem,Nloc,i + +TYPE VdmType + REAL, ALLOCATABLE :: Vdm_EQNGeo_CLNloc(:,:) + REAL, ALLOCATABLE :: Vdm_CLNloc_Nloc (:,:) +END TYPE VdmType + +TYPE(VdmType), DIMENSION(:), ALLOCATABLE :: Vdm + +REAL, DIMENSION(:), ALLOCATABLE :: MappedGauss(:) +!================================================================================================================================== + +! Build Vdm for every degree +ALLOCATE(Vdm(Ray%Nmin:Ray%Nmax)) +DO Nloc = Ray%Nmin, Ray%Nmax + ALLOCATE(Vdm(Nloc)%Vdm_EQNGeo_CLNloc(0:Nloc,0:NGeo)) + ALLOCATE(Vdm(Nloc)%Vdm_CLNloc_Nloc(0:Nloc,0:Nloc)) + CALL GetVandermonde(NGeo, NodeTypeVISU, NLoc, NodeTypeCL, Vdm(Nloc)%Vdm_EQNGeo_CLNloc, modal=.FALSE.) + CALL GetVandermonde(Nloc, NodeTypeCL , Nloc, NodeType , Vdm(Nloc)%Vdm_CLNloc_Nloc, modal=.FALSE.) + + ! NOTE: Transform intermediately to CL points, to be consistent with metrics being built with CL + ! Important for curved meshes if NGeo=NGeo + + !1.a) Transform from EQUI_NGeo to solution points on Nloc + Vdm(Nloc)%Vdm_EQNGeo_CLNloc=MATMUL(Vdm(Nloc)%Vdm_CLNloc_Nloc, Vdm(Nloc)%Vdm_EQNGeo_CLNloc) +END DO ! Nloc = Ray%Nmin, Ray%Nmax + +! Set Elem_xGP for each element +DO iElem=1,nElems + Nloc = N_DG_Ray(iElem) + + ALLOCATE(N_VolMesh_Ray(iElem)%Elem_xGP(3,0:Nloc,0:Nloc,0:Nloc)) + CALL ChangeBasis3D(3,NGeo,Nloc,Vdm(Nloc)%Vdm_EQNGeo_CLNloc,NodeCoords(:,:,:,:,iElem),N_VolMesh_Ray(iElem)%Elem_xGP(:,:,:,:)) + + ! Build variables for nearest Gauss-point (NGP) method + ALLOCATE(N_VolMesh_Ray(iElem)%GaussBorder(1:Nloc)) + ALLOCATE(MappedGauss(1:Nloc+1)) + + DO i = 0, Nloc + MappedGauss(i+1) = N_Inter_Ray(Nloc)%xGP(i) + END DO ! i = 0, Nloc + + DO i = 1, Nloc + N_VolMesh_Ray(iElem)%GaussBorder(i) = (MappedGauss(i+1) + MappedGauss(i))/2 + END DO ! i = 1, Nloc + + DEALLOCATE(MappedGauss) + +END DO + +END SUBROUTINE BuildElem_xGP_RayTrace + + +!=================================================================================================================================== +!> Builds the interpolation basis N_Inter_Ray and the Vandermonde matrices PREF_VDM_Ray used for high-order volume sampling for the +!> reay tracing model +!=================================================================================================================================== +SUBROUTINE BuildNInterAndVandermonde() +! MODULES +USE MOD_RayTracing_Vars ,ONLY: Ray,N_Inter_Ray,PREF_VDM_Ray +USE MOD_Interpolation ,ONLY: InitInterpolationBasis,GetVandermonde +USE MOD_Interpolation_Vars ,ONLY: NodeType +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------! +! INPUT / OUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +INTEGER :: i,j,Nin,Nout,Nloc +!=================================================================================================================================== +DO Nloc=Ray%Nmin,Ray%Nmax + CALL InitInterpolationBasis(Nloc , N_Inter_Ray(Nloc)%xGP , N_Inter_Ray(Nloc)%wGP , N_Inter_Ray(Nloc)%wBary , & + N_Inter_Ray(Nloc)%L_Minus , N_Inter_Ray(Nloc)%L_Plus , N_Inter_Ray(Nloc)%L_PlusMinus , & + N_Inter_Ray(Nloc)%swGP , N_Inter_Ray(Nloc)%wGPSurf , & + N_Inter_Ray(Nloc)%Vdm_Leg , N_Inter_Ray(Nloc)%sVdm_Leg) +END DO + +! Fill Vandermonde matrices for p-refinement +DO Nin=Ray%Nmin,Ray%Nmax + DO Nout=Ray%Nmin,Ray%Nmax + ALLOCATE(PREF_VDM_Ray(Nin,Nout)%Vdm(0:Nin,0:Nout)) + IF(Nin.EQ.Nout) THEN + DO i=0,Nin; DO j=0,Nin + IF(i.EQ.j) THEN + PREF_VDM_Ray(Nin,Nout)%Vdm(i,j) = 1. + ELSE + PREF_VDM_Ray(Nin,Nout)%Vdm(i,j) = 0. + END IF + END DO + END DO + ELSE IF(Nin.GT.Nout) THEN ! p-coarsening: Project from higher degree to lower degree + CALL GetVandermonde(Nin, NodeType, Nout, NodeType, PREF_VDM_Ray(Nin,Nout)%Vdm, modal=.TRUE. ) + ELSE ! p-refinement: Interpolate lower degree to higher degree + CALL GetVandermonde(Nin, NodeType, Nout, NodeType, PREF_VDM_Ray(Nin,Nout)%Vdm, modal=.FALSE.) + END IF +END DO;END DO + +END SUBROUTINE BuildNInterAndVandermonde + + +!=================================================================================================================================== +!> Deallocate arrays +!=================================================================================================================================== +SUBROUTINE FinalizeRayTracing() +! MODULES +USE MOD_RayTracing_Vars +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------! +! INPUT / OUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +!=================================================================================================================================== +SDEALLOCATE(N_DG_Ray) +SDEALLOCATE(N_VolMesh_Ray) +SDEALLOCATE(N_Inter_Ray) +SDEALLOCATE(PREF_VDM_Ray) +SDEALLOCATE(U_N_Ray) +END SUBROUTINE FinalizeRayTracing + END MODULE MOD_RayTracing_Init diff --git a/src/radiation/ray_tracing/raytrace_vars.f90 b/src/radiation/ray_tracing/raytrace_vars.f90 index b275831ef..c083b180d 100644 --- a/src/radiation/ray_tracing/raytrace_vars.f90 +++ b/src/radiation/ray_tracing/raytrace_vars.f90 @@ -25,43 +25,105 @@ MODULE MOD_RayTracing_Vars ! GLOBAL RAY TRACING VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- TYPE tRayTrace - REAL :: PulseDuration !> - REAL :: tShift !> - REAL :: tActive !> - REAL :: Period !> - INTEGER :: NbrOfPulses !> - REAL :: WaistRadius !> - REAL :: WaveLength !> - REAL :: RepetitionRate !> - REAL :: Power !> - REAL :: Area !> - REAL :: Energy !> - REAL :: IntensityAmplitude !> - REAL :: Direction(3) !> + REAL :: PulseDuration !< + REAL :: tShift !< + REAL :: tActive !< + REAL :: Period !< + INTEGER :: NbrOfPulses !< + REAL :: WaistRadius !< + REAL :: WaveLength !< + REAL :: RepetitionRate !< + REAL :: Power !< + REAL :: Area !< + REAL :: Energy !< + REAL :: IntensityAmplitude !< + REAL :: Direction(3) !< + + ! Output of high-order p-adaptive info + INTEGER :: NMin !< Minimum polynomial degree for the high-order volume sampling (p-adaption) + INTEGER :: NMax !< Maximum polynomial degree for the high-order volume sampling (p-adaption) + END TYPE -TYPE (tRayTrace) :: Ray !> +TYPE (tRayTrace) :: Ray !< TYPE tRadTrans - INTEGER :: NumPhotonsPerCell !> - REAL :: GlobalRadiationPower !> - REAL :: ScaledGlobalRadiationPower !> - INTEGER :: GlobalPhotonNum !> + INTEGER :: NumPhotonsPerCell !< + REAL :: GlobalRadiationPower !< + REAL :: ScaledGlobalRadiationPower !< + INTEGER :: GlobalPhotonNum !< END TYPE -TYPE (tRadTrans) :: RadTrans !> +TYPE (tRadTrans) :: RadTrans !< -LOGICAL :: AdaptiveRays !> -LOGICAL :: RayForceAbsorption !> Surface photon sampling is performed independent of the actual absorption/reflection outcome (default=T) -INTEGER :: NumRays !> -INTEGER :: RayPosModel !> -INTEGER :: RayPartBound !> Particle boundary ID where rays are emitted from +LOGICAL :: AdaptiveRays !< +LOGICAL :: RayForceAbsorption !< Surface photon sampling is performed independent of the actual absorption/reflection outcome (default=T) +INTEGER :: NumRays !< +INTEGER :: RayPosModel !< +INTEGER :: RayPartBound !< Particle boundary ID where rays are emitted from +! Output of low-order info INTEGER,PARAMETER :: RayElemSize=6 -REAL, ALLOCATABLE :: RayElemPassedEnergy(:,:) !> +REAL, ALLOCATABLE :: RayElemPassedEnergy(:,:) !< #if USE_MPI -INTEGER :: RayElemPassedEnergy_Shared_Win !> -REAL,POINTER :: RayElemPassedEnergy_Shared(:,:)!> +INTEGER :: RayElemPassedEnergy_Shared_Win !< +REAL,POINTER :: RayElemPassedEnergy_Shared(:,:)!< #endif + +! Output of high-order p-adaptive info +INTEGER,PARAMETER :: nVarRay=2 !< Number of variables for higher-order sampling for volume ray tracing +INTEGER,ALLOCATABLE :: N_DG_Ray(:) !< polynomial degree inside DG element for higher-order sampling for volume ray tracing, size(nElems) + +! DG solution volume +TYPE N_U_Vol + REAL,ALLOCATABLE :: U(:,:,:,:) !< Polynomial solution of sampled data in each volume element (p-adaptive construct) +END TYPE N_U_Vol + +! DG solution (JU or U) vectors +TYPE(N_U_Vol),ALLOCATABLE :: U_N_Ray(:) !< Solution variable for each equation, node and element, + +!----------------------------------------------------------------------------------------------------------------------------------- +! Volume mesh variables +!----------------------------------------------------------------------------------------------------------------------------------- +TYPE, PUBLIC :: VolMesh + REAL,ALLOCATABLE :: Elem_xGP(:,:,:,:) !< XYZ positions (first index 1:3) of the volume Gauss Point + + REAL,ALLOCATABLE :: GaussBorder(:) !< Variable required for Nearest Gauss Point (NGP) assignment + + ! Metrics on GaussPoints + !REAL,ALLOCATABLE :: dXCL_N(:,:,:,:,:) !< Jacobi matrix of the mapping P\in NGeo + !REAL,ALLOCATABLE :: Metrics_fTilde(:,:,:,:) !< Metric Terms (first indices 3) on each GaussPoint + !REAL,ALLOCATABLE :: Metrics_gTilde(:,:,:,:) + !REAL,ALLOCATABLE :: Metrics_hTilde(:,:,:,:) + !REAL,ALLOCATABLE :: sJ(:,:,:) !< 1/DetJac for each Gauss Point + +END TYPE VolMesh + +TYPE(VolMesh),ALLOCATABLE :: N_VolMesh_Ray(:) !< Array to store Mesh metrics object "VolMesh" + +!----------------------------------------------------------------------------------------------------------------------------------- +! Interpolation variables +!----------------------------------------------------------------------------------------------------------------------------------- +TYPE, PUBLIC :: Interpolation + ! reserved for Gauss Points with polynomial degree N, all allocated (0:N) + REAL,ALLOCATABLE :: L_Plus(:) !< L for boundary flux computation at plus side (1) + REAL,ALLOCATABLE :: L_Minus(:) !< L for boundary flux computation at minus side (-1) + REAL,ALLOCATABLE :: L_PlusMinus(:,:) !< L for boundary flux computation at both sides (-1,1) + REAL,ALLOCATABLE :: xGP(:) !< Gauss point coordinates + REAL,ALLOCATABLE :: wGP(:) !< GP integration weights + REAL,ALLOCATABLE :: swGP(:) !< 1.0/ GP integration weights + REAL,ALLOCATABLE :: wBary(:) !< barycentric weights + REAL,ALLOCATABLE :: wGPSurf(:,:) !< wGPSurf(i,j)=wGP(i)*wGP(j) + REAL,ALLOCATABLE :: NChooseK(:,:) !< array n over n + REAL,ALLOCATABLE :: Vdm_Leg(:,:), sVdm_Leg(:,:) !< Legendre Vandermonde matrix +END TYPE Interpolation + +TYPE(Interpolation),ALLOCATABLE :: N_Inter_Ray(:) !< Array of prebuild interpolation matrices + +TYPE, PUBLIC :: pVDM + REAL,ALLOCATABLE :: Vdm(:,:) !< Vandermonde matrix (PP_in,PP_out) +END TYPE pVDM + +TYPE(pVDM),ALLOCATABLE :: PREF_VDM_Ray(:,:) !< Vandermonde matrices used for p-refinement and coarsening !=================================================================================================================================== END MODULE MOD_RayTracing_Vars diff --git a/src/timedisc/timedisc.f90 b/src/timedisc/timedisc.f90 index 847a91016..5314dc702 100644 --- a/src/timedisc/timedisc.f90 +++ b/src/timedisc/timedisc.f90 @@ -91,6 +91,7 @@ SUBROUTINE TimeDisc() #endif /*PARTICLES*/ #ifdef PARTICLES USE MOD_RayTracing ,ONLY: RayTracing +USE MOD_RayTracing_Init ,ONLY: FinalizeRayTracing !USE MOD_PICDepo ,ONLY: Deposition USE MOD_Particle_Vars ,ONLY: DoImportIMDFile #if USE_MPI @@ -205,7 +206,10 @@ SUBROUTINE TimeDisc() ! Ray tracing #if defined(PARTICLES) -IF(.NOT.DoRestart) CALL RayTracing() +IF(.NOT.DoRestart)THEN + CALL RayTracing() + CALL FinalizeRayTracing() +END IF #endif /*defined(PARTICLES)*/ CALL PrintStatusLine(time,dt,tStart,tEnd,1) From 62813e52089ceb0954e4f44a462324d6a16d4164 Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Fri, 16 Jun 2023 17:05:44 +0200 Subject: [PATCH 093/495] Conversion of DSMC_nSurfSample > 1 DSMCSurfState files with piclas2vtk --- src/interpolation/interpolation.f90 | 8 +- src/posti/piclas2vtk/piclas2vtk.f90 | 195 ++++++++++++++--------- src/posti/piclas2vtk/piclas2vtk_vars.f90 | 1 + 3 files changed, 126 insertions(+), 78 deletions(-) diff --git a/src/interpolation/interpolation.f90 b/src/interpolation/interpolation.f90 index 3f61db08b..5b9e6717f 100644 --- a/src/interpolation/interpolation.f90 +++ b/src/interpolation/interpolation.f90 @@ -46,10 +46,6 @@ MODULE MOD_Interpolation MODULE PROCEDURE GetNodesAndWeights END INTERFACE -INTERFACE GetVandermonde - MODULE PROCEDURE GetVandermonde -END INTERFACE - INTERFACE GetDerivativeMatrix MODULE PROCEDURE GetDerivativeMatrix END INTERFACE @@ -319,8 +315,8 @@ SUBROUTINE GetVandermonde(N_in,NodeType_in,N_out,NodeType_out,Vdm_In_Out,Vdm_Out ! INPUT/OUTPUT VARIABLES INTEGER,INTENT(IN) :: N_in !> Input polynomial degree INTEGER,INTENT(IN) :: N_out !> Output polynomial degree -CHARACTER(LEN=255),INTENT(IN) :: NodeType_in !> Type of 1D input points -CHARACTER(LEN=255),INTENT(IN) :: NodeType_out !> Type of 1D output points +CHARACTER(LEN=*),INTENT(IN) :: NodeType_in !> Type of 1D input points +CHARACTER(LEN=*),INTENT(IN) :: NodeType_out !> Type of 1D output points LOGICAL,INTENT(IN),OPTIONAL :: modal !> Switch if a modal Vandermonde should be build REAL,INTENT(OUT) :: Vdm_In_out(0:N_out,0:N_in) !> Vandermonde In->Out REAL,INTENT(OUT),OPTIONAL :: Vdm_Out_In(0:N_in,0:N_out) !> Vandermonde Out->in diff --git a/src/posti/piclas2vtk/piclas2vtk.f90 b/src/posti/piclas2vtk/piclas2vtk.f90 index 81667208f..1d18fa3dc 100644 --- a/src/posti/piclas2vtk/piclas2vtk.f90 +++ b/src/posti/piclas2vtk/piclas2vtk.f90 @@ -268,7 +268,7 @@ PROGRAM piclas2vtk ! Read-in of the mesh IF(.NOT.ReadMeshFinished) THEN - CALL InitMesh(-1,MeshFile_IN=MeshFile) + CALL InitMesh(3,MeshFile_IN=MeshFile) CALL InitGetGlobalElemID() CALL InitGetCNElemID() #if USE_MPI @@ -369,16 +369,18 @@ END PROGRAM piclas2vtk !=================================================================================================================================== !> Subroutine to write 3D point data to VTK format !=================================================================================================================================== -SUBROUTINE WriteDataToVTK_PICLas(data_size,FileString,nVar,VarNameVisu,nNodes,Coords,nElems,Array,ConnectInfo) +SUBROUTINE WriteDataToVTK_PICLas(dim,data_size,FileString,nVar,VarNameVisu,nNodes,Coords,nElems,Array,ConnectInfo) ! MODULES USE MOD_Globals +USE MOD_Particle_Boundary_Vars ,ONLY: nSurfSample ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES +INTEGER,INTENT(IN) :: dim INTEGER,INTENT(IN) :: nVar,nElems,nNodes,data_size !> Number of nodal output variables -REAL,INTENT(IN) :: Coords(1:3,nNodes) !> Coordinates x, y and z -REAL,INTENT(IN) :: Array(nVar,nElems) !> Array with nVar properties for each coordinate +REAL,INTENT(IN) :: Coords(1:3,0:nSurfSample*(MERGE(1,0,nSurfSample.GT.1)),0:nSurfSample*(MERGE(1,0,nSurfSample.GT.1.AND.dim.GT.1)),0:nSurfSample*(MERGE(1,0,nSurfSample.GT.1.AND.dim.GT.2)),nNodes) !> Coordinates x, y and z +REAL,INTENT(IN) :: Array(1:nVar,0:(nSurfSample-1)*(MERGE(1,0,nSurfSample.GT.1)),0:(nSurfSample-1)*(MERGE(1,0,nSurfSample.GT.1.AND.dim.GT.1)),0:(nSurfSample-1)*(MERGE(1,0,nSurfSample.GT.1.AND.dim.GT.2)),1:nElems) !< Array with nVar properties for each coordinate CHARACTER(LEN=*),INTENT(IN) :: FileString !> Output file name CHARACTER(LEN=*),INTENT(IN) :: VarNameVisu(nVar) !> Variable names INTEGER,INTENT(IN) :: ConnectInfo(data_size,nElems) !> Node connection information @@ -387,18 +389,44 @@ SUBROUTINE WriteDataToVTK_PICLas(data_size,FileString,nVar,VarNameVisu,nNodes,Co !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES INTEGER :: iVal,iElem,Offset,nBytes,nVTKPoints,nVTKCells,ivtk=44,iVar,iNode, int_size, ElemType -INTEGER :: Vertex(data_size,nElems), iLen, str_len +INTEGER :: iLen, str_len, NVisu, NVisuCoords,NodeID,NodeIDElem,NPlot_p1_2,i,j,NVisuValue CHARACTER(LEN=35) :: StrOffset,TempStr1,TempStr2 CHARACTER(LEN=200) :: Buffer, tmp, tmp2, VarNameString CHARACTER(LEN=1) :: lf, components_string REAL(KIND=4) :: float -INTEGER,ALLOCATABLE :: VarNameCombine(:), VarNameCombineLen(:) +INTEGER,ALLOCATABLE :: VarNameCombine(:), VarNameCombineLen(:), Vertex(:,:) REAL :: StartT,EndT ! Timer !=================================================================================================================================== GETTIME(StartT) -nVTKPoints=nNodes -nVTKCells=nElems +SELECT CASE(data_size) +CASE(8,1) ! VTK_HEXAHEDRON, VTK_VERTEX + nVTKPoints=nNodes + nVTKCells=nElems + NVisu = 1 + NVisuValue = 0 + NVisuCoords = 0 +CASE(4) ! VTK_QUAD + IF(nSurfSample.GT.1) THEN + NPlot_p1_2 = (nSurfSample+1)**2 + nVTKPoints = nElems * NPlot_p1_2 + nVTKCells = nElems * nSurfSample**2 + NVisu = nSurfSample + NVisuValue = nSurfSample - 1 + NVisuCoords = nSurfSample + ELSE + nVTKPoints=nNodes + nVTKCells=nElems + NVisu = 1 + NVisuValue = 0 + NVisuCoords = 0 + END IF +CASE DEFAULT + CALL abort(__STAMP__,'Wrong data size given to WriteDataToVTK_PICLas routine!') +END SELECT + +ALLOCATE(Vertex(data_size,nVTKCells)) +Vertex = 0 ! Check if no output is present and print info that no file will be created IF(nElems.LT.1)THEN @@ -514,21 +542,39 @@ SUBROUTINE WriteDataToVTK_PICLas(data_size,FileString,nVar,VarNameVisu,nNodes,Co nBytes = nVTKCells*INT(SIZEOF(FLOAT),4) DO iVal=1,nVar IF (VarNameCombine(iVal).EQ.0) THEN - WRITE(ivtk) nBytes,REAL(Array(iVal,1:nVTKCells),4) + WRITE(ivtk) nBytes,REAL(Array(iVal,0:NVisuValue,0:NVisuValue*(MERGE(1,0,dim.GT.1)),0:NVisuValue*(MERGE(1,0,dim.GT.2)),1:nElems),4) ELSEIF(VarNameCombine(iVal).EQ.1) THEN - WRITE(ivtk) nBytes*VarNameCombineLen(iVal),REAL(Array(iVal:iVal+VarNameCombineLen(iVal)-1,1:nVTKCells),4) + WRITE(ivtk) nBytes*VarNameCombineLen(iVal),REAL(Array(iVal:iVal+VarNameCombineLen(iVal)-1,0:NVisuValue,0:NVisuValue*(MERGE(1,0,dim.GT.1)),0:NVisuValue*(MERGE(1,0,dim.GT.2)),1:nElems),4) ENDIF END DO ! Points nBytes = 3*nVTKPoints*INT(SIZEOF(FLOAT),4) WRITE(ivtk) nBytes -WRITE(ivtk) REAL(Coords(1:3,1:nVTKPoints),4) +WRITE(ivtk) REAL(Coords(1:3,0:NVisuCoords,0:NVisuCoords*(MERGE(1,0,dim.GT.1)),0:NVisuCoords*(MERGE(1,0,dim.GT.2)),1:nNodes),4) ! Connectivity -DO iElem=1,nVTKCells - DO iNode=1,data_size - Vertex(iNode,iElem) = ConnectInfo(iNode,iElem)-1 +IF(nSurfSample.GT.1) THEN + NodeID = 0 + NodeIDElem = 0 + DO iElem=1,nElems + DO j=1,NVisu + DO i=1,NVisu + NodeID = NodeID+1 + ! CGNS to VTK_QUAD: P4, P1, P2, P3 + Vertex(:,NodeID) = (/NodeIDElem+i+ j *(NVisu+1)-1, & + NodeIDElem+i+ (j-1)*(NVisu+1)-1, & + NodeIDElem+i+1+(j-1)*(NVisu+1)-1, & + NodeIDElem+i+1+ j *(NVisu+1)-1 /) + END DO + END DO + NodeIDElem=NodeIDElem+NPlot_p1_2 + END DO ! iElem +ELSE + DO iElem=1,nVTKCells + DO iNode=1,data_size + Vertex(iNode,iElem) = ConnectInfo(iNode,iElem)-1 + END DO END DO -END DO +END IF nBytes = data_size*nVTKCells*INT(SIZEOF(int_size),4) WRITE(ivtk) nBytes WRITE(ivtk) Vertex(:,:) @@ -545,7 +591,7 @@ SUBROUTINE WriteDataToVTK_PICLas(data_size,FileString,nVar,VarNameVisu,nNodes,Co CASE(1) ElemType = 2 ! VTK_VERTEX CASE DEFAULT - CALL abort(__STAMP__,'Wrong data size given to WritaDataToVTK_PICLas routine!') + CALL abort(__STAMP__,'Wrong data size given to WriteDataToVTK_PICLas routine!') END SELECT WRITE(ivtk) nBytes WRITE(ivtk) (ElemType,iElem=1,nVTKCells) @@ -936,8 +982,8 @@ SUBROUTINE ConvertPartData(InputStateFile) END DO FileString=TRIM(TIMESTAMP(TRIM(ProjectName)//'_visuPart',OutputTime))//'.vtu' -CALL WriteDataToVTK_PICLas(1,FileString,nPartsVar,VarNamesParticle,nParts,PartData(1:3,1:nParts),nParts,& - PartData(4:nPartsVar+3,1:nParts),ConnectInfo(1,1:nParts)) +! CALL WriteDataToVTK_PICLas(1,FileString,nPartsVar,VarNamesParticle,nParts,PartData(1:3,1:nParts),nParts,& +! PartData(4:nPartsVar+3,1:nParts),ConnectInfo(1,1:nParts)) SDEALLOCATE(VarNamesParticle) SDEALLOCATE(tmpArray) @@ -1008,7 +1054,7 @@ SUBROUTINE ConvertElemData(InputStateFile,ArrayName,VarName) IF(TRIM(ArrayName).EQ.'ExcitationData') FileString=TRIM(TIMESTAMP(TRIM(ProjectName)//'_visuExcitationData',OutputTime))//'.vtu' END SELECT ! TODO: This is probably borked for NGeo>1 because then NodeCoords are not the corner nodes - CALL WriteDataToVTK_PICLas(8,FileString,nVarAdd,VarNamesAdd(1:nVarAdd),nUniqueNodes,NodeCoords_Connect(1:3,1:nUniqueNodes),nElems,& + CALL WriteDataToVTK_PICLas(3,8,FileString,nVarAdd,VarNamesAdd(1:nVarAdd),nUniqueNodes,NodeCoords_Connect(1:3,1:nUniqueNodes),nElems,& ElemData(1:nVarAdd,1:nElems),ElemUniqueNodeID(1:8,1:nElems)) END IF @@ -1026,10 +1072,15 @@ END SUBROUTINE ConvertElemData SUBROUTINE ConvertSurfaceData(InputStateFile) ! MODULES USE MOD_Globals -USE MOD_Globals_Vars ,ONLY: ProjectName -USE MOD_IO_HDF5 ,ONLY: HSize -USE MOD_HDF5_Input ,ONLY: OpenDataFile,CloseDataFile,ReadAttribute,GetDataSize,File_ID,ReadArray -USE MOD_piclas2vtk_Vars ,ONLY: SurfConnect +USE MOD_Globals_Vars ,ONLY: ProjectName +USE MOD_IO_HDF5 ,ONLY: HSize +USE MOD_HDF5_Input ,ONLY: OpenDataFile,CloseDataFile,ReadAttribute,GetDataSize,File_ID,ReadArray +USE MOD_Particle_Boundary_Vars ,ONLY: nSurfSample +USE MOD_piclas2vtk_Vars ,ONLY: SurfConnect +USE MOD_Interpolation ,ONLY: GetVandermonde +USE MOD_ChangeBasis ,ONLY: ChangeBasis2D +USE MOD_Interpolation_Vars ,ONLY: NodeTypeVisu +USE MOD_Mesh_Vars ,ONLY: Face_xGP, Ngeo ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -1041,10 +1092,12 @@ SUBROUTINE ConvertSurfaceData(InputStateFile) ! LOCAL VARIABLES CHARACTER(LEN=255) :: FileString CHARACTER(LEN=255),ALLOCATABLE :: VarNamesSurf_HDF5(:) -INTEGER :: nDims, nVarSurf, nSurfSample, nSurfaceSidesReadin +INTEGER :: nDims, nVarSurf, nSurfaceSidesReadin REAL :: OutputTime -REAL, ALLOCATABLE :: tempSurfData(:,:,:,:), SurfData(:,:), Coords(:,:) +REAL, ALLOCATABLE :: tempSurfData(:,:,:,:,:) INTEGER :: iSide +REAL,ALLOCATABLE :: Vdm_EQNgeo_NVisu(:,:) !< Vandermonde from equidistant mesh to visualization nodes +REAL,ALLOCATABLE :: NodeCoords_visu(:,:,:,:,:) !< Coordinates of visualization nodes !=================================================================================================================================== ! Read in solution @@ -1052,11 +1105,6 @@ SUBROUTINE ConvertSurfaceData(InputStateFile) CALL ReadAttribute(File_ID,'Project_Name',1,StrScalar=ProjectName) CALL ReadAttribute(File_ID,'Time',1,RealScalar=OutputTime) CALL ReadAttribute(File_ID,'DSMC_nSurfSample',1,IntScalar=nSurfSample) -IF(nSurfSample.NE.1) THEN - CALL abort(& - __STAMP__& - ,'Error in piclas2vtk: Conversion to VTK only possible for DSMC_nSurfSample=1!') -END IF CALL GetDataSize(File_ID,'SurfaceData',nDims,HSize) nVarSurf = INT(HSize(1),4) @@ -1065,14 +1113,13 @@ SUBROUTINE ConvertSurfaceData(InputStateFile) CALL ReadAttribute(File_ID,'VarNamesSurface',nVarSurf,StrArray=VarNamesSurf_HDF5(1:nVarSurf)) IF((nVarSurf.GT.0).AND.(SurfConnect%nSurfaceBCSides.GT.0))THEN - ALLOCATE(SurfData(1:nVarSurf,1:SurfConnect%nSurfaceBCSides)) - ALLOCATE(tempSurfData(1:nVarSurf,nSurfSample,nSurfSample,1:nSurfaceSidesReadin)) - SurfData=0. + ALLOCATE(tempSurfData(1:nVarSurf,nSurfSample,nSurfSample,0:0,1:nSurfaceSidesReadin)) tempSurfData = 0. - ASSOCIATE(nVarSurf => INT(nVarSurf,IK), & + ASSOCIATE(nVarSurf => INT(nVarSurf,IK), & + nSurfSample => INT(nSurfSample,IK), & nSurfaceSidesReadin => INT(nSurfaceSidesReadin,IK)) - CALL ReadArray('SurfaceData',4,(/nVarSurf, 1_IK, 1_IK, nSurfaceSidesReadin/), & - 0_IK,4,RealArray=tempSurfData(:,:,:,:)) + CALL ReadArray('SurfaceData',4,(/nVarSurf, nSurfSample, nSurfSample, nSurfaceSidesReadin/), & + 0_IK,4,RealArray=tempSurfData(:,:,:,0,:)) END ASSOCIATE ! Sanity check @@ -1083,21 +1130,35 @@ SUBROUTINE ConvertSurfaceData(InputStateFile) __STAMP__& ,'Error: SurfConnect%nSurfaceBCSides.NE.nSurfaceSidesReadin') END IF ! SurfConnect%nSurfaceBCSides.NE.nSurfaceSidesReadin +END IF - ! Copy data from tmp array - DO iSide = 1, SurfConnect%nSurfaceBCSides - SurfData(1:nVarSurf,iSide) = tempSurfData(1:nVarSurf,1,1,iSide) - END DO ! iSide = 1, SurfConnect%nSurfaceBCSides +IF(nSurfSample.GT.1) THEN + ALLOCATE(Vdm_EQNgeo_NVisu(0:nSurfSample,0:NGeo)) + CALL GetVandermonde(NGeo,'GAUSS',nSurfSample,NodeTypeVisu,Vdm_EQNgeo_NVisu,modal=.FALSE.) + ALLOCATE(NodeCoords_visu(1:3,0:nSurfSample,0:nSurfSample,0:0,SurfConnect%nSurfaceBCSides)) + NodeCoords_visu = 0. + ! Interpolate mesh onto visu grid + DO iSide=1,SurfConnect%nSurfaceBCSides + CALL ChangeBasis2D(3,NGeo,nSurfSample,Vdm_EQNgeo_NVisu,Face_xGP(1:3,:,:,SurfConnect%SurfSideToSide(iSide)),NodeCoords_visu(1:3,:,:,0,iSide)) + END DO +ELSE + ALLOCATE(NodeCoords_visu(1:3,0:0,0:0,0:0,1:SurfConnect%nSurfaceNode)) + NodeCoords_visu = 0. + NodeCoords_visu(1:3,0,0,0,1:SurfConnect%nSurfaceNode) = SurfConnect%NodeCoords(1:3,1:SurfConnect%nSurfaceNode) END IF FileString=TRIM(TIMESTAMP(TRIM(ProjectName)//'_visuSurf',OutputTime))//'.vtu' -CALL WriteDataToVTK_PICLas(4,FileString,nVarSurf,VarNamesSurf_HDF5,SurfConnect%nSurfaceNode,SurfConnect%NodeCoords(1:3,1:SurfConnect%nSurfaceNode),& - SurfConnect%nSurfaceBCSides,SurfData,SurfConnect%SideSurfNodeMap(1:4,1:SurfConnect%nSurfaceBCSides)) +IF(nSurfSample.GT.1) THEN + ! Number of nodes is calculated inside the routine in case of super-sampling: nSurfaceBCSides = nSurfaceNode + CALL WriteDataToVTK_PICLas(2,4,FileString,nVarSurf,VarNamesSurf_HDF5,SurfConnect%nSurfaceBCSides,NodeCoords_visu,& + SurfConnect%nSurfaceBCSides,tempSurfData,SurfConnect%SideSurfNodeMap) +ELSE + CALL WriteDataToVTK_PICLas(2,4,FileString,nVarSurf,VarNamesSurf_HDF5,SurfConnect%nSurfaceNode,NodeCoords_visu,& + SurfConnect%nSurfaceBCSides,tempSurfData,SurfConnect%SideSurfNodeMap) +END IF SDEALLOCATE(VarNamesSurf_HDF5) -SDEALLOCATE(SurfData) SDEALLOCATE(tempSurfData) -SDEALLOCATE(Coords) CALL CloseDataFile() @@ -1115,9 +1176,9 @@ SUBROUTINE BuildSurfMeshConnectivity(InputStateFile) USE MOD_Mesh_ReadIn ,ONLY: readMesh USE MOD_Mesh_Tools ,ONLY: GetCNElemID USE MOD_Mesh_Vars ,ONLY: BoundaryName +USE MOD_Mesh_Vars ,ONLY: nBCSides, BC, SideToElem, offsetElem USE MOD_piclas2vtk_Vars ,ONLY: SurfConnect -USE MOD_Particle_Mesh_Vars ,ONLY: ElemSideNodeID_Shared,SideInfo_Shared,NodeCoords_Shared,NodeInfo_Shared -USE MOD_Particle_Mesh_Vars ,ONLY: nNonUniqueGlobalSides +USE MOD_Particle_Mesh_Vars ,ONLY: ElemSideNodeID_Shared,NodeCoords_Shared,NodeInfo_Shared ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -1128,9 +1189,9 @@ SUBROUTINE BuildSurfMeshConnectivity(InputStateFile) !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES CHARACTER(LEN=255),ALLOCATABLE :: SurfBCName_HDF5(:) -INTEGER :: nDims, iNode, nSurfBC_HDF5, iName, nSides +INTEGER :: nDims, iNode, nSurfBC_HDF5, iName, locElemID INTEGER :: CNElemID, iLocSide, iSide, iNode2, iBC, nSurfSides, nUniqueSurfSide -INTEGER, ALLOCATABLE :: TempBCSurfNodes(:), TempSideSurfNodeMap(:,:), SideToSurfSide(:), NonUnique2UniqueSide(:) +INTEGER, ALLOCATABLE :: TempBCSurfNodes(:), TempSideSurfNodeMap(:,:), SideToSurfSide(:) REAL, ALLOCATABLE :: TempNodeCoords(:,:) LOGICAL :: IsSortedSurfNode !=================================================================================================================================== @@ -1147,47 +1208,38 @@ SUBROUTINE BuildSurfMeshConnectivity(InputStateFile) SWRITE(UNIT_stdOut,'(A3,A38,I2.1,A5,A3,A33,A13)')' | ','BC',iName,'Name',' | ',TRIM(SurfBCName_HDF5(iName)),' | HDF5 | ' END DO -nSides = nNonUniqueGlobalSides - ! create sideid to surfaceid map for all surface-sides contained in statefile -ALLOCATE(SideToSurfSide(1:nSides)) -SideToSurfSide(1:nSides) = -1 -ALLOCATE(NonUnique2UniqueSide(1:nSides)) -NonUnique2UniqueSide(1:nSides) = -1 +ALLOCATE(SideToSurfSide(1:nBCSides)) +SideToSurfSide(1:nBCSides) = -1 ! if side is surface (BC_reflective defined in State file) then map respective surface side number nSurfSides = 0 nUniqueSurfSide = 0 -DO iSide = 1,nSides - IF(SideInfo_Shared(SIDE_BCID,iSide).EQ.0) CYCLE +DO iSide = 1,nBCSides DO iBC=1,nSurfBC_HDF5 - IF((TRIM(BoundaryName(SideInfo_Shared(SIDE_BCID,iSide))) .EQ. TRIM(SurfBCName_HDF5(iBC)))) THEN + IF((TRIM(BoundaryName(BC(iSide))) .EQ. TRIM(SurfBCName_HDF5(iBC)))) THEN nSurfSides = nSurfSides + 1 SideToSurfSide(iSide) = nSurfSides - IF(SideInfo_Shared(SIDE_NBSIDEID,iSide).GT.0) THEN - ! Cycling over non-unique sides - IF(iSide.GT.SideInfo_Shared(SIDE_NBSIDEID,iSide)) CYCLE - END IF - nUniqueSurfSide = nUniqueSurfSide + 1 - NonUnique2UniqueSide(nSurfSides) = nUniqueSurfSide END IF END DO END DO ! Build connectivity for the surface mesh -ALLOCATE(TempBCSurfNodes(4*nSides)) -ALLOCATE(TempNodeCoords(1:3,4*nSides)) -ALLOCATE(TempSideSurfNodeMap(1:4,1:nSides)) +ALLOCATE(TempBCSurfNodes(4*nBCSides)) +ALLOCATE(TempNodeCoords(1:3,4*nBCSides)) +ALLOCATE(TempSideSurfNodeMap(1:4,1:nBCSides)) SurfConnect%nSurfaceNode=0 SurfConnect%nSurfaceBCSides=0 +ALLOCATE(SurfConnect%SurfSideToSide(nBCSides)) +SurfConnect%SurfSideToSide = 0 -DO iSide=1, nSides +DO iSide=1, nBCSides ! Cycling over non-reflective sides IF (SideToSurfSide(iSide).EQ.-1) CYCLE - ! Cycling over non-unique sides - IF (NonUnique2UniqueSide(SideToSurfSide(iSide)).EQ.-1) CYCLE SurfConnect%nSurfaceBCSides = SurfConnect%nSurfaceBCSides + 1 - CNElemID = GetCNElemID(SideInfo_Shared(SIDE_ELEMID,iSide)) - iLocSide = SideInfo_Shared(SIDE_LOCALID,iSide) + locElemID = SideToElem(S2E_ELEM_ID,iSide) + iLocSide = SideToElem(S2E_LOC_SIDE_ID,iSide) + CNElemID = GetCNElemID(offsetElem+locElemID) + SurfConnect%SurfSideToSide(SurfConnect%nSurfaceBCSides) = iSide DO iNode2 = 1, 4 IsSortedSurfNode = .FALSE. DO iNode = 1, SurfConnect%nSurfaceNode @@ -1215,7 +1267,6 @@ SUBROUTINE BuildSurfMeshConnectivity(InputStateFile) SDEALLOCATE(TempBCSurfNodes) SDEALLOCATE(TempSideSurfNodeMap) SDEALLOCATE(TempNodeCoords) -SDEALLOCATE(NonUnique2UniqueSide) SDEALLOCATE(SurfBCName_HDF5) SDEALLOCATE(SideToSurfSide) CALL CloseDataFile() diff --git a/src/posti/piclas2vtk/piclas2vtk_vars.f90 b/src/posti/piclas2vtk/piclas2vtk_vars.f90 index dbf4aeedf..0a2963341 100644 --- a/src/posti/piclas2vtk/piclas2vtk_vars.f90 +++ b/src/posti/piclas2vtk/piclas2vtk_vars.f90 @@ -40,6 +40,7 @@ MODULE MOD_piclas2vtk_Vars INTEGER :: nSurfaceBCSides !< Number of Sides on Surface (reflective) REAL, ALLOCATABLE :: NodeCoords(:,:) INTEGER, ALLOCATABLE :: SideSurfNodeMap(:,:) !< Mapping from glob Side to SurfaceNodeNum (1:4, nSurfaceBCSides) + INTEGER, ALLOCATABLE :: SurfSideToSide(:) END TYPE TYPE (tSurfaceConnect) :: SurfConnect From fae38d952557a4091ef9b2c7fa64523a779d3ada Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Mon, 19 Jun 2023 01:31:11 +0200 Subject: [PATCH 094/495] Adjusted ANSA box nightly DSMC reggie: nSurfSample=3 --- .../NIG_tracking_DSMC/ANSA_box/hopr.ini | 41 +++++++------------ .../NIG_tracking_DSMC/ANSA_box/parameter.ini | 11 ++--- 2 files changed, 20 insertions(+), 32 deletions(-) diff --git a/regressioncheck/NIG_tracking_DSMC/ANSA_box/hopr.ini b/regressioncheck/NIG_tracking_DSMC/ANSA_box/hopr.ini index d0200dadd..ea0bcdca1 100644 --- a/regressioncheck/NIG_tracking_DSMC/ANSA_box/hopr.ini +++ b/regressioncheck/NIG_tracking_DSMC/ANSA_box/hopr.ini @@ -1,38 +1,25 @@ !=============================================================================== ! ! OUTPUT !=============================================================================== ! - ProjectName =tildbox ! name of the project (used for filenames) - Debugvisu =F ! Write debug mesh to tecplot file - Logging =F ! Write log files +ProjectName = tildbox ! name of the project (used for filenames) +Debugvisu = F ! Write debug mesh to tecplot file +Logging = F ! Write log files !=============================================================================== ! ! MESH !=============================================================================== ! - Mode =4 ! 1 Cartesian 2 gambit file 3 CGNS - nZones =1 ! number of zones - nMeshFiles =1 ! number of meshfiles - FileName =tildbox ! name of mesh file - useCurveds =F ! T if curved boundaries defined - SpaceQuandt =1. ! - ConformConnect=T - !meshscale =0.001 - meshscale =1.0 +Mode = 4 ! 1 Cartesian 2 gambit file 3 CGNS +nZones = 1 ! number of zones +nMeshFiles = 1 ! number of meshfiles +FileName = tildbox ! name of mesh file +useCurveds = F ! T if curved boundaries defined +SpaceQuandt = 1. ! +ConformConnect = T +meshscale = 1.0 !=============================================================================== ! ! BOUNDARY CONDITIONS !=============================================================================== ! - nUserDefinedBoundaries=1 - BoundaryName=BC_Open ! Outflow: open (absorbing) [for MAXWELL] - BoundaryType=(/3,0,0,0/) ! Outflow: open (absorbing) [for MAXWELL] - -!=============================================================================== ! -! BASIS -!=============================================================================== ! - NVisu = 7 - -!=============================================================================== ! -! SEARCH -!=============================================================================== ! -! nElemsNodeSearch=50 -! RefineSideSearch=50 - +nUserDefinedBoundaries = 1 +BoundaryName = BC_Open ! Outflow: open (absorbing) [for MAXWELL] +BoundaryType = (/3,0,0,0/) ! Outflow: open (absorbing) [for MAXWELL] diff --git a/regressioncheck/NIG_tracking_DSMC/ANSA_box/parameter.ini b/regressioncheck/NIG_tracking_DSMC/ANSA_box/parameter.ini index 0174d1da7..4744331ee 100644 --- a/regressioncheck/NIG_tracking_DSMC/ANSA_box/parameter.ini +++ b/regressioncheck/NIG_tracking_DSMC/ANSA_box/parameter.ini @@ -1,13 +1,10 @@ ! =============================================================================== ! -! EQUATION (linearscalaradvection) -! =============================================================================== ! -IniExactFunc = 0 -! =============================================================================== ! ! DISCRETIZATION ! =============================================================================== ! N = 1 ! Polynomial degree GeometricNGeo = 1 ! Degree of mesh representation NAnalyze = 10 ! Number of analyze points +IniExactFunc = 0 ! =============================================================================== ! ! MESH ! =============================================================================== ! @@ -20,13 +17,17 @@ BoundaryType=(/4,0/) ! OUTPUT / VISUALIZATION ! =============================================================================== ! ProjectName = tildbox -NVisu = 4 ! Number of visualization points +NVisu = 1 ! Number of visualization points CalcKineticEnergy = TRUE CalcTransTemp = TRUE Logging = F printRandomSeeds = F DoCalcErrorNorms = T FlushInitialState = T + +Part-WriteMacroSurfaceValues = T +DSMC-nSurfSample = 2 +Part-IterationForMacroVal = 100 ! =============================================================================== ! ! CALCULATION ! =============================================================================== ! From 614365ce576b6e7e8b881457191b54981e645938 Mon Sep 17 00:00:00 2001 From: Franziska Hild Date: Tue, 20 Jun 2023 15:35:53 +0200 Subject: [PATCH 095/495] changed CalcSigma_22VHS to subroutine --- src/particles/bgk/bgk_colloperator.f90 | 27 +++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/src/particles/bgk/bgk_colloperator.f90 b/src/particles/bgk/bgk_colloperator.f90 index 13eac9fa7..649c3b8e6 100644 --- a/src/particles/bgk/bgk_colloperator.f90 +++ b/src/particles/bgk/bgk_colloperator.f90 @@ -1690,7 +1690,7 @@ SUBROUTINE CalcViscosityThermalCondColIntVHS(CellTemp, Xi, dens, Xi_RotSpec, Xi_ CellTemptmp = CellTemp(nSpecies+1) ! Cell temperature END IF ! Calculation of collision integral Sigma_22 - Sigma_22 = CalcSigma_22VHS(CellTemptmp,InteractDiam,Mass,TVHS, omegaVHS) + CALL CalcSigma_22VHS(CellTemptmp, InteractDiam, Mass, TVHS, omegaVHS, Sigma_22) IF (iSpec.EQ.jSpec) THEN cv= 3./2.*BoltzmannConst/(2.*Mass) ! DOF = 3, translational part ! Calculation of the viscosity and thermal conductivity @@ -1700,14 +1700,14 @@ SUBROUTINE CalcViscosityThermalCondColIntVHS(CellTemp, Xi, dens, Xi_RotSpec, Xi_ ! results in in same as ThermalCondSpec(iSpec) = (15./4.)*BoltzmannConst/(2.*Mass)*ViscSpec(iSpec) ! Additional calculation of Sigma_11VHS and the diffusion coefficient for molecular species IF ((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN - CALL CalcSigma_11VHS(CellTemp(nSpecies+1),InteractDiam,Mass,TVHS, omegaVHS, Sigma_11) + CALL CalcSigma_11VHS(CellTemp(nSpecies+1), InteractDiam, Mass, TVHS, omegaVHS, Sigma_11) E_12 = BoltzmannConst*CellTemp(nSpecies+1)/(8.*Species(iSpec)%MassIC*Species(jSpec)%MassIC & /(Species(iSpec)%MassIC+Species(jSpec)%MassIC)**2.*Sigma_11) DiffCoef(iSpec,jSpec) = 3.*E_12/(2.*(Species(iSpec)%MassIC+Species(jSpec)%MassIC)*dens) END IF ELSE ! Calculation of collision integral Sigma_11 - CALL CalcSigma_11VHS(CellTemp(nSpecies+1),InteractDiam,Mass,TVHS, omegaVHS, Sigma_11) + CALL CalcSigma_11VHS(CellTemp(nSpecies+1), InteractDiam, Mass, TVHS, omegaVHS, Sigma_11) ! Parameters for calculation of contribution of species to mixture transport coefficients ! Pfeiffer et. al., Physics of Fluids 33, 036106 (2021), "Multi-species modeling in the particle-based ellipsoidal ! statistical Bhatnagar-Gross-Krook method for monatomic gas species" @@ -1803,23 +1803,23 @@ SUBROUTINE CalcViscosityThermalCondColIntVHS(CellTemp, Xi, dens, Xi_RotSpec, Xi_ END SUBROUTINE CalcViscosityThermalCondColIntVHS -SUBROUTINE CalcSigma_11VHS(CellTemp,Dref,Mass,Tref, omegaVHS, Sigma_11) +SUBROUTINE CalcSigma_11VHS(CellTemp, Dref, Mass, Tref, omegaVHS, Sigma_11) !=================================================================================================================================== !> !=================================================================================================================================== ! MODULES -USE MOD_Globals_Vars ,ONLY: Pi, BoltzmannConst +USE MOD_Globals_Vars ,ONLY: Pi, BoltzmannConst ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES -REAL, INTENT(IN) :: CellTemp,Dref,Mass,Tref, omegaVHS +REAL, INTENT(IN) :: CellTemp, Dref, Mass, Tref, omegaVHS REAL, INTENT(OUT) :: Sigma_11 !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -REAL :: Prefactor +REAL :: Prefactor !=================================================================================================================================== ! See Stephani et. al., Physics of Fluids 24, 077101 (2012), ! “Consistent treatment of transport properties for five-species air direct simulation Monte Carlo/Navier-Stokes applications” @@ -1829,28 +1829,29 @@ SUBROUTINE CalcSigma_11VHS(CellTemp,Dref,Mass,Tref, omegaVHS, Sigma_11) END SUBROUTINE CalcSigma_11VHS -REAL FUNCTION CalcSigma_22VHS(CellTemp,Dref,Mass,Tref, omegaVHS) +SUBROUTINE CalcSigma_22VHS(CellTemp, Dref, Mass, Tref, omegaVHS, Sigma_22) !=================================================================================================================================== !> !=================================================================================================================================== ! MODULES -USE MOD_Globals_Vars ,ONLY: Pi, BoltzmannConst +USE MOD_Globals_Vars ,ONLY: Pi, BoltzmannConst ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES -REAL, INTENT(IN) :: CellTemp,Dref,Mass,Tref, omegaVHS +REAL, INTENT(IN) :: CellTemp, Dref, Mass, Tref, omegaVHS +REAL, INTENT(OUT) :: Sigma_22 !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -REAL :: Prefactor +REAL :: Prefactor !=================================================================================================================================== ! See Stephani et. al., Physics of Fluids 24, 077101 (2012), ! “Consistent treatment of transport properties for five-species air direct simulation Monte Carlo/Navier-Stokes applications” Prefactor = Pi/3.*Dref*Dref*SQRT(BoltzmannConst/(2.*Pi*Mass))*Tref**omegaVHS*GAMMA(4.-omegaVHS)/GAMMA(2.-omegaVHS) - CalcSigma_22VHS = Prefactor*CellTemp**(0.5-omegaVHS) + Sigma_22 = Prefactor*CellTemp**(0.5-omegaVHS) -END FUNCTION CalcSigma_22VHS +END SUBROUTINE CalcSigma_22VHS END MODULE MOD_BGK_CollOperator From dfc7a16d7287d9893da9294dae1b13ada31deed8 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Tue, 20 Jun 2023 20:58:33 +0200 Subject: [PATCH 096/495] High-order volume sampling for ray tracing and super sapling on particle boundary surfaces with nSurfSample. --- .../parameter.ini | 7 +- .../boundary/particle_boundary_sampling.f90 | 97 +++++++----- .../boundary/particle_boundary_vars.f90 | 1 + src/particles/particle_mesh/particle_mesh.f90 | 22 ++- src/posti/piclas2vtk/piclas2vtk.f90 | 4 +- .../radiative_transfer/radtrans_init.f90 | 2 +- .../tracking/radtrans_tracking.f90 | 17 ++- .../tracking/radtrans_tracking_output.f90 | 75 +++++----- .../tracking/radtrans_tracking_tools.f90 | 141 ++++++++++++------ .../tracking/radtrans_tracking_vars.f90 | 4 +- src/radiation/ray_tracing/raytrace.f90 | 6 +- src/radiation/ray_tracing/raytrace_ini.f90 | 54 +++---- 12 files changed, 260 insertions(+), 170 deletions(-) diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini index 41e862e7a..2293f07fb 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini @@ -2,14 +2,16 @@ ! POSTI ! =============================================================================== ! VisuParticles = T -NVisu = 3 +NVisu = 1 +NodeTypeVisu = GAUSS +!NodeTypeVisu = VISU TimeStampLength = 21 ! =============================================================================== ! ! VARIABLES ! =============================================================================== ! CFLscale = 0.2 IniExactFunc = 0 -N = 2 +N = 1 DoLoadBalance = T Load-DeviationThreshold = 0.15 @@ -119,6 +121,7 @@ Part-Boundary6-PhotonEnACC = 1.0 ! =============================================================================== ! ! Ray Tracing ! =============================================================================== ! +DSMC-nSurfSample = 2 PIC-DoInterpolation = T ! activate ElemCurved, XiEtaZetaBasis and slenXiEtaZetaBasis (requires XCL_NGeo_Shared) RayTracing-RayPosModel = 1 Particles-DSMC-CalcSurfaceVal = T ! activate InitParticleBoundarySampling diff --git a/src/particles/boundary/particle_boundary_sampling.f90 b/src/particles/boundary/particle_boundary_sampling.f90 index f30b1c623..eee8a5b38 100644 --- a/src/particles/boundary/particle_boundary_sampling.f90 +++ b/src/particles/boundary/particle_boundary_sampling.f90 @@ -84,7 +84,7 @@ SUBROUTINE InitParticleBoundarySampling() USE MOD_Particle_Boundary_Vars ,ONLY: GlobalSide2SurfSide,SurfSide2GlobalSide USE MOD_SurfaceModel_Vars ,ONLY: nPorousBC USE MOD_Particle_Boundary_Vars ,ONLY: CalcSurfaceImpact -USE MOD_Particle_Boundary_Vars ,ONLY: SurfSideArea,SurfSampSize,SurfOutputSize,SurfSpecOutputSize +USE MOD_Particle_Boundary_Vars ,ONLY: SurfSideArea,SurfSideSamplingMidPoints,SurfSampSize,SurfOutputSize,SurfSpecOutputSize USE MOD_Particle_Boundary_Vars ,ONLY: SampWallState, SWIVarTimeStep, SWIStickingCoefficient USE MOD_Particle_Boundary_Vars ,ONLY: SampWallPumpCapacity USE MOD_Particle_Boundary_Vars ,ONLY: SampWallImpactEnergy @@ -129,6 +129,8 @@ SUBROUTINE InitParticleBoundarySampling() #if USE_LOADBALANCE USE MOD_LoadBalance_Vars ,ONLY: PerformLoadBalance #endif /*USE_LOADBALANCE*/ +USE MOD_Interpolation_Vars ,ONLY: NodeTypeVISU +USE MOD_Interpolation ,ONLY: GetNodesAndWeights ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------! @@ -143,7 +145,6 @@ SUBROUTINE InitParticleBoundarySampling() INTEGER :: offsetSurfTotalSidesProc INTEGER,ALLOCATABLE :: GlobalSide2SurfSideProc(:,:) !INTEGER,ALLOCATABLE :: SurfSide2GlobalSideProc(:,:) -CHARACTER(20) :: hilf CHARACTER(LEN=255),ALLOCATABLE :: BCName(:) ! surface area INTEGER :: SideID,ElemID,CNElemID,LocSideID @@ -153,7 +154,7 @@ SUBROUTINE InitParticleBoundarySampling() REAL,DIMENSION(2,3) :: gradXiEta3D REAL,DIMENSION(:),ALLOCATABLE :: Xi_NGeo,wGP_NGeo REAL :: XiOut(1:2),E,F,G,D,tmp1,tmpI2,tmpJ2 -REAL :: xNod, zNod, yNod, Vector1(3), Vector2(3), nx, ny, nz +REAL :: xNod(3), Vector1(3), Vector2(3), nx, ny, nz #if USE_MPI INTEGER :: offsetSurfSidesProc INTEGER :: GlobalElemID,GlobalElemRank @@ -161,17 +162,13 @@ SUBROUTINE InitParticleBoundarySampling() INTEGER :: NbGlobalElemID, NbElemRank, NbLeaderID, nSurfSidesTmp #endif /*USE_MPI*/ INTEGER :: NbGlobalSideID +LOGICAL :: UseBezierControlPoints +REAL,ALLOCATABLE :: xIP_VISU(:),wIP_VISU(:) !=================================================================================================================================== ! Get input parameters LBWRITE(UNIT_stdOut,'(A)') ' INIT SURFACE SAMPLING ...' -WRITE(UNIT=hilf,FMT='(I0)') NGeo -nSurfSample = GETINT('DSMC-nSurfSample',TRIM(hilf)) - -IF((nSurfSample.GT.1).AND.(TrackingMethod.EQ.TRIATRACKING)) & - CALL abort(__STAMP__,'nSurfSample cannot be >1 if TrackingMethod = triatracking') - ! Sampling of impact energy for each species (trans, rot, vib), impact vector (x,y,z) and angle CalcSurfaceImpact = GETLOGICAL('CalcSurfaceImpact') @@ -576,6 +573,7 @@ SUBROUTINE InitParticleBoundarySampling() lastSide = INT(REAL((myComputeNodeRank+1))*REAL(nComputeNodeSurfTotalSides)/REAL(nComputeNodeProcessors)) #else ALLOCATE(SurfSideArea(1:nSurfSample,1:nSurfSample,1:nComputeNodeSurfTotalSides)) +ALLOCATE(SurfSideSamplingMidPoints(1:3,1:nSurfSample,1:nSurfSample,1:nComputeNodeSurfTotalSides)) firstSide = 1 lastSide = nSurfTotalSides @@ -585,6 +583,7 @@ SUBROUTINE InitParticleBoundarySampling() IF (myComputeNodeRank.EQ.0) THEN #endif /*USE_MPI*/ SurfSideArea=0. + SurfSideSamplingMidPoints=0. #if USE_MPI END IF CALL BARRIER_AND_SYNC(SurfSideArea_Shared_Win,MPI_COMM_SHARED) @@ -605,47 +604,62 @@ SUBROUTINE InitParticleBoundarySampling() ! compute area of sub-faces tmp1=dXiEQ_SurfSample/2.0 !(b-a)/2 +ALLOCATE(xIP_VISU(0:nSurfSample),wIP_VISU(0:nSurfSample)) +CALL GetNodesAndWeights(nSurfSample, NodeTypeVISU, xIP_VISU, wIP=wIP_VISU) + DO iSide = firstSide,LastSide ! get global SideID. This contains only nonUniqueSide, no special mortar treatment required SideID = SurfSide2GlobalSide(SURF_SIDEID,iSide) + UseBezierControlPoints = .FALSE. + IF (TrackingMethod.EQ.TRIATRACKING) THEN ElemID = SideInfo_Shared(SIDE_ELEMID ,SideID) CNElemID = GetCNElemID(ElemID) LocSideID = SideInfo_Shared(SIDE_LOCALID,SideID) - area = 0. - xNod = NodeCoords_Shared(1,ElemSideNodeID_Shared(1,LocSideID,CNElemID)+1) - yNod = NodeCoords_Shared(2,ElemSideNodeID_Shared(1,LocSideID,CNElemID)+1) - zNod = NodeCoords_Shared(3,ElemSideNodeID_Shared(1,LocSideID,CNElemID)+1) + IF((Symmetry%Order.NE.3).AND.nSurfSample.GT.1) CALL abort(__STAMP__,'nSurfSample>1 not implemented for this symmetry!') + IF(Symmetry%Order.EQ.3) THEN - DO TriNum = 1,2 - Node1 = TriNum+1 ! normal = cross product of 1-2 and 1-3 for first triangle - Node2 = TriNum+2 ! and 1-3 and 1-4 for second triangle - Vector1(1) = NodeCoords_Shared(1,ElemSideNodeID_Shared(Node1,LocSideID,CNElemID)+1) - xNod - Vector1(2) = NodeCoords_Shared(2,ElemSideNodeID_Shared(Node1,LocSideID,CNElemID)+1) - yNod - Vector1(3) = NodeCoords_Shared(3,ElemSideNodeID_Shared(Node1,LocSideID,CNElemID)+1) - zNod - Vector2(1) = NodeCoords_Shared(1,ElemSideNodeID_Shared(Node2,LocSideID,CNElemID)+1) - xNod - Vector2(2) = NodeCoords_Shared(2,ElemSideNodeID_Shared(Node2,LocSideID,CNElemID)+1) - yNod - Vector2(3) = NodeCoords_Shared(3,ElemSideNodeID_Shared(Node2,LocSideID,CNElemID)+1) - zNod - nx = - Vector1(2) * Vector2(3) + Vector1(3) * Vector2(2) !NV (inwards) - ny = - Vector1(3) * Vector2(1) + Vector1(1) * Vector2(3) - nz = - Vector1(1) * Vector2(2) + Vector1(2) * Vector2(1) - nVal = SQRT(nx*nx + ny*ny + nz*nz) - area = area + nVal/2. - END DO - SurfSideArea(1,1,iSide) = area + ! Check if triangles are used for the calculation of the surface area or not + IF(nSurfSample.GT.1)THEN + ! Do not use triangles + UseBezierControlPoints = .TRUE. + ELSE + xNod(1:3) = NodeCoords_Shared(1:3,ElemSideNodeID_Shared(1,LocSideID,CNElemID)+1) + area = 0. + DO TriNum = 1,2 + Node1 = TriNum+1 ! normal = cross product of 1-2 and 1-3 for first triangle + Node2 = TriNum+2 ! and 1-3 and 1-4 for second triangle + Vector1(1:3) = NodeCoords_Shared(1:3,ElemSideNodeID_Shared(Node1,LocSideID,CNElemID)+1) - xNod(1:3) + Vector2(1:3) = NodeCoords_Shared(1:3,ElemSideNodeID_Shared(Node2,LocSideID,CNElemID)+1) - xNod(1:3) + nx = - Vector1(2) * Vector2(3) + Vector1(3) * Vector2(2) !NV (inwards) + ny = - Vector1(3) * Vector2(1) + Vector1(1) * Vector2(3) + nz = - Vector1(1) * Vector2(2) + Vector1(2) * Vector2(1) + nVal = SQRT(nx*nx + ny*ny + nz*nz) + area = area + nVal/2. + END DO + SurfSideArea(1,1,iSide) = area + END IF ! nSurfSample.GT.1 ELSE IF(Symmetry%Order.EQ.2) THEN SurfSideArea(1,1,iSide) = DSMC_2D_CalcSymmetryArea(LocSideID, CNElemID) ELSE IF(Symmetry%Order.EQ.1) THEN SurfSideArea(1,1,iSide) = DSMC_1D_CalcSymmetryArea(LocSideID, CNElemID) END IF ELSE ! TrackingMethod.NE.TRIATRACKING - ! call here stephens algorithm to compute area + UseBezierControlPoints = .TRUE. + END IF ! TrackingMethod.EQ.TRIATRACKIN + + ! Instead of triangles use Bezier control points (curved or triangle tracking with nSurfSample>1) + IF(UseBezierControlPoints)THEN DO jSample=1,nSurfSample DO iSample=1,nSurfSample area=0. tmpI2=(XiEQ_SurfSample(iSample-1)+XiEQ_SurfSample(iSample))/2. ! (a+b)/2 tmpJ2=(XiEQ_SurfSample(jSample-1)+XiEQ_SurfSample(jSample))/2. ! (a+b)/2 + ASSOCIATE(xi => 0.5*(xIP_VISU(iSample)+xIP_VISU(iSample-1)), eta => 0.5*(xIP_VISU(jSample)+xIP_VISU(jSample-1)) ) + CALL EvaluateBezierPolynomialAndGradient((/xi,eta/),NGeo,3,BezierControlPoints3D(1:3,0:NGeo,0:NGeo,SideID) & + ,Point=SurfSideSamplingMidPoints(1:3,iSample,jSample,iSide)) + END ASSOCIATE DO q=0,NGeo DO p=0,NGeo XiOut(1)=tmp1*Xi_NGeo(p)+tmpI2 @@ -663,7 +677,8 @@ SUBROUTINE InitParticleBoundarySampling() SurfSideArea(iSample,jSample,iSide) = area END DO ! iSample=1,nSurfSample END DO ! jSample=1,nSurfSample - END IF + END IF ! UseBezierControlPoints + END DO ! iSide = firstSide,lastSide #if USE_MPI @@ -1114,19 +1129,19 @@ SUBROUTINE WriteSurfSampleToHDF5(MeshFileName,OutputTime) SurfOutputSize => INT(SurfOutputSize,IK) , & SurfSpecOutputSize => INT(SurfSpecOutputSize,IK)) DO iSpec = 1,nSpecies - CALL WriteArrayToHDF5(DataSetName=H5_Name , rank=4 , & - nValGlobal =(/nVar2D_Total , nSurfSample , nSurfSample , nGlobalSides /) , & - nVal =(/SurfSpecOutputSize , nSurfSample , nSurfSample , nLocalSides/) , & - offset =(/INT(nVarCount,IK) , 0_IK , 0_IK , offsetSurfSide/) , & - collective =.FALSE. , & + CALL WriteArrayToHDF5(DataSetName=H5_Name , rank=4 , & + nValGlobal =(/nVar2D_Total , nSurfSample , nSurfSample , nGlobalSides /) , & + nVal =(/SurfSpecOutputSize , nSurfSample , nSurfSample , nLocalSides/) , & + offset =(/INT(nVarCount , IK) , 0_IK , 0_IK , offsetSurfSide/) , & + collective =.FALSE. , & RealArray = MacroSurfaceSpecVal(1:SurfSpecOutputSize,1:nSurfSample,1:nSurfSample,1:nLocalSides,iSpec)) nVarCount = nVarCount + INT(SurfSpecOutputSize) END DO - CALL WriteArrayToHDF5(DataSetName=H5_Name , rank=4 , & - nValGlobal =(/nVar2D_Total , nSurfSample, nSurfSample , nGlobalSides/) , & - nVal =(/SurfOutputSize , nSurfSample, nSurfSample , nLocalSides/) , & - offset =(/INT(nVarCount,IK), 0_IK , 0_IK , offsetSurfSide/) , & - collective =.FALSE. , & + CALL WriteArrayToHDF5(DataSetName=H5_Name , rank=4 , & + nValGlobal =(/nVar2D_Total , nSurfSample , nSurfSample , nGlobalSides/) , & + nVal =(/SurfOutputSize , nSurfSample , nSurfSample , nLocalSides/) , & + offset =(/INT(nVarCount , IK) , 0_IK , 0_IK , offsetSurfSide/) , & + collective =.FALSE. , & RealArray = MacroSurfaceVal(1:SurfOutputSize,1:nSurfSample,1:nSurfSample,1:nLocalSides)) END ASSOCIATE diff --git a/src/particles/boundary/particle_boundary_vars.f90 b/src/particles/boundary/particle_boundary_vars.f90 index a3a402d79..a17337edb 100644 --- a/src/particles/boundary/particle_boundary_vars.f90 +++ b/src/particles/boundary/particle_boundary_vars.f90 @@ -29,6 +29,7 @@ MODULE MOD_Particle_Boundary_Vars INTEGER :: SurfOutputSize !> Energy + Force + nSpecies INTEGER :: SurfSpecOutputSize !> Energy + Force + nSpecies REAL,ALLOCPOINT,DIMENSION(:,:,:) :: SurfSideArea !> Area of supersampled surface side +REAL,ALLOCPOINT,DIMENSION(:,:,:,:) :: SurfSideSamplingMidPoints !> Mid point of supersampled surface side REAL,ALLOCPOINT,DIMENSION(:,:,:) :: BoundaryWallTemp !> Wall Temperature for Adaptive Case ! ==================================================================== ! Mesh info diff --git a/src/particles/particle_mesh/particle_mesh.f90 b/src/particles/particle_mesh/particle_mesh.f90 index f19f0d8bb..09fa12b5f 100644 --- a/src/particles/particle_mesh/particle_mesh.f90 +++ b/src/particles/particle_mesh/particle_mesh.f90 @@ -195,7 +195,7 @@ SUBROUTINE InitParticleMesh() USE MOD_IO_HDF5 ,ONLY: AddToElemData,ElementOut USE MOD_Mesh_Vars ,ONLY: nElems USE MOD_Particle_Boundary_Init ,ONLY: InitPartStateBoundary -USE MOD_Particle_Boundary_Vars ,ONLY: DoBoundaryParticleOutputHDF5 +USE MOD_Particle_Boundary_Vars ,ONLY: DoBoundaryParticleOutputHDF5,nSurfSample USE MOD_Photon_TrackingVars ,ONLY: PhotonModeBPO !USE MOD_DSMC_Vars ,ONLY: DSMC ! IMPLICIT VARIABLE HANDLING @@ -217,12 +217,17 @@ SUBROUTINE InitParticleMesh() ! TODO ! REAL :: dx,dy,dz #endif /*CODE_ANALYZE*/ +LOGICAL :: nSurfSampleAndTriaTracking +CHARACTER(3) :: hilf !=================================================================================================================================== LBWRITE(UNIT_StdOut,'(132("-"))') LBWRITE(UNIT_stdOut,'(A)')' INIT PARTICLE MESH ...' IF(ParticleMeshInitIsDone) CALL abort(__STAMP__, ' Particle-Mesh is already initialized.') +WRITE(UNIT=hilf,FMT='(I0)') NGeo +nSurfSample = GETINT('DSMC-nSurfSample',TRIM(hilf)) + #if USE_MPI IF(DoParticleLatencyHiding)THEN ! Exchange elements may receive particles during MPI communication and cannot be used for latency hiding @@ -232,15 +237,19 @@ SUBROUTINE InitParticleMesh() END IF ! DoParticleLatencyHiding #endif /*USE_MPI*/ +! Check if Bezier control points are required for high-order surface sampling +nSurfSampleAndTriaTracking = .FALSE. ! default +IF((TrackingMethod.EQ.TRIATRACKING).AND.(Symmetry%Order.EQ.3).AND.(nSurfSample.GT.1)) nSurfSampleAndTriaTracking = .TRUE. + ! Potentially curved elements. FIBGM needs to be built on BezierControlPoints rather than NodeCoords to avoid missing elements -IF (TrackingMethod.EQ.TRACING .OR. TrackingMethod.EQ.REFMAPPING) THEN +IF (TrackingMethod.EQ.TRACING .OR. TrackingMethod.EQ.REFMAPPING .OR. nSurfSampleAndTriaTracking) THEN ! Bezier elevation now more important than ever, also determines size of FIBGM extent BezierElevation = GETINT('BezierElevation') NGeoElevated = NGeo + BezierElevation CALL CalcParticleMeshMetrics() ! Required for Elem_xGP_Shared and dXCL_NGeo_Shared CALL CalcXCL_NGeo() ! Required for XCL_NGeo_Shared - CALL CalcBezierControlPoints() ! Required for BezierControlPoints3D and BezierControlPoints3DElevated + CALL CalcBezierControlPoints() ! Required for BezierControlPoints3D and BezierControlPoints3DElevated (requires XCL_NGeo_Shared) END IF ! Mesh min/max must be built on BezierControlPoint for possibly curved elements @@ -376,8 +385,11 @@ SUBROUTINE InitParticleMesh() ! Interpolation needs coordinates in reference system !IF (DoInterpolation.OR.DSMC%UseOctree) THEN ! use this in future if possible IF (DoInterpolation.OR.DoDeposition) THEN - CALL CalcParticleMeshMetrics() ! Required for Elem_xGP_Shared and dXCL_NGeo_Shared - CALL CalcXCL_NGeo() ! Required for XCL_NGeo_Shared + ! Do not call these functions twice + IF(.NOT.nSurfSampleAndTriaTracking)THEN + CALL CalcParticleMeshMetrics() ! Required for Elem_xGP_Shared and dXCL_NGeo_Shared + CALL CalcXCL_NGeo() ! Required for XCL_NGeo_Shared + END IF ! .NOT.nSurfSampleAndTriaTracking CALL BuildElemTypeAndBasisTria() ! Required for ElemCurved, XiEtaZetaBasis and slenXiEtaZetaBasis. Needs XCL_NGeo_Shared END IF ! DoInterpolation.OR.DSMC%UseOctree diff --git a/src/posti/piclas2vtk/piclas2vtk.f90 b/src/posti/piclas2vtk/piclas2vtk.f90 index a0a691ac2..260e04abc 100644 --- a/src/posti/piclas2vtk/piclas2vtk.f90 +++ b/src/posti/piclas2vtk/piclas2vtk.f90 @@ -982,8 +982,8 @@ SUBROUTINE ConvertPartData(InputStateFile) END DO FileString=TRIM(TIMESTAMP(TRIM(ProjectName)//'_visuPart',OutputTime))//'.vtu' -! CALL WriteDataToVTK_PICLas(1,FileString,nPartsVar,VarNamesParticle,nParts,PartData(1:3,1:nParts),nParts,& -! PartData(4:nPartsVar+3,1:nParts),ConnectInfo(1,1:nParts)) + CALL WriteDataToVTK_PICLas(1,1,FileString,nPartsVar,VarNamesParticle,nParts,PartData(1:3,1:nParts),nParts,& + PartData(4:nPartsVar+3,1:nParts),ConnectInfo(1,1:nParts)) SDEALLOCATE(VarNamesParticle) SDEALLOCATE(tmpArray) diff --git a/src/radiation/radiative_transfer/radtrans_init.f90 b/src/radiation/radiative_transfer/radtrans_init.f90 index 9c32cf257..e79f47b73 100644 --- a/src/radiation/radiative_transfer/radtrans_init.f90 +++ b/src/radiation/radiative_transfer/radtrans_init.f90 @@ -434,7 +434,7 @@ SUBROUTINE InitRadiationTransport() !IF (.NOT.ALLOCATED(SurfMesh%SideIDToSurfID)) CALL InitParticleBoundarySampling() -ALLOCATE(PhotonSampWall(2,1:nComputeNodeSurfTotalSides)) +ALLOCATE(PhotonSampWall(2,1:nSurfSample,1:nSurfSample,1:nComputeNodeSurfTotalSides)) PhotonSampWall=0.0 #if USE_MPI diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 index c68be41ae..1aafc9c52 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 @@ -81,12 +81,15 @@ SUBROUTINE PhotonTriaTracking() LOGICAL :: oldElemIsMortar, isMortarSideTemp(1:6), doCheckSide REAL :: minRatio, intersecDist, intersecDistVec(3) REAL :: IntersectionPos(1:3), IntersectionPosTemp(1:3) -LOGICAL :: PhotonLost +LOGICAL :: PhotonLost !=================================================================================================================================== Done = .FALSE. ElemID = PhotonProps%ElemID SideID = 0 DoneLastElem(:,:) = 0 + +! Set initial starting position +PhotonProps%PhotonStartPos = PhotonProps%PhotonPos ! 1) Loop tracking until Photon is considered "done" (either absorbed or deleted) DO WHILE (.NOT.Done) oldElemIsMortar = .FALSE. @@ -321,7 +324,7 @@ SUBROUTINE PhotonTriaTracking() DONE = .TRUE. CASE(2) ! PartBound%ReflectiveBC ! Backup photon direction for ray tracing - PhotonProps%PhotonDirectionBeforeReflection(1:3) = PhotonProps%PhotonDirection(1:3) + IF(RadiationAbsorptionModel.EQ.0) PhotonProps%PhotonDirectionBeforeReflection(1:3) = PhotonProps%PhotonDirection(1:3) ! Check if specular of diffuse reflection IF (PartBound%PhotonSpecularReflection(iPBC)) THEN @@ -344,12 +347,12 @@ SUBROUTINE PhotonTriaTracking() IF(RadiationAbsorptionModel.EQ.0)THEN CALL CalcAbsoprtion(IntersectionPos(1:3), ElemID, DONE, before = .TRUE.) IF (.NOT.DONE) THEN - CALL CalcWallAbsoprtion(SideID, DONE, RayForceAbsorption) + CALL CalcWallAbsoprtion(IntersectionPos(1:3),SideID, DONE, RayForceAbsorption) CALL CalcAbsoprtion(IntersectionPos(1:3), ElemID, DONE, before = .FALSE.) END IF ! .NOT.DONE ELSE CALL CalcAbsoprtion(IntersectionPos(1:3), ElemID, DONE) - IF (.NOT.DONE) CALL CalcWallAbsoprtion(SideID, DONE) + IF (.NOT.DONE) CALL CalcWallAbsoprtion(IntersectionPos(1:3),SideID, DONE) END IF ! RadiationAbsorptionModel.EQ.0 CASE(3) ! PartBound%PeriodicBC @@ -419,6 +422,10 @@ SUBROUTINE PhotonTriaTracking() END IF END IF ! PhotonLost END IF ! BC(SideID).GT./.LE. 0 + + ! Store new position + PhotonProps%PhotonStartPos(1:3) = IntersectionPos(1:3) + ! Check if output to PartStateBoundary is activated IF(PhotonModeBPO.EQ.2)THEN CALL StoreBoundaryParticleProperties(0,& @@ -598,7 +605,7 @@ SUBROUTINE Photon2DSymTracking() IF (.NOT.DONE) CALL PerfectPhotonReflection2D(LocalSide,ElemID, IntersectionPos) ELSE CALL CalcAbsoprtion(IntersectionPos(1:3),ElemID, DONE) - IF (.NOT.DONE) CALL CalcWallAbsoprtion(SideID, DONE) + IF (.NOT.DONE) CALL CalcWallAbsoprtion(IntersectionPos(1:3),SideID, DONE) IF (.NOT.DONE) CALL DiffusePhotonReflection2D(LocalSide,ElemID, IntersectionPos) END IF LastSide = SideID diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 index 11a79d4eb..1fac19736 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 @@ -172,22 +172,23 @@ SUBROUTINE WritePhotonSurfSampleToHDF5() !----------------------------------------------------------------------------------------------------------------------------------! USE MOD_Globals USE MOD_IO_HDF5 -USE MOD_Globals_Vars, ONLY:ProjectName -USE MOD_Particle_Boundary_Vars, ONLY:nComputeNodeSurfOutputSides,noutputsides, nSurfBC -USE MOD_Particle_Boundary_Vars, ONLY:offsetComputeNodeSurfOutputSide, SurfBCName, nComputeNodeSurfSides -USE MOD_Particle_Boundary_Vars, ONLY:SurfSide2GlobalSide, GlobalSide2SurfSide -USE MOD_HDF5_Output, ONLY:WriteAttributeToHDF5,WriteArrayToHDF5,WriteHDF5Header -USE MOD_Mesh_Vars, ONLY:MeshFile -USE MOD_Particle_Mesh_Vars, ONLY:SideInfo_Shared -USE MOD_MPI_Shared_Vars, ONLY:mySurfRank +USE MOD_Globals_Vars ,ONLY: ProjectName +USE MOD_Particle_Boundary_Vars ,ONLY: nComputeNodeSurfOutputSides,noutputsides, nSurfBC +USE MOD_Particle_Boundary_Vars ,ONLY: offsetComputeNodeSurfOutputSide, SurfBCName, nComputeNodeSurfSides +USE MOD_Particle_Boundary_Vars ,ONLY: SurfSide2GlobalSide, GlobalSide2SurfSide +USE MOD_HDF5_Output ,ONLY: WriteAttributeToHDF5,WriteArrayToHDF5,WriteHDF5Header +USE MOD_Mesh_Vars ,ONLY: MeshFile +USE MOD_Particle_Mesh_Vars ,ONLY: SideInfo_Shared +USE MOD_MPI_Shared_Vars ,ONLY: mySurfRank #if USE_MPI -USE MOD_MPI_Shared_Vars, ONLY:MPI_COMM_LEADERS_SURF -USE MOD_Particle_Boundary_Vars, ONLY:SurfSideArea_Shared,nSurfTotalSides -USE MOD_Photon_TrackingVars, ONLY:PhotonSampWall_Shared +USE MOD_MPI_Shared_Vars ,ONLY: MPI_COMM_LEADERS_SURF +USE MOD_Particle_Boundary_Vars ,ONLY: SurfSideArea_Shared,nSurfTotalSides +USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall_Shared #else -USE MOD_Photon_TrackingVars, ONLY:PhotonSampWall -USE MOD_Particle_Boundary_Vars, ONLY:SurfSideArea +USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall +USE MOD_Particle_Boundary_Vars ,ONLY: SurfSideArea #endif /*USE_MPI*/ +USE MOD_Particle_Boundary_Vars ,ONLY: nSurfSample !----------------------------------------------------------------------------------------------------------------------------------! ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -198,12 +199,12 @@ SUBROUTINE WritePhotonSurfSampleToHDF5() ! LOCAL VARIABLES CHARACTER(LEN=255) :: FileString,Statedummy CHARACTER(LEN=255) :: H5_Name -CHARACTER(LEN=255) :: NodeTypeTemp +CHARACTER(LEN=4),PARAMETER :: NodeTypeTemp = 'VISU' CHARACTER(LEN=255),ALLOCATABLE :: Str2DVarNames(:) -INTEGER :: GlobalSideID, iSurfSide, OutputCounter, SurfSideNb +INTEGER :: GlobalSideID, iSurfSide, OutputCounter, SurfSideNb, p, q INTEGER,PARAMETER :: nVar2D=2 REAL :: tstart,tend -REAL, ALLOCATABLE :: helpArray(:,:) +REAL, ALLOCATABLE :: helpArray(:,:,:,:) !=================================================================================================================================== #if USE_MPI CALL ExchangeRadiationSurfData() @@ -229,13 +230,12 @@ SUBROUTINE WritePhotonSurfSampleToHDF5() Statedummy = 'RadiationSurfState' ! Write file header CALL WriteHDF5Header(Statedummy,File_ID) - CALL WriteAttributeToHDF5(File_ID,'RadiationnSurfSample',1,IntegerScalar=1) - CALL WriteAttributeToHDF5(File_ID,'MeshFile',1,StrScalar=(/TRIM(MeshFile)/)) - CALL WriteAttributeToHDF5(File_ID,'BC_Surf',nSurfBC,StrArray=SurfBCName) - CALL WriteAttributeToHDF5(File_ID,'N',1,IntegerScalar=1) - NodeTypeTemp='VISU' - CALL WriteAttributeToHDF5(File_ID,'NodeType',1,StrScalar=(/NodeTypeTemp/)) - CALL WriteAttributeToHDF5(File_ID,'Time',1,RealScalar=0.) + CALL WriteAttributeToHDF5(File_ID , 'DSMC_nSurfSample' , 1 , IntegerScalar = nSurfSample ) + CALL WriteAttributeToHDF5(File_ID , 'MeshFile' , 1 , StrScalar = (/TRIM(MeshFile)/) ) + CALL WriteAttributeToHDF5(File_ID , 'BC_Surf' , nSurfBC , StrArray = SurfBCName ) + CALL WriteAttributeToHDF5(File_ID , 'N' , 1 , IntegerScalar = nSurfSample ) + CALL WriteAttributeToHDF5(File_ID , 'NodeType' , 1 , StrScalar = (/NodeTypeTemp/) ) + CALL WriteAttributeToHDF5(File_ID , 'Time' , 1 , RealScalar = 0. ) ALLOCATE(Str2DVarNames(1:nVar2D)) ! fill varnames for total values @@ -262,12 +262,13 @@ SUBROUTINE WritePhotonSurfSampleToHDF5() #endif ASSOCIATE (& + nSurfSample => INT(nSurfSample , IK) , & nGlobalSides => INT(nOutputSides , IK) , & LocalnBCSides => INT(nComputeNodeSurfOutputSides , IK) , & offsetSurfSide => INT(offsetComputeNodeSurfOutputSide , IK) , & nVar2D => INT(nVar2D , IK)) - ALLOCATE(helpArray(nVar2D,LocalnBCSides)) + ALLOCATE(helpArray(nVar2D,1:nSurfSample,1:nSurfSample,LocalnBCSides)) OutputCounter = 0 !IF(myrank.eq.0) read* DO iSurfSide = 1,nComputeNodeSurfSides @@ -275,22 +276,26 @@ SUBROUTINE WritePhotonSurfSampleToHDF5() IF(SideInfo_Shared(SIDE_NBSIDEID,GlobalSideID).GT.0) THEN IF(GlobalSideID.LT.SideInfo_Shared(SIDE_NBSIDEID,GlobalSideID)) THEN SurfSideNb = GlobalSide2SurfSide(SURF_SIDEID,SideInfo_Shared(SIDE_NBSIDEID,GlobalSideID)) - PhotonSampWall(:,iSurfSide) = PhotonSampWall(:,iSurfSide) + PhotonSampWall(:,SurfSideNb) + PhotonSampWall(:,:,:,iSurfSide) = PhotonSampWall(:,:,:,iSurfSide) + PhotonSampWall(:,:,:,SurfSideNb) ELSE CYCLE END IF END IF OutputCounter = OutputCounter + 1 - helpArray(1,OutputCounter)= PhotonSampWall(1,iSurfSide) + helpArray(1,1:nSurfSample,1:nSurfSample,OutputCounter) = PhotonSampWall(1,1:nSurfSample,1:nSurfSample,iSurfSide) ! SurfaceArea should be changed to 1:SurfMesh%nSides if inner sampling sides exist... - helpArray(2,OutputCounter)= PhotonSampWall(2,iSurfSide)/SurfSideArea(1,1,iSurfSide) + DO p = 1, nSurfSample + DO q = 1, nSurfSample + helpArray(2,p,q,OutputCounter) = PhotonSampWall(2,p,q,iSurfSide)/SurfSideArea(p,q,iSurfSide) + END DO ! q = 1, nSurfSample + END DO ! p = 1, nSurfSample END DO - CALL WriteArrayToHDF5(DataSetName=H5_Name , rank=4 , & - nValGlobal =(/nVar2D , 1_IK , 1_IK , nGlobalSides/) , & - nVal =(/nVar2D , 1_IK , 1_IK , LocalnBCSides/) , & - offset =(/0_IK , 0_IK , 0_IK , offsetSurfSide/) , & - collective =.FALSE. ,& - RealArray=helpArray(1:nVar2D,1:LocalnBCSides)) + CALL WriteArrayToHDF5(DataSetName=H5_Name , rank=4 , & + nValGlobal =(/nVar2D , nSurfSample , nSurfSample , nGlobalSides/) , & + nVal =(/nVar2D , nSurfSample , nSurfSample , LocalnBCSides/) , & + offset =(/0_IK , 0_IK , 0_IK , offsetSurfSide/) , & + collective =.FALSE. , & + RealArray=helpArray(1:nVar2D,1:nSurfSample,1:nSurfSample,1:LocalnBCSides)) DEALLOCATE(helpArray) END ASSOCIATE @@ -319,7 +324,7 @@ SUBROUTINE ExchangeRadiationSurfData() ! MODULES ! !----------------------------------------------------------------------------------------------------------------------------------! USE MOD_Globals -USE MOD_Particle_Boundary_Vars ,ONLY: SurfOnNode, SurfMapping, nComputeNodeSurfTotalSides, GlobalSide2SurfSide +USE MOD_Particle_Boundary_Vars ,ONLY: SurfOnNode, SurfMapping, nComputeNodeSurfTotalSides, GlobalSide2SurfSide, nSurfSample USE MOD_Particle_MPI_Vars ,ONLY: SurfSendBuf,SurfRecvBuf USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall, PhotonSampWall_Shared, PhotonSampWall_Shared_Win USE MOD_MPI_Shared_Vars ,ONLY: MPI_COMM_LEADERS_SURF, MPI_COMM_SHARED, nSurfLeaders,myComputeNodeRank,mySurfRank @@ -339,7 +344,7 @@ SUBROUTINE ExchangeRadiationSurfData() ! nodes without sampling surfaces do not take part in this routine IF (.NOT.SurfOnNode) RETURN -MessageSize = 2*nComputeNodeSurfTotalSides +MessageSize = 2*nComputeNodeSurfTotalSides*(nSurfSample**2) IF (myComputeNodeRank.EQ.0) THEN CALL MPI_REDUCE(PhotonSampWall, PhotonSampWall_Shared, MessageSize, MPI_DOUBLE_PRECISION, MPI_SUM, 0, MPI_COMM_SHARED, IERROR) ELSE diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 index 58e4bf03c..919e3c588 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 @@ -658,8 +658,9 @@ SUBROUTINE CalcAbsorptionRayTrace(IntersectionPos,GlobalElemID,PhotonDir) REAL, INTENT(IN) :: PhotonDir(3) REAL, INTENT(IN) :: IntersectionPos(3) ! Local variable declaration -INTEGER :: a,b,ii,k,l,m,iElem,Nloc -REAL :: IntersectionPosRef(3),scaleFac +INTEGER :: a,b,ii,k,l,m,iElem,Nloc,NbrOfSamples,iIntersec +REAL :: IntersectionPosRef(3),scaleFac,SamplePos(3) +LOGICAL :: arr(0:Ray%NMax,0:Ray%NMax,0:Ray%NMax) !--------------------------------------------------------------------------------------------------! ! Check primary or secondary direction IF(DOT_PRODUCT(PhotonDir,Ray%Direction).GT.0.0)THEN @@ -671,7 +672,7 @@ SUBROUTINE CalcAbsorptionRayTrace(IntersectionPos,GlobalElemID,PhotonDir) END IF ! High-order sampling: Use nearest Gauss point (NGP) from PIC deposition -! todo: parallelize this +! todo: parallelize this, maybe full mesh already there? IF(GlobalElemID.gt.nelems)THEN CALL abort(__STAMP__,'this works only single-core') END IF ! GlobalElemID.gt.nelems @@ -685,45 +686,56 @@ SUBROUTINE CalcAbsorptionRayTrace(IntersectionPos,GlobalElemID,PhotonDir) b = a-1 END IF -! Get position in reference element -CALL GetPositionInRefElem(IntersectionPos(1:3),IntersectionPosRef(1:3),GlobalElemID) +! Loop over number of sub-samples +NbrOfSamples = Nloc+3 +!scaleFac = 1./REAL(NbrOfSamples+1) +scaleFac = 20. +arr = .FALSE. -k = a -DO ii = 0,b-1 - IF(ABS(IntersectionPosRef(1)).GE.N_VolMesh_Ray(iElem)%GaussBorder(Nloc-ii))THEN - k = Nloc-ii - EXIT - END IF -END DO -k = NINT((Nloc+SIGN(2.0*k-Nloc,IntersectionPosRef(1)))/2) -!! y-direction -l = a -DO ii = 0,b-1 - IF(ABS(IntersectionPosRef(2)).GE.N_VolMesh_Ray(iElem)%GaussBorder(Nloc-ii))THEN - l = Nloc-ii - EXIT - END IF -END DO -l = NINT((Nloc+SIGN(2.0*l-Nloc,IntersectionPosRef(2)))/2) -!! z-direction -m = a -DO ii = 0,b-1 - IF(ABS(IntersectionPosRef(3)).GE.N_VolMesh_Ray(iElem)%GaussBorder(Nloc-ii))THEN - m = Nloc-ii - EXIT - END IF -END DO -m = NINT((Nloc+SIGN(2.0*m-Nloc,IntersectionPosRef(3)))/2) +DO iIntersec = 0, NbrOfSamples + SamplePos = PhotonProps%PhotonStartPos(1:3) + (IntersectionPos(1:3)-PhotonProps%PhotonStartPos(1:3))*REAL(iIntersec)/REAL(NbrOfSamples) -! Scaling factor to ensure that rays that are counted multiple times in high-order elements do not increase the total energy -! deposited in the corresponding element -scaleFac = 1./(REAL(Nloc)+1.0) -scaleFac = 1. -IF(DOT_PRODUCT(PhotonDir,Ray%Direction).GT.0.0)THEN - U_N_Ray(iElem)%U(1,k,l,m) = U_N_Ray(iElem)%U(1,k,l,m) + PhotonProps%PhotonEnergy * scaleFac -ELSE - U_N_Ray(iElem)%U(2,k,l,m) = U_N_Ray(iElem)%U(2,k,l,m) + PhotonProps%PhotonEnergy * scaleFac -END IF + ! Get position in reference element + CALL GetPositionInRefElem(SamplePos(1:3),IntersectionPosRef(1:3),GlobalElemID) + + k = a + DO ii = 0,b-1 + IF(ABS(IntersectionPosRef(1)).GE.N_VolMesh_Ray(iElem)%GaussBorder(Nloc-ii))THEN + k = Nloc-ii + EXIT + END IF + END DO + k = NINT((Nloc+SIGN(2.0*k-Nloc,IntersectionPosRef(1)))/2) + !! y-direction + l = a + DO ii = 0,b-1 + IF(ABS(IntersectionPosRef(2)).GE.N_VolMesh_Ray(iElem)%GaussBorder(Nloc-ii))THEN + l = Nloc-ii + EXIT + END IF + END DO + l = NINT((Nloc+SIGN(2.0*l-Nloc,IntersectionPosRef(2)))/2) + !! z-direction + m = a + DO ii = 0,b-1 + IF(ABS(IntersectionPosRef(3)).GE.N_VolMesh_Ray(iElem)%GaussBorder(Nloc-ii))THEN + m = Nloc-ii + EXIT + END IF + END DO + m = NINT((Nloc+SIGN(2.0*m-Nloc,IntersectionPosRef(3)))/2) + + ! Scaling factor to ensure that rays that are counted multiple times in high-order elements do not increase the total energy + ! deposited in the corresponding element + IF(.NOT.arr(k,l,m))THEN + IF(DOT_PRODUCT(PhotonDir,Ray%Direction).GT.0.0)THEN + U_N_Ray(iElem)%U(1,k,l,m) = U_N_Ray(iElem)%U(1,k,l,m) + PhotonProps%PhotonEnergy * scaleFac + ELSE + U_N_Ray(iElem)%U(2,k,l,m) = U_N_Ray(iElem)%U(2,k,l,m) + PhotonProps%PhotonEnergy * scaleFac + END IF + arr(k,l,m)=.TRUE. + END IF ! .NOT.arr(k,l,m) +END DO ! iIntersec = 1, Nloc+3 END SUBROUTINE CalcAbsorptionRayTrace @@ -1254,21 +1266,23 @@ END SUBROUTINE PeriodicPhotonBC !> !> ForceWallSample (OPTIONAL): When true, the sampling is performed independent of the actual absorption/reflection outcome !=================================================================================================================================== -SUBROUTINE CalcWallAbsoprtion(GlobSideID, DONE, ForceWallSample) +SUBROUTINE CalcWallAbsoprtion(IntersectionPos, GlobSideID, DONE, ForceWallSample) +USE MOD_Globals ,ONLY: VECNORM USE MOD_Photon_TrackingVars ,ONLY: PhotonProps,PhotonSampWall -USE MOD_Particle_Boundary_Vars ,ONLY: PartBound, GlobalSide2SurfSide +USE MOD_Particle_Boundary_Vars ,ONLY: PartBound, GlobalSide2SurfSide, nSurfSample, SurfSideSamplingMidPoints USE MOD_Particle_Mesh_Vars ,ONLY: SideInfo_Shared !--------------------------------------------------------------------------------------------------! IMPLICIT NONE !--------------------------------------------------------------------------------------------------! ! argument list declaration +REAL, INTENT(IN) :: IntersectionPos(3) INTEGER, INTENT(IN) :: GlobSideID LOGICAL, INTENT(OUT) :: DONE LOGICAL, INTENT(IN), OPTIONAL :: ForceWallSample !> ! Local variable declaration !--------------------------------------------------------------------------------------------------! -REAL :: iRan,PhotonEnACC -INTEGER :: SurfSideID +REAL :: iRan,PhotonEnACC,distance,distanceMin +INTEGER :: SurfSideID,p,q,pp,qq LOGICAL :: ForceWallSampleLoc !--------------------------------------------------------------------------------------------------! SurfSideID = GlobalSide2SurfSide(SURF_SIDEID,GlobSideID) @@ -1277,8 +1291,24 @@ SUBROUTINE CalcWallAbsoprtion(GlobSideID, DONE, ForceWallSample) ForceWallSampleLoc = ForceWallSample ! Sample impact IF(ForceWallSampleLoc)THEN - PhotonSampWall(1,SurfSideID) = PhotonSampWall(1,SurfSideID) + 1. - PhotonSampWall(2,SurfSideID) = PhotonSampWall(2,SurfSideID) + PhotonProps%PhotonEnergy + IF(nSurfSample.GT.1)THEN + distanceMin = HUGE(1.) + DO pp = 1, nSurfSample + DO qq = 1, nSurfSample + distance = VECNORM(IntersectionPos(1:3) - SurfSideSamplingMidPoints(1:3,pp,qq,SurfSideID)) + IF(distance.LT.distanceMin)THEN + p = pp + q = qq + distanceMin = distance + END IF ! distance.LT.distanceMin + END DO ! q = 1, nSurfSample + END DO ! p = 1, nSurfSample + PhotonSampWall(1,p,q,SurfSideID) = PhotonSampWall(1,p,q,SurfSideID) + 1.0 + PhotonSampWall(2,p,q,SurfSideID) = PhotonSampWall(2,p,q,SurfSideID) + PhotonProps%PhotonEnergy + ELSE + PhotonSampWall(1,1,1,SurfSideID) = PhotonSampWall(1,1,1,SurfSideID) + 1.0 + PhotonSampWall(2,1,1,SurfSideID) = PhotonSampWall(2,1,1,SurfSideID) + PhotonProps%PhotonEnergy + END IF ! nSurfSample.GT.1 END IF ! ForceWallSampleLoc ELSE ForceWallSampleLoc = .FALSE. @@ -1291,8 +1321,23 @@ SUBROUTINE CalcWallAbsoprtion(GlobSideID, DONE, ForceWallSample) DONE = .TRUE. ! Do not sample twice IF(.NOT.ForceWallSampleLoc)THEN - PhotonSampWall(1,SurfSideID) = PhotonSampWall(1,SurfSideID) + 1. - PhotonSampWall(2,SurfSideID) = PhotonSampWall(2,SurfSideID) + PhotonProps%PhotonEnergy + IF(nSurfSample.GT.1)THEN + distanceMin = HUGE(1.) + DO pp = 1, nSurfSample + DO qq = 1, nSurfSample + distance = VECNORM(IntersectionPos(1:3) - SurfSideSamplingMidPoints(1:3,pp,qq,SurfSideID)) + IF(distance.LT.distanceMin)THEN + p = pp + q = qq + END IF ! distance.LT.distanceMin + END DO ! q = 1, nSurfSample + END DO ! p = 1, nSurfSample + PhotonSampWall(1,p,q,SurfSideID) = PhotonSampWall(1,p,q,SurfSideID) + 1.0 + PhotonSampWall(2,p,q,SurfSideID) = PhotonSampWall(2,p,q,SurfSideID) + PhotonProps%PhotonEnergy + ELSE + PhotonSampWall(1,1,1,SurfSideID) = PhotonSampWall(1,1,1,SurfSideID) + 1.0 + PhotonSampWall(2,1,1,SurfSideID) = PhotonSampWall(2,1,1,SurfSideID) + PhotonProps%PhotonEnergy + END IF ! nSurfSample.GT.1 END IF ! .NOT.ForceWallSampleLoc END IF END SUBROUTINE CalcWallAbsoprtion diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_vars.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_vars.f90 index 50dabc905..f92dabfeb 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_vars.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_vars.f90 @@ -32,11 +32,13 @@ MODULE MOD_Photon_TrackingVars REAL :: PhotonEnergy !> INTEGER :: ElemID !> INTEGER :: WaveLength !> + !REAL :: nSurfSampleFac !> Scaling factor: nSurfSampleFac= 1.0/(nSurfSample**2) + REAL :: PhotonStartPos(3) !> super sampled ray path END TYPE TYPE (tPhotonProps) :: PhotonProps !> -REAL, ALLOCATABLE :: PhotonSampWall(:,:) +REAL, ALLOCATABLE :: PhotonSampWall(:,:,:,:) INTEGER :: PhotonModeBPO !> 0: Output nothing to PartStateBoundary.h5 !> 1: Output the initial position of the rays and their direction vector diff --git a/src/radiation/ray_tracing/raytrace.f90 b/src/radiation/ray_tracing/raytrace.f90 index 97a0fafac..6c8aff42d 100644 --- a/src/radiation/ray_tracing/raytrace.f90 +++ b/src/radiation/ray_tracing/raytrace.f90 @@ -53,7 +53,7 @@ SUBROUTINE RayTracing() USE MOD_Particle_Boundary_Vars ,ONLY: nComputeNodeSurfTotalSides,PartBound,SurfSide2GlobalSide USE MOD_Particle_Mesh_Vars ,ONLY: SideInfo_Shared USE MOD_Particle_Boundary_Tools ,ONLY: StoreBoundaryParticleProperties -USE MOD_Particle_Boundary_Vars ,ONLY: PartStateBoundary,nVarPartStateBoundary +USE MOD_Particle_Boundary_Vars ,ONLY: PartStateBoundary,nVarPartStateBoundary,nSurfSample USE MOD_Photon_TrackingOutput ,ONLY: WritePhotonSurfSampleToHDF5,WritePhotonVolSampleToHDF5 #if USE_MPI USE MOD_MPI_Shared_Vars @@ -76,7 +76,7 @@ SUBROUTINE RayTracing() LOGICAL :: FoundComputeNodeSurfSide INTEGER :: ALLOCSTAT REAL :: RectPower -REAL :: StartT,EndT ! Timer +REAL :: StartT,EndT ! Timer !=================================================================================================================================== IF(RayPartBound.EQ.0) RETURN @@ -86,7 +86,7 @@ SUBROUTINE RayTracing() ! Allocate arrays ALLOCATE(RayElemPassedEnergy(RayElemSize,1:nGlobalElems)) RayElemPassedEnergy=0.0 -ALLOCATE(PhotonSampWall(2,1:nComputeNodeSurfTotalSides)) +ALLOCATE(PhotonSampWall(2,1:nSurfSample,1:nSurfSample,1:nComputeNodeSurfTotalSides)) PhotonSampWall=0.0 #if USE_MPI diff --git a/src/radiation/ray_tracing/raytrace_ini.f90 b/src/radiation/ray_tracing/raytrace_ini.f90 index 7581bddfe..d1123b3f2 100644 --- a/src/radiation/ray_tracing/raytrace_ini.f90 +++ b/src/radiation/ray_tracing/raytrace_ini.f90 @@ -179,40 +179,40 @@ SUBROUTINE InitHighOrderRaySampling() !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES INTEGER :: Nloc,iElem,CNElemID -LOGICAL,PARAMETER :: debugRay=.FALSE. +LOGICAL,PARAMETER :: debugRay=.TRUE. !=================================================================================================================================== ALLOCATE(N_DG_Ray(nElems)) N_DG_Ray = PP_N IF(debugRay)THEN N_DG_Ray = Ray%Nmax DO iElem = 1, PP_nElems - CNElemID = GetCNElemID(iElem) - ASSOCIATE( & - x => ElemBaryNGeo(1,CNElemID),& - y => ElemBaryNGeo(2,CNElemID),& - z => ElemBaryNGeo(3,CNElemID)) - IF(y+z.GE.1.40)THEN - N_DG_Ray(iElem) = 1 - CYCLE - END IF ! y+z.GT.1.5 - - IF(y+z.LE.0.6)THEN - N_DG_Ray(iElem) = 1 - CYCLE - END IF ! y+z.LT.0.5 - - IF(y+z.LT.0.9)THEN - N_DG_Ray(iElem) = Ray%Nmax-1 - CYCLE - END IF ! y+z.GT.1.00001 - - IF(y+z.GT.1.1)THEN - N_DG_Ray(iElem) = Ray%Nmax-1 - CYCLE - END IF ! y+z.GT.1.00001 - END ASSOCIATE + CNElemID = GetCNElemID(iElem) + ASSOCIATE( & + x => ElemBaryNGeo(1,CNElemID),& + y => ElemBaryNGeo(2,CNElemID),& + z => ElemBaryNGeo(3,CNElemID)) + IF(y+z.GE.1.40)THEN + N_DG_Ray(iElem) = 1 + CYCLE + END IF ! y+z.GT.1.5 + + IF(y+z.LE.0.6)THEN + N_DG_Ray(iElem) = 1 + CYCLE + END IF ! y+z.LT.0.5 + + IF(y+z.LT.0.9)THEN + N_DG_Ray(iElem) = Ray%Nmax-1 + CYCLE + END IF ! y+z.GT.1.00001 + + IF(y+z.GT.1.1)THEN + N_DG_Ray(iElem) = Ray%Nmax-1 + CYCLE + END IF ! y+z.GT.1.00001 + END ASSOCIATE END DO ! iElem = 1, PP_nElems - END IF ! debugRay +END IF ! debugRay ! Allocate interpolation variables ALLOCATE(N_Inter_Ray(Ray%Nmin:Ray%Nmax)) From de7541eb5f54e63009988ab492f69f44025149e8 Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Tue, 27 Jun 2023 01:02:33 +0200 Subject: [PATCH 097/495] Secondary electron insertion based on the raytracing information as a separate routine --- .../analyze.ini | 20 +- .../parameter.ini | 29 +-- .../boundary/particle_boundary_init.f90 | 21 ++ .../boundary/particle_boundary_vars.f90 | 3 + .../dsmc/dsmc_chemical_reactions.f90 | 2 +- src/particles/emission/particle_emission.f90 | 3 + .../emission/particle_emission_tools.f90 | 19 +- .../emission/particle_photoionization.f90 | 209 ++++++++++++++++++ .../particle_position_and_velocity.f90 | 4 +- .../emission/particle_surface_flux_init.f90 | 10 +- .../tracking/radtrans_tracking_output.f90 | 6 +- src/radiation/ray_tracing/raytrace_ini.f90 | 4 +- 12 files changed, 276 insertions(+), 54 deletions(-) create mode 100644 src/particles/emission/particle_photoionization.f90 diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/analyze.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/analyze.ini index 11234d391..9334f41fe 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/analyze.ini +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/analyze.ini @@ -1,9 +1,9 @@ ! compare column -!compare_column_file = PartAnalyze.csv ! data file name -!compare_column_reference_file = Electrons_ref.csv ! data file name -!compare_column_index = 9 ! column index for comparison -!compare_column_tolerance_value = 1e9 ! tolerance (depends on machine accuracy and MPI) -!compare_column_tolerance_type = absolute ! absolute or relative tolerance +compare_column_file = PartAnalyze.csv ! data file name +compare_column_reference_file = Electrons_ref.csv ! data file name +compare_column_index = 9 ! column index for comparison +compare_column_tolerance_value = 1e9 ! tolerance (depends on machine accuracy and MPI) +compare_column_tolerance_type = absolute ! absolute or relative tolerance ! integrate columns x:y in a data file as integral(y(x), x, x(1), x(end)) !integrate_line_file = SurfaceAnalyze.csv ! data file name @@ -13,9 +13,9 @@ !integrate_line_tolerance_type = absolute ! special option ! hdf5 diff -h5diff_file = photoionization_RadiationSurfState.h5 , photoionization_RadiationVolState.h5 -h5diff_reference_file = reference_RadiationSurfState.h5 , reference_RadiationVolState.h5 -h5diff_data_set = SurfaceData , ElemData -h5diff_tolerance_value = 10E-2 , 10E-1 -h5diff_tolerance_type = relative , relative +!h5diff_file = photoionization_RadiationSurfState.h5 , photoionization_RadiationVolState.h5 +!h5diff_reference_file = reference_RadiationSurfState.h5 , reference_RadiationVolState.h5 +!h5diff_data_set = SurfaceData , ElemData +!h5diff_tolerance_value = 10E-2 , 10E-1 +!h5diff_tolerance_type = relative , relative !h5diff_max_differences = 5 diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini index 2293f07fb..a91003b93 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini @@ -44,8 +44,8 @@ CalcElectronSEE = T ! CALCULATION ! =============================================================================== ! ManualTimeStep = 5.0E-9 -tend = 5.0E-9 -Analyze_dt = 5.0E-9 +tend = 100.0E-9 +Analyze_dt = 100.0E-9 PIC-DoDeposition = F @@ -79,34 +79,28 @@ Part-maxParticleNumber = 4000000 Part-nBounds = 6 Part-Boundary1-SourceName = BC_periodicx- -!Part-Boundary1-Condition = periodic -!Part-Boundary1-Condition = open Part-Boundary1-Condition = reflective Part-Boundary1-PhotonEnACC = 1.0 Part-Boundary2-SourceName = BC_periodicx+ -!Part-Boundary2-Condition = periodic -!Part-Boundary2-Condition = open Part-Boundary2-Condition = reflective Part-Boundary2-PhotonEnACC = 1.0 Part-Boundary3-SourceName = BC_periodicy- -!Part-Boundary3-Condition = periodic -!Part-Boundary3-Condition = open Part-Boundary3-Condition = reflective Part-Boundary3-PhotonEnACC = 1.0 Part-Boundary4-SourceName = BC_periodicy+ -!Part-Boundary4-Condition = periodic -!Part-Boundary4-Condition = open Part-Boundary4-Condition = reflective Part-Boundary4-PhotonEnACC = 1.0 Part-Boundary5-SourceName = BC_WALL -!Part-Boundary5-Condition = open Part-Boundary5-Condition = reflective -Part-Boundary5-BoundaryParticleOutput = T +Part-Boundary5-BoundaryParticleOutput = T Part-Boundary5-PhotonEnACC = 1.0 +Part-Boundary5-PhotonSEEYield = 0.1 +Part-Boundary5-PhotonSEEWorkFunction = 10 +Part-Boundary5-PhotonSEEElectronSpecies = 3 Part-Boundary5-PhotonSpecularReflection = F ! F: diffuse with PhotonEnACC, T: perfect mirror Part-Boundary6-SourceName = BC_TOP @@ -133,19 +127,20 @@ RayTracing-PulseDuration = 15e-9 RayTracing-WaveLength = 10e-9 RayTracing-Power = 1.0 RayTracing-RepetitionRate = 1000 -RayTracing-RayDirection = (/ 0. , 1.0 , -1.0 /) +RayTracing-RayDirection = (/ 0. , 0.0 , -1.0 /) -! SEE parameters -RayTracing-WorkFunctionSEE = 10.0 -RayTracing-YieldSEE = 0.1 +! SEE parameters (read-in per BC, see above) +!RayTracing-WorkFunctionSEE = 10.0 +!RayTracing-YieldSEE = 0.1 ! =============================================================================== ! ! Weighting Factor ! =============================================================================== ! Part-Species$-MacroParticleFactor = 1e4 +Part-Species3-MacroParticleFactor = 1e7 ! Change MPF of SEE particles Part-vMPF = T -Part-Species3-Init1-MacroParticleFactor = 1e7!,1e8,1e9 +!Part-Species3-Init1-MacroParticleFactor = 1e7!,1e8,1e9 ! =============================================================================== ! ! Species1 | H2 diff --git a/src/particles/boundary/particle_boundary_init.f90 b/src/particles/boundary/particle_boundary_init.f90 index 619e3ec2e..91b003759 100644 --- a/src/particles/boundary/particle_boundary_init.f90 +++ b/src/particles/boundary/particle_boundary_init.f90 @@ -94,6 +94,15 @@ SUBROUTINE DefineParametersParticleBoundary() CALL prms%CreateRealOption( 'Part-Boundary[$]-PhotonEnACC' & , 'Energy accommodation coefficient of reflective photon boundary [$].' & , '0.', numberedmulti=.TRUE.) +CALL prms%CreateRealOption( 'Part-Boundary[$]-PhotonSEEYield' & + , 'Secondary photo-electron yield [$].' & + , '0.', numberedmulti=.TRUE.) +CALL prms%CreateRealOption( 'Part-Boundary[$]-PhotonSEEWorkFunction' & + , 'Secondary photo-electron work function [$].' & + , '0.', numberedmulti=.TRUE.) +CALL prms%CreateIntOption( 'Part-Boundary[$]-PhotonSEEElectronSpecies' & + , 'Secondary photo-electron species index [$].' & + , '0', numberedmulti=.TRUE.) CALL prms%CreateLogicalOption( 'Part-Boundary[$]-PhotonSpecularReflection' & , 'Momentum accommodation coefficient of reflective particle boundary [$].' & , '.FALSE.', numberedmulti=.TRUE.) @@ -238,6 +247,12 @@ SUBROUTINE InitializeVariablesPartBoundary() PartBound%ElecACC = -1. ALLOCATE(PartBound%PhotonEnACC( 1:nPartBound)) PartBound%PhotonEnACC = -1. +ALLOCATE(PartBound%PhotonSEEYield( 1:nPartBound)) +PartBound%PhotonSEEYield = 0. +ALLOCATE(PartBound%PhotonSEEWorkFunction( 1:nPartBound)) +PartBound%PhotonSEEWorkFunction = 0. +ALLOCATE(PartBound%PhotonSEEElectronSpecies( 1:nPartBound)) +PartBound%PhotonSEEElectronSpecies = 0 ALLOCATE(PartBound%PhotonSpecularReflection(1:nPartBound)) ALLOCATE(PartBound%Resample( 1:nPartBound)) PartBound%Resample = .FALSE. @@ -334,6 +349,9 @@ SUBROUTINE InitializeVariablesPartBoundary() PartBound%WallVelo(1:3,iPartBound) = GETREALARRAY('Part-Boundary'//TRIM(hilf)//'-WallVelo',3) PartBound%RotVelo(iPartBound) = GETLOGICAL('Part-Boundary'//TRIM(hilf)//'-RotVelo') PartBound%PhotonEnACC(iPartBound) = GETREAL('Part-Boundary'//TRIM(hilf)//'-PhotonEnACC') + PartBound%PhotonSEEYield(iPartBound) = GETREAL('Part-Boundary'//TRIM(hilf)//'-PhotonSEEYield') + PartBound%PhotonSEEWorkFunction(iPartBound) = GETREAL('Part-Boundary'//TRIM(hilf)//'-PhotonSEEWorkFunction') + PartBound%PhotonSEEElectronSpecies(iPartBound) = GETINT('Part-Boundary'//TRIM(hilf)//'-PhotonSEEElectronSpecies') PartBound%PhotonSpecularReflection(iPartBound) = GETLOGICAL('Part-Boundary'//TRIM(hilf)//'-PhotonSpecularReflection') IF(PartBound%RotVelo(iPartBound)) THEN RotFreq = GETREAL('Part-Boundary'//TRIM(hilf)//'-RotFreq') @@ -1226,6 +1244,9 @@ SUBROUTINE FinalizeParticleBoundary() SDEALLOCATE(PartBound%WallVelo) SDEALLOCATE(PartBound%RotVelo) SDEALLOCATE(PartBound%PhotonEnACC) +SDEALLOCATE(PartBound%PhotonSEEYield) +SDEALLOCATE(PartBound%PhotonSEEWorkFunction) +SDEALLOCATE(PartBound%PhotonSEEElectronSpecies) SDEALLOCATE(PartBound%PhotonSpecularReflection) SDEALLOCATE(PartBound%RotOmega) SDEALLOCATE(PartBound%RotPeriodicAngle) diff --git a/src/particles/boundary/particle_boundary_vars.f90 b/src/particles/boundary/particle_boundary_vars.f90 index a17337edb..7c531c4ec 100644 --- a/src/particles/boundary/particle_boundary_vars.f90 +++ b/src/particles/boundary/particle_boundary_vars.f90 @@ -269,6 +269,9 @@ MODULE MOD_Particle_Boundary_Vars REAL , ALLOCATABLE :: ElecACC(:) REAL , ALLOCATABLE :: WallVelo(:,:) REAL , ALLOCATABLE :: PhotonEnACC(:) + REAL , ALLOCATABLE :: PhotonSEEYield(:) + REAL , ALLOCATABLE :: PhotonSEEWorkFunction(:) + INTEGER , ALLOCATABLE :: PhotonSEEElectronSpecies(:) LOGICAL , ALLOCATABLE :: PhotonSpecularReflection(:) LOGICAL , ALLOCATABLE :: RotVelo(:) ! Flag for rotating walls REAL , ALLOCATABLE :: RotOmega(:,:) ! Angular velocity diff --git a/src/particles/dsmc/dsmc_chemical_reactions.f90 b/src/particles/dsmc/dsmc_chemical_reactions.f90 index 18efdbde1..b54bbc18c 100644 --- a/src/particles/dsmc/dsmc_chemical_reactions.f90 +++ b/src/particles/dsmc/dsmc_chemical_reactions.f90 @@ -1921,7 +1921,7 @@ FUNCTION GetRotatedVector(VeloVec,NormVec) REAL :: RandVal, v(1:3) REAL :: Theta, Theta_temp REAL :: PDF_temp -REAL, PARAMETER :: PDF_max=4./ACOS(-1.) +REAL, PARAMETER :: PDF_max=4./PI LOGICAL :: ARM_SEE_PDF !=================================================================================================================================== v = UNITVECTOR(VeloVec) diff --git a/src/particles/emission/particle_emission.f90 b/src/particles/emission/particle_emission.f90 index 9d19810ca..d0d4a83d5 100644 --- a/src/particles/emission/particle_emission.f90 +++ b/src/particles/emission/particle_emission.f90 @@ -60,6 +60,7 @@ SUBROUTINE ParticleInserting() USE MOD_Particle_MPI_Vars ,ONLY: MPIW8TimePart,MPIW8CountPart #endif /*defined(MEASURE_MPI_WAIT)*/ USE MOD_SurfaceModel_Analyze_Vars ,ONLY: SEE,CalcElectronSEE +USE MOD_Particle_Photoionization ,ONLY: PhotoIonization_RayTracing_SEE ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -86,6 +87,8 @@ SUBROUTINE ParticleInserting() #endif /*defined(MEASURE_MPI_WAIT)*/ !=================================================================================================================================== +CALL PhotoIonization_RayTracing_SEE() + !--- Emission at time step DO i=1,nSpecies ! Species-specific time step diff --git a/src/particles/emission/particle_emission_tools.f90 b/src/particles/emission/particle_emission_tools.f90 index 34458cab2..be1a0ea78 100644 --- a/src/particles/emission/particle_emission_tools.f90 +++ b/src/particles/emission/particle_emission_tools.f90 @@ -74,10 +74,6 @@ MODULE MOD_part_emission_tools MODULE PROCEDURE CalcIntensity_Gaussian END INTERFACE -INTERFACE CalcVelocity_FromWorkFuncSEE - MODULE PROCEDURE CalcVelocity_FromWorkFuncSEE -END INTERFACE - INTERFACE DSMC_SetInternalEnr_LauxVFD MODULE PROCEDURE DSMC_SetInternalEnr_LauxVFD END INTERFACE @@ -1706,7 +1702,7 @@ PPURE FUNCTION CalcPhotonEnergy(lambda) END FUNCTION CalcPhotonEnergy -SUBROUTINE CalcVelocity_FromWorkFuncSEE(FractNbr, Vec3D, iInit) +SUBROUTINE CalcVelocity_FromWorkFuncSEE(W, m, t_vec, n_vec, Vec3D) !=================================================================================================================================== !> Subroutine to sample photon SEE electrons velocities from given energy distribution based on a work function. !> Perform ARM for the energy distribution and a second ARM for the emission angle (between the impacting photon and the emitting @@ -1719,8 +1715,8 @@ SUBROUTINE CalcVelocity_FromWorkFuncSEE(FractNbr, Vec3D, iInit) IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES -INTEGER,INTENT(IN) :: FractNbr -INTEGER,INTENT(IN), OPTIONAL :: iInit +REAL,INTENT(IN) :: W, m ! Work function, mass +REAL,INTENT(IN) :: t_vec(3), n_vec(3) ! Tangential and normal vector !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES REAL,INTENT(OUT) :: Vec3D(3) @@ -1730,17 +1726,12 @@ SUBROUTINE CalcVelocity_FromWorkFuncSEE(FractNbr, Vec3D, iInit) REAL :: E_temp, E_max, VeloABS REAL :: Theta, Chi!, Psi_temp REAL :: PDF_temp, PDF_max -REAL, PARAMETER :: PDF_max2=4./ACOS(-1.) +REAL, PARAMETER :: PDF_max2=4./PI REAL :: VeloVec_norm(3), RotationAxi(3) LOGICAL :: ARM_SEE_PDF REAL :: Theta_temp !=================================================================================================================================== -ASSOCIATE( W => Species(FractNbr)%Init(iInit)%WorkFunctionSEE ,& - m => Species(FractNbr)%MassIC ,& - t_vec => Species(FractNbr)%Init(iInit)%NormalVector1IC ,& - n_vec => Species(FractNbr)%Init(iInit)%NormalIC ) - ! ARM for energy distribution E_max = 50.0 ! in eV (arbitrary) PDF_max = 81.0 / (128.0 * W) ! PDF_max at E = W/3 (derivation of 6W^2E/(E+W)^4 == 0) @@ -1785,8 +1776,6 @@ SUBROUTINE CalcVelocity_FromWorkFuncSEE(FractNbr, Vec3D, iInit) ! Calc VeloVec Vec3D = VeloVec_norm * VeloABS -END ASSOCIATE - END SUBROUTINE CalcVelocity_FromWorkFuncSEE diff --git a/src/particles/emission/particle_photoionization.f90 b/src/particles/emission/particle_photoionization.f90 new file mode 100644 index 000000000..2229ff870 --- /dev/null +++ b/src/particles/emission/particle_photoionization.f90 @@ -0,0 +1,209 @@ +!================================================================================================================================== +! Copyright (c) 2023 boltzplatz - numerical plasma dynamics GmbH +! +! This file is part of PICLas (piclas.boltzplatz.eu/piclas/piclas). PICLas is free software: you can redistribute it and/or modify +! it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 +! of the License, or (at your option) any later version. +! +! PICLas is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty +! of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License v3.0 for more details. +! +! You should have received a copy of the GNU General Public License along with PICLas. If not, see . +!================================================================================================================================== +#include "piclas.h" + +MODULE MOD_Particle_Photoionization +!=================================================================================================================================== +!> Module for particle insertion through photo-ionization +!=================================================================================================================================== +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +PRIVATE +!----------------------------------------------------------------------------------------------------------------------------------- +! GLOBAL VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! Private Part --------------------------------------------------------------------------------------------------------------------- +! Public Part ---------------------------------------------------------------------------------------------------------------------- +PUBLIC :: PhotoIonization_RayTracing_SEE +!=================================================================================================================================== +CONTAINS + +SUBROUTINE PhotoIonization_RayTracing_SEE() +!=================================================================================================================================== +!> Routine calculates the number of secondary electrons to be emitted and inserts them on the surface, utilizing the cell-local +!> photon energy from the raytracing +!=================================================================================================================================== +! MODULES ! +!----------------------------------------------------------------------------------------------------------------------------------! +USE MOD_Globals +USE MOD_Globals_Vars ,ONLY: PI +USE MOD_Timedisc_Vars ,ONLY: dt,time +USE MOD_Particle_Boundary_Vars ,ONLY: nSurfSample, Partbound, SurfSide2GlobalSide, DoBoundaryParticleOutputHDF5 +USE MOD_Particle_Vars ,ONLY: Species, PartState +USE MOD_RayTracing_Vars ,ONLY: Ray +USE MOD_part_emission_tools ,ONLY: CalcPhotonEnergy +USE MOD_Particle_Mesh_Vars ,ONLY: SideInfo_Shared +USE MOD_Particle_Surfaces_Vars ,ONLY: BezierControlPoints3D, BezierSampleXi +USE MOD_Particle_Surfaces ,ONLY: EvaluateBezierPolynomialAndGradient, CalcNormAndTangBezier +USE MOD_Mesh_Vars ,ONLY: NGeo +USE MOD_part_emission_tools ,ONLY: CalcVelocity_FromWorkFuncSEE +USE MOD_Particle_Boundary_Tools ,ONLY: StoreBoundaryParticleProperties +USE MOD_part_operations ,ONLY: CreateParticle +#ifdef LSERK +USE MOD_Timedisc_Vars ,ONLY: iStage, RK_c, nRKStages +#endif +#if USE_MPI +USE MOD_Particle_Boundary_Vars ,ONLY: SurfSideArea_Shared,nComputeNodeSurfTotalSides +USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall_Shared +#else +USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall +USE MOD_Particle_Boundary_Vars ,ONLY: SurfSideArea,nSurfTotalSides +#endif /*USE_MPI*/ +#if USE_HDG +USE MOD_HDG_Vars ,ONLY: UseFPC,FPC,UseEPC,EPC +USE MOD_Mesh_Vars ,ONLY: BoundaryType +#endif /*USE_HDG*/ +!----------------------------------------------------------------------------------------------------------------------------------! +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +! INPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------! +! OUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +REAL :: t_1, t_2, E_Intensity +INTEGER :: NbrOfRepetitions, firstSide, lastSide, SideID, iSample, GlobElemID, PartID +INTEGER :: GlobalSideID, iSurfSide, p, q, BCID, SpecID, iPart +REAL :: NbrOfSEE, TimeScalingFactor +REAL :: Particle_pos(1:3), xi(2) +REAL :: RandVal2(2), xiab(1:2,1:2), nVec(3), tang1(3), tang2(3), Velo3D(3) +#if USE_HDG +INTEGER :: iBC,iUniqueFPCBC,iUniqueEPCBC,BCState +#endif /*USE_HDG*/ +!=================================================================================================================================== + +! TODO: Copied here from InitParticleMesh, which is only build if not TriaSurfaceFlux +IF(.NOT.ALLOCATED(BezierSampleXi)) ALLOCATE(BezierSampleXi(0:nSurfSample)) +DO iSample=0,nSurfSample + BezierSampleXi(iSample)=-1.+2.0/nSurfSample*iSample +END DO + +! Surf sides are shared, array calculation can be distributed +#if USE_MPI +firstSide = INT(REAL( myComputeNodeRank )*REAL(nComputeNodeSurfTotalSides)/REAL(nComputeNodeProcessors))+1 +lastSide = INT(REAL((myComputeNodeRank+1))*REAL(nComputeNodeSurfTotalSides)/REAL(nComputeNodeProcessors)) +#else +firstSide = 1 +lastSide = nSurfTotalSides +#endif /*USE_MPI*/ + +ASSOCIATE( tau => Ray%PulseDuration ,& + tShift => Ray%tShift ,& + lambda => Ray%WaveLength ,& + Period => Ray%Period) + + ! Temporal bound of integration +#ifdef LSERK +IF (iStage.EQ.1) THEN +t_1 = Time +t_2 = Time + RK_c(2) * dt +ELSE + IF (iStage.NE.nRKStages) THEN + t_1 = Time + RK_c(iStage) * dt + t_2 = Time + RK_c(iStage+1) * dt + ELSE + t_1 = Time + RK_c(iStage) * dt + t_2 = Time + dt + END IF +END IF +#else +t_1 = Time +t_2 = Time + dt +#endif + +! Calculate the current pulse +NbrOfRepetitions = INT(Time/Period) + +! Add arbitrary time shift (-4 sigma_t) so that I_max is not at t=0s +! Note that sigma_t = tau / sqrt(2) +t_1 = t_1 - tShift - NbrOfRepetitions * Period +t_2 = t_2 - tShift - NbrOfRepetitions * Period + +! check if t_2 is outside of the pulse +IF(t_2.GT.2.0*tShift) t_2 = 2.0*tShift + +TimeScalingFactor = 0.5 * SQRT(PI) * tau * (ERF(t_2/tau)-ERF(t_1/tau)) + +DO iSurfSide = firstSide, lastSide + SideID = SurfSide2GlobalSide(SURF_SIDEID,iSurfSide) + ! TODO: Skip sides which are not mine in the MPI case + BCID = PartBound%MapToPartBC(SideInfo_Shared(SIDE_BCID,SideID)) + ! Skip non-reflective BC sides + IF(PartBound%TargetBoundCond(BCID).NE.PartBound%ReflectiveBC) CYCLE + ! Skip BC sides with zero yield + IF(PartBound%PhotonSEEYield(BCID).LE.0.) CYCLE + ! Determine which species is to be inserted + SpecID = PartBound%PhotonSEEElectronSpecies(BCID) + ! Determine which element the particles are going to be inserted + GlobElemID = SideInfo_Shared(SIDE_ELEMID ,SideID) + DO p = 1, nSurfSample + DO q = 1, nSurfSample + ! Calculate the number of SEEs per subside + E_Intensity = PhotonSampWall(2,p,q,iSurfSide) * TimeScalingFactor + NbrOfSEE = E_Intensity / CalcPhotonEnergy(lambda) * PartBound%PhotonSEEYield(BCID) / Species(SpecID)%MacroParticleFactor + ! TODO: NINT Correction + ! Calculate the normal & tangential vectors + xi(1)=(BezierSampleXi(p-1)+BezierSampleXi(p))/2. ! (a+b)/2 + xi(2)=(BezierSampleXi(q-1)+BezierSampleXi(q))/2. ! (a+b)/2 + xiab(1,1:2)=(/BezierSampleXi(p-1),BezierSampleXi(p)/) + xiab(2,1:2)=(/BezierSampleXi(q-1),BezierSampleXi(q)/) + CALL CalcNormAndTangBezier(nVec,tang1,tang2,xi(1),xi(2),SideID) + ! Normal vector provided by the routine points outside of the domain + nVec = -nVec + ! Loop over number of particles to be inserted + DO iPart = 1, NINT(NbrOfSEE) + ! Determine particle position within the sub-side + CALL RANDOM_NUMBER(RandVal2) + xi=(xiab(:,2)-xiab(:,1))*RandVal2+xiab(:,1) + CALL EvaluateBezierPolynomialAndGradient(xi,NGeo,3,BezierControlPoints3D(1:3,0:NGeo,0:NGeo,SideID),Point=Particle_pos(1:3)) + ! Determine particle velocity + CALL CalcVelocity_FromWorkFuncSEE(PartBound%PhotonSEEWorkFunction(BCID), Species(SpecID)%MassIC, tang1, nVec, Velo3D) + ! Create new particle + CALL CreateParticle(SpecID,Particle_pos(1:3),GlobElemID,Velo3D(1:3),0.,0.,0.,NewPartID=PartID,NewMPF=Species(SpecID)%MacroParticleFactor) + ! 1. Store the particle information in PartStateBoundary.h5 + IF(DoBoundaryParticleOutputHDF5) THEN + CALL StoreBoundaryParticleProperties(PartID,SpecID,PartState(1:3,PartID),& + UNITVECTOR(PartState(4:6,PartID)),nVec,iPartBound=BCID,mode=2,MPF_optIN=Species(SpecID)%MacroParticleFactor) + END IF ! DoBoundaryParticleOutputHDF5 +#if USE_HDG + ! 2. Check if floating boundary conditions (FPC) are used and consider electron holes + IF(UseFPC)THEN + iBC = PartBound%MapToFieldBC(BCID) + IF(iBC.LE.0) CALL abort(__STAMP__,'iBC = PartBound%MapToFieldBC(PartBCIndex) must be >0',IntInfoOpt=iBC) + IF(BoundaryType(iBC,BC_TYPE).EQ.20)THEN ! BCType = BoundaryType(iBC,BC_TYPE) + BCState = BoundaryType(iBC,BC_STATE) ! State is iFPC + iUniqueFPCBC = FPC%Group(BCState,2) + FPC%ChargeProc(iUniqueFPCBC) = FPC%ChargeProc(iUniqueFPCBC) - Species(SpecID)%ChargeIC * Species(SpecID)%MacroParticleFactor ! Use negative charge! + END IF ! BCType.EQ.20 + END IF ! UseFPC + ! 3. Check if electric potential condition (EPC) are used and consider electron holes + IF(UseEPC)THEN + iBC = PartBound%MapToFieldBC(BCID) + IF(iBC.LE.0) CALL abort(__STAMP__,'iBC = PartBound%MapToFieldBC(PartBCIndex) must be >0',IntInfoOpt=iBC) + IF(BoundaryType(iBC,BC_TYPE).EQ.8)THEN ! BCType = BoundaryType(iBC,BC_TYPE) + BCState = BoundaryType(iBC,BC_STATE) ! State is iEPC + iUniqueEPCBC = EPC%Group(BCState,2) + EPC%ChargeProc(iUniqueEPCBC) = EPC%ChargeProc(iUniqueEPCBC) - Species(SpecID)%ChargeIC * Species(SpecID)%MacroParticleFactor ! Use negative charge! + END IF ! BCType.EQ.8 + END IF ! UseEPC +#endif /*USE_HDG*/ + END DO + END DO ! q = 1, nSurfSample + END DO ! p = 1, nSurfSample +END DO + +END ASSOCIATE + +END SUBROUTINE PhotoIonization_RayTracing_SEE + +END MODULE MOD_Particle_Photoionization \ No newline at end of file diff --git a/src/particles/emission/particle_position_and_velocity.f90 b/src/particles/emission/particle_position_and_velocity.f90 index 1e9715970..4570a5846 100644 --- a/src/particles/emission/particle_position_and_velocity.f90 +++ b/src/particles/emission/particle_position_and_velocity.f90 @@ -462,7 +462,9 @@ SUBROUTINE SetParticleVelocity(FractNbr,iInit,NbrOfParticle) DO i = 1,NbrOfParticle PositionNbr = PDM%nextFreePosition(i+PDM%CurrentNextFreePosition) IF (PositionNbr .NE. 0) THEN - CALL CalcVelocity_FromWorkFuncSEE(FractNbr, Vec3D, iInit=iInit) + CALL CalcVelocity_FromWorkFuncSEE(Species(FractNbr)%Init(iInit)%WorkFunctionSEE, & + Species(FractNbr)%MassIC, Species(FractNbr)%Init(iInit)%NormalVector1IC, & + Species(FractNbr)%Init(iInit)%NormalIC, Vec3D(1:3)) PartState(4:6,PositionNbr) = Vec3D(1:3) ASSOCIATE( PartBCIndex => Species(FractNbr)%Init(iInit)%PartBCIndex) diff --git a/src/particles/emission/particle_surface_flux_init.f90 b/src/particles/emission/particle_surface_flux_init.f90 index c52bb45e1..5cac18d9b 100644 --- a/src/particles/emission/particle_surface_flux_init.f90 +++ b/src/particles/emission/particle_surface_flux_init.f90 @@ -629,9 +629,8 @@ SUBROUTINE BCSurfMeshSideAreasandNormals() iLocSide = SideToElem(S2E_LOC_SIDE_ID,BCSideID) SideID=GetGlobalNonUniqueSideID(offsetElem+ElemID,iLocSide) IF (TriaSurfaceFlux) THEN - IF (SurfFluxSideSize(1).NE.1 .OR. SurfFluxSideSize(2).NE.2) CALL abort(& -__STAMP__& -, 'SurfFluxSideSize must be 1,2 for TriaSurfaceFlux!') + IF (SurfFluxSideSize(1).NE.1 .OR. SurfFluxSideSize(2).NE.2) CALL abort(__STAMP__,& + 'SurfFluxSideSize must be 1,2 for TriaSurfaceFlux!') DO jSample=1,SurfFluxSideSize(2); DO iSample=1,SurfFluxSideSize(1) CALL CalcNormAndTangTriangle(SideID=SideID,nVec=tmp_Vec_nOut(:,iSample,jSample) & ,tang1=tmp_Vec_t1(:,iSample,jSample) & @@ -641,9 +640,8 @@ SUBROUTINE BCSurfMeshSideAreasandNormals() SurfMeshSideAreas(BCSideID)=SurfMeshSideAreas(BCSideID)+tmp_SubSideAreas(iSample,jSample) END DO; END DO ELSE - IF (ANY(SurfFluxSideSize.NE.BezierSampleN)) CALL abort(& -__STAMP__& -, 'SurfFluxSideSize must be BezierSampleN,BezierSampleN for .NOT.TriaSurfaceFlux!') + IF (ANY(SurfFluxSideSize.NE.BezierSampleN)) CALL abort(__STAMP__,& + 'SurfFluxSideSize must be BezierSampleN,BezierSampleN for .NOT.TriaSurfaceFlux!') CALL GetBezierSampledAreas(SideID=SideID & ,BezierSampleN=BezierSampleN & ,SurfMeshSubSideAreas=tmp_SubSideAreas & diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 index 1fac19736..e266c6f0d 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 @@ -188,7 +188,7 @@ SUBROUTINE WritePhotonSurfSampleToHDF5() USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall USE MOD_Particle_Boundary_Vars ,ONLY: SurfSideArea #endif /*USE_MPI*/ -USE MOD_Particle_Boundary_Vars ,ONLY: nSurfSample +USE MOD_Particle_Boundary_Vars ,ONLY: nSurfSample, PartBound !----------------------------------------------------------------------------------------------------------------------------------! ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -202,7 +202,7 @@ SUBROUTINE WritePhotonSurfSampleToHDF5() CHARACTER(LEN=4),PARAMETER :: NodeTypeTemp = 'VISU' CHARACTER(LEN=255),ALLOCATABLE :: Str2DVarNames(:) INTEGER :: GlobalSideID, iSurfSide, OutputCounter, SurfSideNb, p, q -INTEGER,PARAMETER :: nVar2D=2 +INTEGER,PARAMETER :: nVar2D=3 REAL :: tstart,tend REAL, ALLOCATABLE :: helpArray(:,:,:,:) !=================================================================================================================================== @@ -241,6 +241,7 @@ SUBROUTINE WritePhotonSurfSampleToHDF5() ! fill varnames for total values Str2DVarNames(1) ='PhotonCount' Str2DVarNames(2) ='HeatFlux' + Str2DVarNames(3) ='iBC' CALL WriteAttributeToHDF5(File_ID,'VarNamesSurface',nVar2D,StrArray=Str2DVarNames) @@ -287,6 +288,7 @@ SUBROUTINE WritePhotonSurfSampleToHDF5() DO p = 1, nSurfSample DO q = 1, nSurfSample helpArray(2,p,q,OutputCounter) = PhotonSampWall(2,p,q,iSurfSide)/SurfSideArea(p,q,iSurfSide) + helpArray(3,p,q,OutputCounter) = PartBound%MapToPartBC(SideInfo_Shared(SIDE_BCID,GlobalSideID)) END DO ! q = 1, nSurfSample END DO ! p = 1, nSurfSample END DO diff --git a/src/radiation/ray_tracing/raytrace_ini.f90 b/src/radiation/ray_tracing/raytrace_ini.f90 index d1123b3f2..9860cace9 100644 --- a/src/radiation/ray_tracing/raytrace_ini.f90 +++ b/src/radiation/ray_tracing/raytrace_ini.f90 @@ -126,7 +126,7 @@ SUBROUTINE InitRayTracing() E0 = Ray%Power / Ray%RepetitionRate ! Rectangle - ! Ray emission area + ! TODO: Ray emission area from chosen boundary surface? A = (GEO%xmaxglob-GEO%xminglob) * (GEO%ymaxglob-GEO%yminglob) ! Normal vector of the ray emission area SurfaceNormal = (/ 0., 0., 1. /) @@ -179,7 +179,7 @@ SUBROUTINE InitHighOrderRaySampling() !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES INTEGER :: Nloc,iElem,CNElemID -LOGICAL,PARAMETER :: debugRay=.TRUE. +LOGICAL,PARAMETER :: debugRay=.FALSE. !=================================================================================================================================== ALLOCATE(N_DG_Ray(nElems)) N_DG_Ray = PP_N From cd52731772a2fe861b87e21cfc1cb3c21c60683f Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Tue, 27 Jun 2023 01:08:51 +0200 Subject: [PATCH 098/495] Missing reference file --- .../Electrons_ref.csv | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/Electrons_ref.csv diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/Electrons_ref.csv b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/Electrons_ref.csv new file mode 100644 index 000000000..cf1bea2f0 --- /dev/null +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/Electrons_ref.csv @@ -0,0 +1,22 @@ +"Nbr. of electrons (analytical)" +0.0000000000000000E+000 +0.8899999999999994E+009 +0.5459999999999996E+010 +0.2429999999999998E+011 +0.8663999999999994E+011 +0.2525199999999998E+012 +0.6073799999999996E+012 +0.1217649999999999E+013 +0.2061439999999999E+013 +0.2999459999999998E+013 +0.3837849999999998E+013 +0.4440339999999997E+013 +0.4788419999999997E+013 +0.4950099999999997E+013 +0.5010469999999997E+013 +0.5028589999999997E+013 +0.5032959999999997E+013 +0.5033809999999997E+013 +0.5033809999999997E+013 +0.5033809999999997E+013 +0.5033809999999997E+013 From dca3deec00f8722aefb5fb02cdb7152cd3bff816 Mon Sep 17 00:00:00 2001 From: Franziska Hild Date: Tue, 27 Jun 2023 16:56:21 +0200 Subject: [PATCH 099/495] Bug fix for calculation of polyatomic vib temperature: added zero-point energy --- src/particles/bgk/bgk_colloperator.f90 | 20 +++---------------- src/particles/fp_flow/fpflow_colloperator.f90 | 2 +- 2 files changed, 4 insertions(+), 18 deletions(-) diff --git a/src/particles/bgk/bgk_colloperator.f90 b/src/particles/bgk/bgk_colloperator.f90 index 649c3b8e6..161881e7e 100644 --- a/src/particles/bgk/bgk_colloperator.f90 +++ b/src/particles/bgk/bgk_colloperator.f90 @@ -611,30 +611,16 @@ SUBROUTINE CalcInnerDOFs(nSpec, EVibSpec, ERotSpec, totalWeightSpec, TVibSpec, T IF(SpecDSMC(iSpec)%PolyatomicMol) THEN ! polyatomic iPolyatMole = SpecDSMC(iSpec)%SpecToPolyArray ! Calculation of the vibrational temperature (zero-point search) for polyatomic molecules - TVibSpec(iSpec) = CalcTVibPoly(EVibSpec(iSpec)/totalWeightSpec(iSpec), 1) - IF (TVibSpec(iSpec).GT.0.0) THEN - DO iDOF = 1, PolyatomMolDSMC(iPolyatMole)%VibDOF - ! Calculation of vibrational DOFs according to Pfeiffer et. al., AIP Conference Proceedings 2132, 100001 (2019), - ! "Extension of particle-based BGK models to polyatomic species in hypersonic flow around a flat-faced cylinder" - exparg = PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)/TVibSpec(iSpec) - IF(CHECKEXP(exparg))THEN - Xi_VibSpec(iSpec) = Xi_VibSpec(iSpec) + 2.*exparg/(EXP(exparg) - 1.) - ELSE - Xi_VibSpec(iSpec) = 0. - END IF ! CHECKEXP(exparg) - END DO - END IF + TVibSpec(iSpec) = CalcTVibPoly(EVibSpec(iSpec)/totalWeightSpec(iSpec) + SpecDSMC(iSpec)%EZeroPoint, iSpec) ELSE ! diatomic ! Calculation of vibrational temperature and DOFs from Pfeiffer, Physics of Fluids 30, 116103 (2018), "Extending the ! particle ellipsoidal statistical Bhatnagar-Gross-Krook method to diatomic molecules including quantized vibrational ! energies" ! TVibSpec = vibrational energy without zero-point energy TVibSpec(iSpec) = EVibSpec(iSpec) / (totalWeightSpec(iSpec)*BoltzmannConst*SpecDSMC(iSpec)%CharaTVib) - IF (TVibSpec(iSpec).GT.0.0) THEN - TVibSpec(iSpec) = SpecDSMC(iSpec)%CharaTVib/LOG(1. + 1./(TVibSpec(iSpec))) - Xi_VibSpec(iSpec) = 2.* EVibSpec(iSpec) / (totalWeightSpec(iSpec)*BoltzmannConst*TVibSpec(iSpec)) - END IF + IF (TVibSpec(iSpec).GT.0.0) TVibSpec(iSpec) = SpecDSMC(iSpec)%CharaTVib/LOG(1. + 1./(TVibSpec(iSpec))) END IF + IF (TVibSpec(iSpec).GT.0.0) Xi_VibSpec(iSpec) = 2.* EVibSpec(iSpec) / (totalWeightSpec(iSpec)*BoltzmannConst*TVibSpec(iSpec)) END IF Xi_RotSpec(iSpec) = SpecDSMC(iSpec)%Xi_Rot ! Calculation of rotational temperature from Pfeiffer, Physics of Fluids 30, 116103 (2018), "Extending the particle ellipsoidal diff --git a/src/particles/fp_flow/fpflow_colloperator.f90 b/src/particles/fp_flow/fpflow_colloperator.f90 index 0bff3ae3b..7948e5bef 100644 --- a/src/particles/fp_flow/fpflow_colloperator.f90 +++ b/src/particles/fp_flow/fpflow_colloperator.f90 @@ -185,7 +185,7 @@ SUBROUTINE FP_CollisionOperator(iPartIndx_Node, nPart, NodeVolume) nXiVibDOF = PolyatomMolDSMC(iPolyatMole)%VibDOF ALLOCATE(Xi_vib_DOF(nXiVibDOF)) Xi_vib_DOF(:) = 0. - TVib = CalcTVibPoly(Evib/totalWeight, 1) + TVib = CalcTVibPoly(Evib/totalWeight + SpecDSMC(iSpec)%EZeroPoint, 1) IF (TVib.GT.0.0) THEN DO iDOF = 1, PolyatomMolDSMC(iPolyatMole)%VibDOF Xi_vib = Xi_vib + 2.*PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)/TVib & From 53e2610e8614d50a7a7fa81d03c014453b0b9c3b Mon Sep 17 00:00:00 2001 From: Franziska Hild Date: Tue, 27 Jun 2023 16:58:18 +0200 Subject: [PATCH 100/495] Bug fix 2.0 - iSpec=1 for FP poly --- src/particles/fp_flow/fpflow_colloperator.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/particles/fp_flow/fpflow_colloperator.f90 b/src/particles/fp_flow/fpflow_colloperator.f90 index 7948e5bef..3918580c3 100644 --- a/src/particles/fp_flow/fpflow_colloperator.f90 +++ b/src/particles/fp_flow/fpflow_colloperator.f90 @@ -185,7 +185,7 @@ SUBROUTINE FP_CollisionOperator(iPartIndx_Node, nPart, NodeVolume) nXiVibDOF = PolyatomMolDSMC(iPolyatMole)%VibDOF ALLOCATE(Xi_vib_DOF(nXiVibDOF)) Xi_vib_DOF(:) = 0. - TVib = CalcTVibPoly(Evib/totalWeight + SpecDSMC(iSpec)%EZeroPoint, 1) + TVib = CalcTVibPoly(Evib/totalWeight + SpecDSMC(1)%EZeroPoint, 1) IF (TVib.GT.0.0) THEN DO iDOF = 1, PolyatomMolDSMC(iPolyatMole)%VibDOF Xi_vib = Xi_vib + 2.*PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)/TVib & From 5de5cc4bdb15104dc10d0ada101fa1cc291f29c3 Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Fri, 30 Jun 2023 18:01:55 +0200 Subject: [PATCH 101/495] Photon SEE: INT correction, flags for call in ParticlesInserting, SEE-specific weighting factor --- .../analyze.ini | 2 +- .../parameter.ini | 22 ++++----- .../boundary/particle_boundary_init.f90 | 48 +++++++++++++------ .../boundary/particle_boundary_vars.f90 | 3 +- src/particles/emission/particle_emission.f90 | 7 ++- .../emission/particle_emission_tools.f90 | 2 +- .../emission/particle_photoionization.f90 | 30 +++++++----- 7 files changed, 70 insertions(+), 44 deletions(-) diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/analyze.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/analyze.ini index 9334f41fe..f284670d0 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/analyze.ini +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/analyze.ini @@ -2,7 +2,7 @@ compare_column_file = PartAnalyze.csv ! data file name compare_column_reference_file = Electrons_ref.csv ! data file name compare_column_index = 9 ! column index for comparison -compare_column_tolerance_value = 1e9 ! tolerance (depends on machine accuracy and MPI) +compare_column_tolerance_value = 2e9 ! tolerance (depends on machine accuracy and MPI) compare_column_tolerance_type = absolute ! absolute or relative tolerance ! integrate columns x:y in a data file as integral(y(x), x, x(1), x(end)) diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini index a91003b93..bd7362551 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini @@ -97,11 +97,15 @@ Part-Boundary4-PhotonEnACC = 1.0 Part-Boundary5-SourceName = BC_WALL Part-Boundary5-Condition = reflective Part-Boundary5-BoundaryParticleOutput = T -Part-Boundary5-PhotonEnACC = 1.0 -Part-Boundary5-PhotonSEEYield = 0.1 -Part-Boundary5-PhotonSEEWorkFunction = 10 -Part-Boundary5-PhotonSEEElectronSpecies = 3 Part-Boundary5-PhotonSpecularReflection = F ! F: diffuse with PhotonEnACC, T: perfect mirror +Part-Boundary5-PhotonEnACC = 1.0 +Part-Boundary5-PhotonSEE-Yield = 0.1 +Part-Boundary5-PhotonSEE-WorkFunction = 10 +Part-Boundary5-PhotonSEE-ElectronSpecies= 3 + +! Change MPF of SEE particles +Part-vMPF = T +Part-Boundary5-PhotonSEE-MacroParticleFactor = 1E7,1E8 Part-Boundary6-SourceName = BC_TOP Part-Boundary6-Condition = reflective @@ -128,20 +132,10 @@ RayTracing-WaveLength = 10e-9 RayTracing-Power = 1.0 RayTracing-RepetitionRate = 1000 RayTracing-RayDirection = (/ 0. , 0.0 , -1.0 /) - -! SEE parameters (read-in per BC, see above) -!RayTracing-WorkFunctionSEE = 10.0 -!RayTracing-YieldSEE = 0.1 ! =============================================================================== ! ! Weighting Factor ! =============================================================================== ! Part-Species$-MacroParticleFactor = 1e4 - -Part-Species3-MacroParticleFactor = 1e7 -! Change MPF of SEE particles -Part-vMPF = T -!Part-Species3-Init1-MacroParticleFactor = 1e7!,1e8,1e9 - ! =============================================================================== ! ! Species1 | H2 ! =============================================================================== ! diff --git a/src/particles/boundary/particle_boundary_init.f90 b/src/particles/boundary/particle_boundary_init.f90 index 91b003759..8ec954805 100644 --- a/src/particles/boundary/particle_boundary_init.f90 +++ b/src/particles/boundary/particle_boundary_init.f90 @@ -91,21 +91,24 @@ SUBROUTINE DefineParametersParticleBoundary() CALL prms%CreateRealOption( 'Part-Boundary[$]-ElecACC ' & , 'Electronic accommodation coefficient of reflective particle boundary [$].' & , '0.', numberedmulti=.TRUE.) +CALL prms%CreateLogicalOption( 'Part-Boundary[$]-PhotonSpecularReflection' & + , 'Enables a perfect specular reflection for photons (FALSE: diffuse with PhotonEnACC) [$].' & + , '.FALSE.', numberedmulti=.TRUE.) CALL prms%CreateRealOption( 'Part-Boundary[$]-PhotonEnACC' & , 'Energy accommodation coefficient of reflective photon boundary [$].' & , '0.', numberedmulti=.TRUE.) -CALL prms%CreateRealOption( 'Part-Boundary[$]-PhotonSEEYield' & +CALL prms%CreateRealOption( 'Part-Boundary[$]-PhotonSEE-Yield' & , 'Secondary photo-electron yield [$].' & , '0.', numberedmulti=.TRUE.) -CALL prms%CreateRealOption( 'Part-Boundary[$]-PhotonSEEWorkFunction' & +CALL prms%CreateRealOption( 'Part-Boundary[$]-PhotonSEE-WorkFunction' & , 'Secondary photo-electron work function [$].' & , '0.', numberedmulti=.TRUE.) -CALL prms%CreateIntOption( 'Part-Boundary[$]-PhotonSEEElectronSpecies' & +CALL prms%CreateRealOption( 'Part-Boundary[$]-PhotonSEE-MacroParticleFactor' & + , 'Secondary photo-electron weighting factor, specific for electrons emitted from the boundary [$].' & + , '0.', numberedmulti=.TRUE.) +CALL prms%CreateIntOption( 'Part-Boundary[$]-PhotonSEE-ElectronSpecies' & , 'Secondary photo-electron species index [$].' & - , '0', numberedmulti=.TRUE.) -CALL prms%CreateLogicalOption( 'Part-Boundary[$]-PhotonSpecularReflection' & - , 'Momentum accommodation coefficient of reflective particle boundary [$].' & - , '.FALSE.', numberedmulti=.TRUE.) + , numberedmulti=.TRUE.) CALL prms%CreateLogicalOption( 'Part-Boundary[$]-Resample', & 'Sample particle properties from equilibrium distribution after reflection', '.FALSE.'& , numberedmulti=.TRUE.) @@ -181,7 +184,7 @@ SUBROUTINE InitializeVariablesPartBoundary() USE MOD_Dielectric_Vars ,ONLY: DoDielectricSurfaceCharge USE MOD_DSMC_Vars ,ONLY: useDSMC, BGGas USE MOD_Mesh_Vars ,ONLY: BoundaryName,BoundaryType, nBCs -USE MOD_Particle_Vars ,ONLY: PDM, nSpecies, PartMeshHasPeriodicBCs, RotRefFrameAxis, SpeciesDatabase, Species +USE MOD_Particle_Vars ,ONLY: PDM, nSpecies, PartMeshHasPeriodicBCs, RotRefFrameAxis, SpeciesDatabase, Species, usevMPF USE MOD_SurfaceModel_Vars ,ONLY: nPorousBC USE MOD_Particle_Boundary_Vars ,ONLY: PartBound,nPartBound,DoBoundaryParticleOutputHDF5,PartStateBoundary, AdaptWallTemp USE MOD_Particle_Tracking_Vars ,ONLY: TrackingMethod @@ -245,23 +248,31 @@ SUBROUTINE InitializeVariablesPartBoundary() PartBound%RotACC = -1. ALLOCATE(PartBound%ElecACC( 1:nPartBound)) PartBound%ElecACC = -1. +! Photon reflection +ALLOCATE(PartBound%PhotonSpecularReflection(1:nPartBound)) +PartBound%PhotonSpecularReflection = .FALSE. ALLOCATE(PartBound%PhotonEnACC( 1:nPartBound)) PartBound%PhotonEnACC = -1. +! Photon SEE ALLOCATE(PartBound%PhotonSEEYield( 1:nPartBound)) PartBound%PhotonSEEYield = 0. -ALLOCATE(PartBound%PhotonSEEWorkFunction( 1:nPartBound)) +ALLOCATE(PartBound%PhotonSEEWorkFunction(1:nPartBound)) PartBound%PhotonSEEWorkFunction = 0. -ALLOCATE(PartBound%PhotonSEEElectronSpecies( 1:nPartBound)) +ALLOCATE(PartBound%PhotonSEEMacroParticleFactor(1:nPartBound)) +PartBound%PhotonSEEMacroParticleFactor = 0. +ALLOCATE(PartBound%PhotonSEEElectronSpecies(1:nPartBound)) PartBound%PhotonSEEElectronSpecies = 0 -ALLOCATE(PartBound%PhotonSpecularReflection(1:nPartBound)) ALLOCATE(PartBound%Resample( 1:nPartBound)) PartBound%Resample = .FALSE. +! Linear wall velocity ALLOCATE(PartBound%WallVelo( 1:3,1:nPartBound)) PartBound%WallVelo = 0. +! Rotational wall velocity ALLOCATE(PartBound%RotVelo( 1:nPartBound)) PartBound%RotVelo = .FALSE. ALLOCATE(PartBound%RotOmega( 1:3,1:nPartBound)) PartBound%RotOmega = 0. +! Rotational periodic BC ALLOCATE(PartBound%RotPeriodicAngle( 1:nPartBound)) PartBound%RotPeriodicAngle = 0 ALLOCATE(PartBound%RotPeriodicMin( 1:nPartBound)) @@ -348,11 +359,18 @@ SUBROUTINE InitializeVariablesPartBoundary() PartBound%Resample(iPartBound) = GETLOGICAL('Part-Boundary'//TRIM(hilf)//'-Resample') PartBound%WallVelo(1:3,iPartBound) = GETREALARRAY('Part-Boundary'//TRIM(hilf)//'-WallVelo',3) PartBound%RotVelo(iPartBound) = GETLOGICAL('Part-Boundary'//TRIM(hilf)//'-RotVelo') - PartBound%PhotonEnACC(iPartBound) = GETREAL('Part-Boundary'//TRIM(hilf)//'-PhotonEnACC') - PartBound%PhotonSEEYield(iPartBound) = GETREAL('Part-Boundary'//TRIM(hilf)//'-PhotonSEEYield') - PartBound%PhotonSEEWorkFunction(iPartBound) = GETREAL('Part-Boundary'//TRIM(hilf)//'-PhotonSEEWorkFunction') - PartBound%PhotonSEEElectronSpecies(iPartBound) = GETINT('Part-Boundary'//TRIM(hilf)//'-PhotonSEEElectronSpecies') PartBound%PhotonSpecularReflection(iPartBound) = GETLOGICAL('Part-Boundary'//TRIM(hilf)//'-PhotonSpecularReflection') + PartBound%PhotonEnACC(iPartBound) = GETREAL('Part-Boundary'//TRIM(hilf)//'-PhotonEnACC') + PartBound%PhotonSEEYield(iPartBound) = GETREAL('Part-Boundary'//TRIM(hilf)//'-PhotonSEE-Yield') + IF(PartBound%PhotonSEEYield(iPartBound).GT.0.) THEN + PartBound%PhotonSEEWorkFunction(iPartBound) = GETREAL('Part-Boundary'//TRIM(hilf)//'-PhotonSEE-WorkFunction') + PartBound%PhotonSEEElectronSpecies(iPartBound) = GETINT('Part-Boundary'//TRIM(hilf)//'-PhotonSEE-ElectronSpecies') + IF(usevMPF) THEN + WRITE(UNIT=hilf2,FMT='(G0)') Species(PartBound%PhotonSEEElectronSpecies(iPartBound))%MacroParticleFactor + PartBound%PhotonSEEMacroParticleFactor(iPartBound) = GETREAL('Part-Boundary'//TRIM(hilf)//'-PhotonSEE-MacroParticleFactor',& + TRIM(hilf2)) + END IF + END IF IF(PartBound%RotVelo(iPartBound)) THEN RotFreq = GETREAL('Part-Boundary'//TRIM(hilf)//'-RotFreq') RotAxis = GETINT('Part-Boundary'//TRIM(hilf)//'-RotAxis') diff --git a/src/particles/boundary/particle_boundary_vars.f90 b/src/particles/boundary/particle_boundary_vars.f90 index 7c531c4ec..35fdda201 100644 --- a/src/particles/boundary/particle_boundary_vars.f90 +++ b/src/particles/boundary/particle_boundary_vars.f90 @@ -271,8 +271,9 @@ MODULE MOD_Particle_Boundary_Vars REAL , ALLOCATABLE :: PhotonEnACC(:) REAL , ALLOCATABLE :: PhotonSEEYield(:) REAL , ALLOCATABLE :: PhotonSEEWorkFunction(:) + REAL , ALLOCATABLE :: PhotonSEEMacroParticleFactor(:) INTEGER , ALLOCATABLE :: PhotonSEEElectronSpecies(:) - LOGICAL , ALLOCATABLE :: PhotonSpecularReflection(:) + LOGICAL , ALLOCATABLE :: PhotonSpecularReflection(:) LOGICAL , ALLOCATABLE :: RotVelo(:) ! Flag for rotating walls REAL , ALLOCATABLE :: RotOmega(:,:) ! Angular velocity REAL , ALLOCATABLE :: RotPeriodicAngle(:) ! Angle and Direction of rotation diff --git a/src/particles/emission/particle_emission.f90 b/src/particles/emission/particle_emission.f90 index d0d4a83d5..2f049368b 100644 --- a/src/particles/emission/particle_emission.f90 +++ b/src/particles/emission/particle_emission.f90 @@ -56,6 +56,8 @@ SUBROUTINE ParticleInserting() USE MOD_DSMC_ChemReact ,ONLY: CalcPhotoIonizationNumber USE MOD_Particle_Mesh_Vars ,ONLY: GEO USE MOD_ReadInTools ,ONLY: PrintOption +USE MOD_RayTracing_Vars ,ONLY: RayPartBound +USE MOD_Particle_Boundary_Vars ,ONLY: PartBound #if defined(MEASURE_MPI_WAIT) USE MOD_Particle_MPI_Vars ,ONLY: MPIW8TimePart,MPIW8CountPart #endif /*defined(MEASURE_MPI_WAIT)*/ @@ -87,7 +89,10 @@ SUBROUTINE ParticleInserting() #endif /*defined(MEASURE_MPI_WAIT)*/ !=================================================================================================================================== -CALL PhotoIonization_RayTracing_SEE() +! TODO: Eigenen Flag setzen? +IF(RayPartBound.GT.0) THEN + IF(ANY(PartBound%PhotonSEEYield(:).GT.0.)) CALL PhotoIonization_RayTracing_SEE() +END IF !--- Emission at time step DO i=1,nSpecies diff --git a/src/particles/emission/particle_emission_tools.f90 b/src/particles/emission/particle_emission_tools.f90 index 97fe0b31d..fb1855bf8 100644 --- a/src/particles/emission/particle_emission_tools.f90 +++ b/src/particles/emission/particle_emission_tools.f90 @@ -1733,7 +1733,7 @@ SUBROUTINE CalcVelocity_FromWorkFuncSEE(W, m, t_vec, n_vec, Vec3D) !=================================================================================================================================== ! ARM for energy distribution -E_max = 25.0*W ! in eV (this yields an integral of 0.9956759, i.e., 95.57% of electrons have this or a lower energy) +E_max = 25.0*W ! in eV (this yields an integral of 0.9956759, i.e., 99.57% of electrons have this or a lower energy) PDF_max = 81.0 / (128.0 * W) ! PDF_max at E = W/3 (derivation of 6W^2E/(E+W)^4 == 0) ARM_SEE_PDF=.TRUE. DO WHILE(ARM_SEE_PDF) diff --git a/src/particles/emission/particle_photoionization.f90 b/src/particles/emission/particle_photoionization.f90 index 2229ff870..7a96b8d60 100644 --- a/src/particles/emission/particle_photoionization.f90 +++ b/src/particles/emission/particle_photoionization.f90 @@ -39,7 +39,7 @@ SUBROUTINE PhotoIonization_RayTracing_SEE() USE MOD_Globals_Vars ,ONLY: PI USE MOD_Timedisc_Vars ,ONLY: dt,time USE MOD_Particle_Boundary_Vars ,ONLY: nSurfSample, Partbound, SurfSide2GlobalSide, DoBoundaryParticleOutputHDF5 -USE MOD_Particle_Vars ,ONLY: Species, PartState +USE MOD_Particle_Vars ,ONLY: Species, PartState, usevMPF USE MOD_RayTracing_Vars ,ONLY: Ray USE MOD_part_emission_tools ,ONLY: CalcPhotonEnergy USE MOD_Particle_Mesh_Vars ,ONLY: SideInfo_Shared @@ -73,10 +73,10 @@ SUBROUTINE PhotoIonization_RayTracing_SEE() ! LOCAL VARIABLES REAL :: t_1, t_2, E_Intensity INTEGER :: NbrOfRepetitions, firstSide, lastSide, SideID, iSample, GlobElemID, PartID -INTEGER :: GlobalSideID, iSurfSide, p, q, BCID, SpecID, iPart -REAL :: NbrOfSEE, TimeScalingFactor +INTEGER :: GlobalSideID, iSurfSide, p, q, BCID, SpecID, iPart, NbrOfSEE +REAL :: RealNbrOfSEE, TimeScalingFactor, MPF REAL :: Particle_pos(1:3), xi(2) -REAL :: RandVal2(2), xiab(1:2,1:2), nVec(3), tang1(3), tang2(3), Velo3D(3) +REAL :: RandVal, RandVal2(2), xiab(1:2,1:2), nVec(3), tang1(3), tang2(3), Velo3D(3) #if USE_HDG INTEGER :: iBC,iUniqueFPCBC,iUniqueEPCBC,BCState #endif /*USE_HDG*/ @@ -146,12 +146,20 @@ SUBROUTINE PhotoIonization_RayTracing_SEE() SpecID = PartBound%PhotonSEEElectronSpecies(BCID) ! Determine which element the particles are going to be inserted GlobElemID = SideInfo_Shared(SIDE_ELEMID ,SideID) + ! Determine the weighting factor of the electron species + IF(usevMPF)THEN + MPF = PartBound%PhotonSEEMacroParticleFactor(BCID) ! Use SEE-specific MPF + ELSE + MPF = Species(SpecID)%MacroParticleFactor ! Use species MPF + END IF ! usevMPF + ! Loop over the subsides DO p = 1, nSurfSample DO q = 1, nSurfSample ! Calculate the number of SEEs per subside E_Intensity = PhotonSampWall(2,p,q,iSurfSide) * TimeScalingFactor - NbrOfSEE = E_Intensity / CalcPhotonEnergy(lambda) * PartBound%PhotonSEEYield(BCID) / Species(SpecID)%MacroParticleFactor - ! TODO: NINT Correction + RealNbrOfSEE = E_Intensity / CalcPhotonEnergy(lambda) * PartBound%PhotonSEEYield(BCID) / MPF + CALL RANDOM_NUMBER(RandVal) + NbrOfSEE = INT(RealNbrOfSEE+RandVal) ! Calculate the normal & tangential vectors xi(1)=(BezierSampleXi(p-1)+BezierSampleXi(p))/2. ! (a+b)/2 xi(2)=(BezierSampleXi(q-1)+BezierSampleXi(q))/2. ! (a+b)/2 @@ -161,7 +169,7 @@ SUBROUTINE PhotoIonization_RayTracing_SEE() ! Normal vector provided by the routine points outside of the domain nVec = -nVec ! Loop over number of particles to be inserted - DO iPart = 1, NINT(NbrOfSEE) + DO iPart = 1, NbrOfSEE ! Determine particle position within the sub-side CALL RANDOM_NUMBER(RandVal2) xi=(xiab(:,2)-xiab(:,1))*RandVal2+xiab(:,1) @@ -169,11 +177,11 @@ SUBROUTINE PhotoIonization_RayTracing_SEE() ! Determine particle velocity CALL CalcVelocity_FromWorkFuncSEE(PartBound%PhotonSEEWorkFunction(BCID), Species(SpecID)%MassIC, tang1, nVec, Velo3D) ! Create new particle - CALL CreateParticle(SpecID,Particle_pos(1:3),GlobElemID,Velo3D(1:3),0.,0.,0.,NewPartID=PartID,NewMPF=Species(SpecID)%MacroParticleFactor) + CALL CreateParticle(SpecID,Particle_pos(1:3),GlobElemID,Velo3D(1:3),0.,0.,0.,NewPartID=PartID,NewMPF=MPF) ! 1. Store the particle information in PartStateBoundary.h5 IF(DoBoundaryParticleOutputHDF5) THEN CALL StoreBoundaryParticleProperties(PartID,SpecID,PartState(1:3,PartID),& - UNITVECTOR(PartState(4:6,PartID)),nVec,iPartBound=BCID,mode=2,MPF_optIN=Species(SpecID)%MacroParticleFactor) + UNITVECTOR(PartState(4:6,PartID)),nVec,iPartBound=BCID,mode=2,MPF_optIN=MPF) END IF ! DoBoundaryParticleOutputHDF5 #if USE_HDG ! 2. Check if floating boundary conditions (FPC) are used and consider electron holes @@ -183,7 +191,7 @@ SUBROUTINE PhotoIonization_RayTracing_SEE() IF(BoundaryType(iBC,BC_TYPE).EQ.20)THEN ! BCType = BoundaryType(iBC,BC_TYPE) BCState = BoundaryType(iBC,BC_STATE) ! State is iFPC iUniqueFPCBC = FPC%Group(BCState,2) - FPC%ChargeProc(iUniqueFPCBC) = FPC%ChargeProc(iUniqueFPCBC) - Species(SpecID)%ChargeIC * Species(SpecID)%MacroParticleFactor ! Use negative charge! + FPC%ChargeProc(iUniqueFPCBC) = FPC%ChargeProc(iUniqueFPCBC) - Species(SpecID)%ChargeIC * MPF ! Use negative charge! END IF ! BCType.EQ.20 END IF ! UseFPC ! 3. Check if electric potential condition (EPC) are used and consider electron holes @@ -193,7 +201,7 @@ SUBROUTINE PhotoIonization_RayTracing_SEE() IF(BoundaryType(iBC,BC_TYPE).EQ.8)THEN ! BCType = BoundaryType(iBC,BC_TYPE) BCState = BoundaryType(iBC,BC_STATE) ! State is iEPC iUniqueEPCBC = EPC%Group(BCState,2) - EPC%ChargeProc(iUniqueEPCBC) = EPC%ChargeProc(iUniqueEPCBC) - Species(SpecID)%ChargeIC * Species(SpecID)%MacroParticleFactor ! Use negative charge! + EPC%ChargeProc(iUniqueEPCBC) = EPC%ChargeProc(iUniqueEPCBC) - Species(SpecID)%ChargeIC * MPF ! Use negative charge! END IF ! BCType.EQ.8 END IF ! UseEPC #endif /*USE_HDG*/ From 36e4edc68aff082ba6d40ca6f44b06efda84e2de Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Fri, 30 Jun 2023 20:14:46 +0200 Subject: [PATCH 102/495] minor fixes and ray tracing compiles with MPI=ON --- src/particles/emission/particle_emission.f90 | 8 ++---- .../emission/particle_photoionization.f90 | 26 +++++++++++++------ .../radiative_transfer/radtrans_init.f90 | 2 +- .../tracking/radtrans_tracking_output.f90 | 22 +++++++++++----- .../tracking/radtrans_tracking_tools.f90 | 3 +++ .../tracking/radtrans_tracking_vars.f90 | 2 +- src/radiation/ray_tracing/raytrace.f90 | 2 +- 7 files changed, 41 insertions(+), 24 deletions(-) diff --git a/src/particles/emission/particle_emission.f90 b/src/particles/emission/particle_emission.f90 index 2f049368b..fbc65ee4f 100644 --- a/src/particles/emission/particle_emission.f90 +++ b/src/particles/emission/particle_emission.f90 @@ -56,8 +56,6 @@ SUBROUTINE ParticleInserting() USE MOD_DSMC_ChemReact ,ONLY: CalcPhotoIonizationNumber USE MOD_Particle_Mesh_Vars ,ONLY: GEO USE MOD_ReadInTools ,ONLY: PrintOption -USE MOD_RayTracing_Vars ,ONLY: RayPartBound -USE MOD_Particle_Boundary_Vars ,ONLY: PartBound #if defined(MEASURE_MPI_WAIT) USE MOD_Particle_MPI_Vars ,ONLY: MPIW8TimePart,MPIW8CountPart #endif /*defined(MEASURE_MPI_WAIT)*/ @@ -89,10 +87,8 @@ SUBROUTINE ParticleInserting() #endif /*defined(MEASURE_MPI_WAIT)*/ !=================================================================================================================================== -! TODO: Eigenen Flag setzen? -IF(RayPartBound.GT.0) THEN - IF(ANY(PartBound%PhotonSEEYield(:).GT.0.)) CALL PhotoIonization_RayTracing_SEE() -END IF +!--- Ray tracing based secondary electron emission +CALL PhotoIonization_RayTracing_SEE() !--- Emission at time step DO i=1,nSpecies diff --git a/src/particles/emission/particle_photoionization.f90 b/src/particles/emission/particle_photoionization.f90 index 7a96b8d60..d713763bf 100644 --- a/src/particles/emission/particle_photoionization.f90 +++ b/src/particles/emission/particle_photoionization.f90 @@ -40,7 +40,7 @@ SUBROUTINE PhotoIonization_RayTracing_SEE() USE MOD_Timedisc_Vars ,ONLY: dt,time USE MOD_Particle_Boundary_Vars ,ONLY: nSurfSample, Partbound, SurfSide2GlobalSide, DoBoundaryParticleOutputHDF5 USE MOD_Particle_Vars ,ONLY: Species, PartState, usevMPF -USE MOD_RayTracing_Vars ,ONLY: Ray +USE MOD_RayTracing_Vars ,ONLY: Ray,RayPartBound USE MOD_part_emission_tools ,ONLY: CalcPhotonEnergy USE MOD_Particle_Mesh_Vars ,ONLY: SideInfo_Shared USE MOD_Particle_Surfaces_Vars ,ONLY: BezierControlPoints3D, BezierSampleXi @@ -50,14 +50,15 @@ SUBROUTINE PhotoIonization_RayTracing_SEE() USE MOD_Particle_Boundary_Tools ,ONLY: StoreBoundaryParticleProperties USE MOD_part_operations ,ONLY: CreateParticle #ifdef LSERK -USE MOD_Timedisc_Vars ,ONLY: iStage, RK_c, nRKStages +USE MOD_Timedisc_Vars ,ONLY: iStage, RK_c, nRKStages #endif #if USE_MPI -USE MOD_Particle_Boundary_Vars ,ONLY: SurfSideArea_Shared,nComputeNodeSurfTotalSides -USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall_Shared +USE MOD_Particle_Boundary_Vars ,ONLY: SurfSideArea_Shared,nComputeNodeSurfTotalSides +USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall_Shared +USE MOD_MPI_Shared_Vars ,ONLY: nComputeNodeProcessors,myComputeNodeRank #else -USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall -USE MOD_Particle_Boundary_Vars ,ONLY: SurfSideArea,nSurfTotalSides +USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall +USE MOD_Particle_Boundary_Vars ,ONLY: nSurfTotalSides #endif /*USE_MPI*/ #if USE_HDG USE MOD_HDG_Vars ,ONLY: UseFPC,FPC,UseEPC,EPC @@ -73,7 +74,7 @@ SUBROUTINE PhotoIonization_RayTracing_SEE() ! LOCAL VARIABLES REAL :: t_1, t_2, E_Intensity INTEGER :: NbrOfRepetitions, firstSide, lastSide, SideID, iSample, GlobElemID, PartID -INTEGER :: GlobalSideID, iSurfSide, p, q, BCID, SpecID, iPart, NbrOfSEE +INTEGER :: iSurfSide, p, q, BCID, SpecID, iPart, NbrOfSEE REAL :: RealNbrOfSEE, TimeScalingFactor, MPF REAL :: Particle_pos(1:3), xi(2) REAL :: RandVal, RandVal2(2), xiab(1:2,1:2), nVec(3), tang1(3), tang2(3), Velo3D(3) @@ -81,6 +82,11 @@ SUBROUTINE PhotoIonization_RayTracing_SEE() INTEGER :: iBC,iUniqueFPCBC,iUniqueEPCBC,BCState #endif /*USE_HDG*/ !=================================================================================================================================== +! Check if ray tracing based SEE is active +! 1) Boundary from which rays are emitted +IF(RayPartBound.LE.0) RETURN +! 2) SEE yield for any BC greater than zero +IF(.NOT.ANY(PartBound%PhotonSEEYield(:).GT.0.)) RETURN ! TODO: Copied here from InitParticleMesh, which is only build if not TriaSurfaceFlux IF(.NOT.ALLOCATED(BezierSampleXi)) ALLOCATE(BezierSampleXi(0:nSurfSample)) @@ -156,7 +162,11 @@ SUBROUTINE PhotoIonization_RayTracing_SEE() DO p = 1, nSurfSample DO q = 1, nSurfSample ! Calculate the number of SEEs per subside +#if USE_MPI + E_Intensity = PhotonSampWall_Shared(2,p,q,iSurfSide) * TimeScalingFactor +#else E_Intensity = PhotonSampWall(2,p,q,iSurfSide) * TimeScalingFactor +#endif /*USE_MPI*/ RealNbrOfSEE = E_Intensity / CalcPhotonEnergy(lambda) * PartBound%PhotonSEEYield(BCID) / MPF CALL RANDOM_NUMBER(RandVal) NbrOfSEE = INT(RealNbrOfSEE+RandVal) @@ -214,4 +224,4 @@ SUBROUTINE PhotoIonization_RayTracing_SEE() END SUBROUTINE PhotoIonization_RayTracing_SEE -END MODULE MOD_Particle_Photoionization \ No newline at end of file +END MODULE MOD_Particle_Photoionization diff --git a/src/radiation/radiative_transfer/radtrans_init.f90 b/src/radiation/radiative_transfer/radtrans_init.f90 index e79f47b73..ae4aaf4a4 100644 --- a/src/radiation/radiative_transfer/radtrans_init.f90 +++ b/src/radiation/radiative_transfer/radtrans_init.f90 @@ -439,7 +439,7 @@ SUBROUTINE InitRadiationTransport() #if USE_MPI !> Then shared arrays for boundary sampling -CALL Allocate_Shared((/2,nComputeNodeSurfTotalSides/),PhotonSampWall_Shared_Win,PhotonSampWall_Shared) +CALL Allocate_Shared((/2,1:nSurfSample,1:nSurfSample,nComputeNodeSurfTotalSides/),PhotonSampWall_Shared_Win,PhotonSampWall_Shared) CALL MPI_WIN_LOCK_ALL(0,PhotonSampWall_Shared_Win,IERROR) IF (myComputeNodeRank.EQ.0) PhotonSampWall_Shared = 0. diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 index e266c6f0d..1818bdeb9 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 @@ -340,7 +340,7 @@ SUBROUTINE ExchangeRadiationSurfData() !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES INTEGER :: MessageSize,nValues,iSurfSide,SurfSideID, SideID -INTEGER :: iPos,iProc +INTEGER :: iPos,iProc,p,q INTEGER :: RecvRequest(0:nSurfLeaders-1),SendRequest(0:nSurfLeaders-1) !=================================================================================================================================== ! nodes without sampling surfaces do not take part in this routine @@ -394,9 +394,13 @@ SUBROUTINE ExchangeRadiationSurfData() SideID = SurfMapping(iProc)%SendSurfGlobalID(iSurfSide) SurfSideID = GlobalSide2SurfSide(SURF_SIDEID,SideID) ! Assemble message - SurfSendBuf(iProc)%content(iPos+1:iPos+2) = PhotonSampWall_Shared(:,SurfSideID) - iPos = iPos + 2 - PhotonSampWall_Shared(:,SurfSideID)=0. + DO q = 1,nSurfSample + DO p = 1,nSurfSample + SurfSendBuf(iProc)%content(iPos+1:iPos+2) = PhotonSampWall_Shared(:,p,q,SurfSideID) + iPos = iPos + 2 + END DO ! p=0,nSurfSample + END DO ! q=0,nSurfSample + PhotonSampWall_Shared(:,:,:,SurfSideID)=0. END DO ! iSurfSide = 1,SurfMapping(iProc)%nSendSurfSides END DO @@ -446,9 +450,13 @@ SUBROUTINE ExchangeRadiationSurfData() DO iSurfSide = 1,SurfMapping(iProc)%nRecvSurfSides SideID = SurfMapping(iProc)%RecvSurfGlobalID(iSurfSide) SurfSideID = GlobalSide2SurfSide(SURF_SIDEID,SideID) - PhotonSampWall_Shared(:,SurfSideID) = PhotonSampWall_Shared(:,SurfSideID) & - + SurfRecvBuf(iProc)%content(iPos+1:iPos+2) - iPos = iPos + 2 + DO q = 1,nSurfSample + DO p = 1,nSurfSample + PhotonSampWall_Shared(:,p,q,SurfSideID) = PhotonSampWall_Shared(:,p,q,SurfSideID) & + + SurfRecvBuf(iProc)%content(iPos+1:iPos+2) + iPos = iPos + 2 + END DO ! p=0,nSurfSample + END DO ! q=0,nSurfSample END DO ! iSurfSide = 1,SurfMapping(iProc)%nRecvSurfSides ! Nullify buffer SurfRecvBuf(iProc)%content = 0. diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 index 919e3c588..6a77c8e64 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 @@ -533,6 +533,9 @@ SUBROUTINE PhotonIntersectionWithSide(iLocSide,Element,TriNum, IntersectionPos, USE MOD_Particle_Mesh_Vars ,ONLY: ElemSideNodeID_Shared, NodeCoords_Shared USE MOD_Photon_TrackingVars ,ONLY: PhotonProps USE MOD_Mesh_Tools ,ONLY: GetCNElemID +#if USE_MPI +USE MOD_Globals ,ONLY: myRank +#endif /*USE_MPI*/ !--------------------------------------------------------------------------------------------------! IMPLICIT NONE !--------------------------------------------------------------------------------------------------! diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_vars.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_vars.f90 index f92dabfeb..2eb513943 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_vars.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_vars.f90 @@ -46,7 +46,7 @@ MODULE MOD_Photon_TrackingVars #if USE_MPI INTEGER :: PhotonSampWall_Shared_Win -REAL,POINTER :: PhotonSampWall_Shared(:,:) +REAL,POINTER :: PhotonSampWall_Shared(:,:,:,:) #endif /*USE_MPI*/ !=================================================================================================================================== END MODULE MOD_Photon_TrackingVars diff --git a/src/radiation/ray_tracing/raytrace.f90 b/src/radiation/ray_tracing/raytrace.f90 index 6c8aff42d..c4472532e 100644 --- a/src/radiation/ray_tracing/raytrace.f90 +++ b/src/radiation/ray_tracing/raytrace.f90 @@ -94,7 +94,7 @@ SUBROUTINE RayTracing() CALL Allocate_Shared((/RayElemSize,nGlobalElems/),RayElemPassedEnergy_Shared_Win,RayElemPassedEnergy_Shared) CALL MPI_WIN_LOCK_ALL(0,RayElemPassedEnergy_Shared_Win,IERROR) !> Shared arrays for boundary sampling -CALL Allocate_Shared((/2,nComputeNodeSurfTotalSides/),PhotonSampWall_Shared_Win,PhotonSampWall_Shared) +CALL Allocate_Shared((/2,nSurfSample,nSurfSample,nComputeNodeSurfTotalSides/),PhotonSampWall_Shared_Win,PhotonSampWall_Shared) CALL MPI_WIN_LOCK_ALL(0,PhotonSampWall_Shared_Win,IERROR) IF (myComputeNodeRank.EQ.0) RayElemPassedEnergy_Shared = 0. IF (myComputeNodeRank.EQ.0) PhotonSampWall_Shared = 0. From 7587ecc7b9001b069b3e407197498148fc4c89a1 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Wed, 5 Jul 2023 17:53:06 +0200 Subject: [PATCH 103/495] Removed compiler warnings for MPI=OFF --- src/analyze/analyze.f90 | 5 ++++- src/equations/poisson/equation.f90 | 5 ++++- src/hdg/hdg.f90 | 6 +++--- src/io_hdf5/hdf5_output_particle.f90 | 2 +- src/particles/analyze/particle_analyze.f90 | 2 +- src/particles/analyze/particle_analyze_output.f90 | 5 ++++- src/particles/analyze/particle_analyze_tools.f90 | 2 ++ src/particles/boundary/particle_boundary_init.f90 | 7 ++++--- src/particles/dsmc/dsmc_chemical_reactions.f90 | 5 ++++- src/particles/emission/particle_br_electron_fluid.f90 | 5 ++++- src/particles/emission/particle_emission_tools.f90 | 3 +-- .../emission/particle_position_and_velocity.f90 | 5 ++++- src/particles/particle_mesh/particle_bgm.f90 | 6 +++--- src/particles/particle_mesh/particle_mesh.f90 | 6 +++--- src/particles/particle_mesh/particle_mesh_build.f90 | 11 ++++++----- src/particles/particle_mesh/particle_mesh_tools.f90 | 4 ++-- src/particles/sampling/particle_sampling_adaptive.f90 | 5 ++++- src/timedisc/timedisc_init.f90 | 2 ++ 18 files changed, 56 insertions(+), 30 deletions(-) diff --git a/src/analyze/analyze.f90 b/src/analyze/analyze.f90 index c82d7d771..34876373a 100644 --- a/src/analyze/analyze.f90 +++ b/src/analyze/analyze.f90 @@ -1471,12 +1471,15 @@ SUBROUTINE InitCalcElectricTimeDerivativeSurface() ! MODULES USE MOD_Globals USE MOD_Preproc -USE MOD_Mesh_Vars ,ONLY: nBCs,BoundaryType,BoundaryName,nBCSides,BC +USE MOD_Mesh_Vars ,ONLY: nBCs,BoundaryType USE MOD_Analyze_Vars ,ONLY: DoFieldAnalyze,CalcElectricTimeDerivative,EDC USE MOD_Equation_Vars ,ONLY: Et #if USE_LOADBALANCE USE MOD_LoadBalance_Vars ,ONLY: PerformLoadBalance #endif /*USE_LOADBALANCE*/ +#if USE_MPI +USE MOD_Mesh_Vars ,ONLY: BoundaryName,nBCSides,BC +#endif /*USE_MPI*/ IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------! ! INPUT / OUTPUT VARIABLES diff --git a/src/equations/poisson/equation.f90 b/src/equations/poisson/equation.f90 index d04c7aba2..0ed961238 100644 --- a/src/equations/poisson/equation.f90 +++ b/src/equations/poisson/equation.f90 @@ -497,7 +497,7 @@ SUBROUTINE ExactFunc(ExactFunction,x,resu,t,ElemID,iRefState,iLinState,BCState) ! Specifies all the initial conditions. The state in conservative variables is returned. !=================================================================================================================================== ! MODULES -USE MOD_Globals ,ONLY: Abort,mpiroot +USE MOD_Globals ,ONLY: Abort USE MOD_Globals_Vars ,ONLY: PI,ElementaryCharge,eps0 USE MOD_Equation_Vars ,ONLY: IniCenter,IniHalfwidth,IniAmplitude,RefState,LinPhi,LinPhiHeight,LinPhiNormal,LinPhiBasePoint #if defined(PARTICLES) @@ -507,6 +507,9 @@ SUBROUTINE ExactFunc(ExactFunction,x,resu,t,ElemID,iRefState,iLinState,BCState) USE MOD_Dielectric_Vars ,ONLY: DielectricRatio,Dielectric_E_0,DielectricRadiusValue,DielectricEpsR USE MOD_Mesh_Vars ,ONLY: ElemBaryNGeo USE MOD_HDG_Vars ,ONLY: FPC,EPC +#if USE_MPI +USE MOD_Globals ,ONLY: mpiroot +#endif /*USE_MPI*/ ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- diff --git a/src/hdg/hdg.f90 b/src/hdg/hdg.f90 index 92454b3f2..49eca101b 100644 --- a/src/hdg/hdg.f90 +++ b/src/hdg/hdg.f90 @@ -1246,9 +1246,9 @@ SUBROUTINE InitBV() ! ! 51: cos(wt) function with DC bias ! ! 52: cos(wt) function with DC bias + coupled power for AC potential adjustment INTEGER :: BCType,BVBoundaries,BCState,iBoundary -INTEGER :: SideID,iBC,iPBC +INTEGER :: iBC,iPBC #if USE_MPI -INTEGER :: color +INTEGER :: color,SideID LOGICAL :: BConProc #endif /*USE_MPI*/ !=================================================================================================================================== @@ -3531,4 +3531,4 @@ SUBROUTINE FinalizeHDG() END SUBROUTINE FinalizeHDG -END MODULE MOD_HDG \ No newline at end of file +END MODULE MOD_HDG diff --git a/src/io_hdf5/hdf5_output_particle.f90 b/src/io_hdf5/hdf5_output_particle.f90 index 585c8bc68..7dd28ce03 100644 --- a/src/io_hdf5/hdf5_output_particle.f90 +++ b/src/io_hdf5/hdf5_output_particle.f90 @@ -1164,8 +1164,8 @@ SUBROUTINE WriteAdaptBCPartNumOutToHDF5(FileName) USE MOD_Timedisc_Vars ,ONLY: iter USE MOD_Restart_Vars ,ONLY: DoRestart USE MOD_Particle_Vars ,ONLY: nSpecies, Species -USE MOD_Particle_Sampling_Vars ,ONLY: AdaptBCPartNumOut #if USE_MPI +USE MOD_Particle_Sampling_Vars ,ONLY: AdaptBCPartNumOut USE MOD_Particle_MPI_Vars ,ONLY: PartMPI #endif /*USE_MPI*/ ! IMPLICIT VARIABLE HANDLING diff --git a/src/particles/analyze/particle_analyze.f90 b/src/particles/analyze/particle_analyze.f90 index 2c19eb39f..204f07740 100644 --- a/src/particles/analyze/particle_analyze.f90 +++ b/src/particles/analyze/particle_analyze.f90 @@ -815,8 +815,8 @@ SUBROUTINE InitBulkElectronTemp() #if USE_MPI ! Broadcast from root to other processors. Only root knows if BulkElectronTempExists=T/F so always broadcast message CALL MPI_BCAST(BulkElectronTemp,1, MPI_DOUBLE_PRECISION,0,MPI_COMM_WORLD,iERROR) - IF(SurfModSEEelectronTempAutoamtic) BulkElectronTempSEE = BulkElectronTemp #endif /*USE_MPI*/ + IF(SurfModSEEelectronTempAutoamtic) BulkElectronTempSEE = BulkElectronTemp END IF ! CalcBulkElectronTemp END SUBROUTINE InitBulkElectronTemp diff --git a/src/particles/analyze/particle_analyze_output.f90 b/src/particles/analyze/particle_analyze_output.f90 index d7b172548..2c482afa0 100644 --- a/src/particles/analyze/particle_analyze_output.f90 +++ b/src/particles/analyze/particle_analyze_output.f90 @@ -37,7 +37,10 @@ SUBROUTINE WriteParticleTrackingData(time,iter) !----------------------------------------------------------------------------------------------------------------------------------! ! MODULES ! !----------------------------------------------------------------------------------------------------------------------------------! -USE MOD_Globals ,ONLY: FILEEXISTS,unit_stdout,DOTPRODUCT,abort,MPI_COMM_WORLD,iError,MPIRoot +USE MOD_Globals ,ONLY: FILEEXISTS,unit_stdout,DOTPRODUCT,abort,MPI_COMM_WORLD,MPIRoot +#if USE_MPI +USE MOD_Globals ,ONLY: iError +#endif /*USE_MPI*/ USE MOD_Restart_Vars ,ONLY: DoRestart USE MOD_Particle_Vars ,ONLY: PartState, PDM, PEM USE MOD_Particle_Analyze_Vars ,ONLY: printDiff,printDiffVec,printDiffTime diff --git a/src/particles/analyze/particle_analyze_tools.f90 b/src/particles/analyze/particle_analyze_tools.f90 index 6e2f0c7bd..ce0da53d1 100644 --- a/src/particles/analyze/particle_analyze_tools.f90 +++ b/src/particles/analyze/particle_analyze_tools.f90 @@ -397,7 +397,9 @@ SUBROUTINE CalculatePartElemData() ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES +#if USE_MPI INTEGER :: tmpArray(1:6) +#endif /*USE_MPI*/ !=================================================================================================================================== ! electron density diff --git a/src/particles/boundary/particle_boundary_init.f90 b/src/particles/boundary/particle_boundary_init.f90 index 8ec954805..e747c13e8 100644 --- a/src/particles/boundary/particle_boundary_init.f90 +++ b/src/particles/boundary/particle_boundary_init.f90 @@ -184,9 +184,9 @@ SUBROUTINE InitializeVariablesPartBoundary() USE MOD_Dielectric_Vars ,ONLY: DoDielectricSurfaceCharge USE MOD_DSMC_Vars ,ONLY: useDSMC, BGGas USE MOD_Mesh_Vars ,ONLY: BoundaryName,BoundaryType, nBCs -USE MOD_Particle_Vars ,ONLY: PDM, nSpecies, PartMeshHasPeriodicBCs, RotRefFrameAxis, SpeciesDatabase, Species, usevMPF +USE MOD_Particle_Vars ,ONLY: nSpecies, PartMeshHasPeriodicBCs, RotRefFrameAxis, SpeciesDatabase, Species, usevMPF USE MOD_SurfaceModel_Vars ,ONLY: nPorousBC -USE MOD_Particle_Boundary_Vars ,ONLY: PartBound,nPartBound,DoBoundaryParticleOutputHDF5,PartStateBoundary, AdaptWallTemp +USE MOD_Particle_Boundary_Vars ,ONLY: PartBound,nPartBound,DoBoundaryParticleOutputHDF5,AdaptWallTemp USE MOD_Particle_Tracking_Vars ,ONLY: TrackingMethod USE MOD_Particle_Surfaces_Vars ,ONLY: BCdata_auxSF USE MOD_Particle_Mesh_Vars ,ONLY: GEO @@ -716,7 +716,7 @@ END SUBROUTINE InitParticleBoundaryRotPeriodic SUBROUTINE BuildParticleBoundaryRotPeriodic(notMappedTotal) ! MODULES USE MOD_Globals -USE MOD_Particle_Boundary_Vars ,ONLY: nComputeNodeSurfTotalSides,SurfSide2GlobalSide,PartBound +USE MOD_Particle_Boundary_Vars ,ONLY: SurfSide2GlobalSide,PartBound USE MOD_Particle_Boundary_Vars ,ONLY: RotPeriodicSideMapping, NumRotPeriodicNeigh, SurfSide2RotPeriodicSide USE MOD_Particle_Mesh_Vars ,ONLY: SideInfo_Shared, NodeCoords_Shared, ElemSideNodeID_Shared, GEO, ElemInfo_Shared USE MOD_Mesh_Tools ,ONLY: GetCNElemID, GetGlobalElemID @@ -726,6 +726,7 @@ SUBROUTINE BuildParticleBoundaryRotPeriodic(notMappedTotal) USE MOD_IO_HDF5 ,ONLY: AddToElemData,ElementOut USE MOD_HDF5_Output_ElemData ,ONLY: WriteLostRotPeriodicSidesToHDF5 #if USE_MPI +USE MOD_Particle_Boundary_Vars ,ONLY: nComputeNodeSurfTotalSides USE MOD_Particle_Boundary_Vars ,ONLY: SurfSide2RotPeriodicSide_Shared,SurfSide2RotPeriodicSide_Shared_Win USE MOD_Particle_Boundary_Vars ,ONLY: Rot2Glob_temp_Shared,Rot2Glob_temp_Shared_Win USE MOD_Particle_Boundary_Vars ,ONLY: RotPeriodicSideMapping_temp_Shared,RotPeriodicSideMapping_temp_Shared_Win diff --git a/src/particles/dsmc/dsmc_chemical_reactions.f90 b/src/particles/dsmc/dsmc_chemical_reactions.f90 index 642c4b41e..789fd12da 100644 --- a/src/particles/dsmc/dsmc_chemical_reactions.f90 +++ b/src/particles/dsmc/dsmc_chemical_reactions.f90 @@ -351,7 +351,7 @@ SUBROUTINE DSMC_Chemistry(iPair, iReac) ! Routine performs an exchange reaction of the type A + B + C -> D + E + F, where A, B, C, D, E, F can be anything !=================================================================================================================================== ! MODULES -USE MOD_Globals ,ONLY: abort,DOTPRODUCT,StringBeginsWith,UNIT_StdOut,myrank +USE MOD_Globals ,ONLY: abort,DOTPRODUCT,StringBeginsWith,UNIT_StdOut USE MOD_Globals_Vars USE MOD_DSMC_Vars ,ONLY: Coll_pData, DSMC, CollInf, SpecDSMC, DSMCSumOfFormedParticles, ElectronicDistriPart USE MOD_DSMC_Vars ,ONLY: ChemReac, PartStateIntEn, PolyatomMolDSMC, VibQuantsPar, RadialWeighting, BGGas, ElecRelaxPart @@ -373,6 +373,9 @@ SUBROUTINE DSMC_Chemistry(iPair, iReac) #endif /* CODE_ANALYZE */ USE MOD_Particle_Analyze_Vars ,ONLY: CalcPartBalance,nPartIn,nPartOut,PartEkinIn,PartEkinOut USE MOD_Particle_Analyze_Tools ,ONLY: CalcEkinPart +#if USE_MPI +USE MOD_Globals ,ONLY: myrank +#endif /*USE_MPI*/ ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- diff --git a/src/particles/emission/particle_br_electron_fluid.f90 b/src/particles/emission/particle_br_electron_fluid.f90 index df94d3872..a939bd0d2 100644 --- a/src/particles/emission/particle_br_electron_fluid.f90 +++ b/src/particles/emission/particle_br_electron_fluid.f90 @@ -70,8 +70,11 @@ END SUBROUTINE DefineParametersBR SUBROUTINE InitSwitchBRElectronModel() ! MODULES ! USE MOD_HDG_Vars -USE MOD_Globals ,ONLY: myrank, abort, UNIT_StdOut +USE MOD_Globals ,ONLY: abort, UNIT_StdOut USE MOD_ReadInTools ,ONLY: GETLOGICAL,GETREAL,PrintOption +#if USE_MPI +USE MOD_Globals ,ONLY: myrank +#endif /*USE_MPI*/ !----------------------------------------------------------------------------------------------------------------------------------! IMPLICIT NONE ! INPUT / OUTPUT VARIABLES diff --git a/src/particles/emission/particle_emission_tools.f90 b/src/particles/emission/particle_emission_tools.f90 index fb1855bf8..fa877d894 100644 --- a/src/particles/emission/particle_emission_tools.f90 +++ b/src/particles/emission/particle_emission_tools.f90 @@ -1711,7 +1711,6 @@ SUBROUTINE CalcVelocity_FromWorkFuncSEE(W, m, t_vec, n_vec, Vec3D) ! MODULES USE MOD_Globals USE MOD_Globals_Vars ,ONLY: PI, ElementaryCharge -USE MOD_Particle_Vars ,ONLY: Species IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES @@ -2184,7 +2183,7 @@ PPURE LOGICAL FUNCTION InsideQuadrilateral(X,NonUniqueGlobalSideID) RESULT(L) ! LOCAL VARIABLES LOGICAL :: pos,neg INTEGER :: iNode,CNElemID,locSideID -REAL :: normal(2),corner(2),P(1:2,1:4),d(3) +REAL :: P(1:2,1:4),d(3) !=================================================================================================================================== CNElemID = GetCNElemID(SideInfo_Shared(SIDE_ELEMID,NonUniqueGlobalSideID)) locSideID = SideInfo_Shared(SIDE_LOCALID,NonUniqueGlobalSideID) diff --git a/src/particles/emission/particle_position_and_velocity.f90 b/src/particles/emission/particle_position_and_velocity.f90 index 4570a5846..9616e129d 100644 --- a/src/particles/emission/particle_position_and_velocity.f90 +++ b/src/particles/emission/particle_position_and_velocity.f90 @@ -544,7 +544,10 @@ SUBROUTINE SetPartPosAndVeloEmissionDistribution(iSpec,iInit,NbrOfParticle) ! modules !USE MOD_Globals USE MOD_PreProc -USE MOD_Globals ,ONLY: myrank,UNIT_StdOut,MPI_COMM_WORLD,abort +#if USE_MPI +USE MOD_Globals ,ONLY: myrank +#endif /*USE_MPI*/ +USE MOD_Globals ,ONLY: UNIT_StdOut,MPI_COMM_WORLD,abort USE MOD_part_tools ,ONLY: InitializeParticleMaxwell,InterpolateEmissionDistribution2D USE MOD_Mesh_Vars ,ONLY: nElems,offsetElem USE MOD_Particle_Vars ,ONLY: Species, PDM, PartState, PEM, LastPartPos diff --git a/src/particles/particle_mesh/particle_bgm.f90 b/src/particles/particle_mesh/particle_bgm.f90 index d9a07589e..355e96eaf 100644 --- a/src/particles/particle_mesh/particle_bgm.f90 +++ b/src/particles/particle_mesh/particle_bgm.f90 @@ -136,7 +136,7 @@ SUBROUTINE BuildBGMAndIdentifyHaloRegion() ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -INTEGER :: iElem,iHaloElem,iLocSide,SideID +INTEGER :: iElem,iLocSide,SideID INTEGER :: FirstElem,LastElem INTEGER :: firstNodeID,lastNodeID INTEGER :: offsetNodeID,nNodeIDs,currentOffset @@ -147,7 +147,7 @@ SUBROUTINE BuildBGMAndIdentifyHaloRegion() INTEGER :: BGMCellXmax,BGMCellXmin,BGMCellYmax,BGMCellYmin,BGMCellZmax,BGMCellZmin INTEGER :: BGMiminglob,BGMimaxglob,BGMjminglob,BGMjmaxglob,BGMkminglob,BGMkmaxglob #if USE_MPI -INTEGER :: iSide +INTEGER :: iSide,iHaloElem INTEGER :: ElemID,ElemDone REAL :: deltaT REAL :: globalDiag,maxCellRadius @@ -185,6 +185,7 @@ SUBROUTINE BuildBGMAndIdentifyHaloRegion() REAL :: BoundingBoxVolume ! Mortar INTEGER :: iMortar,NbElemID,NbSideID,nMortarElems!,nFoundSides,nlocSides,i +CHARACTER(LEN=255) :: hilf #else REAL :: halo_eps #endif /*USE_MPI*/ @@ -192,7 +193,6 @@ SUBROUTINE BuildBGMAndIdentifyHaloRegion() INTEGER,ALLOCATABLE :: NumberOfElements(:) #endif /*CODE_ANALYZE*/ REAL :: StartT,EndT ! Timer -CHARACTER(LEN=255) :: hilf !=================================================================================================================================== ! Read parameter for FastInitBackgroundMesh (FIBGM) diff --git a/src/particles/particle_mesh/particle_mesh.f90 b/src/particles/particle_mesh/particle_mesh.f90 index 09fa12b5f..f93a48807 100644 --- a/src/particles/particle_mesh/particle_mesh.f90 +++ b/src/particles/particle_mesh/particle_mesh.f90 @@ -149,7 +149,7 @@ SUBROUTINE InitParticleMesh() USE MOD_Preproc USE MOD_Mesh_Tools ,ONLY: InitGetGlobalElemID,InitGetCNElemID,GetCNElemID USE MOD_Mesh_Tools ,ONLY: InitGetGlobalSideID,InitGetCNSideID,GetGlobalSideID,InitElemNodeIDs -USE MOD_Mesh_Vars ,ONLY: deleteMeshPointer,NodeCoords +USE MOD_Mesh_Vars ,ONLY: deleteMeshPointer!,NodeCoords USE MOD_Mesh_Vars ,ONLY: NGeo,NGeoElevated USE MOD_Mesh_Vars ,ONLY: useCurveds #if USE_MPI @@ -180,6 +180,8 @@ SUBROUTINE InitParticleMesh() ! USE MOD_MPI_Vars ,ONLY: offsetMPISides_YOUR #endif /*CODE_ANALYZE*/ #if USE_MPI +USE MOD_IO_HDF5 ,ONLY: AddToElemData,ElementOut +USE MOD_Mesh_Vars ,ONLY: nElems USE MOD_Particle_BGM ,ONLY: WriteHaloInfo USE MOD_MPI_Shared USE MOD_MPI_Shared_Vars @@ -192,8 +194,6 @@ SUBROUTINE InitParticleMesh() USE MOD_LoadBalance_Vars ,ONLY: PerformLoadBalance #endif /*USE_LOADBALANCE*/ USE MOD_PICDepo_Shapefunction_Tools, ONLY:InitShapeFunctionDimensionalty -USE MOD_IO_HDF5 ,ONLY: AddToElemData,ElementOut -USE MOD_Mesh_Vars ,ONLY: nElems USE MOD_Particle_Boundary_Init ,ONLY: InitPartStateBoundary USE MOD_Particle_Boundary_Vars ,ONLY: DoBoundaryParticleOutputHDF5,nSurfSample USE MOD_Photon_TrackingVars ,ONLY: PhotonModeBPO diff --git a/src/particles/particle_mesh/particle_mesh_build.f90 b/src/particles/particle_mesh/particle_mesh_build.f90 index d70150a37..5da9df8ad 100644 --- a/src/particles/particle_mesh/particle_mesh_build.f90 +++ b/src/particles/particle_mesh/particle_mesh_build.f90 @@ -44,8 +44,8 @@ SUBROUTINE BuildMesh2DInfo() USE MOD_Mesh_Vars ,ONLY: nElems USE MOD_Particle_Boundary_Vars ,ONLY: PartBound USE MOD_Particle_Mesh_Vars ,ONLY: GEO -USE MOD_Particle_Mesh_Vars ,ONLY: nComputeNodeSides, ElemBaryNGeo -USE MOD_Particle_Mesh_Vars ,ONLY: NodeCoords_Shared,ElemSideNodeID_Shared, SideInfo_Shared, ElemInfo_Shared +USE MOD_Particle_Mesh_Vars ,ONLY: ElemBaryNGeo +USE MOD_Particle_Mesh_Vars ,ONLY: NodeCoords_Shared,ElemSideNodeID_Shared, SideInfo_Shared USE MOD_Mesh_Tools ,ONLY: GetGlobalElemID USE MOD_Particle_Mesh_Tools ,ONLY: GetGlobalNonUniqueSideID #if USE_MPI @@ -64,9 +64,9 @@ SUBROUTINE BuildMesh2DInfo() ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -INTEGER :: SideID, iLocSide, iNode, BCSideID, locElemID, CNElemID, iSide, iELem +INTEGER :: SideID, iLocSide, iNode, iELem REAL :: VecCell(2), FaceMidPoint(2), NormVec(2), EdgeVec(2), nVal -INTEGER :: firstElem,lastElem, firstSide, lastSide, GlobalElemID, tmpNode +INTEGER :: firstElem,lastElem, GlobalElemID, tmpNode LOGICAL :: DefineSide !=================================================================================================================================== #if USE_MPI @@ -998,11 +998,12 @@ SUBROUTINE BuildNodeNeighbourhood() !----------------------------------------------------------------------------------------------------------------------------------! ! MODULES ! !----------------------------------------------------------------------------------------------------------------------------------! -USE MOD_Globals ,ONLY: abort,MPIRoot,UNIT_stdOUt,DisplayMessageAndTime!,myRank +USE MOD_Globals ,ONLY: abort,UNIT_stdOUt,DisplayMessageAndTime!,myRank USE MOD_Particle_Mesh_Vars ,ONLY: nUniqueGlobalNodes USE MOD_Particle_Mesh_Vars ,ONLY: ElemNodeID_Shared,NodeInfo_Shared USE MOD_Particle_Mesh_Vars ,ONLY: NodeToElemMapping,NodeToElemInfo,ElemToElemMapping,ElemToElemInfo #if USE_MPI +USE MOD_Globals ,ONLY: MPIRoot USE MPI USE MOD_MPI_Shared USE MOD_MPI_Shared_Vars ,ONLY: nComputeNodeTotalElems diff --git a/src/particles/particle_mesh/particle_mesh_tools.f90 b/src/particles/particle_mesh/particle_mesh_tools.f90 index 26db02ee7..8e7d3970e 100644 --- a/src/particles/particle_mesh/particle_mesh_tools.f90 +++ b/src/particles/particle_mesh/particle_mesh_tools.f90 @@ -1372,10 +1372,10 @@ SUBROUTINE CalcParticleMeshMetrics() USE MOD_Globals USE MOD_PreProc USE MOD_Mesh_Vars ,ONLY: Elem_xGP -USE MOD_Mesh_Vars ,ONLY: NGeo,dXCL_NGeo +USE MOD_Mesh_Vars ,ONLY: dXCL_NGeo USE MOD_Particle_Mesh_Vars #if USE_MPI -USE MOD_Mesh_Vars ,ONLY: nGlobalElems,offsetElem,nElems +USE MOD_Mesh_Vars ,ONLY: NGeo,nGlobalElems,offsetElem,nElems USE MOD_MPI_Shared USE MOD_MPI_Shared_Vars #endif diff --git a/src/particles/sampling/particle_sampling_adaptive.f90 b/src/particles/sampling/particle_sampling_adaptive.f90 index ff9b9f173..85d337385 100644 --- a/src/particles/sampling/particle_sampling_adaptive.f90 +++ b/src/particles/sampling/particle_sampling_adaptive.f90 @@ -79,11 +79,14 @@ SUBROUTINE InitAdaptiveBCSampling() USE MOD_SurfaceModel_Vars ,ONLY: nPorousBC USE MOD_Particle_Boundary_Vars ,ONLY: nPorousSides, PorousBCInfo_Shared, SurfSide2GlobalSide USE MOD_Particle_Mesh_Vars ,ONLY: SideInfo_Shared, ElemVolume_Shared -USE MOD_LoadBalance_Vars ,ONLY: PerformLoadBalance, UseH5IOLoadBalance +USE MOD_LoadBalance_Vars ,ONLY: PerformLoadBalance USE MOD_Mesh_Tools ,ONLY: GetCNElemID #if USE_MPI USE MOD_Particle_MPI_Vars ,ONLY: PartMPI #endif /*USE_MPI*/ +#if USE_LOADBALANCE +USE MOD_LoadBalance_Vars ,ONLY: UseH5IOLoadBalance +#endif /*USE_LOADBALANCE*/ ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- diff --git a/src/timedisc/timedisc_init.f90 b/src/timedisc/timedisc_init.f90 index 32e0b08d8..fef8da549 100644 --- a/src/timedisc/timedisc_init.f90 +++ b/src/timedisc/timedisc_init.f90 @@ -367,7 +367,9 @@ SUBROUTINE UpdateTimeStep() #endif /*USE_LOADBALANCE*/ #if (PP_TimeDiscMethod==509) USE MOD_TimeDisc_Vars ,ONLY: iter,dt_old +#if USE_MPI USE MOD_Globals ,ONLY: MPIRoot +#endif /*USE_MPI*/ #endif /*(PP_TimeDiscMethod==509)*/ ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE From 7ab77a7d4a21ab4e29e46df436a4d4b3ea9362b4 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Wed, 5 Jul 2023 22:33:48 +0200 Subject: [PATCH 104/495] Fixes for compiling ray tracing with MPI=ON --- src/particles/boundary/particle_boundary_init.f90 | 1 + src/particles/boundary/particle_boundary_sampling.f90 | 7 +++++++ src/particles/boundary/particle_boundary_vars.f90 | 3 +++ src/particles/particle_mesh/particle_mesh.f90 | 2 +- 4 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/particles/boundary/particle_boundary_init.f90 b/src/particles/boundary/particle_boundary_init.f90 index e747c13e8..f9618aebf 100644 --- a/src/particles/boundary/particle_boundary_init.f90 +++ b/src/particles/boundary/particle_boundary_init.f90 @@ -1265,6 +1265,7 @@ SUBROUTINE FinalizeParticleBoundary() SDEALLOCATE(PartBound%PhotonEnACC) SDEALLOCATE(PartBound%PhotonSEEYield) SDEALLOCATE(PartBound%PhotonSEEWorkFunction) +SDEALLOCATE(PartBound%PhotonSEEMacroParticleFactor) SDEALLOCATE(PartBound%PhotonSEEElectronSpecies) SDEALLOCATE(PartBound%PhotonSpecularReflection) SDEALLOCATE(PartBound%RotOmega) diff --git a/src/particles/boundary/particle_boundary_sampling.f90 b/src/particles/boundary/particle_boundary_sampling.f90 index eee8a5b38..44c29756c 100644 --- a/src/particles/boundary/particle_boundary_sampling.f90 +++ b/src/particles/boundary/particle_boundary_sampling.f90 @@ -113,6 +113,7 @@ SUBROUTINE InitParticleBoundarySampling() USE MOD_Particle_Boundary_Vars ,ONLY: GlobalSide2SurfSide_Shared,GlobalSide2SurfSide_Shared_Win USE MOD_Particle_Boundary_Vars ,ONLY: SurfSide2GlobalSide_Shared,SurfSide2GlobalSide_Shared_Win USE MOD_Particle_Boundary_Vars ,ONLY: SurfSideArea_Shared,SurfSideArea_Shared_Win +USE MOD_Particle_Boundary_Vars ,ONLY: SurfSideSamplingMidPoints_Shared,SurfSideSamplingMidPoints_Shared_Win USE MOD_Particle_Boundary_Vars ,ONLY: SampWallState_Shared,SampWallState_Shared_Win USE MOD_Particle_Boundary_Vars ,ONLY: SampWallPumpCapacity_Shared,SampWallPumpCapacity_Shared_Win USE MOD_Particle_Boundary_Vars ,ONLY: SampWallImpactEnergy_Shared,SampWallImpactEnergy_Shared_Win @@ -567,7 +568,10 @@ SUBROUTINE InitParticleBoundarySampling() #if USE_MPI CALL Allocate_Shared((/nSurfSample,nSurfSample,nComputeNodeSurfTotalSides/),SurfSideArea_Shared_Win,SurfSideArea_Shared) CALL MPI_WIN_LOCK_ALL(0,SurfSideArea_Shared_Win,IERROR) +CALL Allocate_Shared((/3,nSurfSample,nSurfSample,nComputeNodeSurfTotalSides/),SurfSideSamplingMidPoints_Shared_Win,SurfSideSamplingMidPoints_Shared) +CALL MPI_WIN_LOCK_ALL(0,SurfSideSamplingMidPoints_Shared_Win,IERROR) SurfSideArea => SurfSideArea_Shared +SurfSideSamplingMidPoints => SurfSideSamplingMidPoints_Shared firstSide = INT(REAL( myComputeNodeRank )*REAL(nComputeNodeSurfTotalSides)/REAL(nComputeNodeProcessors))+1 lastSide = INT(REAL((myComputeNodeRank+1))*REAL(nComputeNodeSurfTotalSides)/REAL(nComputeNodeProcessors)) @@ -1228,6 +1232,7 @@ SUBROUTINE FinalizeParticleBoundarySampling() CALL UNLOCK_AND_FREE(SampWallState_Shared_Win) CALL UNLOCK_AND_FREE(SurfSideArea_Shared_Win) +CALL UNLOCK_AND_FREE(SurfSideSamplingMidPoints_Shared_Win) IF(nPorousBC.GT.0) CALL UNLOCK_AND_FREE(SampWallPumpCapacity_Shared_Win) IF (CalcSurfaceImpact) THEN CALL UNLOCK_AND_FREE(SampWallImpactEnergy_Shared_Win) @@ -1252,6 +1257,7 @@ SUBROUTINE FinalizeParticleBoundarySampling() ADEALLOCATE(SampWallImpactAngle_Shared) ADEALLOCATE(SampWallImpactNumber_Shared) ADEALLOCATE(SurfSideArea_Shared) +ADEALLOCATE(SurfSideSamplingMidPoints_Shared) #endif /*USE_MPI*/ ! Then, free the pointers or arrays @@ -1264,6 +1270,7 @@ SUBROUTINE FinalizeParticleBoundarySampling() SDEALLOCATE(SampWallImpactAngle) SDEALLOCATE(SampWallImpactNumber) ADEALLOCATE(SurfSideArea) +ADEALLOCATE(SurfSideSamplingMidPoints) ADEALLOCATE(GlobalSide2SurfSide) ADEALLOCATE(SurfSide2GlobalSide) SDEALLOCATE(MacroSurfaceVal) diff --git a/src/particles/boundary/particle_boundary_vars.f90 b/src/particles/boundary/particle_boundary_vars.f90 index 35fdda201..6b88ee707 100644 --- a/src/particles/boundary/particle_boundary_vars.f90 +++ b/src/particles/boundary/particle_boundary_vars.f90 @@ -84,6 +84,9 @@ MODULE MOD_Particle_Boundary_Vars REAL,POINTER,DIMENSION(:,:,:) :: SurfSideArea_Shared !> Area of supersampled surface side INTEGER :: SurfSideArea_Shared_Win +REAL,POINTER,DIMENSION(:,:,:,:) :: SurfSideSamplingMidPoints_Shared !> Physical coordinate of the center of supersampled surface side +INTEGER :: SurfSideSamplingMidPoints_Shared_Win + INTEGER,ALLOCATABLE,DIMENSION(:,:) :: GlobalSide2SurfHaloSide ! Mapping Global Side ID to Surf Halo Side ID (exists only on leader procs) !> 1st dim: leader rank !> 2nd dim: Surf SideID diff --git a/src/particles/particle_mesh/particle_mesh.f90 b/src/particles/particle_mesh/particle_mesh.f90 index f93a48807..19c320d43 100644 --- a/src/particles/particle_mesh/particle_mesh.f90 +++ b/src/particles/particle_mesh/particle_mesh.f90 @@ -81,7 +81,7 @@ SUBROUTINE DefineParametersParticleMesh() 'information is stored in a PartStateLost*.h5 file. When particles are not found during restart in their host cell '//& '(sanity check), they are marked missing and are also written to PartStateLost*.h5 file even if they are re-located '//& 'on a different processor.','.TRUE.') -CALL prms%CreateIntOption( 'PhotonModeBPO' , 'Output mode to store position, direction, host element etc. of rays/photons in PartStateBoundary.h5 from radiation transport or ray tracing solver:\n'& +CALL prms%CreateIntOption( 'PhotonModeBPO' , 'Output mode to store position, direction, host element etc. of rays/photons in PartStateBoundary.h5 (only radiation transport or ray tracing solver):\n'& '0: Output nothing to PartStateBoundary.h5\n'& '1: Output the initial position of the rays and their direction vector\n'& '2: Output initial position and all calculated intersection points calculated in radtrans tracking\n'& From 9c7ac23bc32fd7cc9941029b949083f8fcc03027 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Sun, 9 Jul 2023 17:47:12 +0200 Subject: [PATCH 105/495] Added new ray tracing flag RayTracing-VolRefineMode to select between different volumetric refinement strategies. --- src/radiation/ray_tracing/raytrace_ini.f90 | 177 +++++++++++++++----- src/radiation/ray_tracing/raytrace_vars.f90 | 9 + 2 files changed, 146 insertions(+), 40 deletions(-) diff --git a/src/radiation/ray_tracing/raytrace_ini.f90 b/src/radiation/ray_tracing/raytrace_ini.f90 index 9860cace9..2bd0fd434 100644 --- a/src/radiation/ray_tracing/raytrace_ini.f90 +++ b/src/radiation/ray_tracing/raytrace_ini.f90 @@ -49,23 +49,32 @@ SUBROUTINE DefineParametersRayTracing() CALL prms%CreateRealOption( 'RayTracing-Power' , 'Average pulse power (energy of a single pulse times repetition rate) [W]' ) CALL prms%CreateLogicalOption( 'RayTracing-ForceAbsorption', 'Surface photon sampling is performed independent of the actual absorption/reflection outcome (default=T)', '.TRUE.') -CALL prms%CreateIntOption( 'RayTracing-NMax' , 'Maximum polynomial degree within refined volume elements for photon tracking (p-adaption)') +CALL prms%CreateIntOption( 'RayTracing-NMax' , 'Maximum polynomial degree within refined volume elements for photon tracking (p-adaption)') +CALL prms%CreateLogicalOption( 'RayTracing-VolRefineMode' , 'High-order ray tracing volume sampling refinement method:\n'//& + ' 0: do nothing (default)\n'//& + ' 1: refine below user-defined z-coordinate with NMax\n'//& + ' 2: scale N according to the mesh element volume between NMin>=1 and NMax>=2\n'//& + ' 3: refine below user-defined z-coordinate and scale N according to the mesh element volume between NMin>=1 and NMax>=2\n'//& + ' (consider only elements below the user-defined z-coordinate for the scaling)'& + ,'.TRUE.') +CALL prms%CreateRealOption( 'RayTracing-VolRefineModeZ' , 'Z-coordinate for switching between NMin (pos>z) and NMax (pos=1 and NMax>=2 + ! 3: refine below user-defined z-coordinate and scale N according to the mesh element volume between NMin>=1 and NMax>=2 + ! (consider only elements below the user-defined z-coordinate for the scaling) + IF((Ray%VolRefineMode.EQ.2).OR.(Ray%VolRefineMode.EQ.3))THEN + ! Get global min and max volume: Only consider elements below the z-coordinate + VolMin = HUGE(1.) + VolMax = -HUGE(1.) + FoundElem = .FALSE. + DO iElem = 1, PP_nElems + CNElemID = GetCNElemID(iElem) + IF((ElemBaryNGeo(3,CNElemID).LT.Ray%VolRefineModeZ).OR.(Ray%VolRefineMode.EQ.2))THEN + VolMin = MIN(VolMin, ElemVolume_Shared(CNElemID)) + VolMax = MAX(VolMax, ElemVolume_Shared(CNElemID)) + FoundElem = .TRUE. + END IF + END DO ! iElem = 1, PP_nElems +#if USE_MPI + CALL MPI_ALLREDUCE(MPI_IN_PLACE, VolMin, 1, MPI_DOUBLE_PRECISION, MPI_MIN, MPI_COMM_WORLD, IERROR) + CALL MPI_ALLREDUCE(MPI_IN_PLACE, VolMax, 1, MPI_DOUBLE_PRECISION, MPI_MAX, MPI_COMM_WORLD, IERROR) +#endif /*USE_MPI*/ + + ! Loop over all elements again and scale the polynomial degree using NINT. + ! Check if the volumes of the elements are almost equal + IF((VolMax.GT.VolMin).AND.(.NOT.ALMOSTEQUALRELATIVE(VolMax,VolMin,1e-2)))THEN + ! Get the slope of the linear interpolation function between the maximum and minimum of the element volumes + m = REAL(Ray%Nmax-Ray%Nmin)/(VolMax-VolMin) + IF(FoundElem)THEN + DO iElem = 1, PP_nElems + CNElemID = GetCNElemID(iElem) + IF(ElemBaryNGeo(3,CNElemID).LT.Ray%VolRefineModeZ)THEN + NReal = m * (ElemVolume_Shared(CNElemID)-VolMin) + REAL(Ray%Nmin) + N_DG_Ray(iElem) = NINT(NReal) + END IF + END DO ! iElem = 1, PP_nElems + END IF ! FoundElem + END IF ! (VolMax.GT.VolMin).AND.(.NOT.ALMOST) + + END IF ! Ray%VolRefineMode.EQ.3 + CASE DEFAULT + ! Debugging: +#if defined(CODE_ANALYZE) + ! 3D box test case with diagonal rays + IF(debugRay)THEN + N_DG_Ray = Ray%Nmax + DO iElem = 1, PP_nElems + CNElemID = GetCNElemID(iElem) + ASSOCIATE( & + x => ElemBaryNGeo(1,CNElemID),& + y => ElemBaryNGeo(2,CNElemID),& + z => ElemBaryNGeo(3,CNElemID)) + IF(y+z.GE.1.40)THEN + N_DG_Ray(iElem) = 1 + CYCLE + END IF ! y+z.GT.1.5 + + IF(y+z.LE.0.6)THEN + N_DG_Ray(iElem) = 1 + CYCLE + END IF ! y+z.LT.0.5 + + IF(y+z.LT.0.9)THEN + N_DG_Ray(iElem) = Ray%Nmax-1 + CYCLE + END IF ! y+z.GT.1.00001 + + IF(y+z.GT.1.1)THEN + N_DG_Ray(iElem) = Ray%Nmax-1 + CYCLE + END IF ! y+z.GT.1.00001 + END ASSOCIATE + END DO ! iElem = 1, PP_nElems + END IF ! debugRay +#else + CALL abort(__STAMP__,'RayTracing-VolRefineMode unknown: ',IntInfoOpt=Ray%VolRefineMode) +#endif /*defined(CODE_ANALYZE)*/ + END SELECT +END IF ! Ray%NMin.NE.Ray%NMax + +! Sanity check +IF(ANY(N_DG_Ray.LE.0)) CALL abort(__STAMP__,'N_DG_Ray cannot contain zeros!') ! Allocate interpolation variables ALLOCATE(N_Inter_Ray(Ray%Nmin:Ray%Nmax)) diff --git a/src/radiation/ray_tracing/raytrace_vars.f90 b/src/radiation/ray_tracing/raytrace_vars.f90 index c083b180d..08f4bf852 100644 --- a/src/radiation/ray_tracing/raytrace_vars.f90 +++ b/src/radiation/ray_tracing/raytrace_vars.f90 @@ -43,6 +43,15 @@ MODULE MOD_RayTracing_Vars INTEGER :: NMin !< Minimum polynomial degree for the high-order volume sampling (p-adaption) INTEGER :: NMax !< Maximum polynomial degree for the high-order volume sampling (p-adaption) + INTEGER :: VolRefineMode !< High-order ray tracing volume sampling refinement method: + !< 0: do nothing (default) + !< 1: refine below user-defined z-coordinate with NMax + !< 2: scale N according to the mesh element volume between NMin>=1 and NMax>=2 + !< 3: refine below user-defined z-coordinate and scale N according to the mesh element volume between NMin>=1 and NMax>=2 + !< (consider only elements below the user-defined z-coordinate for the scaling) + + REAL :: VolRefineModeZ !< z-coordinate for switching between NMin and NMax + END TYPE TYPE (tRayTrace) :: Ray !< From f8ad81c429964375944023ae0e8745b86a715a76 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Sun, 9 Jul 2023 23:46:48 +0200 Subject: [PATCH 106/495] Ray tracing on surfaces with nSurfSample>1 requires building Face_xGP during InitMesh() that is called with meshMode=-1, which now sets BuildFacexGP=T to also calculate the metrics and therefore the Face_xGP array. --- src/mesh/mesh.f90 | 11 +++++++---- src/posti/piclas2vtk/piclas2vtk.f90 | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/mesh/mesh.f90 b/src/mesh/mesh.f90 index a671372d8..d3e66a639 100644 --- a/src/mesh/mesh.f90 +++ b/src/mesh/mesh.f90 @@ -127,7 +127,7 @@ SUBROUTINE InitMesh(meshMode,MeshFile_IN) !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT/OUTPUT VARIABLES INTEGER,INTENT(IN) :: meshMode !< 0: only read and build Elem_xGP, - !< -1: as 0 + build connectivity and read node info (automatically read for PARTICLES=ON) + !< -1: as 0 + build connectivity and always set ReadNodes=T: read node info (automatically read for PARTICLES=ON) and set BuildFacexGP=T !< 1: as 0 + build connectivity !< 2: as 1 + calc metrics !< 3: as 2 but skip InitParticleMesh @@ -140,7 +140,7 @@ SUBROUTINE InitMesh(meshMode,MeshFile_IN) INTEGER :: iElem,i,j,k,nElemsLoc !CHARACTER(32) :: hilf2 CHARACTER(LEN=255) :: FileName -LOGICAL :: validMesh,ExistFile,ReadNodes +LOGICAL :: validMesh,ExistFile,ReadNodes,BuildFacexGP !=================================================================================================================================== IF ((.NOT.InterpolationInitIsDone).OR.MeshInitIsDone) THEN CALL abort(__STAMP__,'InitMesh not ready to be called or already called.') @@ -154,6 +154,9 @@ SUBROUTINE InitMesh(meshMode,MeshFile_IN) IF(meshMode.LT.0) ReadNodes =.TRUE. #endif /*defined(PARTICLES)*/ +BuildFacexGP = .FALSE. ! default +IF(meshMode.LT.0) BuildFacexGP =.TRUE. + ! Output of myrank, ElemID and tracking info CalcMeshInfo = GETLOGICAL('CalcMeshInfo') @@ -304,7 +307,7 @@ SUBROUTINE InitMesh(meshMode,MeshFile_IN) END IF ! meshMode.GT.0 -IF (ABS(meshMode).GT.1) THEN +IF ((ABS(meshMode).GT.1).OR.BuildFacexGP) THEN ! ----- CONNECTIVITY IS NOW COMPLETE AT THIS POINT ----- @@ -377,7 +380,7 @@ SUBROUTINE InitMesh(meshMode,MeshFile_IN) DEALLOCATE(dXCL_N) DEALLOCATE(Ja_Face) - IF(ABS(meshMode).NE.3)THEN + IF((ABS(meshMode).NE.3).AND.(.NOT.BuildFacexGP))THEN #ifdef PARTICLES IF(RadialWeighting%DoRadialWeighting) THEN usevMPF = .TRUE. diff --git a/src/posti/piclas2vtk/piclas2vtk.f90 b/src/posti/piclas2vtk/piclas2vtk.f90 index 260e04abc..2d5579943 100644 --- a/src/posti/piclas2vtk/piclas2vtk.f90 +++ b/src/posti/piclas2vtk/piclas2vtk.f90 @@ -268,7 +268,7 @@ PROGRAM piclas2vtk ! Read-in of the mesh IF(.NOT.ReadMeshFinished) THEN - CALL InitMesh(3,MeshFile_IN=MeshFile) + CALL InitMesh(-1,MeshFile_IN=MeshFile) CALL InitGetGlobalElemID() CALL InitGetCNElemID() #if USE_MPI From 6befb4dde798c9e712e0a95da6cf8e253341e84e Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Mon, 10 Jul 2023 10:06:13 +0200 Subject: [PATCH 107/495] Fix periodic ray tracing photon tracking for high-order sampling, which requires the intersection point for volume absorption. --- .../tracking/radtrans_tracking.f90 | 38 ++++++++++++++----- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 index 1aafc9c52..8b04a65eb 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 @@ -149,7 +149,7 @@ SUBROUTINE PhotonTriaTracking() END DO ! iLocSide=1,6 TriNum = TriNumTemp(1) ! ---------------------------------------------------------------------------- - ! Addition treatment if particle did not cross any sides or it crossed multiple sides + ! Additional treatment if particle did not cross any sides or it crossed multiple sides IF (NrOfThroughSides.NE.1) THEN ! 2c) If no sides are found, the particle is deleted (very rare case). If multiple possible sides are found, additional ! treatment is required, where the particle path is reconstructed (which side was crossed first) by comparing the ratio @@ -162,7 +162,7 @@ SUBROUTINE PhotonTriaTracking() CALL StoreLostPhotonProperties(LastPhotPos,Pos,Dir,ElemID) NbrOfLostParticles=NbrOfLostParticles+1 IF(DisplayLostParticles)THEN - IPWRITE(*,*) 'Error in Photon TriaTracking! Photon lost. Element:', ElemID + IPWRITE(*,*) 'Error in Photon TriaTracking (NrOfThroughSides=0)! Photon lost. Element:', ElemID IPWRITE(*,*) 'LastPos: ', PhotonProps%PhotonLastPos(1:3) IPWRITE(*,*) 'Pos: ', PhotonProps%PhotonPos(1:3) IPWRITE(*,*) 'Direction:', PhotonProps%PhotonDirection(1:3) @@ -278,6 +278,7 @@ SUBROUTINE PhotonTriaTracking() END IF END IF ! NrOfThroughSides.EQ.0/.GT.1 END IF ! NrOfThroughSides.NE.1 + ! ---------------------------------------------------------------------------- ! 3) In case of a boundary, perform the appropriate boundary interaction IF (SideInfo_Shared(SIDE_BCID,SideID).GT.0) THEN @@ -285,6 +286,7 @@ SUBROUTINE PhotonTriaTracking() iPBC = PartBound%MapToPartBC(SideInfo_Shared(SIDE_BCID,SideID)) BCType = PartBound%TargetBoundCond(iPBC) SELECT CASE(BCType) + CASE(1) !PartBound%OpenBC) IF(NrOfThroughSides.LT.2)THEN CALL PhotonIntersectionWithSide(LocalSide,ElemID,TriNum, IntersectionPos, PhotonLost) @@ -295,7 +297,7 @@ SUBROUTINE PhotonTriaTracking() CALL StoreLostPhotonProperties(LastPhotPos,Pos,Dir,ElemID) NbrOfLostParticles=NbrOfLostParticles+1 IF(DisplayLostParticles)THEN - IPWRITE(*,*) 'Error in Photon TriaTracking! PhotonIntersectionWithSide() cannot determine intersection'& + IPWRITE(*,*) 'Error in open BC Photon TriaTracking! PhotonIntersectionWithSide() cannot determine intersection'& //' because photon is parallel to side. ElemID:', ElemID IPWRITE(*,*) 'LastPos: ', PhotonProps%PhotonLastPos(1:3) IPWRITE(*,*) 'Pos: ', PhotonProps%PhotonPos(1:3) @@ -322,6 +324,7 @@ SUBROUTINE PhotonTriaTracking() END IF END IF DONE = .TRUE. + CASE(2) ! PartBound%ReflectiveBC ! Backup photon direction for ray tracing IF(RadiationAbsorptionModel.EQ.0) PhotonProps%PhotonDirectionBeforeReflection(1:3) = PhotonProps%PhotonDirection(1:3) @@ -356,12 +359,29 @@ SUBROUTINE PhotonTriaTracking() END IF ! RadiationAbsorptionModel.EQ.0 CASE(3) ! PartBound%PeriodicBC - CALL CalcAbsoprtion(IntersectionPos(1:3), ElemID, DONE) - IF (NrOfThroughSides.LT.2) THEN - CALL PeriodicPhotonBC(LocalSide,ElemID,TriNum,IntersectionPos,.FALSE.,SideID) - ELSE - CALL PeriodicPhotonBC(LocalSide,ElemID,TriNum,IntersectionPos,.TRUE.,SideID) - END IF + IF(NrOfThroughSides.LT.2)THEN + CALL PhotonIntersectionWithSide(LocalSide,ElemID,TriNum, IntersectionPos, PhotonLost) + IF(PhotonLost)THEN + ASSOCIATE( LastPhotPos => PhotonProps%PhotonLastPos(1:3), & + Pos => PhotonProps%PhotonPos(1:3), & + Dir => PhotonProps%PhotonDirection(1:3) ) + CALL StoreLostPhotonProperties(LastPhotPos,Pos,Dir,ElemID) + NbrOfLostParticles=NbrOfLostParticles+1 + IF(DisplayLostParticles)THEN + IPWRITE(*,*) 'Error in periodic Photon TriaTracking! PhotonIntersectionWithSide() cannot determine intersection'& + //' because photon is parallel to side. ElemID:', ElemID + IPWRITE(*,*) 'LastPos: ', PhotonProps%PhotonLastPos(1:3) + IPWRITE(*,*) 'Pos: ', PhotonProps%PhotonPos(1:3) + IPWRITE(*,*) 'Direction:', PhotonProps%PhotonDirection(1:3) + IPWRITE(*,*) 'Photon deleted!' + END IF ! DisplayLostParticles + END ASSOCIATE + Done = .TRUE. + EXIT + END IF ! PhotonLost + END IF ! NrOfThroughSides.LT.2 + CALL CalcAbsoprtion(IntersectionPos(1:3), ElemID, DONE) + CALL PeriodicPhotonBC(LocalSide,ElemID,TriNum,IntersectionPos,.TRUE.,SideID) CASE DEFAULT CALL abort(__STAMP__,' ERROR: PartBound not associated!. (unknown case)',BCType,999.) END SELECT !PartBound%MapToPartBC(BC(SideID) From e36fa6607da55588cbdd784e6b1a07004f988b39 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Mon, 10 Jul 2023 10:07:10 +0200 Subject: [PATCH 108/495] Fixed RayTracing-VolRefineMode define params creation --- src/radiation/ray_tracing/raytrace_ini.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/radiation/ray_tracing/raytrace_ini.f90 b/src/radiation/ray_tracing/raytrace_ini.f90 index 2bd0fd434..7a24ceb89 100644 --- a/src/radiation/ray_tracing/raytrace_ini.f90 +++ b/src/radiation/ray_tracing/raytrace_ini.f90 @@ -50,13 +50,13 @@ SUBROUTINE DefineParametersRayTracing() CALL prms%CreateLogicalOption( 'RayTracing-ForceAbsorption', 'Surface photon sampling is performed independent of the actual absorption/reflection outcome (default=T)', '.TRUE.') CALL prms%CreateIntOption( 'RayTracing-NMax' , 'Maximum polynomial degree within refined volume elements for photon tracking (p-adaption)') -CALL prms%CreateLogicalOption( 'RayTracing-VolRefineMode' , 'High-order ray tracing volume sampling refinement method:\n'//& +CALL prms%CreateIntOption( 'RayTracing-VolRefineMode' , 'High-order ray tracing volume sampling refinement method:\n'//& ' 0: do nothing (default)\n'//& ' 1: refine below user-defined z-coordinate with NMax\n'//& ' 2: scale N according to the mesh element volume between NMin>=1 and NMax>=2\n'//& ' 3: refine below user-defined z-coordinate and scale N according to the mesh element volume between NMin>=1 and NMax>=2\n'//& ' (consider only elements below the user-defined z-coordinate for the scaling)'& - ,'.TRUE.') + ,'0') CALL prms%CreateRealOption( 'RayTracing-VolRefineModeZ' , 'Z-coordinate for switching between NMin (pos>z) and NMax (pos Date: Mon, 10 Jul 2023 10:15:21 +0200 Subject: [PATCH 109/495] Updated ray tracing reggies --- .../surface_emission_rectangle_ray_trace/externals.ini | 5 +++++ .../surface_emission_rectangle_ray_trace/parameter.ini | 9 +++++++-- .../{ => pre-hopr}/hopr.ini | 0 .../command_line.ini | 2 +- .../externals.ini | 5 +++++ .../parameter.ini | 2 +- .../{ => pre-hopr}/hopr.ini | 0 7 files changed, 19 insertions(+), 4 deletions(-) create mode 100644 regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/externals.ini rename regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/{ => pre-hopr}/hopr.ini (100%) create mode 100644 regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/externals.ini rename regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/{ => pre-hopr}/hopr.ini (100%) diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/externals.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/externals.ini new file mode 100644 index 000000000..de70d12fd --- /dev/null +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/externals.ini @@ -0,0 +1,5 @@ +! --- Externals Tool Reggie +MPI = 1 +externalbinary = ./hopr/build/bin/hopr +externaldirectory = pre-hopr +externalruntime = pre diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/parameter.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/parameter.ini index b53e010c6..071579d13 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/parameter.ini +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/parameter.ini @@ -18,7 +18,7 @@ DoInitialAutoRestart = T ! =============================================================================== ! ! MESH ! =============================================================================== ! -MeshFile = box_mesh.h5 +MeshFile = ./pre-hopr/box_mesh.h5 Logging = F WriteErrorFiles = F useCurveds = F @@ -47,7 +47,7 @@ Analyze_dt = 5.0E-9 PIC-DoDeposition = F -PIC-DoInterpolation = F +PIC-DoInterpolation = T Part-LorentzType = 0 epsCG = 1e-2 @@ -114,6 +114,11 @@ Part-FactorFIBGM = (/ 5 , 5 , 5 /) Particles-DSMC-CalcSurfaceVal = T ! activate InitParticleBoundarySampling RayTracing-PartBound = 6 ! -> iBC=6 RayTracing-NumRays = 200000 +RayTracing-VolRefineMode = 0 ! 0: do nothing (default) +! ! 1: refine below user-defined z-coordinate with NMax +! ! 2: scale N according to the mesh element volume between NMin>=1 and NMax>=2 +! ! 3: refine below user-defined z-coordinate and scale N according to the mesh element volume between NMin>=1 and NMax>=2 +! ! (consider only elements below the user-defined z-coordinate for the scaling) PhotonModeBPO = 1 RayTracing-PulseDuration = 15e-9 diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/hopr.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/pre-hopr/hopr.ini similarity index 100% rename from regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/hopr.ini rename to regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/pre-hopr/hopr.ini diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/command_line.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/command_line.ini index 6f94bea14..181521dce 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/command_line.ini +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/command_line.ini @@ -1,2 +1,2 @@ -MPI = 1,2,5,8,11,25 +MPI = 1!,2,5,8,11,25 cmd_suffix = DSMC.ini diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/externals.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/externals.ini new file mode 100644 index 000000000..de70d12fd --- /dev/null +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/externals.ini @@ -0,0 +1,5 @@ +! --- Externals Tool Reggie +MPI = 1 +externalbinary = ./hopr/build/bin/hopr +externaldirectory = pre-hopr +externalruntime = pre diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini index bd7362551..054569407 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini @@ -20,7 +20,7 @@ DoInitialAutoRestart = T ! =============================================================================== ! ! MESH ! =============================================================================== ! -MeshFile = box_mesh.h5 +MeshFile = ./pre-hopr/box_mesh.h5 Logging = F WriteErrorFiles = F useCurveds = F diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/hopr.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/pre-hopr/hopr.ini similarity index 100% rename from regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/hopr.ini rename to regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/pre-hopr/hopr.ini From e4508505c1036dca195b99e58f387d83a4c41249 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Tue, 11 Jul 2023 10:53:04 +0200 Subject: [PATCH 110/495] Fix piclas2vtk usage of NodeCoords for ChangeBasis in conversion of DG_Solution --- src/mesh/mesh.f90 | 14 +++++++------- src/posti/piclas2vtk/piclas2vtk.f90 | 1 - 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/mesh/mesh.f90 b/src/mesh/mesh.f90 index d3e66a639..3467e0063 100644 --- a/src/mesh/mesh.f90 +++ b/src/mesh/mesh.f90 @@ -127,7 +127,7 @@ SUBROUTINE InitMesh(meshMode,MeshFile_IN) !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT/OUTPUT VARIABLES INTEGER,INTENT(IN) :: meshMode !< 0: only read and build Elem_xGP, - !< -1: as 0 + build connectivity and always set ReadNodes=T: read node info (automatically read for PARTICLES=ON) and set BuildFacexGP=T + !< -1: as 0 + build connectivity and always set ReadNodes=T: read node info (automatically read for PARTICLES=ON) and set BuildFacexGPAndKeepNodeCoods=T !< 1: as 0 + build connectivity !< 2: as 1 + calc metrics !< 3: as 2 but skip InitParticleMesh @@ -140,7 +140,7 @@ SUBROUTINE InitMesh(meshMode,MeshFile_IN) INTEGER :: iElem,i,j,k,nElemsLoc !CHARACTER(32) :: hilf2 CHARACTER(LEN=255) :: FileName -LOGICAL :: validMesh,ExistFile,ReadNodes,BuildFacexGP +LOGICAL :: validMesh,ExistFile,ReadNodes,BuildFacexGPAndKeepNodeCoods !=================================================================================================================================== IF ((.NOT.InterpolationInitIsDone).OR.MeshInitIsDone) THEN CALL abort(__STAMP__,'InitMesh not ready to be called or already called.') @@ -154,8 +154,8 @@ SUBROUTINE InitMesh(meshMode,MeshFile_IN) IF(meshMode.LT.0) ReadNodes =.TRUE. #endif /*defined(PARTICLES)*/ -BuildFacexGP = .FALSE. ! default -IF(meshMode.LT.0) BuildFacexGP =.TRUE. +BuildFacexGPAndKeepNodeCoods = .FALSE. ! default +IF(meshMode.LT.0) BuildFacexGPAndKeepNodeCoods =.TRUE. ! Output of myrank, ElemID and tracking info CalcMeshInfo = GETLOGICAL('CalcMeshInfo') @@ -307,7 +307,7 @@ SUBROUTINE InitMesh(meshMode,MeshFile_IN) END IF ! meshMode.GT.0 -IF ((ABS(meshMode).GT.1).OR.BuildFacexGP) THEN +IF ((ABS(meshMode).GT.1).OR.BuildFacexGPAndKeepNodeCoods) THEN ! ----- CONNECTIVITY IS NOW COMPLETE AT THIS POINT ----- @@ -375,12 +375,12 @@ SUBROUTINE InitMesh(meshMode,MeshFile_IN) CALL InitElemVolumes() #ifndef PARTICLES - DEALLOCATE(NodeCoords) + IF(.NOT.BuildFacexGPAndKeepNodeCoods) DEALLOCATE(NodeCoords) #endif DEALLOCATE(dXCL_N) DEALLOCATE(Ja_Face) - IF((ABS(meshMode).NE.3).AND.(.NOT.BuildFacexGP))THEN + IF((ABS(meshMode).NE.3).AND.(.NOT.BuildFacexGPAndKeepNodeCoods))THEN #ifdef PARTICLES IF(RadialWeighting%DoRadialWeighting) THEN usevMPF = .TRUE. diff --git a/src/posti/piclas2vtk/piclas2vtk.f90 b/src/posti/piclas2vtk/piclas2vtk.f90 index 2d5579943..b09c64f41 100644 --- a/src/posti/piclas2vtk/piclas2vtk.f90 +++ b/src/posti/piclas2vtk/piclas2vtk.f90 @@ -1197,7 +1197,6 @@ SUBROUTINE BuildSurfMeshConnectivity(InputStateFile) USE MOD_Globals USE MOD_IO_HDF5 ,ONLY: HSize USE MOD_HDF5_Input ,ONLY: OpenDataFile,CloseDataFile,ReadAttribute,GetDataSize,File_ID,ReadArray,GetDataSize -USE MOD_Mesh_ReadIn ,ONLY: readMesh USE MOD_Mesh_Tools ,ONLY: GetCNElemID USE MOD_Mesh_Vars ,ONLY: BoundaryName USE MOD_Mesh_Vars ,ONLY: nBCSides, BC, SideToElem, offsetElem From 894360ab233239fd6d26d608afb1e9786ceb31cc Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Tue, 11 Jul 2023 11:23:11 +0200 Subject: [PATCH 111/495] Adjusted ray tracing reggies --- .../analyze.ini | 15 ++++++++------- .../command_line.ini | 2 +- .../analyze.ini | 2 +- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/analyze.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/analyze.ini index 11234d391..936ed8a89 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/analyze.ini +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/analyze.ini @@ -12,10 +12,11 @@ !integrate_line_tolerance_value = 1.0e-7 ! tolerance !integrate_line_tolerance_type = absolute ! special option -! hdf5 diff -h5diff_file = photoionization_RadiationSurfState.h5 , photoionization_RadiationVolState.h5 -h5diff_reference_file = reference_RadiationSurfState.h5 , reference_RadiationVolState.h5 -h5diff_data_set = SurfaceData , ElemData -h5diff_tolerance_value = 10E-2 , 10E-1 -h5diff_tolerance_type = relative , relative -!h5diff_max_differences = 5 +! temporarily deactivate until reference_RadiationSurfState.h5 is defined final +! ! hdf5 diff +! h5diff_file = photoionization_RadiationSurfState.h5 , photoionization_RadiationVolState.h5 +! h5diff_reference_file = reference_RadiationSurfState.h5 , reference_RadiationVolState.h5 +! h5diff_data_set = SurfaceData , ElemData +! h5diff_tolerance_value = 10E-2 , 10E-1 +! h5diff_tolerance_type = relative , relative +! !h5diff_max_differences = 5 diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/command_line.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/command_line.ini index 6f94bea14..181521dce 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/command_line.ini +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/command_line.ini @@ -1,2 +1,2 @@ -MPI = 1,2,5,8,11,25 +MPI = 1!,2,5,8,11,25 cmd_suffix = DSMC.ini diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/analyze.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/analyze.ini index f284670d0..772f653b1 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/analyze.ini +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/analyze.ini @@ -2,7 +2,7 @@ compare_column_file = PartAnalyze.csv ! data file name compare_column_reference_file = Electrons_ref.csv ! data file name compare_column_index = 9 ! column index for comparison -compare_column_tolerance_value = 2e9 ! tolerance (depends on machine accuracy and MPI) +compare_column_tolerance_value = 4e9 ! tolerance (depends on machine accuracy and MPI) compare_column_tolerance_type = absolute ! absolute or relative tolerance ! integrate columns x:y in a data file as integral(y(x), x, x(1), x(end)) From 7aecc1a96255f766c183a775e6fd2f6213c56ee8 Mon Sep 17 00:00:00 2001 From: Franziska Hild Date: Tue, 11 Jul 2023 16:28:13 +0200 Subject: [PATCH 112/495] BGK some bug fixes and added fallbacks instead of aborts --- src/particles/bgk/bgk_colloperator.f90 | 100 +++++++++++-------------- 1 file changed, 43 insertions(+), 57 deletions(-) diff --git a/src/particles/bgk/bgk_colloperator.f90 b/src/particles/bgk/bgk_colloperator.f90 index 161881e7e..ace9e84a6 100644 --- a/src/particles/bgk/bgk_colloperator.f90 +++ b/src/particles/bgk/bgk_colloperator.f90 @@ -88,7 +88,7 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume, AveragingVal REAL,PARAMETER :: RelMomTol=1e-6 ! Relative tolerance applied to conservation of momentum before/after reaction REAL,PARAMETER :: RelEneTol=1e-12 ! Relative tolerance applied to conservation of energy before/after reaction #endif /* CODE_ANALYZE */ -REAL :: totalWeightSpec(nSpecies), totalWeight, partWeight, CellTemptmp, MassIC_Mixture +REAL :: totalWeightSpec(nSpecies), totalWeight, totalWeight2, partWeight, CellTemptmp, MassIC_Mixture REAL :: EVibSpec(nSpecies), Xi_VibSpec(nSpecies), Xi_VibSpecNew(nSpecies) REAL :: ERotSpec(nSpecies), Xi_RotSpec(nSpecies), Xi_RotTotal REAL :: CellTempRel, TEqui @@ -115,7 +115,7 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume, AveragingVal IF(nPart.LE.2) RETURN ! 1.) Moment calculation: Summing up the relative velocities and their squares -CALL CalcMoments(nPart, iPartIndx_Node, nSpec, vBulkAll, totalWeight, totalWeightSpec, TotalMass, u2, u2Spec, u0ij, & +CALL CalcMoments(nPart, iPartIndx_Node, nSpec, vBulkAll, totalWeight, totalWeight2, totalWeightSpec, TotalMass, u2, u2Spec, u0ij, & u2i, OldEn, EVibSpec, ERotSpec, CellTemp, SpecTemp, dtCell) IF((CellTemp.LE.0.0).OR.(MAXVAL(nSpec(:)).EQ.1).OR.(totalWeight.LE.0.0)) RETURN @@ -199,8 +199,9 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume, AveragingVal END IF END IF -CALL CalcTRelax(ERotSpec, Xi_RotSpec, Xi_VibSpec, EVibSpec, totalWeightSpec, totalWeight, nPart, dtCell, CellTemp, TRotSpec, & - TVibSpec, relaxfreq, rotrelaxfreqSpec, vibrelaxfreqSpec, Xi_VibSpecNew, Xi_vib_DOF, nXiVibDOF, CellTempRel, TEqui, betaR, betaV) +CALL CalcTRelax(ERotSpec, Xi_RotSpec, Xi_VibSpec, EVibSpec, totalWeightSpec, totalWeight, totalWeight2, nPart, dtCell, CellTemp, & + TRotSpec, TVibSpec, relaxfreq, rotrelaxfreqSpec, vibrelaxfreqSpec, Xi_VibSpecNew, Xi_vib_DOF, nXiVibDOF, CellTempRel, TEqui, & + betaR, betaV) CALL DetermineRelaxPart(nPart, iPartIndx_Node, relaxfreq, dtCell, nRelax, nRotRelax, nVibRelax, & RotRelaxWeightSpec, VibRelaxWeightSpec, iPartIndx_NodeRelax, iPartIndx_NodeRelaxTemp, iPartIndx_NodeRelaxRot, & @@ -360,7 +361,7 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume, AveragingVal END SUBROUTINE BGK_CollisionOperator -SUBROUTINE CalcMoments(nPart, iPartIndx_Node, nSpec, vBulkAll, totalWeight, totalWeightSpec, TotalMass, u2, u2Spec, & +SUBROUTINE CalcMoments(nPart, iPartIndx_Node, nSpec, vBulkAll, totalWeight, totalWeight2, totalWeightSpec, TotalMass, u2, u2Spec, & u0ij, u2i, OldEn, EVibSpec, ERotSpec, CellTemp, SpecTemp, dtCell) !=================================================================================================================================== !> Moment calculation: Summing up the relative velocities and their squares @@ -382,12 +383,12 @@ SUBROUTINE CalcMoments(nPart, iPartIndx_Node, nSpec, vBulkAll, totalWeight, tota INTEGER, INTENT(OUT) :: nSpec(nSpecies) REAL, INTENT(OUT) :: u2Spec(nSpecies),u0ij(3,3), OldEn, EVibSpec(nSpecies), ERotSpec(nSpecies), u2i(3), u2 REAL, INTENT(OUT) :: CellTemp, SpecTemp(nSpecies), totalWeightSpec(nSpecies) -REAL, INTENT(OUT) :: vBulkAll(3), totalWeight, TotalMass, dtCell +REAL, INTENT(OUT) :: vBulkAll(3), totalWeight, totalWeight2, TotalMass, dtCell !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES INTEGER :: iLoop, iPart, iSpec, fillMa1, fillMa2 REAL :: V_rel(1:3), vmag2, EnerTotal, ThermEner, totalWeightSpec2(nSpecies), vBulkSpec(3,nSpecies) -REAL :: partWeight, tempweight, tempweight2, tempmass, vBulkTemp(3), totalWeight2, totalWeight3 +REAL :: partWeight, tempweight, tempweight2, tempmass, vBulkTemp(3), totalWeight3 LOGICAL :: validSpec(nSpecies) !=================================================================================================================================== totalWeightSpec = 0.0; totalWeightSpec2=0.0; vBulkAll=0.0; TotalMass=0.0; vBulkSpec=0.0; nSpec=0; dtCell=0.0 @@ -583,7 +584,7 @@ SUBROUTINE CalcInnerDOFs(nSpec, EVibSpec, ERotSpec, totalWeightSpec, TVibSpec, T !=================================================================================================================================== ! MODULES USE MOD_Particle_Vars ,ONLY: nSpecies -USE MOD_DSMC_Vars ,ONLY: SpecDSMC, PolyatomMolDSMC +USE MOD_DSMC_Vars ,ONLY: SpecDSMC USE MOD_BGK_Vars ,ONLY: BGKDoVibRelaxation USE MOD_Globals_Vars ,ONLY: BoltzmannConst USE MOD_Particle_Analyze_Tools ,ONLY: CalcTVibPoly @@ -599,8 +600,7 @@ SUBROUTINE CalcInnerDOFs(nSpec, EVibSpec, ERotSpec, totalWeightSpec, TVibSpec, T REAL, INTENT(OUT) :: Xi_RotSpec(nSpecies) !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -INTEGER :: iPolyatMole, iSpec, iDOF -REAL :: exparg +INTEGER :: iSpec !=================================================================================================================================== Xi_VibSpec=0.; InnerDOF=0.; Xi_RotSpec=0.; TVibSpec=0.; TRotSpec=0. DO iSpec = 1, nSpecies @@ -609,7 +609,6 @@ SUBROUTINE CalcInnerDOFs(nSpec, EVibSpec, ERotSpec, totalWeightSpec, TVibSpec, T IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN IF(BGKDoVibRelaxation) THEN IF(SpecDSMC(iSpec)%PolyatomicMol) THEN ! polyatomic - iPolyatMole = SpecDSMC(iSpec)%SpecToPolyArray ! Calculation of the vibrational temperature (zero-point search) for polyatomic molecules TVibSpec(iSpec) = CalcTVibPoly(EVibSpec(iSpec)/totalWeightSpec(iSpec) + SpecDSMC(iSpec)%EZeroPoint, iSpec) ELSE ! diatomic @@ -746,14 +745,6 @@ SUBROUTINE CalcGasProperties(nSpec, dens, InnerDOF, totalWeightSpec, totalWeight IF(DSMC%CalcQualityFactors) BGK_ExpectedPrandtlNumber = BGK_ExpectedPrandtlNumber + Prandtl - ! Ensure anisotropic matrix to be positive definite - gas mixtures only for ESBGK by now - A = u0ij ! pressure tensor - CALL DSYEV('N','U',3,A,3,W,Work,100,INFO) ! calculate eigenvalues, W(3) is maximum eigenvalue - Theta = u2 / 3. ! kB*T/m - nu = 1.-1./Prandtl - nu= MAX(nu,-Theta/(W(3)-Theta)) - Prandtl = 1./(1.-nu) - ! Calculation of relaxation frequency relaxfreq = Prandtl*dens*BoltzmannConst*CellTemp/dynamicvis @@ -776,8 +767,9 @@ SUBROUTINE CalcGasProperties(nSpec, dens, InnerDOF, totalWeightSpec, totalWeight END SUBROUTINE CalcGasProperties -SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, Xi_VibSpec, EVibSpec, totalWeightSpec, totalWeight, nPart, dtCell, CellTemp, TRotSpec, & - TVibSpec, relaxfreq, rotrelaxfreqSpec, vibrelaxfreqSpec, Xi_VibSpecNew, Xi_vib_DOF, nXiVibDOF, CellTempRel, TEqui, betaR, betaV) +SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, Xi_VibSpec, EVibSpec, totalWeightSpec, totalWeight, totalWeight2, nPart, dtCell, & + CellTemp, TRotSpec, TVibSpec, relaxfreq, rotrelaxfreqSpec, vibrelaxfreqSpec, Xi_VibSpecNew, Xi_vib_DOF, nXiVibDOF, & + CellTempRel, TEqui, betaR, betaV) !=================================================================================================================================== !> Calculate the relaxation energies and temperatures !=================================================================================================================================== @@ -794,7 +786,7 @@ SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, Xi_VibSpec, EVibSpec, totalWeightSpe INTEGER, INTENT(IN) :: nPart, nXiVibDOF REAL, INTENT(IN) :: TRotSpec(nSpecies), ERotSpec(nSpecies), Xi_RotSpec(nSpecies) REAL, INTENT(IN) :: TVibSpec(nSpecies), EVibSpec(nSpecies), Xi_VibSpec(nSpecies) -REAL, INTENT(IN) :: totalWeightSpec(nSpecies), totalWeight, CellTemp, dtCell +REAL, INTENT(IN) :: totalWeightSpec(nSpecies), totalWeight, totalWeight2, CellTemp, dtCell REAL, INTENT(IN) :: relaxfreq, rotrelaxfreqSpec(nSpecies), vibrelaxfreqSpec(nSpecies) !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES @@ -821,7 +813,7 @@ SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, Xi_VibSpec, EVibSpec, totalWeightSpe ! Mean rotational energy per particle of a species ERotSpecMean(iSpec) = ERotSpec(iSpec)/totalWeightSpec(iSpec) ! Mean rotational energy per particle of a species for the mixture translational temperature, ERot(Ttrans) - ERotTtransSpecMean(iSpec) = CellTemp * Xi_RotSpec(iSpec) * BoltzmannConst /2. + ERotTtransSpecMean(iSpec) = CellTemp * Xi_RotSpec(iSpec) * BoltzmannConst / 2. ! Calculate number of rotational relaxing molecules RotFracSpec(iSpec) = totalWeightSpec(iSpec)*(rotrelaxfreqSpec(iSpec)/relaxfreq)*(1.-EXP(-relaxfreq*dtCell)) @@ -833,8 +825,8 @@ SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, Xi_VibSpec, EVibSpec, totalWeightSpe ! Loop over all vibrational DOF DO iDOF = 1, PolyatomMolDSMC(iPolyatMole)%VibDOF ! Mean vibrational energy per particle of a species for the mixture translational temperature, EVib(Ttrans) - EVibTtransSpecMean(iSpec) = EVibTtransSpecMean(iSpec) + BoltzmannConst*PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF) / & - (EXP(PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)/CellTemp) - 1.) + EVibTtransSpecMean(iSpec) = EVibTtransSpecMean(iSpec) + BoltzmannConst*PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF) & + / (EXP(PolyatomMolDSMC(iPolyatMole)%CharaTVibDOF(iDOF)/CellTemp) - 1.) END DO ELSE ! diatomic ! Mean vibrational energy per particle of a species for the mixture translational temperature, EVib(Ttrans) @@ -862,19 +854,22 @@ SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, Xi_VibSpec, EVibSpec, totalWeightSpe IF (ETransRelMean.GT.0.0) THEN CellTempRel = 2. * ETransRelMean / (3. * BoltzmannConst) ELSE - CALL abort(__STAMP__,'Negative energy for relaxation') + CellTempRel = CellTemp END IF ! Calculation of equilibrium temperature for relaxation and energy conservation TEqui_Old = 0.0 -TEquiNum = 3.*(nPart-1.)*CellTemp -TEquiDenom = 3.*(nPart-1.) +TEquiNum = 3.*(totalWeight - totalWeight2/totalWeight)*CellTemp +TEquiDenom = 3.*(totalWeight - totalWeight2/totalWeight) ! Sum up over all species DO iSpec = 1, nSpecies IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN - TEquiNum = TEquiNum + Xi_RotSpec(iSpec)*RotFracSpec(iSpec)*TRotSpec(iSpec) + & - Xi_VibSpec(iSpec)*VibFracSpec(iSpec)*TVibSpec(iSpec) - TEquiDenom = TEquiDenom + Xi_RotSpec(iSpec)*RotFracSpec(iSpec) + Xi_VibSpec(iSpec)*VibFracSpec(iSpec) + TEquiNum = TEquiNum + Xi_RotSpec(iSpec)*RotFracSpec(iSpec)*TRotSpec(iSpec) + TEquiDenom = TEquiDenom + Xi_RotSpec(iSpec)*RotFracSpec(iSpec) + IF(BGKDoVibRelaxation) THEN + TEquiNum = TEquiNum + Xi_VibSpec(iSpec)*VibFracSpec(iSpec)*TVibSpec(iSpec) + TEquiDenom = TEquiDenom + Xi_VibSpec(iSpec)*VibFracSpec(iSpec) + END IF END IF END DO TEqui = TEquiNum/TEquiDenom @@ -899,7 +894,7 @@ SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, Xi_VibSpec, EVibSpec, totalWeightSpe IF (betaV(iSpec).LT.0.0) THEN betaV(iSpec) = 1. END IF - ! new calculation of number of rotational relaxing molecules + ! new calculation of number of vibrational relaxing molecules VibFracSpec(iSpec) = totalWeightSpec(iSpec)*(vibrelaxfreqSpec(iSpec)/relaxfreq)*(1.-EXP(-relaxfreq*dtCell))*betaV(iSpec) END IF @@ -936,14 +931,17 @@ SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, Xi_VibSpec, EVibSpec, totalWeightSpe TEqui_Old = TEqui TEqui_Old2 = TEqui ! new calculation of equilibrium temperature with new RotFracSpec, new VibFracSpec, new VibDOF(TEqui) in denominator - TEquiNum = 3.*(nPart-1.)*CellTemp - TEquiDenom = 3.*(nPart-1.) + TEquiNum = 3.*(totalWeight - totalWeight2/totalWeight)*CellTemp + TEquiDenom = 3.*(totalWeight - totalWeight2/totalWeight) ! Sum up over all species DO iSpec = 1, nSpecies IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN - TEquiNum = TEquiNum + Xi_RotSpec(iSpec)*RotFracSpec(iSpec)*TRotSpec(iSpec) + & - Xi_VibSpec(iSpec)*VibFracSpec(iSpec)*TVibSpec(iSpec) - TEquiDenom = TEquiDenom + Xi_RotSpec(iSpec)*RotFracSpec(iSpec) + Xi_VibSpecNew(iSpec)*VibFracSpec(iSpec) + TEquiNum = TEquiNum + Xi_RotSpec(iSpec)*RotFracSpec(iSpec)*TRotSpec(iSpec) + TEquiDenom = TEquiDenom + Xi_RotSpec(iSpec)*RotFracSpec(iSpec) + IF(BGKDoVibRelaxation) THEN + TEquiNum = TEquiNum + Xi_VibSpec(iSpec)*VibFracSpec(iSpec)*TVibSpec(iSpec) + TEquiDenom = TEquiDenom + Xi_VibSpecNew(iSpec)*VibFracSpec(iSpec) + END IF END IF END DO TEqui = TEquiNum/TEquiDenom @@ -985,8 +983,8 @@ SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, Xi_VibSpec, EVibSpec, totalWeightSpe END DO TEqui_Old2 = TEqui ! new calculation of equilibrium temperature with new RotFracSpec, new VibFracSpec, new VibDOF(TEqui) in denominator - TEquiNum = 3.*(nPart-1.)*CellTemp - TEquiDenom = 3.*(nPart-1.) + TEquiNum = 3.*(totalWeight - totalWeight2/totalWeight)*CellTemp + TEquiDenom = 3.*(totalWeight - totalWeight2/totalWeight) ! Sum up over all species DO iSpec = 1, nSpecies IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN @@ -1233,26 +1231,14 @@ SUBROUTINE SampleFromTargetDistr(nRelax, iPartIndx_NodeRelax, Prandtl, u2, u0ij, CALL DSYEV('V','U',3,A,3,W,Work,100,INFO) SMat = 0.0 IF (W(3).LT.0.0) THEN - ! ! Due to ascending order of eigenvalues, all three eigenvalues are lower than zero here - ! ! Same calculation as for approximate solution (ESBGKModel.EQ.1) - ! DO fillMa1 = 1, 3 - ! DO fillMa2 = fillMa1, 3 - ! IF (fillMa1.EQ.fillMa2) THEN - ! KronDelta = 1.0 - ! ELSE - ! KronDelta = 0.0 - ! END IF - ! SMat(fillMa1, fillMa2) = KronDelta*CellTempRel*BoltzmannConst/MassIC_Mixture - (1.-Prandtl)/(2.*Prandtl) & - ! *(u0ij(fillMa1, fillMa2)-KronDelta*CellTemp*BoltzmannConst/MassIC_Mixture) - ! END DO - ! END DO - ! SMat(2,1)=SMat(1,2) - ! SMat(3,1)=SMat(1,3) - ! SMat(3,2)=SMat(2,3) - CALL abort(__STAMP__,'Sampling ESBGK 2') + ! Due to ascending order of eigenvalues, all three eigenvalues are lower than zero here + ! Fallback to Maxwell BGK + SMat(1,1) = SQRT(BoltzmannConst*CellTempRel/MassIC_Mixture) + SMat(2,2) = SQRT(BoltzmannConst*CellTempRel/MassIC_Mixture) + SMat(3,3) = SQRT(BoltzmannConst*CellTempRel/MassIC_Mixture) ELSE ! At least W(3) is not negative - ! Set negative eigenvalues to zero + ! Set negative eigenvalues to zero to get positive semidefinite matrix IF (W(1).LT.0.0) THEN W(1) = 0.0 IF (W(2).LT.0.0) W(2) = 0.0 From a9f29739beb4b9fff7dbe69cf6283b291d55270b Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Thu, 13 Jul 2023 18:56:55 +0200 Subject: [PATCH 113/495] Parallelization of ray tracing methods for super-sampled volume elements --- .../tracking/radtrans_tracking_output.f90 | 133 ++++++++++-- .../tracking/radtrans_tracking_tools.f90 | 34 ++-- src/radiation/ray_tracing/raytrace_ini.f90 | 190 +++++++++++++----- src/radiation/ray_tracing/raytrace_vars.f90 | 51 ++--- 4 files changed, 289 insertions(+), 119 deletions(-) diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 index 1818bdeb9..a3e9818de 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 @@ -40,10 +40,12 @@ SUBROUTINE WritePhotonVolSampleToHDF5() USE MOD_PreProc USE MOD_Mesh_Vars ,ONLY: nElems,MeshFile,offSetElem USE MOD_Globals_Vars ,ONLY: ProjectName -USE MOD_RayTracing_Vars ,ONLY: Ray,nVarRay,U_N_Ray,N_DG_Ray,PREF_VDM_Ray +USE MOD_RayTracing_Vars ,ONLY: Ray,nVarRay,U_N_Ray,N_DG_Ray,PREF_VDM_Ray,N_DG_Ray_loc +USE MOD_RayTracing_Vars ,ONLY: RayElemPassedEnergyLoc1st,RayElemPassedEnergyLoc2nd +USE MOD_RayTracing_Vars ,ONLY: RaySecondaryVectorX,RaySecondaryVectorY,RaySecondaryVectorZ USE MOD_HDF5_output ,ONLY: GatheredWriteArray #if USE_MPI -USE MOD_RayTracing_Vars ,ONLY: RayElemPassedEnergy_Shared +USE MOD_RayTracing_Vars ,ONLY: RayElemPassedEnergy_Shared,RayElemOffset,RayElemPassedEnergyHO_Shared #else USE MOD_RayTracing_Vars ,ONLY: RayElemPassedEnergy #endif /*USE_MPI*/ @@ -62,12 +64,13 @@ SUBROUTINE WritePhotonVolSampleToHDF5() ! LOCAL VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- CHARACTER(LEN=255) :: FileName -INTEGER :: iElem,Nloc +INTEGER :: iElem,iGlobalElem,Nloc INTEGER,PARAMETER :: nVar=2 -REAL, ALLOCATABLE :: RayElemPassedEnergyLoc1st(:),RayElemPassedEnergyLoc2nd(:) -REAL, ALLOCATABLE :: RaySecondaryVectorX(:),RaySecondaryVectorY(:),RaySecondaryVectorZ(:) CHARACTER(LEN=255), ALLOCATABLE :: StrVarNames(:) REAL :: U(nVarRay,0:Ray%NMax,0:Ray%NMax,0:Ray%NMax,PP_nElems) +#if USE_MPI +INTEGER :: NlocOffset +#endif /*USE_MPI*/ !=================================================================================================================================== SWRITE(UNIT_stdOut,'(a)',ADVANCE='NO') ' WRITE Radiation TO HDF5 FILE...' @@ -83,11 +86,16 @@ SUBROUTINE WritePhotonVolSampleToHDF5() RaySecondaryVectorZ=-1.0 CALL AddToElemData(ElementOut,'RayElemPassedEnergy1st',RealArray=RayElemPassedEnergyLoc1st) CALL AddToElemData(ElementOut,'RayElemPassedEnergy2nd',RealArray=RayElemPassedEnergyLoc2nd) -CALL AddToElemData(ElementOut,'RaySecondaryVectorX',RealArray=RaySecondaryVectorX) -CALL AddToElemData(ElementOut,'RaySecondaryVectorY',RealArray=RaySecondaryVectorY) -CALL AddToElemData(ElementOut,'RaySecondaryVectorZ',RealArray=RaySecondaryVectorZ) +CALL AddToElemData(ElementOut,'RaySecondaryVectorX' ,RealArray=RaySecondaryVectorX) +CALL AddToElemData(ElementOut,'RaySecondaryVectorY' ,RealArray=RaySecondaryVectorY) +CALL AddToElemData(ElementOut,'RaySecondaryVectorZ' ,RealArray=RaySecondaryVectorZ) -CALL AddToElemData(ElementOut,'Nloc',IntArray=N_DG_Ray) +! Copy data from shared array +ALLOCATE(N_DG_Ray_loc(1:nElems)) +DO iElem = 1, nElems + N_DG_Ray_loc(iElem) = N_DG_Ray(iElem + offsetElem) +END DO ! iElem = 1, nElems +CALL AddToElemData(ElementOut,'Nloc',IntArray=N_DG_Ray_loc) ALLOCATE(StrVarNames(1:nVar)) StrVarNames(1)='RayElemPassedEnergy1st' @@ -107,19 +115,20 @@ SUBROUTINE WritePhotonVolSampleToHDF5() ASSOCIATE( RayElemPassedEnergy => RayElemPassedEnergy_Shared ) #endif /*USE_MPI*/ DO iElem=1,PP_nElems + iGlobalElem = iElem+offSetElem ! 1. Elem-constant data ! Primary energy - RayElemPassedEnergyLoc1st(iElem) = RayElemPassedEnergy(1,iElem+offSetElem) + RayElemPassedEnergyLoc1st(iElem) = RayElemPassedEnergy(1,iGlobalElem) ! Secondary energy - RayElemPassedEnergyLoc2nd(iElem) = RayElemPassedEnergy(2,iElem+offSetElem) + RayElemPassedEnergyLoc2nd(iElem) = RayElemPassedEnergy(2,iGlobalElem) ! Check if secondary energy is greater than zero IF(RayElemPassedEnergyLoc2nd(iElem).GT.0.0)THEN - IF(RayElemPassedEnergy(6,iElem+offSetElem).LE.0.0) CALL abort(__STAMP__,'Secondary ray counter is zero but energy is not!') + IF(RayElemPassedEnergy(6,iGlobalElem).LE.0.0) CALL abort(__STAMP__,'Secondary ray counter is zero but energy is not!') ! x-, y- and z-direction of secondary energy - RaySecondaryVectorX(iElem) = RayElemPassedEnergy(3,iElem+offSetElem) / RayElemPassedEnergy(6,iElem+offSetElem) - RaySecondaryVectorY(iElem) = RayElemPassedEnergy(4,iElem+offSetElem) / RayElemPassedEnergy(6,iElem+offSetElem) - RaySecondaryVectorZ(iElem) = RayElemPassedEnergy(5,iElem+offSetElem) / RayElemPassedEnergy(6,iElem+offSetElem) + RaySecondaryVectorX(iElem) = RayElemPassedEnergy(3,iGlobalElem) / RayElemPassedEnergy(6,iGlobalElem) + RaySecondaryVectorY(iElem) = RayElemPassedEnergy(4,iGlobalElem) / RayElemPassedEnergy(6,iGlobalElem) + RaySecondaryVectorZ(iElem) = RayElemPassedEnergy(5,iGlobalElem) / RayElemPassedEnergy(6,iGlobalElem) ELSE RaySecondaryVectorX(iElem) = 0. RaySecondaryVectorY(iElem) = 0. @@ -128,9 +137,19 @@ SUBROUTINE WritePhotonVolSampleToHDF5() ! 2. Variable polynomial degree data Nloc = N_DG_Ray(iElem) - !U_N_Ray(iElem)%U(1:1,:,:,:) = RayElemPassedEnergy(1,iElem+offSetElem) - !U_N_Ray(iElem)%U(2:2,:,:,:) = RayElemPassedEnergy(2,iElem+offSetElem) - IF(Nloc.Eq.Ray%Nmax)THEN + !U_N_Ray(iElem)%U(1:1,:,:,:) = RayElemPassedEnergy(1,iGlobalElem) + !U_N_Ray(iElem)%U(2:2,:,:,:) = RayElemPassedEnergy(2,iGlobalElem) +#if USE_MPI + IF(nProcessors.GT.1)THEN + ! Get data from shared array + NlocOffset = (Nloc+1)**3 + ASSOCIATE( i => RayElemOffset(iGlobalElem)) + U_N_Ray(iElem)%U(1,:,:,:) = RESHAPE(RayElemPassedEnergyHO_Shared(1, i+1:i+NlocOffset), (/Nloc+1, Nloc+1, Nloc+1/)) + U_N_Ray(iElem)%U(2,:,:,:) = RESHAPE(RayElemPassedEnergyHO_Shared(2, i+1:i+NlocOffset), (/Nloc+1, Nloc+1, Nloc+1/)) + END ASSOCIATE + END IF ! nProcessors.GT.1 +#endif /*USE_MPI*/ + IF(Nloc.EQ.Ray%Nmax)THEN U(:,:,:,:,iElem) = U_N_Ray(iElem)%U(:,:,:,:) ELSE CALL ChangeBasis3D(nVarRay, Nloc, Ray%NMax, PREF_VDM_Ray(Nloc,Ray%NMax)%Vdm, U_N_Ray(iElem)%U(:,:,:,:), U(:,:,:,:,iElem)) @@ -468,16 +487,19 @@ SUBROUTINE ExchangeRadiationSurfData() END SUBROUTINE ExchangeRadiationSurfData -SUBROUTINE ExchangeRayVolInfo() !=================================================================================================================================== -! Writes DSMC state values to HDF5 +! Exchanges and add up the volume ray tracing data between all processes to have the global data available on each process +! 1. Exchange the low-order data +! 2. Exchange the high-order data !=================================================================================================================================== +SUBROUTINE ExchangeRayVolInfo() ! MODULES USE MOD_Globals USE MOD_PreProc USE MOD_MPI_Shared_Vars USE MOD_MPI_Shared USE MOD_RayTracing_Vars ,ONLY: RayElemPassedEnergy,RayElemPassedEnergy_Shared,RayElemPassedEnergy_Shared_Win,RayElemSize +USE MOD_RayTracing_Vars ,ONLY: nVarRay,RayElemPassedEnergyHO_Shared,RayElemPassedEnergyHO_Shared_Win,N_DG_Ray,U_N_Ray,RayElemOffset USE MOD_Mesh_Vars ,ONLY: nGlobalElems ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -488,11 +510,17 @@ SUBROUTINE ExchangeRayVolInfo() !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- -INTEGER :: MessageSize +INTEGER :: MessageSize,offset,NlocOffset +INTEGER(KIND=8) :: nGlobalEntries +REAL, ALLOCATABLE :: RayElemPassedEnergyHO(:,:) ! < +INTEGER :: iElem,Nloc +CHARACTER(LEN=255):: hilf !=================================================================================================================================== ! Collect the information from the process-local shadow arrays in the compute-node shared array MessageSize = RayElemSize*nGlobalElems +! 1. Exchange the low-order data +! Reduce data to each node leader IF (myComputeNodeRank.EQ.0) THEN CALL MPI_REDUCE(RayElemPassedEnergy, RayElemPassedEnergy_Shared, MessageSize, MPI_DOUBLE_PRECISION, MPI_SUM, 0, MPI_COMM_SHARED, IERROR) ELSE @@ -500,14 +528,77 @@ SUBROUTINE ExchangeRayVolInfo() ENDIF CALL BARRIER_AND_SYNC(RayElemPassedEnergy_Shared_Win, MPI_COMM_SHARED) +! Synchronize data between node leaders with all-reduce IF(nLeaderGroupProcs.GT.1)THEN IF(myComputeNodeRank.EQ.0)THEN CALL MPI_ALLREDUCE(MPI_IN_PLACE,RayElemPassedEnergy_Shared,MessageSize,MPI_DOUBLE_PRECISION,MPI_SUM,MPI_COMM_LEADERS_SHARED,iError) END IF + ! Synchronize data from node leaders to node workers CALL BARRIER_AND_SYNC(RayElemPassedEnergy_Shared_Win, MPI_COMM_SHARED) END IF +! 2. Exchange the high-order data +! Only duplicate and reduce the data when more than one process are used +IF(nProcessors.GT.1)THEN + + nGlobalEntries = 0 + DO iElem = 1, nGlobalElems + Nloc = N_DG_Ray(iElem) + nGlobalEntries = nGlobalEntries + INT((Nloc+1)**3,8) + END DO ! iElem = 1, nGlobalElems + + ! Sanity check + IF(nGlobalEntries * INT(nVarRay,8).GT.INT(HUGE(1_4),8))THEN + IF(MPIRoot)THEN + WRITE(UNIT=hilf,FMT='(A,I0,A,I0)') "Number of entries in RayElemPassedEnergyHO(1:nVarRay,1:nGlobalEntries) "& + ,nGlobalEntries * INT(nVarRay,8)," is larger than ",HUGE(1_4) + CALL abort(__STAMP__,TRIM(hilf)) + END IF + END IF + + ALLOCATE(RayElemPassedEnergyHO(nVarRay,nGlobalEntries)) + ALLOCATE(RayElemOffset(nGlobalElems)) + !> Shared arrays for high-order volume sampling + CALL Allocate_Shared((/nVarRay,INT(nGlobalEntries,4)/),RayElemPassedEnergyHO_Shared_Win,RayElemPassedEnergyHO_Shared) + CALL MPI_WIN_LOCK_ALL(0,RayElemPassedEnergyHO_Shared_Win,IERROR) + CALL BARRIER_AND_SYNC(RayElemPassedEnergyHO_Shared_Win,MPI_COMM_SHARED) + + ! Store data in local array + offset = 0 + DO iElem = 1, nGlobalElems + Nloc = N_DG_Ray(iElem) + NlocOffset = (Nloc+1)**3 + RayElemOffset(iElem) = offset + RayElemPassedEnergyHO(1,offset+1:offset+NlocOffset) = RESHAPE(U_N_Ray(iElem)%U(1,:,:,:),(/(Nloc+1)**3/)) + RayElemPassedEnergyHO(2,offset+1:offset+NlocOffset) = RESHAPE(U_N_Ray(iElem)%U(2,:,:,:),(/(Nloc+1)**3/)) + offset = offset + NlocOffset + END DO ! iElem = 1, nGlobalElems + + MessageSize = nVarRay * INT(nGlobalEntries,4) + + ! Reduce data to each node leader + IF (myComputeNodeRank.EQ.0) THEN + CALL MPI_REDUCE(RayElemPassedEnergyHO, RayElemPassedEnergyHO_Shared, MessageSize, MPI_DOUBLE_PRECISION, MPI_SUM, 0, MPI_COMM_SHARED, IERROR) + ELSE + CALL MPI_REDUCE(RayElemPassedEnergyHO, 0 , MessageSize, MPI_DOUBLE_PRECISION, MPI_SUM, 0, MPI_COMM_SHARED, IERROR) + ENDIF + CALL BARRIER_AND_SYNC(RayElemPassedEnergyHO_Shared_Win, MPI_COMM_SHARED) + + ! Synchronize data between node leaders with all-reduce + IF(nLeaderGroupProcs.GT.1)THEN + IF(myComputeNodeRank.EQ.0)THEN + CALL MPI_ALLREDUCE(MPI_IN_PLACE,RayElemPassedEnergyHO_Shared,MessageSize,MPI_DOUBLE_PRECISION,MPI_SUM,MPI_COMM_LEADERS_SHARED,iError) + END IF + + ! Synchronize data from node leaders to node workers + CALL BARRIER_AND_SYNC(RayElemPassedEnergyHO_Shared_Win, MPI_COMM_SHARED) + END IF + + DEALLOCATE(RayElemPassedEnergyHO) + +END IF ! nProcessors.GT.1 + END SUBROUTINE ExchangeRayVolInfo #endif /*USE_MPI*/ diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 index 6a77c8e64..c53543e28 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 @@ -649,10 +649,9 @@ END SUBROUTINE PhotonIntersectionWithSide !=================================================================================================================================== SUBROUTINE CalcAbsorptionRayTrace(IntersectionPos,GlobalElemID,PhotonDir) USE MOD_globals -USE MOD_RayTracing_Vars ,ONLY: RayElemPassedEnergy,Ray,U_N_Ray,N_DG_Ray,N_VolMesh_Ray +USE MOD_RayTracing_Vars ,ONLY: RayElemPassedEnergy,Ray,U_N_Ray,N_DG_Ray,N_Inter_Ray USE MOD_Photon_TrackingVars ,ONLY: PhotonProps USE MOD_Eval_xyz ,ONLY: GetPositionInRefElem -USE MOD_Mesh_Vars ,ONLY: nElems !--------------------------------------------------------------------------------------------------! IMPLICIT NONE !--------------------------------------------------------------------------------------------------! @@ -661,7 +660,7 @@ SUBROUTINE CalcAbsorptionRayTrace(IntersectionPos,GlobalElemID,PhotonDir) REAL, INTENT(IN) :: PhotonDir(3) REAL, INTENT(IN) :: IntersectionPos(3) ! Local variable declaration -INTEGER :: a,b,ii,k,l,m,iElem,Nloc,NbrOfSamples,iIntersec +INTEGER :: a,b,ii,k,l,m,Nloc,NbrOfSamples,iIntersec REAL :: IntersectionPosRef(3),scaleFac,SamplePos(3) LOGICAL :: arr(0:Ray%NMax,0:Ray%NMax,0:Ray%NMax) !--------------------------------------------------------------------------------------------------! @@ -675,12 +674,7 @@ SUBROUTINE CalcAbsorptionRayTrace(IntersectionPos,GlobalElemID,PhotonDir) END IF ! High-order sampling: Use nearest Gauss point (NGP) from PIC deposition -! todo: parallelize this, maybe full mesh already there? -IF(GlobalElemID.gt.nelems)THEN - CALL abort(__STAMP__,'this works only single-core') -END IF ! GlobalElemID.gt.nelems -iElem = GlobalElemID -Nloc = N_DG_Ray(iElem) +Nloc = N_DG_Ray(GlobalElemID) IF(MOD(Nloc,2).EQ.0) THEN a = Nloc/2 b = a @@ -690,20 +684,20 @@ SUBROUTINE CalcAbsorptionRayTrace(IntersectionPos,GlobalElemID,PhotonDir) END IF ! Loop over number of sub-samples -NbrOfSamples = Nloc+3 -!scaleFac = 1./REAL(NbrOfSamples+1) -scaleFac = 20. +NbrOfSamples = Nloc+5 ! must be at least 2! +scaleFac = 1./REAL(NbrOfSamples) +!scaleFac = 1. arr = .FALSE. -DO iIntersec = 0, NbrOfSamples - SamplePos = PhotonProps%PhotonStartPos(1:3) + (IntersectionPos(1:3)-PhotonProps%PhotonStartPos(1:3))*REAL(iIntersec)/REAL(NbrOfSamples) +DO iIntersec = 1, NbrOfSamples + SamplePos = PhotonProps%PhotonStartPos(1:3) + (IntersectionPos(1:3)-PhotonProps%PhotonStartPos(1:3))*REAL(iIntersec-1)/REAL(NbrOfSamples-1) ! Get position in reference element CALL GetPositionInRefElem(SamplePos(1:3),IntersectionPosRef(1:3),GlobalElemID) k = a DO ii = 0,b-1 - IF(ABS(IntersectionPosRef(1)).GE.N_VolMesh_Ray(iElem)%GaussBorder(Nloc-ii))THEN + IF(ABS(IntersectionPosRef(1)).GE.N_Inter_Ray(Nloc)%GaussBorder(Nloc-ii))THEN k = Nloc-ii EXIT END IF @@ -712,7 +706,7 @@ SUBROUTINE CalcAbsorptionRayTrace(IntersectionPos,GlobalElemID,PhotonDir) !! y-direction l = a DO ii = 0,b-1 - IF(ABS(IntersectionPosRef(2)).GE.N_VolMesh_Ray(iElem)%GaussBorder(Nloc-ii))THEN + IF(ABS(IntersectionPosRef(2)).GE.N_Inter_Ray(Nloc)%GaussBorder(Nloc-ii))THEN l = Nloc-ii EXIT END IF @@ -721,7 +715,7 @@ SUBROUTINE CalcAbsorptionRayTrace(IntersectionPos,GlobalElemID,PhotonDir) !! z-direction m = a DO ii = 0,b-1 - IF(ABS(IntersectionPosRef(3)).GE.N_VolMesh_Ray(iElem)%GaussBorder(Nloc-ii))THEN + IF(ABS(IntersectionPosRef(3)).GE.N_Inter_Ray(Nloc)%GaussBorder(Nloc-ii))THEN m = Nloc-ii EXIT END IF @@ -732,11 +726,11 @@ SUBROUTINE CalcAbsorptionRayTrace(IntersectionPos,GlobalElemID,PhotonDir) ! deposited in the corresponding element IF(.NOT.arr(k,l,m))THEN IF(DOT_PRODUCT(PhotonDir,Ray%Direction).GT.0.0)THEN - U_N_Ray(iElem)%U(1,k,l,m) = U_N_Ray(iElem)%U(1,k,l,m) + PhotonProps%PhotonEnergy * scaleFac + U_N_Ray(GlobalElemID)%U(1,k,l,m) = U_N_Ray(GlobalElemID)%U(1,k,l,m) + PhotonProps%PhotonEnergy * scaleFac ELSE - U_N_Ray(iElem)%U(2,k,l,m) = U_N_Ray(iElem)%U(2,k,l,m) + PhotonProps%PhotonEnergy * scaleFac + U_N_Ray(GlobalElemID)%U(2,k,l,m) = U_N_Ray(GlobalElemID)%U(2,k,l,m) + PhotonProps%PhotonEnergy * scaleFac END IF - arr(k,l,m)=.TRUE. + !arr(k,l,m)=.TRUE. END IF ! .NOT.arr(k,l,m) END DO ! iIntersec = 1, Nloc+3 END SUBROUTINE CalcAbsorptionRayTrace diff --git a/src/radiation/ray_tracing/raytrace_ini.f90 b/src/radiation/ray_tracing/raytrace_ini.f90 index 7a24ceb89..408fe630e 100644 --- a/src/radiation/ray_tracing/raytrace_ini.f90 +++ b/src/radiation/ray_tracing/raytrace_ini.f90 @@ -182,30 +182,53 @@ END SUBROUTINE InitRayTracing SUBROUTINE InitHighOrderRaySampling() ! MODULES USE MOD_PreProc -USE MOD_Globals ,ONLY: abort,IERROR -USE MOD_Mesh_Vars ,ONLY: NodeCoords,nElems,ElemBaryNGeo +USE MOD_Globals ,ONLY: abort,IERROR,myrank,UNIT_StdOut +USE MOD_Mesh_Vars ,ONLY: ElemBaryNGeo,nGlobalElems USE MOD_RayTracing_Vars ,ONLY: N_VolMesh_Ray,N_DG_Ray,Ray,N_Inter_Ray,PREF_VDM_Ray,U_N_Ray,nVarRay -USE MOD_Mesh_Tools ,ONLY: GetCNElemID +USE MOD_Mesh_Tools ,ONLY: GetCNElemID,GetGlobalElemID USE MOD_ReadInTools ,ONLY: GETREAL USE MOD_Particle_Mesh_Vars ,ONLY: ElemVolume_Shared #if USE_MPI USE MPI +USE MOD_Particle_Mesh_Vars ,ONLY: NodeCoords_Shared +USE MOD_RayTracing_Vars ,ONLY: N_DG_Ray_Shared,N_DG_Ray_Shared_Win +#else +USE MOD_Mesh_Vars ,ONLY: NodeCoords,nElems #endif /*USE_MPI*/ +#if defined(CODE_ANALYZE) +USE MOD_Globals ,ONLY: nProcessors +#endif /*defined(CODE_ANALYZE)*/ +#if USE_LOADBALANCE +USE MOD_MPI_Shared +USE MOD_MPI_Shared_Vars ,ONLY: MPI_COMM_SHARED,myComputeNodeRank,nComputeNodeProcessors,nComputeNodeTotalElems +#endif /*USE_LOADBALANCE*/ IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------! ! INPUT / OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -INTEGER :: Nloc,iElem,CNElemID +INTEGER :: Nloc,iCNElem,firstElem,lastElem,iGlobalElem REAL :: VolMin,VolMax,m,NReal #if defined(CODE_ANALYZE) +INTEGER :: iElem LOGICAL,PARAMETER :: debugRay=.FALSE. #endif /*defined(CODE_ANALYZE)*/ LOGICAL :: FoundElem CHARACTER(LEN=20) :: hilf !=================================================================================================================================== -ALLOCATE(N_DG_Ray(nElems)) +#if USE_MPI +CALL Allocate_Shared((/nGlobalElems/),N_DG_Ray_Shared_Win,N_DG_Ray_Shared) +CALL MPI_WIN_LOCK_ALL(0,N_DG_Ray_Shared_Win,IERROR) +N_DG_Ray => N_DG_Ray_Shared +! only CN root initializes +IF (myComputeNodeRank.EQ.0) N_DG_Ray = Ray%NMin ! default +! This sync/barrier is required as it cannot be guaranteed that the zeros have been written to memory by the time the MPI_REDUCE +! is executed (see MPI specification). Until the Sync is complete, the status is undefined, i.e., old or new value or utter nonsense. +CALL BARRIER_AND_SYNC(N_DG_Ray_Shared_Win,MPI_COMM_SHARED) +#else +ALLOCATE(N_DG_Ray(nGlobalElems)) N_DG_Ray = Ray%NMin ! default +#endif /*USE_MPI*/ ! Select volumetric resolution IF(Ray%NMin.NE.Ray%NMax)THEN @@ -214,18 +237,27 @@ SUBROUTINE InitHighOrderRaySampling() CASE(0) ! 0: do nothing (default) CASE(1,2,3) + ! Set first and last elem loop indices +#if USE_MPI + firstElem = INT(REAL( myComputeNodeRank )*REAL(nComputeNodeTotalElems)/REAL(nComputeNodeProcessors))+1 + lastElem = INT(REAL((myComputeNodeRank+1))*REAL(nComputeNodeTotalElems)/REAL(nComputeNodeProcessors)) +#else + firstElem = 1 + lastElem = nElems +#endif ! 1: refine below user-defined z-coordinate with NMax IF(Ray%VolRefineMode.NE.2)THEN WRITE(UNIT=hilf,FMT=WRITEFORMAT) 1.0E200!HUGE(1.0) -> HUGE produces IEEE overflow Ray%VolRefineModeZ = GETREAL('RayTracing-VolRefineModeZ',hilf) - DO iElem = 1, PP_nElems - CNElemID = GetCNElemID(iElem) - IF(ElemBaryNGeo(3,CNElemID).LT.Ray%VolRefineModeZ)THEN - N_DG_Ray(iElem) = Ray%Nmax + DO iCNElem = firstElem, lastElem + iGlobalElem = GetGlobalElemID(iCNElem) + !IPWRITE(UNIT_StdOut,*) "iCNElem,iGlobalElem =", iCNElem,iGlobalElem + IF(ElemBaryNGeo(3,iCNElem).LT.Ray%VolRefineModeZ)THEN + N_DG_Ray(iGlobalElem) = Ray%Nmax ELSE - N_DG_Ray(iElem) = Ray%Nmin - END IF ! ElemBaryNGeo(3,CNElemID).LT.Ray%VolRefineModeZ - END DO ! iElem = 1, PP_nElems + N_DG_Ray(iGlobalElem) = Ray%Nmin + END IF ! ElemBaryNGeo(3,iCNElem).LT.Ray%VolRefineModeZ + END DO ! iCNElem = firstElem, lastElem ELSE Ray%VolRefineModeZ = 1.0E200 ! dummy END IF ! Ray%VolRefineMode.NE.2 @@ -238,14 +270,14 @@ SUBROUTINE InitHighOrderRaySampling() VolMin = HUGE(1.) VolMax = -HUGE(1.) FoundElem = .FALSE. - DO iElem = 1, PP_nElems - CNElemID = GetCNElemID(iElem) - IF((ElemBaryNGeo(3,CNElemID).LT.Ray%VolRefineModeZ).OR.(Ray%VolRefineMode.EQ.2))THEN - VolMin = MIN(VolMin, ElemVolume_Shared(CNElemID)) - VolMax = MAX(VolMax, ElemVolume_Shared(CNElemID)) + DO iCNElem = firstElem, lastElem + iGlobalElem = GetGlobalElemID(iCNElem) + IF((ElemBaryNGeo(3,iCNElem).LT.Ray%VolRefineModeZ).OR.(Ray%VolRefineMode.EQ.2))THEN + VolMin = MIN(VolMin, ElemVolume_Shared(iCNElem)) + VolMax = MAX(VolMax, ElemVolume_Shared(iCNElem)) FoundElem = .TRUE. END IF - END DO ! iElem = 1, PP_nElems + END DO ! iCNElem = firstElem, lastElem #if USE_MPI CALL MPI_ALLREDUCE(MPI_IN_PLACE, VolMin, 1, MPI_DOUBLE_PRECISION, MPI_MIN, MPI_COMM_WORLD, IERROR) CALL MPI_ALLREDUCE(MPI_IN_PLACE, VolMax, 1, MPI_DOUBLE_PRECISION, MPI_MAX, MPI_COMM_WORLD, IERROR) @@ -257,13 +289,14 @@ SUBROUTINE InitHighOrderRaySampling() ! Get the slope of the linear interpolation function between the maximum and minimum of the element volumes m = REAL(Ray%Nmax-Ray%Nmin)/(VolMax-VolMin) IF(FoundElem)THEN - DO iElem = 1, PP_nElems - CNElemID = GetCNElemID(iElem) - IF(ElemBaryNGeo(3,CNElemID).LT.Ray%VolRefineModeZ)THEN - NReal = m * (ElemVolume_Shared(CNElemID)-VolMin) + REAL(Ray%Nmin) - N_DG_Ray(iElem) = NINT(NReal) + ! Loop over process elements + DO iCNElem = firstElem, lastElem + iGlobalElem = GetGlobalElemID(iCNElem) + IF(ElemBaryNGeo(3,iCNElem).LT.Ray%VolRefineModeZ)THEN + NReal = m * (ElemVolume_Shared(iCNElem)-VolMin) + REAL(Ray%Nmin) + N_DG_Ray(iGlobalElem) = NINT(NReal) END IF - END DO ! iElem = 1, PP_nElems + END DO ! iCNElem = firstElem, lastElem END IF ! FoundElem END IF ! (VolMax.GT.VolMin).AND.(.NOT.ALMOST) @@ -271,6 +304,7 @@ SUBROUTINE InitHighOrderRaySampling() CASE DEFAULT ! Debugging: #if defined(CODE_ANALYZE) + IF(nProcessors.GT.1) CALL abort(__STAMP__,'This only works for single-core runs') ! 3D box test case with diagonal rays IF(debugRay)THEN N_DG_Ray = Ray%Nmax @@ -306,6 +340,10 @@ SUBROUTINE InitHighOrderRaySampling() CALL abort(__STAMP__,'RayTracing-VolRefineMode unknown: ',IntInfoOpt=Ray%VolRefineMode) #endif /*defined(CODE_ANALYZE)*/ END SELECT + +#if USE_MPI + CALL BARRIER_AND_SYNC(N_DG_Ray_Shared_Win,MPI_COMM_SHARED) +#endif /*USE_MPI*/ END IF ! Ray%NMin.NE.Ray%NMax ! Sanity check @@ -317,16 +355,20 @@ SUBROUTINE InitHighOrderRaySampling() ALLOCATE(PREF_VDM_Ray(Ray%Nmin:Ray%Nmax,Ray%Nmin:Ray%Nmax)) CALL BuildNInterAndVandermonde() -ALLOCATE(N_VolMesh_Ray(1:nElems)) +ALLOCATE(N_VolMesh_Ray(1:nGlobalElems)) +#if USE_MPI +CALL BuildElem_xGP_RayTrace(NodeCoords_Shared) +#else CALL BuildElem_xGP_RayTrace(NodeCoords) +#endif /*USE_MPI*/ ! the local DG solution in physical and reference space -ALLOCATE(U_N_Ray(1:PP_nElems)) -DO iElem = 1, PP_nElems - Nloc = N_DG_Ray(iElem) - ALLOCATE(U_N_Ray(iElem)%U(nVarRay,0:Nloc,0:Nloc,0:Nloc)) - U_N_Ray(iElem)%U = 0. -END DO ! iElem = 1, PP_nElems +ALLOCATE(U_N_Ray(1:nGlobalElems)) +DO iGlobalElem = 1, nGlobalElems + Nloc = N_DG_Ray(iGlobalElem) + ALLOCATE(U_N_Ray(iGlobalElem)%U(nVarRay,0:Nloc,0:Nloc,0:Nloc)) + U_N_Ray(iGlobalElem)%U = 0. +END DO ! iGlobalElem = 1, nGlobalElems END SUBROUTINE InitHighOrderRaySampling @@ -340,9 +382,9 @@ SUBROUTINE BuildElem_xGP_RayTrace(NodeCoords) ! MODULES USE MOD_Globals USE MOD_PreProc -USE MOD_Mesh_Vars ,ONLY: NGeo,nElems +USE MOD_Mesh_Vars ,ONLY: NGeo,nGlobalElems USE MOD_Interpolation_Vars ,ONLY: NodeTypeCL,NodeTypeVISU,NodeType -USE MOD_RayTracing_Vars ,ONLY: Ray,N_VolMesh_Ray,N_DG_Ray,N_Inter_Ray +USE MOD_RayTracing_Vars ,ONLY: Ray,N_VolMesh_Ray,N_DG_Ray USE MOD_Interpolation ,ONLY: GetVandermonde,GetNodesAndWeights USE MOD_ChangeBasis ,ONLY: ChangeBasis3D_XYZ, ChangeBasis3D USE MOD_Basis ,ONLY: LagrangeInterpolationPolys @@ -350,10 +392,10 @@ SUBROUTINE BuildElem_xGP_RayTrace(NodeCoords) IMPLICIT NONE !---------------------------------------------------------------------------------------------------------------------------------- ! INPUT/OUTPUT VARIABLES -REAL,INTENT(IN) :: NodeCoords(3,0:NGeo,0:NGeo,0:NGeo,nElems) !< Equidistant mesh coordinates +REAL,INTENT(IN) :: NodeCoords(3,0:NGeo,0:NGeo,0:NGeo,nGlobalElems) !< Equidistant mesh coordinates !---------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -INTEGER :: iElem,Nloc,i +INTEGER :: iGlobalElem,Nloc TYPE VdmType REAL, ALLOCATABLE :: Vdm_EQNGeo_CLNloc(:,:) @@ -362,7 +404,6 @@ SUBROUTINE BuildElem_xGP_RayTrace(NodeCoords) TYPE(VdmType), DIMENSION(:), ALLOCATABLE :: Vdm -REAL, DIMENSION(:), ALLOCATABLE :: MappedGauss(:) !================================================================================================================================== ! Build Vdm for every degree @@ -381,25 +422,13 @@ SUBROUTINE BuildElem_xGP_RayTrace(NodeCoords) END DO ! Nloc = Ray%Nmin, Ray%Nmax ! Set Elem_xGP for each element -DO iElem=1,nElems - Nloc = N_DG_Ray(iElem) +DO iGlobalElem=1,nGlobalElems + Nloc = N_DG_Ray(iGlobalElem) - ALLOCATE(N_VolMesh_Ray(iElem)%Elem_xGP(3,0:Nloc,0:Nloc,0:Nloc)) - CALL ChangeBasis3D(3,NGeo,Nloc,Vdm(Nloc)%Vdm_EQNGeo_CLNloc,NodeCoords(:,:,:,:,iElem),N_VolMesh_Ray(iElem)%Elem_xGP(:,:,:,:)) - - ! Build variables for nearest Gauss-point (NGP) method - ALLOCATE(N_VolMesh_Ray(iElem)%GaussBorder(1:Nloc)) - ALLOCATE(MappedGauss(1:Nloc+1)) - - DO i = 0, Nloc - MappedGauss(i+1) = N_Inter_Ray(Nloc)%xGP(i) - END DO ! i = 0, Nloc - - DO i = 1, Nloc - N_VolMesh_Ray(iElem)%GaussBorder(i) = (MappedGauss(i+1) + MappedGauss(i))/2 - END DO ! i = 1, Nloc - - DEALLOCATE(MappedGauss) + ! TODO: Currently each process has all global xGP (maybe put unrolled into a shared array) + ALLOCATE(N_VolMesh_Ray(iGlobalElem)%Elem_xGP(3,0:Nloc,0:Nloc,0:Nloc)) + CALL ChangeBasis3D(3,NGeo,Nloc,Vdm(Nloc)%Vdm_EQNGeo_CLNloc,NodeCoords(:,:,:,:,iGlobalElem),& + N_VolMesh_Ray(iGlobalElem)%Elem_xGP(:,:,:,:)) END DO @@ -421,14 +450,32 @@ SUBROUTINE BuildNInterAndVandermonde() !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES INTEGER :: i,j,Nin,Nout,Nloc +REAL, DIMENSION(:), ALLOCATABLE :: MappedGauss(:) !=================================================================================================================================== DO Nloc=Ray%Nmin,Ray%Nmax + ! Build basis for polynomial of degree Nloc CALL InitInterpolationBasis(Nloc , N_Inter_Ray(Nloc)%xGP , N_Inter_Ray(Nloc)%wGP , N_Inter_Ray(Nloc)%wBary , & N_Inter_Ray(Nloc)%L_Minus , N_Inter_Ray(Nloc)%L_Plus , N_Inter_Ray(Nloc)%L_PlusMinus , & N_Inter_Ray(Nloc)%swGP , N_Inter_Ray(Nloc)%wGPSurf , & N_Inter_Ray(Nloc)%Vdm_Leg , N_Inter_Ray(Nloc)%sVdm_Leg) + + ! Build variables for nearest Gauss-point (NGP) method + ALLOCATE(N_Inter_Ray(Nloc)%GaussBorder(1:Nloc)) + ALLOCATE(MappedGauss(1:Nloc+1)) + + DO i = 0, Nloc + MappedGauss(i+1) = N_Inter_Ray(Nloc)%xGP(i) + END DO ! i = 0, Nloc + + DO i = 1, Nloc + N_Inter_Ray(Nloc)%GaussBorder(i) = (MappedGauss(i+1) + MappedGauss(i))/2 + END DO ! i = 1, Nloc + + DEALLOCATE(MappedGauss) + END DO + ! Fill Vandermonde matrices for p-refinement DO Nin=Ray%Nmin,Ray%Nmax DO Nout=Ray%Nmin,Ray%Nmax @@ -457,18 +504,51 @@ END SUBROUTINE BuildNInterAndVandermonde !=================================================================================================================================== SUBROUTINE FinalizeRayTracing() ! MODULES +USE MOD_Globals USE MOD_RayTracing_Vars +USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall +#if USE_MPI +USE MOD_MPI_Shared_Vars ,ONLY: MPI_COMM_SHARED +USE MOD_MPI_Shared +#endif /*USE_MPI*/ IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------! ! INPUT / OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES !=================================================================================================================================== -SDEALLOCATE(N_DG_Ray) SDEALLOCATE(N_VolMesh_Ray) SDEALLOCATE(N_Inter_Ray) SDEALLOCATE(PREF_VDM_Ray) SDEALLOCATE(U_N_Ray) +SDEALLOCATE(RayElemPassedEnergy) +! TODO: call this finalize with 2 modes (1. after ray tracing, 2. after plasma simulation) +!SDEALLOCATE(PhotonSampWall) +! TODO: see above: deallocate these arrays after simulation end because otherwise these fields will be corrupt in the state file +! and that canc ause confusion +!SDEALLOCATE(N_DG_Ray_loc) +!SDEALLOCATE(RayElemPassedEnergyLoc1st) +!SDEALLOCATE(RayElemPassedEnergyLoc2nd) +!SDEALLOCATE(RaySecondaryVectorX) +!SDEALLOCATE(RaySecondaryVectorY) +!SDEALLOCATE(RaySecondaryVectorZ) +IF(nProcessors.GT.1)THEN +#if USE_MPI + SDEALLOCATE(RayElemOffset) + CALL MPI_BARRIER(MPI_COMM_SHARED,iError) + CALL UNLOCK_AND_FREE(RayElemPassedEnergy_Shared_Win) + CALL UNLOCK_AND_FREE(RayElemPassedEnergyHO_Shared_Win) + CALL MPI_BARRIER(MPI_COMM_SHARED,iError) + ADEALLOCATE(RayElemPassedEnergy_Shared) + ADEALLOCATE(RayElemPassedEnergyHO_Shared) +#endif /*USE_MPI*/ +END IF ! nProcessors.GT.1 +#if USE_MPI +CALL MPI_BARRIER(MPI_COMM_SHARED,iError) +CALL UNLOCK_AND_FREE(N_DG_Ray_Shared_Win) +CALL MPI_BARRIER(MPI_COMM_SHARED,iError) +ADEALLOCATE(N_DG_Ray_Shared) +#endif /*USE_MPI*/ END SUBROUTINE FinalizeRayTracing END MODULE MOD_RayTracing_Init diff --git a/src/radiation/ray_tracing/raytrace_vars.f90 b/src/radiation/ray_tracing/raytrace_vars.f90 index 08f4bf852..d90ac23c0 100644 --- a/src/radiation/ray_tracing/raytrace_vars.f90 +++ b/src/radiation/ray_tracing/raytrace_vars.f90 @@ -75,13 +75,27 @@ MODULE MOD_RayTracing_Vars INTEGER,PARAMETER :: RayElemSize=6 REAL, ALLOCATABLE :: RayElemPassedEnergy(:,:) !< #if USE_MPI -INTEGER :: RayElemPassedEnergy_Shared_Win !< -REAL,POINTER :: RayElemPassedEnergy_Shared(:,:)!< +INTEGER :: RayElemPassedEnergy_Shared_Win !< +REAL,POINTER :: RayElemPassedEnergy_Shared(:,:) !< +INTEGER :: RayElemPassedEnergyHO_Shared_Win !< high-order sampling +REAL,POINTER :: RayElemPassedEnergyHO_Shared(:,:) !< high-order sampling +INTEGER,ALLOCATABLE :: RayElemOffset(:) !< Entry offset for high-order sampling #endif +REAL, ALLOCATABLE :: RayElemPassedEnergyLoc1st(:) +REAL, ALLOCATABLE :: RayElemPassedEnergyLoc2nd(:) +REAL, ALLOCATABLE :: RaySecondaryVectorX(:) +REAL, ALLOCATABLE :: RaySecondaryVectorY(:) +REAL, ALLOCATABLE :: RaySecondaryVectorZ(:) ! Output of high-order p-adaptive info INTEGER,PARAMETER :: nVarRay=2 !< Number of variables for higher-order sampling for volume ray tracing -INTEGER,ALLOCATABLE :: N_DG_Ray(:) !< polynomial degree inside DG element for higher-order sampling for volume ray tracing, size(nElems) + +INTEGER,ALLOCATABLE :: N_DG_Ray_loc(:) !< for output to ElemData +INTEGER,ALLOCPOINT :: N_DG_Ray(:) !< polynomial degree inside DG element for higher-order sampling for volume ray tracing, size(nElems) +#if USE_MPI +INTEGER :: N_DG_Ray_Shared_Win +INTEGER,ALLOCPOINT :: N_DG_Ray_Shared(:) +#endif ! DG solution volume TYPE N_U_Vol @@ -96,16 +110,6 @@ MODULE MOD_RayTracing_Vars !----------------------------------------------------------------------------------------------------------------------------------- TYPE, PUBLIC :: VolMesh REAL,ALLOCATABLE :: Elem_xGP(:,:,:,:) !< XYZ positions (first index 1:3) of the volume Gauss Point - - REAL,ALLOCATABLE :: GaussBorder(:) !< Variable required for Nearest Gauss Point (NGP) assignment - - ! Metrics on GaussPoints - !REAL,ALLOCATABLE :: dXCL_N(:,:,:,:,:) !< Jacobi matrix of the mapping P\in NGeo - !REAL,ALLOCATABLE :: Metrics_fTilde(:,:,:,:) !< Metric Terms (first indices 3) on each GaussPoint - !REAL,ALLOCATABLE :: Metrics_gTilde(:,:,:,:) - !REAL,ALLOCATABLE :: Metrics_hTilde(:,:,:,:) - !REAL,ALLOCATABLE :: sJ(:,:,:) !< 1/DetJac for each Gauss Point - END TYPE VolMesh TYPE(VolMesh),ALLOCATABLE :: N_VolMesh_Ray(:) !< Array to store Mesh metrics object "VolMesh" @@ -115,16 +119,17 @@ MODULE MOD_RayTracing_Vars !----------------------------------------------------------------------------------------------------------------------------------- TYPE, PUBLIC :: Interpolation ! reserved for Gauss Points with polynomial degree N, all allocated (0:N) - REAL,ALLOCATABLE :: L_Plus(:) !< L for boundary flux computation at plus side (1) - REAL,ALLOCATABLE :: L_Minus(:) !< L for boundary flux computation at minus side (-1) - REAL,ALLOCATABLE :: L_PlusMinus(:,:) !< L for boundary flux computation at both sides (-1,1) - REAL,ALLOCATABLE :: xGP(:) !< Gauss point coordinates - REAL,ALLOCATABLE :: wGP(:) !< GP integration weights - REAL,ALLOCATABLE :: swGP(:) !< 1.0/ GP integration weights - REAL,ALLOCATABLE :: wBary(:) !< barycentric weights - REAL,ALLOCATABLE :: wGPSurf(:,:) !< wGPSurf(i,j)=wGP(i)*wGP(j) - REAL,ALLOCATABLE :: NChooseK(:,:) !< array n over n - REAL,ALLOCATABLE :: Vdm_Leg(:,:), sVdm_Leg(:,:) !< Legendre Vandermonde matrix + REAL,ALLOCATABLE :: L_Plus(:) !< L for boundary flux computation at plus side (1) + REAL,ALLOCATABLE :: L_Minus(:) !< L for boundary flux computation at minus side (-1) + REAL,ALLOCATABLE :: L_PlusMinus(:,:) !< L for boundary flux computation at both sides (-1,1) + REAL,ALLOCATABLE :: xGP(:) !< Gauss point coordinates + REAL,ALLOCATABLE :: wGP(:) !< GP integration weights + REAL,ALLOCATABLE :: swGP(:) !< 1.0/ GP integration weights + REAL,ALLOCATABLE :: wBary(:) !< barycentric weights + REAL,ALLOCATABLE :: wGPSurf(:,:) !< wGPSurf(i,j)=wGP(i)*wGP(j) + REAL,ALLOCATABLE :: NChooseK(:,:) !< array n over n + REAL,ALLOCATABLE :: Vdm_Leg(:,:), sVdm_Leg(:,:) !< Legendre Vandermonde matrix + REAL,ALLOCATABLE :: GaussBorder(:) !< Variable required for Nearest Gauss Point (NGP) assignment END TYPE Interpolation TYPE(Interpolation),ALLOCATABLE :: N_Inter_Ray(:) !< Array of prebuild interpolation matrices From b8a3e465c9eaa612dc5813983319843a25717d65 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Thu, 13 Jul 2023 22:16:59 +0200 Subject: [PATCH 114/495] Ray tracing: testing of different weighting methods. Either due to the Jacobian (and the integration weights) or the sampling of the ray path within the cell. --- src/analyze/analyze.f90 | 2 +- src/interpolation/interpolation.f90 | 9 ++++- src/io_hdf5/hdf5_output.f90 | 23 ++++++++--- src/particles/pic/analyze/pic_analyze.f90 | 2 +- .../tracking/radtrans_tracking_output.f90 | 40 +++++++++++++++---- .../tracking/radtrans_tracking_tools.f90 | 19 +++++---- src/radiation/ray_tracing/raytrace_ini.f90 | 21 +++++----- src/radiation/ray_tracing/raytrace_vars.f90 | 2 + 8 files changed, 86 insertions(+), 32 deletions(-) diff --git a/src/analyze/analyze.f90 b/src/analyze/analyze.f90 index 34876373a..31475d981 100644 --- a/src/analyze/analyze.f90 +++ b/src/analyze/analyze.f90 @@ -577,7 +577,7 @@ SUBROUTINE CalcErrorStateFiles(nVar,N1,N2,U1,U2) ! Interpolate values of Error-Grid from GP's DO iElem=1,nElems - ! Interpolate the Jacobian to the analyze grid: be carefull we interpolate the inverse of the inverse of the jacobian ;-) + ! Interpolate the Jacobian to the analyze grid: be careful we interpolate the inverse of the inverse of the Jacobian ;-) J_N(1,0:N1,0:N1,0:N1)=1./sJ(:,:,:,iElem) CALL ChangeBasis3D(1,N1,NAnalyze,Vdm_GaussN_NAnalyze1,J_N(1:1,0:N1,0:N1,0:N1),J_NAnalyze(1:1,:,:,:)) diff --git a/src/interpolation/interpolation.f90 b/src/interpolation/interpolation.f90 index 5b9e6717f..2d2567e96 100644 --- a/src/interpolation/interpolation.f90 +++ b/src/interpolation/interpolation.f90 @@ -162,7 +162,7 @@ SUBROUTINE InitInterpolation(NIn,NAnalyzeIn) END SUBROUTINE InitInterpolation -SUBROUTINE InitInterpolationBasis(N_in, xGP ,wGP, wBary ,L_Minus ,L_Plus , L_PlusMinus,swGP, wGPSurf, Vdm_Leg ,sVdm_Leg) +SUBROUTINE InitInterpolationBasis(N_in, xGP ,wGP, wBary ,L_Minus ,L_Plus , L_PlusMinus,swGP, wGPSurf, Vdm_Leg ,sVdm_Leg, NodeType_in) !============================================================================================================================ ! Initialize basis for Gauss-points of order N. ! Calculate positions of Gauss-points, integration weights and barycentric weights. Prepare basis evaluation at -1 and +1. @@ -188,6 +188,7 @@ SUBROUTINE InitInterpolationBasis(N_in, xGP ,wGP, wBary ,L_Minus ,L_Plus , L_Plu REAL,ALLOCATABLE,DIMENSION(:,:),INTENT(OUT),OPTIONAL:: wGPSurf !< Vandermonde Nodal->Modal REAL,ALLOCATABLE,DIMENSION(:,:),INTENT(OUT),OPTIONAL:: Vdm_Leg !< Vandermonde Nodal->Modal REAL,ALLOCATABLE,DIMENSION(:,:),INTENT(OUT),OPTIONAL:: sVdm_Leg !< Vandermonde Modal->Nodal +CHARACTER(LEN=*),INTENT(IN),OPTIONAL :: NodeType_in !< Type of 1D points !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- @@ -199,7 +200,11 @@ SUBROUTINE InitInterpolationBasis(N_in, xGP ,wGP, wBary ,L_Minus ,L_Plus , L_Plu ALLOCATE(L_Minus(0:N_in), L_Plus(0:N_in)) ALLOCATE(L_PlusMinus(0:N_in,6)) -CALL GetNodesAndWeights(N_in,NodeType,xGP,wGP,wBary) +IF(PRESENT(NodeType_in))THEN + CALL GetNodesAndWeights(N_in , NodeType_in , xGP , wGP , wBary) +ELSE + CALL GetNodesAndWeights(N_in , NodeType , xGP , wGP , wBary) +END IF ! PRESENT(NodeType_in) IF(PRESENT(wGPSurf))THEN ALLOCATE(wGPSurf(0:N_in,0:N_in)) diff --git a/src/io_hdf5/hdf5_output.f90 b/src/io_hdf5/hdf5_output.f90 index 0658c5ae7..ddccbb333 100644 --- a/src/io_hdf5/hdf5_output.f90 +++ b/src/io_hdf5/hdf5_output.f90 @@ -172,7 +172,7 @@ SUBROUTINE WriteTimeAverage(MeshFileName,OutputTime,PreviousTime,VarNamesAvg,Var END SUBROUTINE WriteTimeAverage -SUBROUTINE GenerateFileSkeleton(TypeString,nVar,StrVarNames,MeshFileName,OutputTime,FileNameIn,WriteUserblockIn) +SUBROUTINE GenerateFileSkeleton(TypeString,nVar,StrVarNames,MeshFileName,OutputTime,FileNameIn,WriteUserblockIn,NIn,NodeType_in) !=================================================================================================================================== ! Subroutine that generates the output file on a single processor and writes all the necessary attributes (better MPI performance) !=================================================================================================================================== @@ -200,10 +200,12 @@ SUBROUTINE GenerateFileSkeleton(TypeString,nVar,StrVarNames,MeshFileName,OutputT CHARACTER(LEN=*),INTENT(IN) :: TypeString CHARACTER(LEN=*),INTENT(IN),OPTIONAL :: FileNameIn INTEGER,INTENT(IN) :: nVar +INTEGER,INTENT(IN),OPTIONAL :: NIn CHARACTER(LEN=255) :: StrVarNames(nVar) CHARACTER(LEN=*),INTENT(IN) :: MeshFileName REAL,INTENT(IN) :: OutputTime LOGICAL,INTENT(IN),OPTIONAL :: WriteUserblockIn +CHARACTER(LEN=*),INTENT(IN),OPTIONAL :: NodeType_in !< Type of 1D points !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- @@ -215,7 +217,14 @@ SUBROUTINE GenerateFileSkeleton(TypeString,nVar,StrVarNames,MeshFileName,OutputT CHARACTER(LEN=255), DIMENSION(1:3),PARAMETER :: TrackingString = (/'refmapping ', 'tracing ', 'triatracking'/) #endif /*PARTICLES*/ LOGICAL :: WriteUserblock +INTEGER :: Nloc !=================================================================================================================================== +! Check if NIn is to be used +IF(PRESENT(NIn))THEN + Nloc = NIn +ELSE + Nloc = PP_N +END IF ! PRESENT(NIn) ! Create file IF(PRESENT(FileNameIn))THEN FileName=FileNameIn @@ -228,7 +237,7 @@ SUBROUTINE GenerateFileSkeleton(TypeString,nVar,StrVarNames,MeshFileName,OutputT CALL WriteHDF5Header(TRIM(TypeString),File_ID) ! Preallocate the data space for the dataset. -Dimsf=(/nVar,PP_N+1,PP_N+1,PP_N+1,nGlobalElems/) +Dimsf=(/nVar,Nloc+1,Nloc+1,Nloc+1,nGlobalElems/) CALL H5SCREATE_SIMPLE_F(5, Dimsf, FileSpace, iError) ! Create the dataset with default properties. HDF5DataType=H5T_NATIVE_DOUBLE @@ -238,13 +247,17 @@ SUBROUTINE GenerateFileSkeleton(TypeString,nVar,StrVarNames,MeshFileName,OutputT CALL H5SCLOSE_F(FileSpace, iError) ! Write dataset properties "Time","MeshFile","NextFile","NodeType","VarNames" -CALL WriteAttributeToHDF5(File_ID,'N',1,IntegerScalar=PP_N) +CALL WriteAttributeToHDF5(File_ID,'N',1,IntegerScalar=Nloc) CALL WriteAttributeToHDF5(File_ID,'Time',1,RealScalar=OutputTime) CALL WriteAttributeToHDF5(File_ID,'MeshFile',1,StrScalar=(/TRIM(MeshFileName)/)) -CALL WriteAttributeToHDF5(File_ID,'NodeType',1,StrScalar=(/NodeType/)) +IF(PRESENT(NodeType_in))THEN + CALL WriteAttributeToHDF5(File_ID,'NodeType',1,StrScalar=(/NodeType_in/)) +ELSE + CALL WriteAttributeToHDF5(File_ID,'NodeType',1,StrScalar=(/NodeType/)) +END IF ! PRESENT(NodeType_in) CALL WriteAttributeToHDF5(File_ID,'VarNames',nVar,StrArray=StrVarNames) -CALL WriteAttributeToHDF5(File_ID,'NComputation',1,IntegerScalar=PP_N) +CALL WriteAttributeToHDF5(File_ID,'NComputation',1,IntegerScalar=Nloc) #ifdef PARTICLES CALL WriteAttributeToHDF5(File_ID,'TrackingMethod',1,StrScalar=(/TRIM(TrackingString(TrackingMethod))/)) diff --git a/src/particles/pic/analyze/pic_analyze.f90 b/src/particles/pic/analyze/pic_analyze.f90 index bcb83f108..960873af9 100644 --- a/src/particles/pic/analyze/pic_analyze.f90 +++ b/src/particles/pic/analyze/pic_analyze.f90 @@ -82,7 +82,7 @@ SUBROUTINE VerifyDepositedCharge() DO iElem=1,nElems ! Interpolate the physical position Elem_xGP to the analyze position, needed for exact function CALL ChangeBasis3D(3,PP_N,NAnalyze,Vdm_GaussN_NAnalyze,Elem_xGP(1:3,:,:,:,iElem),Coords_NAnalyze(1:3,:,:,:)) - ! Interpolate the Jacobian to the analyze grid: be careful we interpolate the inverse of the inverse of the jacobian ;-) + ! Interpolate the Jacobian to the analyze grid: be careful we interpolate the inverse of the inverse of the Jacobian ;-) J_N(1,0:PP_N,0:PP_N,0:PP_N)=1./sJ(:,:,:,iElem) CALL ChangeBasis3D(1,PP_N,NAnalyze,Vdm_GaussN_NAnalyze,J_N(1:1,0:PP_N,0:PP_N,0:PP_N),J_NAnalyze(1:1,:,:,:)) ! Interpolate the solution to the analyze grid diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 index a3e9818de..67aafec91 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 @@ -38,9 +38,9 @@ SUBROUTINE WritePhotonVolSampleToHDF5() ! MODULES USE MOD_Globals USE MOD_PreProc -USE MOD_Mesh_Vars ,ONLY: nElems,MeshFile,offSetElem +USE MOD_Mesh_Vars ,ONLY: nElems,MeshFile,offSetElem,sJ USE MOD_Globals_Vars ,ONLY: ProjectName -USE MOD_RayTracing_Vars ,ONLY: Ray,nVarRay,U_N_Ray,N_DG_Ray,PREF_VDM_Ray,N_DG_Ray_loc +USE MOD_RayTracing_Vars ,ONLY: Ray,nVarRay,U_N_Ray,N_DG_Ray,PREF_VDM_Ray,N_DG_Ray_loc,N_Inter_Ray USE MOD_RayTracing_Vars ,ONLY: RayElemPassedEnergyLoc1st,RayElemPassedEnergyLoc2nd USE MOD_RayTracing_Vars ,ONLY: RaySecondaryVectorX,RaySecondaryVectorY,RaySecondaryVectorZ USE MOD_HDF5_output ,ONLY: GatheredWriteArray @@ -54,6 +54,8 @@ SUBROUTINE WritePhotonVolSampleToHDF5() USE MOD_HDF5_Output_ElemData ,ONLY: WriteAdditionalElemData USE MOD_Mesh_Vars ,ONLY: offsetElem,nGlobalElems USE MOD_ChangeBasis ,ONLY: ChangeBasis3D +USE MOD_Interpolation_Vars ,ONLY: NodeType +USE MOD_Interpolation ,ONLY: GetVandermonde ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -64,13 +66,16 @@ SUBROUTINE WritePhotonVolSampleToHDF5() ! LOCAL VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- CHARACTER(LEN=255) :: FileName -INTEGER :: iElem,iGlobalElem,Nloc -INTEGER,PARAMETER :: nVar=2 +INTEGER :: iElem,iGlobalElem,Nloc,k,l,m CHARACTER(LEN=255), ALLOCATABLE :: StrVarNames(:) REAL :: U(nVarRay,0:Ray%NMax,0:Ray%NMax,0:Ray%NMax,PP_nElems) #if USE_MPI INTEGER :: NlocOffset #endif /*USE_MPI*/ +REAL :: J_N(1,0:PP_N,0:PP_N,0:PP_N) +REAL :: J_Nmax(1:1,0:Ray%NMax,0:Ray%NMax,0:Ray%NMax) +REAL :: IntegrationWeight +REAL :: Vdm_GaussN_Nloc(0:PP_N,0:Ray%NMax) !< for interpolation to Analyze points (from NodeType nodes to Gauss-Lobatto nodes) !=================================================================================================================================== SWRITE(UNIT_stdOut,'(a)',ADVANCE='NO') ' WRITE Radiation TO HDF5 FILE...' @@ -97,13 +102,13 @@ SUBROUTINE WritePhotonVolSampleToHDF5() END DO ! iElem = 1, nElems CALL AddToElemData(ElementOut,'Nloc',IntArray=N_DG_Ray_loc) -ALLOCATE(StrVarNames(1:nVar)) +ALLOCATE(StrVarNames(1:nVarRay)) StrVarNames(1)='RayElemPassedEnergy1st' StrVarNames(2)='RayElemPassedEnergy2nd' ! Generate skeleton for the file with all relevant data on a single proc (MPIRoot) FileName=TRIM(ProjectName)//'_RadiationVolState.h5' -IF(MPIRoot) CALL GenerateFileSkeleton('RadiationVolState',nVar,StrVarNames,TRIM(MeshFile),0.,FileNameIn=FileName) +IF(MPIRoot) CALL GenerateFileSkeleton('RadiationVolState',nVarRay,StrVarNames,TRIM(MeshFile),0.,FileNameIn=FileName,NIn=Ray%NMax,NodeType_in=Ray%NodeType) #if USE_MPI CALL MPI_BARRIER(MPI_COMM_WORLD,iError) #endif @@ -111,6 +116,9 @@ SUBROUTINE WritePhotonVolSampleToHDF5() CALL ExchangeRayVolInfo() #endif /*USE_MPI*/ +! p-refinement: Interpolate lower degree to higher degree (other way around would require model=T) +CALL GetVandermonde(PP_N, NodeType, Ray%NMax, Ray%NodeType, Vdm_GaussN_Nloc, modal=.FALSE.) + #if USE_MPI ASSOCIATE( RayElemPassedEnergy => RayElemPassedEnergy_Shared ) #endif /*USE_MPI*/ @@ -155,7 +163,25 @@ SUBROUTINE WritePhotonVolSampleToHDF5() CALL ChangeBasis3D(nVarRay, Nloc, Ray%NMax, PREF_VDM_Ray(Nloc,Ray%NMax)%Vdm, U_N_Ray(iElem)%U(:,:,:,:), U(:,:,:,:,iElem)) END IF ! Nloc.Eq.Nmax - END DO + ! Apply integration weights and the Jacobian + ! Interpolate the Jacobian to the analyze grid: be careful we interpolate the inverse of the inverse of the Jacobian ;-) + J_N(1,0:PP_N,0:PP_N,0:PP_N)=1./sJ(:,:,:,iElem) + CALL ChangeBasis3D(1,PP_N,Ray%NMax,Vdm_GaussN_Nloc,J_N(1:1,0:PP_N,0:PP_N,0:PP_N),J_Nmax(1:1,:,:,:)) + DO m=0,Ray%NMax + DO l=0,Ray%NMax + DO k=0,Ray%NMax + IntegrationWeight = N_Inter_Ray(Ray%NMax)%wGP(k)*& + N_Inter_Ray(Ray%NMax)%wGP(l)*& + N_Inter_Ray(Ray%NMax)%wGP(m)*J_Nmax(1,k,l,m) + U(1:2,k,l,m,iElem) = U(1:2,k,l,m,iElem) * IntegrationWeight + !U(1:2,k,l,m,iElem) = U(1:2,k,l,m,iElem) / IntegrationWeight + !U(1:2,k,l,m,iElem) = U(1:2,k,l,m,iElem) * J_Nmax(1,k,l,m) + !U(1:2,k,l,m,iElem) = U(1:2,k,l,m,iElem) / J_Nmax(1,k,l,m) + END DO ! k + END DO ! l + END DO ! m + + END DO ! iElem=1,PP_nElems ! Associate construct for integer KIND=8 possibility ASSOCIATE (& diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 index c53543e28..c9d92d3db 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 @@ -661,7 +661,7 @@ SUBROUTINE CalcAbsorptionRayTrace(IntersectionPos,GlobalElemID,PhotonDir) REAL, INTENT(IN) :: IntersectionPos(3) ! Local variable declaration INTEGER :: a,b,ii,k,l,m,Nloc,NbrOfSamples,iIntersec -REAL :: IntersectionPosRef(3),scaleFac,SamplePos(3) +REAL :: IntersectionPosRef(3),scaleFac,SamplePos(3),weight LOGICAL :: arr(0:Ray%NMax,0:Ray%NMax,0:Ray%NMax) !--------------------------------------------------------------------------------------------------! ! Check primary or secondary direction @@ -684,9 +684,9 @@ SUBROUTINE CalcAbsorptionRayTrace(IntersectionPos,GlobalElemID,PhotonDir) END IF ! Loop over number of sub-samples -NbrOfSamples = Nloc+5 ! must be at least 2! -scaleFac = 1./REAL(NbrOfSamples) -!scaleFac = 1. +NbrOfSamples = Nloc+1 ! must be at least 2! +!scaleFac = 1./REAL(NbrOfSamples) +scaleFac = 1. arr = .FALSE. DO iIntersec = 1, NbrOfSamples @@ -724,13 +724,18 @@ SUBROUTINE CalcAbsorptionRayTrace(IntersectionPos,GlobalElemID,PhotonDir) ! Scaling factor to ensure that rays that are counted multiple times in high-order elements do not increase the total energy ! deposited in the corresponding element + weight = 1.0 + !IF((k.eq.0.or.k.eq.Nloc).OR.& + !(l.eq.0.or.l.eq.Nloc).OR.& + !(m.eq.0.or.m.eq.Nloc)) weight = weight * 0.5 + !weight = N_Inter_Ray(Nloc)%wGP(k)*N_Inter_Ray(Nloc)%wGP(l)*N_Inter_Ray(Nloc)%wGP(m) IF(.NOT.arr(k,l,m))THEN IF(DOT_PRODUCT(PhotonDir,Ray%Direction).GT.0.0)THEN - U_N_Ray(GlobalElemID)%U(1,k,l,m) = U_N_Ray(GlobalElemID)%U(1,k,l,m) + PhotonProps%PhotonEnergy * scaleFac + U_N_Ray(GlobalElemID)%U(1,k,l,m) = U_N_Ray(GlobalElemID)%U(1,k,l,m) + PhotonProps%PhotonEnergy * scaleFac * weight ELSE - U_N_Ray(GlobalElemID)%U(2,k,l,m) = U_N_Ray(GlobalElemID)%U(2,k,l,m) + PhotonProps%PhotonEnergy * scaleFac + U_N_Ray(GlobalElemID)%U(2,k,l,m) = U_N_Ray(GlobalElemID)%U(2,k,l,m) + PhotonProps%PhotonEnergy * scaleFac * weight END IF - !arr(k,l,m)=.TRUE. + arr(k,l,m)=.TRUE. END IF ! .NOT.arr(k,l,m) END DO ! iIntersec = 1, Nloc+3 END SUBROUTINE CalcAbsorptionRayTrace diff --git a/src/radiation/ray_tracing/raytrace_ini.f90 b/src/radiation/ray_tracing/raytrace_ini.f90 index 408fe630e..7ddf4c6f3 100644 --- a/src/radiation/ray_tracing/raytrace_ini.f90 +++ b/src/radiation/ray_tracing/raytrace_ini.f90 @@ -75,6 +75,7 @@ SUBROUTINE InitRayTracing() USE MOD_Globals_Vars ,ONLY: Pi USE MOD_Particle_Mesh_Vars ,ONLY: GEO USE MOD_RadiationTrans_Vars ,ONLY: RadiationAbsorptionModel,RadObservationPointMethod +USE MOD_Interpolation_Vars ,ONLY: NodeType,NodeTypeVISU ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -116,6 +117,8 @@ SUBROUTINE InitRayTracing() Ray%VolRefineMode = GETINT('RayTracing-VolRefineMode') +Ray%NodeType = NodeTypeVISU + ! Output of high-order p-adaptive info Ray%NMin = 1 ! GETINT('RayTracing-NMin') WRITE(UNIT=hilf,FMT='(I3)') PP_N @@ -183,11 +186,11 @@ SUBROUTINE InitHighOrderRaySampling() ! MODULES USE MOD_PreProc USE MOD_Globals ,ONLY: abort,IERROR,myrank,UNIT_StdOut -USE MOD_Mesh_Vars ,ONLY: ElemBaryNGeo,nGlobalElems +USE MOD_Mesh_Vars ,ONLY: nGlobalElems USE MOD_RayTracing_Vars ,ONLY: N_VolMesh_Ray,N_DG_Ray,Ray,N_Inter_Ray,PREF_VDM_Ray,U_N_Ray,nVarRay USE MOD_Mesh_Tools ,ONLY: GetCNElemID,GetGlobalElemID USE MOD_ReadInTools ,ONLY: GETREAL -USE MOD_Particle_Mesh_Vars ,ONLY: ElemVolume_Shared +USE MOD_Particle_Mesh_Vars ,ONLY: ElemVolume_Shared,ElemBaryNGeo #if USE_MPI USE MPI USE MOD_Particle_Mesh_Vars ,ONLY: NodeCoords_Shared @@ -201,6 +204,7 @@ SUBROUTINE InitHighOrderRaySampling() #if USE_LOADBALANCE USE MOD_MPI_Shared USE MOD_MPI_Shared_Vars ,ONLY: MPI_COMM_SHARED,myComputeNodeRank,nComputeNodeProcessors,nComputeNodeTotalElems +!USE MOD_Particle_Mesh_Vars,ONLY: ElemBaryNGeo_Shared #endif /*USE_LOADBALANCE*/ IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------! @@ -214,7 +218,7 @@ SUBROUTINE InitHighOrderRaySampling() LOGICAL,PARAMETER :: debugRay=.FALSE. #endif /*defined(CODE_ANALYZE)*/ LOGICAL :: FoundElem -CHARACTER(LEN=20) :: hilf +CHARACTER(LEN=40) :: hilf !=================================================================================================================================== #if USE_MPI CALL Allocate_Shared((/nGlobalElems/),N_DG_Ray_Shared_Win,N_DG_Ray_Shared) @@ -248,7 +252,7 @@ SUBROUTINE InitHighOrderRaySampling() ! 1: refine below user-defined z-coordinate with NMax IF(Ray%VolRefineMode.NE.2)THEN WRITE(UNIT=hilf,FMT=WRITEFORMAT) 1.0E200!HUGE(1.0) -> HUGE produces IEEE overflow - Ray%VolRefineModeZ = GETREAL('RayTracing-VolRefineModeZ',hilf) + Ray%VolRefineModeZ = GETREAL('RayTracing-VolRefineModeZ',TRIM(hilf)) DO iCNElem = firstElem, lastElem iGlobalElem = GetGlobalElemID(iCNElem) !IPWRITE(UNIT_StdOut,*) "iCNElem,iGlobalElem =", iCNElem,iGlobalElem @@ -443,13 +447,12 @@ SUBROUTINE BuildNInterAndVandermonde() ! MODULES USE MOD_RayTracing_Vars ,ONLY: Ray,N_Inter_Ray,PREF_VDM_Ray USE MOD_Interpolation ,ONLY: InitInterpolationBasis,GetVandermonde -USE MOD_Interpolation_Vars ,ONLY: NodeType IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------! ! INPUT / OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -INTEGER :: i,j,Nin,Nout,Nloc +INTEGER :: i,j,Nin,Nout,Nloc REAL, DIMENSION(:), ALLOCATABLE :: MappedGauss(:) !=================================================================================================================================== DO Nloc=Ray%Nmin,Ray%Nmax @@ -457,7 +460,7 @@ SUBROUTINE BuildNInterAndVandermonde() CALL InitInterpolationBasis(Nloc , N_Inter_Ray(Nloc)%xGP , N_Inter_Ray(Nloc)%wGP , N_Inter_Ray(Nloc)%wBary , & N_Inter_Ray(Nloc)%L_Minus , N_Inter_Ray(Nloc)%L_Plus , N_Inter_Ray(Nloc)%L_PlusMinus , & N_Inter_Ray(Nloc)%swGP , N_Inter_Ray(Nloc)%wGPSurf , & - N_Inter_Ray(Nloc)%Vdm_Leg , N_Inter_Ray(Nloc)%sVdm_Leg) + N_Inter_Ray(Nloc)%Vdm_Leg , N_Inter_Ray(Nloc)%sVdm_Leg, NodeType_in = Ray%NodeType) ! Build variables for nearest Gauss-point (NGP) method ALLOCATE(N_Inter_Ray(Nloc)%GaussBorder(1:Nloc)) @@ -490,9 +493,9 @@ SUBROUTINE BuildNInterAndVandermonde() END DO END DO ELSE IF(Nin.GT.Nout) THEN ! p-coarsening: Project from higher degree to lower degree - CALL GetVandermonde(Nin, NodeType, Nout, NodeType, PREF_VDM_Ray(Nin,Nout)%Vdm, modal=.TRUE. ) + CALL GetVandermonde(Nin, Ray%NodeType, Nout, Ray%NodeType, PREF_VDM_Ray(Nin,Nout)%Vdm, modal=.TRUE. ) ELSE ! p-refinement: Interpolate lower degree to higher degree - CALL GetVandermonde(Nin, NodeType, Nout, NodeType, PREF_VDM_Ray(Nin,Nout)%Vdm, modal=.FALSE.) + CALL GetVandermonde(Nin, Ray%NodeType, Nout, Ray%NodeType, PREF_VDM_Ray(Nin,Nout)%Vdm, modal=.FALSE.) END IF END DO;END DO diff --git a/src/radiation/ray_tracing/raytrace_vars.f90 b/src/radiation/ray_tracing/raytrace_vars.f90 index d90ac23c0..f3ac66b48 100644 --- a/src/radiation/ray_tracing/raytrace_vars.f90 +++ b/src/radiation/ray_tracing/raytrace_vars.f90 @@ -52,6 +52,8 @@ MODULE MOD_RayTracing_Vars REAL :: VolRefineModeZ !< z-coordinate for switching between NMin and NMax + CHARACTER(LEN=255) :: NodeType !< equidistant or Gauss nodes [-1,1] + END TYPE TYPE (tRayTrace) :: Ray !< From f6c3e3684a6989e86001f40f1ada37f306fc43c6 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Fri, 14 Jul 2023 16:10:50 +0200 Subject: [PATCH 115/495] Ray tracing: Further testing of different weighting methods --- src/particles/emission/particle_emission.f90 | 3 ++- .../tracking/radtrans_tracking_output.f90 | 4 ++-- .../tracking/radtrans_tracking_tools.f90 | 8 ++++---- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/particles/emission/particle_emission.f90 b/src/particles/emission/particle_emission.f90 index fbc65ee4f..784591563 100644 --- a/src/particles/emission/particle_emission.f90 +++ b/src/particles/emission/particle_emission.f90 @@ -230,9 +230,10 @@ SUBROUTINE ParticleInserting() ! Calculation of the number of photons depending on the cylinder height (ratio of actual to virtual cylinder height, which ! is spanned by the disk and the length given by c*dt) IF(TRIM(Species(i)%Init(iInit)%SpaceIC).EQ.'photon_rectangle')THEN + ! Rectangular area -> cuboid: Equally distributed over c*dt NbrOfPhotons = NbrOfPhotons * Species(i)%Init(iInit)%CuboidHeightIC / (c*dt) ELSE - ! Cylinder and honeycomb + ! Cylinder and honeycomb: Equally distributed over c*dt NbrOfPhotons = NbrOfPhotons * Species(i)%Init(iInit)%CylinderHeightIC / (c*dt) END IF ! Calculation of the number of electron resulting from the chemical reactions in the photoionization region diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 index 67aafec91..1b6e09a2b 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 @@ -173,8 +173,8 @@ SUBROUTINE WritePhotonVolSampleToHDF5() IntegrationWeight = N_Inter_Ray(Ray%NMax)%wGP(k)*& N_Inter_Ray(Ray%NMax)%wGP(l)*& N_Inter_Ray(Ray%NMax)%wGP(m)*J_Nmax(1,k,l,m) - U(1:2,k,l,m,iElem) = U(1:2,k,l,m,iElem) * IntegrationWeight - !U(1:2,k,l,m,iElem) = U(1:2,k,l,m,iElem) / IntegrationWeight + !U(1:2,k,l,m,iElem) = U(1:2,k,l,m,iElem) * IntegrationWeight + U(1:2,k,l,m,iElem) = U(1:2,k,l,m,iElem) / IntegrationWeight !U(1:2,k,l,m,iElem) = U(1:2,k,l,m,iElem) * J_Nmax(1,k,l,m) !U(1:2,k,l,m,iElem) = U(1:2,k,l,m,iElem) / J_Nmax(1,k,l,m) END DO ! k diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 index c9d92d3db..f237aa19b 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 @@ -684,9 +684,9 @@ SUBROUTINE CalcAbsorptionRayTrace(IntersectionPos,GlobalElemID,PhotonDir) END IF ! Loop over number of sub-samples -NbrOfSamples = Nloc+1 ! must be at least 2! -!scaleFac = 1./REAL(NbrOfSamples) -scaleFac = 1. +NbrOfSamples = 10 ! Nloc+1 ! must be at least 2! +scaleFac = 1./REAL(NbrOfSamples) +!scaleFac = 1. arr = .FALSE. DO iIntersec = 1, NbrOfSamples @@ -735,7 +735,7 @@ SUBROUTINE CalcAbsorptionRayTrace(IntersectionPos,GlobalElemID,PhotonDir) ELSE U_N_Ray(GlobalElemID)%U(2,k,l,m) = U_N_Ray(GlobalElemID)%U(2,k,l,m) + PhotonProps%PhotonEnergy * scaleFac * weight END IF - arr(k,l,m)=.TRUE. + !arr(k,l,m)=.TRUE. END IF ! .NOT.arr(k,l,m) END DO ! iIntersec = 1, Nloc+3 END SUBROUTINE CalcAbsorptionRayTrace From 1caabbb617eabad362eed057f6f568cbad0d2ad7 Mon Sep 17 00:00:00 2001 From: Franziska Hild Date: Mon, 17 Jul 2023 15:01:39 +0200 Subject: [PATCH 116/495] BGK collint thermalcond rot vib bug fix remove if --- src/particles/bgk/bgk_colloperator.f90 | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/particles/bgk/bgk_colloperator.f90 b/src/particles/bgk/bgk_colloperator.f90 index ace9e84a6..f35094dfd 100644 --- a/src/particles/bgk/bgk_colloperator.f90 +++ b/src/particles/bgk/bgk_colloperator.f90 @@ -1692,10 +1692,8 @@ SUBROUTINE CalcViscosityThermalCondColIntVHS(CellTemp, Xi, dens, Xi_RotSpec, Xi_ DiffCoef(iSpec,jSpec) = 3.*E_12/(2.*(Species(iSpec)%MassIC+Species(jSpec)%MassIC)*dens) DiffCoef(jSpec,iSpec) = DiffCoef(iSpec,jSpec) END IF - IF ((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN - Xj_Dij(iSpec,jSpec) = Xi(jSpec)/DiffCoef(iSpec,jSpec) - Xj_Dij(jSpec,iSpec) = Xj_Dij(iSpec,jSpec) - END IF + Xj_Dij(iSpec,jSpec) = Xi(jSpec)/DiffCoef(iSpec,jSpec) + Xj_Dij(jSpec,iSpec) = Xj_Dij(iSpec,jSpec) END DO IF ((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN ! Calculation of thermal conductivity of rotation and vibration for each molecular species From 75c2d0907dee5d5436d0ca2342fd372ceeb67305 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Tue, 18 Jul 2023 01:00:09 +0200 Subject: [PATCH 117/495] Fixed high-order volume ray tracing. Consider the length that a ray travels through an element and subsequently the part of the path within each sub-volume. --- .../tracking/radtrans_tracking_output.f90 | 14 ++-- .../tracking/radtrans_tracking_tools.f90 | 70 ++++++++++++++++--- 2 files changed, 66 insertions(+), 18 deletions(-) diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 index 1b6e09a2b..e5f399496 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 @@ -56,6 +56,8 @@ SUBROUTINE WritePhotonVolSampleToHDF5() USE MOD_ChangeBasis ,ONLY: ChangeBasis3D USE MOD_Interpolation_Vars ,ONLY: NodeType USE MOD_Interpolation ,ONLY: GetVandermonde +USE MOD_Mesh_Tools ,ONLY: GetCNElemID +USE MOD_Particle_Mesh_Vars ,ONLY: ElemVolume_Shared ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -66,7 +68,7 @@ SUBROUTINE WritePhotonVolSampleToHDF5() ! LOCAL VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- CHARACTER(LEN=255) :: FileName -INTEGER :: iElem,iGlobalElem,Nloc,k,l,m +INTEGER :: iElem,iGlobalElem,iCNElem,Nloc,k,l,m CHARACTER(LEN=255), ALLOCATABLE :: StrVarNames(:) REAL :: U(nVarRay,0:Ray%NMax,0:Ray%NMax,0:Ray%NMax,PP_nElems) #if USE_MPI @@ -124,12 +126,13 @@ SUBROUTINE WritePhotonVolSampleToHDF5() #endif /*USE_MPI*/ DO iElem=1,PP_nElems iGlobalElem = iElem+offSetElem + iCNElem = GetCNElemID(iGlobalElem) ! 1. Elem-constant data ! Primary energy - RayElemPassedEnergyLoc1st(iElem) = RayElemPassedEnergy(1,iGlobalElem) + RayElemPassedEnergyLoc1st(iElem) = RayElemPassedEnergy(1,iGlobalElem) !/ ElemVolume_Shared(iCNElem) ! Secondary energy - RayElemPassedEnergyLoc2nd(iElem) = RayElemPassedEnergy(2,iGlobalElem) + RayElemPassedEnergyLoc2nd(iElem) = RayElemPassedEnergy(2,iGlobalElem) !/ ElemVolume_Shared(iCNElem) ! Check if secondary energy is greater than zero IF(RayElemPassedEnergyLoc2nd(iElem).GT.0.0)THEN IF(RayElemPassedEnergy(6,iGlobalElem).LE.0.0) CALL abort(__STAMP__,'Secondary ray counter is zero but energy is not!') @@ -173,10 +176,7 @@ SUBROUTINE WritePhotonVolSampleToHDF5() IntegrationWeight = N_Inter_Ray(Ray%NMax)%wGP(k)*& N_Inter_Ray(Ray%NMax)%wGP(l)*& N_Inter_Ray(Ray%NMax)%wGP(m)*J_Nmax(1,k,l,m) - !U(1:2,k,l,m,iElem) = U(1:2,k,l,m,iElem) * IntegrationWeight - U(1:2,k,l,m,iElem) = U(1:2,k,l,m,iElem) / IntegrationWeight - !U(1:2,k,l,m,iElem) = U(1:2,k,l,m,iElem) * J_Nmax(1,k,l,m) - !U(1:2,k,l,m,iElem) = U(1:2,k,l,m,iElem) / J_Nmax(1,k,l,m) + !U(1:2,k,l,m,iElem) = U(1:2,k,l,m,iElem) / IntegrationWeight END DO ! k END DO ! l END DO ! m diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 index f237aa19b..cdbfdb090 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 @@ -660,18 +660,30 @@ SUBROUTINE CalcAbsorptionRayTrace(IntersectionPos,GlobalElemID,PhotonDir) REAL, INTENT(IN) :: PhotonDir(3) REAL, INTENT(IN) :: IntersectionPos(3) ! Local variable declaration -INTEGER :: a,b,ii,k,l,m,Nloc,NbrOfSamples,iIntersec +INTEGER :: a,b,ii,k,l,m,Nloc,NbrOfSamples,iIntersec,idx +INTEGER :: kOld,lOld,mOld REAL :: IntersectionPosRef(3),scaleFac,SamplePos(3),weight +REAL :: direction(3),subdirection(3),length,sublength LOGICAL :: arr(0:Ray%NMax,0:Ray%NMax,0:Ray%NMax) +REAL :: realcounter !--------------------------------------------------------------------------------------------------! +! Calculate the direction and length of the path of the ray through the element +direction(1:3) = IntersectionPos(1:3)-PhotonProps%PhotonStartPos(1:3) +length = VECNORM(direction(1:3)) + +! Check primary or secondary direction + ! Check primary or secondary direction IF(DOT_PRODUCT(PhotonDir,Ray%Direction).GT.0.0)THEN - RayElemPassedEnergy(1,GlobalElemID) = RayElemPassedEnergy(1,GlobalElemID) + PhotonProps%PhotonEnergy + ! 1st energy direction + idx = 1 ELSE - RayElemPassedEnergy(2,GlobalElemID) = RayElemPassedEnergy(2,GlobalElemID) + PhotonProps%PhotonEnergy + ! 2nd energy direction + idx = 2 RayElemPassedEnergy(3:5,GlobalElemID) = RayElemPassedEnergy(3:5,GlobalElemID) + PhotonDir(1:3) RayElemPassedEnergy(6,GlobalElemID) = RayElemPassedEnergy(6,GlobalElemID) + 1.0 END IF +RayElemPassedEnergy(idx,GlobalElemID) = RayElemPassedEnergy(idx,GlobalElemID) + PhotonProps%PhotonEnergy * length ! High-order sampling: Use nearest Gauss point (NGP) from PIC deposition Nloc = N_DG_Ray(GlobalElemID) @@ -684,13 +696,18 @@ SUBROUTINE CalcAbsorptionRayTrace(IntersectionPos,GlobalElemID,PhotonDir) END IF ! Loop over number of sub-samples -NbrOfSamples = 10 ! Nloc+1 ! must be at least 2! +NbrOfSamples = 10 ! Nloc+1 ! must be at least 3 for this sampling method (one point between the two intersections of the element)! scaleFac = 1./REAL(NbrOfSamples) +subdirection(1:3) = direction(1:3)/REAL(NbrOfSamples-1) +sublength = VECNORM(subdirection(1:3)) !scaleFac = 1. arr = .FALSE. +! Set initial starting position (is moved when the sub-element is switched) +!StartPos(1:3) = PhotonProps%PhotonStartPos(1:3) +realcounter = 0.0 DO iIntersec = 1, NbrOfSamples - SamplePos = PhotonProps%PhotonStartPos(1:3) + (IntersectionPos(1:3)-PhotonProps%PhotonStartPos(1:3))*REAL(iIntersec-1)/REAL(NbrOfSamples-1) + SamplePos = PhotonProps%PhotonStartPos(1:3) + direction(1:3)*REAL(iIntersec-1)/REAL(NbrOfSamples-1) ! Get position in reference element CALL GetPositionInRefElem(SamplePos(1:3),IntersectionPosRef(1:3),GlobalElemID) @@ -729,14 +746,45 @@ SUBROUTINE CalcAbsorptionRayTrace(IntersectionPos,GlobalElemID,PhotonDir) !(l.eq.0.or.l.eq.Nloc).OR.& !(m.eq.0.or.m.eq.Nloc)) weight = weight * 0.5 !weight = N_Inter_Ray(Nloc)%wGP(k)*N_Inter_Ray(Nloc)%wGP(l)*N_Inter_Ray(Nloc)%wGP(m) - IF(.NOT.arr(k,l,m))THEN - IF(DOT_PRODUCT(PhotonDir,Ray%Direction).GT.0.0)THEN - U_N_Ray(GlobalElemID)%U(1,k,l,m) = U_N_Ray(GlobalElemID)%U(1,k,l,m) + PhotonProps%PhotonEnergy * scaleFac * weight + !U_N_Ray(GlobalElemID)%U(idx,k,l,m) = U_N_Ray(GlobalElemID)%U(idx,k,l,m) + PhotonProps%PhotonEnergy * scaleFac * length + + ! Switch sub-element + IF((iIntersec.GT.1).AND.(.NOT.arr(k,l,m)))THEN + ! Set old sub-element false + arr(kOld,lOld,mOld) = .FALSE. + + ! half step back + U_N_Ray(GlobalElemID)%U(idx,kOld,lOld,mOld) = U_N_Ray(GlobalElemID)%U(idx,kOld,lOld,mOld) & + + (realcounter - 0.5) * sublength * PhotonProps%PhotonEnergy + ! Check if last intersection is reached + IF(iIntersec.EQ.NbrOfSamples)THEN + ! Set counter to half step as the loop ends here + realcounter = 0.5 + U_N_Ray(GlobalElemID)%U(idx,k,l,m) = U_N_Ray(GlobalElemID)%U(idx,k,l,m) & + + realcounter * sublength * PhotonProps%PhotonEnergy + ! Exist loop and subroutine here + RETURN ELSE - U_N_Ray(GlobalElemID)%U(2,k,l,m) = U_N_Ray(GlobalElemID)%U(2,k,l,m) + PhotonProps%PhotonEnergy * scaleFac * weight - END IF - !arr(k,l,m)=.TRUE. + ! Initialize counter with half step and add 1, which gives 1.5 + realcounter = 1.5 + END IF ! iIntersec.EQ.NbrOfSamples + + ELSE + ! Check if last intersection is reached + IF(iIntersec.EQ.NbrOfSamples)THEN + U_N_Ray(GlobalElemID)%U(idx,k,l,m) = U_N_Ray(GlobalElemID)%U(idx,k,l,m) & + + realcounter * sublength * PhotonProps%PhotonEnergy + ! Exist loop and subroutine here + RETURN + END IF ! iIntersec.EQ.NbrOfSamples + ! 1st or still in old sub-element + realcounter = realcounter + 1.0 END IF ! .NOT.arr(k,l,m) + + arr(k,l,m)=.TRUE. + kOld = k + lOld = l + mOld = m END DO ! iIntersec = 1, Nloc+3 END SUBROUTINE CalcAbsorptionRayTrace From 25e8c66cf26fb8972c9a42747cd590be112c7787 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Wed, 19 Jul 2023 14:59:51 +0200 Subject: [PATCH 118/495] Introduced UseRayTracing=T/F for activating ray tracing tools and other flags that are required for the ray tracing model. --- src/init/piclas_init.f90 | 18 ++-------- src/particles/particle_init.f90 | 36 +++++++++++++++++-- src/particles/particle_mesh/particle_bgm.f90 | 1 - src/particles/particle_mesh/particle_mesh.f90 | 8 +++-- .../tracking/radtrans_tracking_output.f90 | 6 ++-- .../tracking/radtrans_tracking_tools.f90 | 2 +- src/radiation/ray_tracing/raytrace.f90 | 9 +++-- src/radiation/ray_tracing/raytrace_ini.f90 | 12 +++---- src/radiation/ray_tracing/raytrace_vars.f90 | 4 +-- 9 files changed, 59 insertions(+), 37 deletions(-) diff --git a/src/init/piclas_init.f90 b/src/init/piclas_init.f90 index dd045f3cf..079e7c7c8 100644 --- a/src/init/piclas_init.f90 +++ b/src/init/piclas_init.f90 @@ -43,7 +43,8 @@ SUBROUTINE DefineParametersPiclas() CALL prms%CreateIntOption( 'TimeStampLength' , 'Length of the floating number time stamp' , '21') #ifdef PARTICLES -CALL prms%CreateLogicalOption( 'UseDSMC' , "Flag for using DSMC in Calculation" , '.FALSE.') +CALL prms%CreateLogicalOption( 'UseDSMC' , "Flag for using DSMC methods" , '.FALSE.') +CALL prms%CreateLogicalOption( 'UseRayTracing' , "Flag for using ray tracing tools" , '.FALSE.') #endif END SUBROUTINE DefineParametersPiclas @@ -84,8 +85,6 @@ SUBROUTINE InitPiclas(IsLoadBalance) #endif /*USE_MPI*/ #ifdef PARTICLES USE MOD_DSMC_Vars ,ONLY: UseDSMC -USE MOD_Particle_Vars ,ONLY: UseVarTimeStep, VarTimeStep -USE MOD_Particle_TimeStep ,ONLY: InitPartTimeStep USE MOD_ParticleInit ,ONLY: InitParticleGlobals,InitParticles USE MOD_TTMInit ,ONLY: InitTTM,InitIMD_TTM_Coupling USE MOD_TTM_Vars ,ONLY: DoImportTTMFile @@ -93,7 +92,6 @@ SUBROUTINE InitPiclas(IsLoadBalance) USE MOD_SurfaceModel_Analyze ,ONLY: InitSurfModelAnalyze USE MOD_Particle_MPI ,ONLY: InitParticleMPI USE MOD_DSMC_Symmetry ,ONLY: Init_Symmetry -USE MOD_PICDepo_Method ,ONLY: InitDepositionMethod #if USE_MPI USE mod_readIMD ,ONLY: initReadIMDdata,read_IMD_results #endif /* USE_MPI */ @@ -157,17 +155,7 @@ SUBROUTINE InitPiclas(IsLoadBalance) END IF #ifdef PARTICLES -!--- Variable time step -VarTimeStep%UseLinearScaling = GETLOGICAL('Part-VariableTimeStep-LinearScaling') -VarTimeStep%UseDistribution = GETLOGICAL('Part-VariableTimeStep-Distribution') -IF (VarTimeStep%UseLinearScaling.OR.VarTimeStep%UseDistribution) THEN - UseVarTimeStep = .TRUE. - IF(.NOT.IsLoadBalance) CALL InitPartTimeStep() -ELSE - UseVarTimeStep = .FALSE. -END IF -CALL InitParticleGlobals() -CALL InitDepositionMethod() +CALL InitParticleGlobals(IsLoadBalance) #endif CALL InitMesh(2) diff --git a/src/particles/particle_init.f90 b/src/particles/particle_init.f90 index 6c3ebba83..2acdda1ac 100644 --- a/src/particles/particle_init.f90 +++ b/src/particles/particle_init.f90 @@ -209,7 +209,7 @@ END SUBROUTINE DefineParametersParticles !=================================================================================================================================== ! Global particle parameters needed for other particle inits !=================================================================================================================================== -SUBROUTINE InitParticleGlobals() +SUBROUTINE InitParticleGlobals(IsLoadBalance) ! MODULES USE MOD_Globals USE MOD_ReadInTools @@ -218,10 +218,16 @@ SUBROUTINE InitParticleGlobals() #if USE_LOADBALANCE USE MOD_LoadBalance_Vars ,ONLY: PerformLoadBalance #endif /*USE_LOADBALANCE*/ +USE MOD_PICDepo_Method ,ONLY: InitDepositionMethod +USE MOD_Particle_Vars ,ONLY: UseVarTimeStep, VarTimeStep +USE MOD_ReadInTools ,ONLY: GETLOGICAL +USE MOD_RayTracing_Vars ,ONLY: UseRayTracing +USE MOD_Particle_TimeStep ,ONLY: InitPartTimeStep ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES +LOGICAL,INTENT(IN) :: IsLoadBalance !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- @@ -230,7 +236,17 @@ SUBROUTINE InitParticleGlobals() LBWRITE(UNIT_stdOut,'(A)')' INIT PARTICLE GLOBALS...' -! Find tracking method immediately, a lot of the later variables depend on it +!--- Variable time step +VarTimeStep%UseLinearScaling = GETLOGICAL('Part-VariableTimeStep-LinearScaling') +VarTimeStep%UseDistribution = GETLOGICAL('Part-VariableTimeStep-Distribution') +IF (VarTimeStep%UseLinearScaling.OR.VarTimeStep%UseDistribution) THEN + UseVarTimeStep = .TRUE. + IF(.NOT.IsLoadBalance) CALL InitPartTimeStep() +ELSE + UseVarTimeStep = .FALSE. +END IF + +!--- Find tracking method immediately, a lot of the later variables depend on it TrackingMethod = GETINTFROMSTR('TrackingMethod') SELECT CASE(TrackingMethod) CASE(REFMAPPING,TRACING,TRIATRACKING) @@ -243,6 +259,12 @@ SUBROUTINE InitParticleGlobals() LBWRITE(UNIT_stdOut,'(A)') "TrackingMethod set to TriaTracking due to Symmetry2D." END IF +!--- Particle-in-cell deposition method +CALL InitDepositionMethod() + +!--- Ray Tracing +UseRayTracing = GETLOGICAL('UseRayTracing') + LBWRITE(UNIT_stdOut,'(A)')' INIT PARTICLE GLOBALS DONE' END SUBROUTINE InitParticleGlobals @@ -839,6 +861,7 @@ SUBROUTINE InitializeVariablesWriteMacroValues() #if USE_LOADBALANCE USE MOD_LoadBalance_Vars ,ONLY: PerformLoadBalance #endif /*USE_LOADBALANCE*/ +USE MOD_RayTracing_Vars ,ONLY: UseRayTracing ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -849,7 +872,14 @@ SUBROUTINE InitializeVariablesWriteMacroValues() ! LOCAL VARIABLES !=================================================================================================================================== ! Include surface values in the macroscopic output -DSMC%CalcSurfaceVal = GETLOGICAL('Particles-DSMC-CalcSurfaceVal') +IF(UseRayTracing)THEN + ! Automatically activate when UseRayTracing = T + DSMC%CalcSurfaceVal = .TRUE. + CALL PrintOption('Surface sampling activated (UseRayTracing=T): Particles-DSMC-CalcSurfaceVal','INFO',& + LogOpt=DSMC%CalcSurfaceVal) +ELSE + DSMC%CalcSurfaceVal = GETLOGICAL('Particles-DSMC-CalcSurfaceVal') +END IF ! UseRayTracing ! Include electronic energy excitation in the macroscopic output SampleElecExcitation = GETLOGICAL('Part-SampElectronicExcitation') ! Sampling for and output every given number of iterations (sample is reset after an output) diff --git a/src/particles/particle_mesh/particle_bgm.f90 b/src/particles/particle_mesh/particle_bgm.f90 index d021cbbdb..e62df53bf 100644 --- a/src/particles/particle_mesh/particle_bgm.f90 +++ b/src/particles/particle_mesh/particle_bgm.f90 @@ -195,7 +195,6 @@ SUBROUTINE BuildBGMAndIdentifyHaloRegion() CHARACTER(LEN=255) :: hilf ! Mortar INTEGER :: iMortar,NbElemID,NbSideID,nMortarElems!,nFoundSides,nlocSides,i -CHARACTER(LEN=255) :: hilf #else REAL :: halo_eps #endif /*USE_MPI*/ diff --git a/src/particles/particle_mesh/particle_mesh.f90 b/src/particles/particle_mesh/particle_mesh.f90 index 19c320d43..e020c03d7 100644 --- a/src/particles/particle_mesh/particle_mesh.f90 +++ b/src/particles/particle_mesh/particle_mesh.f90 @@ -197,6 +197,7 @@ SUBROUTINE InitParticleMesh() USE MOD_Particle_Boundary_Init ,ONLY: InitPartStateBoundary USE MOD_Particle_Boundary_Vars ,ONLY: DoBoundaryParticleOutputHDF5,nSurfSample USE MOD_Photon_TrackingVars ,ONLY: PhotonModeBPO +USE MOD_RayTracing_Vars ,ONLY: UseRayTracing !USE MOD_DSMC_Vars ,ONLY: DSMC ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -384,8 +385,8 @@ SUBROUTINE InitParticleMesh() ! Interpolation needs coordinates in reference system !IF (DoInterpolation.OR.DSMC%UseOctree) THEN ! use this in future if possible - IF (DoInterpolation.OR.DoDeposition) THEN - ! Do not call these functions twice + IF (DoInterpolation.OR.DoDeposition.OR.UseRayTracing) THEN + ! Do not call these functions twice. This is already done above IF(.NOT.nSurfSampleAndTriaTracking)THEN CALL CalcParticleMeshMetrics() ! Required for Elem_xGP_Shared and dXCL_NGeo_Shared CALL CalcXCL_NGeo() ! Required for XCL_NGeo_Shared @@ -541,6 +542,7 @@ SUBROUTINE FinalizeParticleMesh() ! MODULES USE MOD_Globals USE MOD_Particle_Mesh_Vars +USE MOD_RayTracing_Vars ,ONLY: UseRayTracing #if USE_MPI USE MOD_Particle_Surfaces_Vars ,ONLY: BezierElevation USE MOD_PICDepo_Vars ,ONLY: DepositionType @@ -744,7 +746,7 @@ SUBROUTINE FinalizeParticleMesh() END IF !IF (DoInterpolation.OR.DSMC%UseOctree) THEN ! use this in future if possible - IF (DoInterpolation.OR.DoDeposition) THEN + IF (DoInterpolation.OR.DoDeposition.OR.UseRayTracing) THEN #if USE_LOADBALANCE IF (.NOT.PerformLoadBalance) THEN #endif /*USE_LOADBALANCE*/ diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 index e5f399496..ad6981ea1 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 @@ -130,9 +130,9 @@ SUBROUTINE WritePhotonVolSampleToHDF5() ! 1. Elem-constant data ! Primary energy - RayElemPassedEnergyLoc1st(iElem) = RayElemPassedEnergy(1,iGlobalElem) !/ ElemVolume_Shared(iCNElem) + RayElemPassedEnergyLoc1st(iElem) = RayElemPassedEnergy(1,iGlobalElem) / ElemVolume_Shared(iCNElem) ! Secondary energy - RayElemPassedEnergyLoc2nd(iElem) = RayElemPassedEnergy(2,iGlobalElem) !/ ElemVolume_Shared(iCNElem) + RayElemPassedEnergyLoc2nd(iElem) = RayElemPassedEnergy(2,iGlobalElem) / ElemVolume_Shared(iCNElem) ! Check if secondary energy is greater than zero IF(RayElemPassedEnergyLoc2nd(iElem).GT.0.0)THEN IF(RayElemPassedEnergy(6,iGlobalElem).LE.0.0) CALL abort(__STAMP__,'Secondary ray counter is zero but energy is not!') @@ -176,7 +176,7 @@ SUBROUTINE WritePhotonVolSampleToHDF5() IntegrationWeight = N_Inter_Ray(Ray%NMax)%wGP(k)*& N_Inter_Ray(Ray%NMax)%wGP(l)*& N_Inter_Ray(Ray%NMax)%wGP(m)*J_Nmax(1,k,l,m) - !U(1:2,k,l,m,iElem) = U(1:2,k,l,m,iElem) / IntegrationWeight + U(1:2,k,l,m,iElem) = U(1:2,k,l,m,iElem) / IntegrationWeight END DO ! k END DO ! l END DO ! m diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 index cdbfdb090..ea87eaafb 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 @@ -696,7 +696,7 @@ SUBROUTINE CalcAbsorptionRayTrace(IntersectionPos,GlobalElemID,PhotonDir) END IF ! Loop over number of sub-samples -NbrOfSamples = 10 ! Nloc+1 ! must be at least 3 for this sampling method (one point between the two intersections of the element)! +NbrOfSamples = 20 ! Nloc+1 ! must be at least 3 for this sampling method (one point between the two intersections of the element)! scaleFac = 1./REAL(NbrOfSamples) subdirection(1:3) = direction(1:3)/REAL(NbrOfSamples-1) sublength = VECNORM(subdirection(1:3)) diff --git a/src/radiation/ray_tracing/raytrace.f90 b/src/radiation/ray_tracing/raytrace.f90 index c4472532e..fe86f56bf 100644 --- a/src/radiation/ray_tracing/raytrace.f90 +++ b/src/radiation/ray_tracing/raytrace.f90 @@ -63,6 +63,8 @@ SUBROUTINE RayTracing() #endif /*USE_MPI*/ USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall,PhotonModeBPO USE MOD_Mesh_Vars ,ONLY: nGlobalElems +USE MOD_RayTracing_Vars ,ONLY: UseRayTracing +USE MOD_DSMC_Vars ,ONLY: DSMC ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -79,7 +81,8 @@ SUBROUTINE RayTracing() REAL :: StartT,EndT ! Timer !=================================================================================================================================== -IF(RayPartBound.EQ.0) RETURN +IF(.NOT.UseRayTracing) RETURN + GETTIME(StartT) SWRITE(UNIT_stdOut,'(A)') ' Start Ray Tracing Calculation ...' @@ -157,7 +160,9 @@ SUBROUTINE RayTracing() IPWRITE(UNIT_StdOut,*) ": nComputeNodeSurfTotalSides =", nComputeNodeSurfTotalSides IPWRITE(UNIT_StdOut,*) ": RayPartBound =", RayPartBound !IPWRITE(UNIT_StdOut,'(I0,A,I0,A)') ": Set Part-Boundary",RayPartBound,"-BoundaryParticleOutput = T" - IPWRITE(UNIT_StdOut,*) ": Set Particles-DSMC-CalcSurfaceVal = T" + IF(.NOT.DSMC%CalcSurfaceVal)THEN + IPWRITE(UNIT_StdOut,*) ": Set Particles-DSMC-CalcSurfaceVal = T to build the mappings for SurfSide2GlobalSide(:,:)!" + END IF ! .NOT.DSMC%CalcSurfaceVal CALL abort(__STAMP__,'No boundary found in list of nComputeNodeSurfTotalSides for defined RayPartBound!') END IF ! FoundComputeNodeSurfSide diff --git a/src/radiation/ray_tracing/raytrace_ini.f90 b/src/radiation/ray_tracing/raytrace_ini.f90 index 7ddf4c6f3..d91597917 100644 --- a/src/radiation/ray_tracing/raytrace_ini.f90 +++ b/src/radiation/ray_tracing/raytrace_ini.f90 @@ -36,9 +36,8 @@ SUBROUTINE DefineParametersRayTracing() !================================================================================================================================== CALL prms%SetSection("Ray Tracing") -CALL prms%CreateLogicalOption( 'RayTracing-AdaptiveRays' , 'TODO' , '.FALSE.') -CALL prms%CreateIntOption( 'RayTracing-NumRays' , 'TODO' , '1') -CALL prms%CreateIntOption( 'RayTracing-RayPosModel' , 'TODO' , '1') +!CALL prms%CreateLogicalOption( 'RayTracing-AdaptiveRays' , 'TODO' , '.FALSE.') +CALL prms%CreateIntOption( 'RayTracing-NumRays' , 'Number of emitted rays from particle boundary with index [RayTracing-PartBound]' , '1') CALL prms%CreateRealArrayOption( 'RayTracing-RayDirection' , 'Direction vector for ray emission. Will be normalized after read-in.' , no=3) CALL prms%CreateIntOption( 'RayTracing-PartBound' , 'Particle boundary ID where rays are emitted from' , '0') CALL prms%CreateRealOption( 'RayTracing-PulseDuration' , 'Pulse duration tau for a Gaussian-type pulse with I~exp(-(t/tau)^2) [s]' ) @@ -87,6 +86,7 @@ SUBROUTINE InitRayTracing() REAL :: factor,SurfaceNormal(3),alpha CHARACTER(LEN=3) :: hilf ! auxiliary variable for INTEGER -> CHARACTER conversion !=================================================================================================================================== +IF(.NOT.UseRayTracing) RETURN SWRITE(UNIT_StdOut,'(132("-"))') SWRITE(UNIT_stdOut,'(A)') ' INIT RAY TRACING SOLVER ...' @@ -94,9 +94,9 @@ SUBROUTINE InitRayTracing() RadiationAbsorptionModel = 0 RadObservationPointMethod = 0 +! Get index of particle boundary from which rays are emitted RayPartBound = GETINT('RayTracing-PartBound') -IF(RayPartBound.EQ.0) RETURN -IF(RayPartBound.LT.0) CALL CollectiveStop(__STAMP__,'RayTracing-PartBound must be > 0 to activate ray tracing on this boundary!') +IF(RayPartBound.LE.0) CALL CollectiveStop(__STAMP__,'RayTracing-PartBound must be > 0 to activate ray tracing on this boundary!') ! Get ray parameters Ray%PulseDuration = GETREAL('RayTracing-PulseDuration') @@ -110,9 +110,7 @@ SUBROUTINE InitRayTracing() Ray%Direction = GETREALARRAY('RayTracing-RayDirection',3) Ray%Direction = UNITVECTOR(Ray%Direction) -AdaptiveRays = GETLOGICAL('RayTracing-AdaptiveRays') NumRays = GETINT('RayTracing-NumRays') -RayPosModel = GETINT('RayTracing-RayPosModel') RayForceAbsorption = GETLOGICAL('RayTracing-ForceAbsorption') Ray%VolRefineMode = GETINT('RayTracing-VolRefineMode') diff --git a/src/radiation/ray_tracing/raytrace_vars.f90 b/src/radiation/ray_tracing/raytrace_vars.f90 index f3ac66b48..afcc49f80 100644 --- a/src/radiation/ray_tracing/raytrace_vars.f90 +++ b/src/radiation/ray_tracing/raytrace_vars.f90 @@ -24,6 +24,8 @@ MODULE MOD_RayTracing_Vars !----------------------------------------------------------------------------------------------------------------------------------- ! GLOBAL RAY TRACING VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- +LOGICAL :: UseRayTracing ! Activate ray tracing tools + TYPE tRayTrace REAL :: PulseDuration !< REAL :: tShift !< @@ -67,10 +69,8 @@ MODULE MOD_RayTracing_Vars TYPE (tRadTrans) :: RadTrans !< -LOGICAL :: AdaptiveRays !< LOGICAL :: RayForceAbsorption !< Surface photon sampling is performed independent of the actual absorption/reflection outcome (default=T) INTEGER :: NumRays !< -INTEGER :: RayPosModel !< INTEGER :: RayPartBound !< Particle boundary ID where rays are emitted from ! Output of low-order info From aa250e3cd1afed5fc73b647f35422d62500cdbe0 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Wed, 19 Jul 2023 15:34:02 +0200 Subject: [PATCH 119/495] Also output the element volume and the sub-volumes associated with each volume dof for subsequent calculation of the photon density in a post-processing step for visualisation. --- .../emission/particle_photoionization.f90 | 2 +- .../tracking/radtrans_tracking_output.f90 | 16 ++++++++++++---- src/radiation/ray_tracing/raytrace_ini.f90 | 5 +++-- src/radiation/ray_tracing/raytrace_vars.f90 | 3 ++- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/particles/emission/particle_photoionization.f90 b/src/particles/emission/particle_photoionization.f90 index d713763bf..bd73729bb 100644 --- a/src/particles/emission/particle_photoionization.f90 +++ b/src/particles/emission/particle_photoionization.f90 @@ -53,7 +53,7 @@ SUBROUTINE PhotoIonization_RayTracing_SEE() USE MOD_Timedisc_Vars ,ONLY: iStage, RK_c, nRKStages #endif #if USE_MPI -USE MOD_Particle_Boundary_Vars ,ONLY: SurfSideArea_Shared,nComputeNodeSurfTotalSides +USE MOD_Particle_Boundary_Vars ,ONLY: nComputeNodeSurfTotalSides USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall_Shared USE MOD_MPI_Shared_Vars ,ONLY: nComputeNodeProcessors,myComputeNodeRank #else diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 index ad6981ea1..287141416 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 @@ -42,7 +42,7 @@ SUBROUTINE WritePhotonVolSampleToHDF5() USE MOD_Globals_Vars ,ONLY: ProjectName USE MOD_RayTracing_Vars ,ONLY: Ray,nVarRay,U_N_Ray,N_DG_Ray,PREF_VDM_Ray,N_DG_Ray_loc,N_Inter_Ray USE MOD_RayTracing_Vars ,ONLY: RayElemPassedEnergyLoc1st,RayElemPassedEnergyLoc2nd -USE MOD_RayTracing_Vars ,ONLY: RaySecondaryVectorX,RaySecondaryVectorY,RaySecondaryVectorZ +USE MOD_RayTracing_Vars ,ONLY: RaySecondaryVectorX,RaySecondaryVectorY,RaySecondaryVectorZ,ElemVolume USE MOD_HDF5_output ,ONLY: GatheredWriteArray #if USE_MPI USE MOD_RayTracing_Vars ,ONLY: RayElemPassedEnergy_Shared,RayElemOffset,RayElemPassedEnergyHO_Shared @@ -86,16 +86,19 @@ SUBROUTINE WritePhotonVolSampleToHDF5() ALLOCATE(RaySecondaryVectorX(1:nElems)) ALLOCATE(RaySecondaryVectorY(1:nElems)) ALLOCATE(RaySecondaryVectorZ(1:nElems)) +ALLOCATE(ElemVolume(1:nElems)) RayElemPassedEnergyLoc1st=-1.0 RayElemPassedEnergyLoc2nd=-1.0 RaySecondaryVectorX=-1.0 RaySecondaryVectorY=-1.0 RaySecondaryVectorZ=-1.0 +ElemVolume=-1.0 CALL AddToElemData(ElementOut,'RayElemPassedEnergy1st',RealArray=RayElemPassedEnergyLoc1st) CALL AddToElemData(ElementOut,'RayElemPassedEnergy2nd',RealArray=RayElemPassedEnergyLoc2nd) CALL AddToElemData(ElementOut,'RaySecondaryVectorX' ,RealArray=RaySecondaryVectorX) CALL AddToElemData(ElementOut,'RaySecondaryVectorY' ,RealArray=RaySecondaryVectorY) CALL AddToElemData(ElementOut,'RaySecondaryVectorZ' ,RealArray=RaySecondaryVectorZ) +CALL AddToElemData(ElementOut,'ElemVolume' ,RealArray=ElemVolume) ! Copy data from shared array ALLOCATE(N_DG_Ray_loc(1:nElems)) @@ -107,6 +110,7 @@ SUBROUTINE WritePhotonVolSampleToHDF5() ALLOCATE(StrVarNames(1:nVarRay)) StrVarNames(1)='RayElemPassedEnergy1st' StrVarNames(2)='RayElemPassedEnergy2nd' +StrVarNames(3)='ElemVolume' ! Generate skeleton for the file with all relevant data on a single proc (MPIRoot) FileName=TRIM(ProjectName)//'_RadiationVolState.h5' @@ -130,9 +134,9 @@ SUBROUTINE WritePhotonVolSampleToHDF5() ! 1. Elem-constant data ! Primary energy - RayElemPassedEnergyLoc1st(iElem) = RayElemPassedEnergy(1,iGlobalElem) / ElemVolume_Shared(iCNElem) + RayElemPassedEnergyLoc1st(iElem) = RayElemPassedEnergy(1,iGlobalElem) !/ ElemVolume_Shared(iCNElem) ! Secondary energy - RayElemPassedEnergyLoc2nd(iElem) = RayElemPassedEnergy(2,iGlobalElem) / ElemVolume_Shared(iCNElem) + RayElemPassedEnergyLoc2nd(iElem) = RayElemPassedEnergy(2,iGlobalElem) !/ ElemVolume_Shared(iCNElem) ! Check if secondary energy is greater than zero IF(RayElemPassedEnergyLoc2nd(iElem).GT.0.0)THEN IF(RayElemPassedEnergy(6,iGlobalElem).LE.0.0) CALL abort(__STAMP__,'Secondary ray counter is zero but energy is not!') @@ -146,6 +150,9 @@ SUBROUTINE WritePhotonVolSampleToHDF5() RaySecondaryVectorZ(iElem) = 0. END IF ! RayElemPassedEnergyLoc2nd(iElem).GT.0 + ! Store element volume for later calculation of photon energy density + ElemVolume(iElem) = ElemVolume_Shared(iCNElem) + ! 2. Variable polynomial degree data Nloc = N_DG_Ray(iElem) !U_N_Ray(iElem)%U(1:1,:,:,:) = RayElemPassedEnergy(1,iGlobalElem) @@ -176,7 +183,8 @@ SUBROUTINE WritePhotonVolSampleToHDF5() IntegrationWeight = N_Inter_Ray(Ray%NMax)%wGP(k)*& N_Inter_Ray(Ray%NMax)%wGP(l)*& N_Inter_Ray(Ray%NMax)%wGP(m)*J_Nmax(1,k,l,m) - U(1:2,k,l,m,iElem) = U(1:2,k,l,m,iElem) / IntegrationWeight + !U(1:2,k,l,m,iElem) = U(1:2,k,l,m,iElem) / IntegrationWeight + U(3,k,l,m,iElem) = IntegrationWeight END DO ! k END DO ! l END DO ! m diff --git a/src/radiation/ray_tracing/raytrace_ini.f90 b/src/radiation/ray_tracing/raytrace_ini.f90 index d91597917..038b6a0a8 100644 --- a/src/radiation/ray_tracing/raytrace_ini.f90 +++ b/src/radiation/ray_tracing/raytrace_ini.f90 @@ -183,7 +183,7 @@ END SUBROUTINE InitRayTracing SUBROUTINE InitHighOrderRaySampling() ! MODULES USE MOD_PreProc -USE MOD_Globals ,ONLY: abort,IERROR,myrank,UNIT_StdOut +USE MOD_Globals ,ONLY: abort,IERROR,UNIT_StdOut USE MOD_Mesh_Vars ,ONLY: nGlobalElems USE MOD_RayTracing_Vars ,ONLY: N_VolMesh_Ray,N_DG_Ray,Ray,N_Inter_Ray,PREF_VDM_Ray,U_N_Ray,nVarRay USE MOD_Mesh_Tools ,ONLY: GetCNElemID,GetGlobalElemID @@ -507,7 +507,7 @@ SUBROUTINE FinalizeRayTracing() ! MODULES USE MOD_Globals USE MOD_RayTracing_Vars -USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall +!USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall #if USE_MPI USE MOD_MPI_Shared_Vars ,ONLY: MPI_COMM_SHARED USE MOD_MPI_Shared @@ -533,6 +533,7 @@ SUBROUTINE FinalizeRayTracing() !SDEALLOCATE(RaySecondaryVectorX) !SDEALLOCATE(RaySecondaryVectorY) !SDEALLOCATE(RaySecondaryVectorZ) +!SDEALLOCATE(ElemVolume) IF(nProcessors.GT.1)THEN #if USE_MPI SDEALLOCATE(RayElemOffset) diff --git a/src/radiation/ray_tracing/raytrace_vars.f90 b/src/radiation/ray_tracing/raytrace_vars.f90 index afcc49f80..24558dba2 100644 --- a/src/radiation/ray_tracing/raytrace_vars.f90 +++ b/src/radiation/ray_tracing/raytrace_vars.f90 @@ -88,9 +88,10 @@ MODULE MOD_RayTracing_Vars REAL, ALLOCATABLE :: RaySecondaryVectorX(:) REAL, ALLOCATABLE :: RaySecondaryVectorY(:) REAL, ALLOCATABLE :: RaySecondaryVectorZ(:) +REAL,ALLOCATABLE :: ElemVolume(:) ! Output of high-order p-adaptive info -INTEGER,PARAMETER :: nVarRay=2 !< Number of variables for higher-order sampling for volume ray tracing +INTEGER,PARAMETER :: nVarRay=3 !< Number of variables for higher-order sampling for volume ray tracing INTEGER,ALLOCATABLE :: N_DG_Ray_loc(:) !< for output to ElemData INTEGER,ALLOCPOINT :: N_DG_Ray(:) !< polynomial degree inside DG element for higher-order sampling for volume ray tracing, size(nElems) From 4add7b6f757a2105a1672cef350091e090dd2ab4 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Wed, 19 Jul 2023 16:09:51 +0200 Subject: [PATCH 120/495] Removed BuildFacexGPAndKeepNodeCoods flag and set meshMode=-2 for piclas2vtk --- src/mesh/mesh.f90 | 14 ++++++-------- src/posti/piclas2vtk/piclas2vtk.f90 | 2 +- src/radiation/ray_tracing/raytrace_ini.f90 | 2 +- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/mesh/mesh.f90 b/src/mesh/mesh.f90 index d3928ccf6..a07bdad6a 100644 --- a/src/mesh/mesh.f90 +++ b/src/mesh/mesh.f90 @@ -127,7 +127,8 @@ SUBROUTINE InitMesh(meshMode,MeshFile_IN) !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT/OUTPUT VARIABLES INTEGER,INTENT(IN) :: meshMode !< 0: only read and build Elem_xGP, - !< -1: as 0 + build connectivity and always set ReadNodes=T: read node info (automatically read for PARTICLES=ON) and set BuildFacexGPAndKeepNodeCoods=T + !< -2: as 0 + build connectivity and always set ReadNodes=T: read node info (automatically read for PARTICLES=ON) + build FacexGP and keep NodeCoords + !< -1: as 0 + build connectivity and always set ReadNodes=T: read node info (automatically read for PARTICLES=ON) !< 1: as 0 + build connectivity !< 2: as 1 + calc metrics !< 3: as 2 but skip InitParticleMesh @@ -140,7 +141,7 @@ SUBROUTINE InitMesh(meshMode,MeshFile_IN) INTEGER :: iElem,i,j,k,nElemsLoc !CHARACTER(32) :: hilf2 CHARACTER(LEN=255) :: FileName -LOGICAL :: validMesh,ExistFile,ReadNodes,BuildFacexGPAndKeepNodeCoods +LOGICAL :: validMesh,ExistFile,ReadNodes !=================================================================================================================================== IF ((.NOT.InterpolationInitIsDone).OR.MeshInitIsDone) THEN CALL abort(__STAMP__,'InitMesh not ready to be called or already called.') @@ -154,9 +155,6 @@ SUBROUTINE InitMesh(meshMode,MeshFile_IN) IF(meshMode.LT.0) ReadNodes =.TRUE. #endif /*defined(PARTICLES)*/ -BuildFacexGPAndKeepNodeCoods = .FALSE. ! default -IF(meshMode.LT.0) BuildFacexGPAndKeepNodeCoods =.TRUE. - ! Output of myrank, ElemID and tracking info CalcMeshInfo = GETLOGICAL('CalcMeshInfo') @@ -307,7 +305,7 @@ SUBROUTINE InitMesh(meshMode,MeshFile_IN) END IF ! meshMode.GT.0 -IF ((ABS(meshMode).GT.1).OR.BuildFacexGPAndKeepNodeCoods) THEN +IF ((ABS(meshMode).GT.1)) THEN ! ----- CONNECTIVITY IS NOW COMPLETE AT THIS POINT ----- @@ -375,12 +373,12 @@ SUBROUTINE InitMesh(meshMode,MeshFile_IN) CALL InitElemVolumes() #ifndef PARTICLES - IF(.NOT.BuildFacexGPAndKeepNodeCoods) DEALLOCATE(NodeCoords) + IF(meshMode.GT.1) DEALLOCATE(NodeCoords) #endif DEALLOCATE(dXCL_N) DEALLOCATE(Ja_Face) - IF((ABS(meshMode).NE.3).AND.(.NOT.BuildFacexGPAndKeepNodeCoods))THEN + IF((ABS(meshMode).NE.3).AND.(meshMode.GT.1))THEN #ifdef PARTICLES IF(RadialWeighting%DoRadialWeighting) THEN usevMPF = .TRUE. diff --git a/src/posti/piclas2vtk/piclas2vtk.f90 b/src/posti/piclas2vtk/piclas2vtk.f90 index b09c64f41..9a17c51ce 100644 --- a/src/posti/piclas2vtk/piclas2vtk.f90 +++ b/src/posti/piclas2vtk/piclas2vtk.f90 @@ -268,7 +268,7 @@ PROGRAM piclas2vtk ! Read-in of the mesh IF(.NOT.ReadMeshFinished) THEN - CALL InitMesh(-1,MeshFile_IN=MeshFile) + CALL InitMesh(-2,MeshFile_IN=MeshFile) CALL InitGetGlobalElemID() CALL InitGetCNElemID() #if USE_MPI diff --git a/src/radiation/ray_tracing/raytrace_ini.f90 b/src/radiation/ray_tracing/raytrace_ini.f90 index 038b6a0a8..6ae10173c 100644 --- a/src/radiation/ray_tracing/raytrace_ini.f90 +++ b/src/radiation/ray_tracing/raytrace_ini.f90 @@ -212,7 +212,7 @@ SUBROUTINE InitHighOrderRaySampling() INTEGER :: Nloc,iCNElem,firstElem,lastElem,iGlobalElem REAL :: VolMin,VolMax,m,NReal #if defined(CODE_ANALYZE) -INTEGER :: iElem +INTEGER :: iElem,CNElemID LOGICAL,PARAMETER :: debugRay=.FALSE. #endif /*defined(CODE_ANALYZE)*/ LOGICAL :: FoundElem From b28a79860a7d2e90330523a9d048630db6046b36 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Wed, 19 Jul 2023 17:11:49 +0200 Subject: [PATCH 121/495] Only finalize ray tracing when UseRayTracing=T --- src/radiation/ray_tracing/raytrace_ini.f90 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/radiation/ray_tracing/raytrace_ini.f90 b/src/radiation/ray_tracing/raytrace_ini.f90 index 6ae10173c..9f36eb9a9 100644 --- a/src/radiation/ray_tracing/raytrace_ini.f90 +++ b/src/radiation/ray_tracing/raytrace_ini.f90 @@ -518,6 +518,9 @@ SUBROUTINE FinalizeRayTracing() !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES !=================================================================================================================================== + +IF(.NOT.UseRayTracing) RETURN + SDEALLOCATE(N_VolMesh_Ray) SDEALLOCATE(N_Inter_Ray) SDEALLOCATE(PREF_VDM_Ray) From 8f8035abe1c211b4c9e4c898896123fad7b1264c Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Wed, 19 Jul 2023 17:51:01 +0200 Subject: [PATCH 122/495] Fixed pre-proc ifdefs in ray trace ini --- src/radiation/ray_tracing/raytrace_ini.f90 | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/radiation/ray_tracing/raytrace_ini.f90 b/src/radiation/ray_tracing/raytrace_ini.f90 index 9f36eb9a9..88a388dee 100644 --- a/src/radiation/ray_tracing/raytrace_ini.f90 +++ b/src/radiation/ray_tracing/raytrace_ini.f90 @@ -193,17 +193,14 @@ SUBROUTINE InitHighOrderRaySampling() USE MPI USE MOD_Particle_Mesh_Vars ,ONLY: NodeCoords_Shared USE MOD_RayTracing_Vars ,ONLY: N_DG_Ray_Shared,N_DG_Ray_Shared_Win +USE MOD_MPI_Shared +USE MOD_MPI_Shared_Vars ,ONLY: MPI_COMM_SHARED,myComputeNodeRank,nComputeNodeProcessors,nComputeNodeTotalElems #else USE MOD_Mesh_Vars ,ONLY: NodeCoords,nElems #endif /*USE_MPI*/ #if defined(CODE_ANALYZE) USE MOD_Globals ,ONLY: nProcessors #endif /*defined(CODE_ANALYZE)*/ -#if USE_LOADBALANCE -USE MOD_MPI_Shared -USE MOD_MPI_Shared_Vars ,ONLY: MPI_COMM_SHARED,myComputeNodeRank,nComputeNodeProcessors,nComputeNodeTotalElems -!USE MOD_Particle_Mesh_Vars,ONLY: ElemBaryNGeo_Shared -#endif /*USE_LOADBALANCE*/ IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------! ! INPUT / OUTPUT VARIABLES From 762d364f1828ccdd7b7b734525f8a9ee62ca11a2 Mon Sep 17 00:00:00 2001 From: Julian Beyer Date: Thu, 20 Jul 2023 17:43:36 +0200 Subject: [PATCH 123/495] output optical depth --- .../radiation_solver/radiation_init.f90 | 216 +++++++++++++++++- .../radiative_transfer/radtrans_init.f90 | 4 +- .../radiative_transfer/radtrans_output.f90 | 16 +- .../radiative_transfer/radtrans_vars.f90 | 4 +- .../tracking/radtrans_tools.f90 | 13 +- 5 files changed, 235 insertions(+), 18 deletions(-) diff --git a/src/radiation/radiation_solver/radiation_init.f90 b/src/radiation/radiation_solver/radiation_init.f90 index 54493b00e..5063c5691 100644 --- a/src/radiation/radiation_solver/radiation_init.f90 +++ b/src/radiation/radiation_solver/radiation_init.f90 @@ -104,7 +104,7 @@ SUBROUTINE InitRadiation() USE MOD_Mesh_Vars, ONLY : nElems, nGlobalElems USE MOD_Particle_Mesh_Vars, ONLY : nComputeNodeElems USE MOD_ReadInTools -USE MOD_PARTICLE_Vars, ONLY : nSpecies, Species +USE MOD_PARTICLE_Vars, ONLY : nSpecies, Species, DoVirtualCellMerge USE MOD_Radiation_Vars USE MOD_DSMC_Vars, ONLY : SpecDSMC USE MOD_Radiation_ReadIn, ONLY : Radiation_readin_atoms, Radiation_readin_molecules @@ -133,6 +133,8 @@ SUBROUTINE InitRadiation() SpeciesRadiation(:)%nLevels = 0 SpeciesRadiation(:)%nLines = 0 +IF (DoVirtualCellMerge) CALL CellMergeRad() + IF (RadiationSwitches%RadType.NE.2) THEN DO iSpec = 1, nSpecies IF(SpecDSMC(iSpec)%InterID.EQ.4) CYCLE @@ -297,13 +299,13 @@ SUBROUTINE MacroscopicRadiationInput() USE MOD_io_hdf5 USE MOD_HDF5_Input ,ONLY: OpenDataFile,CloseDataFile,DatasetExists,ReadArray,GetDataProps USE MOD_Mesh_Vars ,ONLY: offsetElem, nElems - USE MOD_Particle_Vars ,ONLY: nSpecies + USE MOD_Particle_Vars ,ONLY: nSpecies, DoVirtualCellMerge, VirtMergedCells USE MOD_DSMC_Vars ,ONLY: SpecDSMC USE MOD_Radiation_Vars ,ONLY: RadiationSwitches, MacroRadInputParameters, MacroRadInputParameters_Shared, & MacroRadInputParameters_Shared_Win USE MOD_Mesh_Tools ,ONLY: GetCNElemID USE MOD_ReadInTools - USE MOD_Particle_Mesh_Vars ,ONLY: nComputeNodeElems + USE MOD_Particle_Mesh_Vars ,ONLY: nComputeNodeElems, ElemVolume_Shared #if USE_MPI !USE MOD_MPI_Shared_Vars USE MOD_MPI_Shared @@ -323,6 +325,7 @@ SUBROUTINE MacroscopicRadiationInput() CHARACTER(LEN=300) :: MacroRadiationInputFile INTEGER, ALLOCATABLE :: SortElemInd(:) REAL, ALLOCATABLE :: SortElemYPos(:) + INTEGER :: CNMasterElemID, masterElemID !=================================================================================================================================== MacroRadiationInputFile = GETSTR('Radiation-MacroInput-Filename') @@ -413,6 +416,36 @@ SUBROUTINE MacroscopicRadiationInput() END IF END IF +IF (DoVirtualCellMerge) THEN + DO iElem =1, nElems + CNElemID = GetCNElemID(iElem+offsetElem) + IF (VirtMergedCells(iElem)%isMerged) CYCLE + IF (VirtMergedCells(iElem)%NumOfMergedCells.GT.0) THEN + + print*, 'IsMerged', iElem, VirtMergedCells(iElem)%NumOfMergedCells + MacroRadInputParameters(CNElemID,:,1:5) = MacroRadInputParameters(CNElemID,:,1:5)*ElemVolume_Shared(CNElemID)/VirtMergedCells(iElem)%MergedVolume + END IF + END DO + + DO iElem =1, nElems + CNElemID = GetCNElemID(iElem+offsetElem) + IF (VirtMergedCells(iElem)%isMerged) THEN + masterElemID = VirtMergedCells(iElem)%MasterCell - offSetElem + CNMasterElemID = GetCNElemID(masterElemID+offsetElem) + MacroRadInputParameters(CNMasterElemID,:,1:5) = MacroRadInputParameters(CNMasterElemID,:,1:5) + MacroRadInputParameters(CNElemID,:,1:5)*ElemVolume_Shared(CNElemID)/VirtMergedCells(masterElemID)%MergedVolume + END IF + END DO + + DO iElem =1, nElems + CNElemID = GetCNElemID(iElem+offsetElem) + IF (VirtMergedCells(iElem)%isMerged) THEN + masterElemID = VirtMergedCells(iElem)%MasterCell - offSetElem + CNMasterElemID = GetCNElemID(masterElemID+offsetElem) + MacroRadInputParameters(CNElemID,:,1:5) = MacroRadInputParameters(CNMasterElemID,:,1:5) + END IF + END DO +END IF + #if USE_MPI CALL BARRIER_AND_SYNC(MacroRadInputParameters_Shared_Win ,MPI_COMM_SHARED) #endif @@ -516,4 +549,181 @@ END SUBROUTINE FinalizeRadiation +SUBROUTINE CellMergeRad() +!=================================================================================================================================== +!> Routine for virtual merging of neighbouring cells. +!> Currently, the merging is only done via the number of particles within the cells. +!=================================================================================================================================== +! MODULES +USE MOD_Particle_Vars, ONLY: VirtMergedCells, PEM, VirtualCellMergeSpread, MaxNumOfMergedCells +USE MOD_Mesh_Vars, ONLY: nElems,offsetElem +USE MOD_Particle_Mesh_Vars, ONLY: ElemToElemMapping,ElemToElemInfo, ElemVolume_Shared +USE MOD_Mesh_Tools, ONLY: GetCNElemID, GetGlobalElemID +! IMPLICIT VARIABLE HANDLING + IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +INTEGER :: CNElemID, GlobalElemID, iNbElem, GlobNbElem, LocNBElem, MasterCellID +INTEGER :: CNNbElem, iElem, iOldElem, currentCellCount +INTEGER, ALLOCATABLE :: tempCellID(:) +LOGICAL :: AllowBackMerge +!=================================================================================================================================== +!Nullify every value +DO iElem = 1, nElems + VirtMergedCells(iElem)%isMerged = .FALSE. + VirtMergedCells(iElem)%MasterCell = 0 + VirtMergedCells(iElem)%MergedVolume = 0.0 + IF (VirtMergedCells(iElem)%NumOfMergedCells.GT.0) THEN + DEALLOCATE(VirtMergedCells(iElem)%MergedCellID) + VirtMergedCells(iElem)%NumOfMergedCells=0 + END IF +END DO + +!Loop over all cells and neighbouring cells to merge them +ElemLoop: DO iElem = 1, nElems + IF(VirtMergedCells(iElem)%isMerged) CYCLE + + GlobalElemID = iElem + offSetElem + CNElemID = GetCNElemID(GlobalElemID) + AllowBackMerge = .TRUE. + NBElemLoop: DO iNbElem = 1,ElemToElemMapping(2,CNElemID) + GlobNbElem = GetGlobalElemID(ElemToElemInfo(ElemToElemMapping(1,CNElemID)+iNbElem)) + LocNBElem = GlobNbElem-offSetElem + CNNbElem = GetCNElemID(GlobNbElem) + IF ((LocNBElem.LT.1).OR.(LocNBElem.GT.nElems)) CYCLE + IF(VirtMergedCells(LocNBElem)%isMerged.AND.AllowBackMerge) THEN + IF(VirtualCellMergeSpread.GT.1) THEN + IF (VirtMergedCells(iElem)%NumOfMergedCells.GT.0) THEN + MasterCellID = VirtMergedCells(LocNBElem)%MasterCell-offSetElem + IF(VirtMergedCells(MasterCellID)%NumOfMergedCells.GE.(MaxNumOfMergedCells-1)) CYCLE NBElemLoop + ALLOCATE(tempCellID(VirtMergedCells(MasterCellID)%NumOfMergedCells)) + tempCellID = VirtMergedCells(MasterCellID)%MergedCellID + DEALLOCATE(VirtMergedCells(MasterCellID)%MergedCellID) + VirtMergedCells(MasterCellID)%NumOfMergedCells = VirtMergedCells(MasterCellID)%NumOfMergedCells + 1 + VirtMergedCells(iElem)%NumOfMergedCells + ALLOCATE(VirtMergedCells(MasterCellID)%MergedCellID(1:VirtMergedCells(MasterCellID)%NumOfMergedCells)) + VirtMergedCells(MasterCellID)%MergedCellID(1:VirtMergedCells(MasterCellID)%NumOfMergedCells-1-VirtMergedCells(iElem)%NumOfMergedCells) = & + tempCellID(1:VirtMergedCells(MasterCellID)%NumOfMergedCells-1-VirtMergedCells(iElem)%NumOfMergedCells) + oldMasterElemLoop: DO iOldElem = 1, VirtMergedCells(iElem)%NumOfMergedCells + currentCellCount = VirtMergedCells(MasterCellID)%NumOfMergedCells-VirtMergedCells(iElem)%NumOfMergedCells -1 + iOldElem + VirtMergedCells(MasterCellID)%MergedCellID(currentCellCount) = VirtMergedCells(iElem)%MergedCellID(iOldElem) + VirtMergedCells(VirtMergedCells(iElem)%MergedCellID(iOldElem))%MasterCell = VirtMergedCells(LocNBElem)%MasterCell + END DO oldMasterElemLoop + VirtMergedCells(MasterCellID)%MergedCellID(VirtMergedCells(MasterCellID)%NumOfMergedCells) = iElem + VirtMergedCells(iElem)%MasterCell = VirtMergedCells(LocNBElem)%MasterCell + VirtMergedCells(iElem)%isMerged = .TRUE. + VirtMergedCells(MasterCellID)%MergedVolume=VirtMergedCells(MasterCellID)%MergedVolume+VirtMergedCells(iElem)%MergedVolume + VirtMergedCells(iElem)%MergedVolume = 0.0 + VirtMergedCells(iElem)%NumOfMergedCells = 0 + DEALLOCATE(VirtMergedCells(iElem)%MergedCellID) + DEALLOCATE(tempCellID) + CYCLE ElemLoop + ELSE + MasterCellID = VirtMergedCells(LocNBElem)%MasterCell-offSetElem + IF(VirtMergedCells(MasterCellID)%NumOfMergedCells.GE.(MaxNumOfMergedCells-1)) CYCLE NBElemLoop + ALLOCATE(tempCellID(VirtMergedCells(MasterCellID)%NumOfMergedCells)) + tempCellID = VirtMergedCells(MasterCellID)%MergedCellID + DEALLOCATE(VirtMergedCells(MasterCellID)%MergedCellID) + VirtMergedCells(MasterCellID)%NumOfMergedCells = VirtMergedCells(MasterCellID)%NumOfMergedCells + 1 + ALLOCATE(VirtMergedCells(MasterCellID)%MergedCellID(1:VirtMergedCells(MasterCellID)%NumOfMergedCells)) + VirtMergedCells(MasterCellID)%MergedCellID(1:VirtMergedCells(MasterCellID)%NumOfMergedCells-1) = & + tempCellID(1:VirtMergedCells(MasterCellID)%NumOfMergedCells-1) + VirtMergedCells(MasterCellID)%MergedCellID(VirtMergedCells(MasterCellID)%NumOfMergedCells) = iElem + VirtMergedCells(MasterCellID)%MergedVolume=VirtMergedCells(MasterCellID)%MergedVolume+ElemVolume_Shared(CNElemID) + VirtMergedCells(iElem)%MasterCell = VirtMergedCells(LocNBElem)%MasterCell + VirtMergedCells(iElem)%isMerged = .TRUE. + DEALLOCATE(tempCellID) + CYCLE ElemLoop + END IF + ELSE + CYCLE NBElemLoop + END IF + ELSE IF ((VirtMergedCells(LocNBElem)%NumOfMergedCells.GT.0).AND.AllowBackMerge) THEN + IF(VirtualCellMergeSpread.GT.0) THEN + IF (VirtMergedCells(iElem)%NumOfMergedCells.GT.0) THEN + MasterCellID = LocNBElem + IF(VirtMergedCells(MasterCellID)%NumOfMergedCells.GE.(MaxNumOfMergedCells-1)) CYCLE NBElemLoop + ALLOCATE(tempCellID(VirtMergedCells(MasterCellID)%NumOfMergedCells)) + tempCellID = VirtMergedCells(MasterCellID)%MergedCellID + DEALLOCATE(VirtMergedCells(MasterCellID)%MergedCellID) + VirtMergedCells(MasterCellID)%NumOfMergedCells = VirtMergedCells(MasterCellID)%NumOfMergedCells + 1 + VirtMergedCells(iElem)%NumOfMergedCells + ALLOCATE(VirtMergedCells(MasterCellID)%MergedCellID(1:VirtMergedCells(MasterCellID)%NumOfMergedCells)) + VirtMergedCells(MasterCellID)%MergedCellID(1:VirtMergedCells(MasterCellID)%NumOfMergedCells-1-VirtMergedCells(iElem)%NumOfMergedCells) = & + tempCellID(1:VirtMergedCells(MasterCellID)%NumOfMergedCells-1-VirtMergedCells(iElem)%NumOfMergedCells) + oldMasterElemLoop2: DO iOldElem = 1, VirtMergedCells(iElem)%NumOfMergedCells + currentCellCount = VirtMergedCells(MasterCellID)%NumOfMergedCells-VirtMergedCells(iElem)%NumOfMergedCells -1 + iOldElem + VirtMergedCells(MasterCellID)%MergedCellID(currentCellCount) = VirtMergedCells(iElem)%MergedCellID(iOldElem) + VirtMergedCells(VirtMergedCells(iElem)%MergedCellID(iOldElem))%MasterCell = MasterCellID + offSetElem + END DO oldMasterElemLoop2 + VirtMergedCells(MasterCellID)%MergedCellID(VirtMergedCells(MasterCellID)%NumOfMergedCells) = iElem + VirtMergedCells(iElem)%MasterCell = MasterCellID + offSetElem + VirtMergedCells(iElem)%isMerged = .TRUE. + VirtMergedCells(MasterCellID)%MergedVolume=VirtMergedCells(MasterCellID)%MergedVolume+VirtMergedCells(iElem)%MergedVolume + VirtMergedCells(iElem)%MergedVolume = 0.0 + VirtMergedCells(iElem)%NumOfMergedCells = 0 + DEALLOCATE(VirtMergedCells(iElem)%MergedCellID) + DEALLOCATE(tempCellID) + CYCLE ElemLoop + ELSE + MasterCellID = LocNBElem + IF(VirtMergedCells(MasterCellID)%NumOfMergedCells.GE.(MaxNumOfMergedCells-1)) CYCLE NBElemLoop + ALLOCATE(tempCellID(VirtMergedCells(MasterCellID)%NumOfMergedCells)) + tempCellID = VirtMergedCells(MasterCellID)%MergedCellID + DEALLOCATE(VirtMergedCells(MasterCellID)%MergedCellID) + VirtMergedCells(MasterCellID)%NumOfMergedCells = VirtMergedCells(MasterCellID)%NumOfMergedCells + 1 + ALLOCATE(VirtMergedCells(MasterCellID)%MergedCellID(1:VirtMergedCells(MasterCellID)%NumOfMergedCells)) + VirtMergedCells(MasterCellID)%MergedCellID(1:VirtMergedCells(MasterCellID)%NumOfMergedCells-1) = & + tempCellID(1:VirtMergedCells(MasterCellID)%NumOfMergedCells-1) + VirtMergedCells(MasterCellID)%MergedCellID(VirtMergedCells(MasterCellID)%NumOfMergedCells) = iElem + VirtMergedCells(MasterCellID)%MergedVolume=VirtMergedCells(MasterCellID)%MergedVolume+ElemVolume_Shared(CNElemID) + VirtMergedCells(iElem)%MasterCell = MasterCellID + offSetElem + VirtMergedCells(iElem)%isMerged = .TRUE. + DEALLOCATE(tempCellID) + CYCLE ElemLoop + END IF + ELSE + CYCLE NBElemLoop + END IF + ELSE IF (VirtMergedCells(LocNBElem)%isMerged.AND.(.NOT.AllowBackMerge)) THEN + CYCLE NBElemLoop + ELSE IF ((VirtMergedCells(LocNBElem)%NumOfMergedCells.GT.0).AND.(.NOT.AllowBackMerge)) THEN + CYCLE NBElemLoop + ELSE + IF(VirtualCellMergeSpread.LT.3) AllowBackMerge = .FALSE. + IF (VirtMergedCells(iElem)%NumOfMergedCells.EQ.0) THEN + VirtMergedCells(iElem)%MergedVolume = VirtMergedCells(iElem)%MergedVolume + ElemVolume_Shared(CNElemID) + VirtMergedCells(iElem)%NumOfMergedCells = VirtMergedCells(iElem)%NumOfMergedCells + 1 + ALLOCATE(VirtMergedCells(iElem)%MergedCellID(VirtMergedCells(iElem)%NumOfMergedCells)) + VirtMergedCells(iElem)%MergedCellID(VirtMergedCells(iElem)%NumOfMergedCells) = LocNBElem + VirtMergedCells(iElem)%MergedVolume = VirtMergedCells(iElem)%MergedVolume + ElemVolume_Shared(CNNbElem) + VirtMergedCells(iElem)%MasterCell = iElem + offSetElem + VirtMergedCells(LocNBElem)%MasterCell = iElem + offSetElem + VirtMergedCells(LocNBElem)%isMerged = .TRUE. + ELSE + IF(VirtMergedCells(iElem)%NumOfMergedCells.GE.(MaxNumOfMergedCells-1)) CYCLE ElemLoop + ALLOCATE(tempCellID(VirtMergedCells(iElem)%NumOfMergedCells)) + tempCellID = VirtMergedCells(iElem)%MergedCellID + DEALLOCATE(VirtMergedCells(iElem)%MergedCellID) + VirtMergedCells(iElem)%NumOfMergedCells = VirtMergedCells(iElem)%NumOfMergedCells + 1 + ALLOCATE(VirtMergedCells(iElem)%MergedCellID(VirtMergedCells(iElem)%NumOfMergedCells)) + VirtMergedCells(iElem)%MergedCellID(1:VirtMergedCells(iElem)%NumOfMergedCells-1) = & + tempCellID(1:VirtMergedCells(iElem)%NumOfMergedCells-1) + VirtMergedCells(iElem)%MergedCellID(VirtMergedCells(iElem)%NumOfMergedCells) = LocNBElem + VirtMergedCells(iElem)%MergedVolume = VirtMergedCells(iElem)%MergedVolume + ElemVolume_Shared(CNNbElem) + VirtMergedCells(LocNBElem)%MasterCell = iElem + offSetElem + VirtMergedCells(LocNBElem)%isMerged = .TRUE. + DEALLOCATE(tempCellID) + END IF + END IF + END DO NBElemLoop +END DO ElemLoop + +END SUBROUTINE CellMergeRad + + + + END MODULE MOD_Radiation_Init diff --git a/src/radiation/radiative_transfer/radtrans_init.f90 b/src/radiation/radiative_transfer/radtrans_init.f90 index 9c32cf257..3cc7a34af 100644 --- a/src/radiation/radiative_transfer/radtrans_init.f90 +++ b/src/radiation/radiative_transfer/radtrans_init.f90 @@ -109,7 +109,7 @@ SUBROUTINE InitRadiationTransport() SWRITE(UNIT_StdOut,'(132("-"))') SWRITE(UNIT_stdOut,'(A)') ' INIT RADIATION TRANSPORT SOLVER ...' -ALLOCATE(RadiationElemAbsEnergy(1:nGlobalElems)) +ALLOCATE(RadiationElemAbsEnergy(3,1:nGlobalElems)) RadiationElemAbsEnergy=0.0 RadiationDirectionModel = GETINT('Radiation-DirectionModel') @@ -163,7 +163,7 @@ SUBROUTINE InitRadiationTransport() #if USE_MPI ! allocate shared array for Radiation_Emission/Absorption_Spec -CALL Allocate_Shared((/nGlobalElems/),RadiationElemAbsEnergy_Shared_Win,RadiationElemAbsEnergy_Shared) +CALL Allocate_Shared((/3,nGlobalElems/),RadiationElemAbsEnergy_Shared_Win,RadiationElemAbsEnergy_Shared) CALL MPI_WIN_LOCK_ALL(0,RadiationElemAbsEnergy_Shared_Win,IERROR) IF (myComputeNodeRank.EQ.0) RadiationElemAbsEnergy_Shared = 0. diff --git a/src/radiation/radiative_transfer/radtrans_output.f90 b/src/radiation/radiative_transfer/radtrans_output.f90 index 280322126..c6099623c 100644 --- a/src/radiation/radiative_transfer/radtrans_output.f90 +++ b/src/radiation/radiative_transfer/radtrans_output.f90 @@ -76,7 +76,7 @@ SUBROUTINE WriteRadiationToHDF5() Statedummy = 'RadiationState' IF (RadiationSwitches%RadType.EQ.1) THEN nVarSpec=2 ! _Emission, _Absorption - nVar=nVarSpec*nSpecies+4 ! nVarSpec + Total_Emission, Total_Absorption, Total_Heatflux, and Total_PhotonNum + nVar=nVarSpec*nSpecies+5 ! nVarSpec + Total_Emission, Total_Absorption, Total_Heatflux, and Total_PhotonNum ELSE nVar=4 END IF @@ -97,6 +97,7 @@ SUBROUTINE WriteRadiationToHDF5() StrVarNames(nVarCount+2)='Total_Absorption' StrVarNames(nVarCount+3)='Total_Heatflux' StrVarNames(nVarCount+4)='Total_PhotonNum' + StrVarNames(nVarCount+5)='Mean_OpticalDepth' ELSE StrVarNames(1)='Total_Emission' StrVarNames(2)='Total_Absorption' @@ -129,7 +130,7 @@ SUBROUTINE WriteRadiationToHDF5() TempOutput(nVarCount+1, iElem) = Radiation_ElemEnergy_Species(iSpec,CNElemID,1) ! TempOutput(nVarCount+2, iElem) = Radiation_ElemEnergy_Species(iSpec,iElem,2) !abs coefficient IF (AbsTotal.GT.0) THEN - tempSpecAbs = Radiation_ElemEnergy_Species(iSpec,CNElemID,2)/AbsTotal * RadiationElemAbsEnergy_Shared(iElem+offSetElem)/ ElemVolume_Shared(CNElemID) + tempSpecAbs = Radiation_ElemEnergy_Species(iSpec,CNElemID,2)/AbsTotal * RadiationElemAbsEnergy_Shared(1,iElem+offSetElem)/ ElemVolume_Shared(CNElemID) ELSE tempSpecAbs = 0.0 END IF @@ -137,16 +138,17 @@ SUBROUTINE WriteRadiationToHDF5() nVarCount=nVarCount+nVarSpec END DO TempOutput((nVarSpec*nSpecies+1), iElem) = Radiation_Emission_Spec_Total(CNElemID) ! SUM(Radiation_ElemEnergy_Species(:,CNElemID,1)) - TempOutput((nVarSpec*nSpecies+2), iElem) = RadiationElemAbsEnergy_Shared(iElem+offSetElem)/ ElemVolume_Shared(CNElemID) - TempOutput(nVarSpec*nSpecies+3, iElem) = SUM(Radiation_ElemEnergy_Species(:,CNElemID,1))- RadiationElemAbsEnergy_Shared(iElem+offSetElem)/ ElemVolume_Shared(CNElemID) + TempOutput((nVarSpec*nSpecies+2), iElem) = RadiationElemAbsEnergy_Shared(1,iElem+offSetElem)/ ElemVolume_Shared(CNElemID) + TempOutput(nVarSpec*nSpecies+3, iElem) = SUM(Radiation_ElemEnergy_Species(:,CNElemID,1))- RadiationElemAbsEnergy_Shared(1,iElem+offSetElem)/ ElemVolume_Shared(CNElemID) TempOutput(nVarSpec*nSpecies+4, iElem) = RadTransPhotPerCell(CNElemID) + TempOutput(nVarSpec*nSpecies+5, iElem) = RadiationElemAbsEnergy_Shared(2,iElem+offSetElem)/RadiationElemAbsEnergy_Shared(3,iElem+offSetElem) END DO ELSE IF (RadiationSwitches%RadType.EQ.2) THEN DO iElem=1, PP_nElems CNElemID = GetCNElemID(iElem+offSetElem) TempOutput(1, iElem) = Radiation_Emission_Spec_Total(CNElemID) - TempOutput(2, iElem) = RadiationElemAbsEnergy_Shared(iElem+offSetElem)/ElemVolume_Shared(CNElemID) - TempOutput(3, iElem) = Radiation_Emission_Spec_Total(CNElemID)- RadiationElemAbsEnergy_Shared(iElem+offSetElem)/ElemVolume_Shared(CNElemID) + TempOutput(2, iElem) = RadiationElemAbsEnergy_Shared(1,iElem+offSetElem)/ElemVolume_Shared(CNElemID) + TempOutput(3, iElem) = Radiation_Emission_Spec_Total(CNElemID)- RadiationElemAbsEnergy_Shared(1,iElem+offSetElem)/ElemVolume_Shared(CNElemID) TempOutput(4, iElem) = RadTransPhotPerCell(CNElemID) END DO ELSE IF (RadiationSwitches%RadType.EQ.3) THEN @@ -330,7 +332,7 @@ SUBROUTINE MPI_ExchangeRadiationInfo() INTEGER :: MessageSize, iELem !=================================================================================================================================== ! collect the information from the proc-local shadow arrays in the compute-node shared array -MessageSize = nGlobalElems +MessageSize = 3*nGlobalElems IF (myComputeNodeRank.EQ.0) THEN CALL MPI_REDUCE(RadiationElemAbsEnergy,RadiationElemAbsEnergy_Shared,MessageSize,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_SHARED,IERROR) diff --git a/src/radiation/radiative_transfer/radtrans_vars.f90 b/src/radiation/radiative_transfer/radtrans_vars.f90 index 60584d050..d05c0c8dd 100644 --- a/src/radiation/radiative_transfer/radtrans_vars.f90 +++ b/src/radiation/radiative_transfer/radtrans_vars.f90 @@ -73,7 +73,7 @@ MODULE MOD_RadiationTrans_Vars INTEGER :: RadiationPhotonWaveLengthModel LOGICAL :: RadEmiAdaptPhotonNum -REAL, ALLOCATABLE :: RadiationElemAbsEnergy(:) +REAL, ALLOCATABLE :: RadiationElemAbsEnergy(:,:) REAL,ALLOCPOINT :: Radiation_Emission_Spec_Total(:) REAL,ALLOCPOINT :: Radiation_Emission_Spec_Max(:) INTEGER,ALLOCPOINT :: RadTransPhotPerCell(:) ! (WaveLen(:), number of mesh elements) @@ -93,7 +93,7 @@ MODULE MOD_RadiationTrans_Vars INTEGER :: PhotonSampWall_Shared_Win REAL,POINTER :: PhotonSampWall_Shared(:,:) INTEGER :: RadiationElemAbsEnergy_Shared_Win -REAL,POINTER :: RadiationElemAbsEnergy_Shared(:) +REAL,POINTER :: RadiationElemAbsEnergy_Shared(:,:) INTEGER :: RadObservationPOI_Shared_Win REAL,ALLOCPOINT :: RadObservationPOI_Shared(:,:) #endif diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tools.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tools.f90 index bff824b6a..9f4f95cd1 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tools.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tools.f90 @@ -622,17 +622,20 @@ SUBROUTINE CalcAbsoprtionMC(IntersectionPos,Element, DONE) LOGICAL, INTENT(OUT) :: DONE ! Local variable declaration ! !--------------------------------------------------------------------------------------------------! - REAL :: iRan, DistanceVec(3), Distance + REAL :: iRan, DistanceVec(3), Distance, opticalPath !--------------------------------------------------------------------------------------------------! DistanceVec(1:3) = PhotonProps%PhotonPos(1:3) - IntersectionPos(1:3) Distance = SQRT(DistanceVec(1)*DistanceVec(1) + DistanceVec(2)*DistanceVec(2) + DistanceVec(3)*DistanceVec(3)) CALL RANDOM_NUMBER(iRan) - IF (-LOG(iRan).LT.(Distance*Radiation_Absorption_Spec(PhotonProps%WaveLength,Element))) THEN - RadiationElemAbsEnergy(Element) = RadiationElemAbsEnergy(Element) + PhotonProps%PhotonEnergy + opticalPath = Distance*Radiation_Absorption_Spec(PhotonProps%WaveLength,Element) + IF (-LOG(iRan).LT.opticalPath) THEN + RadiationElemAbsEnergy(1,Element) = RadiationElemAbsEnergy(1,Element) + PhotonProps%PhotonEnergy DONE = .TRUE. ELSE PhotonProps%PhotonPos(1:3) = IntersectionPos(1:3) END IF + RadiationElemAbsEnergy(2,Element) = RadiationElemAbsEnergy(2,Element) + opticalPath + RadiationElemAbsEnergy(3,Element) = RadiationElemAbsEnergy(3,Element) + 1.0 END SUBROUTINE CalcAbsoprtionMC @@ -663,12 +666,14 @@ SUBROUTINE CalcAbsoprtionAnalytic(IntersectionPos,Element, DONE) LostEnergy = PhotonProps%PhotonEnergy *(1.-EXP(-opticalPath)) END IF PhotonProps%PhotonEnergy = PhotonProps%PhotonEnergy - LostEnergy - RadiationElemAbsEnergy(Element) = RadiationElemAbsEnergy(Element) + LostEnergy + RadiationElemAbsEnergy(1,Element) = RadiationElemAbsEnergy(1,Element) + LostEnergy ! IF (PhotonProps%PhotonEnergy.LE.(RadTrans%GlobalRadiationPower/(1000.*RadTrans%GlobalPhotonNum))) THEN ! DONE = .TRUE. ! ELSE PhotonProps%PhotonPos(1:3) = IntersectionPos(1:3) ! END IF + RadiationElemAbsEnergy(2,Element) = RadiationElemAbsEnergy(2,Element) + opticalPath + RadiationElemAbsEnergy(3,Element) = RadiationElemAbsEnergy(3,Element) + 1.0 END SUBROUTINE CalcAbsoprtionAnalytic From b45f2628e45d4aad1c9f834a3117217b2babfa8f Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Tue, 25 Jul 2023 20:03:29 +0200 Subject: [PATCH 124/495] Fixed ray tracing for nSurfSample=1. Introduced PerformRayTracing for actual ray tracing algorithms + full mesh mode. Fixed SEE output to SurfaceAnalyze.csv when ray tracing is used, which is not allowed in combination with iInit-based photo-SEE. --- .../boundary/particle_boundary_sampling.f90 | 14 ++--- .../emission/particle_photoionization.f90 | 57 ++++++++++++++----- src/particles/particle_init.f90 | 26 +++++++-- src/particles/particle_mesh/particle_bgm.f90 | 8 ++- src/particles/particle_mesh/particle_mesh.f90 | 27 +++++++-- .../particle_mesh/particle_mesh_vars.f90 | 1 + src/particles/particle_operations.f90 | 3 + .../surfacemodel/surfacemodel_analyze.f90 | 26 ++++++++- .../tracking/radtrans_tracking_output.f90 | 28 +++++---- .../tracking/radtrans_tracking_vars.f90 | 3 + src/radiation/ray_tracing/raytrace.f90 | 11 ++-- src/radiation/ray_tracing/raytrace_ini.f90 | 7 ++- src/radiation/ray_tracing/raytrace_vars.f90 | 3 +- 13 files changed, 157 insertions(+), 57 deletions(-) diff --git a/src/particles/boundary/particle_boundary_sampling.f90 b/src/particles/boundary/particle_boundary_sampling.f90 index 44c29756c..a0b410684 100644 --- a/src/particles/boundary/particle_boundary_sampling.f90 +++ b/src/particles/boundary/particle_boundary_sampling.f90 @@ -163,7 +163,7 @@ SUBROUTINE InitParticleBoundarySampling() INTEGER :: NbGlobalElemID, NbElemRank, NbLeaderID, nSurfSidesTmp #endif /*USE_MPI*/ INTEGER :: NbGlobalSideID -LOGICAL :: UseBezierControlPoints +LOGICAL :: UseBezierControlPointsForArea REAL,ALLOCATABLE :: xIP_VISU(:),wIP_VISU(:) !=================================================================================================================================== @@ -615,7 +615,7 @@ SUBROUTINE InitParticleBoundarySampling() ! get global SideID. This contains only nonUniqueSide, no special mortar treatment required SideID = SurfSide2GlobalSide(SURF_SIDEID,iSide) - UseBezierControlPoints = .FALSE. + UseBezierControlPointsForArea = .FALSE. IF (TrackingMethod.EQ.TRIATRACKING) THEN ElemID = SideInfo_Shared(SIDE_ELEMID ,SideID) @@ -627,7 +627,7 @@ SUBROUTINE InitParticleBoundarySampling() ! Check if triangles are used for the calculation of the surface area or not IF(nSurfSample.GT.1)THEN ! Do not use triangles - UseBezierControlPoints = .TRUE. + UseBezierControlPointsForArea = .TRUE. ELSE xNod(1:3) = NodeCoords_Shared(1:3,ElemSideNodeID_Shared(1,LocSideID,CNElemID)+1) area = 0. @@ -650,17 +650,17 @@ SUBROUTINE InitParticleBoundarySampling() SurfSideArea(1,1,iSide) = DSMC_1D_CalcSymmetryArea(LocSideID, CNElemID) END IF ELSE ! TrackingMethod.NE.TRIATRACKING - UseBezierControlPoints = .TRUE. + UseBezierControlPointsForArea = .TRUE. END IF ! TrackingMethod.EQ.TRIATRACKIN ! Instead of triangles use Bezier control points (curved or triangle tracking with nSurfSample>1) - IF(UseBezierControlPoints)THEN + IF(UseBezierControlPointsForArea)THEN DO jSample=1,nSurfSample DO iSample=1,nSurfSample area=0. tmpI2=(XiEQ_SurfSample(iSample-1)+XiEQ_SurfSample(iSample))/2. ! (a+b)/2 tmpJ2=(XiEQ_SurfSample(jSample-1)+XiEQ_SurfSample(jSample))/2. ! (a+b)/2 - ASSOCIATE(xi => 0.5*(xIP_VISU(iSample)+xIP_VISU(iSample-1)), eta => 0.5*(xIP_VISU(jSample)+xIP_VISU(jSample-1)) ) + ASSOCIATE( xi => 0.5*(xIP_VISU(iSample)+xIP_VISU(iSample-1)), eta => 0.5*(xIP_VISU(jSample)+xIP_VISU(jSample-1)) ) CALL EvaluateBezierPolynomialAndGradient((/xi,eta/),NGeo,3,BezierControlPoints3D(1:3,0:NGeo,0:NGeo,SideID) & ,Point=SurfSideSamplingMidPoints(1:3,iSample,jSample,iSide)) END ASSOCIATE @@ -681,7 +681,7 @@ SUBROUTINE InitParticleBoundarySampling() SurfSideArea(iSample,jSample,iSide) = area END DO ! iSample=1,nSurfSample END DO ! jSample=1,nSurfSample - END IF ! UseBezierControlPoints + END IF ! UseBezierControlPointsForArea END DO ! iSide = firstSide,lastSide diff --git a/src/particles/emission/particle_photoionization.f90 b/src/particles/emission/particle_photoionization.f90 index bd73729bb..8f9db8c3b 100644 --- a/src/particles/emission/particle_photoionization.f90 +++ b/src/particles/emission/particle_photoionization.f90 @@ -40,9 +40,9 @@ SUBROUTINE PhotoIonization_RayTracing_SEE() USE MOD_Timedisc_Vars ,ONLY: dt,time USE MOD_Particle_Boundary_Vars ,ONLY: nSurfSample, Partbound, SurfSide2GlobalSide, DoBoundaryParticleOutputHDF5 USE MOD_Particle_Vars ,ONLY: Species, PartState, usevMPF -USE MOD_RayTracing_Vars ,ONLY: Ray,RayPartBound +USE MOD_RayTracing_Vars ,ONLY: Ray,UseRayTracing USE MOD_part_emission_tools ,ONLY: CalcPhotonEnergy -USE MOD_Particle_Mesh_Vars ,ONLY: SideInfo_Shared +USE MOD_Particle_Mesh_Vars ,ONLY: SideInfo_Shared,UseBezierControlPoints USE MOD_Particle_Surfaces_Vars ,ONLY: BezierControlPoints3D, BezierSampleXi USE MOD_Particle_Surfaces ,ONLY: EvaluateBezierPolynomialAndGradient, CalcNormAndTangBezier USE MOD_Mesh_Vars ,ONLY: NGeo @@ -64,6 +64,7 @@ SUBROUTINE PhotoIonization_RayTracing_SEE() USE MOD_HDG_Vars ,ONLY: UseFPC,FPC,UseEPC,EPC USE MOD_Mesh_Vars ,ONLY: BoundaryType #endif /*USE_HDG*/ +USE MOD_SurfaceModel_Analyze_Vars ,ONLY: SEE,CalcElectronSEE !----------------------------------------------------------------------------------------------------------------------------------! ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -74,7 +75,7 @@ SUBROUTINE PhotoIonization_RayTracing_SEE() ! LOCAL VARIABLES REAL :: t_1, t_2, E_Intensity INTEGER :: NbrOfRepetitions, firstSide, lastSide, SideID, iSample, GlobElemID, PartID -INTEGER :: iSurfSide, p, q, BCID, SpecID, iPart, NbrOfSEE +INTEGER :: iSurfSide, p, q, BCID, SpecID, iPart, NbrOfSEE, iSEEBC REAL :: RealNbrOfSEE, TimeScalingFactor, MPF REAL :: Particle_pos(1:3), xi(2) REAL :: RandVal, RandVal2(2), xiab(1:2,1:2), nVec(3), tang1(3), tang2(3), Velo3D(3) @@ -84,15 +85,17 @@ SUBROUTINE PhotoIonization_RayTracing_SEE() !=================================================================================================================================== ! Check if ray tracing based SEE is active ! 1) Boundary from which rays are emitted -IF(RayPartBound.LE.0) RETURN +IF(.NOT.UseRayTracing) RETURN ! 2) SEE yield for any BC greater than zero IF(.NOT.ANY(PartBound%PhotonSEEYield(:).GT.0.)) RETURN ! TODO: Copied here from InitParticleMesh, which is only build if not TriaSurfaceFlux -IF(.NOT.ALLOCATED(BezierSampleXi)) ALLOCATE(BezierSampleXi(0:nSurfSample)) -DO iSample=0,nSurfSample - BezierSampleXi(iSample)=-1.+2.0/nSurfSample*iSample -END DO +IF(UseBezierControlPoints)THEN + IF(.NOT.ALLOCATED(BezierSampleXi)) ALLOCATE(BezierSampleXi(0:nSurfSample)) + DO iSample=0,nSurfSample + BezierSampleXi(iSample)=-1.+2.0/nSurfSample*iSample + END DO +END IF ! Surf sides are shared, array calculation can be distributed #if USE_MPI @@ -150,6 +153,12 @@ SUBROUTINE PhotoIonization_RayTracing_SEE() IF(PartBound%PhotonSEEYield(BCID).LE.0.) CYCLE ! Determine which species is to be inserted SpecID = PartBound%PhotonSEEElectronSpecies(BCID) + ! Sanity check + IF(SpecID.EQ.0)THEN + IPWRITE(UNIT_StdOut,*) "BCID =", BCID + IPWRITE(UNIT_StdOut,*) "PartBound%PhotonSEEElectronSpecies(BCID) =", PartBound%PhotonSEEElectronSpecies(BCID) + CALL abort(__STAMP__,'Electron species index cannot be zero!') + END IF ! SpecID.eq.0 ! Determine which element the particles are going to be inserted GlobElemID = SideInfo_Shared(SIDE_ELEMID ,SideID) ! Determine the weighting factor of the electron species @@ -170,20 +179,38 @@ SUBROUTINE PhotoIonization_RayTracing_SEE() RealNbrOfSEE = E_Intensity / CalcPhotonEnergy(lambda) * PartBound%PhotonSEEYield(BCID) / MPF CALL RANDOM_NUMBER(RandVal) NbrOfSEE = INT(RealNbrOfSEE+RandVal) + ! Check if photon SEE electric current is to be measured + IF((NbrOfSEE.GT.0).AND.(CalcElectronSEE))THEN + ! Note that the negative value of the charge -q is used below + iSEEBC = SEE%BCIDToSEEBCID(BCID) + SEE%RealElectronOut(iSEEBC) = SEE%RealElectronOut(iSEEBC) - MPF*NbrOfSEE*Species(SpecID)%ChargeIC + END IF ! (NbrOfSEE.GT.0).AND.(CalcElectronSEE) ! Calculate the normal & tangential vectors - xi(1)=(BezierSampleXi(p-1)+BezierSampleXi(p))/2. ! (a+b)/2 - xi(2)=(BezierSampleXi(q-1)+BezierSampleXi(q))/2. ! (a+b)/2 - xiab(1,1:2)=(/BezierSampleXi(p-1),BezierSampleXi(p)/) - xiab(2,1:2)=(/BezierSampleXi(q-1),BezierSampleXi(q)/) - CALL CalcNormAndTangBezier(nVec,tang1,tang2,xi(1),xi(2),SideID) + IF(UseBezierControlPoints)THEN + ! Use Bezier polynomial + xi(1)=(BezierSampleXi(p-1)+BezierSampleXi(p))/2. ! (a+b)/2 + xi(2)=(BezierSampleXi(q-1)+BezierSampleXi(q))/2. ! (a+b)/2 + xiab(1,1:2)=(/BezierSampleXi(p-1),BezierSampleXi(p)/) + xiab(2,1:2)=(/BezierSampleXi(q-1),BezierSampleXi(q)/) + CALL CalcNormAndTangBezier(nVec,tang1,tang2,xi(1),xi(2),SideID) + ELSE + ! Sanity check + CALL abort(__STAMP__,'Photoionization with ray tracing requires BezierControlPoints3D') + END IF ! nSurfSample.GT.1 ! Normal vector provided by the routine points outside of the domain nVec = -nVec ! Loop over number of particles to be inserted DO iPart = 1, NbrOfSEE ! Determine particle position within the sub-side CALL RANDOM_NUMBER(RandVal2) - xi=(xiab(:,2)-xiab(:,1))*RandVal2+xiab(:,1) - CALL EvaluateBezierPolynomialAndGradient(xi,NGeo,3,BezierControlPoints3D(1:3,0:NGeo,0:NGeo,SideID),Point=Particle_pos(1:3)) + IF(UseBezierControlPoints)THEN + ! Use Bezier polynomial + xi=(xiab(:,2)-xiab(:,1))*RandVal2+xiab(:,1) + CALL EvaluateBezierPolynomialAndGradient(xi,NGeo,3,BezierControlPoints3D(1:3,0:NGeo,0:NGeo,SideID),Point=Particle_pos(1:3)) + ELSE + ! Sanity check + CALL abort(__STAMP__,'Photoionization with ray tracing requires BezierControlPoints3D') + END IF ! nSurfSample.GT.1 ! Determine particle velocity CALL CalcVelocity_FromWorkFuncSEE(PartBound%PhotonSEEWorkFunction(BCID), Species(SpecID)%MassIC, tang1, nVec, Velo3D) ! Create new particle diff --git a/src/particles/particle_init.f90 b/src/particles/particle_init.f90 index 2acdda1ac..e98733b7f 100644 --- a/src/particles/particle_init.f90 +++ b/src/particles/particle_init.f90 @@ -212,6 +212,7 @@ END SUBROUTINE DefineParametersParticles SUBROUTINE InitParticleGlobals(IsLoadBalance) ! MODULES USE MOD_Globals +USE MOD_Globals_Vars ,ONLY: ProjectName USE MOD_ReadInTools USE MOD_Particle_Tracking_Vars ,ONLY: TrackingMethod USE MOD_Particle_Vars ,ONLY: Symmetry @@ -221,8 +222,9 @@ SUBROUTINE InitParticleGlobals(IsLoadBalance) USE MOD_PICDepo_Method ,ONLY: InitDepositionMethod USE MOD_Particle_Vars ,ONLY: UseVarTimeStep, VarTimeStep USE MOD_ReadInTools ,ONLY: GETLOGICAL -USE MOD_RayTracing_Vars ,ONLY: UseRayTracing +USE MOD_RayTracing_Vars ,ONLY: UseRayTracing,PerformRayTracing USE MOD_Particle_TimeStep ,ONLY: InitPartTimeStep +USE MOD_Photon_TrackingVars ,ONLY: RadiationSurfState,RadiationVolState ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -263,7 +265,19 @@ SUBROUTINE InitParticleGlobals(IsLoadBalance) CALL InitDepositionMethod() !--- Ray Tracing +! 1) Activate ray tracing based emission (also required for plasma simulation) UseRayTracing = GETLOGICAL('UseRayTracing') +! 2) Activate actual ray tracing algorithms that track rays through the complete mesh (full mesh mode) +RadiationSurfState = TRIM(ProjectName)//'_RadiationSurfState.h5' +RadiationVolState = TRIM(ProjectName)//'_RadiationVolState.h5' +PerformRayTracing = .FALSE. ! default +IF(UseRayTracing)THEN + IF(FILEEXISTS(RadiationSurfState).AND.FILEEXISTS(RadiationVolState))THEN + PerformRayTracing = .FALSE. + ELSE + PerformRayTracing = .TRUE. + END IF ! FILEEXISTS(RadiationSurfState).AND.FILEEXISTS(RadiationVolState) +END IF ! UseRayTracing LBWRITE(UNIT_stdOut,'(A)')' INIT PARTICLE GLOBALS DONE' @@ -861,7 +875,7 @@ SUBROUTINE InitializeVariablesWriteMacroValues() #if USE_LOADBALANCE USE MOD_LoadBalance_Vars ,ONLY: PerformLoadBalance #endif /*USE_LOADBALANCE*/ -USE MOD_RayTracing_Vars ,ONLY: UseRayTracing +USE MOD_RayTracing_Vars ,ONLY: PerformRayTracing ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -872,14 +886,14 @@ SUBROUTINE InitializeVariablesWriteMacroValues() ! LOCAL VARIABLES !=================================================================================================================================== ! Include surface values in the macroscopic output -IF(UseRayTracing)THEN - ! Automatically activate when UseRayTracing = T +IF(PerformRayTracing)THEN + ! Automatically activate when PerformRayTracing = T DSMC%CalcSurfaceVal = .TRUE. - CALL PrintOption('Surface sampling activated (UseRayTracing=T): Particles-DSMC-CalcSurfaceVal','INFO',& + CALL PrintOption('Surface sampling activated (PerformRayTracing=T): Particles-DSMC-CalcSurfaceVal','INFO',& LogOpt=DSMC%CalcSurfaceVal) ELSE DSMC%CalcSurfaceVal = GETLOGICAL('Particles-DSMC-CalcSurfaceVal') -END IF ! UseRayTracing +END IF ! PerformRayTracing ! Include electronic energy excitation in the macroscopic output SampleElecExcitation = GETLOGICAL('Part-SampElectronicExcitation') ! Sampling for and output every given number of iterations (sample is reset after an output) diff --git a/src/particles/particle_mesh/particle_bgm.f90 b/src/particles/particle_mesh/particle_bgm.f90 index e62df53bf..2c14c726f 100644 --- a/src/particles/particle_mesh/particle_bgm.f90 +++ b/src/particles/particle_mesh/particle_bgm.f90 @@ -133,6 +133,7 @@ SUBROUTINE BuildBGMAndIdentifyHaloRegion() USE MOD_Particle_Mesh_Vars ,ONLY: CNTotalSide2GlobalSide USE MOD_Particle_Mesh_Vars ,ONLY: GlobalElem2CNTotalElem USE MOD_Particle_Mesh_Vars ,ONLY: CNTotalElem2GlobalElem +USE MOD_RayTracing_Vars ,ONLY: PerformRayTracing #endif /*USE_MPI*/ #if USE_LOADBALANCE USE MOD_LoadBalance_Vars ,ONLY: PerformLoadBalance @@ -352,7 +353,12 @@ SUBROUTINE BuildBGMAndIdentifyHaloRegion() #if USE_MPI SafetyFactor = GETREAL('Part-SafetyFactor') -halo_eps_velo = GETREAL('Particles-HaloEpsVelo') +IF(PerformRayTracing)THEN + halo_eps_velo = 1e200 + CALL PrintOption('Full mesh mode activated (PerformRayTracing=T): Particles-HaloEpsVelo','INFO',RealOpt=halo_eps_velo) +ELSE + halo_eps_velo = GETREAL('Particles-HaloEpsVelo') +END IF ! PerformRayTracing ! Adaptive SF: Determine global shape function radius from maximum of characteristic length in each cell IF((TRIM(DepositionType).EQ.'shape_function_adaptive').AND.SFAdaptiveSmoothing)THEN diff --git a/src/particles/particle_mesh/particle_mesh.f90 b/src/particles/particle_mesh/particle_mesh.f90 index e020c03d7..1b74330a3 100644 --- a/src/particles/particle_mesh/particle_mesh.f90 +++ b/src/particles/particle_mesh/particle_mesh.f90 @@ -243,7 +243,8 @@ SUBROUTINE InitParticleMesh() IF((TrackingMethod.EQ.TRIATRACKING).AND.(Symmetry%Order.EQ.3).AND.(nSurfSample.GT.1)) nSurfSampleAndTriaTracking = .TRUE. ! Potentially curved elements. FIBGM needs to be built on BezierControlPoints rather than NodeCoords to avoid missing elements -IF (TrackingMethod.EQ.TRACING .OR. TrackingMethod.EQ.REFMAPPING .OR. nSurfSampleAndTriaTracking) THEN +IF (TrackingMethod.EQ.TRACING .OR. TrackingMethod.EQ.REFMAPPING .OR. nSurfSampleAndTriaTracking .OR. UseRayTracing) THEN + UseBezierControlPoints = .TRUE. ! Bezier elevation now more important than ever, also determines size of FIBGM extent BezierElevation = GETINT('BezierElevation') NGeoElevated = NGeo + BezierElevation @@ -251,6 +252,8 @@ SUBROUTINE InitParticleMesh() CALL CalcParticleMeshMetrics() ! Required for Elem_xGP_Shared and dXCL_NGeo_Shared CALL CalcXCL_NGeo() ! Required for XCL_NGeo_Shared CALL CalcBezierControlPoints() ! Required for BezierControlPoints3D and BezierControlPoints3DElevated (requires XCL_NGeo_Shared) +ELSE + UseBezierControlPoints = .FALSE. END IF ! Mesh min/max must be built on BezierControlPoint for possibly curved elements @@ -387,10 +390,10 @@ SUBROUTINE InitParticleMesh() !IF (DoInterpolation.OR.DSMC%UseOctree) THEN ! use this in future if possible IF (DoInterpolation.OR.DoDeposition.OR.UseRayTracing) THEN ! Do not call these functions twice. This is already done above - IF(.NOT.nSurfSampleAndTriaTracking)THEN + IF(.NOT.UseBezierControlPoints)THEN CALL CalcParticleMeshMetrics() ! Required for Elem_xGP_Shared and dXCL_NGeo_Shared CALL CalcXCL_NGeo() ! Required for XCL_NGeo_Shared - END IF ! .NOT.nSurfSampleAndTriaTracking + END IF ! .NOT.UseBezierControlPoints CALL BuildElemTypeAndBasisTria() ! Required for ElemCurved, XiEtaZetaBasis and slenXiEtaZetaBasis. Needs XCL_NGeo_Shared END IF ! DoInterpolation.OR.DSMC%UseOctree @@ -762,11 +765,23 @@ SUBROUTINE FinalizeParticleMesh() CALL UNLOCK_AND_FREE(ElemCurved_Shared_Win) CALL UNLOCK_AND_FREE(XiEtaZetaBasis_Shared_Win) CALL UNLOCK_AND_FREE(slenXiEtaZetaBasis_Shared_Win) - END IF ! DoInterpolation + END IF ! DoInterpolation.OR.DoDeposition.OR.UseRayTracing ! BuildEpsOneCell() IF (DoDeposition) CALL UNLOCK_AND_FREE(ElemsJ_Shared_Win) +#if USE_LOADBALANCE + IF (.NOT.PerformLoadBalance) THEN +#endif /*USE_LOADBALANCE*/ + IF(UseBezierControlPoints)THEN + ! CalcBezierControlPoints() + CALL UNLOCK_AND_FREE(BezierControlPoints3D_Shared_Win) + IF (BezierElevation.GT.0) CALL UNLOCK_AND_FREE(BezierControlPoints3DElevated_Shared_Win) + END IF ! UseBezierControlPoints +#if USE_LOADBALANCE + END IF !PerformLoadBalance +#endif /*USE_LOADBALANCE*/ + CALL MPI_BARRIER(MPI_COMM_SHARED,iERROR) ! Then, free the pointers or arrays @@ -777,6 +792,10 @@ SUBROUTINE FinalizeParticleMesh() ADEALLOCATE(XCL_NGeo_Array) ADEALLOCATE(Elem_xGP_Array) ADEALLOCATE(dXCL_NGeo_Array) + + ! CalcBezierControlPoints() + ADEALLOCATE(BezierControlPoints3D_Shared) + ADEALLOCATE(BezierControlPoints3DElevated_Shared) #if USE_LOADBALANCE END IF !PerformLoadBalance #endif /*USE_LOADBALANCE*/ diff --git a/src/particles/particle_mesh/particle_mesh_vars.f90 b/src/particles/particle_mesh/particle_mesh_vars.f90 index 2073e1bc4..39b214eb3 100644 --- a/src/particles/particle_mesh/particle_mesh_vars.f90 +++ b/src/particles/particle_mesh/particle_mesh_vars.f90 @@ -44,6 +44,7 @@ MODULE MOD_Particle_Mesh_Vars INTEGER :: offsetComputeNodeSide !> side offset of compute-node root INTEGER :: offsetComputeNodeNode !> node offset of compute-node root INTEGER :: nUniqueGlobalNodes !> MAXVAL(NodeInfo_Shared) +LOGICAL :: UseBezierControlPoints !> Flag is automatically set when BezierControlPoints3D are built #if USE_MPI LOGICAL, ALLOCATABLE :: IsExchangeElem(:) !> Exchange elements may receive particles during MPI communication and cannot be used for latency hiding diff --git a/src/particles/particle_operations.f90 b/src/particles/particle_operations.f90 index e5e8ec4db..2f9fe239d 100644 --- a/src/particles/particle_operations.f90 +++ b/src/particles/particle_operations.f90 @@ -70,6 +70,9 @@ SUBROUTINE CreateParticle(SpecID,Pos,GlobElemID,Velocity,RotEnergy,VibEnergy,Ele IF(newParticleID.GT.PDM%MaxParticleNumber)THEN CALL abort(__STAMP__,'CreateParticle: newParticleID.GT.PDM%MaxParticleNumber. '//& 'Increase Part-maxParticleNumber or use more processors. newParticleID=',IntInfoOpt=newParticleID) +ELSEIF(newParticleID.EQ.0)THEN + CALL abort(__STAMP__,'CreateParticle: newParticleID.EQ.0'//& + 'Increase Part-maxParticleNumber or use more processors. newParticleID=',IntInfoOpt=newParticleID) END IF PartSpecies(newParticleID) = SpecID diff --git a/src/particles/surfacemodel/surfacemodel_analyze.f90 b/src/particles/surfacemodel/surfacemodel_analyze.f90 index 24ab955c0..7870167fc 100644 --- a/src/particles/surfacemodel/surfacemodel_analyze.f90 +++ b/src/particles/surfacemodel/surfacemodel_analyze.f90 @@ -891,6 +891,8 @@ END SUBROUTINE InitBoundaryParticleOutput !> 1) Check if secondary electron emission occurs !> 1.1) Count number of different SEE boundaries via reflective particle BC !> 1.2) Count number of different photon SEE boundaries +!> 1.3) Count number of ray tracing photon SEE boundaries. WARNING: The combination of Init-based photon SEE and ray tracing photon +! SEE is not allowed !> 2.) Create Mapping from SEE BC index to particle BC index !> 2.1) Create mapping for reactive surface SEE (non-photon impacts) !> 2.2) Create mapping for photon-surface SEE @@ -939,13 +941,26 @@ SUBROUTINE InitCalcElectronSEE() END DO NPartBoundariesPhotonSEE = SEE%NPartBoundaries - NPartBoundariesReflectiveSEE +! 1.3) Count number of ray tracing photon SEE boundaries. WARNING: The combination of Init-based photon SEE and ray tracing photon +! SEE is not allowed +DO iPartBound = 1, nPartBound + IF(PartBound%PhotonSEEYield(iPartBound).GT.0.0)THEN + ! Sanity checks + IF(NPartBoundariesPhotonSEE.GT.0) CALL abort(__STAMP__,'The combination of Init-based + ray tracing photon SEE is not allowed!') + ! Remove the following check when the model is implemented (deposited charge holes by SEE) + IF(PartBound%Dielectric(iPartBound)) CALL abort(__STAMP__,'Dielectric surfaces and ray tracing ist not implemented') + SEE%NPartBoundaries = SEE%NPartBoundaries + 1 + END IF ! PartBound%PhotonSEEYield(iPartBound).GT.0.0 +END DO ! iPartBound = 1, nPartBound +NPartBoundariesPhotonSEE = SEE%NPartBoundaries - NPartBoundariesReflectiveSEE + ! If not SEE boundaries exist, no measurement of the current can be performed IF(SEE%NPartBoundaries.EQ.0) RETURN ! Automatically activate when CalcBoundaryParticleOutput=T IF(CalcBoundaryParticleOutput)THEN CalcElectronSEE = .TRUE. - CALL PrintOption('SEE current measurement activated (CalcBoundaryParticleOutput=T): CalcElectronSEE','INFO',& + CALL PrintOption('SEE current activated (CalcBoundaryParticleOutput=T): CalcElectronSEE','INFO',& LogOpt=CalcElectronSEE) ELSE CalcElectronSEE = GETLOGICAL('CalcElectronSEE','.FALSE.') @@ -969,7 +984,7 @@ SUBROUTINE InitCalcElectronSEE() SEE%PartBoundaries(SEE%NPartBoundaries) = iPartBound END SELECT END DO ! iPartBound=1,nPartBound -! 2.2) Create mapping for photon-surface SEE +! 2.2) Create mapping for photon-surface SEE (Init-based) DO iSpec=1,nSpecies DO iInit=1, Species(iSpec)%NumberOfInits IF(Species(iSpec)%Init(iInit)%PartBCIndex.GT.0)THEN @@ -980,6 +995,13 @@ SUBROUTINE InitCalcElectronSEE() END IF END DO END DO +! 2.3) Create mapping for photon-surface SEE (ray tracing) +DO iPartBound = 1, nPartBound + IF(PartBound%PhotonSEEYield(iPartBound).GT.0.0)THEN + SEE%NPartBoundaries = SEE%NPartBoundaries + 1 + SEE%PartBoundaries(SEE%NPartBoundaries) = iPartBound + END IF ! PartBound%PhotonSEEYield(iPartBound).GT.0.0 +END DO ! iPartBound = 1, nPartBound ! Allocate the container ALLOCATE(SEE%RealElectronOut(1:SEE%NPartBoundaries)) diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 index 287141416..dd5d341cd 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 @@ -54,10 +54,11 @@ SUBROUTINE WritePhotonVolSampleToHDF5() USE MOD_HDF5_Output_ElemData ,ONLY: WriteAdditionalElemData USE MOD_Mesh_Vars ,ONLY: offsetElem,nGlobalElems USE MOD_ChangeBasis ,ONLY: ChangeBasis3D -USE MOD_Interpolation_Vars ,ONLY: NodeType -USE MOD_Interpolation ,ONLY: GetVandermonde -USE MOD_Mesh_Tools ,ONLY: GetCNElemID -USE MOD_Particle_Mesh_Vars ,ONLY: ElemVolume_Shared +USE MOD_Interpolation_Vars ,ONLY: NodeType +USE MOD_Interpolation ,ONLY: GetVandermonde +USE MOD_Mesh_Tools ,ONLY: GetCNElemID +USE MOD_Particle_Mesh_Vars ,ONLY: ElemVolume_Shared +USE MOD_Photon_TrackingVars ,ONLY: RadiationVolState ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -67,7 +68,6 @@ SUBROUTINE WritePhotonVolSampleToHDF5() !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- -CHARACTER(LEN=255) :: FileName INTEGER :: iElem,iGlobalElem,iCNElem,Nloc,k,l,m CHARACTER(LEN=255), ALLOCATABLE :: StrVarNames(:) REAL :: U(nVarRay,0:Ray%NMax,0:Ray%NMax,0:Ray%NMax,PP_nElems) @@ -113,8 +113,7 @@ SUBROUTINE WritePhotonVolSampleToHDF5() StrVarNames(3)='ElemVolume' ! Generate skeleton for the file with all relevant data on a single proc (MPIRoot) -FileName=TRIM(ProjectName)//'_RadiationVolState.h5' -IF(MPIRoot) CALL GenerateFileSkeleton('RadiationVolState',nVarRay,StrVarNames,TRIM(MeshFile),0.,FileNameIn=FileName,NIn=Ray%NMax,NodeType_in=Ray%NodeType) +IF(MPIRoot) CALL GenerateFileSkeleton('RadiationVolState',nVarRay,StrVarNames,TRIM(MeshFile),0.,FileNameIn=RadiationVolState,NIn=Ray%NMax,NodeType_in=Ray%NodeType) #if USE_MPI CALL MPI_BARRIER(MPI_COMM_WORLD,iError) #endif @@ -198,7 +197,7 @@ SUBROUTINE WritePhotonVolSampleToHDF5() nGlobalElems => INT(nGlobalElems,IK) ,& PP_nElems => INT(PP_nElems,IK) ,& offsetElem => INT(offsetElem,IK) ) - CALL GatheredWriteArray(FileName,create=.FALSE.,& + CALL GatheredWriteArray(RadiationVolState,create=.FALSE.,& DataSetName='DG_Solution', rank=5,& nValGlobal=(/nVarRay , NMax+1_IK , NMax+1_IK , NMax+1_IK , nGlobalElems/) , & nVal= (/nVarRay , NMax+1_IK , NMax+1_IK , NMax+1_IK , PP_nElems/) , & @@ -210,7 +209,7 @@ SUBROUTINE WritePhotonVolSampleToHDF5() #endif /*USE_MPI*/ ! Write all 'ElemData' arrays to a single container in the state.h5 file -CALL WriteAdditionalElemData(FileName,ElementOut) +CALL WriteAdditionalElemData(RadiationVolState,ElementOut) SWRITE(*,*) 'DONE' END SUBROUTINE WritePhotonVolSampleToHDF5 @@ -242,6 +241,7 @@ SUBROUTINE WritePhotonSurfSampleToHDF5() USE MOD_Particle_Boundary_Vars ,ONLY: SurfSideArea #endif /*USE_MPI*/ USE MOD_Particle_Boundary_Vars ,ONLY: nSurfSample, PartBound +USE MOD_Photon_TrackingVars ,ONLY: RadiationSurfState !----------------------------------------------------------------------------------------------------------------------------------! ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -250,7 +250,7 @@ SUBROUTINE WritePhotonSurfSampleToHDF5() ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -CHARACTER(LEN=255) :: FileString,Statedummy +CHARACTER(LEN=255) :: Statedummy CHARACTER(LEN=255) :: H5_Name CHARACTER(LEN=4),PARAMETER :: NodeTypeTemp = 'VISU' CHARACTER(LEN=255),ALLOCATABLE :: Str2DVarNames(:) @@ -273,13 +273,11 @@ SUBROUTINE WritePhotonSurfSampleToHDF5() tstart=LOCALTIME() END IF -FileString=TRIM(ProjectName)//'_RadiationSurfState.h5' - ! Generate skeleton for the file with all relevant data on a single proc (MPIRoot) #if USE_MPI IF (mySurfRank.EQ.0) THEN #endif /*USE_MPI*/ - CALL OpenDataFile(FileString,create=.TRUE.,single=.TRUE.,readOnly=.FALSE.) + CALL OpenDataFile(RadiationSurfState,create=.TRUE.,single=.TRUE.,readOnly=.FALSE.) Statedummy = 'RadiationSurfState' ! Write file header CALL WriteHDF5Header(Statedummy,File_ID) @@ -303,9 +301,9 @@ SUBROUTINE WritePhotonSurfSampleToHDF5() #if USE_MPI END IF CALL MPI_BARRIER(MPI_COMM_LEADERS_SURF,iERROR) -CALL OpenDataFile(FileString,create=.FALSE.,single=.FALSE.,readOnly=.FALSE.,communicatorOpt=MPI_COMM_LEADERS_SURF) +CALL OpenDataFile(RadiationSurfState,create=.FALSE.,single=.FALSE.,readOnly=.FALSE.,communicatorOpt=MPI_COMM_LEADERS_SURF) #else -CALL OpenDataFile(FileString,create=.FALSE.,single=.FALSE.,readOnly=.FALSE.) +CALL OpenDataFile(RadiationSurfState,create=.FALSE.,single=.FALSE.,readOnly=.FALSE.) #endif /*USE_MPI*/ diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_vars.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_vars.f90 index 2eb513943..d0b54ae37 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_vars.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_vars.f90 @@ -48,5 +48,8 @@ MODULE MOD_Photon_TrackingVars INTEGER :: PhotonSampWall_Shared_Win REAL,POINTER :: PhotonSampWall_Shared(:,:,:,:) #endif /*USE_MPI*/ + + +CHARACTER(LEN=255) :: RadiationSurfState,RadiationVolState !> Output file names for surface and volume sampling !=================================================================================================================================== END MODULE MOD_Photon_TrackingVars diff --git a/src/radiation/ray_tracing/raytrace.f90 b/src/radiation/ray_tracing/raytrace.f90 index fe86f56bf..858e2e4f5 100644 --- a/src/radiation/ray_tracing/raytrace.f90 +++ b/src/radiation/ray_tracing/raytrace.f90 @@ -63,7 +63,7 @@ SUBROUTINE RayTracing() #endif /*USE_MPI*/ USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall,PhotonModeBPO USE MOD_Mesh_Vars ,ONLY: nGlobalElems -USE MOD_RayTracing_Vars ,ONLY: UseRayTracing +USE MOD_RayTracing_Vars ,ONLY: PerformRayTracing USE MOD_DSMC_Vars ,ONLY: DSMC ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -81,11 +81,14 @@ SUBROUTINE RayTracing() REAL :: StartT,EndT ! Timer !=================================================================================================================================== -IF(.NOT.UseRayTracing) RETURN +IF(.NOT.PerformRayTracing) RETURN GETTIME(StartT) SWRITE(UNIT_stdOut,'(A)') ' Start Ray Tracing Calculation ...' +! Sanity check +IF(nComputeNodeSurfTotalSides.EQ.0) CALL abort(__STAMP__,'nComputeNodeSurfTotalSides is zero, no surfaces for ray tracing found! ') + ! Allocate arrays ALLOCATE(RayElemPassedEnergy(RayElemSize,1:nGlobalElems)) RayElemPassedEnergy=0.0 @@ -99,8 +102,8 @@ SUBROUTINE RayTracing() !> Shared arrays for boundary sampling CALL Allocate_Shared((/2,nSurfSample,nSurfSample,nComputeNodeSurfTotalSides/),PhotonSampWall_Shared_Win,PhotonSampWall_Shared) CALL MPI_WIN_LOCK_ALL(0,PhotonSampWall_Shared_Win,IERROR) -IF (myComputeNodeRank.EQ.0) RayElemPassedEnergy_Shared = 0. -IF (myComputeNodeRank.EQ.0) PhotonSampWall_Shared = 0. +IF(myComputeNodeRank.EQ.0) RayElemPassedEnergy_Shared = 0. +IF(myComputeNodeRank.EQ.0) PhotonSampWall_Shared = 0. CALL BARRIER_AND_SYNC(RayElemPassedEnergy_Shared_Win,MPI_COMM_SHARED) CALL BARRIER_AND_SYNC(PhotonSampWall_Shared_Win,MPI_COMM_SHARED) #endif diff --git a/src/radiation/ray_tracing/raytrace_ini.f90 b/src/radiation/ray_tracing/raytrace_ini.f90 index 88a388dee..14079788b 100644 --- a/src/radiation/ray_tracing/raytrace_ini.f90 +++ b/src/radiation/ray_tracing/raytrace_ini.f90 @@ -88,7 +88,7 @@ SUBROUTINE InitRayTracing() !=================================================================================================================================== IF(.NOT.UseRayTracing) RETURN SWRITE(UNIT_StdOut,'(132("-"))') -SWRITE(UNIT_stdOut,'(A)') ' INIT RAY TRACING SOLVER ...' +SWRITE(UNIT_stdOut,'(A)') ' INIT RAY TRACING MODEL ...' ! Do not absorb rays within the volume! RadiationAbsorptionModel = 0 @@ -172,7 +172,7 @@ SUBROUTINE InitRayTracing() CALL PrintOption('Temporal pulse width (pulse time 2x tShift) [s]' , 'CALCUL.' , RealOpt=2.0*Ray%tShift) CALL PrintOption('Pulse will end at tActive (pulse final time) [s]' , 'CALCUL.' , RealOpt=Ray%tActive) -SWRITE(UNIT_stdOut,'(A)')' INIT RAY TRACING SOLVER DONE!' +SWRITE(UNIT_stdOut,'(A)')' INIT RAY TRACING MODEL DONE!' SWRITE(UNIT_StdOut,'(132("-"))') END SUBROUTINE InitRayTracing @@ -534,6 +534,9 @@ SUBROUTINE FinalizeRayTracing() !SDEALLOCATE(RaySecondaryVectorY) !SDEALLOCATE(RaySecondaryVectorZ) !SDEALLOCATE(ElemVolume) + +IF(.NOT.PerformRayTracing) RETURN + IF(nProcessors.GT.1)THEN #if USE_MPI SDEALLOCATE(RayElemOffset) diff --git a/src/radiation/ray_tracing/raytrace_vars.f90 b/src/radiation/ray_tracing/raytrace_vars.f90 index 24558dba2..8f22fe721 100644 --- a/src/radiation/ray_tracing/raytrace_vars.f90 +++ b/src/radiation/ray_tracing/raytrace_vars.f90 @@ -24,7 +24,8 @@ MODULE MOD_RayTracing_Vars !----------------------------------------------------------------------------------------------------------------------------------- ! GLOBAL RAY TRACING VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- -LOGICAL :: UseRayTracing ! Activate ray tracing tools +LOGICAL :: UseRayTracing ! Activate ray tracing based emission (also required for plasma simulation) +LOGICAL :: PerformRayTracing ! Activate actual ray tracing algorithms that track rays through the complete mesh (full mesh mode) TYPE tRayTrace REAL :: PulseDuration !< From bf38ebeecf8a36c3a452006a79369af1f91e86c2 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Wed, 26 Jul 2023 19:12:24 +0200 Subject: [PATCH 125/495] Introduced local containers for volume and surface ray tracing information and the read-in routines to load this data from .h5 during restart or load balance. --- src/init/piclas_init.f90 | 2 + src/io_hdf5/hdf5_output_state.f90 | 1 + src/particles/particle_init.f90 | 12 +- .../tracking/radtrans_tracking_output.f90 | 46 +- .../tracking/radtrans_tracking_tools.f90 | 4 +- src/radiation/ray_tracing/raytrace.f90 | 151 ++++- src/radiation/ray_tracing/raytrace_ini.f90 | 523 ++++++++++-------- src/radiation/ray_tracing/raytrace_vars.f90 | 12 +- src/timedisc/timedisc.f90 | 7 +- 9 files changed, 475 insertions(+), 283 deletions(-) diff --git a/src/init/piclas_init.f90 b/src/init/piclas_init.f90 index 079e7c7c8..68ad0b0e0 100644 --- a/src/init/piclas_init.f90 +++ b/src/init/piclas_init.f90 @@ -256,6 +256,7 @@ SUBROUTINE FinalizePiclas(IsLoadBalance) USE MOD_MPI_Shared ,ONLY: FinalizeMPIShared #endif /*USE_MPI*/ #ifdef PARTICLES +USE MOD_RayTracing_Init ,ONLY: FinalizeRayTracing USE MOD_Particle_Surfaces ,ONLY: FinalizeParticleSurfaces USE MOD_InitializeBackgroundField ,ONLY: FinalizeBackGroundField USE MOD_SuperB_Init ,ONLY: FinalizeSuperB @@ -320,6 +321,7 @@ SUBROUTINE FinalizePiclas(IsLoadBalance) CALL FinalizeMesh() CALL FinalizeMortar() #ifdef PARTICLES +CALL FinalizeRayTracing() CALL FinalizeSurfaceModel() CALL FinalizeSurfaceModelAnalyze() CALL FinalizeParticleBoundarySampling() diff --git a/src/io_hdf5/hdf5_output_state.f90 b/src/io_hdf5/hdf5_output_state.f90 index 76a77c3d9..f3af4fc72 100644 --- a/src/io_hdf5/hdf5_output_state.f90 +++ b/src/io_hdf5/hdf5_output_state.f90 @@ -33,6 +33,7 @@ MODULE MOD_HDF5_Output_State PUBLIC :: WriteStateToHDF5 #if defined(PARTICLES) PUBLIC :: WriteIMDStateToHDF5 +PUBLIC :: WriteElemDataToSeparateContainer #endif /*PARTICLES*/ !=================================================================================================================================== diff --git a/src/particles/particle_init.f90 b/src/particles/particle_init.f90 index e98733b7f..e906e5d04 100644 --- a/src/particles/particle_init.f90 +++ b/src/particles/particle_init.f90 @@ -225,6 +225,7 @@ SUBROUTINE InitParticleGlobals(IsLoadBalance) USE MOD_RayTracing_Vars ,ONLY: UseRayTracing,PerformRayTracing USE MOD_Particle_TimeStep ,ONLY: InitPartTimeStep USE MOD_Photon_TrackingVars ,ONLY: RadiationSurfState,RadiationVolState +USE MOD_Restart_Vars ,ONLY: DoRestart ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -276,6 +277,7 @@ SUBROUTINE InitParticleGlobals(IsLoadBalance) PerformRayTracing = .FALSE. ELSE PerformRayTracing = .TRUE. + IF(DoRestart) CALL abort(__STAMP__,'Restart simulation requires '//TRIM(RadiationSurfState)//' and '//TRIM(RadiationVolState)) END IF ! FILEEXISTS(RadiationSurfState).AND.FILEEXISTS(RadiationVolState) END IF ! UseRayTracing @@ -875,7 +877,7 @@ SUBROUTINE InitializeVariablesWriteMacroValues() #if USE_LOADBALANCE USE MOD_LoadBalance_Vars ,ONLY: PerformLoadBalance #endif /*USE_LOADBALANCE*/ -USE MOD_RayTracing_Vars ,ONLY: PerformRayTracing +USE MOD_RayTracing_Vars ,ONLY: UseRayTracing ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -886,14 +888,14 @@ SUBROUTINE InitializeVariablesWriteMacroValues() ! LOCAL VARIABLES !=================================================================================================================================== ! Include surface values in the macroscopic output -IF(PerformRayTracing)THEN - ! Automatically activate when PerformRayTracing = T +IF(UseRayTracing)THEN + ! Automatically activate when UseRayTracing = T DSMC%CalcSurfaceVal = .TRUE. - CALL PrintOption('Surface sampling activated (PerformRayTracing=T): Particles-DSMC-CalcSurfaceVal','INFO',& + CALL PrintOption('Surface sampling activated (UseRayTracing=T): Particles-DSMC-CalcSurfaceVal','INFO',& LogOpt=DSMC%CalcSurfaceVal) ELSE DSMC%CalcSurfaceVal = GETLOGICAL('Particles-DSMC-CalcSurfaceVal') -END IF ! PerformRayTracing +END IF ! UseRayTracing ! Include electronic energy excitation in the macroscopic output SampleElecExcitation = GETLOGICAL('Part-SampElectronicExcitation') ! Sampling for and output every given number of iterations (sample is reset after an output) diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 index dd5d341cd..cda6d7f57 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 @@ -39,10 +39,9 @@ SUBROUTINE WritePhotonVolSampleToHDF5() USE MOD_Globals USE MOD_PreProc USE MOD_Mesh_Vars ,ONLY: nElems,MeshFile,offSetElem,sJ -USE MOD_Globals_Vars ,ONLY: ProjectName -USE MOD_RayTracing_Vars ,ONLY: Ray,nVarRay,U_N_Ray,N_DG_Ray,PREF_VDM_Ray,N_DG_Ray_loc,N_Inter_Ray +USE MOD_RayTracing_Vars ,ONLY: Ray,nVarRay,U_N_Ray,U_N_Ray_loc,N_DG_Ray,PREF_VDM_Ray,N_DG_Ray_loc,N_Inter_Ray USE MOD_RayTracing_Vars ,ONLY: RayElemPassedEnergyLoc1st,RayElemPassedEnergyLoc2nd -USE MOD_RayTracing_Vars ,ONLY: RaySecondaryVectorX,RaySecondaryVectorY,RaySecondaryVectorZ,ElemVolume +USE MOD_RayTracing_Vars ,ONLY: RaySecondaryVectorX,RaySecondaryVectorY,RaySecondaryVectorZ,ElemVolume,RayElemEmission USE MOD_HDF5_output ,ONLY: GatheredWriteArray #if USE_MPI USE MOD_RayTracing_Vars ,ONLY: RayElemPassedEnergy_Shared,RayElemOffset,RayElemPassedEnergyHO_Shared @@ -59,6 +58,7 @@ SUBROUTINE WritePhotonVolSampleToHDF5() USE MOD_Mesh_Tools ,ONLY: GetCNElemID USE MOD_Particle_Mesh_Vars ,ONLY: ElemVolume_Shared USE MOD_Photon_TrackingVars ,ONLY: RadiationVolState +USE MOD_HDF5_Output_State ,ONLY: WriteElemDataToSeparateContainer ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -70,7 +70,7 @@ SUBROUTINE WritePhotonVolSampleToHDF5() !----------------------------------------------------------------------------------------------------------------------------------- INTEGER :: iElem,iGlobalElem,iCNElem,Nloc,k,l,m CHARACTER(LEN=255), ALLOCATABLE :: StrVarNames(:) -REAL :: U(nVarRay,0:Ray%NMax,0:Ray%NMax,0:Ray%NMax,PP_nElems) +REAL :: UNMax(nVarRay,0:Ray%NMax,0:Ray%NMax,0:Ray%NMax,PP_nElems) #if USE_MPI INTEGER :: NlocOffset #endif /*USE_MPI*/ @@ -83,15 +83,9 @@ SUBROUTINE WritePhotonVolSampleToHDF5() ALLOCATE(RayElemPassedEnergyLoc1st(1:nElems)) ALLOCATE(RayElemPassedEnergyLoc2nd(1:nElems)) -ALLOCATE(RaySecondaryVectorX(1:nElems)) -ALLOCATE(RaySecondaryVectorY(1:nElems)) -ALLOCATE(RaySecondaryVectorZ(1:nElems)) ALLOCATE(ElemVolume(1:nElems)) RayElemPassedEnergyLoc1st=-1.0 RayElemPassedEnergyLoc2nd=-1.0 -RaySecondaryVectorX=-1.0 -RaySecondaryVectorY=-1.0 -RaySecondaryVectorZ=-1.0 ElemVolume=-1.0 CALL AddToElemData(ElementOut,'RayElemPassedEnergy1st',RealArray=RayElemPassedEnergyLoc1st) CALL AddToElemData(ElementOut,'RayElemPassedEnergy2nd',RealArray=RayElemPassedEnergyLoc2nd) @@ -99,13 +93,15 @@ SUBROUTINE WritePhotonVolSampleToHDF5() CALL AddToElemData(ElementOut,'RaySecondaryVectorY' ,RealArray=RaySecondaryVectorY) CALL AddToElemData(ElementOut,'RaySecondaryVectorZ' ,RealArray=RaySecondaryVectorZ) CALL AddToElemData(ElementOut,'ElemVolume' ,RealArray=ElemVolume) +CALL AddToElemData(ElementOut,'Nloc',IntArray=N_DG_Ray_loc) ! Copy data from shared array -ALLOCATE(N_DG_Ray_loc(1:nElems)) DO iElem = 1, nElems N_DG_Ray_loc(iElem) = N_DG_Ray(iElem + offsetElem) END DO ! iElem = 1, nElems -CALL AddToElemData(ElementOut,'Nloc',IntArray=N_DG_Ray_loc) + +! Sanity check +IF(ANY(N_DG_Ray_loc.LE.0)) CALL abort(__STAMP__,'N_DG_Ray_loc cannot contain zeros!') ALLOCATE(StrVarNames(1:nVarRay)) StrVarNames(1)='RayElemPassedEnergy1st' @@ -136,6 +132,8 @@ SUBROUTINE WritePhotonVolSampleToHDF5() RayElemPassedEnergyLoc1st(iElem) = RayElemPassedEnergy(1,iGlobalElem) !/ ElemVolume_Shared(iCNElem) ! Secondary energy RayElemPassedEnergyLoc2nd(iElem) = RayElemPassedEnergy(2,iGlobalElem) !/ ElemVolume_Shared(iCNElem) + ! Activate voltume emission + IF((RayElemPassedEnergyLoc1st(iElem).GT.0.0).OR.(RayElemPassedEnergyLoc2nd(iElem).GT.0.0)) RayElemEmission(iElem) = .TRUE. ! Check if secondary energy is greater than zero IF(RayElemPassedEnergyLoc2nd(iElem).GT.0.0)THEN IF(RayElemPassedEnergy(6,iGlobalElem).LE.0.0) CALL abort(__STAMP__,'Secondary ray counter is zero but energy is not!') @@ -161,17 +159,20 @@ SUBROUTINE WritePhotonVolSampleToHDF5() ! Get data from shared array NlocOffset = (Nloc+1)**3 ASSOCIATE( i => RayElemOffset(iGlobalElem)) - U_N_Ray(iElem)%U(1,:,:,:) = RESHAPE(RayElemPassedEnergyHO_Shared(1, i+1:i+NlocOffset), (/Nloc+1, Nloc+1, Nloc+1/)) - U_N_Ray(iElem)%U(2,:,:,:) = RESHAPE(RayElemPassedEnergyHO_Shared(2, i+1:i+NlocOffset), (/Nloc+1, Nloc+1, Nloc+1/)) + U_N_Ray(iGlobalElem)%U(1,:,:,:) = RESHAPE(RayElemPassedEnergyHO_Shared(1, i+1:i+NlocOffset), (/Nloc+1, Nloc+1, Nloc+1/)) + U_N_Ray(iGlobalElem)%U(2,:,:,:) = RESHAPE(RayElemPassedEnergyHO_Shared(2, i+1:i+NlocOffset), (/Nloc+1, Nloc+1, Nloc+1/)) END ASSOCIATE END IF ! nProcessors.GT.1 #endif /*USE_MPI*/ IF(Nloc.EQ.Ray%Nmax)THEN - U(:,:,:,:,iElem) = U_N_Ray(iElem)%U(:,:,:,:) + UNMax(:,:,:,:,iElem) = U_N_Ray(iGlobalElem)%U(:,:,:,:) ELSE - CALL ChangeBasis3D(nVarRay, Nloc, Ray%NMax, PREF_VDM_Ray(Nloc,Ray%NMax)%Vdm, U_N_Ray(iElem)%U(:,:,:,:), U(:,:,:,:,iElem)) + CALL ChangeBasis3D(nVarRay, Nloc, Ray%NMax, PREF_VDM_Ray(Nloc,Ray%NMax)%Vdm, U_N_Ray(iGlobalElem)%U(:,:,:,:), UNMax(:,:,:,:,iElem)) END IF ! Nloc.Eq.Nmax + ! Copy data from global array (later used for emission) + U_N_Ray_loc(iElem)%U(:,:,:,:) = U_N_Ray(iGlobalElem)%U(:,:,:,:) + ! Apply integration weights and the Jacobian ! Interpolate the Jacobian to the analyze grid: be careful we interpolate the inverse of the inverse of the Jacobian ;-) J_N(1,0:PP_N,0:PP_N,0:PP_N)=1./sJ(:,:,:,iElem) @@ -182,8 +183,8 @@ SUBROUTINE WritePhotonVolSampleToHDF5() IntegrationWeight = N_Inter_Ray(Ray%NMax)%wGP(k)*& N_Inter_Ray(Ray%NMax)%wGP(l)*& N_Inter_Ray(Ray%NMax)%wGP(m)*J_Nmax(1,k,l,m) - !U(1:2,k,l,m,iElem) = U(1:2,k,l,m,iElem) / IntegrationWeight - U(3,k,l,m,iElem) = IntegrationWeight + !UNMax(1:2,k,l,m,iElem) = UNMax(1:2,k,l,m,iElem) / IntegrationWeight + UNMax(3,k,l,m,iElem) = IntegrationWeight END DO ! k END DO ! l END DO ! m @@ -202,7 +203,7 @@ SUBROUTINE WritePhotonVolSampleToHDF5() nValGlobal=(/nVarRay , NMax+1_IK , NMax+1_IK , NMax+1_IK , nGlobalElems/) , & nVal= (/nVarRay , NMax+1_IK , NMax+1_IK , NMax+1_IK , PP_nElems/) , & offset= (/0_IK , 0_IK , 0_IK , 0_IK , offsetElem/) , & - collective=.TRUE.,RealArray=U) + collective=.TRUE.,RealArray=UNMax) END ASSOCIATE #if USE_MPI END ASSOCIATE @@ -211,6 +212,12 @@ SUBROUTINE WritePhotonVolSampleToHDF5() ! Write all 'ElemData' arrays to a single container in the state.h5 file CALL WriteAdditionalElemData(RadiationVolState,ElementOut) +! Write Nloc and the reflected vector to separate containers for element- and process-wise read-in during restart or loadbalance +CALL WriteElemDataToSeparateContainer(RadiationVolState,ElementOut,'Nloc') +CALL WriteElemDataToSeparateContainer(RadiationVolState,ElementOut,'RaySecondaryVectorX') +CALL WriteElemDataToSeparateContainer(RadiationVolState,ElementOut,'RaySecondaryVectorY') +CALL WriteElemDataToSeparateContainer(RadiationVolState,ElementOut,'RaySecondaryVectorZ') + SWRITE(*,*) 'DONE' END SUBROUTINE WritePhotonVolSampleToHDF5 @@ -224,7 +231,6 @@ SUBROUTINE WritePhotonSurfSampleToHDF5() !----------------------------------------------------------------------------------------------------------------------------------! USE MOD_Globals USE MOD_IO_HDF5 -USE MOD_Globals_Vars ,ONLY: ProjectName USE MOD_Particle_Boundary_Vars ,ONLY: nComputeNodeSurfOutputSides,noutputsides, nSurfBC USE MOD_Particle_Boundary_Vars ,ONLY: offsetComputeNodeSurfOutputSide, SurfBCName, nComputeNodeSurfSides USE MOD_Particle_Boundary_Vars ,ONLY: SurfSide2GlobalSide, GlobalSide2SurfSide diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 index ea87eaafb..5bd4e990c 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 @@ -762,7 +762,7 @@ SUBROUTINE CalcAbsorptionRayTrace(IntersectionPos,GlobalElemID,PhotonDir) realcounter = 0.5 U_N_Ray(GlobalElemID)%U(idx,k,l,m) = U_N_Ray(GlobalElemID)%U(idx,k,l,m) & + realcounter * sublength * PhotonProps%PhotonEnergy - ! Exist loop and subroutine here + ! Exit loop and subroutine here RETURN ELSE ! Initialize counter with half step and add 1, which gives 1.5 @@ -774,7 +774,7 @@ SUBROUTINE CalcAbsorptionRayTrace(IntersectionPos,GlobalElemID,PhotonDir) IF(iIntersec.EQ.NbrOfSamples)THEN U_N_Ray(GlobalElemID)%U(idx,k,l,m) = U_N_Ray(GlobalElemID)%U(idx,k,l,m) & + realcounter * sublength * PhotonProps%PhotonEnergy - ! Exist loop and subroutine here + ! Exit loop and subroutine here RETURN END IF ! iIntersec.EQ.NbrOfSamples ! 1st or still in old sub-element diff --git a/src/radiation/ray_tracing/raytrace.f90 b/src/radiation/ray_tracing/raytrace.f90 index 858e2e4f5..7581af96b 100644 --- a/src/radiation/ray_tracing/raytrace.f90 +++ b/src/radiation/ray_tracing/raytrace.f90 @@ -43,7 +43,7 @@ SUBROUTINE RayTracing() USE MOD_Globals USE MOD_MPI_Shared_Vars USE MOD_MPI_Shared -USE MOD_RayTracing_Vars ,ONLY: RayPartBound,NumRays,Ray,RayElemPassedEnergy,RayElemSize +USE MOD_RayTracing_Vars ,ONLY: RayPartBound,NumRays,Ray,RayElemPassedEnergy,RayElemSize,N_DG_Ray_loc USE MOD_Photon_TrackingVars ,ONLY: PhotonProps USE MOD_Photon_Tracking ,ONLY: PhotonTriaTracking USE MOD_Mesh_Tools ,ONLY: GetGlobalElemID @@ -62,9 +62,11 @@ SUBROUTINE RayTracing() USE MOD_RayTracing_Vars ,ONLY: RayElemPassedEnergy_Shared,RayElemPassedEnergy_Shared_Win #endif /*USE_MPI*/ USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall,PhotonModeBPO -USE MOD_Mesh_Vars ,ONLY: nGlobalElems -USE MOD_RayTracing_Vars ,ONLY: PerformRayTracing +USE MOD_Mesh_Vars ,ONLY: nGlobalElems,nElems +USE MOD_RayTracing_Vars ,ONLY: UseRayTracing,PerformRayTracing,RayElemEmission USE MOD_DSMC_Vars ,ONLY: DSMC +USE MOD_RayTracing_Init ,ONLY: FinalizeRayTracing +USE MOD_RayTracing_Vars ,ONLY: RaySecondaryVectorX,RaySecondaryVectorY,RaySecondaryVectorZ ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -81,7 +83,25 @@ SUBROUTINE RayTracing() REAL :: StartT,EndT ! Timer !=================================================================================================================================== -IF(.NOT.PerformRayTracing) RETURN +IF(.NOT.UseRayTracing) RETURN + +! Allocate process-local element arrays which are either filled from the global shared array when ray tracing is performed or read +! from .h5 when a restart is performed +ALLOCATE(N_DG_Ray_loc(1:nElems)) +N_DG_Ray_loc = -1 +ALLOCATE(RayElemEmission(1:nElems)) +RayElemEmission = .FALSE. +ALLOCATE(RaySecondaryVectorX(1:nElems)) +ALLOCATE(RaySecondaryVectorY(1:nElems)) +ALLOCATE(RaySecondaryVectorZ(1:nElems)) +RaySecondaryVectorX=-1.0 +RaySecondaryVectorY=-1.0 +RaySecondaryVectorZ=-1.0 + +IF(.NOT.PerformRayTracing)THEN + CALL ReadRayTracingDataFromH5() + RETURN +END IF GETTIME(StartT) SWRITE(UNIT_stdOut,'(A)') ' Start Ray Tracing Calculation ...' @@ -89,7 +109,7 @@ SUBROUTINE RayTracing() ! Sanity check IF(nComputeNodeSurfTotalSides.EQ.0) CALL abort(__STAMP__,'nComputeNodeSurfTotalSides is zero, no surfaces for ray tracing found! ') -! Allocate arrays +! Allocate global arrays ALLOCATE(RayElemPassedEnergy(RayElemSize,1:nGlobalElems)) RayElemPassedEnergy=0.0 ALLOCATE(PhotonSampWall(2,1:nSurfSample,1:nSurfSample,1:nComputeNodeSurfTotalSides)) @@ -201,12 +221,133 @@ SUBROUTINE RayTracing() CALL WritePhotonVolSampleToHDF5() +CALL FinalizeRayTracing() + +PerformRayTracing = .FALSE. + GETTIME(EndT) CALL DisplayMessageAndTime(EndT-StartT, ' DONE!', DisplayDespiteLB=.TRUE., DisplayLine=.FALSE.) END SUBROUTINE RayTracing +!=================================================================================================================================== +!> Read ray tracing volume and surface data (instead of running the actual ray tracing calculation) +!> 1. Get element polynomial degree +!=================================================================================================================================== +SUBROUTINE ReadRayTracingDataFromH5() +! MODULES +USE MOD_Globals +USE MOD_IO_HDF5 +USE MOD_PreProc +USE MOD_HDF5_Input ,ONLY: ReadArray,DatasetExists +USE MOD_Photon_TrackingVars ,ONLY: RadiationSurfState,RadiationVolState +USE MOD_Mesh_Vars ,ONLY: offsetElem,nElems,nGlobalElems +USE MOD_RayTracing_Vars ,ONLY: N_DG_Ray_loc,Ray,nVarRay,U_N_Ray_loc,PREF_VDM_Ray,N_Inter_Ray,RayElemEmission +USE MOD_ChangeBasis ,ONLY: ChangeBasis3D +USE MOD_RayTracing_Vars ,ONLY: RaySecondaryVectorX,RaySecondaryVectorY,RaySecondaryVectorZ +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------! +! INPUT / OUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +INTEGER :: iElem,Nloc,iVar,k,l,m +LOGICAL :: ContainerExists +REAL :: N_DG_Ray_locREAL(1:nElems) +REAL :: UNMax(nVarRay,0:Ray%NMax,0:Ray%NMax,0:Ray%NMax,PP_nElems) +REAL :: UNMax_loc(nVarRay,0:Ray%NMax,0:Ray%NMax,0:Ray%NMax) +!=================================================================================================================================== +! 1. Get local element polynomial degree +CALL OpenDataFile(RadiationVolState,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_WORLD) +CALL DatasetExists(File_ID,'Nloc',ContainerExists) +IF(.NOT.ContainerExists) CALL CollectiveStop(__STAMP__,'Nloc container does not exist in '//TRIM(RadiationVolState)) +! Array is stored as REAL value, hence, convert back to integer +CALL ReadArray('Nloc',2,(/1_IK,INT(nElems,IK)/),INT(offsetElem,IK),2,RealArray=N_DG_Ray_locREAL) +N_DG_Ray_loc = INT(N_DG_Ray_locREAL) +! Sanity check +IF(ANY(N_DG_Ray_loc.LE.0)) CALL abort(__STAMP__,'N_DG_Ray_loc cannot contain zeros!') + +! 1. Get local ray tracing solution +! The local DG solution in physical space +ALLOCATE(U_N_Ray_loc(1:nElems)) +DO iElem = 1, nElems + Nloc = N_DG_Ray_loc(iElem) + ALLOCATE(U_N_Ray_loc(iElem)%U(nVarRay,0:Nloc,0:Nloc,0:Nloc)) + U_N_Ray_loc(iElem)%U = 0. +END DO ! iElem = 1, nElems +! Associate construct for integer KIND=8 possibility +ASSOCIATE (& + nVarRay8 => INT(nVarRay,IK) ,& + NMax => INT(Ray%NMax,IK) ,& + nGlobalElems => INT(nGlobalElems,IK) ,& + PP_nElems => INT(PP_nElems,IK) ,& + offsetElem => INT(offsetElem,IK) & + ) + !Nres => INT(N_Restart,4) ,& + !Nres8 => INT(N_Restart,IK) ,& + CALL DatasetExists(File_ID,'DG_Solution',ContainerExists) + IF(.NOT.ContainerExists) CALL CollectiveStop(__STAMP__,'DG_Solution container does not exist in '//TRIM(RadiationVolState)) + CALL ReadArray('DG_Solution' ,5,(/nVarRay8,NMax+1_IK,NMax+1_IK,NMax+1_IK,PP_nElems/),OffsetElem,5,RealArray=UNMax) + + ! Map from NMax to local polynomial degree + DO iElem = 1, nElems + Nloc = N_DG_Ray_loc(iElem) + IF(Nloc.EQ.Ray%NMax)THEN + U_N_Ray_loc(iElem)%U(1:nVarRay,0:NMax,0:NMax,0:NMax) = UNMax(1:nVarRay,0:NMax,0:NMax,0:NMax,iElem) + ELSEIF(Nloc.GT.Ray%NMax)THEN + CALL ChangeBasis3D(nVarRay, Ray%NMax, Nloc, PREF_VDM_Ray(Ray%NMax, Nloc)%Vdm, UNMax(1:nVarRay,0:NMax,0:NMax,0:NMax,iElem), U_N_Ray_loc(iElem)%U(1:nVarRay,0:Nloc,0:Nloc,0:Nloc)) + ELSE + !transform the slave side to the same degree as the master: switch to Legendre basis + CALL ChangeBasis3D(nVarRay, Ray%NMax, Ray%NMax, N_Inter_Ray(Ray%NMax)%sVdm_Leg, UNMax(1:nVarRay,0:NMax,0:NMax,0:NMax,iElem), UNMax_loc) + ! switch back to nodal basis + CALL ChangeBasis3D(nVarRay, Nloc, Nloc, N_Inter_Ray(Nloc)%Vdm_Leg, UNMax_loc(1:nVarRay,0:Nloc,0:Nloc,0:Nloc), U_N_Ray_loc(iElem)%U(1:nVarRay,0:Nloc,0:Nloc,0:Nloc)) + END IF ! Nloc.EQ.Ray%NMax + + ! Sanity check: Very small negative numbers might occur due to the interpolation + DO iVar = 1, nVarRay + DO m=0,Nloc + DO l=0,Nloc + DO k=0,Nloc + IF(U_N_Ray_loc(iElem)%U(iVar,k,l,m).LT.0.) U_N_Ray_loc(iElem)%U(iVar,k,l,m) = 0.0 + END DO ! k + END DO ! l + END DO ! m + END DO ! iVar = 1, nVarRay + + ! Check for emission elements and flag for later volume emission + DO iVar = 1, 2 + DO m=0,Nloc + DO l=0,Nloc + DO k=0,Nloc + IF(U_N_Ray_loc(iElem)%U(iVar,k,l,m).GT.0.) RayElemEmission(iElem) = .TRUE. + END DO ! k + END DO ! l + END DO ! m + END DO ! iVar = 1, nVarRay + END DO ! iElem = 1, nElems +END ASSOCIATE + +CALL DatasetExists(File_ID,'RaySecondaryVectorX',ContainerExists) +IF(.NOT.ContainerExists) CALL CollectiveStop(__STAMP__,'RaySecondaryVectorX container does not exist in '//TRIM(RadiationVolState)) +CALL ReadArray('RaySecondaryVectorX',2,(/1_IK,INT(nElems,IK)/),INT(offsetElem,IK),2,RealArray=RaySecondaryVectorX) + +CALL DatasetExists(File_ID,'RaySecondaryVectorY',ContainerExists) +IF(.NOT.ContainerExists) CALL CollectiveStop(__STAMP__,'RaySecondaryVectorY container does not exist in '//TRIM(RadiationVolState)) +CALL ReadArray('RaySecondaryVectorY',2,(/1_IK,INT(nElems,IK)/),INT(offsetElem,IK),2,RealArray=RaySecondaryVectorY) + +CALL DatasetExists(File_ID,'RaySecondaryVectorZ',ContainerExists) +IF(.NOT.ContainerExists) CALL CollectiveStop(__STAMP__,'RaySecondaryVectorZ container does not exist in '//TRIM(RadiationVolState)) +CALL ReadArray('RaySecondaryVectorZ',2,(/1_IK,INT(nElems,IK)/),INT(offsetElem,IK),2,RealArray=RaySecondaryVectorZ) + +!WRITE (*,*) "RaySecondaryVectorX =", RaySecondaryVectorX +!WRITE (*,*) "RaySecondaryVectorY =", RaySecondaryVectorY +!WRITE (*,*) "RaySecondaryVectorZ =", RaySecondaryVectorZ +!WRITE (*,*) "TRIM(RadiationSurfState) =", TRIM(RadiationSurfState) +!read* +CALL CloseDataFile() +END SUBROUTINE ReadRayTracingDataFromH5 + + FUNCTION SetPhotonEnergy(iCNElem, Point, iWave) !=================================================================================================================================== !> Calculation of the vibrational temperature (zero-point search) for the TSHO (Truncated Simple Harmonic Oscillator) diff --git a/src/radiation/ray_tracing/raytrace_ini.f90 b/src/radiation/ray_tracing/raytrace_ini.f90 index 14079788b..14b840c99 100644 --- a/src/radiation/ray_tracing/raytrace_ini.f90 +++ b/src/radiation/ray_tracing/raytrace_ini.f90 @@ -184,19 +184,21 @@ SUBROUTINE InitHighOrderRaySampling() ! MODULES USE MOD_PreProc USE MOD_Globals ,ONLY: abort,IERROR,UNIT_StdOut -USE MOD_Mesh_Vars ,ONLY: nGlobalElems -USE MOD_RayTracing_Vars ,ONLY: N_VolMesh_Ray,N_DG_Ray,Ray,N_Inter_Ray,PREF_VDM_Ray,U_N_Ray,nVarRay +USE MOD_Mesh_Vars ,ONLY: nGlobalElems,nElems,offSetElem +!USE MOD_RayTracing_Vars ,ONLY: N_VolMesh_Ray +USE MOD_RayTracing_Vars ,ONLY: N_DG_Ray,Ray,U_N_Ray,U_N_Ray_loc,nVarRay,PerformRayTracing USE MOD_Mesh_Tools ,ONLY: GetCNElemID,GetGlobalElemID USE MOD_ReadInTools ,ONLY: GETREAL USE MOD_Particle_Mesh_Vars ,ONLY: ElemVolume_Shared,ElemBaryNGeo #if USE_MPI USE MPI -USE MOD_Particle_Mesh_Vars ,ONLY: NodeCoords_Shared +!USE MOD_Particle_Mesh_Vars ,ONLY: NodeCoords_Shared USE MOD_RayTracing_Vars ,ONLY: N_DG_Ray_Shared,N_DG_Ray_Shared_Win USE MOD_MPI_Shared USE MOD_MPI_Shared_Vars ,ONLY: MPI_COMM_SHARED,myComputeNodeRank,nComputeNodeProcessors,nComputeNodeTotalElems #else -USE MOD_Mesh_Vars ,ONLY: NodeCoords,nElems +!USE MOD_Mesh_Vars ,ONLY: NodeCoords +USE MOD_Mesh_Vars ,ONLY: nElems #endif /*USE_MPI*/ #if defined(CODE_ANALYZE) USE MOD_Globals ,ONLY: nProcessors @@ -206,7 +208,7 @@ SUBROUTINE InitHighOrderRaySampling() ! INPUT / OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -INTEGER :: Nloc,iCNElem,firstElem,lastElem,iGlobalElem +INTEGER :: Nloc,iCNElem,firstElem,lastElem,iGlobalElem,iElem REAL :: VolMin,VolMax,m,NReal #if defined(CODE_ANALYZE) INTEGER :: iElem,CNElemID @@ -215,223 +217,247 @@ SUBROUTINE InitHighOrderRaySampling() LOGICAL :: FoundElem CHARACTER(LEN=40) :: hilf !=================================================================================================================================== +! When ray tracing is performed, these arrays are created, otherwise (restart or no actual ray tracing) they are read from h5 +IF(PerformRayTracing)THEN + #if USE_MPI -CALL Allocate_Shared((/nGlobalElems/),N_DG_Ray_Shared_Win,N_DG_Ray_Shared) -CALL MPI_WIN_LOCK_ALL(0,N_DG_Ray_Shared_Win,IERROR) -N_DG_Ray => N_DG_Ray_Shared -! only CN root initializes -IF (myComputeNodeRank.EQ.0) N_DG_Ray = Ray%NMin ! default -! This sync/barrier is required as it cannot be guaranteed that the zeros have been written to memory by the time the MPI_REDUCE -! is executed (see MPI specification). Until the Sync is complete, the status is undefined, i.e., old or new value or utter nonsense. -CALL BARRIER_AND_SYNC(N_DG_Ray_Shared_Win,MPI_COMM_SHARED) + CALL Allocate_Shared((/nGlobalElems/),N_DG_Ray_Shared_Win,N_DG_Ray_Shared) + CALL MPI_WIN_LOCK_ALL(0,N_DG_Ray_Shared_Win,IERROR) + N_DG_Ray => N_DG_Ray_Shared + ! only CN root initializes + IF (myComputeNodeRank.EQ.0) N_DG_Ray = Ray%NMin ! default + ! This sync/barrier is required as it cannot be guaranteed that the zeros have been written to memory by the time the MPI_REDUCE + ! is executed (see MPI specification). Until the Sync is complete, the status is undefined, i.e., old or new value or utter nonsense. + CALL BARRIER_AND_SYNC(N_DG_Ray_Shared_Win,MPI_COMM_SHARED) #else -ALLOCATE(N_DG_Ray(nGlobalElems)) -N_DG_Ray = Ray%NMin ! default + ALLOCATE(N_DG_Ray(nGlobalElems)) + N_DG_Ray = Ray%NMin ! default #endif /*USE_MPI*/ -! Select volumetric resolution -IF(Ray%NMin.NE.Ray%NMax)THEN - ! Only set variable N if NMin and NMax are not the same - SELECT CASE(Ray%VolRefineMode) - CASE(0) - ! 0: do nothing (default) - CASE(1,2,3) - ! Set first and last elem loop indices + ! Select volumetric resolution + IF(Ray%NMin.NE.Ray%NMax)THEN + ! Only set variable N if NMin and NMax are not the same + SELECT CASE(Ray%VolRefineMode) + CASE(-1) + ! -1: odd elements 1, even elements NMax + DO iElem = 1, PP_nElems + IF(MOD(iElem,2).EQ.0)THEN + ! even + N_DG_Ray(iElem) = Ray%Nmax + ELSE + ! odd + N_DG_Ray(iElem) = 1 + END IF ! MOD(iElem,2).EQ.0 + END DO ! iElem = 1, PP_nElems + CASE(0) + ! 0: do nothing (default) + CASE(1,2,3) + ! Set first and last elem loop indices #if USE_MPI - firstElem = INT(REAL( myComputeNodeRank )*REAL(nComputeNodeTotalElems)/REAL(nComputeNodeProcessors))+1 - lastElem = INT(REAL((myComputeNodeRank+1))*REAL(nComputeNodeTotalElems)/REAL(nComputeNodeProcessors)) + firstElem = INT(REAL( myComputeNodeRank )*REAL(nComputeNodeTotalElems)/REAL(nComputeNodeProcessors))+1 + lastElem = INT(REAL((myComputeNodeRank+1))*REAL(nComputeNodeTotalElems)/REAL(nComputeNodeProcessors)) #else - firstElem = 1 - lastElem = nElems + firstElem = 1 + lastElem = nElems #endif - ! 1: refine below user-defined z-coordinate with NMax - IF(Ray%VolRefineMode.NE.2)THEN - WRITE(UNIT=hilf,FMT=WRITEFORMAT) 1.0E200!HUGE(1.0) -> HUGE produces IEEE overflow - Ray%VolRefineModeZ = GETREAL('RayTracing-VolRefineModeZ',TRIM(hilf)) - DO iCNElem = firstElem, lastElem - iGlobalElem = GetGlobalElemID(iCNElem) - !IPWRITE(UNIT_StdOut,*) "iCNElem,iGlobalElem =", iCNElem,iGlobalElem - IF(ElemBaryNGeo(3,iCNElem).LT.Ray%VolRefineModeZ)THEN - N_DG_Ray(iGlobalElem) = Ray%Nmax - ELSE - N_DG_Ray(iGlobalElem) = Ray%Nmin - END IF ! ElemBaryNGeo(3,iCNElem).LT.Ray%VolRefineModeZ - END DO ! iCNElem = firstElem, lastElem - ELSE - Ray%VolRefineModeZ = 1.0E200 ! dummy - END IF ! Ray%VolRefineMode.NE.2 - - ! 2: scale N according to the mesh element volume between NMin>=1 and NMax>=2 - ! 3: refine below user-defined z-coordinate and scale N according to the mesh element volume between NMin>=1 and NMax>=2 - ! (consider only elements below the user-defined z-coordinate for the scaling) - IF((Ray%VolRefineMode.EQ.2).OR.(Ray%VolRefineMode.EQ.3))THEN - ! Get global min and max volume: Only consider elements below the z-coordinate - VolMin = HUGE(1.) - VolMax = -HUGE(1.) - FoundElem = .FALSE. - DO iCNElem = firstElem, lastElem - iGlobalElem = GetGlobalElemID(iCNElem) - IF((ElemBaryNGeo(3,iCNElem).LT.Ray%VolRefineModeZ).OR.(Ray%VolRefineMode.EQ.2))THEN - VolMin = MIN(VolMin, ElemVolume_Shared(iCNElem)) - VolMax = MAX(VolMax, ElemVolume_Shared(iCNElem)) - FoundElem = .TRUE. - END IF - END DO ! iCNElem = firstElem, lastElem + ! 1: refine below user-defined z-coordinate with NMax + IF(Ray%VolRefineMode.NE.2)THEN + WRITE(UNIT=hilf,FMT=WRITEFORMAT) 1.0E200!HUGE(1.0) -> HUGE produces IEEE overflow + Ray%VolRefineModeZ = GETREAL('RayTracing-VolRefineModeZ',TRIM(hilf)) + DO iCNElem = firstElem, lastElem + iGlobalElem = GetGlobalElemID(iCNElem) + !IPWRITE(UNIT_StdOut,*) "iCNElem,iGlobalElem =", iCNElem,iGlobalElem + IF(ElemBaryNGeo(3,iCNElem).LT.Ray%VolRefineModeZ)THEN + N_DG_Ray(iGlobalElem) = Ray%Nmax + ELSE + N_DG_Ray(iGlobalElem) = Ray%Nmin + END IF ! ElemBaryNGeo(3,iCNElem).LT.Ray%VolRefineModeZ + END DO ! iCNElem = firstElem, lastElem + ELSE + Ray%VolRefineModeZ = 1.0E200 ! dummy + END IF ! Ray%VolRefineMode.NE.2 + + ! 2: scale N according to the mesh element volume between NMin>=1 and NMax>=2 + ! 3: refine below user-defined z-coordinate and scale N according to the mesh element volume between NMin>=1 and NMax>=2 + ! (consider only elements below the user-defined z-coordinate for the scaling) + IF((Ray%VolRefineMode.EQ.2).OR.(Ray%VolRefineMode.EQ.3))THEN + ! Get global min and max volume: Only consider elements below the z-coordinate + VolMin = HUGE(1.) + VolMax = -HUGE(1.) + FoundElem = .FALSE. + DO iCNElem = firstElem, lastElem + iGlobalElem = GetGlobalElemID(iCNElem) + IF((ElemBaryNGeo(3,iCNElem).LT.Ray%VolRefineModeZ).OR.(Ray%VolRefineMode.EQ.2))THEN + VolMin = MIN(VolMin, ElemVolume_Shared(iCNElem)) + VolMax = MAX(VolMax, ElemVolume_Shared(iCNElem)) + FoundElem = .TRUE. + END IF + END DO ! iCNElem = firstElem, lastElem #if USE_MPI - CALL MPI_ALLREDUCE(MPI_IN_PLACE, VolMin, 1, MPI_DOUBLE_PRECISION, MPI_MIN, MPI_COMM_WORLD, IERROR) - CALL MPI_ALLREDUCE(MPI_IN_PLACE, VolMax, 1, MPI_DOUBLE_PRECISION, MPI_MAX, MPI_COMM_WORLD, IERROR) + CALL MPI_ALLREDUCE(MPI_IN_PLACE, VolMin, 1, MPI_DOUBLE_PRECISION, MPI_MIN, MPI_COMM_WORLD, IERROR) + CALL MPI_ALLREDUCE(MPI_IN_PLACE, VolMax, 1, MPI_DOUBLE_PRECISION, MPI_MAX, MPI_COMM_WORLD, IERROR) #endif /*USE_MPI*/ - ! Loop over all elements again and scale the polynomial degree using NINT. - ! Check if the volumes of the elements are almost equal - IF((VolMax.GT.VolMin).AND.(.NOT.ALMOSTEQUALRELATIVE(VolMax,VolMin,1e-2)))THEN - ! Get the slope of the linear interpolation function between the maximum and minimum of the element volumes - m = REAL(Ray%Nmax-Ray%Nmin)/(VolMax-VolMin) - IF(FoundElem)THEN - ! Loop over process elements - DO iCNElem = firstElem, lastElem - iGlobalElem = GetGlobalElemID(iCNElem) - IF(ElemBaryNGeo(3,iCNElem).LT.Ray%VolRefineModeZ)THEN - NReal = m * (ElemVolume_Shared(iCNElem)-VolMin) + REAL(Ray%Nmin) - N_DG_Ray(iGlobalElem) = NINT(NReal) - END IF - END DO ! iCNElem = firstElem, lastElem - END IF ! FoundElem - END IF ! (VolMax.GT.VolMin).AND.(.NOT.ALMOST) - - END IF ! Ray%VolRefineMode.EQ.3 - CASE DEFAULT - ! Debugging: + ! Loop over all elements again and scale the polynomial degree using NINT. + ! Check if the volumes of the elements are almost equal + IF((VolMax.GT.VolMin).AND.(.NOT.ALMOSTEQUALRELATIVE(VolMax,VolMin,1e-2)))THEN + ! Get the slope of the linear interpolation function between the maximum and minimum of the element volumes + m = REAL(Ray%Nmax-Ray%Nmin)/(VolMax-VolMin) + IF(FoundElem)THEN + ! Loop over process elements + DO iCNElem = firstElem, lastElem + iGlobalElem = GetGlobalElemID(iCNElem) + IF(ElemBaryNGeo(3,iCNElem).LT.Ray%VolRefineModeZ)THEN + NReal = m * (ElemVolume_Shared(iCNElem)-VolMin) + REAL(Ray%Nmin) + N_DG_Ray(iGlobalElem) = NINT(NReal) + END IF + END DO ! iCNElem = firstElem, lastElem + END IF ! FoundElem + END IF ! (VolMax.GT.VolMin).AND.(.NOT.ALMOST) + + END IF ! Ray%VolRefineMode.EQ.3 + CASE DEFAULT + ! Debugging: #if defined(CODE_ANALYZE) - IF(nProcessors.GT.1) CALL abort(__STAMP__,'This only works for single-core runs') - ! 3D box test case with diagonal rays - IF(debugRay)THEN - N_DG_Ray = Ray%Nmax - DO iElem = 1, PP_nElems - CNElemID = GetCNElemID(iElem) - ASSOCIATE( & - x => ElemBaryNGeo(1,CNElemID),& - y => ElemBaryNGeo(2,CNElemID),& - z => ElemBaryNGeo(3,CNElemID)) - IF(y+z.GE.1.40)THEN - N_DG_Ray(iElem) = 1 - CYCLE - END IF ! y+z.GT.1.5 - - IF(y+z.LE.0.6)THEN - N_DG_Ray(iElem) = 1 - CYCLE - END IF ! y+z.LT.0.5 - - IF(y+z.LT.0.9)THEN - N_DG_Ray(iElem) = Ray%Nmax-1 - CYCLE - END IF ! y+z.GT.1.00001 - - IF(y+z.GT.1.1)THEN - N_DG_Ray(iElem) = Ray%Nmax-1 - CYCLE - END IF ! y+z.GT.1.00001 - END ASSOCIATE - END DO ! iElem = 1, PP_nElems - END IF ! debugRay + IF(nProcessors.GT.1) CALL abort(__STAMP__,'This only works for single-core runs') + ! 3D box test case with diagonal rays + IF(debugRay)THEN + N_DG_Ray = Ray%Nmax + DO iElem = 1, PP_nElems + CNElemID = GetCNElemID(iElem) + ASSOCIATE( & + x => ElemBaryNGeo(1,CNElemID),& + y => ElemBaryNGeo(2,CNElemID),& + z => ElemBaryNGeo(3,CNElemID)) + IF(y+z.GE.1.40)THEN + N_DG_Ray(iElem) = 1 + CYCLE + END IF ! y+z.GT.1.5 + + IF(y+z.LE.0.6)THEN + N_DG_Ray(iElem) = 1 + CYCLE + END IF ! y+z.LT.0.5 + + IF(y+z.LT.0.9)THEN + N_DG_Ray(iElem) = Ray%Nmax-1 + CYCLE + END IF ! y+z.GT.1.00001 + + IF(y+z.GT.1.1)THEN + N_DG_Ray(iElem) = Ray%Nmax-1 + CYCLE + END IF ! y+z.GT.1.00001 + END ASSOCIATE + END DO ! iElem = 1, PP_nElems + END IF ! debugRay #else - CALL abort(__STAMP__,'RayTracing-VolRefineMode unknown: ',IntInfoOpt=Ray%VolRefineMode) + CALL abort(__STAMP__,'RayTracing-VolRefineMode unknown: ',IntInfoOpt=Ray%VolRefineMode) #endif /*defined(CODE_ANALYZE)*/ - END SELECT + END SELECT #if USE_MPI - CALL BARRIER_AND_SYNC(N_DG_Ray_Shared_Win,MPI_COMM_SHARED) + CALL BARRIER_AND_SYNC(N_DG_Ray_Shared_Win,MPI_COMM_SHARED) #endif /*USE_MPI*/ -END IF ! Ray%NMin.NE.Ray%NMax + END IF ! Ray%NMin.NE.Ray%NMax -! Sanity check -IF(ANY(N_DG_Ray.LE.0)) CALL abort(__STAMP__,'N_DG_Ray cannot contain zeros!') + ! Sanity check + IF(ANY(N_DG_Ray.LE.0)) CALL abort(__STAMP__,'N_DG_Ray cannot contain zeros!') -! Allocate interpolation variables -ALLOCATE(N_Inter_Ray(Ray%Nmin:Ray%Nmax)) -! Allocate Vandermonde matrices for p-refinement -ALLOCATE(PREF_VDM_Ray(Ray%Nmin:Ray%Nmax,Ray%Nmin:Ray%Nmax)) -CALL BuildNInterAndVandermonde() - -ALLOCATE(N_VolMesh_Ray(1:nGlobalElems)) + !ALLOCATE(N_VolMesh_Ray(1:nGlobalElems)) #if USE_MPI -CALL BuildElem_xGP_RayTrace(NodeCoords_Shared) + !CALL BuildElem_xGP_RayTrace(NodeCoords_Shared) #else -CALL BuildElem_xGP_RayTrace(NodeCoords) + !CALL BuildElem_xGP_RayTrace(NodeCoords) #endif /*USE_MPI*/ -! the local DG solution in physical and reference space -ALLOCATE(U_N_Ray(1:nGlobalElems)) -DO iGlobalElem = 1, nGlobalElems - Nloc = N_DG_Ray(iGlobalElem) - ALLOCATE(U_N_Ray(iGlobalElem)%U(nVarRay,0:Nloc,0:Nloc,0:Nloc)) - U_N_Ray(iGlobalElem)%U = 0. -END DO ! iGlobalElem = 1, nGlobalElems + ! The global DG solution in physical space + ALLOCATE(U_N_Ray(1:nGlobalElems)) + DO iGlobalElem = 1, nGlobalElems + Nloc = N_DG_Ray(iGlobalElem) + ALLOCATE(U_N_Ray(iGlobalElem)%U(nVarRay,0:Nloc,0:Nloc,0:Nloc)) + U_N_Ray(iGlobalElem)%U = 0. + END DO ! iGlobalElem = 1, nGlobalElems -END SUBROUTINE InitHighOrderRaySampling + ! The local DG solution in physical space + ALLOCATE(U_N_Ray_loc(1:nElems)) + DO iElem = 1, nElems + Nloc = N_DG_Ray(iElem+offSetElem) + ALLOCATE(U_N_Ray_loc(iElem)%U(nVarRay,0:Nloc,0:Nloc,0:Nloc)) + U_N_Ray_loc(iElem)%U = 0. + END DO ! iElem = 1, nElems +ELSE -!================================================================================================================================== -!> This routine takes the equidistant node coordinates of the mesh (on NGeo+1 points) and uses them to build the coordinates -!> of solution/interpolation points of type NodeType on polynomial degree Nloc (Nloc+1 points per direction). -!> Output: Elem_xGP(:,:,:,:) for each element with variably N -!================================================================================================================================== -SUBROUTINE BuildElem_xGP_RayTrace(NodeCoords) -! MODULES -USE MOD_Globals -USE MOD_PreProc -USE MOD_Mesh_Vars ,ONLY: NGeo,nGlobalElems -USE MOD_Interpolation_Vars ,ONLY: NodeTypeCL,NodeTypeVISU,NodeType -USE MOD_RayTracing_Vars ,ONLY: Ray,N_VolMesh_Ray,N_DG_Ray -USE MOD_Interpolation ,ONLY: GetVandermonde,GetNodesAndWeights -USE MOD_ChangeBasis ,ONLY: ChangeBasis3D_XYZ, ChangeBasis3D -USE MOD_Basis ,ONLY: LagrangeInterpolationPolys -!---------------------------------------------------------------------------------------------------------------------------------- -IMPLICIT NONE -!---------------------------------------------------------------------------------------------------------------------------------- -! INPUT/OUTPUT VARIABLES -REAL,INTENT(IN) :: NodeCoords(3,0:NGeo,0:NGeo,0:NGeo,nGlobalElems) !< Equidistant mesh coordinates -!---------------------------------------------------------------------------------------------------------------------------------- -! LOCAL VARIABLES -INTEGER :: iGlobalElem,Nloc +END IF ! PerformRayTracing -TYPE VdmType - REAL, ALLOCATABLE :: Vdm_EQNGeo_CLNloc(:,:) - REAL, ALLOCATABLE :: Vdm_CLNloc_Nloc (:,:) -END TYPE VdmType -TYPE(VdmType), DIMENSION(:), ALLOCATABLE :: Vdm - -!================================================================================================================================== - -! Build Vdm for every degree -ALLOCATE(Vdm(Ray%Nmin:Ray%Nmax)) -DO Nloc = Ray%Nmin, Ray%Nmax - ALLOCATE(Vdm(Nloc)%Vdm_EQNGeo_CLNloc(0:Nloc,0:NGeo)) - ALLOCATE(Vdm(Nloc)%Vdm_CLNloc_Nloc(0:Nloc,0:Nloc)) - CALL GetVandermonde(NGeo, NodeTypeVISU, NLoc, NodeTypeCL, Vdm(Nloc)%Vdm_EQNGeo_CLNloc, modal=.FALSE.) - CALL GetVandermonde(Nloc, NodeTypeCL , Nloc, NodeType , Vdm(Nloc)%Vdm_CLNloc_Nloc, modal=.FALSE.) - - ! NOTE: Transform intermediately to CL points, to be consistent with metrics being built with CL - ! Important for curved meshes if NGeo=NGeo - - !1.a) Transform from EQUI_NGeo to solution points on Nloc - Vdm(Nloc)%Vdm_EQNGeo_CLNloc=MATMUL(Vdm(Nloc)%Vdm_CLNloc_Nloc, Vdm(Nloc)%Vdm_EQNGeo_CLNloc) -END DO ! Nloc = Ray%Nmin, Ray%Nmax +CALL BuildNInterAndVandermonde() -! Set Elem_xGP for each element -DO iGlobalElem=1,nGlobalElems - Nloc = N_DG_Ray(iGlobalElem) - ! TODO: Currently each process has all global xGP (maybe put unrolled into a shared array) - ALLOCATE(N_VolMesh_Ray(iGlobalElem)%Elem_xGP(3,0:Nloc,0:Nloc,0:Nloc)) - CALL ChangeBasis3D(3,NGeo,Nloc,Vdm(Nloc)%Vdm_EQNGeo_CLNloc,NodeCoords(:,:,:,:,iGlobalElem),& - N_VolMesh_Ray(iGlobalElem)%Elem_xGP(:,:,:,:)) +END SUBROUTINE InitHighOrderRaySampling -END DO -END SUBROUTINE BuildElem_xGP_RayTrace +!!================================================================================================================================== +!!> This routine takes the equidistant node coordinates of the mesh (on NGeo+1 points) and uses them to build the coordinates +!!> of solution/interpolation points of type NodeType on polynomial degree Nloc (Nloc+1 points per direction). +!!> Output: Elem_xGP(:,:,:,:) for each element with variably N +!!================================================================================================================================== +!SUBROUTINE BuildElem_xGP_RayTrace(NodeCoords) +!! MODULES +!USE MOD_Globals +!USE MOD_PreProc +!USE MOD_Mesh_Vars ,ONLY: NGeo,nGlobalElems +!USE MOD_Interpolation_Vars ,ONLY: NodeTypeCL,NodeTypeVISU,NodeType +!USE MOD_RayTracing_Vars ,ONLY: Ray,N_VolMesh_Ray,N_DG_Ray +!USE MOD_Interpolation ,ONLY: GetVandermonde,GetNodesAndWeights +!USE MOD_ChangeBasis ,ONLY: ChangeBasis3D_XYZ, ChangeBasis3D +!USE MOD_Basis ,ONLY: LagrangeInterpolationPolys +!!---------------------------------------------------------------------------------------------------------------------------------- +!IMPLICIT NONE +!!---------------------------------------------------------------------------------------------------------------------------------- +!! INPUT/OUTPUT VARIABLES +!REAL,INTENT(IN) :: NodeCoords(3,0:NGeo,0:NGeo,0:NGeo,nGlobalElems) !< Equidistant mesh coordinates +!!---------------------------------------------------------------------------------------------------------------------------------- +!! LOCAL VARIABLES +!INTEGER :: iGlobalElem,Nloc +! +!TYPE VdmType +! REAL, ALLOCATABLE :: Vdm_EQNGeo_CLNloc(:,:) +! REAL, ALLOCATABLE :: Vdm_CLNloc_Nloc (:,:) +!END TYPE VdmType +! +!TYPE(VdmType), DIMENSION(:), ALLOCATABLE :: Vdm +! +!!================================================================================================================================== +! +!! Build Vdm for every degree +!ALLOCATE(Vdm(Ray%Nmin:Ray%Nmax)) +!DO Nloc = Ray%Nmin, Ray%Nmax +! ALLOCATE(Vdm(Nloc)%Vdm_EQNGeo_CLNloc(0:Nloc,0:NGeo)) +! ALLOCATE(Vdm(Nloc)%Vdm_CLNloc_Nloc(0:Nloc,0:Nloc)) +! CALL GetVandermonde(NGeo, NodeTypeVISU, NLoc, NodeTypeCL, Vdm(Nloc)%Vdm_EQNGeo_CLNloc, modal=.FALSE.) +! CALL GetVandermonde(Nloc, NodeTypeCL , Nloc, NodeType , Vdm(Nloc)%Vdm_CLNloc_Nloc, modal=.FALSE.) +! +! ! NOTE: Transform intermediately to CL points, to be consistent with metrics being built with CL +! ! Important for curved meshes if NGeo=NGeo +! +! !1.a) Transform from EQUI_NGeo to solution points on Nloc +! Vdm(Nloc)%Vdm_EQNGeo_CLNloc=MATMUL(Vdm(Nloc)%Vdm_CLNloc_Nloc, Vdm(Nloc)%Vdm_EQNGeo_CLNloc) +!END DO ! Nloc = Ray%Nmin, Ray%Nmax +! +!! Set Elem_xGP for each element +!DO iGlobalElem=1,nGlobalElems +! Nloc = N_DG_Ray(iGlobalElem) +! +! ! TODO: Currently each process has all global xGP (maybe put unrolled into a shared array) +! ALLOCATE(N_VolMesh_Ray(iGlobalElem)%Elem_xGP(3,0:Nloc,0:Nloc,0:Nloc)) +! CALL ChangeBasis3D(3,NGeo,Nloc,Vdm(Nloc)%Vdm_EQNGeo_CLNloc,NodeCoords(:,:,:,:,iGlobalElem),& +! N_VolMesh_Ray(iGlobalElem)%Elem_xGP(:,:,:,:)) +! +!END DO +! +!END SUBROUTINE BuildElem_xGP_RayTrace !=================================================================================================================================== @@ -440,7 +466,7 @@ END SUBROUTINE BuildElem_xGP_RayTrace !=================================================================================================================================== SUBROUTINE BuildNInterAndVandermonde() ! MODULES -USE MOD_RayTracing_Vars ,ONLY: Ray,N_Inter_Ray,PREF_VDM_Ray +USE MOD_RayTracing_Vars ,ONLY: Ray,N_Inter_Ray,PREF_VDM_Ray,PerformRayTracing USE MOD_Interpolation ,ONLY: InitInterpolationBasis,GetVandermonde IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------! @@ -450,6 +476,9 @@ SUBROUTINE BuildNInterAndVandermonde() INTEGER :: i,j,Nin,Nout,Nloc REAL, DIMENSION(:), ALLOCATABLE :: MappedGauss(:) !=================================================================================================================================== +! Allocate interpolation variables +ALLOCATE(N_Inter_Ray(Ray%Nmin:Ray%Nmax)) + DO Nloc=Ray%Nmin,Ray%Nmax ! Build basis for polynomial of degree Nloc CALL InitInterpolationBasis(Nloc , N_Inter_Ray(Nloc)%xGP , N_Inter_Ray(Nloc)%wGP , N_Inter_Ray(Nloc)%wBary , & @@ -473,26 +502,31 @@ SUBROUTINE BuildNInterAndVandermonde() END DO - -! Fill Vandermonde matrices for p-refinement -DO Nin=Ray%Nmin,Ray%Nmax - DO Nout=Ray%Nmin,Ray%Nmax - ALLOCATE(PREF_VDM_Ray(Nin,Nout)%Vdm(0:Nin,0:Nout)) - IF(Nin.EQ.Nout) THEN - DO i=0,Nin; DO j=0,Nin - IF(i.EQ.j) THEN - PREF_VDM_Ray(Nin,Nout)%Vdm(i,j) = 1. - ELSE - PREF_VDM_Ray(Nin,Nout)%Vdm(i,j) = 0. - END IF +! Only allocate the following arrays when actual ray tracing is performed +IF(PerformRayTracing)THEN + ! Allocate Vandermonde matrices for p-refinement + ALLOCATE(PREF_VDM_Ray(Ray%Nmin:Ray%Nmax,Ray%Nmin:Ray%Nmax)) + + ! Fill Vandermonde matrices for p-refinement + DO Nin=Ray%Nmin,Ray%Nmax + DO Nout=Ray%Nmin,Ray%Nmax + ALLOCATE(PREF_VDM_Ray(Nin,Nout)%Vdm(0:Nin,0:Nout)) + IF(Nin.EQ.Nout) THEN + DO i=0,Nin; DO j=0,Nin + IF(i.EQ.j) THEN + PREF_VDM_Ray(Nin,Nout)%Vdm(i,j) = 1. + ELSE + PREF_VDM_Ray(Nin,Nout)%Vdm(i,j) = 0. + END IF + END DO END DO - END DO - ELSE IF(Nin.GT.Nout) THEN ! p-coarsening: Project from higher degree to lower degree - CALL GetVandermonde(Nin, Ray%NodeType, Nout, Ray%NodeType, PREF_VDM_Ray(Nin,Nout)%Vdm, modal=.TRUE. ) - ELSE ! p-refinement: Interpolate lower degree to higher degree - CALL GetVandermonde(Nin, Ray%NodeType, Nout, Ray%NodeType, PREF_VDM_Ray(Nin,Nout)%Vdm, modal=.FALSE.) - END IF -END DO;END DO + ELSE IF(Nin.GT.Nout) THEN ! p-coarsening: Project from higher degree to lower degree + CALL GetVandermonde(Nin, Ray%NodeType, Nout, Ray%NodeType, PREF_VDM_Ray(Nin,Nout)%Vdm, modal=.TRUE. ) + ELSE ! p-refinement: Interpolate lower degree to higher degree + CALL GetVandermonde(Nin, Ray%NodeType, Nout, Ray%NodeType, PREF_VDM_Ray(Nin,Nout)%Vdm, modal=.FALSE.) + END IF + END DO;END DO +END IF ! PerformRayTracing END SUBROUTINE BuildNInterAndVandermonde @@ -516,44 +550,51 @@ SUBROUTINE FinalizeRayTracing() ! LOCAL VARIABLES !=================================================================================================================================== +! Check if ray tracing is used IF(.NOT.UseRayTracing) RETURN -SDEALLOCATE(N_VolMesh_Ray) -SDEALLOCATE(N_Inter_Ray) -SDEALLOCATE(PREF_VDM_Ray) -SDEALLOCATE(U_N_Ray) -SDEALLOCATE(RayElemPassedEnergy) -! TODO: call this finalize with 2 modes (1. after ray tracing, 2. after plasma simulation) -!SDEALLOCATE(PhotonSampWall) -! TODO: see above: deallocate these arrays after simulation end because otherwise these fields will be corrupt in the state file -! and that canc ause confusion -!SDEALLOCATE(N_DG_Ray_loc) -!SDEALLOCATE(RayElemPassedEnergyLoc1st) -!SDEALLOCATE(RayElemPassedEnergyLoc2nd) -!SDEALLOCATE(RaySecondaryVectorX) -!SDEALLOCATE(RaySecondaryVectorY) -!SDEALLOCATE(RaySecondaryVectorZ) -!SDEALLOCATE(ElemVolume) - -IF(.NOT.PerformRayTracing) RETURN - -IF(nProcessors.GT.1)THEN -#if USE_MPI - SDEALLOCATE(RayElemOffset) +! Check if actual ray tracing through the domain is performed +IF(PerformRayTracing)THEN + ! 1: after ray tracing is performed + SDEALLOCATE(RayElemPassedEnergy) + SDEALLOCATE(U_N_Ray) ! ray tracing + SDEALLOCATE(PREF_VDM_Ray) ! ray tracing + CALL MPI_BARRIER(MPI_COMM_SHARED,iError) CALL UNLOCK_AND_FREE(RayElemPassedEnergy_Shared_Win) - CALL UNLOCK_AND_FREE(RayElemPassedEnergyHO_Shared_Win) + +#if USE_MPI + IF(nProcessors.GT.1)THEN + SDEALLOCATE(RayElemOffset) + CALL UNLOCK_AND_FREE(RayElemPassedEnergyHO_Shared_Win) + END IF ! nProcessors.GT.1 + + CALL UNLOCK_AND_FREE(N_DG_Ray_Shared_Win) + CALL MPI_BARRIER(MPI_COMM_SHARED,iError) + ADEALLOCATE(RayElemPassedEnergy_Shared) ADEALLOCATE(RayElemPassedEnergyHO_Shared) + ADEALLOCATE(N_DG_Ray_Shared) #endif /*USE_MPI*/ -END IF ! nProcessors.GT.1 -#if USE_MPI -CALL MPI_BARRIER(MPI_COMM_SHARED,iError) -CALL UNLOCK_AND_FREE(N_DG_Ray_Shared_Win) -CALL MPI_BARRIER(MPI_COMM_SHARED,iError) -ADEALLOCATE(N_DG_Ray_Shared) -#endif /*USE_MPI*/ +ELSE + ! 2: at the end of the simulation or during load balance + SDEALLOCATE(U_N_Ray_loc) ! ray tracing + plasma simulation + SDEALLOCATE(N_DG_Ray_loc) ! ray tracing + plasma simulation + SDEALLOCATE(N_Inter_Ray) ! ray tracing + plasma simulation + + ! TODO: see above: deallocate these arrays after simulation end because otherwise these fields will be corrupt in the state file + ! and that can cause confusion + SDEALLOCATE(RayElemPassedEnergyLoc1st) + SDEALLOCATE(RayElemPassedEnergyLoc2nd) + SDEALLOCATE(RaySecondaryVectorX) + SDEALLOCATE(RaySecondaryVectorY) + SDEALLOCATE(RaySecondaryVectorZ) + SDEALLOCATE(ElemVolume) + + SDEALLOCATE(RayElemEmission) +END IF ! PerformRayTracing + END SUBROUTINE FinalizeRayTracing END MODULE MOD_RayTracing_Init diff --git a/src/radiation/ray_tracing/raytrace_vars.f90 b/src/radiation/ray_tracing/raytrace_vars.f90 index 8f22fe721..4a9aa4398 100644 --- a/src/radiation/ray_tracing/raytrace_vars.f90 +++ b/src/radiation/ray_tracing/raytrace_vars.f90 @@ -71,6 +71,7 @@ MODULE MOD_RayTracing_Vars TYPE (tRadTrans) :: RadTrans !< LOGICAL :: RayForceAbsorption !< Surface photon sampling is performed independent of the actual absorption/reflection outcome (default=T) +LOGICAL, ALLOCATABLE :: RayElemEmission(:) !< Flag elements that are relevant for volume photoionization INTEGER :: NumRays !< INTEGER :: RayPartBound !< Particle boundary ID where rays are emitted from @@ -94,7 +95,7 @@ MODULE MOD_RayTracing_Vars ! Output of high-order p-adaptive info INTEGER,PARAMETER :: nVarRay=3 !< Number of variables for higher-order sampling for volume ray tracing -INTEGER,ALLOCATABLE :: N_DG_Ray_loc(:) !< for output to ElemData +INTEGER,ALLOCATABLE :: N_DG_Ray_loc(:) !< for output to ElemData and usage in emission routines INTEGER,ALLOCPOINT :: N_DG_Ray(:) !< polynomial degree inside DG element for higher-order sampling for volume ray tracing, size(nElems) #if USE_MPI INTEGER :: N_DG_Ray_Shared_Win @@ -108,15 +109,16 @@ MODULE MOD_RayTracing_Vars ! DG solution (JU or U) vectors TYPE(N_U_Vol),ALLOCATABLE :: U_N_Ray(:) !< Solution variable for each equation, node and element, +TYPE(N_U_Vol),ALLOCATABLE :: U_N_Ray_loc(:) !< Solution variable for each equation, node and element, !----------------------------------------------------------------------------------------------------------------------------------- ! Volume mesh variables !----------------------------------------------------------------------------------------------------------------------------------- -TYPE, PUBLIC :: VolMesh - REAL,ALLOCATABLE :: Elem_xGP(:,:,:,:) !< XYZ positions (first index 1:3) of the volume Gauss Point -END TYPE VolMesh +!TYPE, PUBLIC :: VolMesh + !REAL,ALLOCATABLE :: Elem_xGP(:,:,:,:) !< XYZ positions (first index 1:3) of the volume Gauss Point +!END TYPE VolMesh -TYPE(VolMesh),ALLOCATABLE :: N_VolMesh_Ray(:) !< Array to store Mesh metrics object "VolMesh" +!TYPE(VolMesh),ALLOCATABLE :: N_VolMesh_Ray(:) !< Array to store Mesh metrics object "VolMesh" !----------------------------------------------------------------------------------------------------------------------------------- ! Interpolation variables diff --git a/src/timedisc/timedisc.f90 b/src/timedisc/timedisc.f90 index 5314dc702..6f1b15ab4 100644 --- a/src/timedisc/timedisc.f90 +++ b/src/timedisc/timedisc.f90 @@ -91,7 +91,6 @@ SUBROUTINE TimeDisc() #endif /*PARTICLES*/ #ifdef PARTICLES USE MOD_RayTracing ,ONLY: RayTracing -USE MOD_RayTracing_Init ,ONLY: FinalizeRayTracing !USE MOD_PICDepo ,ONLY: Deposition USE MOD_Particle_Vars ,ONLY: DoImportIMDFile #if USE_MPI @@ -206,10 +205,8 @@ SUBROUTINE TimeDisc() ! Ray tracing #if defined(PARTICLES) -IF(.NOT.DoRestart)THEN - CALL RayTracing() - CALL FinalizeRayTracing() -END IF +!IF(.NOT.DoRestart) +CALL RayTracing() #endif /*defined(PARTICLES)*/ CALL PrintStatusLine(time,dt,tStart,tEnd,1) From d41ec57af6b56bd900d0f0d383add5f70e4a19d8 Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Thu, 27 Jul 2023 00:10:38 +0200 Subject: [PATCH 126/495] Photo-ionization in the volume based on the raytracing result --- src/particles/dsmc/dsmc_bg_gas.f90 | 10 +- src/particles/dsmc/dsmc_chemical_init.f90 | 5 + .../dsmc/dsmc_chemical_reactions.f90 | 45 ++- src/particles/emission/particle_emission.f90 | 6 +- .../emission/particle_photoionization.f90 | 262 +++++++++++++++++- src/particles/mcc/mcc_xsec.f90 | 3 +- src/posti/superB/superB_tools.f90 | 2 +- src/radiation/ray_tracing/raytrace_ini.f90 | 5 +- src/radiation/ray_tracing/raytrace_vars.f90 | 2 + 9 files changed, 304 insertions(+), 36 deletions(-) diff --git a/src/particles/dsmc/dsmc_bg_gas.f90 b/src/particles/dsmc/dsmc_bg_gas.f90 index dcbddbd00..b07f9f364 100644 --- a/src/particles/dsmc/dsmc_bg_gas.f90 +++ b/src/particles/dsmc/dsmc_bg_gas.f90 @@ -785,6 +785,10 @@ SUBROUTINE BGGas_PhotoIonization(iSpec,iInit,TotalNbrOfReactions) !> 4.) Perform the reaction, distribute the collision energy (including photon energy) and emit electrons perpendicular !> to the photon's path +ASSOCIATE(b1 => Species(iSpec)%Init(iInit)%NormalVector1IC(1:3) ,& + b2 => Species(iSpec)%Init(iInit)%NormalVector2IC(1:3) ,& + normal => Species(iSpec)%Init(iInit)%NormalIC ,& + PartBCIndex => Species(iSpec)%Init(iInit)%PartBCIndex) IF(NbrOfPhotonXsecReactions.GT.0)THEN DO iPart = 1, SUM(NumPhotoIonization(:)) ! Loop over all randomized lines (found above) @@ -797,10 +801,9 @@ SUBROUTINE BGGas_PhotoIonization(iSpec,iInit,TotalNbrOfReactions) DO iPhotoReac = 1, NbrOfPhotonXsecReactions IF(PhotonEnergies(iLine,1+iPhotoReac).GT.0)THEN ! Reduce cross-section by one - !IPWRITE(UNIT_StdOut,'(I6,3(A,I3))') " calling iLine =",iLine," iPhotoReac =",iPhotoReac," iReac =",PhotoReacToReac(iPhotoReac) PhotonEnergies(iLine,1+iPhotoReac) = PhotonEnergies(iLine,1+iPhotoReac) - 1 iPair = iPair + 1 - CALL PhotoIonization_InsertProducts(iPair, PhotoReacToReac(iPhotoReac), iInit, iSpec, iLineOpt=iLine) + CALL PhotoIonization_InsertProducts(iPair, PhotoReacToReac(iPhotoReac), b1, b2, normal, iLineOpt=iLine, PartBCIndex=PartBCIndex) END IF ! PhotonEnergies(iLine,1+iPhotoReac).GT.0 END DO ! iPhotoReac = 1, NbrOfPhotonXsecReactions END DO @@ -811,10 +814,11 @@ SUBROUTINE BGGas_PhotoIonization(iSpec,iInit,TotalNbrOfReactions) IF(TRIM(ChemReac%ReactModel(iReac)).NE.'phIon') CYCLE DO iPart = 1, NumPhotoIonization(iReac) iPair = iPair + 1 - CALL PhotoIonization_InsertProducts(iPair, iReac, iInit, iSpec) + CALL PhotoIonization_InsertProducts(iPair, iReac, b1, b2, normal, PartBCIndex=PartBCIndex) END DO END DO END IF ! NbrOfPhotonXsecReactions.GT.0 +END ASSOCIATE ! Advance particle vector length and the current next free position with newly created particles PDM%ParticleVecLength = PDM%ParticleVecLength + DSMCSumOfFormedParticles diff --git a/src/particles/dsmc/dsmc_chemical_init.f90 b/src/particles/dsmc/dsmc_chemical_init.f90 index ef42f2ad3..b0cccd4c1 100644 --- a/src/particles/dsmc/dsmc_chemical_init.f90 +++ b/src/particles/dsmc/dsmc_chemical_init.f90 @@ -774,6 +774,7 @@ SUBROUTINE InitPhotonReactions() USE MOD_PARTICLE_Vars ,ONLY: nSpecies USE MOD_RayTracing_Vars ,ONLY: RayPartBound,Ray USE MOD_Particle_Vars ,ONLY: Species +USE MOD_MCC_Vars ,ONLY: NbrOfPhotonXsecReactions IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------! ! INPUT / OUTPUT VARIABLES @@ -810,8 +811,12 @@ SUBROUTINE InitPhotonReactions() IF(ChemReac%EForm(iReac).LE.0.0) THEN CALL abort(__STAMP__,'ERROR: Photon energy is not sufficient for the given ionization reaction: ',iReac) END IF + ! Abort if photon-ionization reactions using cross-sections have been defined + IF(NbrOfPhotonXsecReactions.GT.0) CALL abort(__STAMP__,& + 'Photoionization reactions with constant cross-sections cannot be combined with XSec data cross-sections for photoionization') END IF ! TRIM(ChemReac%ReactModel(iReac)).EQ.'phIon' END DO ! iReac = 1, ChemReac%NumOfReact + END SUBROUTINE InitPhotonReactions diff --git a/src/particles/dsmc/dsmc_chemical_reactions.f90 b/src/particles/dsmc/dsmc_chemical_reactions.f90 index 789fd12da..2678cc3ba 100644 --- a/src/particles/dsmc/dsmc_chemical_reactions.f90 +++ b/src/particles/dsmc/dsmc_chemical_reactions.f90 @@ -1556,8 +1556,6 @@ SUBROUTINE CalcPhotoIonizationNumber(i,NbrOfPhotons,NbrOfReactions) DO iReac = 1, ChemReac%NumOfReact ! Only treat photoionization reactions IF(TRIM(ChemReac%ReactModel(iReac)).NE.'phIon') CYCLE - IF(NbrOfPhotonXsecReactions.GT.0) CALL abort(__STAMP__,& - 'Photoionization reactions with constant cross-sections cannot be combined with XSec data cross-sections for photoionization') ! First reactant of the reaction is the actual heavy particle species ASSOCIATE( density => BGGas%NumberDensity(BGGas%MapSpecToBGSpec(ChemReac%Reactants(iReac,1))) ,& CrossSection => ChemReac%CrossSection(iReac)) @@ -1570,7 +1568,7 @@ SUBROUTINE CalcPhotoIonizationNumber(i,NbrOfPhotons,NbrOfReactions) END SUBROUTINE CalcPhotoIonizationNumber -SUBROUTINE PhotoIonization_InsertProducts(iPair, iReac, iInit, InitSpec, iLineOpt) +SUBROUTINE PhotoIonization_InsertProducts(iPair, iReac, b1, b2, normal, iLineOpt, PartBCIndex) !=================================================================================================================================== !> Routine performing the photo-ionization reaction: initializing the heavy species at the background gas temperature (first !> reactant) and distributing the remaining collision energy onto the electrons @@ -1597,8 +1595,10 @@ SUBROUTINE PhotoIonization_InsertProducts(iPair, iReac, iInit, InitSpec, iLineOp IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES -INTEGER, INTENT(IN) :: iPair, iReac, iInit, InitSpec +INTEGER, INTENT(IN) :: iPair, iReac +REAL, INTENT(IN), OPTIONAL :: b1(3),b2(3),normal(3) INTEGER, INTENT(IN), OPTIONAL :: iLineOpt +INTEGER, INTENT(IN), OPTIONAL :: PartBCIndex !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- @@ -1815,27 +1815,22 @@ SUBROUTINE PhotoIonization_InsertProducts(iPair, iReac, iInit, InitSpec, iLineOp IF(SpecDSMC(iSpec)%InterID.EQ.4) THEN PartState(4:6,iPart) = VeloCOM(1:3) + SQRT(CRela2_Electron) * DiceUnitVector() ! Change the direction of its velocity vector (randomly) to be perpendicular to the photon's path - ASSOCIATE( b1 => Species(InitSpec)%Init(iInit)%NormalVector1IC(1:3) ,& - b2 => Species(InitSpec)%Init(iInit)%NormalVector2IC(1:3) ,& - normal => Species(InitSpec)%Init(iInit)%NormalIC ,& - PartBCIndex => Species(InitSpec)%Init(iInit)%PartBCIndex) - ! Get random vector b3 in b1-b2-plane - CALL RANDOM_NUMBER(RandVal) - PartState(4:6,iPart) = GetRandomVectorInPlane(b1,b2,PartState(4:6,iPart),RandVal) - ! Rotate the resulting vector in the b3-NormalIC-plane - PartState(4:6,iPart) = GetRotatedVector(PartState(4:6,iPart),normal) - ! Store the particle information in PartStateBoundary.h5 - IF(DoBoundaryParticleOutputHDF5) THEN - IF(usevMPF)THEN - MPF = Species(InitSpec)%Init(iInit)%MacroParticleFactor ! Use emission-specific MPF - ELSE - MPF = Species(InitSpec)%MacroParticleFactor ! Use species MPF - END IF ! usevMPF - ! Only store volume-emitted particle data in PartStateBoundary.h5 if the PartBCIndex is greater/equal zero - IF(PartBCIndex.GE.0) CALL StoreBoundaryParticleProperties(iPart,iSpec,PartState(1:3,iPart),& - UNITVECTOR(PartState(4:6,iPart)),normal,iPartBound=PartBCIndex,mode=2,MPF_optIN=MPF) - END IF ! DoBoundaryParticleOutputHDF5 - END ASSOCIATE + ! Get random vector b3 in b1-b2-plane + CALL RANDOM_NUMBER(RandVal) + PartState(4:6,iPart) = GetRandomVectorInPlane(b1,b2,PartState(4:6,iPart),RandVal) + ! Rotate the resulting vector in the b3-NormalIC-plane + PartState(4:6,iPart) = GetRotatedVector(PartState(4:6,iPart),normal) + ! Store the particle information in PartStateBoundary.h5 + IF(DoBoundaryParticleOutputHDF5) THEN + IF(usevMPF)THEN + MPF = PartMPF(iPart) ! Use emission-specific MPF + ELSE + MPF = Species(iSpec)%MacroParticleFactor ! Use species MPF + END IF ! usevMPF + ! Only store volume-emitted particle data in PartStateBoundary.h5 if the PartBCIndex is greater/equal zero + IF(PartBCIndex.GE.0) CALL StoreBoundaryParticleProperties(iPart,iSpec,PartState(1:3,iPart),& + UNITVECTOR(PartState(4:6,iPart)),normal,iPartBound=PartBCIndex,mode=2,MPF_optIN=MPF) + END IF ! DoBoundaryParticleOutputHDF5 END IF END DO ELSE diff --git a/src/particles/emission/particle_emission.f90 b/src/particles/emission/particle_emission.f90 index 784591563..f60367da1 100644 --- a/src/particles/emission/particle_emission.f90 +++ b/src/particles/emission/particle_emission.f90 @@ -60,7 +60,7 @@ SUBROUTINE ParticleInserting() USE MOD_Particle_MPI_Vars ,ONLY: MPIW8TimePart,MPIW8CountPart #endif /*defined(MEASURE_MPI_WAIT)*/ USE MOD_SurfaceModel_Analyze_Vars ,ONLY: SEE,CalcElectronSEE -USE MOD_Particle_Photoionization ,ONLY: PhotoIonization_RayTracing_SEE +USE MOD_Particle_Photoionization ,ONLY: PhotoIonization_RayTracing_Volume, PhotoIonization_RayTracing_SEE ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -87,6 +87,9 @@ SUBROUTINE ParticleInserting() #endif /*defined(MEASURE_MPI_WAIT)*/ !=================================================================================================================================== +!--- Ray tracing based volume photo-ionization +CALL PhotoIonization_RayTracing_Volume() + !--- Ray tracing based secondary electron emission CALL PhotoIonization_RayTracing_SEE() @@ -232,6 +235,7 @@ SUBROUTINE ParticleInserting() IF(TRIM(Species(i)%Init(iInit)%SpaceIC).EQ.'photon_rectangle')THEN ! Rectangular area -> cuboid: Equally distributed over c*dt NbrOfPhotons = NbrOfPhotons * Species(i)%Init(iInit)%CuboidHeightIC / (c*dt) + print*, NbrOfPhotons ELSE ! Cylinder and honeycomb: Equally distributed over c*dt NbrOfPhotons = NbrOfPhotons * Species(i)%Init(iInit)%CylinderHeightIC / (c*dt) diff --git a/src/particles/emission/particle_photoionization.f90 b/src/particles/emission/particle_photoionization.f90 index bd73729bb..383a15e22 100644 --- a/src/particles/emission/particle_photoionization.f90 +++ b/src/particles/emission/particle_photoionization.f90 @@ -24,7 +24,7 @@ MODULE MOD_Particle_Photoionization !----------------------------------------------------------------------------------------------------------------------------------- ! Private Part --------------------------------------------------------------------------------------------------------------------- ! Public Part ---------------------------------------------------------------------------------------------------------------------- -PUBLIC :: PhotoIonization_RayTracing_SEE +PUBLIC :: PhotoIonization_RayTracing_SEE, PhotoIonization_RayTracing_Volume !=================================================================================================================================== CONTAINS @@ -107,8 +107,7 @@ SUBROUTINE PhotoIonization_RayTracing_SEE() tShift => Ray%tShift ,& lambda => Ray%WaveLength ,& Period => Ray%Period) - - ! Temporal bound of integration +! Temporal bound of integration #ifdef LSERK IF (iStage.EQ.1) THEN t_1 = Time @@ -224,4 +223,261 @@ SUBROUTINE PhotoIonization_RayTracing_SEE() END SUBROUTINE PhotoIonization_RayTracing_SEE + +SUBROUTINE PhotoIonization_RayTracing_Volume() +!=================================================================================================================================== +!> Routine calculates the number of photo-ionization reactions, utilizing the cell-local photon energy from the raytracing +!=================================================================================================================================== +! MODULES ! +!----------------------------------------------------------------------------------------------------------------------------------! +USE MOD_Globals +! Variables +USE MOD_Globals_Vars ,ONLY: PI, c +USE MOD_Timedisc_Vars ,ONLY: dt,time +USE MOD_Mesh_Vars ,ONLY: nElems, offsetElem +USE MOD_Mesh_Vars ,ONLY: NGeo,wBaryCL_NGeo,XiCL_NGeo,XCL_NGeo +USE MOD_RayTracing_Vars ,ONLY: UseRayTracing, Ray +USE MOD_RayTracing_Vars ,ONLY: U_N_Ray,N_DG_Ray,N_Inter_Ray +USE MOD_Particle_Vars ,ONLY: Species, PartState, usevMPF, PartMPF, PDM, PEM, PartSpecies +USE MOD_DSMC_Vars ,ONLY: ChemReac, DSMC, SpecDSMC, BGGas, Coll_pData, CollisMode, PartStateIntEn +USE MOD_DSMC_Vars ,ONLY: newAmbiParts, iPartIndx_NodeNewAmbi +! Functions/Subroutines +USE MOD_Eval_xyz ,ONLY: TensorProductInterpolation +USE MOD_part_emission_tools ,ONLY: CalcPhotonEnergy +USE MOD_DSMC_ChemReact ,ONLY: PhotoIonization_InsertProducts +USE MOD_part_emission_tools ,ONLY: CalcVelocity_maxwell_lpn, DSMC_SetInternalEnr_LauxVFD +USE MOD_DSMC_PolyAtomicModel ,ONLY: DSMC_SetInternalEnr_Poly +USE MOD_part_tools ,ONLY: CalcVelocity_maxwell_particle +!----------------------------------------------------------------------------------------------------------------------------------! +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +! INPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------! +! OUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +INTEGER :: iElem,k,l,m,iReac,iPair,iGlobalElem +INTEGER :: SpecID,nPair,NRayLoc,BGGSpecID +INTEGER :: NbrOfRepetitions +INTEGER :: PartID,newPartID +REAL :: t_1, t_2, E_Intensity, TimeScalingFactor +REAL :: density, NbrOfPhotons, NbrOfReactions +REAL :: RandNum,RandVal(3),Xi(3) +REAL :: RandomPos(1:3) +!=================================================================================================================================== + +IF(.NOT.UseRayTracing) RETURN + +! TODO: Only if a photoionization reaction has been found + + +! Determine the time-dependent ray intensity +ASSOCIATE(tau => Ray%PulseDuration ,& + tShift => Ray%tShift ,& + lambda => Ray%WaveLength ,& + Period => Ray%Period) + +#ifdef LSERK +IF (iStage.EQ.1) THEN +t_1 = Time +t_2 = Time + RK_c(2) * dt +ELSE + IF (iStage.NE.nRKStages) THEN + t_1 = Time + RK_c(iStage) * dt + t_2 = Time + RK_c(iStage+1) * dt + ELSE + t_1 = Time + RK_c(iStage) * dt + t_2 = Time + dt + END IF +END IF +#else +t_1 = Time +t_2 = Time + dt +#endif + +! Calculate the current pulse +NbrOfRepetitions = INT(Time/Period) + +! Add arbitrary time shift (-4 sigma_t) so that I_max is not at t=0s +! Note that sigma_t = tau / sqrt(2) +t_1 = t_1 - tShift - NbrOfRepetitions * Period +t_2 = t_2 - tShift - NbrOfRepetitions * Period + +! check if t_2 is outside of the pulse +IF(t_2.GT.2.0*tShift) t_2 = 2.0*tShift + +TimeScalingFactor = 0.5 * SQRT(PI) * tau * (ERF(t_2/tau)-ERF(t_1/tau)) + +DO iElem=1, nElems + iGlobalElem = iElem+offSetElem + ! iCNElem = GetCNElemID(iGlobalElem) + NRayLoc = N_DG_Ray(iElem) + DO m=0,NRayLoc + DO l=0,NRayLoc + DO k=0,NRayLoc + ! TODO: Ray secondary energy, U_N_Ray(iElem)%U(2,k,l,m) + E_Intensity = U_N_Ray(iElem)%U(1,k,l,m) * TimeScalingFactor + ! Number of photons (TODO: spectrum) + NbrOfPhotons = E_Intensity / (CalcPhotonEnergy(lambda) * c * dt) + DO iReac = 1, ChemReac%NumOfReact + SpecID = ChemReac%Reactants(iReac,1) + ! TODO: Background gas density distribution + BGGSpecID = BGGas%MapSpecToBGSpec(SpecID) + density = BGGas%NumberDensity(BGGSpecID) + ! Determine the number of particles to insert + ! Collision number: Z = n_gas * n_ph * sigma_reac * v (in the case of photons its speed of light) + ! Number of reactions: N = Z * dt * V (number of photons cancels out the volume) + ! Number of reactions: N = n_gas * N_ph * sigma_reac * v * dt + NbrOfReactions = density * NbrOfPhotons * ChemReac%CrossSection(iReac) * c * dt / Species(SpecID)%MacroParticleFactor + CALL RANDOM_NUMBER(RandNum) + nPair = INT(NbrOfReactions+RandNum) + ! Loop over all newly created particles + DO iPair = 1, nPair + ! Get a random position in the subelement TODO: N_Inter_Ray must always be available + CALL RANDOM_NUMBER(RandVal) + Xi(1) = -1.0 + SUM(N_Inter_Ray(NRayLoc)%wGP(0:k-1)) + N_Inter_Ray(NRayLoc)%wGP(k) * RandVal(1) + Xi(2) = -1.0 + SUM(N_Inter_Ray(NRayLoc)%wGP(0:l-1)) + N_Inter_Ray(NRayLoc)%wGP(l) * RandVal(2) + Xi(3) = -1.0 + SUM(N_Inter_Ray(NRayLoc)%wGP(0:m-1)) + N_Inter_Ray(NRayLoc)%wGP(m) * RandVal(3) + IF(ANY(Xi.GT.1.0).OR.ANY(Xi.LT.-1.0))THEN + IPWRITE(UNIT_StdOut,*) "Xi =", Xi + CALL abort(__STAMP__,'xi out of range') + END IF ! ANY(Xi.GT.1.0).OR.ANY(Xi.LT.-1.0) + ! Get the physical coordinates that correspond to the reference coordinates + CALL TensorProductInterpolation(Xi(1:3),3,NGeo,XiCL_NGeo,wBaryCL_NGeo,XCL_NGeo(1:3,0:NGeo,0:NGeo,0:NGeo,iElem),RandomPos(1:3)) + ! Create new particle from the background gas + PDM%CurrentNextFreePosition = PDM%CurrentNextFreePosition + 1 + PartID = PDM%nextFreePosition(PDM%CurrentNextFreePosition) + IF(PartID.GT.PDM%ParticleVecLength) PDM%ParticleVecLength = PDM%ParticleVecLength + 1 + IF(PartID.GT.PDM%MaxParticleNumber)THEN + CALL abort(__STAMP__,'Raytrace Photoionization: PartID.GT.PDM%MaxParticleNumber. '//& + 'Increase Part-maxParticleNumber or use more processors. PartID=',IntInfoOpt=PartID) + END IF + IF (PartID.EQ.0) THEN + CALL Abort(__STAMP__,'ERROR in PhotoIonization: MaxParticleNumber should be increased!') + END IF + ! Set the position + PartState(1:3,PartID) = RandomPos(1:3) + ! Set the species + PartSpecies(PartID) = SpecID + ! Set the velocity (required for the collision energy, although relatively small compared to the photon energy) + IF(BGGas%UseDistribution) THEN + PartState(4:6,PartID) = CalcVelocity_maxwell_particle(SpecID,BGGas%Distribution(BGGSpecID,4:6,iElem)) & + + BGGas%Distribution(BGGSpecID,1:3,iElem) + ELSE + CALL CalcVelocity_maxwell_lpn(FractNbr=SpecID, Vec3D=PartState(4:6,PartID), iInit=1) + END IF + ! Ambipolar diffusion + IF (DSMC%DoAmbipolarDiff) THEN + newAmbiParts = newAmbiParts + 1 + iPartIndx_NodeNewAmbi(newAmbiParts) = PartID + END IF + ! Set the internal energies + IF(CollisMode.GT.1) THEN + IF(SpecDSMC(SpecID)%PolyatomicMol) THEN + CALL DSMC_SetInternalEnr_Poly(SpecID,1,PartID,1) + ELSE + CALL DSMC_SetInternalEnr_LauxVFD(SpecID,1,PartID,1) + END IF + END IF + ! Particle flags + PDM%ParticleInside(PartID) = .TRUE. + PDM%IsNewPart(PartID) = .TRUE. + PDM%dtFracPush(PartID) = .FALSE. + PEM%GlobalElemID(PartID) = iGlobalElem + PEM%LastGlobalElemID(PartID) = iGlobalElem + ! Create second particle (only the index and the flags/elements needs to be set) + PDM%CurrentNextFreePosition = PDM%CurrentNextFreePosition + 1 + newPartID = PDM%nextFreePosition(PDM%CurrentNextFreePosition) + IF(newPartID.GT.PDM%ParticleVecLength) PDM%ParticleVecLength = PDM%ParticleVecLength + 1 + IF(newPartID.GT.PDM%MaxParticleNumber)THEN + CALL abort(__STAMP__,'Raytrace Photoionization: newPartID.GT.PDM%MaxParticleNumber. '//& + 'Increase Part-maxParticleNumber or use more processors. newPartID=',IntInfoOpt=newPartID) + END IF + IF (newPartID.EQ.0) THEN + CALL Abort(__STAMP__,'ERROR in PhotoIonization: MaxParticleNumber should be increased!') + END IF + IF (DSMC%DoAmbipolarDiff) THEN + newAmbiParts = newAmbiParts + 1 + iPartIndx_NodeNewAmbi(newAmbiParts) = newPartID + END IF + ! Particle flags + PDM%ParticleInside(newPartID) = .TRUE. + PDM%IsNewPart(newPartID) = .TRUE. + PDM%dtFracPush(newPartID) = .FALSE. + PEM%GlobalElemID(newPartID) = iGlobalElem + PEM%LastGlobalElemID(newPartID) = iGlobalElem + ! Pairing (first particle is the background gas species) + Coll_pData(iPair)%iPart_p1 = newPartID + Coll_pData(iPair)%iPart_p2 = PartID + ! Relative velocity is not required as the relative translational energy will not be considered + Coll_pData(iPair)%CRela2 = 0. + ! Weighting factor: use the weighting factor of the emission init + IF(usevMPF) THEN + PartMPF(PartID) = Species(SpecID)%MacroParticleFactor + PartMPF(newPartID) = PartMPF(PartID) + END IF + ! Velocity (set it to zero, as it will be subtracted in the chemistry module) + PartState(4:6,newPartID) = 0. + ! Internal energies (set it to zero) + PartStateIntEn(1:2,newPartID) = 0. + IF(DSMC%ElectronicModel.GT.0) PartStateIntEn(3,newPartID) = 0. + ! Insert the products and distribute the reaction energy (Requires: Pair indices, Coll_pData(iPair)%iPart_p1/2) + CALL PhotoIonization_InsertProducts(iPair, iReac, Ray%BaseVector1IC, Ray%BaseVector2IC, Ray%Direction, PartBCIndex=0) + END DO ! iPart = 1, nPair + END DO ! iReac = 1, ChemReac%NumOfReact + END DO ! k + END DO ! l + END DO ! m +END DO + +END ASSOCIATE + +END SUBROUTINE PhotoIonization_RayTracing_Volume + + +! SUBROUTINE CalcPhotoIonizationNumber(iReac,iElem,NbrOfPhotons,NbrOfReactions) +! !=================================================================================================================================== +! !> +! !=================================================================================================================================== +! ! MODULES +! USE MOD_Globals +! USE MOD_Globals_Vars ,ONLY: c +! USE MOD_Particle_Vars ,ONLY: Species +! USE MOD_DSMC_Vars ,ONLY: BGGas,ChemReac +! USE MOD_TimeDisc_Vars ,ONLY: dt +! ! IMPLICIT VARIABLE HANDLING +! IMPLICIT NONE +! !----------------------------------------------------------------------------------------------------------------------------------- +! ! INPUT VARIABLES +! INTEGER, INTENT(IN) :: i +! REAL, INTENT(IN) :: NbrOfPhotons +! !----------------------------------------------------------------------------------------------------------------------------------- +! ! OUTPUT VARIABLES +! REAL, INTENT(OUT) :: NbrOfReactions +! !----------------------------------------------------------------------------------------------------------------------------------- +! ! LOCAL VARIABLES +! INTEGER :: iReac,SpecID +! REAL :: density +! !=================================================================================================================================== + +! SpecID = ChemReac%Reactants(iReac,1) + +! ! TODO: Background gas density distribution +! density = BGGas%NumberDensity(BGGas%MapSpecToBGSpec(SpecID)) +! ! TODO: Variable particle weight +! ! TODO: Variable particle time step + +! SELECT CASE(TRIM(ChemReac%ReactModel(iReac))) +! CASE('phIon') +! ! Collision number: Z = n_gas * n_ph * sigma_reac * v (in the case of photons its speed of light) +! ! Number of reactions: N = Z * dt * V (number of photons cancels out the volume) +! NbrOfReactions = density * NbrOfPhotons * ChemReac%CrossSection(iReac) * c * dt / Species(SpecID)%MacroParticleFactor +! CASE('phIonXSec') +! ! TODO: +! CASE DEFAULT +! CYCLE +! END SELECT + +! END SUBROUTINE CalcPhotoIonizationNumber + END MODULE MOD_Particle_Photoionization diff --git a/src/particles/mcc/mcc_xsec.f90 b/src/particles/mcc/mcc_xsec.f90 index 6d0b886d7..f7b50a4ff 100644 --- a/src/particles/mcc/mcc_xsec.f90 +++ b/src/particles/mcc/mcc_xsec.f90 @@ -1022,8 +1022,7 @@ END SUBROUTINE ReadReacPhotonXSec SUBROUTINE ReadReacPhotonSpectrum(iPhotoReac) !=================================================================================================================================== -!> Read-in of photoionization reaction cross-sections from a given database. Check whether the -!> group exists. Trying to swap the species indices if dataset not found. +!> TODO: !=================================================================================================================================== ! use module USE MOD_io_hdf5 diff --git a/src/posti/superB/superB_tools.f90 b/src/posti/superB/superB_tools.f90 index a1a591fd6..39607a8b2 100644 --- a/src/posti/superB/superB_tools.f90 +++ b/src/posti/superB/superB_tools.f90 @@ -214,7 +214,7 @@ SUBROUTINE ExactFuncSuperB(ExactFunctionNumber,iCoilOrMagnet,x,resu) ! 2X : Magnets !=================================================================================================================================== ! MODULES -USE MOD_Globals ,ONLY: Abort,VECNORM,OrthoNormVec,UNITVECTOR,CROSSNORM,DOTPRODUCT +USE MOD_Globals ,ONLY: Abort,VECNORM,UNITVECTOR,CROSSNORM,DOTPRODUCT USE MOD_Globals ,ONLY: SphericalCoordinates,TransformVectorFromSphericalCoordinates USE MOD_Globals_Vars ,ONLY: Pi,mu0 USE MOD_SuperB_Vars ,ONLY: CoilInfo,PermanentMagnetInfo diff --git a/src/radiation/ray_tracing/raytrace_ini.f90 b/src/radiation/ray_tracing/raytrace_ini.f90 index 88a388dee..de8829b43 100644 --- a/src/radiation/ray_tracing/raytrace_ini.f90 +++ b/src/radiation/ray_tracing/raytrace_ini.f90 @@ -146,6 +146,9 @@ SUBROUTINE InitRayTracing() ! Angle between emitted rays and emission area alpha = (90.-ABS(90.-(180./PI)*ACOS(DOT_PRODUCT(Ray%Direction,SurfaceNormal)))) + ! Generate two base vectors perpendicular to the ray direction + CALL OrthoNormVec(Ray%Direction,Ray%BaseVector1IC,Ray%BaseVector2IC) + ! Calculate the peak intensity (uncorrected) I0 = E0 / (SQRT(PI)*tau*A) @@ -521,7 +524,7 @@ SUBROUTINE FinalizeRayTracing() SDEALLOCATE(N_VolMesh_Ray) SDEALLOCATE(N_Inter_Ray) SDEALLOCATE(PREF_VDM_Ray) -SDEALLOCATE(U_N_Ray) +! SDEALLOCATE(U_N_Ray) SDEALLOCATE(RayElemPassedEnergy) ! TODO: call this finalize with 2 modes (1. after ray tracing, 2. after plasma simulation) !SDEALLOCATE(PhotonSampWall) diff --git a/src/radiation/ray_tracing/raytrace_vars.f90 b/src/radiation/ray_tracing/raytrace_vars.f90 index 24558dba2..550931b23 100644 --- a/src/radiation/ray_tracing/raytrace_vars.f90 +++ b/src/radiation/ray_tracing/raytrace_vars.f90 @@ -40,6 +40,8 @@ MODULE MOD_RayTracing_Vars REAL :: Energy !< REAL :: IntensityAmplitude !< REAL :: Direction(3) !< + REAL :: BaseVector1IC(3) !< + REAL :: BaseVector2IC(3) !< ! Output of high-order p-adaptive info INTEGER :: NMin !< Minimum polynomial degree for the high-order volume sampling (p-adaption) From ddafb3e83a400708a336e1afa4f3744ca7a8cca8 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Thu, 27 Jul 2023 07:29:58 +0200 Subject: [PATCH 127/495] Use process-local arrays for photo volume emission --- src/particles/boundary/particle_boundary_sampling.f90 | 5 +++-- src/particles/boundary/particle_boundary_vars.f90 | 2 +- src/particles/emission/particle_photoionization.f90 | 8 ++++---- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/particles/boundary/particle_boundary_sampling.f90 b/src/particles/boundary/particle_boundary_sampling.f90 index a0b410684..dbfa7d66f 100644 --- a/src/particles/boundary/particle_boundary_sampling.f90 +++ b/src/particles/boundary/particle_boundary_sampling.f90 @@ -388,7 +388,7 @@ SUBROUTINE InitParticleBoundarySampling() IF(PartBound%TargetBoundCond(PartBound%MapToPartBC(SideInfo_Shared(SIDE_BCID,GlobalSideID))).EQ.PartBound%RotPeriodicBC) CYCLE ! Count the number of output sides nComputeNodeSurfOutputSides = nComputeNodeSurfOutputSides + 1 - END DO + END DO ! iSurfSide = 1,nComputeNodeSurfSides #if USE_MPI !--- switcheroo check 2 of 2: HALO sides ! Count number of inner BC in halo region @@ -404,7 +404,7 @@ SUBROUTINE InitParticleBoundarySampling() END IF END IF END DO ! iSurfSide = nComputeNodeSurfSides+1, nComputeNodeSurfTotalSides -END IF +END IF ! myComputeNodeRank.EQ.0 #endif ! free temporary arrays @@ -1124,6 +1124,7 @@ SUBROUTINE WriteSurfSampleToHDF5(MeshFileName,OutputTime) nVarCount=0 WRITE(H5_Name,'(A)') 'SurfaceData' +! WARNING: Only the sampling leaders write the data to .h5 ASSOCIATE (& nVar2D_Total => INT(nVar2D_Total,IK) , & nSurfSample => INT(nSurfSample,IK) , & diff --git a/src/particles/boundary/particle_boundary_vars.f90 b/src/particles/boundary/particle_boundary_vars.f90 index 6b88ee707..0f763a415 100644 --- a/src/particles/boundary/particle_boundary_vars.f90 +++ b/src/particles/boundary/particle_boundary_vars.f90 @@ -37,7 +37,7 @@ MODULE MOD_Particle_Boundary_Vars INTEGER :: nOutputSides INTEGER :: nComputeNodeSurfSides !> Number of surface sampling sides on compute node -INTEGER :: nComputeNodeSurfOutputSides !> Number of output surface sampling sides on compute node (inner BCs only counted once) +INTEGER :: nComputeNodeSurfOutputSides !> Number of output surface sampling sides on compute node (inner BCs only counted once and rotationally periodic BCs excluded) INTEGER :: nComputeNodeSurfTotalSides !> Number of surface sampling sides on compute node (including halo region) INTEGER :: offsetComputeNodeSurfSide !> elem offset of compute-node root INTEGER :: offsetComputeNodeSurfOutputSide !> elem offset of compute-node root diff --git a/src/particles/emission/particle_photoionization.f90 b/src/particles/emission/particle_photoionization.f90 index 5caf2a36d..f0ee472da 100644 --- a/src/particles/emission/particle_photoionization.f90 +++ b/src/particles/emission/particle_photoionization.f90 @@ -264,7 +264,7 @@ SUBROUTINE PhotoIonization_RayTracing_Volume() USE MOD_Mesh_Vars ,ONLY: nElems, offsetElem USE MOD_Mesh_Vars ,ONLY: NGeo,wBaryCL_NGeo,XiCL_NGeo,XCL_NGeo USE MOD_RayTracing_Vars ,ONLY: UseRayTracing, Ray -USE MOD_RayTracing_Vars ,ONLY: U_N_Ray,N_DG_Ray,N_Inter_Ray +USE MOD_RayTracing_Vars ,ONLY: U_N_Ray_loc,N_DG_Ray_loc,N_Inter_Ray USE MOD_Particle_Vars ,ONLY: Species, PartState, usevMPF, PartMPF, PDM, PEM, PartSpecies USE MOD_DSMC_Vars ,ONLY: ChemReac, DSMC, SpecDSMC, BGGas, Coll_pData, CollisMode, PartStateIntEn USE MOD_DSMC_Vars ,ONLY: newAmbiParts, iPartIndx_NodeNewAmbi @@ -338,12 +338,12 @@ SUBROUTINE PhotoIonization_RayTracing_Volume() DO iElem=1, nElems iGlobalElem = iElem+offSetElem ! iCNElem = GetCNElemID(iGlobalElem) - NRayLoc = N_DG_Ray(iElem) + NRayLoc = N_DG_Ray_loc(iElem) DO m=0,NRayLoc DO l=0,NRayLoc DO k=0,NRayLoc - ! TODO: Ray secondary energy, U_N_Ray(iElem)%U(2,k,l,m) - E_Intensity = U_N_Ray(iElem)%U(1,k,l,m) * TimeScalingFactor + ! TODO: Ray secondary energy, U_N_Ray_loc(iElem)%U(2,k,l,m) + E_Intensity = U_N_Ray_loc(iElem)%U(1,k,l,m) * TimeScalingFactor ! Number of photons (TODO: spectrum) NbrOfPhotons = E_Intensity / (CalcPhotonEnergy(lambda) * c * dt) DO iReac = 1, ChemReac%NumOfReact From ce007926f39663f752e3a2e54633f495630afacf Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Thu, 27 Jul 2023 13:26:26 +0200 Subject: [PATCH 128/495] Cleanup PhotonSampWall, which is now either ALLOCATABLE (MPI=OFF) or points to the shared memory array PhotonSampWall_Shared (MPI=ON). --- src/particles/boundary/particle_boundary_tools.f90 | 1 - .../emission/particle_photoionization.f90 | 6 +----- src/radiation/radiative_transfer/radtrans_init.f90 | 11 +++++++---- .../tracking/radtrans_tracking_output.f90 | 14 ++++++-------- .../tracking/radtrans_tracking_tools.f90 | 9 +++++++++ .../tracking/radtrans_tracking_vars.f90 | 3 ++- src/radiation/ray_tracing/raytrace.f90 | 12 ++++++++---- src/radiation/ray_tracing/raytrace_ini.f90 | 2 ++ 8 files changed, 35 insertions(+), 23 deletions(-) diff --git a/src/particles/boundary/particle_boundary_tools.f90 b/src/particles/boundary/particle_boundary_tools.f90 index c3d21ddfb..27da492c2 100644 --- a/src/particles/boundary/particle_boundary_tools.f90 +++ b/src/particles/boundary/particle_boundary_tools.f90 @@ -26,7 +26,6 @@ MODULE MOD_Particle_Boundary_Tools ! Private Part --------------------------------------------------------------------------------------------------------------------- ! Public Part ---------------------------------------------------------------------------------------------------------------------- PUBLIC :: CalcWallSample -PUBLIC :: SampleImpactProperties PUBLIC :: StoreBoundaryParticleProperties PUBLIC :: GetRadialDistance2D !=================================================================================================================================== diff --git a/src/particles/emission/particle_photoionization.f90 b/src/particles/emission/particle_photoionization.f90 index f0ee472da..ca8589217 100644 --- a/src/particles/emission/particle_photoionization.f90 +++ b/src/particles/emission/particle_photoionization.f90 @@ -57,9 +57,9 @@ SUBROUTINE PhotoIonization_RayTracing_SEE() USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall_Shared USE MOD_MPI_Shared_Vars ,ONLY: nComputeNodeProcessors,myComputeNodeRank #else -USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall USE MOD_Particle_Boundary_Vars ,ONLY: nSurfTotalSides #endif /*USE_MPI*/ +USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall #if USE_HDG USE MOD_HDG_Vars ,ONLY: UseFPC,FPC,UseEPC,EPC USE MOD_Mesh_Vars ,ONLY: BoundaryType @@ -170,11 +170,7 @@ SUBROUTINE PhotoIonization_RayTracing_SEE() DO p = 1, nSurfSample DO q = 1, nSurfSample ! Calculate the number of SEEs per subside -#if USE_MPI - E_Intensity = PhotonSampWall_Shared(2,p,q,iSurfSide) * TimeScalingFactor -#else E_Intensity = PhotonSampWall(2,p,q,iSurfSide) * TimeScalingFactor -#endif /*USE_MPI*/ RealNbrOfSEE = E_Intensity / CalcPhotonEnergy(lambda) * PartBound%PhotonSEEYield(BCID) / MPF CALL RANDOM_NUMBER(RandVal) NbrOfSEE = INT(RealNbrOfSEE+RandVal) diff --git a/src/radiation/radiative_transfer/radtrans_init.f90 b/src/radiation/radiative_transfer/radtrans_init.f90 index ae4aaf4a4..87358e358 100644 --- a/src/radiation/radiative_transfer/radtrans_init.f90 +++ b/src/radiation/radiative_transfer/radtrans_init.f90 @@ -433,17 +433,20 @@ SUBROUTINE InitRadiationTransport() -!IF (.NOT.ALLOCATED(SurfMesh%SideIDToSurfID)) CALL InitParticleBoundarySampling() -ALLOCATE(PhotonSampWall(2,1:nSurfSample,1:nSurfSample,1:nComputeNodeSurfTotalSides)) -PhotonSampWall=0.0 #if USE_MPI +ALLOCATE(PhotonSampWallProc(2,1:nSurfSample,1:nSurfSample,1:nComputeNodeSurfTotalSides)) +PhotonSampWallProc=0.0 !> Then shared arrays for boundary sampling CALL Allocate_Shared((/2,1:nSurfSample,1:nSurfSample,nComputeNodeSurfTotalSides/),PhotonSampWall_Shared_Win,PhotonSampWall_Shared) CALL MPI_WIN_LOCK_ALL(0,PhotonSampWall_Shared_Win,IERROR) +PhotonSampWall => PhotonSampWall_Shared -IF (myComputeNodeRank.EQ.0) PhotonSampWall_Shared = 0. +IF (myComputeNodeRank.EQ.0) PhotonSampWall = 0. CALL BARRIER_AND_SYNC(PhotonSampWall_Shared_Win,MPI_COMM_SHARED) +#else +ALLOCATE(PhotonSampWall(2,1:nSurfSample,1:nSurfSample,1:nComputeNodeSurfTotalSides)) +PhotonSampWall=0.0 #endif SWRITE(UNIT_stdOut,'(A)')' INIT RADIATION TRANSPORT SOLVER DONE!' diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 index cda6d7f57..fbf3ca495 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 @@ -241,11 +241,10 @@ SUBROUTINE WritePhotonSurfSampleToHDF5() #if USE_MPI USE MOD_MPI_Shared_Vars ,ONLY: MPI_COMM_LEADERS_SURF USE MOD_Particle_Boundary_Vars ,ONLY: SurfSideArea_Shared,nSurfTotalSides -USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall_Shared #else -USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall USE MOD_Particle_Boundary_Vars ,ONLY: SurfSideArea #endif /*USE_MPI*/ +USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall USE MOD_Particle_Boundary_Vars ,ONLY: nSurfSample, PartBound USE MOD_Photon_TrackingVars ,ONLY: RadiationSurfState !----------------------------------------------------------------------------------------------------------------------------------! @@ -315,8 +314,7 @@ SUBROUTINE WritePhotonSurfSampleToHDF5() WRITE(H5_Name,'(A)') 'SurfaceData' #if USE_MPI -ASSOCIATE(PhotonSampWall => PhotonSampWall_Shared ,& - SurfSideArea => SurfSideArea_Shared) +ASSOCIATE(SurfSideArea => SurfSideArea_Shared) #endif ASSOCIATE (& @@ -328,7 +326,6 @@ SUBROUTINE WritePhotonSurfSampleToHDF5() ALLOCATE(helpArray(nVar2D,1:nSurfSample,1:nSurfSample,LocalnBCSides)) OutputCounter = 0 - !IF(myrank.eq.0) read* DO iSurfSide = 1,nComputeNodeSurfSides GlobalSideID = SurfSide2GlobalSide(SURF_SIDEID,iSurfSide) IF(SideInfo_Shared(SIDE_NBSIDEID,GlobalSideID).GT.0) THEN @@ -349,6 +346,7 @@ SUBROUTINE WritePhotonSurfSampleToHDF5() END DO ! q = 1, nSurfSample END DO ! p = 1, nSurfSample END DO + ! WARNING: Only the sampling leaders write the data to .h5 CALL WriteArrayToHDF5(DataSetName=H5_Name , rank=4 , & nValGlobal =(/nVar2D , nSurfSample , nSurfSample , nGlobalSides/) , & nVal =(/nVar2D , nSurfSample , nSurfSample , LocalnBCSides/) , & @@ -385,7 +383,7 @@ SUBROUTINE ExchangeRadiationSurfData() USE MOD_Globals USE MOD_Particle_Boundary_Vars ,ONLY: SurfOnNode, SurfMapping, nComputeNodeSurfTotalSides, GlobalSide2SurfSide, nSurfSample USE MOD_Particle_MPI_Vars ,ONLY: SurfSendBuf,SurfRecvBuf -USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall, PhotonSampWall_Shared, PhotonSampWall_Shared_Win +USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWallProc, PhotonSampWall_Shared, PhotonSampWall_Shared_Win USE MOD_MPI_Shared_Vars ,ONLY: MPI_COMM_LEADERS_SURF, MPI_COMM_SHARED, nSurfLeaders,myComputeNodeRank,mySurfRank USE MOD_MPI_Shared !----------------------------------------------------------------------------------------------------------------------------------! @@ -405,9 +403,9 @@ SUBROUTINE ExchangeRadiationSurfData() MessageSize = 2*nComputeNodeSurfTotalSides*(nSurfSample**2) IF (myComputeNodeRank.EQ.0) THEN - CALL MPI_REDUCE(PhotonSampWall, PhotonSampWall_Shared, MessageSize, MPI_DOUBLE_PRECISION, MPI_SUM, 0, MPI_COMM_SHARED, IERROR) + CALL MPI_REDUCE(PhotonSampWallProc, PhotonSampWall_Shared, MessageSize, MPI_DOUBLE_PRECISION, MPI_SUM, 0, MPI_COMM_SHARED, IERROR) ELSE - CALL MPI_REDUCE(PhotonSampWall, 0 , MessageSize, MPI_DOUBLE_PRECISION, MPI_SUM, 0, MPI_COMM_SHARED, IERROR) + CALL MPI_REDUCE(PhotonSampWallProc, 0 , MessageSize, MPI_DOUBLE_PRECISION, MPI_SUM, 0, MPI_COMM_SHARED, IERROR) ENDIF ! Update diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 index 5bd4e990c..ea93245d8 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 @@ -1321,6 +1321,9 @@ SUBROUTINE CalcWallAbsoprtion(IntersectionPos, GlobSideID, DONE, ForceWallSample USE MOD_Photon_TrackingVars ,ONLY: PhotonProps,PhotonSampWall USE MOD_Particle_Boundary_Vars ,ONLY: PartBound, GlobalSide2SurfSide, nSurfSample, SurfSideSamplingMidPoints USE MOD_Particle_Mesh_Vars ,ONLY: SideInfo_Shared +#if USE_MPI +USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWallProc +#endif /*USE_MPI*/ !--------------------------------------------------------------------------------------------------! IMPLICIT NONE !--------------------------------------------------------------------------------------------------! @@ -1335,6 +1338,9 @@ SUBROUTINE CalcWallAbsoprtion(IntersectionPos, GlobSideID, DONE, ForceWallSample INTEGER :: SurfSideID,p,q,pp,qq LOGICAL :: ForceWallSampleLoc !--------------------------------------------------------------------------------------------------! +#if USE_MPI +ASSOCIATE( PhotonSampWall => PhotonSampWallProc ) +#endif /*USE_MPI*/ SurfSideID = GlobalSide2SurfSide(SURF_SIDEID,GlobSideID) ! Check if photon is to be added to PhotonSampWall independent of the actual absorption/reflection IF(PRESENT(ForceWallSample))THEN @@ -1390,6 +1396,9 @@ SUBROUTINE CalcWallAbsoprtion(IntersectionPos, GlobSideID, DONE, ForceWallSample END IF ! nSurfSample.GT.1 END IF ! .NOT.ForceWallSampleLoc END IF +#if USE_MPI +END ASSOCIATE +#endif /*USE_MPI*/ END SUBROUTINE CalcWallAbsoprtion diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_vars.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_vars.f90 index d0b54ae37..9d7a1b8bd 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_vars.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_vars.f90 @@ -38,7 +38,7 @@ MODULE MOD_Photon_TrackingVars TYPE (tPhotonProps) :: PhotonProps !> -REAL, ALLOCATABLE :: PhotonSampWall(:,:,:,:) +REAL,ALLOCPOINT :: PhotonSampWall(:,:,:,:) INTEGER :: PhotonModeBPO !> 0: Output nothing to PartStateBoundary.h5 !> 1: Output the initial position of the rays and their direction vector @@ -47,6 +47,7 @@ MODULE MOD_Photon_TrackingVars #if USE_MPI INTEGER :: PhotonSampWall_Shared_Win REAL,POINTER :: PhotonSampWall_Shared(:,:,:,:) +REAL,ALLOCATABLE :: PhotonSampWallProc(:,:,:,:) #endif /*USE_MPI*/ diff --git a/src/radiation/ray_tracing/raytrace.f90 b/src/radiation/ray_tracing/raytrace.f90 index 7581af96b..294b24f46 100644 --- a/src/radiation/ray_tracing/raytrace.f90 +++ b/src/radiation/ray_tracing/raytrace.f90 @@ -58,7 +58,7 @@ SUBROUTINE RayTracing() #if USE_MPI USE MOD_MPI_Shared_Vars USE MOD_MPI_Shared -USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall_Shared, PhotonSampWall_Shared_Win +USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall_Shared, PhotonSampWall_Shared_Win,PhotonSampWallProc USE MOD_RayTracing_Vars ,ONLY: RayElemPassedEnergy_Shared,RayElemPassedEnergy_Shared_Win #endif /*USE_MPI*/ USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall,PhotonModeBPO @@ -112,20 +112,24 @@ SUBROUTINE RayTracing() ! Allocate global arrays ALLOCATE(RayElemPassedEnergy(RayElemSize,1:nGlobalElems)) RayElemPassedEnergy=0.0 -ALLOCATE(PhotonSampWall(2,1:nSurfSample,1:nSurfSample,1:nComputeNodeSurfTotalSides)) -PhotonSampWall=0.0 #if USE_MPI +ALLOCATE(PhotonSampWallProc(2,1:nSurfSample,1:nSurfSample,1:nComputeNodeSurfTotalSides)) +PhotonSampWallProc=0.0 !> Shared arrays for volume sampling CALL Allocate_Shared((/RayElemSize,nGlobalElems/),RayElemPassedEnergy_Shared_Win,RayElemPassedEnergy_Shared) CALL MPI_WIN_LOCK_ALL(0,RayElemPassedEnergy_Shared_Win,IERROR) !> Shared arrays for boundary sampling CALL Allocate_Shared((/2,nSurfSample,nSurfSample,nComputeNodeSurfTotalSides/),PhotonSampWall_Shared_Win,PhotonSampWall_Shared) CALL MPI_WIN_LOCK_ALL(0,PhotonSampWall_Shared_Win,IERROR) +PhotonSampWall => PhotonSampWall_Shared IF(myComputeNodeRank.EQ.0) RayElemPassedEnergy_Shared = 0. -IF(myComputeNodeRank.EQ.0) PhotonSampWall_Shared = 0. +IF(myComputeNodeRank.EQ.0) PhotonSampWall = 0. CALL BARRIER_AND_SYNC(RayElemPassedEnergy_Shared_Win,MPI_COMM_SHARED) CALL BARRIER_AND_SYNC(PhotonSampWall_Shared_Win,MPI_COMM_SHARED) +#else +ALLOCATE(PhotonSampWall(2,1:nSurfSample,1:nSurfSample,1:nComputeNodeSurfTotalSides)) +PhotonSampWall=0.0 #endif photonCount = 0 diff --git a/src/radiation/ray_tracing/raytrace_ini.f90 b/src/radiation/ray_tracing/raytrace_ini.f90 index 3f1b0dbc2..328fa2d48 100644 --- a/src/radiation/ray_tracing/raytrace_ini.f90 +++ b/src/radiation/ray_tracing/raytrace_ini.f90 @@ -545,6 +545,7 @@ SUBROUTINE FinalizeRayTracing() #if USE_MPI USE MOD_MPI_Shared_Vars ,ONLY: MPI_COMM_SHARED USE MOD_MPI_Shared +USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWallProc #endif /*USE_MPI*/ IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------! @@ -564,6 +565,7 @@ SUBROUTINE FinalizeRayTracing() SDEALLOCATE(PREF_VDM_Ray) ! ray tracing #if USE_MPI + SDEALLOCATE(PhotonSampWallProc) ! ray tracing CALL MPI_BARRIER(MPI_COMM_SHARED,iError) CALL UNLOCK_AND_FREE(RayElemPassedEnergy_Shared_Win) From a19219db9275c0ef3e9af907952bb9896a99a063 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Fri, 28 Jul 2023 00:58:32 +0200 Subject: [PATCH 129/495] WIP: restart functionality for photon sampled wall impacts for usage in photon SEE emission. --- src/mpi/mpi_shared_vars.f90 | 2 + .../boundary/particle_boundary_sampling.f90 | 1 + .../emission/particle_photoionization.f90 | 43 +++--- .../tracking/radtrans_tracking_output.f90 | 13 +- .../tracking/radtrans_tracking_vars.f90 | 9 +- src/radiation/ray_tracing/raytrace.f90 | 126 +++++++++++++++--- src/radiation/ray_tracing/raytrace_ini.f90 | 12 +- src/restart/restart.f90 | 5 + 8 files changed, 168 insertions(+), 43 deletions(-) diff --git a/src/mpi/mpi_shared_vars.f90 b/src/mpi/mpi_shared_vars.f90 index 9bd9f7828..17298046c 100644 --- a/src/mpi/mpi_shared_vars.f90 +++ b/src/mpi/mpi_shared_vars.f90 @@ -74,5 +74,7 @@ MODULE MOD_MPI_Shared_Vars INTEGER :: MPI_INFO_SHARED_LOOSE !> MPI_INFO object allowing for re-ordering of same origin atomic RMA operations !> Other variables in particle_mesh_vars.f90 +#else +MPI_COMM_LEADERS_SURF=MPI_COMM_WORLD #endif /*USE_MPI*/ END MODULE diff --git a/src/particles/boundary/particle_boundary_sampling.f90 b/src/particles/boundary/particle_boundary_sampling.f90 index dbfa7d66f..31adca421 100644 --- a/src/particles/boundary/particle_boundary_sampling.f90 +++ b/src/particles/boundary/particle_boundary_sampling.f90 @@ -841,6 +841,7 @@ SUBROUTINE CalcSurfaceValues(during_dt_opt) IF(SideInfo_Shared(SIDE_NBSIDEID,GlobalSideID).GT.0) THEN IF(GlobalSideID.LT.SideInfo_Shared(SIDE_NBSIDEID,GlobalSideID)) THEN SurfSideNb = GlobalSide2SurfSide(SURF_SIDEID,SideInfo_Shared(SIDE_NBSIDEID,GlobalSideID)) + ! Add your contribution to my inner BC SampWallState(:,:,:,iSurfSide) = SampWallState(:,:,:,iSurfSide) + SampWallState(:,:,:,SurfSideNb) ELSE CYCLE diff --git a/src/particles/emission/particle_photoionization.f90 b/src/particles/emission/particle_photoionization.f90 index ca8589217..447267935 100644 --- a/src/particles/emission/particle_photoionization.f90 +++ b/src/particles/emission/particle_photoionization.f90 @@ -38,28 +38,30 @@ SUBROUTINE PhotoIonization_RayTracing_SEE() USE MOD_Globals USE MOD_Globals_Vars ,ONLY: PI USE MOD_Timedisc_Vars ,ONLY: dt,time -USE MOD_Particle_Boundary_Vars ,ONLY: nSurfSample, Partbound, SurfSide2GlobalSide, DoBoundaryParticleOutputHDF5 +USE MOD_Particle_Boundary_Vars ,ONLY: nSurfSample, Partbound, DoBoundaryParticleOutputHDF5 USE MOD_Particle_Vars ,ONLY: Species, PartState, usevMPF USE MOD_RayTracing_Vars ,ONLY: Ray,UseRayTracing USE MOD_part_emission_tools ,ONLY: CalcPhotonEnergy USE MOD_Particle_Mesh_Vars ,ONLY: SideInfo_Shared,UseBezierControlPoints USE MOD_Particle_Surfaces_Vars ,ONLY: BezierControlPoints3D, BezierSampleXi USE MOD_Particle_Surfaces ,ONLY: EvaluateBezierPolynomialAndGradient, CalcNormAndTangBezier -USE MOD_Mesh_Vars ,ONLY: NGeo +USE MOD_Mesh_Vars ,ONLY: NGeo,nBCSides,offsetElem,SideToElem USE MOD_part_emission_tools ,ONLY: CalcVelocity_FromWorkFuncSEE USE MOD_Particle_Boundary_Tools ,ONLY: StoreBoundaryParticleProperties USE MOD_part_operations ,ONLY: CreateParticle +USE MOD_Particle_Mesh_Tools ,ONLY: GetGlobalNonUniqueSideID +!USE MOD_Particle_Boundary_Vars ,ONLY: GlobalSide2SurfSide #ifdef LSERK USE MOD_Timedisc_Vars ,ONLY: iStage, RK_c, nRKStages #endif #if USE_MPI -USE MOD_Particle_Boundary_Vars ,ONLY: nComputeNodeSurfTotalSides -USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall_Shared -USE MOD_MPI_Shared_Vars ,ONLY: nComputeNodeProcessors,myComputeNodeRank +!USE MOD_Particle_Boundary_Vars ,ONLY: nComputeNodeSurfTotalSides +!USE MOD_MPI_Shared_Vars ,ONLY: nComputeNodeProcessors,myComputeNodeRank #else USE MOD_Particle_Boundary_Vars ,ONLY: nSurfTotalSides #endif /*USE_MPI*/ -USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall +!USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall +USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall_loc #if USE_HDG USE MOD_HDG_Vars ,ONLY: UseFPC,FPC,UseEPC,EPC USE MOD_Mesh_Vars ,ONLY: BoundaryType @@ -74,8 +76,8 @@ SUBROUTINE PhotoIonization_RayTracing_SEE() !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES REAL :: t_1, t_2, E_Intensity -INTEGER :: NbrOfRepetitions, firstSide, lastSide, SideID, iSample, GlobElemID, PartID -INTEGER :: iSurfSide, p, q, BCID, SpecID, iPart, NbrOfSEE, iSEEBC +INTEGER :: NbrOfRepetitions, SideID, iSample, GlobElemID, PartID, BCSideID, iLocSide, locElemID +INTEGER :: p, q, BCID, SpecID, iPart, NbrOfSEE, iSEEBC REAL :: RealNbrOfSEE, TimeScalingFactor, MPF REAL :: Particle_pos(1:3), xi(2) REAL :: RandVal, RandVal2(2), xiab(1:2,1:2), nVec(3), tang1(3), tang2(3), Velo3D(3) @@ -98,13 +100,13 @@ SUBROUTINE PhotoIonization_RayTracing_SEE() END IF ! Surf sides are shared, array calculation can be distributed -#if USE_MPI -firstSide = INT(REAL( myComputeNodeRank )*REAL(nComputeNodeSurfTotalSides)/REAL(nComputeNodeProcessors))+1 -lastSide = INT(REAL((myComputeNodeRank+1))*REAL(nComputeNodeSurfTotalSides)/REAL(nComputeNodeProcessors)) -#else -firstSide = 1 -lastSide = nSurfTotalSides -#endif /*USE_MPI*/ +!#if USE_MPI +!firstSide = INT(REAL( myComputeNodeRank )*REAL(nComputeNodeSurfTotalSides)/REAL(nComputeNodeProcessors))+1 +!lastSide = INT(REAL((myComputeNodeRank+1))*REAL(nComputeNodeSurfTotalSides)/REAL(nComputeNodeProcessors)) +!#else +!firstSide = 1 +!lastSide = nSurfTotalSides +!#endif /*USE_MPI*/ ASSOCIATE( tau => Ray%PulseDuration ,& tShift => Ray%tShift ,& @@ -142,8 +144,12 @@ SUBROUTINE PhotoIonization_RayTracing_SEE() TimeScalingFactor = 0.5 * SQRT(PI) * tau * (ERF(t_2/tau)-ERF(t_1/tau)) -DO iSurfSide = firstSide, lastSide - SideID = SurfSide2GlobalSide(SURF_SIDEID,iSurfSide) +DO BCSideID=1,nBCSides + locElemID = SideToElem(S2E_ELEM_ID,BCSideID) + iLocSide = SideToElem(S2E_LOC_SIDE_ID,BCSideID) + SideID = GetGlobalNonUniqueSideID(offsetElem+locElemID,iLocSide) + !iSurfSide = GlobalSide2SurfSide(SURF_SIDEID,SideID) + !SideID = SurfSide2GlobalSide(SURF_SIDEID,iSurfSide) ! TODO: Skip sides which are not mine in the MPI case BCID = PartBound%MapToPartBC(SideInfo_Shared(SIDE_BCID,SideID)) ! Skip non-reflective BC sides @@ -170,7 +176,8 @@ SUBROUTINE PhotoIonization_RayTracing_SEE() DO p = 1, nSurfSample DO q = 1, nSurfSample ! Calculate the number of SEEs per subside - E_Intensity = PhotonSampWall(2,p,q,iSurfSide) * TimeScalingFactor + !E_Intensity = PhotonSampWall(2,p,q,iSurfSide) * TimeScalingFactor + E_Intensity = PhotonSampWall_loc(p,q,BCSideID) * TimeScalingFactor RealNbrOfSEE = E_Intensity / CalcPhotonEnergy(lambda) * PartBound%PhotonSEEYield(BCID) / MPF CALL RANDOM_NUMBER(RandVal) NbrOfSEE = INT(RealNbrOfSEE+RandVal) diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 index fbf3ca495..feaea32ae 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 @@ -256,13 +256,14 @@ SUBROUTINE WritePhotonSurfSampleToHDF5() !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES CHARACTER(LEN=255) :: Statedummy -CHARACTER(LEN=255) :: H5_Name +CHARACTER(LEN=255) :: H5_Name, H5_Name2 CHARACTER(LEN=4),PARAMETER :: NodeTypeTemp = 'VISU' CHARACTER(LEN=255),ALLOCATABLE :: Str2DVarNames(:) INTEGER :: GlobalSideID, iSurfSide, OutputCounter, SurfSideNb, p, q INTEGER,PARAMETER :: nVar2D=3 REAL :: tstart,tend REAL, ALLOCATABLE :: helpArray(:,:,:,:) +INTEGER, ALLOCATABLE :: helpArray2(:) !=================================================================================================================================== #if USE_MPI CALL ExchangeRadiationSurfData() @@ -313,6 +314,7 @@ SUBROUTINE WritePhotonSurfSampleToHDF5() WRITE(H5_Name,'(A)') 'SurfaceData' +WRITE(H5_Name2,'(A)') 'SurfaceDataGlobalSideIndex' #if USE_MPI ASSOCIATE(SurfSideArea => SurfSideArea_Shared) #endif @@ -325,12 +327,14 @@ SUBROUTINE WritePhotonSurfSampleToHDF5() nVar2D => INT(nVar2D , IK)) ALLOCATE(helpArray(nVar2D,1:nSurfSample,1:nSurfSample,LocalnBCSides)) + ALLOCATE(helpArray2(LocalnBCSides)) OutputCounter = 0 DO iSurfSide = 1,nComputeNodeSurfSides GlobalSideID = SurfSide2GlobalSide(SURF_SIDEID,iSurfSide) IF(SideInfo_Shared(SIDE_NBSIDEID,GlobalSideID).GT.0) THEN IF(GlobalSideID.LT.SideInfo_Shared(SIDE_NBSIDEID,GlobalSideID)) THEN SurfSideNb = GlobalSide2SurfSide(SURF_SIDEID,SideInfo_Shared(SIDE_NBSIDEID,GlobalSideID)) + ! Add your contribution to my inner BC PhotonSampWall(:,:,:,iSurfSide) = PhotonSampWall(:,:,:,iSurfSide) + PhotonSampWall(:,:,:,SurfSideNb) ELSE CYCLE @@ -338,6 +342,7 @@ SUBROUTINE WritePhotonSurfSampleToHDF5() END IF OutputCounter = OutputCounter + 1 helpArray(1,1:nSurfSample,1:nSurfSample,OutputCounter) = PhotonSampWall(1,1:nSurfSample,1:nSurfSample,iSurfSide) + helpArray2(OutputCounter) = SurfSide2GlobalSide(SURF_SIDEID,iSurfSide) ! SurfaceArea should be changed to 1:SurfMesh%nSides if inner sampling sides exist... DO p = 1, nSurfSample DO q = 1, nSurfSample @@ -353,7 +358,13 @@ SUBROUTINE WritePhotonSurfSampleToHDF5() offset =(/0_IK , 0_IK , 0_IK , offsetSurfSide/) , & collective =.FALSE. , & RealArray=helpArray(1:nVar2D,1:nSurfSample,1:nSurfSample,1:LocalnBCSides)) + CALL WriteArrayToHDF5(DataSetName = H5_Name2 , rank = 1 , & + nValGlobal = (/nGlobalSides/) , & + nVal = (/LocalnBCSides/) , & + offset = (/offsetSurfSide/) , & + collective = .FALSE. , IntegerArray_i4 = helpArray2(1:INT(LocalnBCSides,4))) DEALLOCATE(helpArray) + DEALLOCATE(helpArray2) END ASSOCIATE #if USE_MPI diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_vars.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_vars.f90 index 9d7a1b8bd..f7e19974c 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_vars.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_vars.f90 @@ -38,7 +38,14 @@ MODULE MOD_Photon_TrackingVars TYPE (tPhotonProps) :: PhotonProps !> -REAL,ALLOCPOINT :: PhotonSampWall(:,:,:,:) +REAL,ALLOCPOINT :: PhotonSampWallHDF5(:,:,:,:) +#if USE_MPI +INTEGER :: PhotonSampWallHDF5_Shared_Win +REAL,POINTER :: PhotonSampWallHDF5_Shared(:,:,:,:) +#endif + +REAL,ALLOCPOINT :: PhotonSampWall(:,:,:,:) +REAL,ALLOCATABLE :: PhotonSampWall_loc(:,:,:) INTEGER :: PhotonModeBPO !> 0: Output nothing to PartStateBoundary.h5 !> 1: Output the initial position of the rays and their direction vector diff --git a/src/radiation/ray_tracing/raytrace.f90 b/src/radiation/ray_tracing/raytrace.f90 index 294b24f46..2e3ebec5f 100644 --- a/src/radiation/ray_tracing/raytrace.f90 +++ b/src/radiation/ray_tracing/raytrace.f90 @@ -31,6 +31,7 @@ MODULE MOD_RayTracing ! Private Part --------------------------------------------------------------------------------------------------------------------- ! Public Part ---------------------------------------------------------------------------------------------------------------------- PUBLIC :: RayTracing +PUBLIC :: ReadRayTracingDataFromH5 !=================================================================================================================================== CONTAINS @@ -99,7 +100,7 @@ SUBROUTINE RayTracing() RaySecondaryVectorZ=-1.0 IF(.NOT.PerformRayTracing)THEN - CALL ReadRayTracingDataFromH5() + CALL ReadRayTracingDataFromH5(onlySurfData=.FALSE.) RETURN END IF @@ -223,6 +224,9 @@ SUBROUTINE RayTracing() CALL WritePhotonSurfSampleToHDF5() +! Load surface data to create local PhotonSampWall_loc array +CALL ReadRayTracingDataFromH5(onlySurfData=.TRUE.) + CALL WritePhotonVolSampleToHDF5() CALL FinalizeRayTracing() @@ -237,31 +241,113 @@ END SUBROUTINE RayTracing !=================================================================================================================================== !> Read ray tracing volume and surface data (instead of running the actual ray tracing calculation) -!> 1. Get element polynomial degree +!> 1.) Get surface sampled values +!> 2.) Get element polynomial !=================================================================================================================================== -SUBROUTINE ReadRayTracingDataFromH5() +SUBROUTINE ReadRayTracingDataFromH5(onlySurfData) ! MODULES USE MOD_Globals USE MOD_IO_HDF5 USE MOD_PreProc -USE MOD_HDF5_Input ,ONLY: ReadArray,DatasetExists -USE MOD_Photon_TrackingVars ,ONLY: RadiationSurfState,RadiationVolState -USE MOD_Mesh_Vars ,ONLY: offsetElem,nElems,nGlobalElems -USE MOD_RayTracing_Vars ,ONLY: N_DG_Ray_loc,Ray,nVarRay,U_N_Ray_loc,PREF_VDM_Ray,N_Inter_Ray,RayElemEmission -USE MOD_ChangeBasis ,ONLY: ChangeBasis3D -USE MOD_RayTracing_Vars ,ONLY: RaySecondaryVectorX,RaySecondaryVectorY,RaySecondaryVectorZ +USE MOD_HDF5_Input ,ONLY: ReadArray,DatasetExists,GetDataSize,nDims,HSize,File_ID +USE MOD_Photon_TrackingVars ,ONLY: RadiationSurfState,RadiationVolState,PhotonSampWall_loc +USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWallHDF5,PhotonSampWallHDF5_Shared,PhotonSampWallHDF5_Shared_Win +USE MOD_Mesh_Vars ,ONLY: offsetElem,nElems,nGlobalElems +USE MOD_RayTracing_Vars ,ONLY: N_DG_Ray_loc,Ray,nVarRay,U_N_Ray_loc,PREF_VDM_Ray,N_Inter_Ray,RayElemEmission +USE MOD_ChangeBasis ,ONLY: ChangeBasis3D +USE MOD_RayTracing_Vars ,ONLY: RaySecondaryVectorX,RaySecondaryVectorY,RaySecondaryVectorZ +USE MOD_Mesh_Vars ,ONLY: nBCSides,offsetElem,SideToElem +USE MOD_Particle_Boundary_Vars ,ONLY: nSurfSample +USE MOD_Particle_Mesh_Tools ,ONLY: GetGlobalNonUniqueSideID +#if USE_MPI +USE MOD_MPI_Shared +USE MOD_MPI_Shared_Vars ,ONLY: MPI_COMM_SHARED,myComputeNodeRank +#endif /*USE_MPI*/ +!#if MPI +!#endif /*MPI*/ IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------! ! INPUT / OUTPUT VARIABLES +LOGICAL,INTENT(IN) :: onlySurfData !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -INTEGER :: iElem,Nloc,iVar,k,l,m -LOGICAL :: ContainerExists -REAL :: N_DG_Ray_locREAL(1:nElems) -REAL :: UNMax(nVarRay,0:Ray%NMax,0:Ray%NMax,0:Ray%NMax,PP_nElems) -REAL :: UNMax_loc(nVarRay,0:Ray%NMax,0:Ray%NMax,0:Ray%NMax) +INTEGER :: iElem,Nloc,iVar,k,l,m,iSurfSideHDF5,nSurfSidesHDF5,BCSideID,iLocSide,locElemID,GlobalSideID,SideID +LOGICAL :: ContainerExists +REAL :: N_DG_Ray_locREAL(1:nElems) +REAL :: UNMax(nVarRay,0:Ray%NMax,0:Ray%NMax,0:Ray%NMax,PP_nElems) +REAL :: UNMax_loc(nVarRay,0:Ray%NMax,0:Ray%NMax,0:Ray%NMax) +INTEGER, ALLOCATABLE :: GlobalSideIndex(:) !=================================================================================================================================== -! 1. Get local element polynomial degree + +! 1.) Get surface sampled values +#if USE_MPI +! Only shared memory leaders load the data from .h5 +IF(myComputeNodeRank.EQ.0)THEN +#endif + CALL OpenDataFile(RadiationSurfState,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_LEADERS) + CALL DatasetExists(File_ID,'SurfaceDataGlobalSideIndex',ContainerExists) + IF(.NOT.ContainerExists) CALL CollectiveStop(__STAMP__,'SurfaceDataGlobalSideIndex container not in '//TRIM(RadiationSurfState)) + CALL GetDataSize(File_ID,'SurfaceDataGlobalSideIndex',nDims,HSize,attrib=.FALSE.) + nSurfSidesHDF5 = INT(HSize(1),4) + IF(nSurfSidesHDF5.LT.1) CALL abort(__STAMP__,'Number of surf sample sides .h5 file is less than 1') + ALLOCATE(GlobalSideIndex(nSurfSidesHDF5)) + CALL ReadArray('SurfaceDataGlobalSideIndex',1,(/INT(nSurfSidesHDF5,IK)/),0_IK,1,IntegerArray_i4=GlobalSideIndex) +#if USE_MPI +END IF +! Node leaders notify the processes on their node +CALL MPI_BCAST(nSurfSidesHDF5,1,MPI_INTEGER,0,MPI_COMM_SHARED,iERROR) +#else +ALLOCATE(PhotonSampWallHDF5(1:3,1:nSurfSample,1:nSurfSample,1:nSurfSidesHDF5)) +#endif + + +#if USE_MPI +CALL Allocate_Shared((/3,nSurfSample,nSurfSample,nSurfSidesHDF5/),PhotonSampWallHDF5_Shared_Win,PhotonSampWallHDF5_Shared) +CALL MPI_WIN_LOCK_ALL(0,PhotonSampWallHDF5_Shared_Win,IERROR) +PhotonSampWallHDF5 => PhotonSampWallHDF5_Shared +! Only shared memory leaders load the data from .h5 +IF(myComputeNodeRank.EQ.0)THEN +#endif + CALL DatasetExists(File_ID,'SurfaceData',ContainerExists) + IF(.NOT.ContainerExists) CALL CollectiveStop(__STAMP__,'SurfaceData container not in '//TRIM(RadiationSurfState)) + CALL ReadArray('SurfaceData',4,(/3_IK,INT(nSurfSample,IK),INT(nSurfSample,IK),INT(nSurfSidesHDF5,IK)/),0_IK,1,RealArray=PhotonSampWallHDF5) + CALL CloseDataFile() + ! Small hack: replace 3rd index with global ID + DO iSurfSideHDF5 = 1, nSurfSidesHDF5 + PhotonSampWallHDF5(3,:,:,iSurfSideHDF5) = REAL(GlobalSideIndex(iSurfSideHDF5)) + END DO ! iSurfSideHDF5 = 1, nSurfSidesHDF5 +#if USE_MPI +END IF +! This sync/barrier is required as it cannot be guaranteed that the zeros have been written to memory by the time the MPI_REDUCE +! is executed (see MPI specification). Until the Sync is complete, the status is undefined, i.e., old or new value or utter nonsense. +CALL BARRIER_AND_SYNC(PhotonSampWallHDF5_Shared_Win,MPI_COMM_SHARED) +#endif /*USE_MPI*/ + +ALLOCATE(PhotonSampWall_loc(1:nSurfSample,1:nSurfSample,1:nBCSides)) +PhotonSampWall_loc = -1.0 +! Loop through large loop (TODO: can this be made cheaper?) +DO iSurfSideHDF5 = 1, nSurfSidesHDF5 +#if USE_MPI + GlobalSideID = INT(PhotonSampWallHDF5(3,1,1,iSurfSideHDF5)) +#else + GlobalSideID = GlobalSideIndex(iSurfSideHDF5) +#endif /*USE_MPI*/ + ! Loop through process-local (hopefully small) loop + DO BCSideID = 1, nBCSides + locElemID = SideToElem(S2E_ELEM_ID,BCSideID) + iLocSide = SideToElem(S2E_LOC_SIDE_ID,BCSideID) + SideID = GetGlobalNonUniqueSideID(offsetElem+locElemID,iLocSide) + IF(GlobalSideID.EQ.SideID)THEN + PhotonSampWall_loc(1:nSurfSample,1:nSurfSample,BCSideID) = PhotonSampWallHDF5(2,1:nSurfSample,1:nSurfSample,iSurfSideHDF5) + END IF ! GlobalSideID.EQ. + END DO ! BCSideID = 1,nBCSides +END DO ! iSurfSideHDF5 = 1, nSurfSidesHDF5 + + +! Check if only the surface data is to be loaded +IF(onlySurfData) RETURN + +! 2. Get local element polynomial CALL OpenDataFile(RadiationVolState,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_WORLD) CALL DatasetExists(File_ID,'Nloc',ContainerExists) IF(.NOT.ContainerExists) CALL CollectiveStop(__STAMP__,'Nloc container does not exist in '//TRIM(RadiationVolState)) @@ -271,8 +357,7 @@ SUBROUTINE ReadRayTracingDataFromH5() ! Sanity check IF(ANY(N_DG_Ray_loc.LE.0)) CALL abort(__STAMP__,'N_DG_Ray_loc cannot contain zeros!') -! 1. Get local ray tracing solution -! The local DG solution in physical space +! Get local ray tracing solution (the local DG solution in physical space) ALLOCATE(U_N_Ray_loc(1:nElems)) DO iElem = 1, nElems Nloc = N_DG_Ray_loc(iElem) @@ -343,12 +428,9 @@ SUBROUTINE ReadRayTracingDataFromH5() IF(.NOT.ContainerExists) CALL CollectiveStop(__STAMP__,'RaySecondaryVectorZ container does not exist in '//TRIM(RadiationVolState)) CALL ReadArray('RaySecondaryVectorZ',2,(/1_IK,INT(nElems,IK)/),INT(offsetElem,IK),2,RealArray=RaySecondaryVectorZ) -!WRITE (*,*) "RaySecondaryVectorX =", RaySecondaryVectorX -!WRITE (*,*) "RaySecondaryVectorY =", RaySecondaryVectorY -!WRITE (*,*) "RaySecondaryVectorZ =", RaySecondaryVectorZ -!WRITE (*,*) "TRIM(RadiationSurfState) =", TRIM(RadiationSurfState) -!read* CALL CloseDataFile() + + END SUBROUTINE ReadRayTracingDataFromH5 diff --git a/src/radiation/ray_tracing/raytrace_ini.f90 b/src/radiation/ray_tracing/raytrace_ini.f90 index 328fa2d48..0c53daee6 100644 --- a/src/radiation/ray_tracing/raytrace_ini.f90 +++ b/src/radiation/ray_tracing/raytrace_ini.f90 @@ -545,7 +545,7 @@ SUBROUTINE FinalizeRayTracing() #if USE_MPI USE MOD_MPI_Shared_Vars ,ONLY: MPI_COMM_SHARED USE MOD_MPI_Shared -USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWallProc +USE MOD_Photon_TrackingVars #endif /*USE_MPI*/ IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------! @@ -598,6 +598,16 @@ SUBROUTINE FinalizeRayTracing() SDEALLOCATE(ElemVolume) SDEALLOCATE(RayElemEmission) + + SDEALLOCATE(PhotonSampWall_loc) ! ray tracing + plasma simulation + +#if USE_MPI + CALL MPI_BARRIER(MPI_COMM_SHARED,iError) + CALL UNLOCK_AND_FREE(PhotonSampWallHDF5_Shared_Win) + CALL MPI_BARRIER(MPI_COMM_SHARED,iError) + ADEALLOCATE(PhotonSampWallHDF5_Shared) + ADEALLOCATE(PhotonSampWallHDF5) +#endif /*USE_MPI*/ END IF ! PerformRayTracing END SUBROUTINE FinalizeRayTracing diff --git a/src/restart/restart.f90 b/src/restart/restart.f90 index ee544f64b..f7629dad3 100644 --- a/src/restart/restart.f90 +++ b/src/restart/restart.f90 @@ -318,6 +318,8 @@ SUBROUTINE Restart() #endif /*PP_POIS*/ #if defined(PARTICLES) USE MOD_Particle_Restart ,ONLY: ParticleRestart +!USE MOD_RayTracing ,ONLY: ReadRayTracingDataFromH5 +USE MOD_RayTracing ,ONLY: RayTracing #endif /*defined(PARTICLES)*/ #if USE_HDG USE MOD_Restart_Tools ,ONLY: RecomputeLambda @@ -346,6 +348,9 @@ SUBROUTINE Restart() #ifdef PARTICLES ! Restart particle arrays CALL ParticleRestart() + ! Get ray tracing volume and surface data + !CALL ReadRayTracingDataFromH5(onlySurfData=.FALSE.) + CALL RayTracing() #endif /*PARTICLES*/ #if USE_HDG From 10844d5730b3dda67262323912e0fdd29ae82aa4 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Fri, 28 Jul 2023 10:18:34 +0200 Subject: [PATCH 130/495] Ray tracing based emission: Skip elements where no surface or volume emission occurs (elements are flagged prior to execution). --- src/particles/emission/particle_photoionization.f90 | 8 ++++++-- src/radiation/ray_tracing/raytrace.f90 | 6 +++++- src/radiation/ray_tracing/raytrace_vars.f90 | 2 +- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/particles/emission/particle_photoionization.f90 b/src/particles/emission/particle_photoionization.f90 index 447267935..9aae77a7e 100644 --- a/src/particles/emission/particle_photoionization.f90 +++ b/src/particles/emission/particle_photoionization.f90 @@ -40,7 +40,7 @@ SUBROUTINE PhotoIonization_RayTracing_SEE() USE MOD_Timedisc_Vars ,ONLY: dt,time USE MOD_Particle_Boundary_Vars ,ONLY: nSurfSample, Partbound, DoBoundaryParticleOutputHDF5 USE MOD_Particle_Vars ,ONLY: Species, PartState, usevMPF -USE MOD_RayTracing_Vars ,ONLY: Ray,UseRayTracing +USE MOD_RayTracing_Vars ,ONLY: Ray,UseRayTracing,RayElemEmission USE MOD_part_emission_tools ,ONLY: CalcPhotonEnergy USE MOD_Particle_Mesh_Vars ,ONLY: SideInfo_Shared,UseBezierControlPoints USE MOD_Particle_Surfaces_Vars ,ONLY: BezierControlPoints3D, BezierSampleXi @@ -146,6 +146,8 @@ SUBROUTINE PhotoIonization_RayTracing_SEE() DO BCSideID=1,nBCSides locElemID = SideToElem(S2E_ELEM_ID,BCSideID) + ! Skip elements without ionization + IF(.NOT.RayElemEmission(locElemID)) CYCLE iLocSide = SideToElem(S2E_LOC_SIDE_ID,BCSideID) SideID = GetGlobalNonUniqueSideID(offsetElem+locElemID,iLocSide) !iSurfSide = GlobalSide2SurfSide(SURF_SIDEID,SideID) @@ -266,7 +268,7 @@ SUBROUTINE PhotoIonization_RayTracing_Volume() USE MOD_Timedisc_Vars ,ONLY: dt,time USE MOD_Mesh_Vars ,ONLY: nElems, offsetElem USE MOD_Mesh_Vars ,ONLY: NGeo,wBaryCL_NGeo,XiCL_NGeo,XCL_NGeo -USE MOD_RayTracing_Vars ,ONLY: UseRayTracing, Ray +USE MOD_RayTracing_Vars ,ONLY: UseRayTracing, Ray,RayElemEmission USE MOD_RayTracing_Vars ,ONLY: U_N_Ray_loc,N_DG_Ray_loc,N_Inter_Ray USE MOD_Particle_Vars ,ONLY: Species, PartState, usevMPF, PartMPF, PDM, PEM, PartSpecies USE MOD_DSMC_Vars ,ONLY: ChemReac, DSMC, SpecDSMC, BGGas, Coll_pData, CollisMode, PartStateIntEn @@ -339,6 +341,8 @@ SUBROUTINE PhotoIonization_RayTracing_Volume() TimeScalingFactor = 0.5 * SQRT(PI) * tau * (ERF(t_2/tau)-ERF(t_1/tau)) DO iElem=1, nElems + ! Skip elements without ionization + IF(.NOT.RayElemEmission(iElem)) CYCLE iGlobalElem = iElem+offSetElem ! iCNElem = GetCNElemID(iGlobalElem) NRayLoc = N_DG_Ray_loc(iElem) diff --git a/src/radiation/ray_tracing/raytrace.f90 b/src/radiation/ray_tracing/raytrace.f90 index 2e3ebec5f..36b0ca238 100644 --- a/src/radiation/ray_tracing/raytrace.f90 +++ b/src/radiation/ray_tracing/raytrace.f90 @@ -339,12 +339,16 @@ SUBROUTINE ReadRayTracingDataFromH5(onlySurfData) SideID = GetGlobalNonUniqueSideID(offsetElem+locElemID,iLocSide) IF(GlobalSideID.EQ.SideID)THEN PhotonSampWall_loc(1:nSurfSample,1:nSurfSample,BCSideID) = PhotonSampWallHDF5(2,1:nSurfSample,1:nSurfSample,iSurfSideHDF5) + ! Check if element fas already been flagged an emission element (either volume or surface emission) + IF(.NOT.RayElemEmission(locElemID))THEN + IF(ANY(PhotonSampWall_loc(1:nSurfSample,1:nSurfSample,BCSideID).GT.0.0)) RayElemEmission(locElemID) = .TRUE. + END IF ! .NOT.RayElemEmission(locElemID) END IF ! GlobalSideID.EQ. END DO ! BCSideID = 1,nBCSides END DO ! iSurfSideHDF5 = 1, nSurfSidesHDF5 -! Check if only the surface data is to be loaded +! Check if only the surface data is to be loaded (non-restart and non-load balance case) IF(onlySurfData) RETURN ! 2. Get local element polynomial diff --git a/src/radiation/ray_tracing/raytrace_vars.f90 b/src/radiation/ray_tracing/raytrace_vars.f90 index 6e7888c0e..23e586ea3 100644 --- a/src/radiation/ray_tracing/raytrace_vars.f90 +++ b/src/radiation/ray_tracing/raytrace_vars.f90 @@ -73,7 +73,7 @@ MODULE MOD_RayTracing_Vars TYPE (tRadTrans) :: RadTrans !< LOGICAL :: RayForceAbsorption !< Surface photon sampling is performed independent of the actual absorption/reflection outcome (default=T) -LOGICAL, ALLOCATABLE :: RayElemEmission(:) !< Flag elements that are relevant for volume photoionization +LOGICAL, ALLOCATABLE :: RayElemEmission(:) !< Flag elements that are relevant for volume or surface photoionization INTEGER :: NumRays !< INTEGER :: RayPartBound !< Particle boundary ID where rays are emitted from From caf37506ada6287b7f2ac3debbaa78f55a5f6704 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Fri, 28 Jul 2023 11:50:30 +0200 Subject: [PATCH 131/495] Fixes in ray tracing and related SEE --- .../emission/particle_photoionization.f90 | 125 +++++++++--------- .../tracking/radtrans_tracking_output.f90 | 4 +- .../tracking/radtrans_tracking_tools.f90 | 4 +- 3 files changed, 70 insertions(+), 63 deletions(-) diff --git a/src/particles/emission/particle_photoionization.f90 b/src/particles/emission/particle_photoionization.f90 index 9aae77a7e..4e834859f 100644 --- a/src/particles/emission/particle_photoionization.f90 +++ b/src/particles/emission/particle_photoionization.f90 @@ -38,7 +38,7 @@ SUBROUTINE PhotoIonization_RayTracing_SEE() USE MOD_Globals USE MOD_Globals_Vars ,ONLY: PI USE MOD_Timedisc_Vars ,ONLY: dt,time -USE MOD_Particle_Boundary_Vars ,ONLY: nSurfSample, Partbound, DoBoundaryParticleOutputHDF5 +USE MOD_Particle_Boundary_Vars ,ONLY: nSurfSample, Partbound, DoBoundaryParticleOutputHDF5,SurfSideArea USE MOD_Particle_Vars ,ONLY: Species, PartState, usevMPF USE MOD_RayTracing_Vars ,ONLY: Ray,UseRayTracing,RayElemEmission USE MOD_part_emission_tools ,ONLY: CalcPhotonEnergy @@ -50,7 +50,7 @@ SUBROUTINE PhotoIonization_RayTracing_SEE() USE MOD_Particle_Boundary_Tools ,ONLY: StoreBoundaryParticleProperties USE MOD_part_operations ,ONLY: CreateParticle USE MOD_Particle_Mesh_Tools ,ONLY: GetGlobalNonUniqueSideID -!USE MOD_Particle_Boundary_Vars ,ONLY: GlobalSide2SurfSide +USE MOD_Particle_Boundary_Vars ,ONLY: GlobalSide2SurfSide #ifdef LSERK USE MOD_Timedisc_Vars ,ONLY: iStage, RK_c, nRKStages #endif @@ -76,7 +76,7 @@ SUBROUTINE PhotoIonization_RayTracing_SEE() !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES REAL :: t_1, t_2, E_Intensity -INTEGER :: NbrOfRepetitions, SideID, iSample, GlobElemID, PartID, BCSideID, iLocSide, locElemID +INTEGER :: NbrOfRepetitions, SideID, iSample, GlobElemID, PartID, BCSideID, iLocSide, locElemID, iSurfSide INTEGER :: p, q, BCID, SpecID, iPart, NbrOfSEE, iSEEBC REAL :: RealNbrOfSEE, TimeScalingFactor, MPF REAL :: Particle_pos(1:3), xi(2) @@ -150,7 +150,7 @@ SUBROUTINE PhotoIonization_RayTracing_SEE() IF(.NOT.RayElemEmission(locElemID)) CYCLE iLocSide = SideToElem(S2E_LOC_SIDE_ID,BCSideID) SideID = GetGlobalNonUniqueSideID(offsetElem+locElemID,iLocSide) - !iSurfSide = GlobalSide2SurfSide(SURF_SIDEID,SideID) + iSurfSide = GlobalSide2SurfSide(SURF_SIDEID,SideID) !SideID = SurfSide2GlobalSide(SURF_SIDEID,iSurfSide) ! TODO: Skip sides which are not mine in the MPI case BCID = PartBound%MapToPartBC(SideInfo_Shared(SIDE_BCID,SideID)) @@ -179,74 +179,76 @@ SUBROUTINE PhotoIonization_RayTracing_SEE() DO q = 1, nSurfSample ! Calculate the number of SEEs per subside !E_Intensity = PhotonSampWall(2,p,q,iSurfSide) * TimeScalingFactor - E_Intensity = PhotonSampWall_loc(p,q,BCSideID) * TimeScalingFactor + E_Intensity = PhotonSampWall_loc(p,q,BCSideID) * SurfSideArea(p,q,iSurfSide) * TimeScalingFactor RealNbrOfSEE = E_Intensity / CalcPhotonEnergy(lambda) * PartBound%PhotonSEEYield(BCID) / MPF CALL RANDOM_NUMBER(RandVal) NbrOfSEE = INT(RealNbrOfSEE+RandVal) - ! Check if photon SEE electric current is to be measured - IF((NbrOfSEE.GT.0).AND.(CalcElectronSEE))THEN - ! Note that the negative value of the charge -q is used below - iSEEBC = SEE%BCIDToSEEBCID(BCID) - SEE%RealElectronOut(iSEEBC) = SEE%RealElectronOut(iSEEBC) - MPF*NbrOfSEE*Species(SpecID)%ChargeIC - END IF ! (NbrOfSEE.GT.0).AND.(CalcElectronSEE) - ! Calculate the normal & tangential vectors - IF(UseBezierControlPoints)THEN - ! Use Bezier polynomial - xi(1)=(BezierSampleXi(p-1)+BezierSampleXi(p))/2. ! (a+b)/2 - xi(2)=(BezierSampleXi(q-1)+BezierSampleXi(q))/2. ! (a+b)/2 - xiab(1,1:2)=(/BezierSampleXi(p-1),BezierSampleXi(p)/) - xiab(2,1:2)=(/BezierSampleXi(q-1),BezierSampleXi(q)/) - CALL CalcNormAndTangBezier(nVec,tang1,tang2,xi(1),xi(2),SideID) - ELSE - ! Sanity check - CALL abort(__STAMP__,'Photoionization with ray tracing requires BezierControlPoints3D') - END IF ! nSurfSample.GT.1 - ! Normal vector provided by the routine points outside of the domain - nVec = -nVec - ! Loop over number of particles to be inserted - DO iPart = 1, NbrOfSEE - ! Determine particle position within the sub-side - CALL RANDOM_NUMBER(RandVal2) + IF(NbrOfSEE.GT.0)THEN + ! Check if photon SEE electric current is to be measured + IF(CalcElectronSEE)THEN + ! Note that the negative value of the charge -q is used below + iSEEBC = SEE%BCIDToSEEBCID(BCID) + SEE%RealElectronOut(iSEEBC) = SEE%RealElectronOut(iSEEBC) - MPF*NbrOfSEE*Species(SpecID)%ChargeIC + END IF ! (NbrOfSEE.GT.0).AND.(CalcElectronSEE) + ! Calculate the normal & tangential vectors IF(UseBezierControlPoints)THEN ! Use Bezier polynomial - xi=(xiab(:,2)-xiab(:,1))*RandVal2+xiab(:,1) - CALL EvaluateBezierPolynomialAndGradient(xi,NGeo,3,BezierControlPoints3D(1:3,0:NGeo,0:NGeo,SideID),Point=Particle_pos(1:3)) + xi(1)=(BezierSampleXi(p-1)+BezierSampleXi(p))/2. ! (a+b)/2 + xi(2)=(BezierSampleXi(q-1)+BezierSampleXi(q))/2. ! (a+b)/2 + xiab(1,1:2)=(/BezierSampleXi(p-1),BezierSampleXi(p)/) + xiab(2,1:2)=(/BezierSampleXi(q-1),BezierSampleXi(q)/) + CALL CalcNormAndTangBezier(nVec,tang1,tang2,xi(1),xi(2),SideID) ELSE ! Sanity check CALL abort(__STAMP__,'Photoionization with ray tracing requires BezierControlPoints3D') END IF ! nSurfSample.GT.1 - ! Determine particle velocity - CALL CalcVelocity_FromWorkFuncSEE(PartBound%PhotonSEEWorkFunction(BCID), Species(SpecID)%MassIC, tang1, nVec, Velo3D) - ! Create new particle - CALL CreateParticle(SpecID,Particle_pos(1:3),GlobElemID,Velo3D(1:3),0.,0.,0.,NewPartID=PartID,NewMPF=MPF) - ! 1. Store the particle information in PartStateBoundary.h5 - IF(DoBoundaryParticleOutputHDF5) THEN - CALL StoreBoundaryParticleProperties(PartID,SpecID,PartState(1:3,PartID),& + ! Normal vector provided by the routine points outside of the domain + nVec = -nVec + ! Loop over number of particles to be inserted + DO iPart = 1, NbrOfSEE + ! Determine particle position within the sub-side + CALL RANDOM_NUMBER(RandVal2) + IF(UseBezierControlPoints)THEN + ! Use Bezier polynomial + xi=(xiab(:,2)-xiab(:,1))*RandVal2+xiab(:,1) + CALL EvaluateBezierPolynomialAndGradient(xi,NGeo,3,BezierControlPoints3D(1:3,0:NGeo,0:NGeo,SideID),Point=Particle_pos(1:3)) + ELSE + ! Sanity check + CALL abort(__STAMP__,'Photoionization with ray tracing requires BezierControlPoints3D') + END IF ! nSurfSample.GT.1 + ! Determine particle velocity + CALL CalcVelocity_FromWorkFuncSEE(PartBound%PhotonSEEWorkFunction(BCID), Species(SpecID)%MassIC, tang1, nVec, Velo3D) + ! Create new particle + CALL CreateParticle(SpecID,Particle_pos(1:3),GlobElemID,Velo3D(1:3),0.,0.,0.,NewPartID=PartID,NewMPF=MPF) + ! 1. Store the particle information in PartStateBoundary.h5 + IF(DoBoundaryParticleOutputHDF5) THEN + CALL StoreBoundaryParticleProperties(PartID,SpecID,PartState(1:3,PartID),& UNITVECTOR(PartState(4:6,PartID)),nVec,iPartBound=BCID,mode=2,MPF_optIN=MPF) - END IF ! DoBoundaryParticleOutputHDF5 + END IF ! DoBoundaryParticleOutputHDF5 #if USE_HDG - ! 2. Check if floating boundary conditions (FPC) are used and consider electron holes - IF(UseFPC)THEN - iBC = PartBound%MapToFieldBC(BCID) - IF(iBC.LE.0) CALL abort(__STAMP__,'iBC = PartBound%MapToFieldBC(PartBCIndex) must be >0',IntInfoOpt=iBC) - IF(BoundaryType(iBC,BC_TYPE).EQ.20)THEN ! BCType = BoundaryType(iBC,BC_TYPE) - BCState = BoundaryType(iBC,BC_STATE) ! State is iFPC - iUniqueFPCBC = FPC%Group(BCState,2) - FPC%ChargeProc(iUniqueFPCBC) = FPC%ChargeProc(iUniqueFPCBC) - Species(SpecID)%ChargeIC * MPF ! Use negative charge! - END IF ! BCType.EQ.20 - END IF ! UseFPC - ! 3. Check if electric potential condition (EPC) are used and consider electron holes - IF(UseEPC)THEN - iBC = PartBound%MapToFieldBC(BCID) - IF(iBC.LE.0) CALL abort(__STAMP__,'iBC = PartBound%MapToFieldBC(PartBCIndex) must be >0',IntInfoOpt=iBC) - IF(BoundaryType(iBC,BC_TYPE).EQ.8)THEN ! BCType = BoundaryType(iBC,BC_TYPE) - BCState = BoundaryType(iBC,BC_STATE) ! State is iEPC - iUniqueEPCBC = EPC%Group(BCState,2) - EPC%ChargeProc(iUniqueEPCBC) = EPC%ChargeProc(iUniqueEPCBC) - Species(SpecID)%ChargeIC * MPF ! Use negative charge! - END IF ! BCType.EQ.8 - END IF ! UseEPC + ! 2. Check if floating boundary conditions (FPC) are used and consider electron holes + IF(UseFPC)THEN + iBC = PartBound%MapToFieldBC(BCID) + IF(iBC.LE.0) CALL abort(__STAMP__,'iBC = PartBound%MapToFieldBC(PartBCIndex) must be >0',IntInfoOpt=iBC) + IF(BoundaryType(iBC,BC_TYPE).EQ.20)THEN ! BCType = BoundaryType(iBC,BC_TYPE) + BCState = BoundaryType(iBC,BC_STATE) ! State is iFPC + iUniqueFPCBC = FPC%Group(BCState,2) + FPC%ChargeProc(iUniqueFPCBC) = FPC%ChargeProc(iUniqueFPCBC) - Species(SpecID)%ChargeIC * MPF ! Use negative charge! + END IF ! BCType.EQ.20 + END IF ! UseFPC + ! 3. Check if electric potential condition (EPC) are used and consider electron holes + IF(UseEPC)THEN + iBC = PartBound%MapToFieldBC(BCID) + IF(iBC.LE.0) CALL abort(__STAMP__,'iBC = PartBound%MapToFieldBC(PartBCIndex) must be >0',IntInfoOpt=iBC) + IF(BoundaryType(iBC,BC_TYPE).EQ.8)THEN ! BCType = BoundaryType(iBC,BC_TYPE) + BCState = BoundaryType(iBC,BC_STATE) ! State is iEPC + iUniqueEPCBC = EPC%Group(BCState,2) + EPC%ChargeProc(iUniqueEPCBC) = EPC%ChargeProc(iUniqueEPCBC) - Species(SpecID)%ChargeIC * MPF ! Use negative charge! + END IF ! BCType.EQ.8 + END IF ! UseEPC #endif /*USE_HDG*/ - END DO + END DO ! iPart = 1, NbrOfSEE + END IF ! NbrOfSEE.GT.0 END DO ! q = 1, nSurfSample END DO ! p = 1, nSurfSample END DO @@ -280,6 +282,9 @@ SUBROUTINE PhotoIonization_RayTracing_Volume() USE MOD_part_emission_tools ,ONLY: CalcVelocity_maxwell_lpn, DSMC_SetInternalEnr_LauxVFD USE MOD_DSMC_PolyAtomicModel ,ONLY: DSMC_SetInternalEnr_Poly USE MOD_part_tools ,ONLY: CalcVelocity_maxwell_particle +#if defined(LSERK) +USE MOD_TimeDisc_Vars ,ONLY: iStage,nRKStages,RK_c +#endif /*defined(LSERK)*/ !----------------------------------------------------------------------------------------------------------------------------------! ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 index feaea32ae..3f74decb3 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 @@ -418,6 +418,8 @@ SUBROUTINE ExchangeRadiationSurfData() ELSE CALL MPI_REDUCE(PhotonSampWallProc, 0 , MessageSize, MPI_DOUBLE_PRECISION, MPI_SUM, 0, MPI_COMM_SHARED, IERROR) ENDIF +! Nullify process-local array +PhotonSampWallProc = 0.0 ! Update CALL BARRIER_AND_SYNC(PhotonSampWall_Shared_Win,MPI_COMM_SHARED) @@ -605,6 +607,7 @@ SUBROUTINE ExchangeRayVolInfo() END IF ALLOCATE(RayElemPassedEnergyHO(nVarRay,nGlobalEntries)) + RayElemPassedEnergyHO=0. ALLOCATE(RayElemOffset(nGlobalElems)) !> Shared arrays for high-order volume sampling CALL Allocate_Shared((/nVarRay,INT(nGlobalEntries,4)/),RayElemPassedEnergyHO_Shared_Win,RayElemPassedEnergyHO_Shared) @@ -624,7 +627,6 @@ SUBROUTINE ExchangeRayVolInfo() MessageSize = nVarRay * INT(nGlobalEntries,4) - ! Reduce data to each node leader IF (myComputeNodeRank.EQ.0) THEN CALL MPI_REDUCE(RayElemPassedEnergyHO, RayElemPassedEnergyHO_Shared, MessageSize, MPI_DOUBLE_PRECISION, MPI_SUM, 0, MPI_COMM_SHARED, IERROR) ELSE diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 index ea93245d8..dd49916e2 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 @@ -1359,8 +1359,8 @@ SUBROUTINE CalcWallAbsoprtion(IntersectionPos, GlobSideID, DONE, ForceWallSample END IF ! distance.LT.distanceMin END DO ! q = 1, nSurfSample END DO ! p = 1, nSurfSample - PhotonSampWall(1,p,q,SurfSideID) = PhotonSampWall(1,p,q,SurfSideID) + 1.0 - PhotonSampWall(2,p,q,SurfSideID) = PhotonSampWall(2,p,q,SurfSideID) + PhotonProps%PhotonEnergy + PhotonSampWallProc(1,p,q,SurfSideID) = PhotonSampWallProc(1,p,q,SurfSideID) + 1.0 + PhotonSampWallProc(2,p,q,SurfSideID) = PhotonSampWallProc(2,p,q,SurfSideID) + PhotonProps%PhotonEnergy ELSE PhotonSampWall(1,1,1,SurfSideID) = PhotonSampWall(1,1,1,SurfSideID) + 1.0 PhotonSampWall(2,1,1,SurfSideID) = PhotonSampWall(2,1,1,SurfSideID) + PhotonProps%PhotonEnergy From 71a1ac5aad36d115ca93390a1b25244a666bda86 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Fri, 28 Jul 2023 11:57:38 +0200 Subject: [PATCH 132/495] Adjusted SEE ray tracing reggie --- .../analyze.ini | 2 +- .../command_line.ini | 2 +- .../externals.ini | 11 +- .../parameter.ini | 28 +-- .../pre-piclas/parameter.ini | 186 ++++++++++++++++++ .../readme.md | 5 + src/radiation/ray_tracing/raytrace_ini.f90 | 2 +- 7 files changed, 217 insertions(+), 19 deletions(-) create mode 100644 regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/pre-piclas/parameter.ini diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/analyze.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/analyze.ini index 772f653b1..97f74e844 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/analyze.ini +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/analyze.ini @@ -2,7 +2,7 @@ compare_column_file = PartAnalyze.csv ! data file name compare_column_reference_file = Electrons_ref.csv ! data file name compare_column_index = 9 ! column index for comparison -compare_column_tolerance_value = 4e9 ! tolerance (depends on machine accuracy and MPI) +compare_column_tolerance_value = 5e9 ! tolerance (depends on machine accuracy and MPI) compare_column_tolerance_type = absolute ! absolute or relative tolerance ! integrate columns x:y in a data file as integral(y(x), x, x(1), x(end)) diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/command_line.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/command_line.ini index 181521dce..6f94bea14 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/command_line.ini +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/command_line.ini @@ -1,2 +1,2 @@ -MPI = 1!,2,5,8,11,25 +MPI = 1,2,5,8,11,25 cmd_suffix = DSMC.ini diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/externals.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/externals.ini index de70d12fd..84cc50efb 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/externals.ini +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/externals.ini @@ -1,5 +1,8 @@ ! --- Externals Tool Reggie -MPI = 1 -externalbinary = ./hopr/build/bin/hopr -externaldirectory = pre-hopr -externalruntime = pre +MPI = 1 , 6 +externalbinary = ./hopr/build/bin/hopr , bin/piclas +externaldirectory = pre-hopr , pre-piclas +externalruntime = pre , pre +cmd_suffix = , ../DSMC.ini + +nocrosscombination:MPI,externalbinary,externaldirectory,externalruntime,cmd_suffix diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini index 054569407..be5e90433 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini @@ -1,17 +1,20 @@ +NVisu = 1 +N = 1 +RayTracing-NMax = 2 +DSMC-nSurfSample= 2 +!NodeTypeVisu = GAUSS +NodeTypeVisu = VISU +RayTracing-NumRays = 10000 ! =============================================================================== ! ! POSTI ! =============================================================================== ! VisuParticles = T -NVisu = 1 -NodeTypeVisu = GAUSS -!NodeTypeVisu = VISU TimeStampLength = 21 ! =============================================================================== ! ! VARIABLES ! =============================================================================== ! CFLscale = 0.2 IniExactFunc = 0 -N = 1 DoLoadBalance = T Load-DeviationThreshold = 0.15 @@ -30,7 +33,7 @@ TrackingMethod = triatracking ! OUTPUT / VISUALIZATION ! =============================================================================== ! ProjectName = photoionization -IterDisplayStep = 10 +IterDisplayStep = 1 Part-AnalyzeStep = 1 CalcNumSpec = T @@ -38,6 +41,7 @@ CalcNumDens = T CalcElectronSEE = T +CalcMeshInfo = T !Surf-CalcCollCounter = T ! To Activate output of SurfaceAnalyze.csv !CheckExchangeProcs = T ! deactivate the asymmetric communicator check ! =============================================================================== ! @@ -119,19 +123,19 @@ Part-Boundary6-PhotonEnACC = 1.0 ! =============================================================================== ! ! Ray Tracing ! =============================================================================== ! -DSMC-nSurfSample = 2 -PIC-DoInterpolation = T ! activate ElemCurved, XiEtaZetaBasis and slenXiEtaZetaBasis (requires XCL_NGeo_Shared) -RayTracing-RayPosModel = 1 -Particles-DSMC-CalcSurfaceVal = T ! activate InitParticleBoundarySampling -RayTracing-PartBound = 6 ! -> iBC=6 -RayTracing-NumRays = 200000 -PhotonModeBPO = 1 +UseRayTracing = T +RayTracing-RayPosModel = 1 +RayTracing-PartBound = 6 ! -> iBC: 6 +PhotonModeBPO = 1 ! Debugging output: vectors +RayTracing-VolRefineMode = 3 ! Volumetric refinement +!RayTracing-VolRefineModeZ = 0.5 RayTracing-PulseDuration = 15e-9 RayTracing-WaveLength = 10e-9 RayTracing-Power = 1.0 RayTracing-RepetitionRate = 1000 RayTracing-RayDirection = (/ 0. , 0.0 , -1.0 /) +!RayTracing-RayDirection = (/ 0. , 0.5 , -1.0 /) ! =============================================================================== ! ! Weighting Factor ! =============================================================================== ! diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/pre-piclas/parameter.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/pre-piclas/parameter.ini new file mode 100644 index 000000000..ea919e2aa --- /dev/null +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/pre-piclas/parameter.ini @@ -0,0 +1,186 @@ +NVisu = 1 +N = 1 +RayTracing-NMax = 2 +DSMC-nSurfSample= 1 +!NodeTypeVisu = GAUSS +NodeTypeVisu = VISU +RayTracing-NumRays = 10000 +! =============================================================================== ! +! POSTI +! =============================================================================== ! +VisuParticles = T +TimeStampLength = 21 +! =============================================================================== ! +! VARIABLES +! =============================================================================== ! +CFLscale = 0.2 +IniExactFunc = 0 + +DoLoadBalance = T +Load-DeviationThreshold = 0.15 +LoadBalanceMaxSteps = 20 +DoInitialAutoRestart = T +! =============================================================================== ! +! MESH +! =============================================================================== ! +MeshFile = ../pre-hopr/box_mesh.h5 +Logging = F +WriteErrorFiles = F +useCurveds = F +! if boundaries have to be changed (else they are used from Mesh directly): +TrackingMethod = triatracking +! =============================================================================== ! +! OUTPUT / VISUALIZATION +! =============================================================================== ! +ProjectName = photoionization +IterDisplayStep = 10 +Part-AnalyzeStep = 1 + +CalcNumSpec = T +CalcNumDens = T + +CalcElectronSEE = T + +CalcMeshInfo = T +!Surf-CalcCollCounter = T ! To Activate output of SurfaceAnalyze.csv +!CheckExchangeProcs = T ! deactivate the asymmetric communicator check +! =============================================================================== ! +! CALCULATION +! =============================================================================== ! +ManualTimeStep = 5.0E-9 +tend = 5e-9!100.0E-9 +Analyze_dt = 100.0E-9 + +PIC-DoDeposition = F + +!PIC-DoInterpolation = F +Part-LorentzType = 0 + +epsCG = 1e-2 + +! Change boundary conditions from definition in hopr.ini +!BoundaryName = WALL +!BoundaryType = (/5,0/) +! =============================================================================== ! +! DSMC +! =============================================================================== ! +UseDSMC = T +Particles-DSMC-CollisMode = 0 +Part-NumberOfRandomSeeds = 2 +Particles-RandomSeed1 = 1 +Particles-RandomSeed2 = 2 +Particles-HaloEpsVelo = 3E8 ! 3e7 is enough for single-node run, but multi-node requires 3e8 + +Particles-DSMC-ElectronicModel = 1 +Particles-DSMCElectronicDatabase = Electronic-State-Database.h5 +EpsMergeElectronicState = 1E-2 +Part-Species$-ElecRelaxProb = 1. +! =============================================================================== ! +! PARTICLES +! =============================================================================== ! +Part-nSpecies = 5 +Part-maxParticleNumber = 4000000 +Part-nBounds = 6 + +Part-Boundary1-SourceName = BC_periodicx- +Part-Boundary1-Condition = reflective +Part-Boundary1-PhotonEnACC = 1.0 + +Part-Boundary2-SourceName = BC_periodicx+ +Part-Boundary2-Condition = reflective +Part-Boundary2-PhotonEnACC = 1.0 + +Part-Boundary3-SourceName = BC_periodicy- +Part-Boundary3-Condition = reflective +Part-Boundary3-PhotonEnACC = 1.0 + +Part-Boundary4-SourceName = BC_periodicy+ +Part-Boundary4-Condition = reflective +Part-Boundary4-PhotonEnACC = 1.0 + +Part-Boundary5-SourceName = BC_WALL +Part-Boundary5-Condition = reflective +Part-Boundary5-BoundaryParticleOutput = T +Part-Boundary5-PhotonSpecularReflection = F ! F: diffuse with PhotonEnACC, T: perfect mirror +Part-Boundary5-PhotonEnACC = 1.0 +Part-Boundary5-PhotonSEE-Yield = 0.1 +Part-Boundary5-PhotonSEE-WorkFunction = 10 +Part-Boundary5-PhotonSEE-ElectronSpecies= 3 + +! Change MPF of SEE particles +Part-vMPF = T +Part-Boundary5-PhotonSEE-MacroParticleFactor = 1E7 + +Part-Boundary6-SourceName = BC_TOP +Part-Boundary6-Condition = reflective +Part-Boundary6-PhotonEnACC = 1.0 +!Part-Boundary6-BoundaryParticleOutput = T + +!Part-nPeriodicVectors = 2 +!Part-FIBGMdeltas = (/ 1.0 , 1.0 , 1.0 /) +!Part-FactorFIBGM = (/ 5 , 5 , 5 /) + +! =============================================================================== ! +! Ray Tracing +! =============================================================================== ! +UseRayTracing = T +!PIC-DoInterpolation = T ! activate ElemCurved, XiEtaZetaBasis and slenXiEtaZetaBasis (requires XCL_NGeo_Shared) +RayTracing-RayPosModel = 1 +!Particles-DSMC-CalcSurfaceVal = T ! activate InitParticleBoundarySampling +RayTracing-PartBound = 6 ! -> iBC: 6 +PhotonModeBPO = 1 ! Debugging output: vectors +RayTracing-VolRefineMode = 3 ! Volumetric refinement +!RayTracing-VolRefineModeZ = 0.5 + +RayTracing-PulseDuration = 15e-9 +RayTracing-WaveLength = 10e-9 +RayTracing-Power = 1.0 +RayTracing-RepetitionRate = 1000 +!RayTracing-RayDirection = (/ 0. , 0.0 , -1.0 /) +RayTracing-RayDirection = (/ 0. , 0.5 , -1.0 /) +! =============================================================================== ! +! Weighting Factor +! =============================================================================== ! +Part-Species$-MacroParticleFactor = 1e4 +! =============================================================================== ! +! Species1 | H2 +! =============================================================================== ! +Part-Species1-MassIC = 3.348E-27 +Part-Species1-ChargeIC = 0.0 + +Part-Species1-nInits = 1 + +Part-Species1-Init1-velocityDistribution = maxwell_lpn +Part-Species1-Init1-SpaceIC = background +Part-Species1-Init1-VeloIC = 0. +Part-Species1-Init1-PartDensity = 10.0e20 +Part-Species1-Init1-VeloVecIC = (/0.,1.,0./) +Part-Species1-Init1-MWTemperatureIC = 300. +Part-Species1-Init1-TempVib = 300. +Part-Species1-Init1-TempRot = 300. +Part-Species1-Init1-TempElec = 300. +! =============================================================================== ! +! Species2 | H +! =============================================================================== ! +Part-Species2-MassIC = 1.674E-27 +Part-Species2-ChargeIC = 0.0 +Part-Species2-TempElec = 300. +! =============================================================================== ! +! Species3 | e +! =============================================================================== ! +Part-Species3-MassIC = 9.11E-31 +Part-Species3-ChargeIC = -1.60217653E-19 +! =============================================================================== ! +! Species4 | H2Ion +! =============================================================================== ! +Part-Species4-MassIC = 3.3470890E-27 +Part-Species4-ChargeIC = 1.60217653E-19 +!Part-Species4-TempVib = 300. +!Part-Species4-TempRot = 300. +!Part-Species4-TempElec = 300. +! =============================================================================== ! +! Species5 | HIon +! =============================================================================== ! +Part-Species5-MassIC = 1.673089E-27 +Part-Species5-ChargeIC = 1.60217653E-19 +!Part-Species5-TempElec = 300. diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/readme.md b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/readme.md index 9c5f0253e..fe396a25e 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/readme.md +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/readme.md @@ -1,7 +1,12 @@ # Photoionization: Surface Emission via SEE ++ hopr mesh is built on-the-fly + - 0.) single-core hopr run (pre-external) + Ray tracing model from which surface emission is calculated + - 1.) reference files are created by single-core run (pre-external) * Particle emission due to secondary electron emission from a surface * No deposition, no interpolation * Comparison of the number of emitted electrons with the reference solution * Different MPF and number of MPI ranks are tested to yield the same result + - 2.) single + multi node ray tracing runs and compare volume+surface output to .h5 (post-external) + - 3.) single + multi node plasma restart runs and compare the analytical or reference electron density over time (post-external) * Note: Because the volume is exactly 1 cubic metre, the calculated electron density is exactly the number of real electrons in the system diff --git a/src/radiation/ray_tracing/raytrace_ini.f90 b/src/radiation/ray_tracing/raytrace_ini.f90 index 0c53daee6..56f96e30c 100644 --- a/src/radiation/ray_tracing/raytrace_ini.f90 +++ b/src/radiation/ray_tracing/raytrace_ini.f90 @@ -214,7 +214,7 @@ SUBROUTINE InitHighOrderRaySampling() INTEGER :: Nloc,iCNElem,firstElem,lastElem,iGlobalElem,iElem REAL :: VolMin,VolMax,m,NReal #if defined(CODE_ANALYZE) -INTEGER :: iElem,CNElemID +INTEGER :: CNElemID LOGICAL,PARAMETER :: debugRay=.FALSE. #endif /*defined(CODE_ANALYZE)*/ LOGICAL :: FoundElem From 59bd77f295aa58b8de43622fd299cc8ec54fe3df Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Fri, 28 Jul 2023 13:06:58 +0200 Subject: [PATCH 133/495] Skip photo ionization routine if no respective reactions have been found --- src/mpi/mpi_shared_vars.f90 | 2 -- src/particles/dsmc/dsmc_chemical_init.f90 | 7 +++++-- src/particles/dsmc/dsmc_vars.f90 | 2 ++ src/particles/emission/particle_photoionization.f90 | 4 +++- 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/mpi/mpi_shared_vars.f90 b/src/mpi/mpi_shared_vars.f90 index 17298046c..9bd9f7828 100644 --- a/src/mpi/mpi_shared_vars.f90 +++ b/src/mpi/mpi_shared_vars.f90 @@ -74,7 +74,5 @@ MODULE MOD_MPI_Shared_Vars INTEGER :: MPI_INFO_SHARED_LOOSE !> MPI_INFO object allowing for re-ordering of same origin atomic RMA operations !> Other variables in particle_mesh_vars.f90 -#else -MPI_COMM_LEADERS_SURF=MPI_COMM_WORLD #endif /*USE_MPI*/ END MODULE diff --git a/src/particles/dsmc/dsmc_chemical_init.f90 b/src/particles/dsmc/dsmc_chemical_init.f90 index b0cccd4c1..c3e84c711 100644 --- a/src/particles/dsmc/dsmc_chemical_init.f90 +++ b/src/particles/dsmc/dsmc_chemical_init.f90 @@ -165,8 +165,9 @@ SUBROUTINE DSMC_chemical_init() IF(ChemReac%NumOfReact.LE.0) THEN CALL Abort(__STAMP__,' CollisMode = 3 requires a chemical reaction database. DSMC-NumOfReactions cannot be zero!') END IF -ChemReac%AnyQKReaction = .FALSE. -ChemReac%AnyXSecReaction = .FALSE. +ChemReac%AnyQKReaction = .FALSE. +ChemReac%AnyXSecReaction = .FALSE. +ChemReac%AnyPhIonReaction = .FALSE. ALLOCATE(ChemReac%ArbDiss(ChemReac%NumOfReact)) ! Allowing unspecified non-reactive collision partner (CH4 + M -> CH3 + H + M, e.g. (/1,0,0/) -> (/2,0,3/) iReacDiss = ChemReac%NumOfReact @@ -318,9 +319,11 @@ SUBROUTINE DSMC_chemical_init() CASE('phIon') ! Photo-ionization reactions ChemReac%CrossSection(iReac) = GETREAL('DSMC-Reaction'//TRIM(hilf)//'-CrossSection') + ChemReac%AnyPhIonReaction = .TRUE. CASE('phIonXSec') ! Photo-ionization reactions (data read-in from database) NbrOfPhotonXsecReactions = NbrOfPhotonXsecReactions + 1 + ChemReac%AnyPhIonReaction = .TRUE. CASE DEFAULT CALL abort(__STAMP__,'Selected reaction model is not supported in reaction number: ', IntInfoOpt=iReac) END SELECT diff --git a/src/particles/dsmc/dsmc_vars.f90 b/src/particles/dsmc/dsmc_vars.f90 index 3b1ae16ef..3e4e1589e 100644 --- a/src/particles/dsmc/dsmc_vars.f90 +++ b/src/particles/dsmc/dsmc_vars.f90 @@ -440,6 +440,8 @@ MODULE MOD_DSMC_Vars TYPE(tCollCaseInfo), ALLOCATABLE:: CollCaseInfo(:) ! Information of collision cases (nCase) ! XSec Chemistry LOGICAL :: AnyXSecReaction ! Defines if any XSec reaction is present + ! Photo-ionization Chemistry + LOGICAL :: AnyPhIonReaction ! Defines if any photo-ionization reaction is present END TYPE TYPE(tChemReactions) :: ChemReac diff --git a/src/particles/emission/particle_photoionization.f90 b/src/particles/emission/particle_photoionization.f90 index 4e834859f..3ee993199 100644 --- a/src/particles/emission/particle_photoionization.f90 +++ b/src/particles/emission/particle_photoionization.f90 @@ -305,8 +305,10 @@ SUBROUTINE PhotoIonization_RayTracing_Volume() IF(.NOT.UseRayTracing) RETURN -! TODO: Only if a photoionization reaction has been found +! Photo-ionization is currently only supported with CollisMode = 3 +IF(CollisMode.NE.3) RETURN +IF(.NOT.ChemReac%AnyPhIonReaction) RETURN ! Determine the time-dependent ray intensity ASSOCIATE(tau => Ray%PulseDuration ,& From 3f9a71ec94168a1cad08f76791fd92c666fe7191 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Fri, 28 Jul 2023 13:11:13 +0200 Subject: [PATCH 134/495] Output of ray tracing volume ionization to PartStateBoundary.h5 --- .../emission/particle_photoionization.f90 | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/particles/emission/particle_photoionization.f90 b/src/particles/emission/particle_photoionization.f90 index 4e834859f..507d59ef1 100644 --- a/src/particles/emission/particle_photoionization.f90 +++ b/src/particles/emission/particle_photoionization.f90 @@ -285,6 +285,8 @@ SUBROUTINE PhotoIonization_RayTracing_Volume() #if defined(LSERK) USE MOD_TimeDisc_Vars ,ONLY: iStage,nRKStages,RK_c #endif /*defined(LSERK)*/ +USE MOD_Particle_Boundary_Tools ,ONLY: StoreBoundaryParticleProperties +USE MOD_Particle_Boundary_Vars ,ONLY: DoBoundaryParticleOutputHDF5 !----------------------------------------------------------------------------------------------------------------------------------! ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -300,14 +302,13 @@ SUBROUTINE PhotoIonization_RayTracing_Volume() REAL :: t_1, t_2, E_Intensity, TimeScalingFactor REAL :: density, NbrOfPhotons, NbrOfReactions REAL :: RandNum,RandVal(3),Xi(3) -REAL :: RandomPos(1:3) +REAL :: RandomPos(1:3),MPF !=================================================================================================================================== IF(.NOT.UseRayTracing) RETURN ! TODO: Only if a photoionization reaction has been found - ! Determine the time-dependent ray intensity ASSOCIATE(tau => Ray%PulseDuration ,& tShift => Ray%tShift ,& @@ -451,10 +452,18 @@ SUBROUTINE PhotoIonization_RayTracing_Volume() ! Relative velocity is not required as the relative translational energy will not be considered Coll_pData(iPair)%CRela2 = 0. ! Weighting factor: use the weighting factor of the emission init + MPF = Species(SpecID)%MacroParticleFactor IF(usevMPF) THEN - PartMPF(PartID) = Species(SpecID)%MacroParticleFactor - PartMPF(newPartID) = PartMPF(PartID) + PartMPF(PartID) = MPF + PartMPF(newPartID) = MPF END IF + ! 1. Store the particle information in PartStateBoundary.h5 + IF(DoBoundaryParticleOutputHDF5) THEN + CALL StoreBoundaryParticleProperties(PartID,SpecID,PartState(1:3,PartID),& + UNITVECTOR(PartState(4:6,PartID)),(/0.,0.,1./),iPartBound=0,mode=2,MPF_optIN=MPF) + CALL StoreBoundaryParticleProperties(NewPartID,SpecID,PartState(1:3,NewPartID),& + UNITVECTOR(PartState(4:6,NewPartID)),(/0.,0.,1./),iPartBound=0,mode=2,MPF_optIN=MPF) + END IF ! DoBoundaryParticleOutputHDF5 ! Velocity (set it to zero, as it will be subtracted in the chemistry module) PartState(4:6,newPartID) = 0. ! Internal energies (set it to zero) From b42bcbe6c3f035514cbff6c3853941d2c0f34950 Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Fri, 28 Jul 2023 13:45:34 +0200 Subject: [PATCH 135/495] Missing Coll_pData, position of second particle and correct advancement of CurrentNextFreePosition --- .../emission/particle_photoionization.f90 | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/src/particles/emission/particle_photoionization.f90 b/src/particles/emission/particle_photoionization.f90 index 7567b6495..186aca922 100644 --- a/src/particles/emission/particle_photoionization.f90 +++ b/src/particles/emission/particle_photoionization.f90 @@ -273,7 +273,7 @@ SUBROUTINE PhotoIonization_RayTracing_Volume() USE MOD_RayTracing_Vars ,ONLY: UseRayTracing, Ray,RayElemEmission USE MOD_RayTracing_Vars ,ONLY: U_N_Ray_loc,N_DG_Ray_loc,N_Inter_Ray USE MOD_Particle_Vars ,ONLY: Species, PartState, usevMPF, PartMPF, PDM, PEM, PartSpecies -USE MOD_DSMC_Vars ,ONLY: ChemReac, DSMC, SpecDSMC, BGGas, Coll_pData, CollisMode, PartStateIntEn +USE MOD_DSMC_Vars ,ONLY: ChemReac, DSMC, SpecDSMC, BGGas, Coll_pData, CollisMode, PartStateIntEn, DSMCSumOfFormedParticles USE MOD_DSMC_Vars ,ONLY: newAmbiParts, iPartIndx_NodeNewAmbi ! Functions/Subroutines USE MOD_Eval_xyz ,ONLY: TensorProductInterpolation @@ -374,6 +374,9 @@ SUBROUTINE PhotoIonization_RayTracing_Volume() NbrOfReactions = density * NbrOfPhotons * ChemReac%CrossSection(iReac) * c * dt / Species(SpecID)%MacroParticleFactor CALL RANDOM_NUMBER(RandNum) nPair = INT(NbrOfReactions+RandNum) + ALLOCATE(Coll_pData(nPair)) + Coll_pData%Ec = 0. + DSMCSumOfFormedParticles = 0 ! Loop over all newly created particles DO iPair = 1, nPair ! Get a random position in the subelement TODO: N_Inter_Ray must always be available @@ -388,9 +391,8 @@ SUBROUTINE PhotoIonization_RayTracing_Volume() ! Get the physical coordinates that correspond to the reference coordinates CALL TensorProductInterpolation(Xi(1:3),3,NGeo,XiCL_NGeo,wBaryCL_NGeo,XCL_NGeo(1:3,0:NGeo,0:NGeo,0:NGeo,iElem),RandomPos(1:3)) ! Create new particle from the background gas - PDM%CurrentNextFreePosition = PDM%CurrentNextFreePosition + 1 - PartID = PDM%nextFreePosition(PDM%CurrentNextFreePosition) - IF(PartID.GT.PDM%ParticleVecLength) PDM%ParticleVecLength = PDM%ParticleVecLength + 1 + DSMCSumOfFormedParticles = DSMCSumOfFormedParticles + 1 + PartID = PDM%nextFreePosition(PDM%CurrentNextFreePosition+DSMCSumOfFormedParticles) IF(PartID.GT.PDM%MaxParticleNumber)THEN CALL abort(__STAMP__,'Raytrace Photoionization: PartID.GT.PDM%MaxParticleNumber. '//& 'Increase Part-maxParticleNumber or use more processors. PartID=',IntInfoOpt=PartID) @@ -429,9 +431,8 @@ SUBROUTINE PhotoIonization_RayTracing_Volume() PEM%GlobalElemID(PartID) = iGlobalElem PEM%LastGlobalElemID(PartID) = iGlobalElem ! Create second particle (only the index and the flags/elements needs to be set) - PDM%CurrentNextFreePosition = PDM%CurrentNextFreePosition + 1 - newPartID = PDM%nextFreePosition(PDM%CurrentNextFreePosition) - IF(newPartID.GT.PDM%ParticleVecLength) PDM%ParticleVecLength = PDM%ParticleVecLength + 1 + DSMCSumOfFormedParticles = DSMCSumOfFormedParticles + 1 + newPartID = PDM%nextFreePosition(PDM%CurrentNextFreePosition+DSMCSumOfFormedParticles) IF(newPartID.GT.PDM%MaxParticleNumber)THEN CALL abort(__STAMP__,'Raytrace Photoionization: newPartID.GT.PDM%MaxParticleNumber. '//& 'Increase Part-maxParticleNumber or use more processors. newPartID=',IntInfoOpt=newPartID) @@ -443,6 +444,8 @@ SUBROUTINE PhotoIonization_RayTracing_Volume() newAmbiParts = newAmbiParts + 1 iPartIndx_NodeNewAmbi(newAmbiParts) = newPartID END IF + ! Set the position + PartState(1:3,newPartID) = RandomPos(1:3) ! Particle flags PDM%ParticleInside(newPartID) = .TRUE. PDM%IsNewPart(newPartID) = .TRUE. @@ -450,8 +453,8 @@ SUBROUTINE PhotoIonization_RayTracing_Volume() PEM%GlobalElemID(newPartID) = iGlobalElem PEM%LastGlobalElemID(newPartID) = iGlobalElem ! Pairing (first particle is the background gas species) - Coll_pData(iPair)%iPart_p1 = newPartID - Coll_pData(iPair)%iPart_p2 = PartID + Coll_pData(iPair)%iPart_p1 = PartID + Coll_pData(iPair)%iPart_p2 = newPartID ! Relative velocity is not required as the relative translational energy will not be considered Coll_pData(iPair)%CRela2 = 0. ! Weighting factor: use the weighting factor of the emission init @@ -474,13 +477,19 @@ SUBROUTINE PhotoIonization_RayTracing_Volume() IF(DSMC%ElectronicModel.GT.0) PartStateIntEn(3,newPartID) = 0. ! Insert the products and distribute the reaction energy (Requires: Pair indices, Coll_pData(iPair)%iPart_p1/2) CALL PhotoIonization_InsertProducts(iPair, iReac, Ray%BaseVector1IC, Ray%BaseVector2IC, Ray%Direction, PartBCIndex=0) + ! Advance particle vector length and the current next free position with newly created particles + PDM%ParticleVecLength = PDM%ParticleVecLength + DSMCSumOfFormedParticles + PDM%CurrentNextFreePosition = PDM%CurrentNextFreePosition + DSMCSumOfFormedParticles + DSMCSumOfFormedParticles = 0 END DO ! iPart = 1, nPair + DEALLOCATE(Coll_pData) END DO ! iReac = 1, ChemReac%NumOfReact END DO ! k END DO ! l END DO ! m END DO + END ASSOCIATE END SUBROUTINE PhotoIonization_RayTracing_Volume From 51b6714e8769669483480c7f7ac6cc5351ac0e3b Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Fri, 28 Jul 2023 19:51:02 +0200 Subject: [PATCH 136/495] Consider the second energy in the volume photo-ionization --- src/particles/emission/particle_emission.f90 | 1 - .../emission/particle_photoionization.f90 | 301 ++++++++++-------- .../tracking/radtrans_tracking_output.f90 | 5 +- src/radiation/ray_tracing/raytrace.f90 | 10 +- src/radiation/ray_tracing/raytrace_vars.f90 | 2 +- 5 files changed, 170 insertions(+), 149 deletions(-) diff --git a/src/particles/emission/particle_emission.f90 b/src/particles/emission/particle_emission.f90 index f60367da1..01e3ca2d3 100644 --- a/src/particles/emission/particle_emission.f90 +++ b/src/particles/emission/particle_emission.f90 @@ -235,7 +235,6 @@ SUBROUTINE ParticleInserting() IF(TRIM(Species(i)%Init(iInit)%SpaceIC).EQ.'photon_rectangle')THEN ! Rectangular area -> cuboid: Equally distributed over c*dt NbrOfPhotons = NbrOfPhotons * Species(i)%Init(iInit)%CuboidHeightIC / (c*dt) - print*, NbrOfPhotons ELSE ! Cylinder and honeycomb: Equally distributed over c*dt NbrOfPhotons = NbrOfPhotons * Species(i)%Init(iInit)%CylinderHeightIC / (c*dt) diff --git a/src/particles/emission/particle_photoionization.f90 b/src/particles/emission/particle_photoionization.f90 index 186aca922..63d991c7a 100644 --- a/src/particles/emission/particle_photoionization.f90 +++ b/src/particles/emission/particle_photoionization.f90 @@ -147,12 +147,11 @@ SUBROUTINE PhotoIonization_RayTracing_SEE() DO BCSideID=1,nBCSides locElemID = SideToElem(S2E_ELEM_ID,BCSideID) ! Skip elements without ionization - IF(.NOT.RayElemEmission(locElemID)) CYCLE + IF(.NOT.RayElemEmission(1,locElemID)) CYCLE iLocSide = SideToElem(S2E_LOC_SIDE_ID,BCSideID) SideID = GetGlobalNonUniqueSideID(offsetElem+locElemID,iLocSide) iSurfSide = GlobalSide2SurfSide(SURF_SIDEID,SideID) !SideID = SurfSide2GlobalSide(SURF_SIDEID,iSurfSide) - ! TODO: Skip sides which are not mine in the MPI case BCID = PartBound%MapToPartBC(SideInfo_Shared(SIDE_BCID,SideID)) ! Skip non-reflective BC sides IF(PartBound%TargetBoundCond(BCID).NE.PartBound%ReflectiveBC) CYCLE @@ -272,6 +271,7 @@ SUBROUTINE PhotoIonization_RayTracing_Volume() USE MOD_Mesh_Vars ,ONLY: NGeo,wBaryCL_NGeo,XiCL_NGeo,XCL_NGeo USE MOD_RayTracing_Vars ,ONLY: UseRayTracing, Ray,RayElemEmission USE MOD_RayTracing_Vars ,ONLY: U_N_Ray_loc,N_DG_Ray_loc,N_Inter_Ray +USE MOD_RayTracing_Vars ,ONLY: RaySecondaryVectorX,RaySecondaryVectorY,RaySecondaryVectorZ USE MOD_Particle_Vars ,ONLY: Species, PartState, usevMPF, PartMPF, PDM, PEM, PartSpecies USE MOD_DSMC_Vars ,ONLY: ChemReac, DSMC, SpecDSMC, BGGas, Coll_pData, CollisMode, PartStateIntEn, DSMCSumOfFormedParticles USE MOD_DSMC_Vars ,ONLY: newAmbiParts, iPartIndx_NodeNewAmbi @@ -295,7 +295,7 @@ SUBROUTINE PhotoIonization_RayTracing_Volume() ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -INTEGER :: iElem,k,l,m,iReac,iPair,iGlobalElem +INTEGER :: iElem,k,l,m,iReac,iPair,iGlobalElem,iVar INTEGER :: SpecID,nPair,NRayLoc,BGGSpecID INTEGER :: NbrOfRepetitions INTEGER :: PartID,newPartID @@ -303,6 +303,7 @@ SUBROUTINE PhotoIonization_RayTracing_Volume() REAL :: density, NbrOfPhotons, NbrOfReactions REAL :: RandNum,RandVal(3),Xi(3) REAL :: RandomPos(1:3),MPF +REAL :: RayDirection(1:3),RayBaseVector1IC(1:3),RayBaseVector2IC(1:3) !=================================================================================================================================== IF(.NOT.UseRayTracing) RETURN @@ -349,145 +350,165 @@ SUBROUTINE PhotoIonization_RayTracing_Volume() TimeScalingFactor = 0.5 * SQRT(PI) * tau * (ERF(t_2/tau)-ERF(t_1/tau)) -DO iElem=1, nElems - ! Skip elements without ionization - IF(.NOT.RayElemEmission(iElem)) CYCLE - iGlobalElem = iElem+offSetElem - ! iCNElem = GetCNElemID(iGlobalElem) - NRayLoc = N_DG_Ray_loc(iElem) - DO m=0,NRayLoc - DO l=0,NRayLoc - DO k=0,NRayLoc - ! TODO: Ray secondary energy, U_N_Ray_loc(iElem)%U(2,k,l,m) - E_Intensity = U_N_Ray_loc(iElem)%U(1,k,l,m) * TimeScalingFactor - ! Number of photons (TODO: spectrum) - NbrOfPhotons = E_Intensity / (CalcPhotonEnergy(lambda) * c * dt) - DO iReac = 1, ChemReac%NumOfReact - SpecID = ChemReac%Reactants(iReac,1) - ! TODO: Background gas density distribution - BGGSpecID = BGGas%MapSpecToBGSpec(SpecID) - density = BGGas%NumberDensity(BGGSpecID) - ! Determine the number of particles to insert - ! Collision number: Z = n_gas * n_ph * sigma_reac * v (in the case of photons its speed of light) - ! Number of reactions: N = Z * dt * V (number of photons cancels out the volume) - ! Number of reactions: N = n_gas * N_ph * sigma_reac * v * dt - NbrOfReactions = density * NbrOfPhotons * ChemReac%CrossSection(iReac) * c * dt / Species(SpecID)%MacroParticleFactor - CALL RANDOM_NUMBER(RandNum) - nPair = INT(NbrOfReactions+RandNum) - ALLOCATE(Coll_pData(nPair)) - Coll_pData%Ec = 0. - DSMCSumOfFormedParticles = 0 - ! Loop over all newly created particles - DO iPair = 1, nPair - ! Get a random position in the subelement TODO: N_Inter_Ray must always be available - CALL RANDOM_NUMBER(RandVal) - Xi(1) = -1.0 + SUM(N_Inter_Ray(NRayLoc)%wGP(0:k-1)) + N_Inter_Ray(NRayLoc)%wGP(k) * RandVal(1) - Xi(2) = -1.0 + SUM(N_Inter_Ray(NRayLoc)%wGP(0:l-1)) + N_Inter_Ray(NRayLoc)%wGP(l) * RandVal(2) - Xi(3) = -1.0 + SUM(N_Inter_Ray(NRayLoc)%wGP(0:m-1)) + N_Inter_Ray(NRayLoc)%wGP(m) * RandVal(3) - IF(ANY(Xi.GT.1.0).OR.ANY(Xi.LT.-1.0))THEN - IPWRITE(UNIT_StdOut,*) "Xi =", Xi - CALL abort(__STAMP__,'xi out of range') - END IF ! ANY(Xi.GT.1.0).OR.ANY(Xi.LT.-1.0) - ! Get the physical coordinates that correspond to the reference coordinates - CALL TensorProductInterpolation(Xi(1:3),3,NGeo,XiCL_NGeo,wBaryCL_NGeo,XCL_NGeo(1:3,0:NGeo,0:NGeo,0:NGeo,iElem),RandomPos(1:3)) - ! Create new particle from the background gas - DSMCSumOfFormedParticles = DSMCSumOfFormedParticles + 1 - PartID = PDM%nextFreePosition(PDM%CurrentNextFreePosition+DSMCSumOfFormedParticles) - IF(PartID.GT.PDM%MaxParticleNumber)THEN - CALL abort(__STAMP__,'Raytrace Photoionization: PartID.GT.PDM%MaxParticleNumber. '//& - 'Increase Part-maxParticleNumber or use more processors. PartID=',IntInfoOpt=PartID) - END IF - IF (PartID.EQ.0) THEN - CALL Abort(__STAMP__,'ERROR in PhotoIonization: MaxParticleNumber should be increased!') - END IF - ! Set the position - PartState(1:3,PartID) = RandomPos(1:3) - ! Set the species - PartSpecies(PartID) = SpecID - ! Set the velocity (required for the collision energy, although relatively small compared to the photon energy) - IF(BGGas%UseDistribution) THEN - PartState(4:6,PartID) = CalcVelocity_maxwell_particle(SpecID,BGGas%Distribution(BGGSpecID,4:6,iElem)) & - + BGGas%Distribution(BGGSpecID,1:3,iElem) - ELSE - CALL CalcVelocity_maxwell_lpn(FractNbr=SpecID, Vec3D=PartState(4:6,PartID), iInit=1) - END IF - ! Ambipolar diffusion - IF (DSMC%DoAmbipolarDiff) THEN - newAmbiParts = newAmbiParts + 1 - iPartIndx_NodeNewAmbi(newAmbiParts) = PartID - END IF - ! Set the internal energies - IF(CollisMode.GT.1) THEN - IF(SpecDSMC(SpecID)%PolyatomicMol) THEN - CALL DSMC_SetInternalEnr_Poly(SpecID,1,PartID,1) +! Loop over the first and secondary rays +DO iVar = 1, 2 + ! Set the direction for the first ray direction before the element loop since it does not change + IF(iVar.EQ.1) THEN + RayDirection(1:3) = Ray%Direction(1:3) + RayBaseVector1IC(1:3) = Ray%BaseVector1IC(1:3) + RayBaseVector2IC(1:3) = Ray%BaseVector2IC(1:3) + END IF + ! Loop over all elements + DO iElem=1, nElems + ! Skip elements without ionization + IF(.NOT.RayElemEmission(iVar,iElem)) CYCLE + iGlobalElem = iElem+offSetElem + ! Set the ray-direction in case of secondary rays + IF(iVar.EQ.2) THEN + ! Generate two base vectors perpendicular to the ray direction + RayDirection(1:3) = (/RaySecondaryVectorX(iElem),RaySecondaryVectorY(iElem),RaySecondaryVectorZ(iElem)/) + ! Check whether the direction is zero + IF(.NOT.ALL(RayDirection(1:3).EQ.0.)) THEN + CALL OrthoNormVec(RayDirection(1:3),RayBaseVector1IC(1:3),RayBaseVector2IC(1:3)) + ELSE + CYCLE + END IF + END IF + ! Set the element local order and loop over all sub-elements + NRayLoc = N_DG_Ray_loc(iElem) + DO m=0,NRayLoc + DO l=0,NRayLoc + DO k=0,NRayLoc + E_Intensity = U_N_Ray_loc(iElem)%U(iVar,k,l,m) * TimeScalingFactor + ! Number of photons (TODO: spectrum) + NbrOfPhotons = E_Intensity / (CalcPhotonEnergy(lambda) * c * dt) + DO iReac = 1, ChemReac%NumOfReact + SpecID = ChemReac%Reactants(iReac,1) + ! TODO: Background gas density distribution + BGGSpecID = BGGas%MapSpecToBGSpec(SpecID) + density = BGGas%NumberDensity(BGGSpecID) + ! Determine the number of particles to insert + ! Collision number: Z = n_gas * n_ph * sigma_reac * v (in the case of photons its speed of light) + ! Number of reactions: N = Z * dt * V (number of photons cancels out the volume) + ! Number of reactions: N = n_gas * N_ph * sigma_reac * v * dt + NbrOfReactions = density * NbrOfPhotons * ChemReac%CrossSection(iReac) * c * dt / Species(SpecID)%MacroParticleFactor + CALL RANDOM_NUMBER(RandNum) + nPair = INT(NbrOfReactions+RandNum) + ALLOCATE(Coll_pData(nPair)) + Coll_pData%Ec = 0. + DSMCSumOfFormedParticles = 0 + ! Loop over all newly created particles + DO iPair = 1, nPair + ! Get a random position in the subelement + CALL RANDOM_NUMBER(RandVal) + Xi(1) = -1.0 + SUM(N_Inter_Ray(NRayLoc)%wGP(0:k-1)) + N_Inter_Ray(NRayLoc)%wGP(k) * RandVal(1) + Xi(2) = -1.0 + SUM(N_Inter_Ray(NRayLoc)%wGP(0:l-1)) + N_Inter_Ray(NRayLoc)%wGP(l) * RandVal(2) + Xi(3) = -1.0 + SUM(N_Inter_Ray(NRayLoc)%wGP(0:m-1)) + N_Inter_Ray(NRayLoc)%wGP(m) * RandVal(3) + IF(ANY(Xi.GT.1.0).OR.ANY(Xi.LT.-1.0))THEN + IPWRITE(UNIT_StdOut,*) "Xi =", Xi + CALL abort(__STAMP__,'xi out of range') + END IF ! ANY(Xi.GT.1.0).OR.ANY(Xi.LT.-1.0) + ! Get the physical coordinates that correspond to the reference coordinates + CALL TensorProductInterpolation(Xi(1:3),3,NGeo,XiCL_NGeo,wBaryCL_NGeo,XCL_NGeo(1:3,0:NGeo,0:NGeo,0:NGeo,iElem),RandomPos(1:3)) + ! Create new particle from the background gas + DSMCSumOfFormedParticles = DSMCSumOfFormedParticles + 1 + PartID = PDM%nextFreePosition(PDM%CurrentNextFreePosition+DSMCSumOfFormedParticles) + IF(PartID.GT.PDM%MaxParticleNumber)THEN + CALL abort(__STAMP__,'Raytrace Photoionization: PartID.GT.PDM%MaxParticleNumber. '//& + 'Increase Part-maxParticleNumber or use more processors. PartID=',IntInfoOpt=PartID) + END IF + IF (PartID.EQ.0) THEN + CALL Abort(__STAMP__,'ERROR in PhotoIonization: MaxParticleNumber should be increased!') + END IF + ! Set the position + PartState(1:3,PartID) = RandomPos(1:3) + ! Set the species + PartSpecies(PartID) = SpecID + ! Set the velocity (required for the collision energy, although relatively small compared to the photon energy) + IF(BGGas%UseDistribution) THEN + PartState(4:6,PartID) = CalcVelocity_maxwell_particle(SpecID,BGGas%Distribution(BGGSpecID,4:6,iElem)) & + + BGGas%Distribution(BGGSpecID,1:3,iElem) ELSE - CALL DSMC_SetInternalEnr_LauxVFD(SpecID,1,PartID,1) + CALL CalcVelocity_maxwell_lpn(FractNbr=SpecID, Vec3D=PartState(4:6,PartID), iInit=1) END IF - END IF - ! Particle flags - PDM%ParticleInside(PartID) = .TRUE. - PDM%IsNewPart(PartID) = .TRUE. - PDM%dtFracPush(PartID) = .FALSE. - PEM%GlobalElemID(PartID) = iGlobalElem - PEM%LastGlobalElemID(PartID) = iGlobalElem - ! Create second particle (only the index and the flags/elements needs to be set) - DSMCSumOfFormedParticles = DSMCSumOfFormedParticles + 1 - newPartID = PDM%nextFreePosition(PDM%CurrentNextFreePosition+DSMCSumOfFormedParticles) - IF(newPartID.GT.PDM%MaxParticleNumber)THEN - CALL abort(__STAMP__,'Raytrace Photoionization: newPartID.GT.PDM%MaxParticleNumber. '//& - 'Increase Part-maxParticleNumber or use more processors. newPartID=',IntInfoOpt=newPartID) - END IF - IF (newPartID.EQ.0) THEN - CALL Abort(__STAMP__,'ERROR in PhotoIonization: MaxParticleNumber should be increased!') - END IF - IF (DSMC%DoAmbipolarDiff) THEN - newAmbiParts = newAmbiParts + 1 - iPartIndx_NodeNewAmbi(newAmbiParts) = newPartID - END IF - ! Set the position - PartState(1:3,newPartID) = RandomPos(1:3) - ! Particle flags - PDM%ParticleInside(newPartID) = .TRUE. - PDM%IsNewPart(newPartID) = .TRUE. - PDM%dtFracPush(newPartID) = .FALSE. - PEM%GlobalElemID(newPartID) = iGlobalElem - PEM%LastGlobalElemID(newPartID) = iGlobalElem - ! Pairing (first particle is the background gas species) - Coll_pData(iPair)%iPart_p1 = PartID - Coll_pData(iPair)%iPart_p2 = newPartID - ! Relative velocity is not required as the relative translational energy will not be considered - Coll_pData(iPair)%CRela2 = 0. - ! Weighting factor: use the weighting factor of the emission init - MPF = Species(SpecID)%MacroParticleFactor - IF(usevMPF) THEN - PartMPF(PartID) = MPF - PartMPF(newPartID) = MPF - END IF - ! 1. Store the particle information in PartStateBoundary.h5 - IF(DoBoundaryParticleOutputHDF5) THEN - CALL StoreBoundaryParticleProperties(PartID,SpecID,PartState(1:3,PartID),& - UNITVECTOR(PartState(4:6,PartID)),(/0.,0.,1./),iPartBound=0,mode=2,MPF_optIN=MPF) - CALL StoreBoundaryParticleProperties(NewPartID,SpecID,PartState(1:3,NewPartID),& - UNITVECTOR(PartState(4:6,NewPartID)),(/0.,0.,1./),iPartBound=0,mode=2,MPF_optIN=MPF) - END IF ! DoBoundaryParticleOutputHDF5 - ! Velocity (set it to zero, as it will be subtracted in the chemistry module) - PartState(4:6,newPartID) = 0. - ! Internal energies (set it to zero) - PartStateIntEn(1:2,newPartID) = 0. - IF(DSMC%ElectronicModel.GT.0) PartStateIntEn(3,newPartID) = 0. - ! Insert the products and distribute the reaction energy (Requires: Pair indices, Coll_pData(iPair)%iPart_p1/2) - CALL PhotoIonization_InsertProducts(iPair, iReac, Ray%BaseVector1IC, Ray%BaseVector2IC, Ray%Direction, PartBCIndex=0) - ! Advance particle vector length and the current next free position with newly created particles - PDM%ParticleVecLength = PDM%ParticleVecLength + DSMCSumOfFormedParticles - PDM%CurrentNextFreePosition = PDM%CurrentNextFreePosition + DSMCSumOfFormedParticles - DSMCSumOfFormedParticles = 0 - END DO ! iPart = 1, nPair - DEALLOCATE(Coll_pData) - END DO ! iReac = 1, ChemReac%NumOfReact - END DO ! k - END DO ! l - END DO ! m -END DO + ! Ambipolar diffusion + IF (DSMC%DoAmbipolarDiff) THEN + newAmbiParts = newAmbiParts + 1 + iPartIndx_NodeNewAmbi(newAmbiParts) = PartID + END IF + ! Set the internal energies + IF(CollisMode.GT.1) THEN + IF(SpecDSMC(SpecID)%PolyatomicMol) THEN + CALL DSMC_SetInternalEnr_Poly(SpecID,1,PartID,1) + ELSE + CALL DSMC_SetInternalEnr_LauxVFD(SpecID,1,PartID,1) + END IF + END IF + ! Particle flags + PDM%ParticleInside(PartID) = .TRUE. + PDM%IsNewPart(PartID) = .TRUE. + PDM%dtFracPush(PartID) = .FALSE. + PEM%GlobalElemID(PartID) = iGlobalElem + PEM%LastGlobalElemID(PartID) = iGlobalElem + ! Create second particle (only the index and the flags/elements needs to be set) + DSMCSumOfFormedParticles = DSMCSumOfFormedParticles + 1 + newPartID = PDM%nextFreePosition(PDM%CurrentNextFreePosition+DSMCSumOfFormedParticles) + IF(newPartID.GT.PDM%MaxParticleNumber)THEN + CALL abort(__STAMP__,'Raytrace Photoionization: newPartID.GT.PDM%MaxParticleNumber. '//& + 'Increase Part-maxParticleNumber or use more processors. newPartID=',IntInfoOpt=newPartID) + END IF + IF (newPartID.EQ.0) THEN + CALL Abort(__STAMP__,'ERROR in PhotoIonization: MaxParticleNumber should be increased!') + END IF + IF (DSMC%DoAmbipolarDiff) THEN + newAmbiParts = newAmbiParts + 1 + iPartIndx_NodeNewAmbi(newAmbiParts) = newPartID + END IF + ! Set the position + PartState(1:3,newPartID) = RandomPos(1:3) + ! Particle flags + PDM%ParticleInside(newPartID) = .TRUE. + PDM%IsNewPart(newPartID) = .TRUE. + PDM%dtFracPush(newPartID) = .FALSE. + PEM%GlobalElemID(newPartID) = iGlobalElem + PEM%LastGlobalElemID(newPartID) = iGlobalElem + ! Pairing (first particle is the background gas species) + Coll_pData(iPair)%iPart_p1 = PartID + Coll_pData(iPair)%iPart_p2 = newPartID + ! Relative velocity is not required as the relative translational energy will not be considered + Coll_pData(iPair)%CRela2 = 0. + ! Weighting factor: use the weighting factor of the emission init + MPF = Species(SpecID)%MacroParticleFactor + IF(usevMPF) THEN + PartMPF(PartID) = MPF + PartMPF(newPartID) = MPF + END IF + ! 1. Store the particle information in PartStateBoundary.h5 + IF(DoBoundaryParticleOutputHDF5) THEN + CALL StoreBoundaryParticleProperties(PartID,SpecID,PartState(1:3,PartID),& + UNITVECTOR(PartState(4:6,PartID)),(/0.,0.,1./),iPartBound=0,mode=2,MPF_optIN=MPF) + CALL StoreBoundaryParticleProperties(NewPartID,SpecID,PartState(1:3,NewPartID),& + UNITVECTOR(PartState(4:6,NewPartID)),(/0.,0.,1./),iPartBound=0,mode=2,MPF_optIN=MPF) + END IF ! DoBoundaryParticleOutputHDF5 + ! Velocity (set it to zero, as it will be subtracted in the chemistry module) + PartState(4:6,newPartID) = 0. + ! Internal energies (set it to zero) + PartStateIntEn(1:2,newPartID) = 0. + IF(DSMC%ElectronicModel.GT.0) PartStateIntEn(3,newPartID) = 0. + ! Insert the products and distribute the reaction energy (Requires: Pair indices, Coll_pData(iPair)%iPart_p1/2) + CALL PhotoIonization_InsertProducts(iPair, iReac, RayBaseVector1IC, RayBaseVector2IC, RayDirection, PartBCIndex=0) + ! Advance particle vector length and the current next free position with newly created particles + PDM%ParticleVecLength = PDM%ParticleVecLength + DSMCSumOfFormedParticles + PDM%CurrentNextFreePosition = PDM%CurrentNextFreePosition + DSMCSumOfFormedParticles + DSMCSumOfFormedParticles = 0 + END DO ! iPart = 1, nPair + DEALLOCATE(Coll_pData) + END DO ! iReac = 1, ChemReac%NumOfReact + END DO ! k + END DO ! l + END DO ! m + END DO ! iElem = 1, nElems +END DO ! iVar = 1, 2 END ASSOCIATE diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 index 3f74decb3..c72686625 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 @@ -132,8 +132,9 @@ SUBROUTINE WritePhotonVolSampleToHDF5() RayElemPassedEnergyLoc1st(iElem) = RayElemPassedEnergy(1,iGlobalElem) !/ ElemVolume_Shared(iCNElem) ! Secondary energy RayElemPassedEnergyLoc2nd(iElem) = RayElemPassedEnergy(2,iGlobalElem) !/ ElemVolume_Shared(iCNElem) - ! Activate voltume emission - IF((RayElemPassedEnergyLoc1st(iElem).GT.0.0).OR.(RayElemPassedEnergyLoc2nd(iElem).GT.0.0)) RayElemEmission(iElem) = .TRUE. + ! Activate volume emission + IF((RayElemPassedEnergyLoc1st(iElem).GT.0.0)) RayElemEmission(1,iElem) = .TRUE. + IF((RayElemPassedEnergyLoc2nd(iElem).GT.0.0)) RayElemEmission(2,iElem) = .TRUE. ! Check if secondary energy is greater than zero IF(RayElemPassedEnergyLoc2nd(iElem).GT.0.0)THEN IF(RayElemPassedEnergy(6,iGlobalElem).LE.0.0) CALL abort(__STAMP__,'Secondary ray counter is zero but energy is not!') diff --git a/src/radiation/ray_tracing/raytrace.f90 b/src/radiation/ray_tracing/raytrace.f90 index 36b0ca238..9a0eca6e8 100644 --- a/src/radiation/ray_tracing/raytrace.f90 +++ b/src/radiation/ray_tracing/raytrace.f90 @@ -90,7 +90,7 @@ SUBROUTINE RayTracing() ! from .h5 when a restart is performed ALLOCATE(N_DG_Ray_loc(1:nElems)) N_DG_Ray_loc = -1 -ALLOCATE(RayElemEmission(1:nElems)) +ALLOCATE(RayElemEmission(1:2,1:nElems)) RayElemEmission = .FALSE. ALLOCATE(RaySecondaryVectorX(1:nElems)) ALLOCATE(RaySecondaryVectorY(1:nElems)) @@ -340,9 +340,9 @@ SUBROUTINE ReadRayTracingDataFromH5(onlySurfData) IF(GlobalSideID.EQ.SideID)THEN PhotonSampWall_loc(1:nSurfSample,1:nSurfSample,BCSideID) = PhotonSampWallHDF5(2,1:nSurfSample,1:nSurfSample,iSurfSideHDF5) ! Check if element fas already been flagged an emission element (either volume or surface emission) - IF(.NOT.RayElemEmission(locElemID))THEN - IF(ANY(PhotonSampWall_loc(1:nSurfSample,1:nSurfSample,BCSideID).GT.0.0)) RayElemEmission(locElemID) = .TRUE. - END IF ! .NOT.RayElemEmission(locElemID) + IF(.NOT.RayElemEmission(1,locElemID))THEN + IF(ANY(PhotonSampWall_loc(1:nSurfSample,1:nSurfSample,BCSideID).GT.0.0)) RayElemEmission(1,locElemID) = .TRUE. + END IF ! .NOT.RayElemEmission(1,locElemID) END IF ! GlobalSideID.EQ. END DO ! BCSideID = 1,nBCSides END DO ! iSurfSideHDF5 = 1, nSurfSidesHDF5 @@ -412,7 +412,7 @@ SUBROUTINE ReadRayTracingDataFromH5(onlySurfData) DO m=0,Nloc DO l=0,Nloc DO k=0,Nloc - IF(U_N_Ray_loc(iElem)%U(iVar,k,l,m).GT.0.) RayElemEmission(iElem) = .TRUE. + IF(U_N_Ray_loc(iElem)%U(iVar,k,l,m).GT.0.) RayElemEmission(iVar,iElem) = .TRUE. END DO ! k END DO ! l END DO ! m diff --git a/src/radiation/ray_tracing/raytrace_vars.f90 b/src/radiation/ray_tracing/raytrace_vars.f90 index 23e586ea3..431b38521 100644 --- a/src/radiation/ray_tracing/raytrace_vars.f90 +++ b/src/radiation/ray_tracing/raytrace_vars.f90 @@ -73,7 +73,7 @@ MODULE MOD_RayTracing_Vars TYPE (tRadTrans) :: RadTrans !< LOGICAL :: RayForceAbsorption !< Surface photon sampling is performed independent of the actual absorption/reflection outcome (default=T) -LOGICAL, ALLOCATABLE :: RayElemEmission(:) !< Flag elements that are relevant for volume or surface photoionization +LOGICAL, ALLOCATABLE :: RayElemEmission(:,:) !< Flag elements that are relevant for volume or surface photoionization INTEGER :: NumRays !< INTEGER :: RayPartBound !< Particle boundary ID where rays are emitted from From e0963c76aa6491ebf10ec836513588069ccb39eb Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Sat, 29 Jul 2023 13:38:46 +0200 Subject: [PATCH 137/495] Added reggie for ray tracing volume ionization --- .../volume_emission_rectangle/parameter.ini | 3 + .../DSMC.ini | 71 ++++++++ .../Electrons_ref.csv | 22 +++ .../analyze.ini | 8 + .../command_line.ini | 2 + .../externals.ini | 8 + .../parameter.ini | 168 ++++++++++++++++++ .../pre-hopr/hopr.ini | 58 ++++++ .../readme.md | 8 + src/particles/emission/particle_emission.f90 | 1 - src/radiation/ray_tracing/raytrace_ini.f90 | 11 +- 11 files changed, 354 insertions(+), 6 deletions(-) create mode 100644 regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/DSMC.ini create mode 100644 regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/Electrons_ref.csv create mode 100644 regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/analyze.ini create mode 100644 regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/command_line.ini create mode 100644 regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/externals.ini create mode 100644 regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/parameter.ini create mode 100644 regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/pre-hopr/hopr.ini create mode 100644 regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/readme.md diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle/parameter.ini b/regressioncheck/NIG_Photoionization/volume_emission_rectangle/parameter.ini index a175440da..ee4409ae9 100644 --- a/regressioncheck/NIG_Photoionization/volume_emission_rectangle/parameter.ini +++ b/regressioncheck/NIG_Photoionization/volume_emission_rectangle/parameter.ini @@ -35,6 +35,9 @@ CalcNumSpec = T CalcNumDens = T !CheckExchangeProcs = F ! deactivate the asymmetric communicator check +! Output emission particles to PartStateBoundary.h5 +Part-Boundary1-BoundaryParticleOutput = T +Part-Species3-Init1-PartBCIndex = 0 ! =============================================================================== ! ! CALCULATION ! =============================================================================== ! diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/DSMC.ini b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/DSMC.ini new file mode 100644 index 000000000..f0b045264 --- /dev/null +++ b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/DSMC.ini @@ -0,0 +1,71 @@ + +! =============================================================================== ! +! Species1, H2 +! =============================================================================== ! +Part-Species1-SpeciesName = H2 +Part-Species1-InteractionID = 2 +Part-Species1-Tref = 1000 +Part-Species1-dref = 2.68E-10 +Part-Species1-omega = 0.407 +Part-Species1-HeatOfFormation_K = 0.0 +Part-Species1-CharaTempVib = 6332.37 +Part-Species1-Ediss_eV = 4.47 +! =============================================================================== ! +! Species2, H +! =============================================================================== ! +Part-Species2-SpeciesName = H +Part-Species2-InteractionID = 1 +Part-Species2-Tref = 1000 +Part-Species2-dref = 2.581E-10 +Part-Species2-omega = 0.407 +Part-Species2-HeatOfFormation_K = 26159.76 +! =============================================================================== ! +! Species3, e +! =============================================================================== ! +Part-Species3-SpeciesName = electron +Part-Species3-InteractionID = 4 +Part-Species3-Tref = 1000 +Part-Species3-dref = 2.817920E-15 +Part-Species3-omega = 0.407 +! =============================================================================== ! +! Species4, H2Ion +! =============================================================================== ! +Part-Species4-SpeciesName = H2Ion1 +Part-Species4-InteractionID = 20 +Part-Species4-Tref = 1000 +Part-Species4-dref = 3.883E-10 +Part-Species4-omega = 0.407 +Part-Species4-CharaTempVib = 3341.01 +Part-Species4-Ediss_eV = 2.65 +Part-Species4-PreviousState = 1 +! =============================================================================== ! +! Species5, HIon +! =============================================================================== ! +Part-Species5-SpeciesName = HIon1 +Part-Species5-InteractionID = 10 +Part-Species5-Tref = 1000 +Part-Species5-dref = 3.912E-10 +Part-Species5-omega = 0.407 +Part-Species5-PreviousState = 2 + + + +! =============================================================================== ! +! Reactions +! =============================================================================== ! +DSMC-NumOfReactions = 2 + +! ---------------------------------------------------- +! Photo-ionization (electron species should be at the first or second position of the product array) +! ---------------------------------------------------- +! Reaction 1 | H2 + photon --> H2Ion + e +DSMC-Reaction1-ReactionModel = phIon +DSMC-Reaction1-Reactants = (/1,0,0/) +DSMC-Reaction1-Products = (/4,3,0,0/) +DSMC-Reaction1-CrossSection = 4.84E-24 + +! Reaction 2 | H2 + photon --> H + HIon + e +DSMC-Reaction2-ReactionModel = phIon +DSMC-Reaction2-Reactants = (/1,0,0/) +DSMC-Reaction2-Products = (/2,3,5,0/) +DSMC-Reaction2-CrossSection = 8.3E-25 diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/Electrons_ref.csv b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/Electrons_ref.csv new file mode 100644 index 000000000..8ccf38709 --- /dev/null +++ b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/Electrons_ref.csv @@ -0,0 +1,22 @@ +"electrons" +0.0000000000000000E+000 +0.5099999999999998E+008 +0.3099999999999999E+009 +0.1377999999999999E+010 +0.4912999999999998E+010 +0.1431799999999999E+011 +0.3443899999999998E+011 +0.6904099999999997E+011 +0.1168840000000000E+012 +0.1700699999999999E+012 +0.2176069999999999E+012 +0.2517669999999999E+012 +0.2715039999999999E+012 +0.2806709999999999E+012 +0.2840939999999999E+012 +0.2851209999999999E+012 +0.2853689999999999E+012 +0.2854169999999999E+012 +0.2854169999999999E+012 +0.2854169999999999E+012 +0.2854169999999999E+012 diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/analyze.ini b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/analyze.ini new file mode 100644 index 000000000..72eb022e6 --- /dev/null +++ b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/analyze.ini @@ -0,0 +1,8 @@ +! =================================================================================================================== +! compare column +! =================================================================================================================== +compare_column_file = PartAnalyze.csv ! data file name +compare_column_reference_file = Electrons_ref.csv ! data file name +compare_column_index = 9 ! column index for comparison +compare_column_tolerance_value = 1e9 ! tolerance (depends on machine accuracy and MPI) +compare_column_tolerance_type = absolute ! absolute or relative tolerance diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/command_line.ini b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/command_line.ini new file mode 100644 index 000000000..73e8d46c3 --- /dev/null +++ b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/command_line.ini @@ -0,0 +1,2 @@ +MPI = 1,2,5,8 +cmd_suffix = DSMC.ini diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/externals.ini b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/externals.ini new file mode 100644 index 000000000..e13b3d06b --- /dev/null +++ b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/externals.ini @@ -0,0 +1,8 @@ +! --- Externals Tool Reggie +MPI = 1 !, 6 +externalbinary = ./hopr/build/bin/hopr !, bin/piclas +externaldirectory = pre-hopr !, pre-piclas +externalruntime = pre !, pre +cmd_suffix = !, ../DSMC.ini + +!nocrosscombination:MPI,externalbinary,externaldirectory,externalruntime,cmd_suffix diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/parameter.ini b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/parameter.ini new file mode 100644 index 000000000..a2a7962f7 --- /dev/null +++ b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/parameter.ini @@ -0,0 +1,168 @@ +! =============================================================================== ! +! POSTI +! =============================================================================== ! +VisuParticles = T +NVisu = 1 +TimeStampLength = 21 +! =============================================================================== ! +! VARIABLES +! =============================================================================== ! +CFLscale = 0.2 +IniExactFunc = 0 +N = 1 + +DoLoadBalance = T +Load-DeviationThreshold = 0.001 +LoadBalanceMaxSteps = 20 +DoInitialAutoRestart = T +! =============================================================================== ! +! MESH +! =============================================================================== ! +MeshFile = ./pre-hopr/box_mesh.h5 +Logging = F +WriteErrorFiles = F +useCurveds = F +! if boundaries have to be changed (else they are used from Mesh directly): +TrackingMethod = triatracking +! =============================================================================== ! +! OUTPUT / VISUALIZATION +! =============================================================================== ! +ProjectName = photoionization +IterDisplayStep = 10 +Part-AnalyzeStep = 1 + +CalcNumSpec = T +CalcNumDens = T + +!CheckExchangeProcs = F ! deactivate the asymmetric communicator check +! =============================================================================== ! +! CALCULATION +! =============================================================================== ! +ManualTimeStep = 5.0E-9 +tend = 100e-9 +Analyze_dt = 100e-9 + +PIC-DoDeposition = F + +PIC-DoInterpolation = F +Part-LorentzType = 0 + +epsCG = 1e-2 +! =============================================================================== ! +! DSMC +! =============================================================================== ! +UseDSMC = T +Particles-DSMC-CollisMode = 3 +Part-NumberOfRandomSeeds = 0 +Particles-HaloEpsVelo = 3E7 + +Particles-CollXSec-Database = XSec_Database_H2_Photoionization.h5 + +Particles-DSMC-ElectronicModel = 1 +Particles-DSMCElectronicDatabase = Electronic-State-Database.h5 +EpsMergeElectronicState = 1E-2 +Part-Species$-ElecRelaxProb = 1. +! =============================================================================== ! +! PARTICLES +! =============================================================================== ! +Part-nSpecies = 5 +Part-maxParticleNumber = 500000 +Part-nBounds = 6 + +Part-Boundary1-SourceName = BC_periodicx- +Part-Boundary1-Condition = reflective +Part-Boundary1-PhotonEnACC = 1.0 + +Part-Boundary2-SourceName = BC_periodicx+ +Part-Boundary2-Condition = reflective + +Part-Boundary3-SourceName = BC_periodicy- +Part-Boundary3-Condition = reflective + +Part-Boundary4-SourceName = BC_periodicy+ +Part-Boundary4-Condition = reflective + +Part-Boundary5-SourceName = BC_WALL +Part-Boundary5-Condition = reflective + +! Change MPF of SEE particles +!Part-vMPF = T + +Part-Boundary6-SourceName = BC_TOP +Part-Boundary6-Condition = reflective +Part-Boundary6-PhotonEnACC = 1.0 +!Part-Boundary6-BoundaryParticleOutput = T + + + + + +Part-FIBGMdeltas = (/ 1.0 , 1.0 , 1.0 /) +Part-FactorFIBGM = (/ 5 , 5 , 5 /) + +Part-Boundary$-BoundaryParticleOutput = T +Part-Boundary$-PhotonSpecularReflection = F ! F: diffuse with PhotonEnACC, T: perfect mirror +Part-Boundary$-PhotonEnACC = 1.0 +! =============================================================================== ! +! Ray Tracing +! =============================================================================== ! +UseRayTracing = T +RayTracing-NumRays = 10000 +RayTracing-RayPosModel = 1 +RayTracing-PartBound = 6 ! -> iBC: 6 +PhotonModeBPO = 1 ! Debugging output: vectors +RayTracing-VolRefineMode = 3 ! Volumetric refinement +!RayTracing-VolRefineModeZ = 0.5 + +RayTracing-PulseDuration = 15e-9 +RayTracing-WaveLength = 10e-9 +RayTracing-Power = 1.0 +RayTracing-RepetitionRate = 1000 +RayTracing-RayDirection = (/ 0. , 0.0 , -1.0 /) +!RayTracing-RayDirection = (/ 0. , 0.5 , -1.0 /) +! =============================================================================== ! +! Weighting Factor +! =============================================================================== ! +Part-Species$-MacroParticleFactor = 1e7 + +! =============================================================================== ! +! Species1 | H2 +! =============================================================================== ! +Part-Species1-MassIC = 3.348E-27 +Part-Species1-ChargeIC = 0.0 + +Part-Species1-nInits = 1 + +Part-Species1-Init1-velocityDistribution = maxwell_lpn +Part-Species1-Init1-SpaceIC = background +Part-Species1-Init1-VeloIC = 0. +Part-Species1-Init1-PartDensity = 10.0e20 +Part-Species1-Init1-VeloVecIC = (/0.,1.,0./) +Part-Species1-Init1-MWTemperatureIC = 300. +Part-Species1-Init1-TempVib = 300. +Part-Species1-Init1-TempRot = 300. +Part-Species1-Init1-TempElec = 300. +! =============================================================================== ! +! Species2 | H +! =============================================================================== ! +Part-Species2-MassIC = 1.674E-27 +Part-Species2-ChargeIC = 0.0 +Part-Species2-TempElec = 300. +! =============================================================================== ! +! Species3 | e +! =============================================================================== ! +Part-Species3-MassIC = 9.11E-31 +Part-Species3-ChargeIC = -1.60217653E-19 +! =============================================================================== ! +! Species4 | H2Ion +! =============================================================================== ! +Part-Species4-MassIC = 3.3470890E-27 +Part-Species4-ChargeIC = 1.60217653E-19 +!Part-Species4-TempVib = 300. +!Part-Species4-TempRot = 300. +!Part-Species4-TempElec = 300. +! =============================================================================== ! +! Species5 | HIon +! =============================================================================== ! +Part-Species5-MassIC = 1.673089E-27 +Part-Species5-ChargeIC = 1.60217653E-19 diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/pre-hopr/hopr.ini b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/pre-hopr/hopr.ini new file mode 100644 index 000000000..c289054a5 --- /dev/null +++ b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/pre-hopr/hopr.ini @@ -0,0 +1,58 @@ +!=============================================================================== ! +! OUTPUT +!=============================================================================== ! +ProjectName = box ! name of the project (used for filenames) +Debugvisu = T ! Write debug mesh to file +Logging = F ! Write log files + +!=============================================================================== ! +! MESH +!=============================================================================== ! +Mode =1 ! 1 Cartesian 2 gambit file 3 CGNS +nZones =1 ! number of zones +Corner =(/0.,0.,0.,,1.0,0.,0.,,1.0,1.0,0.,,0.,1.0,0.,,0.,0.,1.0,,1.0,0.,1.0,,1.0,1.0,1.0,,0.,1.0,1.0/) +nElems =(/5,5,5/) ! number of elements in each direction (30x30x30) +BCIndex =(/5,3,2,4,1,6/) ! Indices of UserDefinedBoundaries +elemtype =108 ! Elementform (108: Hexaeder) +useCurveds =F ! T if curved boundaries defined +SpaceQuandt =1. ! characteristic length of the mesh +ConformConnect=T + +!=============================================================================== ! +! NON-PERIODIC BOUNDARY CONDITIONS +!=============================================================================== ! +nUserDefinedBoundaries=6 +BoundaryName=BC_periodicx- ! Periodic (+vv1) +BoundaryType=(/4,0,0,0/) ! Periodic (+vv1) +BoundaryName=BC_periodicx+ ! Periodic (-vv1) +BoundaryType=(/4,0,0,0/) ! Periodic (-vv1) +BoundaryName=BC_periodicy- ! Periodic (+vv2) +BoundaryType=(/4,0,0,0/) ! Periodic (+vv2) +BoundaryName=BC_periodicy+ ! Periodic (-vv2) +BoundaryType=(/4,0,0,0/) ! Periodic (-vv2) +BoundaryName=BC_WALL +BoundaryType=(/4,0,0,0/) +BoundaryName=BC_TOP +BoundaryType=(/4,0,0,0/) + + +! !=============================================================================== ! +! ! PERIODIC BOUNDARY CONDITIONS +! !=============================================================================== ! +! nUserDefinedBoundaries=6 +! BoundaryName=BC_periodicx- ! Periodic (+vv1) +! BoundaryType=(/1,0,0,1/) ! Periodic (+vv1) +! BoundaryName=BC_periodicx+ ! Periodic (-vv1) +! BoundaryType=(/1,0,0,-1/) ! Periodic (-vv1) +! BoundaryName=BC_periodicy- ! Periodic (+vv2) +! BoundaryType=(/1,0,0,2/) ! Periodic (+vv2) +! BoundaryName=BC_periodicy+ ! Periodic (-vv2) +! BoundaryType=(/1,0,0,-2/) ! Periodic (-vv2) +! BoundaryName=BC_WALL +! BoundaryType=(/4,0,0,0/) +! BoundaryName=BC_TOP +! BoundaryType=(/4,0,0,0/) +! +! nVV=2 +! VV=(/1.0 , 0. , 0./) +! VV=(/0. , 1.0 , 0./) diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/readme.md b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/readme.md new file mode 100644 index 000000000..4ffc58cd6 --- /dev/null +++ b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/readme.md @@ -0,0 +1,8 @@ +# Photoionization: Volumetric Emission Ray Trace +* ray tracing + volume ionization reactions +* reference density in Electrons_ref.csv calculated with the old model and 1x1x1 emission region for volume see and 1e-3 J +* Particle emission due to photoionization of $`H_{2}`$ in a volume only (no surface emission) +* no deposition, no interpolation +* comparison of the number of emitted electrons with the reference solution (1 MPF and MPI=1) +* different MPF and number of MPI ranks are tested to yield the same result +* Note: Because the volume is exactly 1 cubic metre, the calculated electron density is exactly the number of real electrons in the system diff --git a/src/particles/emission/particle_emission.f90 b/src/particles/emission/particle_emission.f90 index f60367da1..01e3ca2d3 100644 --- a/src/particles/emission/particle_emission.f90 +++ b/src/particles/emission/particle_emission.f90 @@ -235,7 +235,6 @@ SUBROUTINE ParticleInserting() IF(TRIM(Species(i)%Init(iInit)%SpaceIC).EQ.'photon_rectangle')THEN ! Rectangular area -> cuboid: Equally distributed over c*dt NbrOfPhotons = NbrOfPhotons * Species(i)%Init(iInit)%CuboidHeightIC / (c*dt) - print*, NbrOfPhotons ELSE ! Cylinder and honeycomb: Equally distributed over c*dt NbrOfPhotons = NbrOfPhotons * Species(i)%Init(iInit)%CylinderHeightIC / (c*dt) diff --git a/src/radiation/ray_tracing/raytrace_ini.f90 b/src/radiation/ray_tracing/raytrace_ini.f90 index 56f96e30c..8b4bf757d 100644 --- a/src/radiation/ray_tracing/raytrace_ini.f90 +++ b/src/radiation/ray_tracing/raytrace_ini.f90 @@ -37,7 +37,7 @@ SUBROUTINE DefineParametersRayTracing() CALL prms%SetSection("Ray Tracing") !CALL prms%CreateLogicalOption( 'RayTracing-AdaptiveRays' , 'TODO' , '.FALSE.') -CALL prms%CreateIntOption( 'RayTracing-NumRays' , 'Number of emitted rays from particle boundary with index [RayTracing-PartBound]' , '1') +CALL prms%CreateIntOption( 'RayTracing-NumRays' , 'Number of emitted rays from particle boundary with index [RayTracing-PartBound]') CALL prms%CreateRealArrayOption( 'RayTracing-RayDirection' , 'Direction vector for ray emission. Will be normalized after read-in.' , no=3) CALL prms%CreateIntOption( 'RayTracing-PartBound' , 'Particle boundary ID where rays are emitted from' , '0') CALL prms%CreateRealOption( 'RayTracing-PulseDuration' , 'Pulse duration tau for a Gaussian-type pulse with I~exp(-(t/tau)^2) [s]' ) @@ -110,10 +110,11 @@ SUBROUTINE InitRayTracing() Ray%Direction = GETREALARRAY('RayTracing-RayDirection',3) Ray%Direction = UNITVECTOR(Ray%Direction) -NumRays = GETINT('RayTracing-NumRays') -RayForceAbsorption = GETLOGICAL('RayTracing-ForceAbsorption') - -Ray%VolRefineMode = GETINT('RayTracing-VolRefineMode') +IF(PerformRayTracing)THEN + NumRays = GETINT('RayTracing-NumRays') + RayForceAbsorption = GETLOGICAL('RayTracing-ForceAbsorption') + Ray%VolRefineMode = GETINT('RayTracing-VolRefineMode') +END IF ! PerformRayTracing Ray%NodeType = NodeTypeVISU From 80adedd646d93b173840fef1bf1c2e81f2898995 Mon Sep 17 00:00:00 2001 From: Franziska Hild Date: Wed, 9 Aug 2023 17:31:35 +0200 Subject: [PATCH 138/495] BGK some small stuff + exits to do while loops --- src/particles/bgk/bgk_colloperator.f90 | 69 ++++++++++++++------------ src/particles/bgk/bgk_init.f90 | 17 ++++--- src/particles/bgk/bgk_main.f90 | 2 +- 3 files changed, 48 insertions(+), 40 deletions(-) diff --git a/src/particles/bgk/bgk_colloperator.f90 b/src/particles/bgk/bgk_colloperator.f90 index d6f29cce7..4b7841268 100644 --- a/src/particles/bgk/bgk_colloperator.f90 +++ b/src/particles/bgk/bgk_colloperator.f90 @@ -131,6 +131,7 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume, AveragingVal ! totalWeight contains the weighted particle number dens = totalWeight / NodeVolume ELSE + ! MPF is the same for all species dens = totalWeight * Species(1)%MacroParticleFactor / NodeVolume END IF @@ -168,7 +169,7 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume, AveragingVal ! S. Chapman and T.G. Cowling, "The mathematical Theory of Non-Uniform Gases", Cambridge University Press, 1970, S. 87f ! For SpecBGK(iSpec)%CollFreqPreFactor(jSpec) see bgk_init.f90 ! VHS according to M. Pfeiffer, "Extending the particle ellipsoidal statistical Bhatnagar-Gross-Krook method to diatomic - ! molecules including quantized vibrational energies", Phys. Fluids 30, 116103 (2018), Eq. (18) + ! molecules including quantized vibrational energies", Phys. Fluids 30, 116103 (2018), Eq. (18) - NEW (tbd) collisionfreqSpec(iSpec) = collisionfreqSpec(iSpec) + SpecBGK(iSpec)%CollFreqPreFactor(jSpec) * totalWeightSpec(jSpec) & * (Dens / totalWeight) *CellTemptmp**(-CollInf%omega(iSpec,jSpec) +0.5) END DO @@ -261,19 +262,16 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume, AveragingVal VibEnergyDOF, Xi_VibSpecNew, TEqui) END IF -! Remaining vibrational (+ translational) energy + rotational energy for translation and rotation +! Remaining vibrational + translational energy + old rotational energy for translation and rotation OldEn = OldEn + OldEnRot Xi_RotTotal = 0.0 DO iSpec = 1, nSpecies - ! = tbd ======= nRotRelaxSpec or RotRelaxWeightSpec? ======================================================================= + ! Sum of relaxing rotational degrees of freedom Xi_RotTotal = Xi_RotTotal + Xi_RotSpec(iSpec)*RotRelaxWeightSpec(iSpec) - ! ERotTtransSpecMean(iSpec)*RotRelaxWeightSpec(iSpec) is energy that should be in rotation - !OldEn = OldEn - ERotTtransSpecMean(iSpec)*RotRelaxWeightSpec(iSpec) END DO ! 8.) Determine the new particle state and ensure energy conservation by scaling the new velocities with the factor alpha ! Calculation of scaling factor alpha -! = tbd ======= nPart or totalWeight? ======================================================================================== alpha = SQRT(OldEn/NewEn*(3.*(totalWeight-1.))/(Xi_RotTotal+3.*(totalWeight-1.))) ! Calculation of the final particle velocities with vBulkAll (average flow velocity before relaxation), scaling factor alpha, ! the particle velocity PartState(4:6,iPart) after the relaxation but before the energy conservation and vBulk (average value of @@ -300,11 +298,9 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume, AveragingVal ! 9.) Rotation: Scale the new rotational state of the molecules to ensure energy conservation DO iSpec = 1, nSpecies ! Calculate scaling factor alpha per species, see M. Pfeiffer, "Extending the particle ellipsoidal statistical Bhatnagar-Gross- - ! Krook method to diatomic molecules including quantized vibrational energies", Phys. Fluids 30, 116103 (2018) + ! Krook method to diatomic molecules including quantized vibrational energies", Phys. Fluids 30, 116103 (2018) - NEW (tbd) IF (NewEnRot(iSpec).GT.0.0) THEN - ! = tbd ======= nRotRelaxSpec or RotRelaxWeightSpec? nPart or totalWeight? ================================================ alphaRot(iSpec) = OldEn/NewEnRot(iSpec)*(Xi_RotSpec(iSpec)*RotRelaxWeightSpec(iSpec)/(Xi_RotTotal+3.*(totalWeight-1.))) - !alphaRot(iSpec) = ERotTtransSpecMean(iSpec)*RotRelaxWeightSpec(iSpec)/NewEnRot(iSpec) ELSE alphaRot(iSpec) = 0.0 END IF @@ -625,7 +621,7 @@ SUBROUTINE CalcInnerDOFs(nSpec, EVibSpec, ERotSpec, totalWeightSpec, TVibSpec, T ELSE ! diatomic ! Calculation of vibrational temperature and DOFs from Pfeiffer, Physics of Fluids 30, 116103 (2018), "Extending the ! particle ellipsoidal statistical Bhatnagar-Gross-Krook method to diatomic molecules including quantized vibrational - ! energies" + ! energies" - check ref (tbd) ! TVibSpec = vibrational energy without zero-point energy TVibSpec(iSpec) = EVibSpec(iSpec) / (totalWeightSpec(iSpec)*BoltzmannConst*SpecDSMC(iSpec)%CharaTVib) IF (TVibSpec(iSpec).GT.0.0) TVibSpec(iSpec) = SpecDSMC(iSpec)%CharaTVib/LOG(1. + 1./(TVibSpec(iSpec))) @@ -805,7 +801,7 @@ SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, Xi_VibSpec, EVibSpec, totalWeightSpe REAL, INTENT(OUT) :: betaR(nSpecies), betaV(nSpecies) !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -INTEGER :: iSpec, iDOF, iPolyatMole +INTEGER :: iSpec, iDOF, iPolyatMole, i, j REAL :: RotFracSpec(nSpecies), VibFracSpec(nSpecies) REAL :: ERotSpecMean(nSpecies), EVibSpecMean(nSpecies), ETransRelMean REAL :: ERotTtransSpecMean(nSpecies), EVibTtransSpecMean(nSpecies) @@ -885,8 +881,10 @@ SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, Xi_VibSpec, EVibSpec, totalWeightSpe END DO TEqui = TEquiNum/TEquiDenom +i=0 ! Solving of equation system until accuracy eps_prec is reached -DO WHILE ( ABS( TEqui - TEqui_Old ) .GT. eps_prec ) +outerLoop: DO WHILE ( ABS( TEqui - TEqui_Old ) .GT. eps_prec ) + i = i + 1 DO iSpec = 1, nSpecies IF((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN ! if difference small: equilibrium, no beta @@ -957,8 +955,10 @@ SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, Xi_VibSpec, EVibSpec, totalWeightSpe END DO TEqui = TEquiNum/TEquiDenom IF(BGKDoVibRelaxation) THEN + j=0 ! accuracy eps_prec not reached yet - DO WHILE ( ABS( TEqui - TEqui_Old2 ) .GT. eps_prec ) + innerLoop: DO WHILE ( ABS( TEqui - TEqui_Old2 ) .GT. eps_prec ) + j=j+1 ! mean value of old and new equilibrium temperature TEqui = (TEqui + TEqui_Old2) * 0.5 DO iSpec = 1, nSpecies @@ -1005,9 +1005,11 @@ SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, Xi_VibSpec, EVibSpec, totalWeightSpe END IF END DO TEqui = TEquiNum/TEquiDenom - END DO + IF (j.EQ.30) EXIT innerLoop + END DO innerLoop END IF -END DO + IF (i.EQ.30) EXIT outerLoop +END DO outerLoop END SUBROUTINE CalcTRelax @@ -1269,7 +1271,7 @@ SUBROUTINE SampleFromTargetDistr(nRelax, iPartIndx_NodeRelax, Prandtl, u2, u0ij, A(2,1)=A(1,2) A(3,1)=A(1,3) A(3,2)=A(2,3) - CALL MetropolisES(nRelax, iRanPart, A) + CALL MetropolisES(nRelax, iRanPart, A*MassIC_Mixture, CellTempRel) END IF END IF @@ -1297,7 +1299,7 @@ SUBROUTINE SampleFromTargetDistr(nRelax, iPartIndx_NodeRelax, Prandtl, u2, u0ij, PartState(4:6,iPart) = vBulkAll(1:3) + MATMUL(SMat,tempVelo) ELSE IF ((BGKCollModel.EQ.1).AND.(ESBGKModel.EQ.3)) THEN ! New thermal velocity (in x,y,z) of particle with mass scaling multiplied by normal distributed random vector - PartState(4:6,iPart) = vBulkAll(1:3) + SQRT(MassIC_Mixture/Species(iSpec)%MassIC)*iRanPart(1:3,iLoop) + PartState(4:6,iPart) = vBulkAll(1:3) + SQRT(1./Species(iSpec)%MassIC)*iRanPart(1:3,iLoop) ELSE ! New thermal velocity (in x,y,z) of particle is sqrt(k_B*T/m) multiplied by normal distributed random vector PartState(4:6,iPart) = vBulkAll(1:3) + SQRT(BoltzmannConst*CellTempRel/Species(iSpec)%MassIC)*iRanPart(1:3,iLoop) @@ -1346,8 +1348,7 @@ SUBROUTINE EnergyConsVib(nPart, totalWeight, nVibRelax, VibRelaxWeightSpec, iPar IF (ANY(NewEnVib.GT.0.0).AND.(nVibRelax.GT.0)) THEN Xi_VibTotal = 0.0 DO iSpec = 1, nSpecies - ! Total number of relaxing vibrational degrees of freedom - ! = tbd ======= nVibRelaxSpec or VibRelaxWeightSpec? nPart or totalWeight for alpha? ======================================= + ! Sum of relaxing vibrational degrees of freedom Xi_VibTotal = Xi_VibTotal + Xi_VibSpec(iSpec)*VibRelaxWeightSpec(iSpec) END DO ! Calculate scaling factor alpha per species @@ -1466,44 +1467,46 @@ SUBROUTINE EnergyConsVib(nPart, totalWeight, nVibRelax, VibRelaxWeightSpec, iPar END SUBROUTINE EnergyConsVib -SUBROUTINE MetropolisES(nPart, iRanPart, A) +SUBROUTINE MetropolisES(nPart, iRanPart, A, CellTempRel) !=================================================================================================================================== !> Sampling from ESBGK target distribution function by using a Metropolis-Hastings method !=================================================================================================================================== ! MODULES USE Ziggurat -USE MOD_Basis ,ONLY: INV33 +USE MOD_Basis ,ONLY: INV33 +USE MOD_Globals_Vars ,ONLY: BoltzmannConst ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES INTEGER, INTENT(IN) :: nPart -REAL, INTENT(IN) :: A(3,3) +REAL, INTENT(IN) :: A(3,3), CellTempRel !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES REAL, INTENT(OUT) :: iRanPart(:,:) !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -REAL :: iRanPartTemp(3), V2, iRan, NewProb, OldProb, NormProb +REAL :: iRanPartTemp(3), V2, iRan, NewProb, OldProb, NormProb, prefacor INTEGER :: iLoop, iPart, iRun LOGICAL :: Changed REAL :: AC(3), AInvers(3,3), detA !=================================================================================================================================== ! Generate normal distributed random vector as start vector for the thermal velocity -iRanPart(1,1) = rnor() -iRanPart(2,1) = rnor() -iRanPart(3,1) = rnor() +prefacor = SQRT(BoltzmannConst*CellTempRel) +iRanPart(1,1) = rnor()*prefacor +iRanPart(2,1) = rnor()*prefacor +iRanPart(3,1) = rnor()*prefacor ! Inverse matrix of A -CALL INV33(A,AInvers, detA) +CALL INV33(A, AInvers, detA) AC(1:3) = MATMUL(AInvers, iRanPart(1:3,1)) V2 = iRanPart(1,1)*AC(1) + iRanPart(2,1)*AC(2) + iRanPart(3,1)*AC(3) OldProb = EXP(-0.5*V2) ! Burn-in phase, 35 initial steps DO iLoop = 1, 35 ! Generate normal distributed random vector for the thermal velocity - iRanPartTemp(1) = rnor() - iRanPartTemp(2) = rnor() - iRanPartTemp(3) = rnor() + iRanPartTemp(1) = rnor()*prefacor + iRanPartTemp(2) = rnor()*prefacor + iRanPartTemp(3) = rnor()*prefacor AC(1:3) = MATMUL(AInvers, iRanPartTemp(1:3)) V2 = iRanPartTemp(1)*AC(1) + iRanPartTemp(2)*AC(2) + iRanPartTemp(3)*AC(3) NewProb = EXP(-0.5*V2) @@ -1527,9 +1530,9 @@ SUBROUTINE MetropolisES(nPart, iRanPart, A) DO WHILE ((iRun.LT.10).OR.(.NOT.Changed)) iRun = iRun + 1 ! Generate normal distributed random vector for the thermal velocity - iRanPartTemp(1) = rnor() - iRanPartTemp(2) = rnor() - iRanPartTemp(3) = rnor() + iRanPartTemp(1) = rnor()*prefacor + iRanPartTemp(2) = rnor()*prefacor + iRanPartTemp(3) = rnor()*prefacor AC(1:3) = MATMUL(AInvers, iRanPartTemp(1:3)) V2 = iRanPartTemp(1)*AC(1) + iRanPartTemp(2)*AC(2) + iRanPartTemp(3)*AC(3) NewProb = EXP(-0.5*V2) diff --git a/src/particles/bgk/bgk_init.f90 b/src/particles/bgk/bgk_init.f90 index 7bd5d6f93..1d8fcae12 100644 --- a/src/particles/bgk/bgk_init.f90 +++ b/src/particles/bgk/bgk_init.f90 @@ -68,7 +68,7 @@ SUBROUTINE DefineParametersBGK() 'cell refinement') CALL prms%CreateLogicalOption('Particles-BGK-MovingAverage', 'Enable a moving average of variables for the calculation '//& 'of the cell temperature for relaxation frequencies','.FALSE.') -CALL prms%CreateRealOption( 'Particles-BGK-MovingAverageFac', 'Use the moving average of moments M with '//& +CALL prms%CreateRealOption( 'Particles-BGK-MovingAverageFac', 'Use the moving average of moments M with '//& 'M^n+1=AverageFac*M+(1-AverageFac)*M^n','0.01') CALL prms%CreateRealOption( 'Particles-BGK-SplittingDens', 'Octree-refinement will only be performed above this number '//& 'density', '0.0') @@ -128,32 +128,35 @@ SUBROUTINE InitBGK() BGKCollModel = GETINT('Particles-BGK-CollModel') IF ((nSpecies.GT.1).AND.(BGKCollModel.GT.1)) THEN - CALL abort(__STAMP__,' ERROR Multispec only with ESBGK model!') + CALL abort(__STAMP__,'ERROR Multispec only with ESBGK model!') END IF BGKMixtureModel = GETINT('Particles-BGK-MixtureModel') -! ESBGK options -ESBGKModel = GETINT('Particles-ESBGK-Model') ! 1: Approximative, 2: Exact, 3: MetropolisHastings +! ESBGK options for sampling: 1: Approximative, 2: Exact, 3: MetropolisHastings +ESBGKModel = GETINT('Particles-ESBGK-Model') + ! Coupled BGK with DSMC, use a number density as limit above which BGK is used, and below which DSMC is used CoupledBGKDSMC = GETLOGICAL('Particles-CoupledBGKDSMC') IF(CoupledBGKDSMC) THEN IF (DoVirtualCellMerge) THEN - CALL abort(__STAMP__,' Virtual cell merge not implemented for coupled DSMC-BGK simulations!') + CALL abort(__STAMP__,'Virtual cell merge not implemented for coupled DSMC-BGK simulations!') END IF BGKDSMCSwitchDens = GETREAL('Particles-BGK-DSMC-SwitchDens') ELSE IF(RadialWeighting%DoRadialWeighting) RadialWeighting%PerformCloning = .TRUE. END IF + ! Octree-based cell refinement, up to a certain number of particles DoBGKCellAdaptation = GETLOGICAL('Particles-BGK-DoCellAdaptation') IF(DoBGKCellAdaptation) THEN BGKMinPartPerCell = GETINT('Particles-BGK-MinPartsPerCell') IF(.NOT.DSMC%UseOctree) THEN DSMC%UseOctree = .TRUE. - IF(NGeo.GT.PP_N) CALL abort(__STAMP__,' Set PP_N to NGeo, otherwise the volume is not computed correctly.') + IF(NGeo.GT.PP_N) CALL abort(__STAMP__,'Set PP_N to NGeo, otherwise the volume is not computed correctly.') CALL DSMC_init_octree() END IF END IF BGKSplittingDens = GETREAL('Particles-BGK-SplittingDens') + ! Moving Average BGKMovingAverage = GETLOGICAL('Particles-BGK-MovingAverage') IF(BGKMovingAverage) THEN @@ -162,6 +165,7 @@ SUBROUTINE InitBGK() CALL BGK_init_MovingAverage() IF(nSpecies.GT.1) CALL abort(__STAMP__,'nSpecies >1 and molecules not implemented for BGK averaging!') END IF + IF(MoleculePresent) THEN ! Vibrational modelling BGKDoVibRelaxation = GETLOGICAL('Particles-BGK-DoVibRelaxation') @@ -237,6 +241,7 @@ SUBROUTINE FinalizeBGK() END SUBROUTINE FinalizeBGK + SUBROUTINE DeleteElemNodeAverage() !----------------------------------------------------------------------------------------------------------------------------------! ! Delete the pointer tree ElemNodeVol diff --git a/src/particles/bgk/bgk_main.f90 b/src/particles/bgk/bgk_main.f90 index 2ffa679bd..d856dd6dc 100644 --- a/src/particles/bgk/bgk_main.f90 +++ b/src/particles/bgk/bgk_main.f90 @@ -132,7 +132,7 @@ SUBROUTINE BGK_DSMC_main(stage_opt) BGK_PrandtlNumber=0.; BGK_ExpectedPrandtlNumber=0.; BGK_Viscosity=0.; BGK_ThermalConductivity=0. END IF IF (BGKMovingAverage) THEN - CALL BGK_CollisionOperator(iPartIndx_Node, nPart, ElemVolume_Shared(CNElemID), ElemNodeAveraging(iElem)%Root%AverageValues(:)) + CALL BGK_CollisionOperator(iPartIndx_Node, nPart, ElemVolume_Shared(CNElemID), ElemNodeAveraging(iElem)%Root%AverageValues(:)) ELSE CALL BGK_CollisionOperator(iPartIndx_Node, nPart, ElemVolume_Shared(CNElemID)) END IF From dae6588890e350b6a9485961d689908c9ac9a60e Mon Sep 17 00:00:00 2001 From: Franziska Hild Date: Fri, 11 Aug 2023 11:47:15 +0200 Subject: [PATCH 139/495] BGK colloperator comments + new references --- src/particles/bgk/bgk_colloperator.f90 | 34 ++++++++++++++++---------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/src/particles/bgk/bgk_colloperator.f90 b/src/particles/bgk/bgk_colloperator.f90 index 4b7841268..bce073021 100644 --- a/src/particles/bgk/bgk_colloperator.f90 +++ b/src/particles/bgk/bgk_colloperator.f90 @@ -169,7 +169,7 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume, AveragingVal ! S. Chapman and T.G. Cowling, "The mathematical Theory of Non-Uniform Gases", Cambridge University Press, 1970, S. 87f ! For SpecBGK(iSpec)%CollFreqPreFactor(jSpec) see bgk_init.f90 ! VHS according to M. Pfeiffer, "Extending the particle ellipsoidal statistical Bhatnagar-Gross-Krook method to diatomic - ! molecules including quantized vibrational energies", Phys. Fluids 30, 116103 (2018), Eq. (18) - NEW (tbd) + ! molecules including quantized vibrational energies", Phys. Fluids 30, 116103 (2018), Eq. (18) collisionfreqSpec(iSpec) = collisionfreqSpec(iSpec) + SpecBGK(iSpec)%CollFreqPreFactor(jSpec) * totalWeightSpec(jSpec) & * (Dens / totalWeight) *CellTemptmp**(-CollInf%omega(iSpec,jSpec) +0.5) END DO @@ -297,8 +297,8 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume, AveragingVal ! 9.) Rotation: Scale the new rotational state of the molecules to ensure energy conservation DO iSpec = 1, nSpecies - ! Calculate scaling factor alpha per species, see M. Pfeiffer, "Extending the particle ellipsoidal statistical Bhatnagar-Gross- - ! Krook method to diatomic molecules including quantized vibrational energies", Phys. Fluids 30, 116103 (2018) - NEW (tbd) + ! Calculate scaling factor alpha per species, see F. Hild, M. Pfeiffer, "Multi-species modeling in the particle-based ellipsoidal + ! statistical Bhatnagar-Gross-Krook method including internal degrees of freedom", subitted to Phys. Fluids, August 2023 IF (NewEnRot(iSpec).GT.0.0) THEN alphaRot(iSpec) = OldEn/NewEnRot(iSpec)*(Xi_RotSpec(iSpec)*RotRelaxWeightSpec(iSpec)/(Xi_RotTotal+3.*(totalWeight-1.))) ELSE @@ -621,7 +621,7 @@ SUBROUTINE CalcInnerDOFs(nSpec, EVibSpec, ERotSpec, totalWeightSpec, TVibSpec, T ELSE ! diatomic ! Calculation of vibrational temperature and DOFs from Pfeiffer, Physics of Fluids 30, 116103 (2018), "Extending the ! particle ellipsoidal statistical Bhatnagar-Gross-Krook method to diatomic molecules including quantized vibrational - ! energies" - check ref (tbd) + ! energies" ! TVibSpec = vibrational energy without zero-point energy TVibSpec(iSpec) = EVibSpec(iSpec) / (totalWeightSpec(iSpec)*BoltzmannConst*SpecDSMC(iSpec)%CharaTVib) IF (TVibSpec(iSpec).GT.0.0) TVibSpec(iSpec) = SpecDSMC(iSpec)%CharaTVib/LOG(1. + 1./(TVibSpec(iSpec))) @@ -677,10 +677,9 @@ SUBROUTINE CalcGasProperties(nSpec, dens, InnerDOF, totalWeightSpec, totalWeight C_P = 0.0 DO iSpec = 1, nSpecies IF (nSpec(iSpec).EQ.0) CYCLE - ! Correction of Pr for calculation of relaxation frequency, see alpha - Pfeiffer et. al., Physics of Fluids 33, 036106 (2021), - ! "Multi-species modeling in the particle-based ellipsoidal statistical Bhatnagar-Gross-Krook method for monatomic gas species" - ! Extension for inner degrees of freedom using S. Brull, Communications in Mathematical Sciences 19, 2177-2194, 2021, - ! "An Ellipsoidal Statistical Model for a monoatomic and polyatomic gas mixture" + ! Correction of Pr for calculation of relaxation frequency, see alpha - F. Hild, M. Pfeiffer, "Multi-species modeling in the + ! particle-based ellipsoidal statistical Bhatnagar-Gross-Krook method including internal degrees of freedom", subitted to Phys. + ! Fluids, August 2023 PrandtlCorrection = PrandtlCorrection + DOFFraction(iSpec)*MassIC_Mixture/Species(iSpec)%MassIC/TotalDOFWeight C_P = C_P + ((5. + (Xi_VibSpec(iSpec)+Xi_RotSpec(iSpec)))/2.) * BoltzmannConst / Species(iSpec)%MassIC * MassFraction(iSpec) END DO @@ -688,6 +687,8 @@ SUBROUTINE CalcGasProperties(nSpec, dens, InnerDOF, totalWeightSpec, totalWeight SELECT CASE(BGKMixtureModel) ! Both cases are described in Pfeiffer et. al., Physics of Fluids 33, 036106 (2021), ! "Multi-species modeling in the particle-based ellipsoidal statistical Bhatnagar-Gross-Krook method for monatomic gas species" + ! Extension to poyatomic mixtures according to F. Hild, M. Pfeiffer, "Multi-species modeling in the particle-based ellipsoidal + ! statistical Bhatnagar-Gross-Krook method including internal degrees of freedom", subitted to Phys. Fluids, August 2023 CASE (1) ! Wilke's mixing rules DO iSpec = 1, nSpecies @@ -810,6 +811,8 @@ SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, Xi_VibSpec, EVibSpec, totalWeightSpe !=================================================================================================================================== ! According to J. Mathiaud et. al., "An ES-BGK model for diatomic gases with correct relaxation rates for internal energies", ! European Journal of Mechanics - B/Fluids, 96, pp. 65-77, 2022 +! For implentation, see F. Hild, M. Pfeiffer, "Multi-species modeling in the particle-based ellipsoidal statistical Bhatnagar-Gross- +! Krook method including internal degrees of freedom", subitted to Phys. Fluids, August 2023 RotFracSpec=0.0; VibFracSpec=0.0; Xi_vib_DOF=0.0; Xi_VibSpecNew=0.0; betaR=1.0; betaV=1.0 ERotSpecMean=0.0; ERotTtransSpecMean=0.0; EVibSpecMean=0.0; EVibTtransSpecMean=0.0; ETransRelMean=0.0; CellTempRel=0.0 @@ -1051,6 +1054,8 @@ SUBROUTINE DetermineRelaxPart(nPart, iPartIndx_Node, relaxfreq, dtCell, nRelax, ! Calculate probability of relaxation of a particle towards the target distribution function ProbAddPartTrans = 1.-EXP(-relaxfreq*dtCell) ! Calculate probabilities of relaxation of a particle in the rotation and vibration +! See F. Hild, M. Pfeiffer, "Multi-species modeling in the particle-based ellipsoidal statistical Bhatnagar-Gross-Krook method +! including internal degrees of freedom", subitted to Phys. Fluids, August 2023 ProbAddPartRot(:) = ProbAddPartTrans * rotrelaxfreqSpec(:)/relaxfreq*betaR(:) ProbAddPartVib(:) = ProbAddPartTrans * vibrelaxfreqSpec(:)/relaxfreq*betaV(:) @@ -1201,7 +1206,9 @@ SUBROUTINE SampleFromTargetDistr(nRelax, iPartIndx_NodeRelax, Prandtl, u2, u0ij, REAL :: iRanPart(3, nRelax), A(3,3), KronDelta, SMat(3,3), W(3), Work(100), tempVelo(3), partWeight !=================================================================================================================================== ! According to M. Pfeiffer, "Particle-based fluid dynamics: Comparison of different Bhatnagar-Gross-Krook models and the direct -! simulation Monte Carlo method for hypersonic flows", Phys. Fluids 30, 106106 (2018) +! simulation Monte Carlo method for hypersonic flows", Phys. Fluids 30, 106106 (2018) and F. Hild, M. Pfeiffer, "Multi-species +! modeling in the particle-based ellipsoidal statistical Bhatnagar-Gross-Krook method including internal degrees of freedom", +! subitted to Phys. Fluids, August 2023 IF (nRelax.GT.0) THEN SELECT CASE(BGKCollModel) CASE (1) ! Ellipsoidal Statistical BGK @@ -1341,8 +1348,8 @@ SUBROUTINE EnergyConsVib(nPart, totalWeight, nVibRelax, VibRelaxWeightSpec, iPar INTEGER :: iPart, iLoop, iDOF, iSpec, iQuant, iQuaMax, iPolyatMole REAL :: Xi_VibTotal, alpha(nSpecies), partWeight, betaV, iRan, MaxColQua !=================================================================================================================================== -! According to M. Pfeiffer, "Extending the particle ellipsoidal statistical Bhatnagar-Gross-Krook method to diatomic molecules -! including quantized vibrational energies", Phys. Fluids 30, 116103 (2018) +! According to F. Hild, M. Pfeiffer, "Multi-species modeling in the particle-based ellipsoidal statistical Bhatnagar-Gross-Krook +! method including internal degrees of freedom", subitted to Phys. Fluids, August 2023 IF(BGKDoVibRelaxation) THEN ! Vibrational energy is positive for at least one species + there are vibrational relaxations IF (ANY(NewEnVib.GT.0.0).AND.(nVibRelax.GT.0)) THEN @@ -1356,7 +1363,6 @@ SUBROUTINE EnergyConsVib(nPart, totalWeight, nVibRelax, VibRelaxWeightSpec, iPar DO iSpec = 1, nSpecies IF (NewEnVib(iSpec).GT.0.0) THEN alpha(iSpec) = OldEn/NewEnVib(iSpec)*(Xi_VibSpec(iSpec)*VibRelaxWeightSpec(iSpec)/(3.*(totalWeight-1.)+Xi_VibTotal)) - !alpha(iSpec) = EVibTtransSpecMean(iSpec)*VibRelaxWeightSpec(iSpec)/NewEnVib(iSpec) ELSE alpha(iSpec) = 0. END IF @@ -1683,7 +1689,7 @@ SUBROUTINE CalcViscosityThermalCondColIntVHS(CellTemp, Xi, dens, Xi_RotSpec, Xi_ ! S. Chapman and T.G. Cowling, "The mathematical Theory of Non-Uniform Gases", Cambridge University Press, 1970, S. 160 ViscSpec(iSpec) = (5./8.)*(BoltzmannConst*CellTemp(iSpec))/Sigma_22 ThermalCondSpec(iSpec) = (25./16.)*(cv*BoltzmannConst*CellTemp(iSpec))/Sigma_22 - ! results in in same as ThermalCondSpec(iSpec) = (15./4.)*BoltzmannConst/(2.*Mass)*ViscSpec(iSpec) + ! Results in the same as ThermalCondSpec(iSpec) = (15./4.)*BoltzmannConst/(2.*Mass)*ViscSpec(iSpec) ! Additional calculation of Sigma_11VHS and the diffusion coefficient for molecular species IF ((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN CALL CalcSigma_11VHS(CellTemp(nSpecies+1), InteractDiam, Mass, TVHS, omegaVHS, Sigma_11) @@ -1712,6 +1718,8 @@ SUBROUTINE CalcViscosityThermalCondColIntVHS(CellTemp, Xi, dens, Xi_RotSpec, Xi_ IF ((SpecDSMC(iSpec)%InterID.EQ.2).OR.(SpecDSMC(iSpec)%InterID.EQ.20)) THEN ! Calculation of thermal conductivity of rotation and vibration for each molecular species ! S. Chapman and T.G. Cowling, "The mathematical Theory of Non-Uniform Gases", Cambridge University Press, 1970, S. 254f + ! F. Hild, M. Pfeiffer, "Multi-species modeling in the particle-based ellipsoidal statistical Bhatnagar-Gross-Krook method + ! including internal degrees of freedom", subitted to Phys. Fluids, August 2023 Xi_Dij_tot = SUM(Xj_Dij(iSpec,:)) rhoSpec = dens * Species(iSpec)%MassIC * Xi(iSpec) ThermalCondSpec_Rot(iSpec) = (rhoSpec*cv_rot/Xi_Dij_tot) From 38d976bd77a72f926faea5717ba86e86acd66a8e Mon Sep 17 00:00:00 2001 From: Marcel Pfeiffer Date: Wed, 16 Aug 2023 15:58:12 +0200 Subject: [PATCH 140/495] spec specifig absorption --- src/mpi/mpi_shared.f90 | 59 ++++++++++++++++++- .../radiation_solver/radiation_atoms.f90 | 5 +- .../radiation_solver/radiation_init.f90 | 20 ++++++- .../radiation_solver/radiation_main.f90 | 11 +++- .../radiation_solver/radiation_molecules.f90 | 5 +- .../radiation_solver/radiation_vars.f90 | 4 ++ .../radiative_transfer/radtrans_init.f90 | 29 ++++++++- .../radiative_transfer/radtrans_output.f90 | 49 ++++++++++----- .../radiative_transfer/radtrans_vars.f90 | 3 + .../tracking/radtrans_tools.f90 | 24 ++++---- 10 files changed, 173 insertions(+), 36 deletions(-) diff --git a/src/mpi/mpi_shared.f90 b/src/mpi/mpi_shared.f90 index d9bdafd9f..84a248743 100644 --- a/src/mpi/mpi_shared.f90 +++ b/src/mpi/mpi_shared.f90 @@ -55,6 +55,8 @@ MODULE MOD_MPI_Shared MODULE PROCEDURE Allocate_Shared_Real_4 MODULE PROCEDURE Allocate_Shared_Real_5 MODULE PROCEDURE Allocate_Shared_Real_6 + MODULE PROCEDURE Allocate_Shared_REAL_nValKIND + MODULE PROCEDURE Allocate_Shared_INTEGER_nValKIND_DataPointKIND2 END INTERFACE PUBLIC::DefineParametersMPIShared @@ -79,7 +81,7 @@ MODULE MOD_MPI_Shared MODULE PROCEDURE MPI_SIZE END INTERFACE -PUBLIC::UNLOCK_AND_FREE_DUMMY, Allocate_Shared_Test +PUBLIC::UNLOCK_AND_FREE_DUMMY PUBLIC::BARRIER_AND_SYNC PUBLIC::MPI_SIZE !================================================================================================================================== @@ -644,7 +646,7 @@ SUBROUTINE Allocate_Shared_Real_1(nVal,SM_WIN,DataPointer& END SUBROUTINE ALLOCATE_SHARED_REAL_1 -SUBROUTINE Allocate_Shared_Test(nVal,SM_WIN,DataPointer& +SUBROUTINE Allocate_Shared_REAL_nValKIND(nVal,SM_WIN,DataPointer& #ifdef DEBUG_MEMORY ,SM_WIN_NAME& #endif /*DEBUG_MEMORY*/ @@ -693,7 +695,58 @@ SUBROUTINE Allocate_Shared_Test(nVal,SM_WIN,DataPointer& ! SM_PTR can now be associated with a Fortran pointer and thus used to access the shared data CALL C_F_POINTER(SM_PTR, DataPointer,nVal) -END SUBROUTINE Allocate_Shared_Test +END SUBROUTINE Allocate_Shared_REAL_nValKIND + +SUBROUTINE Allocate_Shared_INTEGER_nValKIND_DataPointKIND2(nVal,SM_WIN,DataPointer& +#ifdef DEBUG_MEMORY + ,SM_WIN_NAME& +#endif /*DEBUG_MEMORY*/ +) +! MODULES +USE,INTRINSIC :: ISO_C_BINDING +USE MOD_Globals +USE MOD_MPI_Vars +USE MOD_MPI_Shared_Vars +IMPLICIT NONE +!---------------------------------------------------------------------------------------------------------------------------------- +! INPUT/OUTPUT VARIABLES +INTEGER(KIND=IK),INTENT(IN) :: nVal(1) !> Local number of variables in each rank +INTEGER,INTENT(OUT) :: SM_WIN !> Shared memory window +INTEGER(KIND=2),INTENT(OUT),POINTER :: DataPointer(:) !> Pointer to the RMA window +#ifdef DEBUG_MEMORY +CHARACTER(LEN=*),INTENT(IN) :: SM_WIN_NAME !> Shared memory window name +#endif /*DEBUG_MEMORY*/ +!---------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +TYPE(C_PTR) :: SM_PTR !> Base pointer, translated to DataPointer later +INTEGER :: DISP_UNIT !> Displacement unit +INTEGER(KIND=MPI_ADDRESS_KIND) :: WIN_SIZE !> Size of the allocated memory window on current proc +!================================================================================================================================== +! Only node MPI root actually allocates the memory, all other nodes allocate memory with zero length but use the same displacement +WIN_SIZE = MERGE(MPI_SIZE(PRODUCT(INT(nVal,KIND=8)),KIND(DataPointer)),INT(0,MPI_ADDRESS_KIND),myComputeNodeRank.EQ.0) +DISP_UNIT = 1 + +#ifdef DEBUG_MEMORY +LWRITE(UNIT_stdOut,'(A,I7,A65,I20)') "myrank=",myrank," Allocated "//TRIM(SM_WIN_NAME)//" with WIN_SIZE = ",WIN_SIZE +#endif /*DEBUG_MEMORY*/ + +IF (ASSOCIATED(DataPointer)) CALL abort(& +__STAMP__& +,'ERROR: Datapointer (Real1) already associated') + +! Allocate MPI-3 remote memory access (RMA) type memory window +CALL MPI_WIN_ALLOCATE_SHARED(WIN_SIZE, DISP_UNIT, MPI_INFO_SHARED_LOOSE, MPI_COMM_SHARED, SM_PTR, SM_WIN,IERROR) + + +! Node MPI root already knows the location in virtual memory, all other find it here +IF (myComputeNodeRank.NE.0) THEN + CALL MPI_WIN_SHARED_QUERY(SM_WIN, 0, WIN_SIZE, DISP_UNIT, SM_PTR,IERROR) +END IF + +! SM_PTR can now be associated with a Fortran pointer and thus used to access the shared data +CALL C_F_POINTER(SM_PTR, DataPointer,nVal) + +END SUBROUTINE Allocate_Shared_INTEGER_nValKIND_DataPointKIND2 !================================================================================================================================== !> Allocate data with MPI-3 shared memory option diff --git a/src/radiation/radiation_solver/radiation_atoms.f90 b/src/radiation/radiation_solver/radiation_atoms.f90 index d46a6cd5a..1a890f5cb 100644 --- a/src/radiation/radiation_solver/radiation_atoms.f90 +++ b/src/radiation/radiation_solver/radiation_atoms.f90 @@ -45,7 +45,7 @@ SUBROUTINE radiation_atoms(iElem, em_atom) USE MOD_Globals_Vars, ONLY : BoltzmannConst, PlanckConst, ElementaryCharge USE MOD_Radiation_Vars, ONLY : RadiationInput, RadiationParameter, SpeciesRadiation, & Radiation_Emission_spec, Radiation_Absorption_spec, & - NumDensElectrons, Radiation_ElemEnergy_Species + NumDensElectrons, Radiation_ElemEnergy_Species, Radiation_Absorption_SpeciesWave USE MOD_Particle_Vars, ONLY : nSpecies, Species USE MOD_Globals_Vars, ONLY : c, Pi USE MOD_DSMC_Vars, ONLY : SpecDSMC @@ -263,8 +263,11 @@ SUBROUTINE radiation_atoms(iElem, em_atom) TempOut_Em = 0.0 TempOut_Abs = 0.0 DO iWave=1, RadiationParameter%WaveLenDiscr + iWaveCoarse = INT((iWave-1)/RadiationParameter%WaveLenReductionFactor) + 1 + IF (iWaveCoarse.GT.RadiationParameter%WaveLenDiscrCoarse) iWaveCoarse = RadiationParameter%WaveLenDiscrCoarse TempOut_Em = TempOut_Em + 4.*Pi*epsilon_iSpec(iWave)*RadiationParameter%WaveLenIncr TempOut_Abs = TempOut_Abs + abs_iSpec(iWave)*RadiationParameter%WaveLenIncr + Radiation_Absorption_SpeciesWave(iWaveCoarse, iSpec) = Radiation_Absorption_SpeciesWave(iWaveCoarse, iSpec) + abs_iSpec(iWave)*RadiationParameter%WaveLenIncr END DO Radiation_ElemEnergy_Species(iSpec,iElem,1) = TempOut_Em Radiation_ElemEnergy_Species(iSpec,iElem,2) = TempOut_Abs diff --git a/src/radiation/radiation_solver/radiation_init.f90 b/src/radiation/radiation_solver/radiation_init.f90 index 5063c5691..4213b1292 100644 --- a/src/radiation/radiation_solver/radiation_init.f90 +++ b/src/radiation/radiation_solver/radiation_init.f90 @@ -234,21 +234,27 @@ SUBROUTINE InitRadiation() ! allocate shared array for Radiation_Emission/Absorption_Spec CALL Allocate_Shared((/RadiationParameter%WaveLenDiscrCoarse,nComputeNodeElems/), Radiation_Emission_Spec_Shared_Win,Radiation_Emission_Spec_Shared) CALL MPI_WIN_LOCK_ALL(0,Radiation_Emission_Spec_Shared_Win,IERROR) -CALL Allocate_Shared_Test((/INT(RadiationParameter%WaveLenDiscrCoarse,IK)*INT(nGlobalElems,IK)/),Radiation_Absorption_Spec_Shared_Win,Radiation_Absorption_Spec_Shared) +CALL Allocate_Shared((/INT(RadiationParameter%WaveLenDiscrCoarse,IK)*INT(nGlobalElems,IK)/),Radiation_Absorption_Spec_Shared_Win,Radiation_Absorption_Spec_Shared) CALL MPI_WIN_LOCK_ALL(0,Radiation_Absorption_Spec_Shared_Win,IERROR) +CALL Allocate_Shared((/INT(RadiationParameter%WaveLenDiscrCoarse,IK)*INT(nGlobalElems,IK)*INT(nSpecies,IK)/),Radiation_Absorption_SpecPercent_Shared_Win,Radiation_Absorption_SpecPercent_Shared) +CALL MPI_WIN_LOCK_ALL(0,Radiation_Absorption_SpecPercent_Shared_Win,IERROR) CALL Allocate_Shared((/nSpecies,nComputeNodeElems,2/), Radiation_ElemEnergy_Species_Shared_Win,Radiation_ElemEnergy_Species_Shared) CALL MPI_WIN_LOCK_ALL(0,Radiation_ElemEnergy_Species_Shared_Win,IERROR) Radiation_Emission_spec => Radiation_Emission_spec_Shared Radiation_Absorption_spec(1:RadiationParameter%WaveLenDiscrCoarse ,1:nGlobalElems) => Radiation_Absorption_spec_Shared +Radiation_Absorption_SpecPercent(1:RadiationParameter%WaveLenDiscrCoarse ,1:nSpecies, 1:nGlobalElems) => Radiation_Absorption_SpecPercent_Shared Radiation_ElemEnergy_Species => Radiation_ElemEnergy_Species_Shared #else ! allocate local array for ElemInfo ALLOCATE(Radiation_Emission_spec(RadiationParameter%WaveLenDiscrCoarse,nElems)) ALLOCATE(Radiation_Absorption_spec(RadiationParameter%WaveLenDiscrCoarse,nElems)) +ALLOCATE(Radiation_Absorption_SpecPercent_Shared(RadiationParameter%WaveLenDiscrCoarse,nSpecies,nElems)) ALLOCATE(Radiation_ElemEnergy_Species(nSpecies,nElems,2)) #endif /*USE_MPI*/ +ALLOCATE(Radiation_Absorption_SpeciesWave(RadiationParameter%WaveLenDiscrCoarse,nSpecies)) + #if USE_MPI firstElem = INT(REAL( myComputeNodeRank *nComputeNodeElems)/REAL(nComputeNodeProcessors))+1 lastElem = INT(REAL((myComputeNodeRank+1)*nComputeNodeElems)/REAL(nComputeNodeProcessors)) @@ -260,12 +266,14 @@ SUBROUTINE InitRadiation() DO iElem = firstElem, lastElem Radiation_Emission_spec(:,iElem) = 0.0 Radiation_Absorption_spec(:,GetGlobalElemID(iElem)) = 0.0 + Radiation_Absorption_SpecPercent(:,:,GetGlobalElemID(iElem)) = 0 Radiation_ElemEnergy_Species(:,iElem,:) =0.0 END DO #if USE_MPI CALL BARRIER_AND_SYNC(Radiation_Emission_Spec_Shared_Win ,MPI_COMM_SHARED) CALL BARRIER_AND_SYNC(Radiation_ElemEnergy_Species_Shared_Win ,MPI_COMM_SHARED) CALL BARRIER_AND_SYNC(Radiation_Absorption_Spec_Shared_Win ,MPI_COMM_SHARED) + CALL BARRIER_AND_SYNC(Radiation_Absorption_SpecPercent_Shared_Win ,MPI_COMM_SHARED) IF(nLeaderGroupProcs.GT.1)THEN IF(myComputeNodeRank.EQ.0)THEN CALL MPI_ALLGATHERV( MPI_IN_PLACE & @@ -277,9 +285,19 @@ SUBROUTINE InitRadiation() , MPI_DOUBLE_PRECISION & , MPI_COMM_LEADERS_SHARED & , IERROR) + CALL MPI_ALLGATHERV( MPI_IN_PLACE & + , 0 & + , MPI_DATATYPE_NULL & + , Radiation_Absorption_SpecPercent_Shared & + , RadiationParameter%WaveLenDiscrCoarse*nSpecies *recvcountElem & + , RadiationParameter%WaveLenDiscrCoarse*nSpecies *displsElem & + , MPI_INTEGER & + , MPI_COMM_LEADERS_SHARED & + , IERROR) END IF END IF CALL BARRIER_AND_SYNC(Radiation_Absorption_Spec_Shared_Win ,MPI_COMM_SHARED) + CALL BARRIER_AND_SYNC(Radiation_Absorption_SpecPercent_Shared_Win ,MPI_COMM_SHARED) #endif diff --git a/src/radiation/radiation_solver/radiation_main.f90 b/src/radiation/radiation_solver/radiation_main.f90 index 0f86befa2..ca5a284eb 100644 --- a/src/radiation/radiation_solver/radiation_main.f90 +++ b/src/radiation/radiation_solver/radiation_main.f90 @@ -45,6 +45,7 @@ SUBROUTINE radiation_main(iElem) USE MOD_Globals_Vars, ONLY : Pi USE MOD_Radiation_Vars, ONLY : RadiationInput, RadiationSwitches, MacroRadInputParameters, & Radiation_Emission_spec, Radiation_Absorption_spec, RadiationParameter +USE MOD_Radiation_Vars, ONLY : Radiation_Absorption_SpeciesWave ,Radiation_Absorption_SpecPercent USE MOD_Radiation_Excitation, ONLY : radiation_excitation USE MOD_Radiation_Atoms, ONLY : radiation_atoms USE MOD_Radiation_Molecules, ONLY : radiation_molecules @@ -62,9 +63,9 @@ SUBROUTINE radiation_main(iElem) ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES - INTEGER :: iSpec, w, io_error + INTEGER :: iSpec, w, io_error, iWave ! REAL :: currentWave, iRan - REAL :: em_tot, em_atom, em_mol, em_cont + REAL :: em_tot, em_atom, em_mol, em_cont, sumAbsSpecies !=================================================================================================================================== !------- initialize total emission variables @@ -72,7 +73,7 @@ SUBROUTINE radiation_main(iElem) em_mol = 0.0 em_cont = 0.0 em_tot = 0.0 - + Radiation_Absorption_SpeciesWave = 0.0 !IF ( ((iElem+offsetElem).NE.208) .AND. ((iElem+offsetElem).NE.228) .AND. ((iElem+offsetElem).NE.3492) & !.AND. ((iElem+offsetElem).NE.4743) .AND. ((iElem+offsetElem).NE.6541)) RETURN @@ -110,6 +111,10 @@ SUBROUTINE radiation_main(iElem) ! WRITE(*,*) '' ! READ* + DO iWave=1, RadiationParameter%WaveLenDiscrCoarse + sumAbsSpecies =SUM(Radiation_Absorption_SpeciesWave(iWave, :)) + Radiation_Absorption_SpecPercent(iWave,:,iElem) = NINT(Radiation_Absorption_SpeciesWave(iWave, :)/sumAbsSpecies*10000.) + END DO IF((RadiationSwitches%RadType.EQ.3) .AND. (nGlobalElems.EQ.1)) THEN OPEN(unit=20,file='Radiation_Emission_Absorption.dat',status='replace',action='write', iostat=io_error) diff --git a/src/radiation/radiation_solver/radiation_molecules.f90 b/src/radiation/radiation_solver/radiation_molecules.f90 index 47a6888b7..b33ab32fa 100644 --- a/src/radiation/radiation_solver/radiation_molecules.f90 +++ b/src/radiation/radiation_solver/radiation_molecules.f90 @@ -45,7 +45,7 @@ SUBROUTINE radiation_molecules(iElem, em_mol) USE MOD_Globals_Vars, ONLY : BoltzmannConst, PlanckConst, AtomicMassUnit, Pi, c USE MOD_Radiation_Vars, ONLY : RadiationInput, RadiationParameter, SpeciesRadiation, & Radiation_Emission_spec, Radiation_Absorption_spec, NumDensElectrons, TElectrons, & - Radiation_ElemEnergy_Species + Radiation_ElemEnergy_Species, Radiation_Absorption_SpeciesWave USE MOD_Particle_Vars, ONLY : nSpecies, Species USE MOD_DSMC_Vars, ONLY : SpecDSMC @@ -998,8 +998,11 @@ SUBROUTINE radiation_molecules(iElem, em_mol) TempOut_Em = 0.0 TempOut_Abs = 0.0 DO iWave=1, RadiationParameter%WaveLenDiscr + iWaveCoarse = INT((iWave-1)/RadiationParameter%WaveLenReductionFactor) + 1 + IF (iWaveCoarse.GT.RadiationParameter%WaveLenDiscrCoarse) iWaveCoarse = RadiationParameter%WaveLenDiscrCoarse TempOut_Em = TempOut_Em + 4.*Pi*epsilon_iSpec(iWave)*RadiationParameter%WaveLenIncr TempOut_Abs = TempOut_Abs + abs_iSpec(iWave)*RadiationParameter%WaveLenIncr + Radiation_Absorption_SpeciesWave(iWaveCoarse, iSpec) = Radiation_Absorption_SpeciesWave(iWaveCoarse, iSpec) + abs_iSpec(iWave)*RadiationParameter%WaveLenIncr END DO Radiation_ElemEnergy_Species(iSpec,iElem,1) = TempOut_Em Radiation_ElemEnergy_Species(iSpec,iElem,2) = TempOut_Abs diff --git a/src/radiation/radiation_solver/radiation_vars.f90 b/src/radiation/radiation_solver/radiation_vars.f90 index ee88d62f7..b9f38a57a 100644 --- a/src/radiation/radiation_solver/radiation_vars.f90 +++ b/src/radiation/radiation_solver/radiation_vars.f90 @@ -95,6 +95,7 @@ MODULE MOD_Radiation_Vars TYPE(tSpeciesRadiation), ALLOCATABLE :: SpeciesRadiation(:) ! (nSpec) +REAL, ALLOCATABLE :: Radiation_Absorption_SpeciesWave(:,:) !REAL, ALLOCATABLE :: Radiation_NumDens REAL, ALLOCPOINT :: Radiation_ElemEnergy_Species(:,:,:)! (number of species, number of mesh elements, 2(Emission,Absorption)) @@ -102,6 +103,7 @@ MODULE MOD_Radiation_Vars REAL,ALLOCPOINT :: Radiation_Emission_spec(:,:) ! (WaveLen(:), number of mesh elements) REAL,ALLOCPOINT :: Radiation_Absorption_spec(:,:) ! (WaveLen(:), number of mesh elements) +INTEGER(KIND = 2), ALLOCPOINT :: Radiation_Absorption_SpecPercent(:,:,:) ! 1:RadiationParameter%WaveLenDiscrCoarse ,1:nSpecies, 1:nGlobalElems, KIND=2? TODO REAL,ALLOCPOINT :: MacroRadInputParameters(:,:,:) ! DSMC Output file (iElem, iSpec, 5 (density, Tvib, Trot, Telec, Ttrans_mean)) @@ -112,6 +114,8 @@ MODULE MOD_Radiation_Vars REAL,ALLOCPOINT :: Radiation_Emission_Spec_Shared(:,:) INTEGER :: Radiation_Absorption_Spec_Shared_Win REAL,ALLOCPOINT :: Radiation_Absorption_Spec_Shared(:) +INTEGER :: Radiation_Absorption_SpecPercent_Shared_Win +INTEGER(KIND = 2),ALLOCPOINT :: Radiation_Absorption_SpecPercent_Shared(:) INTEGER :: Radiation_ElemEnergy_Species_Shared_Win REAL,ALLOCPOINT :: Radiation_ElemEnergy_Species_Shared(:,:,:) #endif diff --git a/src/radiation/radiative_transfer/radtrans_init.f90 b/src/radiation/radiative_transfer/radtrans_init.f90 index 3cc7a34af..08430dcbe 100644 --- a/src/radiation/radiative_transfer/radtrans_init.f90 +++ b/src/radiation/radiative_transfer/radtrans_init.f90 @@ -91,6 +91,7 @@ SUBROUTINE InitRadiationTransport() USE MOD_RadiationTrans_Vars, ONLY : RadTransObsVolumeFrac_Shared_Win, RadTransObsVolumeFrac_Shared USE MOD_Radiation_Vars, ONLY : Radiation_Absorption_Spec_Shared, Radiation_Absorption_Spec_Shared_Win, RadiationInput USE MOD_Radiation_Vars, ONLY : Radiation_Emission_Spec_Shared_Win, Radiation_Emission_Spec_Shared, MacroRadInputParameters +USE MOD_Radiation_Vars, ONLY : Radiation_Absorption_SpecPercent_Shared, Radiation_Absorption_SpecPercent_Shared_Win #endif ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -109,8 +110,10 @@ SUBROUTINE InitRadiationTransport() SWRITE(UNIT_StdOut,'(132("-"))') SWRITE(UNIT_stdOut,'(A)') ' INIT RADIATION TRANSPORT SOLVER ...' -ALLOCATE(RadiationElemAbsEnergy(3,1:nGlobalElems)) +ALLOCATE(RadiationElemAbsEnergy(2,1:nGlobalElems)) RadiationElemAbsEnergy=0.0 +ALLOCATE(RadiationElemAbsEnergySpec(nSpecies,1:nGlobalElems)) +RadiationElemAbsEnergySpec=0.0 RadiationDirectionModel = GETINT('Radiation-DirectionModel') RadTrans%NumPhotonsPerCell = GETINT('Radiation-NumPhotonsPerCell') @@ -163,11 +166,18 @@ SUBROUTINE InitRadiationTransport() #if USE_MPI ! allocate shared array for Radiation_Emission/Absorption_Spec -CALL Allocate_Shared((/3,nGlobalElems/),RadiationElemAbsEnergy_Shared_Win,RadiationElemAbsEnergy_Shared) +CALL Allocate_Shared((/2,nGlobalElems/),RadiationElemAbsEnergy_Shared_Win,RadiationElemAbsEnergy_Shared) CALL MPI_WIN_LOCK_ALL(0,RadiationElemAbsEnergy_Shared_Win,IERROR) IF (myComputeNodeRank.EQ.0) RadiationElemAbsEnergy_Shared = 0. CALL BARRIER_AND_SYNC(RadiationElemAbsEnergy_Shared_Win,MPI_COMM_SHARED) + + ! allocate shared array for Radiation_Emission/Absorption_Spec +CALL Allocate_Shared((/nSpecies,nGlobalElems/),RadiationElemAbsEnergySpec_Shared_Win,RadiationElemAbsEnergySpec_Shared) +CALL MPI_WIN_LOCK_ALL(0,RadiationElemAbsEnergySpec_Shared_Win,IERROR) + +IF (myComputeNodeRank.EQ.0) RadiationElemAbsEnergySpec_Shared = 0. +CALL BARRIER_AND_SYNC(RadiationElemAbsEnergySpec_Shared_Win,MPI_COMM_SHARED) CALL Allocate_Shared((/nComputeNodeElems/), RadTransPhotPerCell_Shared_Win,RadTransPhotPerCell_Shared) CALL MPI_WIN_LOCK_ALL(0,RadTransPhotPerCell_Shared_Win,IERROR) @@ -409,6 +419,21 @@ SUBROUTINE InitRadiationTransport() END IF END IF CALL BARRIER_AND_SYNC(Radiation_Absorption_Spec_Shared_Win ,MPI_COMM_SHARED) + CALL BARRIER_AND_SYNC(Radiation_Absorption_SpecPercent_Shared_Win ,MPI_COMM_SHARED) + IF(nLeaderGroupProcs.GT.1)THEN + IF(myComputeNodeRank.EQ.0)THEN + CALL MPI_ALLGATHERV( MPI_IN_PLACE & + , 0 & + , MPI_DATATYPE_NULL & + , Radiation_Absorption_SpecPercent_Shared & + , RadiationParameter%WaveLenDiscrCoarse *nSpecies*recvcountElem & + , RadiationParameter%WaveLenDiscrCoarse *nSpecies*displsElem & + , MPI_INTEGER & + , MPI_COMM_LEADERS_SHARED & + , IERROR) + END IF + END IF + CALL BARRIER_AND_SYNC(Radiation_Absorption_SpecPercent_Shared_Win ,MPI_COMM_SHARED) IF (RadObservationPointMethod.EQ.2) CALL BARRIER_AND_SYNC(RadObservationPOI_Shared_Win ,MPI_COMM_SHARED) !print*, 'AHAAAA', SUM(RadObservationPOI(7,:)) !read* diff --git a/src/radiation/radiative_transfer/radtrans_output.f90 b/src/radiation/radiative_transfer/radtrans_output.f90 index c6099623c..fbe97c381 100644 --- a/src/radiation/radiative_transfer/radtrans_output.f90 +++ b/src/radiation/radiative_transfer/radtrans_output.f90 @@ -48,7 +48,7 @@ SUBROUTINE WriteRadiationToHDF5() USE MOD_Mesh_Vars ,ONLY: offsetElem,nGlobalElems, MeshFile USE MOD_RadiationTrans_Vars ,ONLY: RadiationElemAbsEnergy_Shared, RadObservationPointMethod, RadObservation_Emission, RadObservationPoint USE MOD_RadiationTrans_Vars ,ONLY: Radiation_Emission_Spec_Total, RadTransPhotPerCell, RadObservation_EmissionPart - USE MOD_RadiationTrans_Vars ,ONLY: ObservationDoConvolution, RadObservation_Emission_Conv + USE MOD_RadiationTrans_Vars ,ONLY: ObservationDoConvolution, RadObservation_Emission_Conv, RadiationElemAbsEnergySpec_Shared USE MOD_Globals_Vars ,ONLY: ProjectName USE MOD_Particle_Mesh_Vars ,ONLY: ElemVolume_Shared USE MOD_Radiation_Vars ,ONLY: RadiationSwitches, Radiation_ElemEnergy_Species, RadiationParameter, Radiation_Absorption_Spec @@ -122,26 +122,26 @@ SUBROUTINE WriteRadiationToHDF5() DO iElem=1,PP_nElems CNElemID = GetCNElemID(iElem+offSetElem) nVarCount=0 - AbsTotal=0. - DO iSpec=1, nSpecies ! Sum over absorbtion coefficient to determine absorbed energy portion per species - AbsTotal = AbsTotal + Radiation_ElemEnergy_Species(iSpec,CNElemID,2) - END DO +! AbsTotal=0. +! DO iSpec=1, nSpecies ! Sum over absorbtion coefficient to determine absorbed energy portion per species +! AbsTotal = AbsTotal + Radiation_ElemEnergy_Species(iSpec,CNElemID,2) +! END DO DO iSpec=1, nSpecies TempOutput(nVarCount+1, iElem) = Radiation_ElemEnergy_Species(iSpec,CNElemID,1) ! TempOutput(nVarCount+2, iElem) = Radiation_ElemEnergy_Species(iSpec,iElem,2) !abs coefficient - IF (AbsTotal.GT.0) THEN - tempSpecAbs = Radiation_ElemEnergy_Species(iSpec,CNElemID,2)/AbsTotal * RadiationElemAbsEnergy_Shared(1,iElem+offSetElem)/ ElemVolume_Shared(CNElemID) - ELSE - tempSpecAbs = 0.0 - END IF - TempOutput(nVarCount+2, iElem) = MAX(tempSpecAbs,0.) !lost energy +! IF (AbsTotal.GT.0) THEN +! tempSpecAbs = Radiation_ElemEnergy_Species(iSpec,CNElemID,2)/AbsTotal * RadiationElemAbsEnergy_Shared(1,iElem+offSetElem)/ ElemVolume_Shared(CNElemID) +! ELSE +! tempSpecAbs = 0.0 +! END IF + TempOutput(nVarCount+2, iElem) = RadiationElemAbsEnergySpec_Shared(iSpec, iElem+offSetElem)/ ElemVolume_Shared(CNElemID) !MAX(tempSpecAbs,0.) !lost energy nVarCount=nVarCount+nVarSpec END DO TempOutput((nVarSpec*nSpecies+1), iElem) = Radiation_Emission_Spec_Total(CNElemID) ! SUM(Radiation_ElemEnergy_Species(:,CNElemID,1)) - TempOutput((nVarSpec*nSpecies+2), iElem) = RadiationElemAbsEnergy_Shared(1,iElem+offSetElem)/ ElemVolume_Shared(CNElemID) - TempOutput(nVarSpec*nSpecies+3, iElem) = SUM(Radiation_ElemEnergy_Species(:,CNElemID,1))- RadiationElemAbsEnergy_Shared(1,iElem+offSetElem)/ ElemVolume_Shared(CNElemID) + TempOutput((nVarSpec*nSpecies+2), iElem) = SUM(RadiationElemAbsEnergySpec_Shared(:, iElem+offSetElem))/ ElemVolume_Shared(CNElemID) + TempOutput(nVarSpec*nSpecies+3, iElem) = SUM(Radiation_ElemEnergy_Species(:,CNElemID,1))- SUM(RadiationElemAbsEnergySpec_Shared(:, iElem+offSetElem))/ ElemVolume_Shared(CNElemID) TempOutput(nVarSpec*nSpecies+4, iElem) = RadTransPhotPerCell(CNElemID) - TempOutput(nVarSpec*nSpecies+5, iElem) = RadiationElemAbsEnergy_Shared(2,iElem+offSetElem)/RadiationElemAbsEnergy_Shared(3,iElem+offSetElem) + TempOutput(nVarSpec*nSpecies+5, iElem) = RadiationElemAbsEnergy_Shared(1,iElem+offSetElem)/RadiationElemAbsEnergy_Shared(2,iElem+offSetElem) END DO ELSE IF (RadiationSwitches%RadType.EQ.2) THEN DO iElem=1, PP_nElems @@ -317,9 +317,11 @@ SUBROUTINE MPI_ExchangeRadiationInfo() USE MOD_Globals USE MOD_PreProc USE MOD_RadiationTrans_Vars, ONLY : RadiationElemAbsEnergy, RadiationElemAbsEnergy_Shared, RadiationElemAbsEnergy_Shared_Win + USE MOD_RadiationTrans_Vars, ONLY : RadiationElemAbsEnergySpec, RadiationElemAbsEnergySpec_Shared, RadiationElemAbsEnergySpec_Shared_Win USE MOD_Mesh_Vars, ONLY : nGlobalElems USE MOD_MPI_Shared_Vars USE MOD_MPI_Shared + USE MOD_Particle_Vars, ONLY: nSpecies ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -332,7 +334,7 @@ SUBROUTINE MPI_ExchangeRadiationInfo() INTEGER :: MessageSize, iELem !=================================================================================================================================== ! collect the information from the proc-local shadow arrays in the compute-node shared array -MessageSize = 3*nGlobalElems +MessageSize = 2*nGlobalElems IF (myComputeNodeRank.EQ.0) THEN CALL MPI_REDUCE(RadiationElemAbsEnergy,RadiationElemAbsEnergy_Shared,MessageSize,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_SHARED,IERROR) @@ -349,6 +351,23 @@ SUBROUTINE MPI_ExchangeRadiationInfo() CALL BARRIER_AND_SYNC(RadiationElemAbsEnergy_Shared_Win ,MPI_COMM_SHARED) END IF +MessageSize = nSpecies*nGlobalElems + +IF (myComputeNodeRank.EQ.0) THEN + CALL MPI_REDUCE(RadiationElemAbsEnergySpec,RadiationElemAbsEnergySpec_Shared,MessageSize,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_SHARED,IERROR) +ELSE + CALL MPI_REDUCE(RadiationElemAbsEnergySpec,0 ,MessageSize,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_SHARED,IERROR) +ENDIF +CALL BARRIER_AND_SYNC(RadiationElemAbsEnergySpec_Shared_Win ,MPI_COMM_SHARED) + +IF(nLeaderGroupProcs.GT.1)THEN + IF(myComputeNodeRank.EQ.0)THEN + CALL MPI_ALLREDUCE(MPI_IN_PLACE,RadiationElemAbsEnergySpec_Shared,MessageSize,MPI_DOUBLE_PRECISION,MPI_SUM,MPI_COMM_LEADERS_SHARED,iError) + END IF + + CALL BARRIER_AND_SYNC(RadiationElemAbsEnergySpec_Shared_Win ,MPI_COMM_SHARED) +END IF + END SUBROUTINE MPI_ExchangeRadiationInfo diff --git a/src/radiation/radiative_transfer/radtrans_vars.f90 b/src/radiation/radiative_transfer/radtrans_vars.f90 index d05c0c8dd..c81600988 100644 --- a/src/radiation/radiative_transfer/radtrans_vars.f90 +++ b/src/radiation/radiative_transfer/radtrans_vars.f90 @@ -74,6 +74,7 @@ MODULE MOD_RadiationTrans_Vars LOGICAL :: RadEmiAdaptPhotonNum REAL, ALLOCATABLE :: RadiationElemAbsEnergy(:,:) +REAL, ALLOCATABLE :: RadiationElemAbsEnergySpec(:,:) REAL,ALLOCPOINT :: Radiation_Emission_Spec_Total(:) REAL,ALLOCPOINT :: Radiation_Emission_Spec_Max(:) INTEGER,ALLOCPOINT :: RadTransPhotPerCell(:) ! (WaveLen(:), number of mesh elements) @@ -94,6 +95,8 @@ MODULE MOD_RadiationTrans_Vars REAL,POINTER :: PhotonSampWall_Shared(:,:) INTEGER :: RadiationElemAbsEnergy_Shared_Win REAL,POINTER :: RadiationElemAbsEnergy_Shared(:,:) +INTEGER :: RadiationElemAbsEnergySpec_Shared_Win +REAL,POINTER :: RadiationElemAbsEnergySpec_Shared(:,:) INTEGER :: RadObservationPOI_Shared_Win REAL,ALLOCPOINT :: RadObservationPOI_Shared(:,:) #endif diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tools.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tools.f90 index 9f4f95cd1..04a972dfa 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tools.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tools.f90 @@ -611,8 +611,8 @@ SUBROUTINE CalcAbsoprtionMC(IntersectionPos,Element, DONE) !--------------------------------------------------------------------------------------------------! !Based on PerfectReflection3D !--------------------------------------------------------------------------------------------------! -USE MOD_RadiationTrans_Vars, ONLY:PhotonProps,RadiationElemAbsEnergy -USE MOD_Radiation_Vars, ONLY:Radiation_Absorption_spec +USE MOD_RadiationTrans_Vars, ONLY:PhotonProps,RadiationElemAbsEnergy, RadiationElemAbsEnergySpec +USE MOD_Radiation_Vars, ONLY:Radiation_Absorption_spec, Radiation_Absorption_SpecPercent !--------------------------------------------------------------------------------------------------! IMPLICIT NONE ! !--------------------------------------------------------------------------------------------------! @@ -629,13 +629,15 @@ SUBROUTINE CalcAbsoprtionMC(IntersectionPos,Element, DONE) CALL RANDOM_NUMBER(iRan) opticalPath = Distance*Radiation_Absorption_Spec(PhotonProps%WaveLength,Element) IF (-LOG(iRan).LT.opticalPath) THEN - RadiationElemAbsEnergy(1,Element) = RadiationElemAbsEnergy(1,Element) + PhotonProps%PhotonEnergy + RadiationElemAbsEnergySpec(:,Element) = RadiationElemAbsEnergySpec(:,Element) & + + PhotonProps%PhotonEnergy*(REAL(Radiation_Absorption_SpecPercent(PhotonProps%WaveLength,:,Element))& + /SUM(REAL(Radiation_Absorption_SpecPercent(PhotonProps%WaveLength,:,Element)))) DONE = .TRUE. ELSE PhotonProps%PhotonPos(1:3) = IntersectionPos(1:3) END IF - RadiationElemAbsEnergy(2,Element) = RadiationElemAbsEnergy(2,Element) + opticalPath - RadiationElemAbsEnergy(3,Element) = RadiationElemAbsEnergy(3,Element) + 1.0 + RadiationElemAbsEnergy(1,Element) = RadiationElemAbsEnergy(1,Element) + opticalPath + RadiationElemAbsEnergy(2,Element) = RadiationElemAbsEnergy(2,Element) + 1.0 END SUBROUTINE CalcAbsoprtionMC @@ -643,8 +645,8 @@ SUBROUTINE CalcAbsoprtionAnalytic(IntersectionPos,Element, DONE) !DEC$ ATTRIBUTES FORCEINLINE :: ParticleThroughSideLastPosCheck USE MOD_Globals USE MOD_RadiationTrans_Vars, ONLY:PhotonProps, RadTrans - USE MOD_RadiationTrans_Vars, ONLY:RadiationElemAbsEnergy - USE MOD_Radiation_Vars, ONLY:Radiation_Absorption_spec + USE MOD_RadiationTrans_Vars, ONLY:RadiationElemAbsEnergy, RadiationElemAbsEnergySpec + USE MOD_Radiation_Vars, ONLY:Radiation_Absorption_spec, Radiation_Absorption_SpecPercent !--------------------------------------------------------------------------------------------------! IMPLICIT NONE ! !--------------------------------------------------------------------------------------------------! @@ -666,14 +668,16 @@ SUBROUTINE CalcAbsoprtionAnalytic(IntersectionPos,Element, DONE) LostEnergy = PhotonProps%PhotonEnergy *(1.-EXP(-opticalPath)) END IF PhotonProps%PhotonEnergy = PhotonProps%PhotonEnergy - LostEnergy - RadiationElemAbsEnergy(1,Element) = RadiationElemAbsEnergy(1,Element) + LostEnergy + RadiationElemAbsEnergySpec(:,Element) = RadiationElemAbsEnergySpec(:,Element) & + + LostEnergy*(REAL(Radiation_Absorption_SpecPercent(PhotonProps%WaveLength,:,Element))& + /SUM(REAL(Radiation_Absorption_SpecPercent(PhotonProps%WaveLength,:,Element)))) ! IF (PhotonProps%PhotonEnergy.LE.(RadTrans%GlobalRadiationPower/(1000.*RadTrans%GlobalPhotonNum))) THEN ! DONE = .TRUE. ! ELSE PhotonProps%PhotonPos(1:3) = IntersectionPos(1:3) ! END IF - RadiationElemAbsEnergy(2,Element) = RadiationElemAbsEnergy(2,Element) + opticalPath - RadiationElemAbsEnergy(3,Element) = RadiationElemAbsEnergy(3,Element) + 1.0 + RadiationElemAbsEnergy(1,Element) = RadiationElemAbsEnergy(1,Element) + opticalPath + RadiationElemAbsEnergy(2,Element) = RadiationElemAbsEnergy(2,Element) + 1.0 END SUBROUTINE CalcAbsoprtionAnalytic From 2c11f9ba7860d63a04f0417af94e719c08b64fc3 Mon Sep 17 00:00:00 2001 From: Julian Beyer Date: Wed, 16 Aug 2023 19:04:05 +0200 Subject: [PATCH 141/495] small fix --- src/radiation/radiation_solver/radiation_main.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/radiation/radiation_solver/radiation_main.f90 b/src/radiation/radiation_solver/radiation_main.f90 index ca5a284eb..132fdb2f0 100644 --- a/src/radiation/radiation_solver/radiation_main.f90 +++ b/src/radiation/radiation_solver/radiation_main.f90 @@ -112,8 +112,8 @@ SUBROUTINE radiation_main(iElem) ! READ* DO iWave=1, RadiationParameter%WaveLenDiscrCoarse - sumAbsSpecies =SUM(Radiation_Absorption_SpeciesWave(iWave, :)) - Radiation_Absorption_SpecPercent(iWave,:,iElem) = NINT(Radiation_Absorption_SpeciesWave(iWave, :)/sumAbsSpecies*10000.) + sumAbsSpecies =SUM(Radiation_Absorption_SpeciesWave(iWave, :)) + IF(sumAbsSpecies.GT.0.0) Radiation_Absorption_SpecPercent(iWave,:,iElem) = NINT(Radiation_Absorption_SpeciesWave(iWave, :)/sumAbsSpecies*10000.) END DO IF((RadiationSwitches%RadType.EQ.3) .AND. (nGlobalElems.EQ.1)) THEN From 44122a1b1e48996306acdbb0a01d3d9daef2eabb Mon Sep 17 00:00:00 2001 From: Marcel Pfeiffer Date: Thu, 17 Aug 2023 15:00:47 +0200 Subject: [PATCH 142/495] some bugs in different parts --- src/mpi/mpi_shared.f90 | 53 ++++++++++++++++ src/posti/piclas2vtk/piclas2vtk.f90 | 2 +- .../radiation_solver/radiation_atoms.f90 | 11 ++-- .../radiation_solver/radiation_init.f90 | 4 +- .../radiation_solver/radiation_main.f90 | 5 +- .../radiation_solver/radiation_molecules.f90 | 5 +- .../radiative_transfer/radtrans_output.f90 | 6 +- .../tracking/radtrans_tools.f90 | 63 ++++++++++++------- .../tracking/radtrans_tracking.f90 | 2 +- 9 files changed, 114 insertions(+), 37 deletions(-) diff --git a/src/mpi/mpi_shared.f90 b/src/mpi/mpi_shared.f90 index 84a248743..83c95c326 100644 --- a/src/mpi/mpi_shared.f90 +++ b/src/mpi/mpi_shared.f90 @@ -56,6 +56,7 @@ MODULE MOD_MPI_Shared MODULE PROCEDURE Allocate_Shared_Real_5 MODULE PROCEDURE Allocate_Shared_Real_6 MODULE PROCEDURE Allocate_Shared_REAL_nValKIND + MODULE PROCEDURE Allocate_Shared_INTEGER_nValKIND MODULE PROCEDURE Allocate_Shared_INTEGER_nValKIND_DataPointKIND2 END INTERFACE @@ -697,6 +698,58 @@ SUBROUTINE Allocate_Shared_REAL_nValKIND(nVal,SM_WIN,DataPointer& END SUBROUTINE Allocate_Shared_REAL_nValKIND + +SUBROUTINE Allocate_Shared_INTEGER_nValKIND(nVal,SM_WIN,DataPointer& +#ifdef DEBUG_MEMORY + ,SM_WIN_NAME& +#endif /*DEBUG_MEMORY*/ +) +! MODULES +USE,INTRINSIC :: ISO_C_BINDING +USE MOD_Globals +USE MOD_MPI_Vars +USE MOD_MPI_Shared_Vars +IMPLICIT NONE +!---------------------------------------------------------------------------------------------------------------------------------- +! INPUT/OUTPUT VARIABLES +INTEGER(KIND=IK),INTENT(IN) :: nVal(1) !> Local number of variables in each rank +INTEGER,INTENT(OUT) :: SM_WIN !> Shared memory window +INTEGER ,INTENT(OUT),POINTER :: DataPointer(:) !> Pointer to the RMA window +#ifdef DEBUG_MEMORY +CHARACTER(LEN=*),INTENT(IN) :: SM_WIN_NAME !> Shared memory window name +#endif /*DEBUG_MEMORY*/ +!---------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +TYPE(C_PTR) :: SM_PTR !> Base pointer, translated to DataPointer later +INTEGER :: DISP_UNIT !> Displacement unit +INTEGER(KIND=MPI_ADDRESS_KIND) :: WIN_SIZE !> Size of the allocated memory window on current proc +!================================================================================================================================== +! Only node MPI root actually allocates the memory, all other nodes allocate memory with zero length but use the same displacement +WIN_SIZE = MERGE(MPI_SIZE(PRODUCT(INT(nVal,KIND=8)),KIND(DataPointer)),INT(0,MPI_ADDRESS_KIND),myComputeNodeRank.EQ.0) +DISP_UNIT = 1 + +#ifdef DEBUG_MEMORY +LWRITE(UNIT_stdOut,'(A,I7,A65,I20)') "myrank=",myrank," Allocated "//TRIM(SM_WIN_NAME)//" with WIN_SIZE = ",WIN_SIZE +#endif /*DEBUG_MEMORY*/ + +IF (ASSOCIATED(DataPointer)) CALL abort(& +__STAMP__& +,'ERROR: Datapointer (Real1) already associated') + +! Allocate MPI-3 remote memory access (RMA) type memory window +CALL MPI_WIN_ALLOCATE_SHARED(WIN_SIZE, DISP_UNIT, MPI_INFO_SHARED_LOOSE, MPI_COMM_SHARED, SM_PTR, SM_WIN,IERROR) + + +! Node MPI root already knows the location in virtual memory, all other find it here +IF (myComputeNodeRank.NE.0) THEN + CALL MPI_WIN_SHARED_QUERY(SM_WIN, 0, WIN_SIZE, DISP_UNIT, SM_PTR,IERROR) +END IF + +! SM_PTR can now be associated with a Fortran pointer and thus used to access the shared data +CALL C_F_POINTER(SM_PTR, DataPointer,nVal) + +END SUBROUTINE Allocate_Shared_INTEGER_nValKIND + SUBROUTINE Allocate_Shared_INTEGER_nValKIND_DataPointKIND2(nVal,SM_WIN,DataPointer& #ifdef DEBUG_MEMORY ,SM_WIN_NAME& diff --git a/src/posti/piclas2vtk/piclas2vtk.f90 b/src/posti/piclas2vtk/piclas2vtk.f90 index 813b7e870..3933810e4 100644 --- a/src/posti/piclas2vtk/piclas2vtk.f90 +++ b/src/posti/piclas2vtk/piclas2vtk.f90 @@ -1008,7 +1008,7 @@ SUBROUTINE ConvertElemData(InputStateFile, ArrayName, VarName, iArgs) CALL ReadArray(TRIM(ArrayName),2,(/nVarAdd, nElems/),offsetElem,2,RealArray=ElemData(1:nVarAdd,1:nElems)) END ASSOCIATE ! Default - FileString=TRIM(TIMESTAMP(TRIM(ProjectName)//'_Solution_'//TRIM(ArrayName),OutputTime))//'.vtu' + IF(TRIM(File_Type).NE.'RadiationState') FileString=TRIM(TIMESTAMP(TRIM(ProjectName)//'_Solution_'//TRIM(ArrayName),OutputTime))//'.vtu' ! Special file types SELECT CASE(TRIM(File_Type)) CASE('DSMCState','DSMCHOState') diff --git a/src/radiation/radiation_solver/radiation_atoms.f90 b/src/radiation/radiation_solver/radiation_atoms.f90 index 1a890f5cb..4dc9b6478 100644 --- a/src/radiation/radiation_solver/radiation_atoms.f90 +++ b/src/radiation/radiation_solver/radiation_atoms.f90 @@ -103,7 +103,7 @@ SUBROUTINE radiation_atoms(iElem, em_atom) rho = rho + RadiationInput(jSpec)%NumDens * Species(jSpec)%MassIC ntot = ntot + RadiationInput(jSpec)%NumDens END DO - + ! --- calculation of constants c_emi = PlanckConst * c / (4.*Pi) c_abs = 1. / (8.*Pi*c) @@ -113,7 +113,7 @@ SUBROUTINE radiation_atoms(iElem, em_atom) DO iSpec = 1, nSpecies IF(.NOT.RadiationInput(iSpec)%DoRadiation) CYCLE IF((SpecDSMC(iSpec)%InterID .NE. 1) .AND. (SpecDSMC(iSpec)%InterID .NE. 10)) CYCLE - IF((RadiationInput(iSpec)%Telec.LT.10.0).OR.(RadiationInput(iSpec)%NumDens.LT.10.0).OR.(RadiationInput(iSpec)%Ttrans(4).LT.10.0)) CYCLE + IF((RadiationInput(iSpec)%Telec.LT.10.0).OR.(RadiationInput(iSpec)%NumDens.LT.10.0).OR.(RadiationInput(iSpec)%Ttrans(4).LT.10.0)) CYCLE ALLOCATE(lamnu(SpeciesRadiation(iSpec)%nLines)) @@ -271,7 +271,7 @@ SUBROUTINE radiation_atoms(iElem, em_atom) END DO Radiation_ElemEnergy_Species(iSpec,iElem,1) = TempOut_Em Radiation_ElemEnergy_Species(iSpec,iElem,2) = TempOut_Abs - + DEALLOCATE(lamnu) END DO @@ -304,6 +304,7 @@ SUBROUTINE Radiation_Atomic_Transition_Line_Profile(Radiation_Profile, wavelengt ! MODULES USE MOD_Globals USE MOD_Radiation_Vars, ONLY : RadiationParameter + USE MOD_Mesh_Tools, ONLY : GetGlobalElemID ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -355,8 +356,8 @@ SUBROUTINE Radiation_Atomic_Transition_Line_Profile(Radiation_Profile, wavelengt iWave = startwavelength_int+i iWaveCoarse = INT((iWave-1)/RadiationParameter%WaveLenReductionFactor) + 1 IF (iWaveCoarse.GT.RadiationParameter%WaveLenDiscrCoarse) iWaveCoarse = RadiationParameter%WaveLenDiscrCoarse - Radiation_Absorption_spec(iWaveCoarse,iElem) & - = Radiation_Absorption_spec(iWaveCoarse,iElem)+MAX(0.0,abstot)*Radiation_Profile(iWave)/RadiationParameter%WaveLenReductionFactor + Radiation_Absorption_spec(iWaveCoarse,GetGlobalElemID(iElem)) & + = Radiation_Absorption_spec(iWaveCoarse,GetGlobalElemID(iElem))+MAX(0.0,abstot)*Radiation_Profile(iWave)/RadiationParameter%WaveLenReductionFactor END DO END IF diff --git a/src/radiation/radiation_solver/radiation_init.f90 b/src/radiation/radiation_solver/radiation_init.f90 index 4213b1292..f6bbb3672 100644 --- a/src/radiation/radiation_solver/radiation_init.f90 +++ b/src/radiation/radiation_solver/radiation_init.f90 @@ -249,7 +249,7 @@ SUBROUTINE InitRadiation() ! allocate local array for ElemInfo ALLOCATE(Radiation_Emission_spec(RadiationParameter%WaveLenDiscrCoarse,nElems)) ALLOCATE(Radiation_Absorption_spec(RadiationParameter%WaveLenDiscrCoarse,nElems)) -ALLOCATE(Radiation_Absorption_SpecPercent_Shared(RadiationParameter%WaveLenDiscrCoarse,nSpecies,nElems)) +ALLOCATE(Radiation_Absorption_SpecPercent(RadiationParameter%WaveLenDiscrCoarse,nSpecies,nElems)) ALLOCATE(Radiation_ElemEnergy_Species(nSpecies,nElems,2)) #endif /*USE_MPI*/ @@ -557,10 +557,12 @@ SUBROUTINE FinalizeRadiation() CALL UNLOCK_AND_FREE(Radiation_Emission_Spec_Shared_Win) CALL UNLOCK_AND_FREE(Radiation_Absorption_Spec_Shared_Win) CALL UNLOCK_AND_FREE(Radiation_ElemEnergy_Species_Shared_Win) +CALL UNLOCK_AND_FREE(Radiation_Absorption_SpecPercent_Shared_Win) #endif /*USE_MPI*/ ADEALLOCATE(Radiation_Emission_Spec) ADEALLOCATE(Radiation_Absorption_Spec) ADEALLOCATE(Radiation_ElemEnergy_Species) +ADEALLOCATE(Radiation_Absorption_SpecPercent) END SUBROUTINE FinalizeRadiation diff --git a/src/radiation/radiation_solver/radiation_main.f90 b/src/radiation/radiation_solver/radiation_main.f90 index 132fdb2f0..f020a5e43 100644 --- a/src/radiation/radiation_solver/radiation_main.f90 +++ b/src/radiation/radiation_solver/radiation_main.f90 @@ -53,6 +53,7 @@ SUBROUTINE radiation_main(iElem) USE MOD_Radiation_InstrBroadening, ONLY : radiation_instrbroadening USE MOD_PARTICLE_Vars, ONLY : nSpecies USE MOD_Mesh_Vars, ONLY : nGlobalElems!, offsetElem +USE MOD_Mesh_Tools, ONLY : GetGlobalElemID USE MOD_Radiation_ExportSpectrum ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -97,7 +98,7 @@ SUBROUTINE radiation_main(iElem) CALL radiation_molecules(iElem, em_mol) END IF - CALL radiation_continuum(iElem, em_cont) +! CALL radiation_continuum(iElem, em_cont) em_atom = em_atom * 4. * Pi em_mol = em_mol * 4. * Pi @@ -113,7 +114,7 @@ SUBROUTINE radiation_main(iElem) ! READ* DO iWave=1, RadiationParameter%WaveLenDiscrCoarse sumAbsSpecies =SUM(Radiation_Absorption_SpeciesWave(iWave, :)) - IF(sumAbsSpecies.GT.0.0) Radiation_Absorption_SpecPercent(iWave,:,iElem) = NINT(Radiation_Absorption_SpeciesWave(iWave, :)/sumAbsSpecies*10000.) + IF(sumAbsSpecies.GT.0.0) Radiation_Absorption_SpecPercent(iWave,:,GetGlobalElemID(iElem)) = NINT(Radiation_Absorption_SpeciesWave(iWave, :)/sumAbsSpecies*10000.) END DO IF((RadiationSwitches%RadType.EQ.3) .AND. (nGlobalElems.EQ.1)) THEN diff --git a/src/radiation/radiation_solver/radiation_molecules.f90 b/src/radiation/radiation_solver/radiation_molecules.f90 index b33ab32fa..90a5d9560 100644 --- a/src/radiation/radiation_solver/radiation_molecules.f90 +++ b/src/radiation/radiation_solver/radiation_molecules.f90 @@ -1088,6 +1088,7 @@ SUBROUTINE Radiation_Molecular_Transition_Line_Profile(Radiation_Profile, nubar, ! MODULES USE MOD_Globals USE MOD_Radiation_Vars, ONLY : RadiationParameter + USE MOD_Mesh_Tools, ONLY : GetGlobalElemID ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -1140,8 +1141,8 @@ SUBROUTINE Radiation_Molecular_Transition_Line_Profile(Radiation_Profile, nubar, iWave = startwavelength_int+i iWaveCoarse = INT((iWave-1)/RadiationParameter%WaveLenReductionFactor) + 1 IF (iWaveCoarse.GT.RadiationParameter%WaveLenDiscrCoarse) iWaveCoarse = RadiationParameter%WaveLenDiscrCoarse - Radiation_Absorption_spec(iWaveCoarse,iElem) & - = Radiation_Absorption_spec(iWaveCoarse,iElem)+MAX(0.0,abstot)/1.E10*Radiation_Profile(iWave)/RadiationParameter%WaveLenReductionFactor + Radiation_Absorption_spec(iWaveCoarse,GetGlobalElemID(iElem)) & + = Radiation_Absorption_spec(iWaveCoarse,GetGlobalElemID(iElem))+MAX(0.0,abstot)/1.E10*Radiation_Profile(iWave)/RadiationParameter%WaveLenReductionFactor END DO END IF diff --git a/src/radiation/radiative_transfer/radtrans_output.f90 b/src/radiation/radiative_transfer/radtrans_output.f90 index fbe97c381..26dc905ef 100644 --- a/src/radiation/radiative_transfer/radtrans_output.f90 +++ b/src/radiation/radiative_transfer/radtrans_output.f90 @@ -141,7 +141,11 @@ SUBROUTINE WriteRadiationToHDF5() TempOutput((nVarSpec*nSpecies+2), iElem) = SUM(RadiationElemAbsEnergySpec_Shared(:, iElem+offSetElem))/ ElemVolume_Shared(CNElemID) TempOutput(nVarSpec*nSpecies+3, iElem) = SUM(Radiation_ElemEnergy_Species(:,CNElemID,1))- SUM(RadiationElemAbsEnergySpec_Shared(:, iElem+offSetElem))/ ElemVolume_Shared(CNElemID) TempOutput(nVarSpec*nSpecies+4, iElem) = RadTransPhotPerCell(CNElemID) - TempOutput(nVarSpec*nSpecies+5, iElem) = RadiationElemAbsEnergy_Shared(1,iElem+offSetElem)/RadiationElemAbsEnergy_Shared(2,iElem+offSetElem) + IF (RadiationElemAbsEnergy_Shared(2,iElem+offSetElem).GT.0) THEN + TempOutput(nVarSpec*nSpecies+5, iElem) = RadiationElemAbsEnergy_Shared(1,iElem+offSetElem)/RadiationElemAbsEnergy_Shared(2,iElem+offSetElem) + ELSE + TempOutput(nVarSpec*nSpecies+5, iElem) = 0.0 + END IF END DO ELSE IF (RadiationSwitches%RadType.EQ.2) THEN DO iElem=1, PP_nElems diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tools.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tools.f90 index 04a972dfa..5e563f171 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tools.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tools.f90 @@ -624,16 +624,21 @@ SUBROUTINE CalcAbsoprtionMC(IntersectionPos,Element, DONE) !--------------------------------------------------------------------------------------------------! REAL :: iRan, DistanceVec(3), Distance, opticalPath !--------------------------------------------------------------------------------------------------! - DistanceVec(1:3) = PhotonProps%PhotonPos(1:3) - IntersectionPos(1:3) - Distance = SQRT(DistanceVec(1)*DistanceVec(1) + DistanceVec(2)*DistanceVec(2) + DistanceVec(3)*DistanceVec(3)) - CALL RANDOM_NUMBER(iRan) - opticalPath = Distance*Radiation_Absorption_Spec(PhotonProps%WaveLength,Element) - IF (-LOG(iRan).LT.opticalPath) THEN - RadiationElemAbsEnergySpec(:,Element) = RadiationElemAbsEnergySpec(:,Element) & - + PhotonProps%PhotonEnergy*(REAL(Radiation_Absorption_SpecPercent(PhotonProps%WaveLength,:,Element))& - /SUM(REAL(Radiation_Absorption_SpecPercent(PhotonProps%WaveLength,:,Element)))) - DONE = .TRUE. - ELSE + IF ((Radiation_Absorption_Spec(PhotonProps%WaveLength,Element).GT.0.0)& + .AND.(SUM(Radiation_Absorption_SpecPercent(PhotonProps%WaveLength,:,Element)).GT.0)) THEN + DistanceVec(1:3) = PhotonProps%PhotonPos(1:3) - IntersectionPos(1:3) + Distance = SQRT(DistanceVec(1)*DistanceVec(1) + DistanceVec(2)*DistanceVec(2) + DistanceVec(3)*DistanceVec(3)) + CALL RANDOM_NUMBER(iRan) + opticalPath = Distance*Radiation_Absorption_Spec(PhotonProps%WaveLength,Element) + IF (-LOG(iRan).LT.opticalPath) THEN + RadiationElemAbsEnergySpec(:,Element) = RadiationElemAbsEnergySpec(:,Element) & + + PhotonProps%PhotonEnergy*(REAL(Radiation_Absorption_SpecPercent(PhotonProps%WaveLength,:,Element))& + /SUM(REAL(Radiation_Absorption_SpecPercent(PhotonProps%WaveLength,:,Element)))) + DONE = .TRUE. + ELSE + PhotonProps%PhotonPos(1:3) = IntersectionPos(1:3) + END IF + ELSE PhotonProps%PhotonPos(1:3) = IntersectionPos(1:3) END IF RadiationElemAbsEnergy(1,Element) = RadiationElemAbsEnergy(1,Element) + opticalPath @@ -656,26 +661,36 @@ SUBROUTINE CalcAbsoprtionAnalytic(IntersectionPos,Element, DONE) LOGICAL, INTENT(OUT) :: DONE ! Local variable declaration ! !--------------------------------------------------------------------------------------------------! - REAL :: DistanceVec(3), Distance, LostEnergy, maz_photon_startxp, opticalPath + REAL :: DistanceVec(3), Distance, LostEnergy, opticalPath !--------------------------------------------------------------------------------------------------! - maz_photon_startxp = LOG(HUGE(maz_photon_startxp)) - DistanceVec(1:3) = PhotonProps%PhotonPos(1:3) - IntersectionPos(1:3) - Distance = SQRT(DistanceVec(1)*DistanceVec(1) + DistanceVec(2)*DistanceVec(2) + DistanceVec(3)*DistanceVec(3)) - opticalPath = Distance*Radiation_Absorption_Spec(PhotonProps%WaveLength,Element) - IF (opticalPath.GT.maz_photon_startxp) THEN - LostEnergy = PhotonProps%PhotonEnergy + IF ((Radiation_Absorption_Spec(PhotonProps%WaveLength,Element).GT.0.0)& + .AND.(SUM(Radiation_Absorption_SpecPercent(PhotonProps%WaveLength,:,Element)).GT.0)) THEN + DistanceVec(1:3) = PhotonProps%PhotonPos(1:3) - IntersectionPos(1:3) + Distance = SQRT(DistanceVec(1)*DistanceVec(1) + DistanceVec(2)*DistanceVec(2) + DistanceVec(3)*DistanceVec(3)) + opticalPath = Distance*Radiation_Absorption_Spec(PhotonProps%WaveLength,Element) + IF (CHECKEXP(opticalPath)) THEN + LostEnergy = PhotonProps%PhotonEnergy*(1.-EXP(-opticalPath)) + ELSE + LostEnergy = PhotonProps%PhotonEnergy + DONE = .TRUE. + END IF + IF (SUM(REAL(Radiation_Absorption_SpecPercent(PhotonProps%WaveLength,:,Element))).EQ.0.0) THEN + print*,'arg',Element,PhotonProps%WaveLength, Radiation_Absorption_Spec(PhotonProps%WaveLength,Element) + print*, 'percent', Radiation_Absorption_SpecPercent(PhotonProps%WaveLength,:,Element) + END IF + PhotonProps%PhotonEnergy = PhotonProps%PhotonEnergy - LostEnergy + RadiationElemAbsEnergySpec(:,Element) = RadiationElemAbsEnergySpec(:,Element) & + + LostEnergy*(REAL(Radiation_Absorption_SpecPercent(PhotonProps%WaveLength,:,Element))& + /SUM(REAL(Radiation_Absorption_SpecPercent(PhotonProps%WaveLength,:,Element)))) ELSE - LostEnergy = PhotonProps%PhotonEnergy *(1.-EXP(-opticalPath)) - END IF - PhotonProps%PhotonEnergy = PhotonProps%PhotonEnergy - LostEnergy - RadiationElemAbsEnergySpec(:,Element) = RadiationElemAbsEnergySpec(:,Element) & - + LostEnergy*(REAL(Radiation_Absorption_SpecPercent(PhotonProps%WaveLength,:,Element))& - /SUM(REAL(Radiation_Absorption_SpecPercent(PhotonProps%WaveLength,:,Element)))) + opticalPath = 0.0 + END IF ! IF (PhotonProps%PhotonEnergy.LE.(RadTrans%GlobalRadiationPower/(1000.*RadTrans%GlobalPhotonNum))) THEN ! DONE = .TRUE. ! ELSE - PhotonProps%PhotonPos(1:3) = IntersectionPos(1:3) + ! END IF + PhotonProps%PhotonPos(1:3) = IntersectionPos(1:3) RadiationElemAbsEnergy(1,Element) = RadiationElemAbsEnergy(1,Element) + opticalPath RadiationElemAbsEnergy(2,Element) = RadiationElemAbsEnergy(2,Element) + 1.0 diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 index 3cb76881a..6f24aa9a1 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 @@ -339,7 +339,7 @@ SUBROUTINE Photon2DSymTracking() INTEGER :: SideID, TempSideID, iLocSide, correctSide, LastSide INTEGER :: LocSidesTemp(1:6), GlobSideTemp(1:6) LOGICAL :: oldElemIsMortar, isMortarSideTemp(1:6), isLastSide, ThroughSide, Done -REAL :: IntersectionPos(1:6), IntersectionPosTemp(1:6,3), DistanceTemp(1:6), Distance +REAL :: IntersectionPos(1:6), IntersectionPosTemp(1:6,4), DistanceTemp(1:6), Distance !=================================================================================================================================== Done = .FALSE. ElemID = PhotonProps%ElemID From 6433e955a6d9d6f3f174ab6f25555cb34f3f569f Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Mon, 21 Aug 2023 14:12:24 +0200 Subject: [PATCH 143/495] Do not allow PETSc + INT8 as this is not implemented yet --- CMakeListsLib.txt | 5 +++++ src/CMakeLists.txt | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CMakeListsLib.txt b/CMakeListsLib.txt index 104d3be02..af47b41e8 100644 --- a/CMakeListsLib.txt +++ b/CMakeListsLib.txt @@ -623,6 +623,11 @@ IF(PICLAS_PETSC) INCLUDE_DIRECTORIES(${PETSC_INC}) LIST(APPEND linkedlibs ${PETSC_LIB}) + + # Do not allow PETSc + INT8 as this is not implemented yet + IF(PICLAS_INTKIND8) + MESSAGE(FATAL_ERROR "PETSc + INT8 is not implemented yet!.") + ENDIF() ELSE() ADD_DEFINITIONS(-DUSE_PETSC=0) ENDIF(PICLAS_PETSC) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 5a63bdd47..eda3e74e0 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -79,7 +79,7 @@ ENDIF() CMAKE_DEPENDENT_OPTION(PICLAS_LOADBALANCE "Use load balance time measurement" ON "LIBS_USE_MPI" OFF) OPTION(PICLAS_INTKIND8 "Enable particle numbers larger than 2147483647 (on most systems, huge(4-byte-integer)))" OFF) -IF (PICLAS_INTKIND8) +IF(PICLAS_INTKIND8) ADD_DEFINITIONS(-DINTKIND8) ENDIF() From 748bd6b7f04e38ddd4d2e015947941823bb21d41 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Mon, 21 Aug 2023 14:33:43 +0200 Subject: [PATCH 144/495] Abort if not all processes have surfaces for analysis because the MPI communicator requires this --- src/particles/surfacemodel/surfacemodel_analyze.f90 | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/particles/surfacemodel/surfacemodel_analyze.f90 b/src/particles/surfacemodel/surfacemodel_analyze.f90 index 24ab955c0..bb78bb4b6 100644 --- a/src/particles/surfacemodel/surfacemodel_analyze.f90 +++ b/src/particles/surfacemodel/surfacemodel_analyze.f90 @@ -182,8 +182,12 @@ SUBROUTINE AnalyzeSurface(Time) INTEGER :: iEDCBC,i,iBoundary,iPartBound2 #endif /*USE_HDG*/ !=================================================================================================================================== -IF((nComputeNodeSurfSides.EQ.0).AND.(.NOT.CalcBoundaryParticleOutput).AND.(.NOT.UseNeutralization).AND.(.NOT.CalcElectronSEE)) RETURN +IF((.NOT.CalcBoundaryParticleOutput).AND.(.NOT.UseNeutralization).AND.(.NOT.CalcElectronSEE)) RETURN IF(.NOT.DoSurfModelAnalyze) RETURN + +! Currently the MPI routines below use Part%COMM (which contains all procs) and if one process returns here a hang-up occurs +IF(nComputeNodeSurfSides.EQ.0) CALL abort(__STAMP__,'Not all processes have surfaces for analysis but the communicator requires this.') + SurfModelAnalyzeSampleTime = Time - SurfModelAnalyzeSampleTime ! Set SurfModelAnalyzeSampleTime=Time at the end of this routine OutputCounter = 2 unit_index = 636 From f3913fe578fd5d66a7088e4304545eaf7ee83e7f Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Mon, 21 Aug 2023 18:27:59 +0200 Subject: [PATCH 145/495] Updated pre-commit git hook: Do not allow executables to be committed. --- .githooks/pre-commit | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/.githooks/pre-commit b/.githooks/pre-commit index 8d4820092..1c1f56268 100755 --- a/.githooks/pre-commit +++ b/.githooks/pre-commit @@ -39,6 +39,7 @@ ERROR=0 FILEWARN=0 FILEERR=0 FILESUM=0 +EXEWARN=0 # Check if file is opened in a terminal if test -t 1; then @@ -71,7 +72,9 @@ if [ -n "$CHANGED" ]; then # Loop over all changes for file in $SORTED; do + # Check if path is a file that exists + # -f True if FILE exists and is a regular file. if [ -f "$file" ]; then # -b, --bytes equivalent to '--apparent-size --block-size=1' LINE=$(du -h "$file") @@ -110,12 +113,25 @@ if [ -n "$CHANGED" ]; then # Error header printf "${YELLOW}Total file size to be committed ($FILESUM bytes)${NC}\n" fi + + # Check if file is executable + if [ -x "$file" ]; then + # Error header + if [ "$EXEWARN" -eq 0 ]; then + printf "${RED}The following file(s) are executable, which is not allowed. Remove the execute permission via 'chmod -x filename' and try again.${NC}\n" + EXEWARN=1 + fi + LINE=$(ls -alFhs "$file") + printf "$LINE\n" + ERROR=1 + fi + done # Abort if hook encountered any error if [ "$ERROR" -ne 0 ]; then echo '------------------------------------------------------------------------------------------------------------------------------------' - echo 'Commit rejected! You can override this check by passing "GIT_OVERRIDE_LIMITS=1" to git.' + echo 'Commit rejected! You can override this check by passing "GIT_OVERRIDE_LIMITS=1" to git, e.g., run "GIT_OVERRIDE_LIMITS=1 git commit".' exit 1 fi From 5e40b73ce2f2e10e63f0f6dab00dfa995f216a9c Mon Sep 17 00:00:00 2001 From: Franziska Hild Date: Tue, 22 Aug 2023 15:35:00 +0200 Subject: [PATCH 146/495] BGK clean-up warnings (unused variables) --- src/particles/bgk/bgk_colloperator.f90 | 28 +++++++++++++------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/particles/bgk/bgk_colloperator.f90 b/src/particles/bgk/bgk_colloperator.f90 index bce073021..fb1a8cf74 100644 --- a/src/particles/bgk/bgk_colloperator.f90 +++ b/src/particles/bgk/bgk_colloperator.f90 @@ -142,8 +142,8 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume, AveragingVal CALL CalcInnerDOFs(nSpec, EVibSpec, ERotSpec, totalWeightSpec, TVibSpec, TRotSpec, InnerDOF, Xi_VibSpec, Xi_RotSpec) ! 2.) Calculation of the relaxation frequency of the distribution function towards the target distribution function -CALL CalcGasProperties(nSpec, dens, InnerDOF, totalWeightSpec, totalWeight, TotalMass, u2Spec, u0ij, u2, SpecTemp, CellTemp, & - Xi_VibSpec, Xi_RotSpec, Prandtl, relaxfreq, dynamicvis, thermalcond, MassIC_Mixture) +CALL CalcGasProperties(nSpec, dens, InnerDOF, totalWeightSpec, totalWeight, TotalMass, u2Spec, SpecTemp, CellTemp, Xi_VibSpec, & + Xi_RotSpec, Prandtl, relaxfreq, dynamicvis, thermalcond, MassIC_Mixture) IF(DSMC%CalcQualityFactors) THEN BGK_MeanRelaxFactor = BGK_MeanRelaxFactor + relaxfreq * dtCell @@ -201,7 +201,7 @@ SUBROUTINE BGK_CollisionOperator(iPartIndx_Node, nPart, NodeVolume, AveragingVal END IF END IF -CALL CalcTRelax(ERotSpec, Xi_RotSpec, Xi_VibSpec, EVibSpec, totalWeightSpec, totalWeight, totalWeight2, nPart, dtCell, CellTemp, & +CALL CalcTRelax(ERotSpec, Xi_RotSpec, Xi_VibSpec, EVibSpec, totalWeightSpec, totalWeight, totalWeight2, dtCell, CellTemp, & TRotSpec, TVibSpec, relaxfreq, rotrelaxfreqSpec, vibrelaxfreqSpec, Xi_VibSpecNew, Xi_vib_DOF, nXiVibDOF, CellTempRel, TEqui, & betaR, betaV) @@ -369,7 +369,7 @@ END SUBROUTINE BGK_CollisionOperator SUBROUTINE CalcMoments(nPart, iPartIndx_Node, nSpec, vBulkAll, totalWeight, totalWeight2, totalWeightSpec, TotalMass, u2, u2Spec, & - u0ij, u2i, OldEn, EVibSpec, ERotSpec, CellTemp, SpecTemp, dtCell) + u0ij, u2i, OldEn, EVibSpec, ERotSpec, CellTemp, SpecTemp, dtCell) !=================================================================================================================================== !> Moment calculation: Summing up the relative velocities and their squares !=================================================================================================================================== @@ -639,7 +639,7 @@ SUBROUTINE CalcInnerDOFs(nSpec, EVibSpec, ERotSpec, totalWeightSpec, TVibSpec, T END SUBROUTINE CalcInnerDOFs -SUBROUTINE CalcGasProperties(nSpec, dens, InnerDOF, totalWeightSpec, totalWeight, TotalMass, u2Spec, u0ij, u2, SpecTemp, CellTemp, & +SUBROUTINE CalcGasProperties(nSpec, dens, InnerDOF, totalWeightSpec, totalWeight, TotalMass, u2Spec, SpecTemp, CellTemp, & Xi_VibSpec, Xi_RotSpec, Prandtl, relaxfreq, dynamicvis, thermalcond, MassIC_Mixture) !=================================================================================================================================== !> Calculate the reference dynamic viscosity, Prandtl number and the resulting relaxation frequency of the distribution function @@ -655,16 +655,16 @@ SUBROUTINE CalcGasProperties(nSpec, dens, InnerDOF, totalWeightSpec, totalWeight ! INPUT VARIABLES INTEGER, INTENT(IN) :: nSpec(nSpecies) REAL, INTENT(IN) :: totalWeightSpec(nSpecies), totalWeight, TotalMass, u2Spec(nSpecies), SpecTemp(nSpecies), CellTemp -REAL, INTENT(IN) :: u0ij(3,3), u2, Xi_VibSpec(nSpecies), Xi_RotSpec(nSpecies), dens, InnerDOF +REAL, INTENT(IN) :: Xi_VibSpec(nSpecies), Xi_RotSpec(nSpecies), dens, InnerDOF !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES REAL, INTENT(OUT) :: Prandtl, relaxfreq, dynamicvis, thermalcond, MassIC_Mixture !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -INTEGER :: iSpec, jSpec, INFO +INTEGER :: iSpec, jSpec REAL :: MolarFraction(1:nSpecies), DOFFraction(1:nSpecies), MassFraction(1:nSpecies) REAL :: PrandtlCorrection, dynamicvisSpec(nSpecies), thermalcondSpec(nSpecies), Phi(nSpecies) -REAL :: TotalDOFWeight, C_P, nu, A(3,3), W(3), Theta, CellTempSpec(nSpecies+1), Work(100) +REAL :: TotalDOFWeight, C_P, CellTempSpec(nSpecies+1) !=================================================================================================================================== MassIC_Mixture = TotalMass / totalWeight IF (nSpecies.GT.1) THEN ! gas mixture @@ -775,9 +775,9 @@ SUBROUTINE CalcGasProperties(nSpec, dens, InnerDOF, totalWeightSpec, totalWeight END SUBROUTINE CalcGasProperties -SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, Xi_VibSpec, EVibSpec, totalWeightSpec, totalWeight, totalWeight2, nPart, dtCell, & - CellTemp, TRotSpec, TVibSpec, relaxfreq, rotrelaxfreqSpec, vibrelaxfreqSpec, Xi_VibSpecNew, Xi_vib_DOF, nXiVibDOF, & - CellTempRel, TEqui, betaR, betaV) +SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, Xi_VibSpec, EVibSpec, totalWeightSpec, totalWeight, totalWeight2, dtCell, CellTemp, & + TRotSpec, TVibSpec, relaxfreq, rotrelaxfreqSpec, vibrelaxfreqSpec, Xi_VibSpecNew, Xi_vib_DOF, nXiVibDOF, CellTempRel, TEqui, & + betaR, betaV) !=================================================================================================================================== !> Calculate the relaxation energies and temperatures !=================================================================================================================================== @@ -791,7 +791,7 @@ SUBROUTINE CalcTRelax(ERotSpec, Xi_RotSpec, Xi_VibSpec, EVibSpec, totalWeightSpe IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES -INTEGER, INTENT(IN) :: nPart, nXiVibDOF +INTEGER, INTENT(IN) :: nXiVibDOF REAL, INTENT(IN) :: TRotSpec(nSpecies), ERotSpec(nSpecies), Xi_RotSpec(nSpecies) REAL, INTENT(IN) :: TVibSpec(nSpecies), EVibSpec(nSpecies), Xi_VibSpec(nSpecies) REAL, INTENT(IN) :: totalWeightSpec(nSpecies), totalWeight, totalWeight2, CellTemp, dtCell @@ -1181,7 +1181,7 @@ END SUBROUTINE RelaxInnerEnergy SUBROUTINE SampleFromTargetDistr(nRelax, iPartIndx_NodeRelax, Prandtl, u2, u0ij, u2i, vBulkAll, CellTempRel, CellTemp, vBulk, & - MassIC_Mixture) + MassIC_Mixture) !=================================================================================================================================== !> Sample new particle velocities from the target distribution function, depending on the chosen model !=================================================================================================================================== @@ -1322,7 +1322,7 @@ END SUBROUTINE SampleFromTargetDistr SUBROUTINE EnergyConsVib(nPart, totalWeight, nVibRelax, VibRelaxWeightSpec, iPartIndx_NodeRelaxVib, NewEnVib, OldEn, nXiVibDOF, & - VibEnergyDOF, Xi_VibSpec, TEqui) + VibEnergyDOF, Xi_VibSpec, TEqui) !=================================================================================================================================== !> Routine to ensure energy conservation when including vibrational degrees of freedom (continuous and quantized) !=================================================================================================================================== From 27625c54c1a684f0d3ea31b21f72dc99c05e1e7d Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Tue, 22 Aug 2023 18:24:49 +0200 Subject: [PATCH 147/495] Moved the initialization of nComputeNodeSurfSides,nComputeNodeSurfTotalSides,nComputeNodeSurfOutputSides and GlobalSide2SurfSide,SurfSide2GlobalSide to a new routine InitParticleBoundarySurfSides to avoid unnecessarily allocating the sampling variables --- .../boundary/particle_boundary_init.f90 | 307 +++++++++++++++++- .../boundary/particle_boundary_sampling.f90 | 284 +--------------- .../emission/particle_emission_init.f90 | 2 + src/particles/particle_init.f90 | 16 +- 4 files changed, 326 insertions(+), 283 deletions(-) diff --git a/src/particles/boundary/particle_boundary_init.f90 b/src/particles/boundary/particle_boundary_init.f90 index a0862f783..ef0fab172 100644 --- a/src/particles/boundary/particle_boundary_init.f90 +++ b/src/particles/boundary/particle_boundary_init.f90 @@ -26,7 +26,7 @@ MODULE MOD_Particle_Boundary_Init ! Private Part --------------------------------------------------------------------------------------------------------------------- ! Public Part ---------------------------------------------------------------------------------------------------------------------- -PUBLIC :: DefineParametersParticleBoundary, InitializeVariablesPartBoundary, FinalizeParticleBoundary +PUBLIC :: DefineParametersParticleBoundary, InitializeVariablesPartBoundary, InitParticleBoundarySurfSides, FinalizeParticleBoundary PUBLIC :: InitAdaptiveWallTemp, InitRotPeriodicMapping, InitRotPeriodicInterPlaneMapping !=================================================================================================================================== @@ -564,6 +564,299 @@ SUBROUTINE InitializeVariablesPartBoundary() END SUBROUTINE InitializeVariablesPartBoundary +SUBROUTINE InitParticleBoundarySurfSides() +!=================================================================================================================================== +! Initialize the counters (nComputeNodeSurfSides,nComputeNodeSurfTotalSides,nComputeNodeSurfOutputSides) and +! mappings (GlobalSide2SurfSide,SurfSide2GlobalSide) of the particle boundary surface sides +! 1) all procs identify surfaces on the node (plus halo region) for sampling and/or boundary conditions +! 2) the compute-node leaders communicate the number of surfaces +!=================================================================================================================================== +! MODULES ! +!----------------------------------------------------------------------------------------------------------------------------------! +USE MOD_Globals +USE MOD_Particle_Mesh_Vars ,ONLY: SideInfo_Shared +USE MOD_Particle_Boundary_Vars ,ONLY: PartBound +USE MOD_Particle_Boundary_Vars ,ONLY: nComputeNodeSurfSides,nComputeNodeSurfTotalSides,nComputeNodeSurfOutputSides +USE MOD_Particle_Boundary_Vars ,ONLY: GlobalSide2SurfSide,SurfSide2GlobalSide +#if USE_MPI +USE MOD_Particle_Mesh_Vars ,ONLY: ElemInfo_Shared +USE MOD_MPI_Shared +USE MOD_MPI_Shared_Vars ,ONLY: MPI_COMM_SHARED +USE MOD_MPI_Shared_Vars ,ONLY: myComputeNodeRank,nComputeNodeProcessors +USE MOD_Particle_Mesh_Vars ,ONLY: nNonUniqueGlobalSides +!USE MOD_Particle_Mesh_Vars ,ONLY: offsetComputeNodeElem,nComputeNodeElems +USE MOD_MPI_Shared_Vars ,ONLY: myLeaderGroupRank,nLeaderGroupProcs +USE MOD_Particle_Boundary_Vars ,ONLY: GlobalSide2SurfSide_Shared,GlobalSide2SurfSide_Shared_Win +USE MOD_Particle_Boundary_Vars ,ONLY: SurfSide2GlobalSide_Shared,SurfSide2GlobalSide_Shared_Win +USE MOD_Particle_Boundary_Vars ,ONLY: nComputeNodeInnerBCs +#else +USE MOD_Particle_Mesh_Vars ,ONLY: nComputeNodeSides +#endif /*USE_MPI*/ +#if USE_LOADBALANCE +USE MOD_LoadBalance_Vars ,ONLY: PerformLoadBalance +#endif /*USE_LOADBALANCE*/ +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------! +! INPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------! +! OUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +INTEGER :: iSide,firstSide,lastSide,iSurfSide,GlobalSideID +INTEGER :: nSurfSidesProc +INTEGER :: offsetSurfTotalSidesProc +INTEGER,ALLOCATABLE :: GlobalSide2SurfSideProc(:,:) +#if USE_MPI +INTEGER :: offsetSurfSidesProc +INTEGER :: GlobalElemID,GlobalElemRank +INTEGER :: sendbuf,recvbuf +INTEGER :: NbGlobalElemID, NbElemRank, NbLeaderID, nSurfSidesTmp +#endif /*USE_MPI*/ +INTEGER :: NbGlobalSideID +!=================================================================================================================================== + +LBWRITE(UNIT_stdOut,'(A)') ' INIT SURFACE SIDES ...' + +! Allocate shared array for surf sides +#if USE_MPI +CALL Allocate_Shared((/3,nNonUniqueGlobalSides/),GlobalSide2SurfSide_Shared_Win,GlobalSide2SurfSide_Shared) +CALL MPI_WIN_LOCK_ALL(0,GlobalSide2SurfSide_Shared_Win,IERROR) +GlobalSide2SurfSide => GlobalSide2SurfSide_Shared +#else +ALLOCATE(GlobalSide2SurfSide(1:3,1:nComputeNodeSides)) +#endif /*USE_MPI*/ + +! only CN root nullifies +#if USE_MPI +IF (myComputeNodeRank.EQ.0) THEN +#endif /* USE_MPI*/ + GlobalSide2SurfSide = -1. +#if USE_MPI +END IF + +CALL BARRIER_AND_SYNC(GlobalSide2SurfSide_Shared_Win,MPI_COMM_SHARED) +#endif /* USE_MPI*/ + +! get number of BC-Sides +#if USE_MPI +! NO HALO REGION REDUCTION +firstSide = INT(REAL( myComputeNodeRank )*REAL(nNonUniqueGlobalSides)/REAL(nComputeNodeProcessors))+1 +lastSide = INT(REAL((myComputeNodeRank+1))*REAL(nNonUniqueGlobalSides)/REAL(nComputeNodeProcessors)) +ALLOCATE(GlobalSide2SurfSideProc(1:3,firstSide:lastSide)) +#else +firstSide = 1 +lastSide = nComputeNodeSides +ALLOCATE(GlobalSide2SurfSideProc(1:3,1:nComputeNodeSides)) +#endif /*USE_MPI*/ + +GlobalSide2SurfSideProc = -1 +nComputeNodeSurfSides = 0 +nSurfSidesProc = 0 + +! check every BC side +DO iSide = firstSide,lastSide + ! ignore non-BC sides + IF (SideInfo_Shared(SIDE_BCID,iSide).LE.0) CYCLE + +#if USE_MPI + ! ignore sides outside of halo region + IF (ElemInfo_Shared(ELEM_HALOFLAG,SideInfo_Shared(SIDE_ELEMID,iSide)).EQ.0) CYCLE +#endif /*USE_MPI*/ + + ! count number of reflective and rotationally periodic BC sides + IF ((PartBound%TargetBoundCond(PartBound%MapToPartBC(SideInfo_Shared(SIDE_BCID,iSide))).EQ.PartBound%ReflectiveBC) .OR. & + (PartBound%TargetBoundCond(PartBound%MapToPartBC(SideInfo_Shared(SIDE_BCID,iSide))).EQ.PartBound%RotPeriodicBC).OR. & + (PartBound%TargetBoundCond(PartBound%MapToPartBC(SideInfo_Shared(SIDE_BCID,iSide))).EQ.PartBound%RotPeriodicInterPlaneBC))THEN + nSurfSidesProc = nSurfSidesProc + 1 + ! check if element for this side is on the current compute-node + ! IF ((SideInfo_Shared(SIDE_ID,iSide).GT.ElemInfo_Shared(ELEM_FIRSTSIDEIND,offsetComputeNodeElem+1)) .AND. & + ! (SideInfo_Shared(SIDE_ID,iSide).LE.ElemInfo_Shared(ELEM_LASTSIDEIND ,offsetComputeNodeElem+nComputeNodeElems))) THEN +! IF ((iSide.GE.(ElemInfo_Shared(ELEM_FIRSTSIDEIND,offsetComputeNodeElem+1)+1)) .AND. & +! (iSide.LE.ElemInfo_Shared(ELEM_LASTSIDEIND ,offsetComputeNodeElem+nComputeNodeElems))) THEN +! nComputeNodeSurfSides = nComputeNodeSurfSides + 1 +! END IF + + ! TODO: Add another check to determine the surface side in halo_eps from current proc. Node-wide halo can become quite large with + ! with 128 procs! + + ! Write local mapping from Side to Surf side. The rank is already correct, the offset must be corrected by the proc offset later + GlobalSide2SurfSideProc(SURF_SIDEID,iSide) = nSurfSidesProc +#if USE_MPI + GlobalSide2SurfSideProc(SURF_RANK ,iSide) = ElemInfo_Shared(ELEM_RANK,SideInfo_Shared(SIDE_ELEMID,iSide)) + ! get global Elem ID + GlobalElemID = SideInfo_Shared(SIDE_ELEMID,iSide) + GlobalElemRank = ElemInfo_Shared(ELEM_RANK,GlobalElemID) + ! running on one node, everything belongs to us + IF (nLeaderGroupProcs.EQ.1) THEN + GlobalSide2SurfSideProc(SURF_LEADER,iSide) = myLeaderGroupRank + ELSE + ! find the compute node + GlobalSide2SurfSideProc(SURF_LEADER,iSide) = INT(GlobalElemRank/nComputeNodeProcessors) + END IF +#else + GlobalSide2SurfSideProc(SURF_RANK ,iSide) = 0 + GlobalSide2SurfSideProc(SURF_LEADER,iSide) = GlobalSide2SurfSideProc(SURF_RANK,iSide) +#endif /*USE_MPI*/ + +#if USE_MPI + ! check if element for this side is on the current compute-node. Alternative version to the check above + IF (GlobalSide2SurfSideProc(SURF_LEADER,iSide).EQ.myLeaderGroupRank) THEN +#endif /*USE_MPI*/ + nComputeNodeSurfSides = nComputeNodeSurfSides + 1 +#if USE_MPI + END IF +#endif /*USE_MPI*/ + END IF ! reflective side +END DO + +! Find CN global number of total surf sides and write Side to Surf Side mapping into shared array +#if USE_MPI +sendbuf = nSurfSidesProc - nComputeNodeSurfSides +recvbuf = 0 +CALL MPI_EXSCAN(sendbuf,recvbuf,1,MPI_INTEGER,MPI_SUM,MPI_COMM_SHARED,iError) +offsetSurfTotalSidesProc = recvbuf +! last proc knows CN total number of BC elems +sendbuf = offsetSurfTotalSidesProc + nSurfSidesProc - nComputeNodeSurfSides +CALL MPI_BCAST(sendbuf,1,MPI_INTEGER,nComputeNodeProcessors-1,MPI_COMM_SHARED,iError) +nComputeNodeSurfTotalSides = sendbuf + +! Find CN global number of local surf sides and write Side to Surf Side mapping into shared array +sendbuf = nComputeNodeSurfSides +recvbuf = 0 +CALL MPI_EXSCAN(sendbuf,recvbuf,1,MPI_INTEGER,MPI_SUM,MPI_COMM_SHARED,iError) +offsetSurfSidesProc = recvbuf +! last proc knows CN total number of BC elems +sendbuf = offsetSurfSidesProc + nComputeNodeSurfSides +CALL MPI_BCAST(sendbuf,1,MPI_INTEGER,nComputeNodeProcessors-1,MPI_COMM_SHARED,iError) +nComputeNodeSurfSides = sendbuf +nComputeNodeSurfTotalSides = nComputeNodeSurfTotalSides + nComputeNodeSurfSides + +! increment SURF_SIDEID by offset +nSurfSidesTmp = 0 +DO iSide = firstSide,lastSide + IF (GlobalSide2SurfSideProc(SURF_SIDEID,iSide).EQ.-1) CYCLE + + ! sort compute-node local sides first + IF (GlobalSide2SurfSideProc(SURF_LEADER,iSide).EQ.myLeaderGroupRank) THEN + nSurfSidesTmp = nSurfSidesTmp + 1 + + GlobalSide2SurfSide(: ,iSide) = GlobalSide2SurfSideProc(:,iSide) + GlobalSide2SurfSide(SURF_SIDEID,iSide) = nSurfSidesTmp + offsetSurfSidesProc + END IF +END DO + +nSurfSidesTmp = 0 +DO iSide = firstSide,lastSide + IF (GlobalSide2SurfSideProc(SURF_SIDEID,iSide).EQ.-1) CYCLE + + ! sampling sides in halo region follow at the end + IF (GlobalSide2SurfSideProc(SURF_LEADER,iSide).NE.myLeaderGroupRank) THEN + nSurfSidesTmp = nSurfSidesTmp + 1 + + GlobalSide2SurfSide(: ,iSide) = GlobalSide2SurfSideProc(:,iSide) + GlobalSide2SurfSide(SURF_SIDEID,iSide) = nSurfSidesTmp + nComputeNodeSurfSides + offsetSurfTotalSidesProc + END IF +END DO +#else +offsetSurfTotalSidesProc = 0 +nComputeNodeSurfTotalSides = nSurfSidesProc +GlobalSide2SurfSide(:,firstSide:lastSide) = GlobalSide2SurfSideProc(:,firstSide:lastSide) +#endif /*USE_MPI*/ + +! Build inverse mapping +#if USE_MPI +CALL Allocate_Shared((/3,nComputeNodeSurfTotalSides/),SurfSide2GlobalSide_Shared_Win,SurfSide2GlobalSide_Shared) +CALL MPI_WIN_LOCK_ALL(0,SurfSide2GlobalSide_Shared_Win,IERROR) +SurfSide2GlobalSide => SurfSide2GlobalSide_Shared + +DO iSide = firstSide,lastSide + IF (GlobalSide2SurfSideProc(SURF_SIDEID,iSide).EQ.-1) CYCLE + + SurfSide2GlobalSide(: ,GlobalSide2SurfSide(SURF_SIDEID,iSide)) = GlobalSide2SurfSide(:,iSide) + SurfSide2GlobalSide(SURF_SIDEID,GlobalSide2SurfSide(SURF_SIDEID,iSide)) = iSide +END DO + +CALL BARRIER_AND_SYNC(GlobalSide2SurfSide_Shared_Win,MPI_COMM_SHARED) +CALL BARRIER_AND_SYNC(SurfSide2GlobalSide_Shared_Win,MPI_COMM_SHARED) +#else +ALLOCATE(SurfSide2GlobalSide(1:1,1:nComputeNodeSurfTotalSides)) +DO iSide = firstSide,lastSide + IF (GlobalSide2SurfSide(SURF_SIDEID,iSide).EQ.-1) CYCLE + SurfSide2GlobalSide(SURF_SIDEID,GlobalSide2SurfSide(SURF_SIDEID,iSide)) =iSide +END DO +#endif /*USE_MPI*/ + +! Determine the number of surface output sides (inner BCs are not counted twice and rotationally periodic BCs excluded) +#if USE_MPI +IF (myComputeNodeRank.EQ.0) THEN + nComputeNodeInnerBCs = 0 +#endif /*USE_MPI*/ + nComputeNodeSurfOutputSides = 0 + DO iSurfSide = 1,nComputeNodeSurfSides + GlobalSideID = SurfSide2GlobalSide(SURF_SIDEID,iSurfSide) + ! Check if the surface side has a neighbor (and is therefore an inner BCs) + IF(SideInfo_Shared(SIDE_NBSIDEID,GlobalSideID).GT.0) THEN + ! Abort inner BC + Mortar! (too complex and confusing to implement) + ! This test catches large Mortar sides, i.e., SideInfo_Shared(SIDE_NBELEMID,NonUniqueGlobalSideID) gives the 2 or 4 + ! connecting small Mortar sides. It is assumed that inner BC result in being flagged as a "SurfSide" and therefore are checked + ! here. + IF(SideInfo_Shared(SIDE_LOCALID,GlobalSideID).EQ.-1)THEN + IPWRITE(UNIT_StdOut,'(I12,A,I0)') " NonUniqueGlobalSideID = ",GlobalSideID + IPWRITE(UNIT_StdOut,'(I12,A,I0)') " SideInfo_Shared(SIDE_LOCALID,NonUniqueGlobalSideID) = ",& + SideInfo_Shared(SIDE_LOCALID,GlobalSideID) + IPWRITE(UNIT_StdOut,'(I12,A,I0,A)') " SideInfo_Shared(SIDE_ELEMID,NonUniqueGlobalSideID) = ",& + SideInfo_Shared(SIDE_ELEMID,GlobalSideID)," (GlobalElemID)" + CALL abort(__STAMP__,'Inner BC + Mortar is not implemented!') + END IF + ! Only add the side with the smaller index + NbGlobalSideID = SideInfo_Shared(SIDE_NBSIDEID,GlobalSideID) + IF(GlobalSideID.GT.NbGlobalSideID)THEN +#if USE_MPI + !--- switcheroo check 1 of 2: Non-HALO sides + ! Only required for sampling on the larger NonUniqueGlobalSideID of the two sides of the inner BC + ! Count larger inner BCs as these may have to be sent to a different leader processor + NbGlobalElemID = SideInfo_Shared(SIDE_ELEMID,NbGlobalSideID) + NbElemRank = ElemInfo_Shared(ELEM_RANK,NbGlobalElemID) + NbLeaderID = INT(NbElemRank/nComputeNodeProcessors) + IF(NbLeaderID.NE.INT(myRank/nComputeNodeProcessors))THEN + nComputeNodeInnerBCs(1) = nComputeNodeInnerBCs(1) + 1 + END IF +#endif + CYCLE! Skip sides with the larger index + END IF + END IF + ! Skip rotationally periodic boundary sides for the output + IF(PartBound%TargetBoundCond(PartBound%MapToPartBC(SideInfo_Shared(SIDE_BCID,GlobalSideID))).EQ.PartBound%RotPeriodicBC) CYCLE + ! Skip intermediate planes BCs for the output + IF(PartBound%TargetBoundCond(PartBound%MapToPartBC(SideInfo_Shared(SIDE_BCID,GlobalSideID))).EQ.PartBound%RotPeriodicInterPlaneBC) CYCLE + ! Count the number of output sides + nComputeNodeSurfOutputSides = nComputeNodeSurfOutputSides + 1 + END DO +#if USE_MPI + !--- switcheroo check 2 of 2: HALO sides + ! Count number of inner BC in halo region + ! Only required for sampling on the larger NonUniqueGlobalSideID of the two sides of the inner BC + DO iSurfSide = nComputeNodeSurfSides+1, nComputeNodeSurfTotalSides + GlobalSideID = SurfSide2GlobalSide(SURF_SIDEID,iSurfSide) + ! Check if the surface side has a neighbor (and is therefore an inner BCs) + IF(SideInfo_Shared(SIDE_NBSIDEID,GlobalSideID).GT.0) THEN + ! Only add the side with the smaller index + IF(GlobalSideID.GT.SideInfo_Shared(SIDE_NBSIDEID,GlobalSideID))THEN + ! Count larger inner BCs as these may have to be sent to a different leader processor + nComputeNodeInnerBCs(2) = nComputeNodeInnerBCs(2) + 1 + END IF + END IF + END DO ! iSurfSide = nComputeNodeSurfSides+1, nComputeNodeSurfTotalSides +END IF +#endif + +! free temporary arrays +DEALLOCATE(GlobalSide2SurfSideProc) + +END SUBROUTINE InitParticleBoundarySurfSides + + SUBROUTINE InitParticleBoundaryRotPeriodic(nRotPeriodicBCs) !=================================================================================================================================== !> @@ -1757,6 +2050,18 @@ SUBROUTINE FinalizeParticleBoundary() SDEALLOCATE(PartBound%BoundaryParticleOutputHDF5) SDEALLOCATE(PartBound%RadiativeEmissivity) +! Mapping arrays are allocated even if the node does not have sampling surfaces +#if USE_MPI +CALL MPI_BARRIER(MPI_COMM_SHARED,iERROR) +CALL UNLOCK_AND_FREE(GlobalSide2SurfSide_Shared_Win) +CALL UNLOCK_AND_FREE(SurfSide2GlobalSide_Shared_Win) +CALL MPI_BARRIER(MPI_COMM_SHARED,iERROR) +ADEALLOCATE(GlobalSide2SurfSide_Shared) +ADEALLOCATE(SurfSide2GlobalSide_Shared) +#endif /*USE_MPI*/ +ADEALLOCATE(GlobalSide2SurfSide) +ADEALLOCATE(SurfSide2GlobalSide) + ! Rotational periodic boundary condition IF(PartBound%UseRotPeriodicBC)THEN #if USE_MPI diff --git a/src/particles/boundary/particle_boundary_sampling.f90 b/src/particles/boundary/particle_boundary_sampling.f90 index 6a3142239..a46d1c7ac 100644 --- a/src/particles/boundary/particle_boundary_sampling.f90 +++ b/src/particles/boundary/particle_boundary_sampling.f90 @@ -20,7 +20,6 @@ MODULE MOD_Particle_Boundary_Sampling ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE PRIVATE - !----------------------------------------------------------------------------------------------------------------------------------- INTERFACE DefineParametersParticleBoundarySampling MODULE PROCEDURE DefineParametersParticleBoundarySampling @@ -81,7 +80,7 @@ SUBROUTINE InitParticleBoundarySampling() USE MOD_Particle_Boundary_Vars ,ONLY: nComputeNodeSurfSides,nComputeNodeSurfTotalSides,nComputeNodeSurfOutputSides USE MOD_Particle_Boundary_Vars ,ONLY: nSurfBC,SurfBCName USE MOD_Particle_Boundary_Vars ,ONLY: nSurfTotalSides -USE MOD_Particle_Boundary_Vars ,ONLY: GlobalSide2SurfSide,SurfSide2GlobalSide +USE MOD_Particle_Boundary_Vars ,ONLY: SurfSide2GlobalSide USE MOD_SurfaceModel_Vars ,ONLY: nPorousBC USE MOD_Particle_Boundary_Vars ,ONLY: CalcSurfaceImpact USE MOD_Particle_Boundary_Vars ,ONLY: SurfSideArea,SurfSampSize,SurfOutputSize,SurfSpecOutputSize @@ -102,16 +101,11 @@ SUBROUTINE InitParticleBoundarySampling() USE MOD_Particle_Vars ,ONLY: Symmetry USE MOD_ReadInTools ,ONLY: GETINT,GETLOGICAL,GETINTARRAY #if USE_MPI -USE MOD_Particle_Mesh_Vars ,ONLY: ElemInfo_Shared USE MOD_MPI_Shared USE MOD_MPI_Shared_Vars ,ONLY: MPI_COMM_SHARED USE MOD_MPI_Shared_Vars ,ONLY: MPI_COMM_LEADERS_SURF,mySurfRank USE MOD_MPI_Shared_Vars ,ONLY: myComputeNodeRank,nComputeNodeProcessors -USE MOD_Particle_Mesh_Vars ,ONLY: nNonUniqueGlobalSides -!USE MOD_Particle_Mesh_Vars ,ONLY: offsetComputeNodeElem,nComputeNodeElems -USE MOD_MPI_Shared_Vars ,ONLY: myLeaderGroupRank,nLeaderGroupProcs -USE MOD_Particle_Boundary_Vars ,ONLY: GlobalSide2SurfSide_Shared,GlobalSide2SurfSide_Shared_Win -USE MOD_Particle_Boundary_Vars ,ONLY: SurfSide2GlobalSide_Shared,SurfSide2GlobalSide_Shared_Win +USE MOD_Particle_Boundary_Vars ,ONLY: SurfSide2GlobalSide_Shared USE MOD_Particle_Boundary_Vars ,ONLY: SurfSideArea_Shared,SurfSideArea_Shared_Win USE MOD_Particle_Boundary_Vars ,ONLY: SampWallState_Shared,SampWallState_Shared_Win USE MOD_Particle_Boundary_Vars ,ONLY: SampWallPumpCapacity_Shared,SampWallPumpCapacity_Shared_Win @@ -120,7 +114,6 @@ SUBROUTINE InitParticleBoundarySampling() USE MOD_Particle_Boundary_Vars ,ONLY: SampWallImpactAngle_Shared,SampWallImpactAngle_Shared_Win USE MOD_Particle_Boundary_Vars ,ONLY: SampWallImpactNumber_Shared,SampWallImpactNumber_Shared_Win USE MOD_Particle_MPI_Boundary_Sampling,ONLY: InitSurfCommunication -USE MOD_Particle_Boundary_Vars ,ONLY: nComputeNodeInnerBCs #else USE MOD_MPI_Shared_Vars ,ONLY: mySurfRank USE MOD_Particle_Mesh_Vars ,ONLY: nComputeNodeSides @@ -138,11 +131,7 @@ SUBROUTINE InitParticleBoundarySampling() !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES INTEGER :: iBC -INTEGER :: iSide,firstSide,lastSide,iSurfSide,GlobalSideID -INTEGER :: nSurfSidesProc -INTEGER :: offsetSurfTotalSidesProc -INTEGER,ALLOCATABLE :: GlobalSide2SurfSideProc(:,:) -!INTEGER,ALLOCATABLE :: SurfSide2GlobalSideProc(:,:) +INTEGER :: iSide,firstSide,lastSide CHARACTER(20) :: hilf CHARACTER(LEN=255),ALLOCATABLE :: BCName(:) ! surface area @@ -154,13 +143,6 @@ SUBROUTINE InitParticleBoundarySampling() REAL,DIMENSION(:),ALLOCATABLE :: Xi_NGeo,wGP_NGeo REAL :: XiOut(1:2),E,F,G,D,tmp1,tmpI2,tmpJ2 REAL :: xNod, zNod, yNod, Vector1(3), Vector2(3), nx, ny, nz -#if USE_MPI -INTEGER :: offsetSurfSidesProc -INTEGER :: GlobalElemID,GlobalElemRank -INTEGER :: sendbuf,recvbuf -INTEGER :: NbGlobalElemID, NbElemRank, NbLeaderID, nSurfSidesTmp -#endif /*USE_MPI*/ -INTEGER :: NbGlobalSideID !=================================================================================================================================== ! Get input parameters @@ -175,247 +157,6 @@ SUBROUTINE InitParticleBoundarySampling() ! Sampling of impact energy for each species (trans, rot, vib), impact vector (x,y,z) and angle CalcSurfaceImpact = GETLOGICAL('CalcSurfaceImpact') -! Allocate shared array for surf sides -#if USE_MPI -CALL Allocate_Shared((/3,nNonUniqueGlobalSides/),GlobalSide2SurfSide_Shared_Win,GlobalSide2SurfSide_Shared) -CALL MPI_WIN_LOCK_ALL(0,GlobalSide2SurfSide_Shared_Win,IERROR) -GlobalSide2SurfSide => GlobalSide2SurfSide_Shared -#else -ALLOCATE(GlobalSide2SurfSide(1:3,1:nComputeNodeSides)) -#endif /*USE_MPI*/ - -! only CN root nullifies -#if USE_MPI -IF (myComputeNodeRank.EQ.0) THEN -#endif /* USE_MPI*/ - GlobalSide2SurfSide = -1. -#if USE_MPI -END IF - -CALL BARRIER_AND_SYNC(GlobalSide2SurfSide_Shared_Win,MPI_COMM_SHARED) -#endif /* USE_MPI*/ - -! get number of BC-Sides -#if USE_MPI -! NO HALO REGION REDUCTION -firstSide = INT(REAL( myComputeNodeRank )*REAL(nNonUniqueGlobalSides)/REAL(nComputeNodeProcessors))+1 -lastSide = INT(REAL((myComputeNodeRank+1))*REAL(nNonUniqueGlobalSides)/REAL(nComputeNodeProcessors)) -ALLOCATE(GlobalSide2SurfSideProc(1:3,firstSide:lastSide)) - !,SurfSide2GlobalSideProc(1:3,1 :INT(nNonUniqueGlobalSides/REAL(nComputeNodeProcessors)))) -#else -firstSide = 1 -lastSide = nComputeNodeSides -ALLOCATE(GlobalSide2SurfSideProc(1:3,1:nComputeNodeSides)) - !,SurfSide2GlobalSideProc(1:3,1:nComputeNodeSides)) -#endif /*USE_MPI*/ - -GlobalSide2SurfSideProc = -1 -!SurfSide2GlobalSideProc = -1 -nComputeNodeSurfSides = 0 -nSurfSidesProc = 0 - -! check every BC side -DO iSide = firstSide,lastSide - ! ignore non-BC sides - IF (SideInfo_Shared(SIDE_BCID,iSide).LE.0) CYCLE - -#if USE_MPI - ! ignore sides outside of halo region - IF (ElemInfo_Shared(ELEM_HALOFLAG,SideInfo_Shared(SIDE_ELEMID,iSide)).EQ.0) CYCLE -#endif /*USE_MPI*/ - - ! count number of reflective and rotationally periodic BC sides - IF ((PartBound%TargetBoundCond(PartBound%MapToPartBC(SideInfo_Shared(SIDE_BCID,iSide))).EQ.PartBound%ReflectiveBC) .OR. & - (PartBound%TargetBoundCond(PartBound%MapToPartBC(SideInfo_Shared(SIDE_BCID,iSide))).EQ.PartBound%RotPeriodicBC).OR. & - (PartBound%TargetBoundCond(PartBound%MapToPartBC(SideInfo_Shared(SIDE_BCID,iSide))).EQ.PartBound%RotPeriodicInterPlaneBC))THEN - nSurfSidesProc = nSurfSidesProc + 1 - ! check if element for this side is on the current compute-node - ! IF ((SideInfo_Shared(SIDE_ID,iSide).GT.ElemInfo_Shared(ELEM_FIRSTSIDEIND,offsetComputeNodeElem+1)) .AND. & - ! (SideInfo_Shared(SIDE_ID,iSide).LE.ElemInfo_Shared(ELEM_LASTSIDEIND ,offsetComputeNodeElem+nComputeNodeElems))) THEN -! IF ((iSide.GE.(ElemInfo_Shared(ELEM_FIRSTSIDEIND,offsetComputeNodeElem+1)+1)) .AND. & -! (iSide.LE.ElemInfo_Shared(ELEM_LASTSIDEIND ,offsetComputeNodeElem+nComputeNodeElems))) THEN -! nComputeNodeSurfSides = nComputeNodeSurfSides + 1 -! END IF - - ! TODO: Add another check to determine the surface side in halo_eps from current proc. Node-wide halo can become quite large with - ! with 128 procs! - - ! Write local mapping from Side to Surf side. The rank is already correct, the offset must be corrected by the proc offset later - GlobalSide2SurfSideProc(SURF_SIDEID,iSide) = nSurfSidesProc -#if USE_MPI - GlobalSide2SurfSideProc(SURF_RANK ,iSide) = ElemInfo_Shared(ELEM_RANK,SideInfo_Shared(SIDE_ELEMID,iSide)) - ! get global Elem ID - GlobalElemID = SideInfo_Shared(SIDE_ELEMID,iSide) - GlobalElemRank = ElemInfo_Shared(ELEM_RANK,GlobalElemID) - ! running on one node, everything belongs to us - IF (nLeaderGroupProcs.EQ.1) THEN - GlobalSide2SurfSideProc(SURF_LEADER,iSide) = myLeaderGroupRank - ELSE - ! find the compute node - GlobalSide2SurfSideProc(SURF_LEADER,iSide) = INT(GlobalElemRank/nComputeNodeProcessors) - END IF -#else - GlobalSide2SurfSideProc(SURF_RANK ,iSide) = 0 - GlobalSide2SurfSideProc(SURF_LEADER,iSide) = GlobalSide2SurfSideProc(SURF_RANK,iSide) -#endif /*USE_MPI*/ - -#if USE_MPI - ! check if element for this side is on the current compute-node. Alternative version to the check above - IF (GlobalSide2SurfSideProc(SURF_LEADER,iSide).EQ.myLeaderGroupRank) THEN -#endif /*USE_MPI*/ - nComputeNodeSurfSides = nComputeNodeSurfSides + 1 -#if USE_MPI - END IF -#endif /*USE_MPI*/ - END IF ! reflective side -END DO - -! Find CN global number of total surf sides and write Side to Surf Side mapping into shared array -#if USE_MPI -sendbuf = nSurfSidesProc - nComputeNodeSurfSides -recvbuf = 0 -CALL MPI_EXSCAN(sendbuf,recvbuf,1,MPI_INTEGER,MPI_SUM,MPI_COMM_SHARED,iError) -offsetSurfTotalSidesProc = recvbuf -! last proc knows CN total number of BC elems -sendbuf = offsetSurfTotalSidesProc + nSurfSidesProc - nComputeNodeSurfSides -CALL MPI_BCAST(sendbuf,1,MPI_INTEGER,nComputeNodeProcessors-1,MPI_COMM_SHARED,iError) -nComputeNodeSurfTotalSides = sendbuf - -! Find CN global number of local surf sides and write Side to Surf Side mapping into shared array -sendbuf = nComputeNodeSurfSides -recvbuf = 0 -CALL MPI_EXSCAN(sendbuf,recvbuf,1,MPI_INTEGER,MPI_SUM,MPI_COMM_SHARED,iError) -offsetSurfSidesProc = recvbuf -! last proc knows CN total number of BC elems -sendbuf = offsetSurfSidesProc + nComputeNodeSurfSides -CALL MPI_BCAST(sendbuf,1,MPI_INTEGER,nComputeNodeProcessors-1,MPI_COMM_SHARED,iError) -nComputeNodeSurfSides = sendbuf -nComputeNodeSurfTotalSides = nComputeNodeSurfTotalSides + nComputeNodeSurfSides - -! increment SURF_SIDEID by offset -nSurfSidesTmp = 0 -DO iSide = firstSide,lastSide - IF (GlobalSide2SurfSideProc(SURF_SIDEID,iSide).EQ.-1) CYCLE - - ! sort compute-node local sides first - IF (GlobalSide2SurfSideProc(SURF_LEADER,iSide).EQ.myLeaderGroupRank) THEN - nSurfSidesTmp = nSurfSidesTmp + 1 - - GlobalSide2SurfSide(: ,iSide) = GlobalSide2SurfSideProc(:,iSide) - GlobalSide2SurfSide(SURF_SIDEID,iSide) = nSurfSidesTmp + offsetSurfSidesProc - END IF -END DO - -nSurfSidesTmp = 0 -DO iSide = firstSide,lastSide - IF (GlobalSide2SurfSideProc(SURF_SIDEID,iSide).EQ.-1) CYCLE - - ! sampling sides in halo region follow at the end - IF (GlobalSide2SurfSideProc(SURF_LEADER,iSide).NE.myLeaderGroupRank) THEN - nSurfSidesTmp = nSurfSidesTmp + 1 - - GlobalSide2SurfSide(: ,iSide) = GlobalSide2SurfSideProc(:,iSide) - GlobalSide2SurfSide(SURF_SIDEID,iSide) = nSurfSidesTmp + nComputeNodeSurfSides + offsetSurfTotalSidesProc - END IF -END DO -#else -offsetSurfTotalSidesProc = 0 -nComputeNodeSurfTotalSides = nSurfSidesProc -GlobalSide2SurfSide(:,firstSide:lastSide) = GlobalSide2SurfSideProc(:,firstSide:lastSide) -#endif /*USE_MPI*/ - -! Build inverse mapping -#if USE_MPI -CALL Allocate_Shared((/3,nComputeNodeSurfTotalSides/),SurfSide2GlobalSide_Shared_Win,SurfSide2GlobalSide_Shared) -CALL MPI_WIN_LOCK_ALL(0,SurfSide2GlobalSide_Shared_Win,IERROR) -SurfSide2GlobalSide => SurfSide2GlobalSide_Shared - -DO iSide = firstSide,lastSide - IF (GlobalSide2SurfSideProc(SURF_SIDEID,iSide).EQ.-1) CYCLE - - SurfSide2GlobalSide(: ,GlobalSide2SurfSide(SURF_SIDEID,iSide)) = GlobalSide2SurfSide(:,iSide) - SurfSide2GlobalSide(SURF_SIDEID,GlobalSide2SurfSide(SURF_SIDEID,iSide)) = iSide -END DO - -CALL BARRIER_AND_SYNC(GlobalSide2SurfSide_Shared_Win,MPI_COMM_SHARED) -CALL BARRIER_AND_SYNC(SurfSide2GlobalSide_Shared_Win,MPI_COMM_SHARED) -#else -ALLOCATE(SurfSide2GlobalSide(1:1,1:nComputeNodeSurfTotalSides)) -!SurfSide2GlobalSide = SurfSide2GlobalSideProc(:,1:nComputeNodeSurfTotalSides) -DO iSide = firstSide,lastSide - IF (GlobalSide2SurfSide(SURF_SIDEID,iSide).EQ.-1) CYCLE - SurfSide2GlobalSide(SURF_SIDEID,GlobalSide2SurfSide(SURF_SIDEID,iSide)) =iSide -END DO -#endif /*USE_MPI*/ - -! Determine the number of surface output sides (inner BCs are not counted twice and rotationally periodic BCs excluded) -#if USE_MPI -IF (myComputeNodeRank.EQ.0) THEN - nComputeNodeInnerBCs = 0 -#endif /*USE_MPI*/ - nComputeNodeSurfOutputSides = 0 - DO iSurfSide = 1,nComputeNodeSurfSides - GlobalSideID = SurfSide2GlobalSide(SURF_SIDEID,iSurfSide) - ! Check if the surface side has a neighbor (and is therefore an inner BCs) - IF(SideInfo_Shared(SIDE_NBSIDEID,GlobalSideID).GT.0) THEN - ! Abort inner BC + Mortar! (too complex and confusing to implement) - ! This test catches large Mortar sides, i.e., SideInfo_Shared(SIDE_NBELEMID,NonUniqueGlobalSideID) gives the 2 or 4 - ! connecting small Mortar sides. It is assumed that inner BC result in being flagged as a "SurfSide" and therefore are checked - ! here. - IF(SideInfo_Shared(SIDE_LOCALID,GlobalSideID).EQ.-1)THEN - IPWRITE(UNIT_StdOut,'(I12,A,I0)') " NonUniqueGlobalSideID = ",GlobalSideID - IPWRITE(UNIT_StdOut,'(I12,A,I0)') " SideInfo_Shared(SIDE_LOCALID,NonUniqueGlobalSideID) = ",& - SideInfo_Shared(SIDE_LOCALID,GlobalSideID) - IPWRITE(UNIT_StdOut,'(I12,A,I0,A)') " SideInfo_Shared(SIDE_ELEMID,NonUniqueGlobalSideID) = ",& - SideInfo_Shared(SIDE_ELEMID,GlobalSideID)," (GlobalElemID)" - CALL abort(__STAMP__,'Inner BC + Mortar is not implemented!') - END IF - ! Only add the side with the smaller index - NbGlobalSideID = SideInfo_Shared(SIDE_NBSIDEID,GlobalSideID) - IF(GlobalSideID.GT.NbGlobalSideID)THEN -#if USE_MPI - !--- switcheroo check 1 of 2: Non-HALO sides - ! Only required for sampling on the larger NonUniqueGlobalSideID of the two sides of the inner BC - ! Count larger inner BCs as these may have to be sent to a different leader processor - NbGlobalElemID = SideInfo_Shared(SIDE_ELEMID,NbGlobalSideID) - NbElemRank = ElemInfo_Shared(ELEM_RANK,NbGlobalElemID) - NbLeaderID = INT(NbElemRank/nComputeNodeProcessors) - IF(NbLeaderID.NE.INT(myRank/nComputeNodeProcessors))THEN - nComputeNodeInnerBCs(1) = nComputeNodeInnerBCs(1) + 1 - END IF -#endif - CYCLE! Skip sides with the larger index - END IF - END IF - ! Skip rotationally periodic boundary sides for the output - IF(PartBound%TargetBoundCond(PartBound%MapToPartBC(SideInfo_Shared(SIDE_BCID,GlobalSideID))).EQ.PartBound%RotPeriodicBC) CYCLE - ! Skip intermediate planes BCs for the output - IF(PartBound%TargetBoundCond(PartBound%MapToPartBC(SideInfo_Shared(SIDE_BCID,GlobalSideID))).EQ.PartBound%RotPeriodicInterPlaneBC) CYCLE - ! Count the number of output sides - nComputeNodeSurfOutputSides = nComputeNodeSurfOutputSides + 1 - END DO -#if USE_MPI - !--- switcheroo check 2 of 2: HALO sides - ! Count number of inner BC in halo region - ! Only required for sampling on the larger NonUniqueGlobalSideID of the two sides of the inner BC - DO iSurfSide = nComputeNodeSurfSides+1, nComputeNodeSurfTotalSides - GlobalSideID = SurfSide2GlobalSide(SURF_SIDEID,iSurfSide) - ! Check if the surface side has a neighbor (and is therefore an inner BCs) - IF(SideInfo_Shared(SIDE_NBSIDEID,GlobalSideID).GT.0) THEN - ! Only add the side with the smaller index - IF(GlobalSideID.GT.SideInfo_Shared(SIDE_NBSIDEID,GlobalSideID))THEN - ! Count larger inner BCs as these may have to be sent to a different leader processor - nComputeNodeInnerBCs(2) = nComputeNodeInnerBCs(2) + 1 - END IF - END IF - END DO ! iSurfSide = nComputeNodeSurfSides+1, nComputeNodeSurfTotalSides -END IF -#endif - -! free temporary arrays -DEALLOCATE(GlobalSide2SurfSideProc) -!DEALLOCATE(SurfSide2GlobalSideProc) - ! flag if there is at least one surf side on the node (sides in halo region do also count) SurfOnNode = MERGE(.TRUE.,.FALSE.,nComputeNodeSurfTotalSides.GT.0) @@ -608,6 +349,10 @@ SUBROUTINE InitParticleBoundarySampling() ! compute area of sub-faces tmp1=dXiEQ_SurfSample/2.0 !(b-a)/2 +#if USE_MPI +SurfSide2GlobalSide => SurfSide2GlobalSide_Shared +#endif + DO iSide = firstSide,LastSide ! get global SideID. This contains only nonUniqueSide, no special mortar treatment required SideID = SurfSide2GlobalSide(SURF_SIDEID,iSide) @@ -1195,18 +940,7 @@ SUBROUTINE FinalizeParticleBoundarySampling() !=================================================================================================================================== ! Return if nothing was allocated -IF (.NOT.WriteMacroSurfaceValues.AND..NOT.DSMC%CalcSurfaceVal.AND..NOT.(ANY(PartBound%Reactive)).AND..NOT.(nPorousBC.GT.0).AND..NOT.PartBound%UseRotPeriodicBC) RETURN - -! First, free every shared memory window. This requires MPI_BARRIER as per MPI3.1 specification -#if USE_MPI -! Mapping arrays are allocated even if the node does not have sampling surfaces -CALL MPI_BARRIER(MPI_COMM_SHARED,iERROR) -CALL UNLOCK_AND_FREE(GlobalSide2SurfSide_Shared_Win) -CALL UNLOCK_AND_FREE(SurfSide2GlobalSide_Shared_Win) -CALL MPI_BARRIER(MPI_COMM_SHARED,iERROR) -ADEALLOCATE(GlobalSide2SurfSide_Shared) -ADEALLOCATE(SurfSide2GlobalSide_Shared) -#endif /*USE_MPI*/ +IF (.NOT.WriteMacroSurfaceValues.AND..NOT.DSMC%CalcSurfaceVal.AND..NOT.(ANY(PartBound%Reactive))) RETURN ! Return if no sampling surfaces on node IF (.NOT.SurfOnNode) RETURN @@ -1253,8 +987,6 @@ SUBROUTINE FinalizeParticleBoundarySampling() SDEALLOCATE(SampWallImpactAngle) SDEALLOCATE(SampWallImpactNumber) ADEALLOCATE(SurfSideArea) -ADEALLOCATE(GlobalSide2SurfSide) -ADEALLOCATE(SurfSide2GlobalSide) SDEALLOCATE(MacroSurfaceVal) SDEALLOCATE(MacroSurfaceSpecVal) diff --git a/src/particles/emission/particle_emission_init.f90 b/src/particles/emission/particle_emission_init.f90 index d313c071a..c45b5ca21 100644 --- a/src/particles/emission/particle_emission_init.f90 +++ b/src/particles/emission/particle_emission_init.f90 @@ -148,6 +148,7 @@ SUBROUTINE InitializeVariablesSpeciesInits() USE MOD_LoadBalance_Vars ,ONLY: PerformLoadBalance #endif /*USE_MPI*/ USE MOD_Restart_Vars ,ONLY: DoRestart +USE MOD_Analyze_Vars ,ONLY: DoSurfModelAnalyze ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -328,6 +329,7 @@ SUBROUTINE InitializeVariablesSpeciesInits() NeutralizationSource = TRIM(GETSTR('Part-Species'//TRIM(hilf2)//'-NeutralizationSource')) NeutralizationBalance = 0 UseNeutralization = .TRUE. + DoSurfModelAnalyze = .TRUE. IF((TRIM(Species(iSpec)%Init(iInit)%SpaceIC).EQ.'3D_Liu2010_neutralization').OR.& (TRIM(Species(iSpec)%Init(iInit)%SpaceIC).EQ.'3D_Liu2010_neutralization_Szabo'))THEN Species(iSpec)%Init(iInit)%FirstQuadrantOnly = GETLOGICAL('Part-Species'//TRIM(hilf2)//'-FirstQuadrantOnly') diff --git a/src/particles/particle_init.f90 b/src/particles/particle_init.f90 index 0f93b4c62..9d0ce0df7 100644 --- a/src/particles/particle_init.f90 +++ b/src/particles/particle_init.f90 @@ -273,6 +273,7 @@ SUBROUTINE InitParticles() USE MOD_SurfaceModel_Init ,ONLY: InitSurfaceModel USE MOD_Particle_Surfaces ,ONLY: InitParticleSurfaces USE MOD_Particle_Sampling_Adapt ,ONLY: InitAdaptiveBCSampling +USE MOD_Particle_Boundary_Init ,ONLY: InitParticleBoundarySurfSides USE MOD_Particle_Boundary_Init ,ONLY: InitRotPeriodicMapping, InitAdaptiveWallTemp, InitRotPeriodicInterPlaneMapping USE MOD_DSMC_BGGas ,ONLY: BGGas_InitRegions #if USE_MPI @@ -336,16 +337,19 @@ SUBROUTINE InitParticles() DSMC_Solution = 0.0 END IF -! Initialize surface sampling / rotational periodic mapping -! (the following IF arguments have to be considered in FinalizeParticleBoundarySampling as well) -IF (WriteMacroSurfaceValues.OR.DSMC%CalcSurfaceVal.OR.(ANY(PartBound%Reactive)).OR.(nPorousBC.GT.0).OR.PartBound%UseRotPeriodicBC) THEN +! Initialize the counters (nComputeNodeSurfSides,nComputeNodeSurfTotalSides,nComputeNodeSurfOutputSides) and +! mappings (GlobalSide2SurfSide,SurfSide2GlobalSide) of the particle boundary surface sides +CALL InitParticleBoundarySurfSides() +! Initialize rotational periodic mappings (requires InitParticleBoundarySurfSides) +IF(PartBound%UseRotPeriodicBC) CALL InitRotPeriodicMapping() +IF(PartBound%UseInterPlaneBC) CALL InitRotPeriodicInterPlaneMapping() +! Initialize surface sampling (the following IF arguments have to be considered in FinalizeParticleBoundarySampling as well) +IF (WriteMacroSurfaceValues.OR.DSMC%CalcSurfaceVal.OR.(ANY(PartBound%Reactive))) THEN CALL InitParticleBoundarySampling() - IF(PartBound%UseRotPeriodicBC) CALL InitRotPeriodicMapping() - IF(PartBound%UseInterPlaneBC) CALL InitRotPeriodicInterPlaneMapping() CALL InitAdaptiveWallTemp() END IF -! Initialize porous boundary condition (requires BCdata_auxSF and SurfMesh from InitParticleBoundarySampling) +! Initialize porous boundary condition (requires BCdata_auxSF and InitParticleBoundarySurfSides) IF(nPorousBC.GT.0) CALL InitPorousBoundaryCondition() ! Allocate sampling of near adaptive boundary element values From b62c93788da18f18ab5fc86e4aaec84fe1daa730 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Wed, 23 Aug 2023 12:38:27 +0200 Subject: [PATCH 148/495] Fixes in ray tracing output and restart --- .../emission/particle_photoionization.f90 | 4 +-- .../tracking/radtrans_tracking_output.f90 | 2 +- src/radiation/ray_tracing/raytrace.f90 | 27 ++++++++++--------- src/radiation/ray_tracing/raytrace_ini.f90 | 7 ++++- src/restart/restart.f90 | 6 ++--- 5 files changed, 25 insertions(+), 21 deletions(-) diff --git a/src/particles/emission/particle_photoionization.f90 b/src/particles/emission/particle_photoionization.f90 index 63d991c7a..94d09db01 100644 --- a/src/particles/emission/particle_photoionization.f90 +++ b/src/particles/emission/particle_photoionization.f90 @@ -417,9 +417,7 @@ SUBROUTINE PhotoIonization_RayTracing_Volume() CALL abort(__STAMP__,'Raytrace Photoionization: PartID.GT.PDM%MaxParticleNumber. '//& 'Increase Part-maxParticleNumber or use more processors. PartID=',IntInfoOpt=PartID) END IF - IF (PartID.EQ.0) THEN - CALL Abort(__STAMP__,'ERROR in PhotoIonization: MaxParticleNumber should be increased!') - END IF + IF(PartID.EQ.0) CALL Abort(__STAMP__,'ERROR in PhotoIonization: MaxParticleNumber should be increased!') ! Set the position PartState(1:3,PartID) = RandomPos(1:3) ! Set the species diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 index c72686625..60cea8425 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 @@ -152,7 +152,7 @@ SUBROUTINE WritePhotonVolSampleToHDF5() ElemVolume(iElem) = ElemVolume_Shared(iCNElem) ! 2. Variable polynomial degree data - Nloc = N_DG_Ray(iElem) + Nloc = N_DG_Ray_loc(iElem) !U_N_Ray(iElem)%U(1:1,:,:,:) = RayElemPassedEnergy(1,iGlobalElem) !U_N_Ray(iElem)%U(2:2,:,:,:) = RayElemPassedEnergy(2,iGlobalElem) #if USE_MPI diff --git a/src/radiation/ray_tracing/raytrace.f90 b/src/radiation/ray_tracing/raytrace.f90 index 9a0eca6e8..a5030e466 100644 --- a/src/radiation/ray_tracing/raytrace.f90 +++ b/src/radiation/ray_tracing/raytrace.f90 @@ -225,6 +225,7 @@ SUBROUTINE RayTracing() CALL WritePhotonSurfSampleToHDF5() ! Load surface data to create local PhotonSampWall_loc array +! This currently requires .h5 access instead of internal mapping/distribution of info CALL ReadRayTracingDataFromH5(onlySurfData=.TRUE.) CALL WritePhotonVolSampleToHDF5() @@ -371,7 +372,7 @@ SUBROUTINE ReadRayTracingDataFromH5(onlySurfData) ! Associate construct for integer KIND=8 possibility ASSOCIATE (& nVarRay8 => INT(nVarRay,IK) ,& - NMax => INT(Ray%NMax,IK) ,& + NMax8 => INT(Ray%NMax,IK) ,& nGlobalElems => INT(nGlobalElems,IK) ,& PP_nElems => INT(PP_nElems,IK) ,& offsetElem => INT(offsetElem,IK) & @@ -380,21 +381,23 @@ SUBROUTINE ReadRayTracingDataFromH5(onlySurfData) !Nres8 => INT(N_Restart,IK) ,& CALL DatasetExists(File_ID,'DG_Solution',ContainerExists) IF(.NOT.ContainerExists) CALL CollectiveStop(__STAMP__,'DG_Solution container does not exist in '//TRIM(RadiationVolState)) - CALL ReadArray('DG_Solution' ,5,(/nVarRay8,NMax+1_IK,NMax+1_IK,NMax+1_IK,PP_nElems/),OffsetElem,5,RealArray=UNMax) + CALL ReadArray('DG_Solution' ,5,(/nVarRay8,NMax8+1_IK,NMax8+1_IK,NMax8+1_IK,PP_nElems/),OffsetElem,5,RealArray=UNMax) ! Map from NMax to local polynomial degree DO iElem = 1, nElems Nloc = N_DG_Ray_loc(iElem) - IF(Nloc.EQ.Ray%NMax)THEN - U_N_Ray_loc(iElem)%U(1:nVarRay,0:NMax,0:NMax,0:NMax) = UNMax(1:nVarRay,0:NMax,0:NMax,0:NMax,iElem) - ELSEIF(Nloc.GT.Ray%NMax)THEN - CALL ChangeBasis3D(nVarRay, Ray%NMax, Nloc, PREF_VDM_Ray(Ray%NMax, Nloc)%Vdm, UNMax(1:nVarRay,0:NMax,0:NMax,0:NMax,iElem), U_N_Ray_loc(iElem)%U(1:nVarRay,0:Nloc,0:Nloc,0:Nloc)) - ELSE - !transform the slave side to the same degree as the master: switch to Legendre basis - CALL ChangeBasis3D(nVarRay, Ray%NMax, Ray%NMax, N_Inter_Ray(Ray%NMax)%sVdm_Leg, UNMax(1:nVarRay,0:NMax,0:NMax,0:NMax,iElem), UNMax_loc) - ! switch back to nodal basis - CALL ChangeBasis3D(nVarRay, Nloc, Nloc, N_Inter_Ray(Nloc)%Vdm_Leg, UNMax_loc(1:nVarRay,0:Nloc,0:Nloc,0:Nloc), U_N_Ray_loc(iElem)%U(1:nVarRay,0:Nloc,0:Nloc,0:Nloc)) - END IF ! Nloc.EQ.Ray%NMax + ASSOCIATE( NMax => Ray%NMax) + IF(Nloc.EQ.NMax)THEN + U_N_Ray_loc(iElem)%U(1:nVarRay,0:NMax,0:NMax,0:NMax) = UNMax(1:nVarRay,0:NMax,0:NMax,0:NMax,iElem) + ELSEIF(Nloc.GT.NMax)THEN + CALL ChangeBasis3D(nVarRay, NMax, Nloc, PREF_VDM_Ray(NMax, Nloc)%Vdm, UNMax(1:nVarRay,0:NMax,0:NMax,0:NMax,iElem), U_N_Ray_loc(iElem)%U(1:nVarRay,0:Nloc,0:Nloc,0:Nloc)) + ELSE + !transform the slave side to the same degree as the master: switch to Legendre basis + CALL ChangeBasis3D(nVarRay, NMax, NMax, N_Inter_Ray(NMax)%sVdm_Leg, UNMax(1:nVarRay,0:NMax,0:NMax,0:NMax,iElem), UNMax_loc) + ! switch back to nodal basis + CALL ChangeBasis3D(nVarRay, Nloc, Nloc, N_Inter_Ray(Nloc)%Vdm_Leg, UNMax_loc(1:nVarRay,0:Nloc,0:Nloc,0:Nloc), U_N_Ray_loc(iElem)%U(1:nVarRay,0:Nloc,0:Nloc,0:Nloc)) + END IF ! Nloc.EQ.NMax + END ASSOCIATE ! Sanity check: Very small negative numbers might occur due to the interpolation DO iVar = 1, nVarRay diff --git a/src/radiation/ray_tracing/raytrace_ini.f90 b/src/radiation/ray_tracing/raytrace_ini.f90 index 8b4bf757d..144857fbb 100644 --- a/src/radiation/ray_tracing/raytrace_ini.f90 +++ b/src/radiation/ray_tracing/raytrace_ini.f90 @@ -548,11 +548,13 @@ SUBROUTINE FinalizeRayTracing() USE MOD_MPI_Shared USE MOD_Photon_TrackingVars #endif /*USE_MPI*/ +USE MOD_Mesh_Vars ,ONLY: nGlobalElems IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------! ! INPUT / OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES +INTEGER :: iGlobalElem !=================================================================================================================================== ! Check if ray tracing is used @@ -562,7 +564,10 @@ SUBROUTINE FinalizeRayTracing() IF(PerformRayTracing)THEN ! 1: after ray tracing is performed SDEALLOCATE(RayElemPassedEnergy) - SDEALLOCATE(U_N_Ray) ! ray tracing + DO iGlobalElem = 1, nGlobalElems + DEALLOCATE(U_N_Ray(iGlobalElem)%U) + END DO ! iGlobalElem = 1, nGlobalElems + DEALLOCATE(U_N_Ray) ! ray tracing SDEALLOCATE(PREF_VDM_Ray) ! ray tracing #if USE_MPI diff --git a/src/restart/restart.f90 b/src/restart/restart.f90 index f7629dad3..fd816f27b 100644 --- a/src/restart/restart.f90 +++ b/src/restart/restart.f90 @@ -318,8 +318,7 @@ SUBROUTINE Restart() #endif /*PP_POIS*/ #if defined(PARTICLES) USE MOD_Particle_Restart ,ONLY: ParticleRestart -!USE MOD_RayTracing ,ONLY: ReadRayTracingDataFromH5 -USE MOD_RayTracing ,ONLY: RayTracing +USE MOD_RayTracing ,ONLY: ReadRayTracingDataFromH5 #endif /*defined(PARTICLES)*/ #if USE_HDG USE MOD_Restart_Tools ,ONLY: RecomputeLambda @@ -349,8 +348,7 @@ SUBROUTINE Restart() ! Restart particle arrays CALL ParticleRestart() ! Get ray tracing volume and surface data - !CALL ReadRayTracingDataFromH5(onlySurfData=.FALSE.) - CALL RayTracing() + CALL ReadRayTracingDataFromH5(onlySurfData=.FALSE.) #endif /*PARTICLES*/ #if USE_HDG From 15a79bc43347e571f8973537ac65da25f7bea04a Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Wed, 23 Aug 2023 15:36:56 +0200 Subject: [PATCH 149/495] Changed the definition of the input power RayTracing-Power to RayTracing-PowerDensity, which now takes the power density in [W/m2] --- .../parameter.ini | 2 +- .../parameter.ini | 2 +- .../pre-piclas/parameter.ini | 2 +- .../parameter.ini | 2 +- src/radiation/ray_tracing/raytrace_ini.f90 | 13 ++++++++----- src/radiation/ray_tracing/raytrace_vars.f90 | 1 + 6 files changed, 13 insertions(+), 9 deletions(-) diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/parameter.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/parameter.ini index 071579d13..68d1bb2de 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/parameter.ini +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/parameter.ini @@ -123,7 +123,7 @@ PhotonModeBPO = 1 RayTracing-PulseDuration = 15e-9 RayTracing-WaveLength = 10e-9 -RayTracing-Power = 1.0 +RayTracing-PowerDensity = 1.0 RayTracing-RepetitionRate = 1000 RayTracing-RayDirection = (/ 0. , 0.5 , -1.0 /) diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini index be5e90433..64d75430b 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini @@ -132,7 +132,7 @@ RayTracing-VolRefineMode = 3 ! Volumetric refinement RayTracing-PulseDuration = 15e-9 RayTracing-WaveLength = 10e-9 -RayTracing-Power = 1.0 +RayTracing-PowerDensity = 1.0 RayTracing-RepetitionRate = 1000 RayTracing-RayDirection = (/ 0. , 0.0 , -1.0 /) !RayTracing-RayDirection = (/ 0. , 0.5 , -1.0 /) diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/pre-piclas/parameter.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/pre-piclas/parameter.ini index ea919e2aa..46bc9a8e5 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/pre-piclas/parameter.ini +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/pre-piclas/parameter.ini @@ -134,7 +134,7 @@ RayTracing-VolRefineMode = 3 ! Volumetric refinement RayTracing-PulseDuration = 15e-9 RayTracing-WaveLength = 10e-9 -RayTracing-Power = 1.0 +RayTracing-PowerDensity = 1.0 RayTracing-RepetitionRate = 1000 !RayTracing-RayDirection = (/ 0. , 0.0 , -1.0 /) RayTracing-RayDirection = (/ 0. , 0.5 , -1.0 /) diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/parameter.ini b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/parameter.ini index a2a7962f7..63a5a44c8 100644 --- a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/parameter.ini +++ b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/parameter.ini @@ -116,7 +116,7 @@ RayTracing-VolRefineMode = 3 ! Volumetric refinement RayTracing-PulseDuration = 15e-9 RayTracing-WaveLength = 10e-9 -RayTracing-Power = 1.0 +RayTracing-PowerDensity = 1.0 RayTracing-RepetitionRate = 1000 RayTracing-RayDirection = (/ 0. , 0.0 , -1.0 /) !RayTracing-RayDirection = (/ 0. , 0.5 , -1.0 /) diff --git a/src/radiation/ray_tracing/raytrace_ini.f90 b/src/radiation/ray_tracing/raytrace_ini.f90 index 144857fbb..b3cb01251 100644 --- a/src/radiation/ray_tracing/raytrace_ini.f90 +++ b/src/radiation/ray_tracing/raytrace_ini.f90 @@ -45,7 +45,7 @@ SUBROUTINE DefineParametersRayTracing() CALL prms%CreateRealOption( 'RayTracing-WaistRadius' , 'Beam waist radius (in focal spot) w_b for Gaussian-type pulse with I~exp(-(r/w_b)^2) [m]' , '0.0') CALL prms%CreateRealOption( 'RayTracing-WaveLength' , 'Beam wavelength [m]' ) CALL prms%CreateRealOption( 'RayTracing-RepetitionRate' , 'Pulse repetition rate (pulses per second) [Hz]' ) -CALL prms%CreateRealOption( 'RayTracing-Power' , 'Average pulse power (energy of a single pulse times repetition rate) [W]' ) +CALL prms%CreateRealOption( 'RayTracing-PowerDensity' , 'Average pulse power density (power per area) [W/m2]') CALL prms%CreateLogicalOption( 'RayTracing-ForceAbsorption', 'Surface photon sampling is performed independent of the actual absorption/reflection outcome (default=T)', '.TRUE.') CALL prms%CreateIntOption( 'RayTracing-NMax' , 'Maximum polynomial degree within refined volume elements for photon tracking (p-adaption)') @@ -106,7 +106,7 @@ SUBROUTINE InitRayTracing() Ray%WaveLength = GETREAL('RayTracing-WaveLength') Ray%RepetitionRate = GETREAL('RayTracing-RepetitionRate') Ray%Period = 1./Ray%RepetitionRate -Ray%Power = GETREAL('RayTracing-Power') +Ray%PowerDensity = GETREAL('RayTracing-PowerDensity') Ray%Direction = GETREALARRAY('RayTracing-RayDirection',3) Ray%Direction = UNITVECTOR(Ray%Direction) @@ -136,10 +136,8 @@ SUBROUTINE InitRayTracing() Period => Ray%Period ,& tActive => Ray%tActive ,& A => Ray%Area ) - ! Derived quantities - E0 = Ray%Power / Ray%RepetitionRate - ! Rectangle + ! ATTENTION: Rectangle only and uses GEO min/max in x- and y-direction! ! TODO: Ray emission area from chosen boundary surface? A = (GEO%xmaxglob-GEO%xminglob) * (GEO%ymaxglob-GEO%yminglob) ! Normal vector of the ray emission area @@ -147,6 +145,11 @@ SUBROUTINE InitRayTracing() ! Angle between emitted rays and emission area alpha = (90.-ABS(90.-(180./PI)*ACOS(DOT_PRODUCT(Ray%Direction,SurfaceNormal)))) + ! Derived quantities + Ray%Power = Ray%PowerDensity * A ! adjust power from [W/m2] to [W] + E0 = Ray%Power / Ray%RepetitionRate + + ! Generate two base vectors perpendicular to the ray direction CALL OrthoNormVec(Ray%Direction,Ray%BaseVector1IC,Ray%BaseVector2IC) diff --git a/src/radiation/ray_tracing/raytrace_vars.f90 b/src/radiation/ray_tracing/raytrace_vars.f90 index 431b38521..e3c9e6fae 100644 --- a/src/radiation/ray_tracing/raytrace_vars.f90 +++ b/src/radiation/ray_tracing/raytrace_vars.f90 @@ -36,6 +36,7 @@ MODULE MOD_RayTracing_Vars REAL :: WaistRadius !< REAL :: WaveLength !< REAL :: RepetitionRate !< + REAL :: PowerDensity !< REAL :: Power !< REAL :: Area !< REAL :: Energy !< From 19963e5a5934a731b7c2d723e8ee592fd760689d Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Thu, 24 Aug 2023 17:59:36 +0200 Subject: [PATCH 150/495] Removed compile warnings --- src/particles/boundary/particle_boundary_init.f90 | 2 +- src/particles/particle_mesh/particle_mesh_build.f90 | 6 +++--- src/particles/particle_mpi/particle_mpi_halo.f90 | 4 ++-- .../radiative_transfer/tracking/radtrans_tracking_tools.f90 | 4 +++- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/particles/boundary/particle_boundary_init.f90 b/src/particles/boundary/particle_boundary_init.f90 index d9dba18f1..4e3fd0917 100644 --- a/src/particles/boundary/particle_boundary_init.f90 +++ b/src/particles/boundary/particle_boundary_init.f90 @@ -191,7 +191,7 @@ SUBROUTINE InitializeVariablesPartBoundary() USE MOD_Mesh_Vars ,ONLY: BoundaryName,BoundaryType, nBCs USE MOD_Particle_Vars ,ONLY: nSpecies, PartMeshHasPeriodicBCs, RotRefFrameAxis, SpeciesDatabase, Species, usevMPF USE MOD_SurfaceModel_Vars ,ONLY: nPorousBC -USE MOD_Particle_Boundary_Vars ,ONLY: PartBound,nPartBound,DoBoundaryParticleOutputHDF5,PartStateBoundary +USE MOD_Particle_Boundary_Vars ,ONLY: PartBound,nPartBound,DoBoundaryParticleOutputHDF5 USE MOD_Particle_Boundary_Vars ,ONLY: nVarPartStateBoundary USE MOD_Particle_Tracking_Vars ,ONLY: TrackingMethod USE MOD_Particle_Surfaces_Vars ,ONLY: BCdata_auxSF diff --git a/src/particles/particle_mesh/particle_mesh_build.f90 b/src/particles/particle_mesh/particle_mesh_build.f90 index c0aa0c4c3..190c28f36 100644 --- a/src/particles/particle_mesh/particle_mesh_build.f90 +++ b/src/particles/particle_mesh/particle_mesh_build.f90 @@ -41,7 +41,6 @@ SUBROUTINE BuildMesh2DInfo() ! MODULES USE MOD_Globals USE MOD_PreProc -USE MOD_Mesh_Vars ,ONLY: nElems USE MOD_Particle_Boundary_Vars ,ONLY: PartBound USE MOD_Particle_Mesh_Vars ,ONLY: GEO USE MOD_Particle_Mesh_Vars ,ONLY: ElemBaryNGeo @@ -51,9 +50,10 @@ SUBROUTINE BuildMesh2DInfo() #if USE_MPI USE MOD_MPI_Shared USE MOD_MPI_Shared_Vars ,ONLY: MPI_COMM_SHARED, nComputeNodeTotalElems -USE MOD_Particle_Mesh_Vars ,ONLY: nNonUniqueGlobalSides USE MOD_Particle_Mesh_Vars ,ONLY: ElemSideNodeID2D_Shared_Win, SideNormalEdge2D_Shared_Win USE MOD_MPI_Shared_Vars ,ONLY: myComputeNodeRank, nComputeNodeProcessors +#else +USE MOD_Mesh_Vars ,ONLY: nElems #endif /*USE_MPI*/ USE MOD_Particle_Mesh_Vars ,ONLY: ElemSideNodeID2D_Shared, SideNormalEdge2D_Shared ! IMPLICIT VARIABLE HANDLING @@ -1016,7 +1016,7 @@ SUBROUTINE BuildNodeNeighbourhood() USE MOD_Mesh_Vars ,ONLY: nElems #endif /*USE_MPI*/ #if USE_LOADBALANCE -USE MOD_LoadBalance_Vars ,ONLY: PerformLoadBalance,UseH5IOLoadBalance +USE MOD_LoadBalance_Vars ,ONLY: PerformLoadBalance #endif /*USE_LOADBALANCE*/ !----------------------------------------------------------------------------------------------------------------------------------! IMPLICIT NONE diff --git a/src/particles/particle_mpi/particle_mpi_halo.f90 b/src/particles/particle_mpi/particle_mpi_halo.f90 index f0b1f5be2..46b7e5ffb 100644 --- a/src/particles/particle_mpi/particle_mpi_halo.f90 +++ b/src/particles/particle_mpi/particle_mpi_halo.f90 @@ -1053,12 +1053,12 @@ SUBROUTINE IdentifyPartExchangeProcs() CALL MPI_ALLREDUCE(nNonSymmetricExchangeProcs, nNonSymmetricExchangeProcsGlob, 1, MPI_INTEGER, MPI_SUM, MPI_COMM_WORLD, IERROR) ! Check sum of nNonSymmetricExchangeProcs over all processors IF(nNonSymmetricExchangeProcsGlob.GT.0)THEN - SWRITE(UNIT_StdOut,'(X,131("~"))') + SWRITE(UNIT_StdOut,'(1X,131("~"))') SWRITE(Unit_StdOut,'(A,I0,A)') ' | Found ',nNonSymmetricExchangeProcsGlob, ' previously missing non-symmetric particle exchange procs' SWRITE(Unit_StdOut,'(A)')" | See ElemData container 'myInvisibleRank' for more information on which MPI ranks are non-symmetric" SWRITE(Unit_StdOut,'(A)')" | This information is written to "//TRIM(ProjectName)//"_MyInvisibleRank.h5 (only when CheckExchangeProcs=T)" SWRITE(Unit_StdOut,'(A)')" | This check is optional. You can disable it via CheckExchangeProcs = F" - SWRITE(UNIT_StdOut,'(X,131("~"))') + SWRITE(UNIT_StdOut,'(1X,131("~"))') CALL AddToElemData(ElementOut,'myInvisibleRank',LongIntArray=myInvisibleRank) CALL WriteMyInvisibleRankToHDF5() ! Only root aborts diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 index dd49916e2..7b39a8a2f 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 @@ -1318,11 +1318,13 @@ END SUBROUTINE PeriodicPhotonBC !=================================================================================================================================== SUBROUTINE CalcWallAbsoprtion(IntersectionPos, GlobSideID, DONE, ForceWallSample) USE MOD_Globals ,ONLY: VECNORM -USE MOD_Photon_TrackingVars ,ONLY: PhotonProps,PhotonSampWall +USE MOD_Photon_TrackingVars ,ONLY: PhotonProps USE MOD_Particle_Boundary_Vars ,ONLY: PartBound, GlobalSide2SurfSide, nSurfSample, SurfSideSamplingMidPoints USE MOD_Particle_Mesh_Vars ,ONLY: SideInfo_Shared #if USE_MPI USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWallProc +#else +USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall #endif /*USE_MPI*/ !--------------------------------------------------------------------------------------------------! IMPLICIT NONE From 35773042137d37632601f2a8bd42da5959dcff7b Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Thu, 24 Aug 2023 18:33:32 +0200 Subject: [PATCH 151/495] Fixes ray tracing restart/load balance --- src/radiation/ray_tracing/raytrace_ini.f90 | 11 +++++++---- src/restart/restart.f90 | 4 ++-- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/radiation/ray_tracing/raytrace_ini.f90 b/src/radiation/ray_tracing/raytrace_ini.f90 index b3cb01251..a6930004b 100644 --- a/src/radiation/ray_tracing/raytrace_ini.f90 +++ b/src/radiation/ray_tracing/raytrace_ini.f90 @@ -75,6 +75,9 @@ SUBROUTINE InitRayTracing() USE MOD_Particle_Mesh_Vars ,ONLY: GEO USE MOD_RadiationTrans_Vars ,ONLY: RadiationAbsorptionModel,RadObservationPointMethod USE MOD_Interpolation_Vars ,ONLY: NodeType,NodeTypeVISU +#if USE_LOADBALANCE +USE MOD_LoadBalance_Vars ,ONLY: PerformLoadBalance +#endif /*USE_LOADBALANCE*/ ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -87,8 +90,8 @@ SUBROUTINE InitRayTracing() CHARACTER(LEN=3) :: hilf ! auxiliary variable for INTEGER -> CHARACTER conversion !=================================================================================================================================== IF(.NOT.UseRayTracing) RETURN -SWRITE(UNIT_StdOut,'(132("-"))') -SWRITE(UNIT_stdOut,'(A)') ' INIT RAY TRACING MODEL ...' +LBWRITE(UNIT_StdOut,'(132("-"))') +LBWRITE(UNIT_stdOut,'(A)') ' INIT RAY TRACING MODEL ...' ! Do not absorb rays within the volume! RadiationAbsorptionModel = 0 @@ -179,8 +182,8 @@ SUBROUTINE InitRayTracing() CALL PrintOption('Temporal pulse width (pulse time 2x tShift) [s]' , 'CALCUL.' , RealOpt=2.0*Ray%tShift) CALL PrintOption('Pulse will end at tActive (pulse final time) [s]' , 'CALCUL.' , RealOpt=Ray%tActive) -SWRITE(UNIT_stdOut,'(A)')' INIT RAY TRACING MODEL DONE!' -SWRITE(UNIT_StdOut,'(132("-"))') +LBWRITE(UNIT_stdOut,'(A)')' INIT RAY TRACING MODEL DONE!' +LBWRITE(UNIT_StdOut,'(132("-"))') END SUBROUTINE InitRayTracing diff --git a/src/restart/restart.f90 b/src/restart/restart.f90 index fd816f27b..00da70985 100644 --- a/src/restart/restart.f90 +++ b/src/restart/restart.f90 @@ -318,7 +318,7 @@ SUBROUTINE Restart() #endif /*PP_POIS*/ #if defined(PARTICLES) USE MOD_Particle_Restart ,ONLY: ParticleRestart -USE MOD_RayTracing ,ONLY: ReadRayTracingDataFromH5 +USE MOD_RayTracing ,ONLY: RayTracing #endif /*defined(PARTICLES)*/ #if USE_HDG USE MOD_Restart_Tools ,ONLY: RecomputeLambda @@ -348,7 +348,7 @@ SUBROUTINE Restart() ! Restart particle arrays CALL ParticleRestart() ! Get ray tracing volume and surface data - CALL ReadRayTracingDataFromH5(onlySurfData=.FALSE.) + CALL RayTracing() #endif /*PARTICLES*/ #if USE_HDG From c778b29489cc6d63ab2b0be6333d644fe64ea64f Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Thu, 24 Aug 2023 23:40:39 +0200 Subject: [PATCH 152/495] - Added sanity check for ray tracing: At least one boundary must absorb rays, otherwise the simulation will never end - Introduced input parameter DoBoundaryParticleOutputRay=T/F to output surface SEE or volume ionization emission particles to .h5 based on the ray tracing model --- .../analyze.ini | 2 +- .../parameter.ini | 5 ++- .../boundary/particle_boundary_vars.f90 | 8 ++-- .../emission/particle_photoionization.f90 | 14 +++--- src/particles/particle_mesh/particle_mesh.f90 | 15 ++++--- src/radiation/ray_tracing/raytrace.f90 | 13 +++++- src/radiation/ray_tracing/raytrace_ini.f90 | 45 +++++++++---------- 7 files changed, 54 insertions(+), 48 deletions(-) diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/analyze.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/analyze.ini index 97f74e844..517a786e8 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/analyze.ini +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/analyze.ini @@ -2,7 +2,7 @@ compare_column_file = PartAnalyze.csv ! data file name compare_column_reference_file = Electrons_ref.csv ! data file name compare_column_index = 9 ! column index for comparison -compare_column_tolerance_value = 5e9 ! tolerance (depends on machine accuracy and MPI) +compare_column_tolerance_value = 10e9 ! tolerance (depends on machine accuracy and MPI) compare_column_tolerance_type = absolute ! absolute or relative tolerance ! integrate columns x:y in a data file as integral(y(x), x, x(1), x(end)) diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini index 64d75430b..ec6664ada 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini @@ -1,10 +1,10 @@ NVisu = 1 N = 1 RayTracing-NMax = 2 -DSMC-nSurfSample= 2 +DSMC-nSurfSample= 2,5 !NodeTypeVisu = GAUSS NodeTypeVisu = VISU -RayTracing-NumRays = 10000 +RayTracing-NumRays = 10000, 20000 ! =============================================================================== ! ! POSTI ! =============================================================================== ! @@ -127,6 +127,7 @@ UseRayTracing = T RayTracing-RayPosModel = 1 RayTracing-PartBound = 6 ! -> iBC: 6 PhotonModeBPO = 1 ! Debugging output: vectors +DoBoundaryParticleOutputRay = T RayTracing-VolRefineMode = 3 ! Volumetric refinement !RayTracing-VolRefineModeZ = 0.5 diff --git a/src/particles/boundary/particle_boundary_vars.f90 b/src/particles/boundary/particle_boundary_vars.f90 index 2b7c96124..645f431ed 100644 --- a/src/particles/boundary/particle_boundary_vars.f90 +++ b/src/particles/boundary/particle_boundary_vars.f90 @@ -336,11 +336,9 @@ MODULE MOD_Particle_Boundary_Vars ! Boundary particle output -LOGICAL :: DoBoundaryParticleOutputHDF5 ! Flag set automatically if particles crossing specific -! ! boundaries are to be saved to .h5 (position of intersection, -! ! velocity, species, internal energies) -REAL, ALLOCATABLE :: PartStateBoundary(:,:) ! (1:11,1:NParts) 1st index: x,y,z,vx,vy,vz,SpecID,Ekin,MPF,time,impact angle, -! ! BCindex +LOGICAL :: DoBoundaryParticleOutputHDF5 ! Flag set automatically if particles crossing specific boundaries are to be saved to .h5 (position of intersection, velocity, species, internal energies) +LOGICAL :: DoBoundaryParticleOutputRay ! User-defined flag to output surface SEE or volume ionization emission particles to .h5 based on the ray tracing model +REAL, ALLOCATABLE :: PartStateBoundary(:,:) ! (1:11,1:NParts) 1st index: x,y,z,vx,vy,vz,SpecID,Ekin,MPF,time,impact angle, BCindex ! ! 2nd index: 1 to number of boundary-crossed particles INTEGER, PARAMETER :: nVarPartStateBoundary=11 INTEGER :: PartStateBoundaryVecLength ! Number of boundary-crossed particles diff --git a/src/particles/emission/particle_photoionization.f90 b/src/particles/emission/particle_photoionization.f90 index 94d09db01..d0df95155 100644 --- a/src/particles/emission/particle_photoionization.f90 +++ b/src/particles/emission/particle_photoionization.f90 @@ -38,7 +38,7 @@ SUBROUTINE PhotoIonization_RayTracing_SEE() USE MOD_Globals USE MOD_Globals_Vars ,ONLY: PI USE MOD_Timedisc_Vars ,ONLY: dt,time -USE MOD_Particle_Boundary_Vars ,ONLY: nSurfSample, Partbound, DoBoundaryParticleOutputHDF5,SurfSideArea +USE MOD_Particle_Boundary_Vars ,ONLY: nSurfSample,Partbound,DoBoundaryParticleOutputRay,SurfSideArea USE MOD_Particle_Vars ,ONLY: Species, PartState, usevMPF USE MOD_RayTracing_Vars ,ONLY: Ray,UseRayTracing,RayElemEmission USE MOD_part_emission_tools ,ONLY: CalcPhotonEnergy @@ -220,10 +220,8 @@ SUBROUTINE PhotoIonization_RayTracing_SEE() ! Create new particle CALL CreateParticle(SpecID,Particle_pos(1:3),GlobElemID,Velo3D(1:3),0.,0.,0.,NewPartID=PartID,NewMPF=MPF) ! 1. Store the particle information in PartStateBoundary.h5 - IF(DoBoundaryParticleOutputHDF5) THEN - CALL StoreBoundaryParticleProperties(PartID,SpecID,PartState(1:3,PartID),& - UNITVECTOR(PartState(4:6,PartID)),nVec,iPartBound=BCID,mode=2,MPF_optIN=MPF) - END IF ! DoBoundaryParticleOutputHDF5 + IF(DoBoundaryParticleOutputRay) CALL StoreBoundaryParticleProperties(PartID,SpecID,PartState(1:3,PartID),& + UNITVECTOR(PartState(4:6,PartID)),nVec,iPartBound=BCID,mode=2,MPF_optIN=MPF) #if USE_HDG ! 2. Check if floating boundary conditions (FPC) are used and consider electron holes IF(UseFPC)THEN @@ -286,7 +284,7 @@ SUBROUTINE PhotoIonization_RayTracing_Volume() USE MOD_TimeDisc_Vars ,ONLY: iStage,nRKStages,RK_c #endif /*defined(LSERK)*/ USE MOD_Particle_Boundary_Tools ,ONLY: StoreBoundaryParticleProperties -USE MOD_Particle_Boundary_Vars ,ONLY: DoBoundaryParticleOutputHDF5 +USE MOD_Particle_Boundary_Vars ,ONLY: DoBoundaryParticleOutputRay !----------------------------------------------------------------------------------------------------------------------------------! ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -482,12 +480,12 @@ SUBROUTINE PhotoIonization_RayTracing_Volume() PartMPF(newPartID) = MPF END IF ! 1. Store the particle information in PartStateBoundary.h5 - IF(DoBoundaryParticleOutputHDF5) THEN + IF(DoBoundaryParticleOutputRay) THEN CALL StoreBoundaryParticleProperties(PartID,SpecID,PartState(1:3,PartID),& UNITVECTOR(PartState(4:6,PartID)),(/0.,0.,1./),iPartBound=0,mode=2,MPF_optIN=MPF) CALL StoreBoundaryParticleProperties(NewPartID,SpecID,PartState(1:3,NewPartID),& UNITVECTOR(PartState(4:6,NewPartID)),(/0.,0.,1./),iPartBound=0,mode=2,MPF_optIN=MPF) - END IF ! DoBoundaryParticleOutputHDF5 + END IF ! DoBoundaryParticleOutputRay ! Velocity (set it to zero, as it will be subtracted in the chemistry module) PartState(4:6,newPartID) = 0. ! Internal energies (set it to zero) diff --git a/src/particles/particle_mesh/particle_mesh.f90 b/src/particles/particle_mesh/particle_mesh.f90 index 974e30ab0..eb233a31f 100644 --- a/src/particles/particle_mesh/particle_mesh.f90 +++ b/src/particles/particle_mesh/particle_mesh.f90 @@ -86,6 +86,7 @@ SUBROUTINE DefineParametersParticleMesh() '1: Output the initial position of the rays and their direction vector\n'& '2: Output initial position and all calculated intersection points calculated in radtrans tracking\n'& ,'0') +CALL prms%CreateLogicalOption( 'DoBoundaryParticleOutputRay', 'Activates output of emission particles by ray tracing SEE and ray tracing volume ionization to PartStateBoundary.h5 (with negative species IDs to indicate creation)','.FALSE.') CALL prms%CreateIntOption( 'PartOut'& , 'If compiled with CODE_ANALYZE flag: For This particle number every tracking information is written as STDOUT.','0') CALL prms%CreateIntOption( 'MPIRankOut'& @@ -196,7 +197,7 @@ SUBROUTINE InitParticleMesh() #endif /*USE_LOADBALANCE*/ USE MOD_PICDepo_Shapefunction_Tools, ONLY:InitShapeFunctionDimensionalty USE MOD_Particle_Boundary_Init ,ONLY: InitPartStateBoundary -USE MOD_Particle_Boundary_Vars ,ONLY: DoBoundaryParticleOutputHDF5,nSurfSample +USE MOD_Particle_Boundary_Vars ,ONLY: DoBoundaryParticleOutputHDF5,nSurfSample,DoBoundaryParticleOutputRay USE MOD_Photon_TrackingVars ,ONLY: PhotonModeBPO USE MOD_RayTracing_Vars ,ONLY: UseRayTracing !USE MOD_DSMC_Vars ,ONLY: DSMC @@ -313,12 +314,14 @@ SUBROUTINE InitParticleMesh() DisplayLostParticles = GETLOGICAL('DisplayLostParticles') ! Ray tracing information to .h5 for debugging when using the radiation transport model or pure ray tracing -PhotonModeBPO = GETINT('PhotonModeBPO') +PhotonModeBPO = GETINT('PhotonModeBPO') +! Activate output of emission particles by ray tracing SEE and ray tracing volume ionization to PartStateBoundary.h5 (with negative species IDs to indicate creation +DoBoundaryParticleOutputRay = GETLOGICAL('DoBoundaryParticleOutputRay') ! Check if DoBoundaryParticleOutputHDF5 is already activated and PartStateBoundary therefore already allocated -IF((PhotonModeBPO.GE.1).AND.(.NOT.DoBoundaryParticleOutputHDF5))THEN - DoBoundaryParticleOutputHDF5 = .TRUE. - CALL InitPartStateBoundary() -END IF ! (PhotonModeBPO.GE.1 +IF((PhotonModeBPO.GE.1) .AND.(.NOT.DoBoundaryParticleOutputHDF5)) DoBoundaryParticleOutputHDF5 = .TRUE. +IF((DoBoundaryParticleOutputRay).AND.(.NOT.DoBoundaryParticleOutputHDF5)) DoBoundaryParticleOutputHDF5 = .TRUE. + +IF(DoBoundaryParticleOutputHDF5) CALL InitPartStateBoundary() #ifdef CODE_ANALYZE PARTOUT = GETINT('PartOut','0') diff --git a/src/radiation/ray_tracing/raytrace.f90 b/src/radiation/ray_tracing/raytrace.f90 index a5030e466..89866d533 100644 --- a/src/radiation/ray_tracing/raytrace.f90 +++ b/src/radiation/ray_tracing/raytrace.f90 @@ -68,6 +68,7 @@ SUBROUTINE RayTracing() USE MOD_DSMC_Vars ,ONLY: DSMC USE MOD_RayTracing_Init ,ONLY: FinalizeRayTracing USE MOD_RayTracing_Vars ,ONLY: RaySecondaryVectorX,RaySecondaryVectorY,RaySecondaryVectorZ +USE MOD_Particle_Boundary_Vars ,ONLY: nPartBound ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -76,11 +77,11 @@ SUBROUTINE RayTracing() ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -INTEGER :: NonUniqueGlobalSideID,iSurfSide,iBC +INTEGER :: NonUniqueGlobalSideID,iSurfSide,iBC,iPartBound INTEGER :: CNElemID, iRay, photonCount, RayVisCount, LocRayNum, RayDisp LOGICAL :: FoundComputeNodeSurfSide INTEGER :: ALLOCSTAT -REAL :: RectPower +REAL :: RectPower,SumPhotonEnACC REAL :: StartT,EndT ! Timer !=================================================================================================================================== @@ -104,6 +105,13 @@ SUBROUTINE RayTracing() RETURN END IF +! Sanity check: Not all boundaries are allowed to perfectly reflect rays. Otherwise, the simulation will never end! +SumPhotonEnACC = 0. +DO iPartBound = 1,nPartBound + SumPhotonEnACC = SumPhotonEnACC + PartBound%PhotonEnACC(iPartBound) +END DO +IF(SumPhotonEnACC.LE.0.0) CALL abort(__STAMP__,'The sum of all Part-Boundary[$]-PhotonEnACC is zero, which is not allowed!') + GETTIME(StartT) SWRITE(UNIT_stdOut,'(A)') ' Start Ray Tracing Calculation ...' @@ -232,6 +240,7 @@ SUBROUTINE RayTracing() CALL FinalizeRayTracing() +! Deactivate in order to skip this routine during load balance PerformRayTracing = .FALSE. GETTIME(EndT) diff --git a/src/radiation/ray_tracing/raytrace_ini.f90 b/src/radiation/ray_tracing/raytrace_ini.f90 index a6930004b..9741a5241 100644 --- a/src/radiation/ray_tracing/raytrace_ini.f90 +++ b/src/radiation/ray_tracing/raytrace_ini.f90 @@ -35,28 +35,25 @@ SUBROUTINE DefineParametersRayTracing() IMPLICIT NONE !================================================================================================================================== CALL prms%SetSection("Ray Tracing") - -!CALL prms%CreateLogicalOption( 'RayTracing-AdaptiveRays' , 'TODO' , '.FALSE.') -CALL prms%CreateIntOption( 'RayTracing-NumRays' , 'Number of emitted rays from particle boundary with index [RayTracing-PartBound]') -CALL prms%CreateRealArrayOption( 'RayTracing-RayDirection' , 'Direction vector for ray emission. Will be normalized after read-in.' , no=3) -CALL prms%CreateIntOption( 'RayTracing-PartBound' , 'Particle boundary ID where rays are emitted from' , '0') -CALL prms%CreateRealOption( 'RayTracing-PulseDuration' , 'Pulse duration tau for a Gaussian-type pulse with I~exp(-(t/tau)^2) [s]' ) -CALL prms%CreateIntOption( 'RayTracing-NbrOfPulses' , 'Number of pulses [-]' , '1') -CALL prms%CreateRealOption( 'RayTracing-WaistRadius' , 'Beam waist radius (in focal spot) w_b for Gaussian-type pulse with I~exp(-(r/w_b)^2) [m]' , '0.0') -CALL prms%CreateRealOption( 'RayTracing-WaveLength' , 'Beam wavelength [m]' ) -CALL prms%CreateRealOption( 'RayTracing-RepetitionRate' , 'Pulse repetition rate (pulses per second) [Hz]' ) -CALL prms%CreateRealOption( 'RayTracing-PowerDensity' , 'Average pulse power density (power per area) [W/m2]') -CALL prms%CreateLogicalOption( 'RayTracing-ForceAbsorption', 'Surface photon sampling is performed independent of the actual absorption/reflection outcome (default=T)', '.TRUE.') - -CALL prms%CreateIntOption( 'RayTracing-NMax' , 'Maximum polynomial degree within refined volume elements for photon tracking (p-adaption)') -CALL prms%CreateIntOption( 'RayTracing-VolRefineMode' , 'High-order ray tracing volume sampling refinement method:\n'//& - ' 0: do nothing (default)\n'//& - ' 1: refine below user-defined z-coordinate with NMax\n'//& - ' 2: scale N according to the mesh element volume between NMin>=1 and NMax>=2\n'//& - ' 3: refine below user-defined z-coordinate and scale N according to the mesh element volume between NMin>=1 and NMax>=2\n'//& - ' (consider only elements below the user-defined z-coordinate for the scaling)'& - ,'0') -CALL prms%CreateRealOption( 'RayTracing-VolRefineModeZ' , 'Z-coordinate for switching between NMin (pos>z) and NMax (pos=1 and NMax>=2\n'//& + ' 3: refine below user-defined z-coordinate and scale N according to the mesh element volume between NMin>=1 and NMax>=2\n'//& + ' (consider only elements below the user-defined z-coordinate for the scaling)'& + ,'0') +CALL prms%CreateRealOption( 'RayTracing-VolRefineModeZ' , 'Z-coordinate for switching between NMin (pos>z) and NMax (pos Date: Fri, 25 Aug 2023 12:24:45 +0200 Subject: [PATCH 153/495] Abort in case the number of Part-nBounds is not equal the number of BCs read-in from the mesh --- src/particles/boundary/particle_boundary_init.f90 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/particles/boundary/particle_boundary_init.f90 b/src/particles/boundary/particle_boundary_init.f90 index a0862f783..6d3b430c8 100644 --- a/src/particles/boundary/particle_boundary_init.f90 +++ b/src/particles/boundary/particle_boundary_init.f90 @@ -208,7 +208,9 @@ SUBROUTINE InitializeVariablesPartBoundary() nPartBound = GETINT('Part-nBounds') ! get number of particle boundaries ! Read-in number of porous boundaries nPorousBC = GETINT('Surf-nPorousBC') -IF ((nPartBound.LE.0).OR.(dummy_int.LT.0)) CALL abort(__STAMP__ ,'ERROR: nPartBound .LE. 0:', nPartBound) +IF((nPartBound.LE.0).OR.(dummy_int.LT.0)) CALL abort(__STAMP__ ,'ERROR: nPartBound .LE. 0:', nPartBound) + +IF(nPartBound.NE.nBCs) CALL abort(__STAMP__ ,'ERROR: Part-nBounds is not equal to the number of BCs read-in from the mesh!') ALLOCATE(PartBound%SourceBoundName( 1:nPartBound)) PartBound%SourceBoundName = '' From 932d42e21328daaf8f76c710735af40d64af967e Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Fri, 25 Aug 2023 12:35:44 +0200 Subject: [PATCH 154/495] Updated GitLab templates --- .gitlab/merge_request_templates/Feature.md | 7 +++---- .gitlab/merge_request_templates/Release.md | 6 +++--- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/.gitlab/merge_request_templates/Feature.md b/.gitlab/merge_request_templates/Feature.md index 052bec19c..09a1888d6 100644 --- a/.gitlab/merge_request_templates/Feature.md +++ b/.gitlab/merge_request_templates/Feature.md @@ -1,6 +1,6 @@ -## Related Issue +## To-Do's -Closes #number +* [ ] ToDo ## Merge Request Checklist @@ -16,5 +16,4 @@ Closes #number * [ ] Add small test setup * [ ] Add entry in REGGIE.md table * [ ] Check automatic restart functionality of reggie example via Load Balance (checks correct allocation and deallocation for the test case) -* [ ] New feature description in appropriate documentation (user/developer guide) -* [ ] Check that no large files were added to the repository +* [ ] New feature description in appropriate documentation (user/developer guide) \ No newline at end of file diff --git a/.gitlab/merge_request_templates/Release.md b/.gitlab/merge_request_templates/Release.md index c19e91d5e..2929e79a1 100644 --- a/.gitlab/merge_request_templates/Release.md +++ b/.gitlab/merge_request_templates/Release.md @@ -11,13 +11,13 @@ # Release Notes -## Release 1.X.X +## Release 3.X.X -### Documentation +### Breaking/Parameter changes * -### Reggie +### Documentation/Tools/Regression testing * From 18ee4311d643b1b3c9ff8b78a6f8e37b303eb4da Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Fri, 25 Aug 2023 14:54:33 +0200 Subject: [PATCH 155/495] - Adjusted SEE ray tracing emission: Move particle slightly into the domain away from the surface because TriaTracking loses the particle during restart as the InsideQuad3D test returns "not inside" for these particles and they are deleted - Skip call to RayTracing() subroutine in timedisc during restart as it is thereby called twice --- src/particles/emission/particle_photoionization.f90 | 11 +++++++++-- src/timedisc/timedisc.f90 | 3 +-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/particles/emission/particle_photoionization.f90 b/src/particles/emission/particle_photoionization.f90 index d0df95155..c84eb225e 100644 --- a/src/particles/emission/particle_photoionization.f90 +++ b/src/particles/emission/particle_photoionization.f90 @@ -67,6 +67,8 @@ SUBROUTINE PhotoIonization_RayTracing_SEE() USE MOD_Mesh_Vars ,ONLY: BoundaryType #endif /*USE_HDG*/ USE MOD_SurfaceModel_Analyze_Vars ,ONLY: SEE,CalcElectronSEE +USE MOD_Particle_Mesh_Vars ,ONLY: ElemBaryNGeo +USE MOD_Mesh_Tools ,ONLY: GetCNElemID !----------------------------------------------------------------------------------------------------------------------------------! ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -75,8 +77,8 @@ SUBROUTINE PhotoIonization_RayTracing_SEE() ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -REAL :: t_1, t_2, E_Intensity -INTEGER :: NbrOfRepetitions, SideID, iSample, GlobElemID, PartID, BCSideID, iLocSide, locElemID, iSurfSide +REAL :: t_1, t_2, E_Intensity,vec(3) +INTEGER :: NbrOfRepetitions, SideID, iSample, GlobElemID, PartID, BCSideID, iLocSide, locElemID, iSurfSide, CNElemID INTEGER :: p, q, BCID, SpecID, iPart, NbrOfSEE, iSEEBC REAL :: RealNbrOfSEE, TimeScalingFactor, MPF REAL :: Particle_pos(1:3), xi(2) @@ -217,6 +219,11 @@ SUBROUTINE PhotoIonization_RayTracing_SEE() END IF ! nSurfSample.GT.1 ! Determine particle velocity CALL CalcVelocity_FromWorkFuncSEE(PartBound%PhotonSEEWorkFunction(BCID), Species(SpecID)%MassIC, tang1, nVec, Velo3D) + ! Move particle slightly into the domain away from the surface because TriaTracking loses the particle during restart + ! as the InsideQuad3D test returns "not inside" for these particles and they are deleted + CNElemID = GetCNElemID(GlobElemID) + vec(1:3) = ElemBaryNGeo(1:3,CNElemID) - Particle_pos(1:3) + Particle_pos(1:3) = Particle_pos(1:3) + 1e-7 * vec(1:3) ! Create new particle CALL CreateParticle(SpecID,Particle_pos(1:3),GlobElemID,Velo3D(1:3),0.,0.,0.,NewPartID=PartID,NewMPF=MPF) ! 1. Store the particle information in PartStateBoundary.h5 diff --git a/src/timedisc/timedisc.f90 b/src/timedisc/timedisc.f90 index 6f1b15ab4..847a91016 100644 --- a/src/timedisc/timedisc.f90 +++ b/src/timedisc/timedisc.f90 @@ -205,8 +205,7 @@ SUBROUTINE TimeDisc() ! Ray tracing #if defined(PARTICLES) -!IF(.NOT.DoRestart) -CALL RayTracing() +IF(.NOT.DoRestart) CALL RayTracing() #endif /*defined(PARTICLES)*/ CALL PrintStatusLine(time,dt,tStart,tEnd,1) From b893036e91329ee8229b12b4292f4c72a9b0ebf0 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Fri, 25 Aug 2023 14:57:14 +0200 Subject: [PATCH 156/495] Abort during initialization if the user-supplied nPeriodicVectors are not equal to the number determined from the mesh file. The latter depends on the logical PartMeshHasPeriodicBCs. --- src/particles/particle_mesh/particle_mesh_tools.f90 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/particles/particle_mesh/particle_mesh_tools.f90 b/src/particles/particle_mesh/particle_mesh_tools.f90 index 808e2db3e..bd24bea1f 100644 --- a/src/particles/particle_mesh/particle_mesh_tools.f90 +++ b/src/particles/particle_mesh/particle_mesh_tools.f90 @@ -1788,10 +1788,13 @@ SUBROUTINE ComputePeriodicVec() REAL :: sendbuf REAL,ALLOCATABLE :: recvbuf(:) #endif +INTEGER :: nPeriodicVectorsParameterIni !----------------------------------------------------------------------------------------------------------------------------------- ! Find number of periodic vectors +nPeriodicVectorsParameterIni = GEO%nPeriodicVectors GEO%nPeriodicVectors = MERGE(MAXVAL(BoundaryType(:,BC_ALPHA)),0,PartMeshHasPeriodicBCs) +IF(nPeriodicVectorsParameterIni.NE.GEO%nPeriodicVectors) CALL CollectiveStop(__STAMP__,'Wrong number of periodic vectors!') IF (GEO%nPeriodicVectors.EQ.0) RETURN firstElem = offsetElem+1 From ea476af692542dc7a5d4e583e9d512da6c00832d Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Fri, 25 Aug 2023 15:13:57 +0200 Subject: [PATCH 157/495] Updated ray tracing volume emission reggie with missing files --- .../Electronic-State-Database.h5 | Bin 0 -> 8624 bytes .../XSec_Database_H2_Photoionization.h5 | Bin 0 -> 58360 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/Electronic-State-Database.h5 create mode 100644 regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/XSec_Database_H2_Photoionization.h5 diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/Electronic-State-Database.h5 b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/Electronic-State-Database.h5 new file mode 100644 index 0000000000000000000000000000000000000000..9e335f4b5264750773dc6e7c1b6d652281c6266a GIT binary patch literal 8624 zcmeI14@^~69LIm}!Fyg1^a9f^RB{>Us4*m==GyfB5Rgkw!9Vj40TM80R6J@Gf*{Up zh)stsSByCut#D<=s9>_t$8ooJLhx0 zzw6J(pB$q&z^%lXjzG1N{#` zBJDxMzo*@%4Jj$$wxs@PNxDItuThg}gH_&F5l~YSGxQg3BySx}-=3^XiYlq7d-7ey zr2uN0t4MFs%g6MR=ya8<@rIx-GX%Phscr-3#QHTp^c8B1Y_l7dNyHyn?%>Hj?v<}w z2FVHt6SfEmb0J~e$LQ#Ax9YmxZa5T(y^k%|FgI7eVINGq=zYGfjot#V(-3CqbK|=7 zWE(hO;>&Q4DUpohF;`!32(Hz=7pL4CCrXF#IcNxE-jSl zGCol|Cya3vHjLkt83Qiv7jn0^vH2{DAE{yt_j+HYO z@u94APM7d-_0lS)1HPlyyjmN^{5h4t3dVqNIH82GhzYxZ(|+cVHd@Ipr0-1XB#zS`m=Z5QWIbdNlzLL@;qQmak3KBdbm~4@f}rWeF>Ll=$9@lm*Ng&>V@E zDFeQo*I8UvL;wHNlt$<6HE$lFEMWFvH5%{|i@RqMlmj}`I zndd{e(3q<{Y07-QrsqT6@-^ZF=zKhR=JU%Xu5$Hs)_nN+ZO)(le9c=t=ye{A$5fu_ zedd=B7(s|LW1(00c(nWn@t~8T_m9)v8*e3s^j_HW-dJ5m?vaTd{nBYaI?g{W{{ldR Bf589% literal 0 HcmV?d00001 diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/XSec_Database_H2_Photoionization.h5 b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/XSec_Database_H2_Photoionization.h5 new file mode 100644 index 0000000000000000000000000000000000000000..abef529f67ca2b525f34f437cfdf25ce7513f5cd GIT binary patch literal 58360 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 Ivgh>w0gNxUr2qf` literal 0 HcmV?d00001 From b92531d199bd7f0d2e863dc2ad023d9a5ed7c127 Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Fri, 25 Aug 2023 21:03:34 +0200 Subject: [PATCH 158/495] New SurfCOMM%UNICATOR between procs with a surface side --- docs/documentation/developerguide/mpi.md | 40 +++++++++-- .../command_line.ini | 2 +- .../parameter.ini | 8 ++- .../boundary/particle_boundary_init.f90 | 42 +++++++++--- .../boundary/particle_boundary_vars.f90 | 20 ++---- .../particle_mpi_boundary_sampling.f90 | 2 - src/particles/particle_operations.f90 | 4 +- .../surfacemodel/surfacemodel_analyze.f90 | 66 ++++++++----------- 8 files changed, 111 insertions(+), 73 deletions(-) diff --git a/docs/documentation/developerguide/mpi.md b/docs/documentation/developerguide/mpi.md index bd8143130..7ce6bf36e 100644 --- a/docs/documentation/developerguide/mpi.md +++ b/docs/documentation/developerguide/mpi.md @@ -2,12 +2,7 @@ This chapter describes how PICLas subroutines and functions are parallelized. - ## General Remarks: Things to consider -In case any new communicator (e.g. SurfCOMM%COMM) is built during init or anywhere else with -`CALL MPI_COMM_SPLIT(NEWCOMMUNICATOR,iERROR)` or such, it is necessary to finalize it with `CALL MPI_COMM_FREE(NEWCOMMUNICATOR,iERROR)`. - -Else, load balancing will produce undefined errors that are almost impossible to find. Debug MPI @@ -121,3 +116,38 @@ Additionally to conventional sides, mappings for the sides that belong to a boun PEM%GlobalElemID(iPart) ! Global element ID PEM%CNElemID(iPart) ! Compute-node local element ID (GlobalElem2CNTotalElem(PEM%GlobalElemID(iPart))) PEM%LocalElemID(iPart) ! Core local element ID (PEM%GlobalElemID(iPart) - offsetElem) + +## Custom communicators + +To limit the number of communicating processors, feature specific communicators can be built. In the following, an example is given +for a communicator, which only contains processors with a local surface side (part of the `InitParticleBoundarySurfSides` routine). First, a global variable `SurfCOMM`, which is based on the `tMPIGROUP` type, is required: +``` +TYPE tMPIGROUP + INTEGER :: UNICATOR !< MPI communicator for surface sides + INTEGER :: nProcs !< number of MPI processes + INTEGER :: MyRank !< MyRank, ordered from 0 to nProcs - 1 +END TYPE +TYPE (tMPIGROUP) :: SurfCOMM +``` +To create a subset of processors, a condition is required, which is defined by the `color` variable: +``` +color = MERGE(1337, MPI_UNDEFINED, nSurfSidesProc.GT.0) +``` +Here, every processor with the same `color` will be part of the same communicator. The condition `nSurfSidesProc.GT.0` in this case includes every processor with a surface side. Every other processor will be set to `MPI_UNDEFINED` and consequently be part of `MPI_COMM_NULL`. Now, the communicator itself can be created: +``` +CALL MPI_COMM_SPLIT(MPI_COMM_WORLD, color, MPI_INFO_NULL, SurfCOMM%UNICATOR, iError) +``` +`MPI_COMM_WORLD` denotes the original communicator containing every processor (but can also be a previously created subset) and the `MPI_INFO_NULL` entry denotes the rank assignment within the new communicator (default: numbering from 0 to nProcs - 1). Additional information can be stored within the created variable: +``` +IF(SurfCOMM%UNICATOR.NE.MPI_COMM_NULL) THEN + ! Stores the rank within the given communicator as MyRank + CALL MPI_COMM_RANK(SurfCOMM%UNICATOR, SurfCOMM%MyRank, iError) + ! Stores the total number of processors of the given communicator as nProcs + CALL MPI_COMM_SIZE(SurfCOMM%UNICATOR, SurfCOMM%nProcs, iError) +END IF +``` +Through the IF clause, only processors that are part of the communicator can be addressed. And finally, it is important to free the communicator during the finalization routine: +``` +IF(SurfCOMM%UNICATOR.NE.MPI_COMM_NULL) CALL MPI_COMM_FREE(SurfCOMM%UNICATOR,iERROR) +``` +Otherwise load balancing might produce undefined errors that are very difficult to find. \ No newline at end of file diff --git a/regressioncheck/CHE_poisson/SurfFlux_ThermionicEmission_Schottky/command_line.ini b/regressioncheck/CHE_poisson/SurfFlux_ThermionicEmission_Schottky/command_line.ini index fb34fa7f6..82716c168 100644 --- a/regressioncheck/CHE_poisson/SurfFlux_ThermionicEmission_Schottky/command_line.ini +++ b/regressioncheck/CHE_poisson/SurfFlux_ThermionicEmission_Schottky/command_line.ini @@ -1 +1 @@ -MPI=1,2,4 +MPI=1,4,20 diff --git a/regressioncheck/CHE_poisson/SurfFlux_ThermionicEmission_Schottky/parameter.ini b/regressioncheck/CHE_poisson/SurfFlux_ThermionicEmission_Schottky/parameter.ini index d04cc4703..049bc641f 100644 --- a/regressioncheck/CHE_poisson/SurfFlux_ThermionicEmission_Schottky/parameter.ini +++ b/regressioncheck/CHE_poisson/SurfFlux_ThermionicEmission_Schottky/parameter.ini @@ -14,7 +14,9 @@ NAnalyze = 1 ! Number of analyze points MeshFile = channel_mesh.h5 useCurveds = F ! if boundaries have to be changed (else they are used from Mesh directly): -TrackingMethod = triatracking +TrackingMethod = triatracking +CalcMeshInfo = T +CalcHaloInfo = T ! =============================================================================== ! ! OUTPUT / VISUALIZATION ! =============================================================================== ! @@ -57,6 +59,7 @@ BoundaryType = (/10,0/) ! =============================================================================== ! Part-maxParticleNumber=500000 Part-nSpecies=1 + Part-nBounds=6 Part-Boundary1-SourceName = BC_Xplus Part-Boundary1-Condition = reflective @@ -65,8 +68,8 @@ Part-Boundary1-SpeciesSwaps1 = (/1,0/) Part-Boundary2-SourceName = BC_Xminus Part-Boundary2-Condition = reflective - Part-Boundary2-WallTemp = 2700, 2635.24 + Part-Boundary3-SourceName = BC_Yplus Part-Boundary3-Condition = symmetric Part-Boundary4-SourceName = BC_Yminus @@ -109,3 +112,4 @@ Particles-HaloEpsVelo=2.0E+07 Part-NumberOfRandomSeeds=2 Particles-RandomSeed1=1 Particles-RandomSeed2=2 +NVisu=1 diff --git a/src/particles/boundary/particle_boundary_init.f90 b/src/particles/boundary/particle_boundary_init.f90 index ef0fab172..8b4f37cce 100644 --- a/src/particles/boundary/particle_boundary_init.f90 +++ b/src/particles/boundary/particle_boundary_init.f90 @@ -589,6 +589,7 @@ SUBROUTINE InitParticleBoundarySurfSides() USE MOD_Particle_Boundary_Vars ,ONLY: GlobalSide2SurfSide_Shared,GlobalSide2SurfSide_Shared_Win USE MOD_Particle_Boundary_Vars ,ONLY: SurfSide2GlobalSide_Shared,SurfSide2GlobalSide_Shared_Win USE MOD_Particle_Boundary_Vars ,ONLY: nComputeNodeInnerBCs +USE MOD_Particle_Boundary_Vars ,ONLY: SurfCOMM #else USE MOD_Particle_Mesh_Vars ,ONLY: nComputeNodeSides #endif /*USE_MPI*/ @@ -612,6 +613,7 @@ SUBROUTINE InitParticleBoundarySurfSides() INTEGER :: GlobalElemID,GlobalElemRank INTEGER :: sendbuf,recvbuf INTEGER :: NbGlobalElemID, NbElemRank, NbLeaderID, nSurfSidesTmp +INTEGER :: color #endif /*USE_MPI*/ INTEGER :: NbGlobalSideID !=================================================================================================================================== @@ -672,10 +674,10 @@ SUBROUTINE InitParticleBoundarySurfSides() ! check if element for this side is on the current compute-node ! IF ((SideInfo_Shared(SIDE_ID,iSide).GT.ElemInfo_Shared(ELEM_FIRSTSIDEIND,offsetComputeNodeElem+1)) .AND. & ! (SideInfo_Shared(SIDE_ID,iSide).LE.ElemInfo_Shared(ELEM_LASTSIDEIND ,offsetComputeNodeElem+nComputeNodeElems))) THEN -! IF ((iSide.GE.(ElemInfo_Shared(ELEM_FIRSTSIDEIND,offsetComputeNodeElem+1)+1)) .AND. & -! (iSide.LE.ElemInfo_Shared(ELEM_LASTSIDEIND ,offsetComputeNodeElem+nComputeNodeElems))) THEN -! nComputeNodeSurfSides = nComputeNodeSurfSides + 1 -! END IF + ! IF ((iSide.GE.(ElemInfo_Shared(ELEM_FIRSTSIDEIND,offsetComputeNodeElem+1)+1)) .AND. & + ! (iSide.LE.ElemInfo_Shared(ELEM_LASTSIDEIND ,offsetComputeNodeElem+nComputeNodeElems))) THEN + ! nComputeNodeSurfSides = nComputeNodeSurfSides + 1 + ! END IF ! TODO: Add another check to determine the surface side in halo_eps from current proc. Node-wide halo can become quite large with ! with 128 procs! @@ -693,7 +695,7 @@ SUBROUTINE InitParticleBoundarySurfSides() ELSE ! find the compute node GlobalSide2SurfSideProc(SURF_LEADER,iSide) = INT(GlobalElemRank/nComputeNodeProcessors) - END IF + END IF #else GlobalSide2SurfSideProc(SURF_RANK ,iSide) = 0 GlobalSide2SurfSideProc(SURF_LEADER,iSide) = GlobalSide2SurfSideProc(SURF_RANK,iSide) @@ -701,11 +703,7 @@ SUBROUTINE InitParticleBoundarySurfSides() #if USE_MPI ! check if element for this side is on the current compute-node. Alternative version to the check above - IF (GlobalSide2SurfSideProc(SURF_LEADER,iSide).EQ.myLeaderGroupRank) THEN -#endif /*USE_MPI*/ - nComputeNodeSurfSides = nComputeNodeSurfSides + 1 -#if USE_MPI - END IF + IF (GlobalSide2SurfSideProc(SURF_LEADER,iSide).EQ.myLeaderGroupRank) nComputeNodeSurfSides = nComputeNodeSurfSides + 1 #endif /*USE_MPI*/ END IF ! reflective side END DO @@ -760,6 +758,7 @@ SUBROUTINE InitParticleBoundarySurfSides() END DO #else offsetSurfTotalSidesProc = 0 +nComputeNodeSurfSides = nSurfSidesProc nComputeNodeSurfTotalSides = nSurfSidesProc GlobalSide2SurfSide(:,firstSide:lastSide) = GlobalSide2SurfSideProc(:,firstSide:lastSide) #endif /*USE_MPI*/ @@ -854,6 +853,28 @@ SUBROUTINE InitParticleBoundarySurfSides() ! free temporary arrays DEALLOCATE(GlobalSide2SurfSideProc) +! create a communicator between processors with a surface side (including sides in the halo region) +#if USE_MPI +! Set the control of subset assignment (nonnegative integer). Processes with the same color are in the same new communicator. +! Make sure to include the root +IF(MPIRoot) THEN + color = 1337 +ELSE + color = MERGE(1337, MPI_UNDEFINED, nSurfSidesProc.GT.0) +END IF +! Create new surface communicator. Pass MPI_INFO_NULL as rank to follow the original ordering +CALL MPI_COMM_SPLIT(MPI_COMM_WORLD, color, MPI_INFO_NULL, SurfCOMM%UNICATOR, iError) +! Find my rank on the shared communicator, comm size and proc name +IF(SurfCOMM%UNICATOR.NE.MPI_COMM_NULL)THEN + CALL MPI_COMM_RANK(SurfCOMM%UNICATOR, SurfCOMM%MyRank, iError) + CALL MPI_COMM_SIZE(SurfCOMM%UNICATOR, SurfCOMM%nProcs, iError) + ! inform about size of emission communicator + LBWRITE(UNIT_StdOut,'(A,I0,A)') ' Surface sides: Communicator on ', SurfCOMM%nProcs,' procs' +END IF ! nSurfSidesProc.GT.0 +#endif /*USE_MPI*/ + +LBWRITE(UNIT_stdOut,'(A)') ' INIT SURFACE SIDES DONE!' + END SUBROUTINE InitParticleBoundarySurfSides @@ -2052,6 +2073,7 @@ SUBROUTINE FinalizeParticleBoundary() ! Mapping arrays are allocated even if the node does not have sampling surfaces #if USE_MPI +IF(SurfCOMM%UNICATOR.NE.MPI_COMM_NULL) CALL MPI_COMM_FREE(SurfCOMM%UNICATOR,iERROR) CALL MPI_BARRIER(MPI_COMM_SHARED,iERROR) CALL UNLOCK_AND_FREE(GlobalSide2SurfSide_Shared_Win) CALL UNLOCK_AND_FREE(SurfSide2GlobalSide_Shared_Win) diff --git a/src/particles/boundary/particle_boundary_vars.f90 b/src/particles/boundary/particle_boundary_vars.f90 index d799fb292..5ad22e8c3 100644 --- a/src/particles/boundary/particle_boundary_vars.f90 +++ b/src/particles/boundary/particle_boundary_vars.f90 @@ -180,22 +180,14 @@ MODULE MOD_Particle_Boundary_Vars END TYPE #endif /*USE_MPI*/ -TYPE tSurfaceCOMM - LOGICAL :: MPIRoot ! if root of mpi communicator - INTEGER :: MyRank ! local rank in new group - INTEGER :: nProcs ! number of processes - LOGICAL :: MPIOutputRoot ! if root of mpi communicator - INTEGER :: MyOutputRank ! local rank in new group - INTEGER :: nOutputProcs ! number of output processes #if USE_MPI - LOGICAL :: InnerBCs ! are there InnerSides with reflective properties - INTEGER :: COMM=MPI_COMM_NULL ! communicator - INTEGER :: nMPINeighbors ! number of processes to communicate with - TYPE(tSurfaceSendList),ALLOCATABLE :: MPINeighbor(:) ! list containing all mpi neighbors - INTEGER :: OutputCOMM=MPI_COMM_NULL ! communicator for output -#endif /*USE_MPI*/ +TYPE tMPIGROUP + INTEGER :: UNICATOR !< MPI communicator for surface sides (including sides inside the halo region) + INTEGER :: nProcs !< number of MPI processes for particles + INTEGER :: MyRank !< MyRank of PartMPIVAR%COMM END TYPE -TYPE (tSurfaceCOMM) :: SurfCOMM +TYPE (tMPIGROUP) :: SurfCOMM +#endif /*USE_MPI*/ TYPE tSurfaceMesh INTEGER :: SampSize ! integer of sampsize diff --git a/src/particles/particle_mpi/particle_mpi_boundary_sampling.f90 b/src/particles/particle_mpi/particle_mpi_boundary_sampling.f90 index 151588f88..4d38fb90b 100644 --- a/src/particles/particle_mpi/particle_mpi_boundary_sampling.f90 +++ b/src/particles/particle_mpi/particle_mpi_boundary_sampling.f90 @@ -418,8 +418,6 @@ SUBROUTINE ExchangeSurfData() INTEGER :: MessageSize,iSurfSide,SurfSideID INTEGER :: nValues INTEGER :: RecvRequest(0:nSurfLeaders-1),SendRequest(0:nSurfLeaders-1) -!INTEGER :: iPos,p,q,iProc,iReact -!INTEGER :: recv_status_list(1:MPI_STATUS_SIZE,1:SurfCOMM%nMPINeighbors) !=================================================================================================================================== ! nodes without sampling surfaces do not take part in this routine IF (.NOT.SurfOnNode) RETURN diff --git a/src/particles/particle_operations.f90 b/src/particles/particle_operations.f90 index e30c4cfb0..a077f8465 100644 --- a/src/particles/particle_operations.f90 +++ b/src/particles/particle_operations.f90 @@ -194,8 +194,8 @@ SUBROUTINE RemoveParticle(PartID,BCID,alpha,crossedBC) PartEkinOut(iSpec)=PartEkinOut(iSpec)+CalcEkinPart(PartID) END IF ELSE - nPartOut(iSpec)=nPartOut(iSpec) + 1 - PartEkinOut(iSpec)=PartEkinOut(iSpec)+CalcEkinPart(PartID) + nPartOut(iSpec)=nPartOut(iSpec) + 1 + PartEkinOut(iSpec)=PartEkinOut(iSpec)+CalcEkinPart(PartID) END IF END IF ! CalcPartBalance diff --git a/src/particles/surfacemodel/surfacemodel_analyze.f90 b/src/particles/surfacemodel/surfacemodel_analyze.f90 index bb78bb4b6..df1615da8 100644 --- a/src/particles/surfacemodel/surfacemodel_analyze.f90 +++ b/src/particles/surfacemodel/surfacemodel_analyze.f90 @@ -150,9 +150,7 @@ SUBROUTINE AnalyzeSurface(Time) USE MOD_SurfaceModel_Analyze_Vars USE MOD_Restart_Vars ,ONLY: DoRestart USE MOD_Particle_Boundary_Vars ,ONLY: nComputeNodeSurfSides,PartBound -#if USE_MPI USE MOD_Particle_MPI_Vars ,ONLY: PartMPI -#endif /*USE_MPI*/ USE MOD_SurfaceModel_Vars ,ONLY: nPorousBC, PorousBC USE MOD_Particle_Vars ,ONLY: nSpecies,UseNeutralization,NeutralizationBalanceGlobal,Species #if USE_HDG @@ -160,6 +158,7 @@ SUBROUTINE AnalyzeSurface(Time) USE MOD_Analyze_Vars ,ONLY: CalcElectricTimeDerivative USE MOD_HDG_Vars ,ONLY: UseBiasVoltage,BiasVoltage,BVDataLength #if USE_MPI +USE MOD_Particle_Boundary_Vars ,ONLY: SurfCOMM USE MOD_HDG ,ONLY: SynchronizeBV #endif /*USE_MPI*/ #endif /*USE_HDG*/ @@ -182,18 +181,17 @@ SUBROUTINE AnalyzeSurface(Time) INTEGER :: iEDCBC,i,iBoundary,iPartBound2 #endif /*USE_HDG*/ !=================================================================================================================================== -IF((.NOT.CalcBoundaryParticleOutput).AND.(.NOT.UseNeutralization).AND.(.NOT.CalcElectronSEE)) RETURN IF(.NOT.DoSurfModelAnalyze) RETURN -! Currently the MPI routines below use Part%COMM (which contains all procs) and if one process returns here a hang-up occurs -IF(nComputeNodeSurfSides.EQ.0) CALL abort(__STAMP__,'Not all processes have surfaces for analysis but the communicator requires this.') +! Only proceed with processors, which have a surface side (as determined in InitParticleBoundarySurfSides) +#if USE_MPI +IF(SurfCOMM%UNICATOR.EQ.MPI_COMM_NULL) RETURN +#endif /*USE_MPI*/ SurfModelAnalyzeSampleTime = Time - SurfModelAnalyzeSampleTime ! Set SurfModelAnalyzeSampleTime=Time at the end of this routine OutputCounter = 2 unit_index = 636 -#if USE_MPI IF(PartMPI%MPIRoot)THEN -#endif /*USE_MPI*/ INQUIRE(UNIT = unit_index , OPENED = isOpen) IF(.NOT.isOpen)THEN outfile = 'SurfaceAnalyze.csv' @@ -273,17 +271,17 @@ SUBROUTINE AnalyzeSurface(Time) WRITE(unit_index,'(A)') '' END IF END IF -#if USE_MPI END IF -#endif /*USE_MPI*/ !=================================================================================================================================== ! Analyze Routines !=================================================================================================================================== IF (CalcSurfCollCounter) CALL GetCollCounter(SurfCollNum,AdsorptionNum,DesorptionNum) IF (CalcPorousBCInfo) CALL GetPorousBCInfo() +#if USE_MPI IF (CalcBoundaryParticleOutput) CALL SyncBoundaryParticleOutput() IF (CalcElectronSEE) CALL SyncElectronSEE() +#endif /*USE_MPI*/ !=================================================================================================================================== ! Output Analyzed variables !=================================================================================================================================== @@ -595,6 +593,7 @@ SUBROUTINE GetCollCounter(SurfCollNum,AdsorbNum, DesorbNum) USE MOD_SurfaceModel_Analyze_Vars ,ONLY: SurfAnalyzeCount, SurfAnalyzeNumOfAds, SurfAnalyzeNumOfDes #if USE_MPI USE MOD_Particle_MPI_Vars ,ONLY: PartMPI +USE MOD_Particle_Boundary_Vars ,ONLY: SurfCOMM #endif /*USE_MPI*/ ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -616,13 +615,13 @@ SUBROUTINE GetCollCounter(SurfCollNum,AdsorbNum, DesorbNum) #if USE_MPI IF(PartMPI%MPIRoot)THEN - CALL MPI_REDUCE(MPI_IN_PLACE,SurfCollNum ,nSpecies,MPI_INTEGER,MPI_SUM,0,PartMPI%COMM,IERROR) - CALL MPI_REDUCE(MPI_IN_PLACE,AdsorbNum ,nSpecies,MPI_INTEGER,MPI_SUM,0,PartMPI%COMM,IERROR) - CALL MPI_REDUCE(MPI_IN_PLACE,DesorbNum ,nSpecies,MPI_INTEGER,MPI_SUM,0,PartMPI%COMM,IERROR) + CALL MPI_REDUCE(MPI_IN_PLACE,SurfCollNum ,nSpecies,MPI_INTEGER,MPI_SUM,0,SurfCOMM%UNICATOR,IERROR) + CALL MPI_REDUCE(MPI_IN_PLACE,AdsorbNum ,nSpecies,MPI_INTEGER,MPI_SUM,0,SurfCOMM%UNICATOR,IERROR) + CALL MPI_REDUCE(MPI_IN_PLACE,DesorbNum ,nSpecies,MPI_INTEGER,MPI_SUM,0,SurfCOMM%UNICATOR,IERROR) ELSE - CALL MPI_REDUCE(SurfCollNum ,SurfCollNum ,nSpecies,MPI_INTEGER,MPI_SUM,0,PartMPI%COMM,IERROR) - CALL MPI_REDUCE(AdsorbNum ,AdsorbNum ,nSpecies,MPI_INTEGER,MPI_SUM,0,PartMPI%COMM,IERROR) - CALL MPI_REDUCE(DesorbNum ,DesorbNum ,nSpecies,MPI_INTEGER,MPI_SUM,0,PartMPI%COMM,IERROR) + CALL MPI_REDUCE(SurfCollNum ,SurfCollNum ,nSpecies,MPI_INTEGER,MPI_SUM,0,SurfCOMM%UNICATOR,IERROR) + CALL MPI_REDUCE(AdsorbNum ,AdsorbNum ,nSpecies,MPI_INTEGER,MPI_SUM,0,SurfCOMM%UNICATOR,IERROR) + CALL MPI_REDUCE(DesorbNum ,DesorbNum ,nSpecies,MPI_INTEGER,MPI_SUM,0,SurfCOMM%UNICATOR,IERROR) END IF #endif /*USE_MPI*/ @@ -642,8 +641,9 @@ SUBROUTINE GetPorousBCInfo() USE MOD_Globals USE MOD_SurfaceModel_Vars ,ONLY: nPorousBC USE MOD_SurfaceModel_Analyze_Vars ,ONLY: PorousBCOutput -#if USE_MPI USE MOD_Particle_MPI_Vars ,ONLY: PartMPI +#if USE_MPI +USE MOD_Particle_Boundary_Vars ,ONLY: SurfCOMM #endif /*USE_MPI*/ ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -657,15 +657,13 @@ SUBROUTINE GetPorousBCInfo() !=================================================================================================================================== #if USE_MPI IF(PartMPI%MPIRoot)THEN - CALL MPI_REDUCE(MPI_IN_PLACE , PorousBCOutput, 5*nPorousBC, MPI_DOUBLE_PRECISION, MPI_SUM, 0, PartMPI%COMM, iError) + CALL MPI_REDUCE(MPI_IN_PLACE , PorousBCOutput, 5*nPorousBC, MPI_DOUBLE_PRECISION, MPI_SUM, 0, SurfCOMM%UNICATOR, iError) ELSE - CALL MPI_REDUCE(PorousBCOutput, PorousBCOutput, 5*nPorousBC, MPI_DOUBLE_PRECISION, MPI_SUM, 0, PartMPI%COMM, iError) + CALL MPI_REDUCE(PorousBCOutput, PorousBCOutput, 5*nPorousBC, MPI_DOUBLE_PRECISION, MPI_SUM, 0, SurfCOMM%UNICATOR, iError) END IF #endif /*USE_MPI*/ -#if USE_MPI IF(PartMPI%MPIRoot)THEN -#endif /*USE_MPI*/ DO iPBC = 1, nPorousBC IF(PorousBCOutput(1,iPBC).GT.0.0)THEN ! Pumping Speed (Output(2)) is the sum of all elements (counter over particles exiting through pump) @@ -673,9 +671,7 @@ SUBROUTINE GetPorousBCInfo() PorousBCOutput(3:5,iPBC) = PorousBCOutput(3:5,iPBC) / PorousBCOutput(1,iPBC) END IF END DO -#if USE_MPI END IF -#endif /*USE_MPI*/ END SUBROUTINE GetPorousBCInfo @@ -683,13 +679,13 @@ END SUBROUTINE GetPorousBCInfo !=================================================================================================================================== !> Synchronize BoundaryParticleOutput analyze arrays !=================================================================================================================================== +#if USE_MPI SUBROUTINE SyncBoundaryParticleOutput() ! MODULES -#if USE_MPI USE MOD_Globals USE MOD_SurfaceModel_Analyze_Vars ,ONLY: BPO USE MOD_Particle_MPI_Vars ,ONLY: PartMPI -#endif /*USE_MPI*/ +USE MOD_Particle_Boundary_Vars ,ONLY: SurfCOMM ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -698,41 +694,38 @@ SUBROUTINE SyncBoundaryParticleOutput() ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -#if USE_MPI REAL :: SendBuf(1:BPO%NPartBoundaries*BPO%NSpecies) INTEGER :: SendBufSize -#endif /*USE_MPI*/ !=================================================================================================================================== -#if USE_MPI SendBufSize = BPO%NPartBoundaries*BPO%NSpecies IF(PartMPI%MPIRoot)THEN ! Map 2D array to vector for sending via MPI SendBuf = RESHAPE(BPO%RealPartOut,(/SendBufSize/)) - CALL MPI_REDUCE(MPI_IN_PLACE,SendBuf(1:SendBufSize),SendBufSize,MPI_DOUBLE_PRECISION,MPI_SUM,0,PartMPI%COMM,IERROR) + CALL MPI_REDUCE(MPI_IN_PLACE,SendBuf(1:SendBufSize),SendBufSize,MPI_DOUBLE_PRECISION,MPI_SUM,0,SurfCOMM%UNICATOR,IERROR) ! MAP vector back to 2D array BPO%RealPartOut = RESHAPE(SendBuf,(/BPO%NPartBoundaries,BPO%NSpecies/)) ELSE ! Map 2D array to vector for sending via MPI SendBuf = RESHAPE(BPO%RealPartOut,(/SendBufSize/)) - CALL MPI_REDUCE(SendBuf(1:SendBufSize),0,SendBufSize,MPI_DOUBLE_PRECISION,MPI_SUM,0,PartMPI%COMM,IERROR) - ! Reset non PartMPI%MPIRoot counters, PartMPI%MPIRoot counters are reset after writing the data to the file + CALL MPI_REDUCE(SendBuf(1:SendBufSize),0,SendBufSize,MPI_DOUBLE_PRECISION,MPI_SUM,0,SurfCOMM%UNICATOR,IERROR) + ! Reset non SurfCOMM%UNICATOR counters, SurfCOMM%UNICATOR counters are reset after writing the data to the file BPO%RealPartOut = 0. END IF -#endif /*USE_MPI*/ END SUBROUTINE SyncBoundaryParticleOutput +#endif /*USE_MPI*/ !=================================================================================================================================== !> Synchronize CalcElectronSEE analyze arrays !=================================================================================================================================== +#if USE_MPI SUBROUTINE SyncElectronSEE() ! MODULES -#if USE_MPI USE MOD_Globals USE MOD_SurfaceModel_Analyze_Vars ,ONLY: SEE USE MOD_Particle_MPI_Vars ,ONLY: PartMPI -#endif /*USE_MPI*/ +USE MOD_Particle_Boundary_Vars ,ONLY: SurfCOMM ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -742,17 +735,16 @@ SUBROUTINE SyncElectronSEE() !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES !=================================================================================================================================== -#if USE_MPI IF (PartMPI%MPIRoot) THEN - CALL MPI_REDUCE(MPI_IN_PLACE , SEE%RealElectronOut, SEE%NPartBoundaries,MPI_DOUBLE_PRECISION,MPI_SUM,0,PartMPI%COMM,IERROR) + CALL MPI_REDUCE(MPI_IN_PLACE , SEE%RealElectronOut, SEE%NPartBoundaries,MPI_DOUBLE_PRECISION,MPI_SUM,0,SurfCOMM%UNICATOR,IERROR) ELSE - CALL MPI_REDUCE(SEE%RealElectronOut , 0 , SEE%NPartBoundaries,MPI_DOUBLE_PRECISION,MPI_SUM,0,PartMPI%COMM,IERROR) + CALL MPI_REDUCE(SEE%RealElectronOut , 0 , SEE%NPartBoundaries,MPI_DOUBLE_PRECISION,MPI_SUM,0,SurfCOMM%UNICATOR,IERROR) ! Reset non PartMPI%MPIRoot counters, PartMPI%MPIRoot counters are reset after writing the data to the file SEE%RealElectronOut = 0. END IF -#endif /*USE_MPI*/ END SUBROUTINE SyncElectronSEE +#endif /*USE_MPI*/ !=================================================================================================================================== From 0f9f46c2918559b762891a0f0b8993f7432f43b0 Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Fri, 25 Aug 2023 21:17:53 +0200 Subject: [PATCH 159/495] Fix of wrong precompiler flags --- src/particles/surfacemodel/surfacemodel_analyze.f90 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/particles/surfacemodel/surfacemodel_analyze.f90 b/src/particles/surfacemodel/surfacemodel_analyze.f90 index df1615da8..f6be49250 100644 --- a/src/particles/surfacemodel/surfacemodel_analyze.f90 +++ b/src/particles/surfacemodel/surfacemodel_analyze.f90 @@ -153,12 +153,14 @@ SUBROUTINE AnalyzeSurface(Time) USE MOD_Particle_MPI_Vars ,ONLY: PartMPI USE MOD_SurfaceModel_Vars ,ONLY: nPorousBC, PorousBC USE MOD_Particle_Vars ,ONLY: nSpecies,UseNeutralization,NeutralizationBalanceGlobal,Species +#if USE_MPI +USE MOD_Particle_Boundary_Vars ,ONLY: SurfCOMM +#endif /*USE_MPI*/ #if USE_HDG USE MOD_Analyze_Vars ,ONLY: EDC USE MOD_Analyze_Vars ,ONLY: CalcElectricTimeDerivative USE MOD_HDG_Vars ,ONLY: UseBiasVoltage,BiasVoltage,BVDataLength #if USE_MPI -USE MOD_Particle_Boundary_Vars ,ONLY: SurfCOMM USE MOD_HDG ,ONLY: SynchronizeBV #endif /*USE_MPI*/ #endif /*USE_HDG*/ From fcb674c6444694c162ca67b29dbe5277250675d9 Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Sat, 26 Aug 2023 12:07:06 +0200 Subject: [PATCH 160/495] Corrected syntax in IF clause: using HDF5_VERSION without ${} --- CMakeListsLib.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeListsLib.txt b/CMakeListsLib.txt index af47b41e8..8d37578f7 100644 --- a/CMakeListsLib.txt +++ b/CMakeListsLib.txt @@ -268,7 +268,7 @@ ENDIF() # HDF5 1.14 references build directory # > https://github.com/HDFGroup/hdf5/issues/2422 -IF(${HDF5_VERSION} VERSION_EQUAL "1.14") +IF(HDF5_VERSION VERSION_EQUAL "1.14") LIST(FILTER HDF5_INCLUDE_DIR EXCLUDE REGEX "src/H5FDsubfiling") ENDIF() From adf579e8b38b09df1711971f5d069796cd62dd41 Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Sat, 26 Aug 2023 18:37:15 +0200 Subject: [PATCH 161/495] Initialize communicators with MPI_COMM_NULL and free EDC, FPC, EPC, BiasVoltage and CPP communicators during finalize --- docs/documentation/developerguide/mpi.md | 34 +++++++++-- src/analyze/analyze.f90 | 5 ++ src/analyze/analyze_vars.f90 | 15 +++-- src/equations/poisson/equation.f90 | 2 +- src/hdg/hdg.f90 | 14 ++++- src/hdg/hdg_vars.f90 | 17 +++--- .../boundary/particle_boundary_condition.f90 | 8 --- .../boundary/particle_boundary_init.f90 | 4 -- .../boundary/particle_boundary_vars.f90 | 61 ++++--------------- .../particle_mpi/particle_mpi_vars.f90 | 6 +- .../surfacemodel/surfacemodel_analyze.f90 | 4 +- 11 files changed, 79 insertions(+), 91 deletions(-) diff --git a/docs/documentation/developerguide/mpi.md b/docs/documentation/developerguide/mpi.md index 7ce6bf36e..a901be3b2 100644 --- a/docs/documentation/developerguide/mpi.md +++ b/docs/documentation/developerguide/mpi.md @@ -123,9 +123,9 @@ To limit the number of communicating processors, feature specific communicators for a communicator, which only contains processors with a local surface side (part of the `InitParticleBoundarySurfSides` routine). First, a global variable `SurfCOMM`, which is based on the `tMPIGROUP` type, is required: ``` TYPE tMPIGROUP - INTEGER :: UNICATOR !< MPI communicator for surface sides - INTEGER :: nProcs !< number of MPI processes - INTEGER :: MyRank !< MyRank, ordered from 0 to nProcs - 1 + INTEGER :: UNICATOR=MPI_COMM_NULL !< MPI communicator for surface sides + INTEGER :: nProcs !< number of MPI processes + INTEGER :: MyRank !< MyRank, ordered from 0 to nProcs - 1 END TYPE TYPE (tMPIGROUP) :: SurfCOMM ``` @@ -150,4 +150,30 @@ Through the IF clause, only processors that are part of the communicator can be ``` IF(SurfCOMM%UNICATOR.NE.MPI_COMM_NULL) CALL MPI_COMM_FREE(SurfCOMM%UNICATOR,iERROR) ``` -Otherwise load balancing might produce undefined errors that are very difficult to find. \ No newline at end of file +This works for communicators, which have been initialized with MPI_COMM_NULL, either initially during the variable definition or during the split call. +If not initialized initially, you have to make sure that the freeing call is only performed, if the respective split routine has been called to guarantee +that either a communicator exists and/or every (other) processor has been set to MPI_COMM_NULL. + +### Available communicators + +| Handle | Description | Derived from | +| ----------------------- | --------------------------- | ----------------------- | +| MPI_COMM_WORLD | Default global communicator | - | +| MPI_COMM_SHARED | | MPI_COMM_WORLD | +| MPI_COMM_NODE | | MPI_COMM_WORLD | +| MPI_COMM_LEADERS | | MPI_COMM_WORLD | +| MPI_COMM_WORKERS | | MPI_COMM_WORLD | +| MPI_COMM_LEADERS_SHARED | | MPI_COMM_WORLD | +| MPI_COMM_LEADERS_SURF | | MPI_COMM_LEADERS_SHARED | + +#### Feature-specific + +| Handle | Description | Derived from | +| ------------------------------------ | ---------------------------------------------------------------------- | -------------- | +| PartMPI%InitGroup(nInitRegions)%COMM | Emission groups | PartMPI%COMM | +| SurfCOMM%UNICATOR | Processors with a surface side (e.g. reflective), including halo sides | MPI_COMM_WORLD | +| CPPCOMM%UNICATOR | Coupled power potential | MPI_COMM_WORLD | +| EDC%COMM(iEDCBC)%UNICATOR | Electric displacement current (per BC) | MPI_COMM_WORLD | +| FPC%COMM(iUniqueFPCBC)%UNICATOR | Floating potential (per BC) | MPI_COMM_WORLD | +| EPC%COMM(iUniqueEPCBC)%UNICATOR | Electric potential (per BC) | MPI_COMM_WORLD | +| BiasVoltage%COMM%UNICATOR | Bias voltage | MPI_COMM_WORLD | \ No newline at end of file diff --git a/src/analyze/analyze.f90 b/src/analyze/analyze.f90 index c82d7d771..02718e01c 100644 --- a/src/analyze/analyze.f90 +++ b/src/analyze/analyze.f90 @@ -825,6 +825,7 @@ SUBROUTINE FinalizeAnalyze() ! Finalizes variables necessary for analyse subroutines !=================================================================================================================================== ! MODULES +USE MOD_Globals #if PP_nVar>=6 USE MOD_Analyze_Vars ,ONLY: CalcPoyntingInt USE MOD_AnalyzeField ,ONLY: FinalizePoyntingInt @@ -844,6 +845,7 @@ SUBROUTINE FinalizeAnalyze() ! OUTPUT VARIABLES !---------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES +INTEGER :: iEDCBC !=================================================================================================================================== #if PP_nVar>=6 IF(CalcPoyntingInt) CALL FinalizePoyntingInt() @@ -856,6 +858,9 @@ SUBROUTINE FinalizeAnalyze() SDEALLOCATE(EDC%FieldBoundaries) SDEALLOCATE(EDC%BCIDToEDCBCID) #if USE_MPI + DO iEDCBC = 1, EDC%NBoundaries + IF(EDC%COMM(iEDCBC)%UNICATOR.NE.MPI_COMM_NULL) CALL MPI_COMM_FREE(EDC%COMM(iEDCBC)%UNICATOR,iERROR) + END DO SDEALLOCATE(EDC%COMM) #endif /*USE_MPI*/ END IF ! CalcElectricTimeDerivative diff --git a/src/analyze/analyze_vars.f90 b/src/analyze/analyze_vars.f90 index 26b8f403e..95a63f36b 100644 --- a/src/analyze/analyze_vars.f90 +++ b/src/analyze/analyze_vars.f90 @@ -15,6 +15,9 @@ !=================================================================================================================================== MODULE MOD_Analyze_Vars ! MODULES +#if USE_MPI +USE MOD_Globals +#endif /*USE_MPI*/ ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE PUBLIC @@ -94,14 +97,10 @@ MODULE MOD_Analyze_Vars #if USE_MPI TYPE tMPIGROUP - INTEGER :: ID !< MPI communicator ID - INTEGER :: UNICATOR !< MPI communicator for electric displacement current - INTEGER :: Request !< MPI request for asynchronous communication - INTEGER :: nProcs !< number of MPI processes for particles - INTEGER :: MyRank !< MyRank of PartMPIVAR%COMM - LOGICAL :: MPIRoot !< Root, MPIRank=0 - INTEGER,ALLOCATABLE :: GroupToComm(:) !< list containing the rank in PartMPI%COMM - INTEGER,ALLOCATABLE :: CommToGroup(:) !< list containing the rank in PartMPI%COMM + INTEGER :: ID !< MPI communicator ID + INTEGER :: UNICATOR=MPI_COMM_NULL !< MPI communicator for electric displacement current + INTEGER :: nProcs !< number of MPI processes for particles + INTEGER :: MyRank !< MyRank within communicator END TYPE #endif /*USE_MPI*/ diff --git a/src/equations/poisson/equation.f90 b/src/equations/poisson/equation.f90 index d8c12a2aa..65339207a 100644 --- a/src/equations/poisson/equation.f90 +++ b/src/equations/poisson/equation.f90 @@ -377,7 +377,7 @@ SUBROUTINE InitCoupledPowerPotential() ! set communicator id CPPCOMM%ID = CPPBoundaries -! create new emission communicator for electric potential boundary condition communication. Pass MPI_INFO_NULL as rank to follow the original ordering +! create new emission communicator for coupled power potential communication. Pass MPI_INFO_NULL as rank to follow the original ordering CALL MPI_COMM_SPLIT(MPI_COMM_WORLD, color, MPI_INFO_NULL, CPPCOMM%UNICATOR, iError) ! Find my rank on the shared communicator, comm size and proc name diff --git a/src/hdg/hdg.f90 b/src/hdg/hdg.f90 index 92454b3f2..998f98825 100644 --- a/src/hdg/hdg.f90 +++ b/src/hdg/hdg.f90 @@ -3392,14 +3392,13 @@ END SUBROUTINE RestartHDG !=================================================================================================================================== SUBROUTINE FinalizeHDG() ! MODULES -USE MOD_globals +USE MOD_Globals USE MOD_HDG_Vars #if USE_PETSC USE petsc #endif #if USE_LOADBALANCE USE MOD_LoadBalance_Vars ,ONLY: PerformLoadBalance,UseH5IOLoadBalance -USE MOD_HDG_Vars ,ONLY: lambda, nGP_face USE MOD_Particle_Mesh_Vars ,ONLY: ElemInfo_Shared USE MOD_Mesh_Vars ,ONLY: nElems,offsetElem,nSides,SideToNonUniqueGlobalSide USE MOD_Mesh_Tools ,ONLY: LambdaSideToMaster,GetMasteriLocSides @@ -3416,6 +3415,9 @@ SUBROUTINE FinalizeHDG() INTEGER :: NonUniqueGlobalSideID INTEGER :: iSide #endif /*USE_LOADBALANCE*/ +#if USE_MPI +INTEGER :: iBC +#endif /*USE_MPI*/ !=================================================================================================================================== HDGInitIsDone = .FALSE. #if USE_PETSC @@ -3475,6 +3477,9 @@ SUBROUTINE FinalizeHDG() SDEALLOCATE(FPC%VoltageProc) SDEALLOCATE(FPC%ChargeProc) #if USE_MPI +DO iBC = 1, FPC%nUniqueFPCBounds + IF(FPC%COMM(iBC)%UNICATOR.NE.MPI_COMM_NULL) CALL MPI_COMM_FREE(FPC%COMM(iBC)%UNICATOR,iERROR) +END DO SDEALLOCATE(FPC%COMM) #endif /*USE_MPI*/ @@ -3498,7 +3503,12 @@ SUBROUTINE FinalizeHDG() SDEALLOCATE(EPC%VoltageProc) SDEALLOCATE(EPC%ChargeProc) #if USE_MPI +DO iBC = 1, EPC%nUniqueEPCBounds + IF(EPC%COMM(iBC)%UNICATOR.NE.MPI_COMM_NULL) CALL MPI_COMM_FREE(EPC%COMM(iBC)%UNICATOR,iERROR) +END DO SDEALLOCATE(EPC%COMM) +IF(BiasVoltage%COMM%UNICATOR.NE.MPI_COMM_NULL) CALL MPI_COMM_FREE(BiasVoltage%COMM%UNICATOR,iERROR) +IF(CPPCOMM%UNICATOR.NE.MPI_COMM_NULL) CALL MPI_COMM_FREE(CPPCOMM%UNICATOR,iERROR) #endif /*USE_MPI*/ #if USE_LOADBALANCE diff --git a/src/hdg/hdg_vars.f90 b/src/hdg/hdg_vars.f90 index 1c1d83384..b0385b5ea 100644 --- a/src/hdg/hdg_vars.f90 +++ b/src/hdg/hdg_vars.f90 @@ -19,6 +19,9 @@ !=================================================================================================================================== MODULE MOD_HDG_Vars ! MODULES +#if USE_MPI +USE MOD_Globals +#endif /*USE_MPI*/ #if USE_PETSC USE PETSc #endif @@ -161,15 +164,11 @@ MODULE MOD_HDG_Vars #if USE_MPI TYPE tMPIGROUP - INTEGER :: ID !< MPI communicator ID - INTEGER :: UNICATOR !< MPI communicator for floating boundary condition - INTEGER :: Request !< MPI request for asynchronous communication - INTEGER :: nProcs !< number of MPI processes part of the FPC group - INTEGER :: nProcsWithSides !< number of MPI processes part of the FPC group and actual FPC sides - INTEGER :: MyRank !< MyRank of PartMPIVAR%COMM - LOGICAL :: MPIRoot !< Root, MPIRank=0 - INTEGER,ALLOCATABLE :: GroupToComm(:) !< list containing the rank in PartMPI%COMM - INTEGER,ALLOCATABLE :: CommToGroup(:) !< list containing the rank in PartMPI%COMM + INTEGER :: ID !< MPI communicator ID + INTEGER :: UNICATOR=MPI_COMM_NULL !< MPI communicator for floating boundary condition + INTEGER :: nProcs !< number of MPI processes part of the FPC group + INTEGER :: nProcsWithSides !< number of MPI processes part of the FPC group and actual FPC sides + INTEGER :: MyRank !< MyRank within communicator END TYPE #endif /*USE_MPI*/ diff --git a/src/particles/boundary/particle_boundary_condition.f90 b/src/particles/boundary/particle_boundary_condition.f90 index 6cc95575b..4ecf777a3 100644 --- a/src/particles/boundary/particle_boundary_condition.f90 +++ b/src/particles/boundary/particle_boundary_condition.f90 @@ -153,14 +153,6 @@ SUBROUTINE GetBoundaryInteraction(iPart,SideID,flip,ElemID,crossedBC,TriNum,IsIn !----------------------------------------------------------------------------------------------------------------------------------- CALL PeriodicBoundary(iPart,SideID,ElemID) !----------------------------------------------------------------------------------------------------------------------------------- - CASE(4) ! PartBound%SimpleAnodeBC - !----------------------------------------------------------------------------------------------------------------------------------- - CALL abort(__STAMP__,' ERROR: PartBound not associated!. (PartBound%SimpleAnodeBC)') - !----------------------------------------------------------------------------------------------------------------------------------- - CASE(5) ! PartBound%SimpleCathodeBC - !----------------------------------------------------------------------------------------------------------------------------------- - CALL abort(__STAMP__,' ERROR: PartBound not associated!. (PartBound%SimpleCathodeBC)') - !----------------------------------------------------------------------------------------------------------------------------------- CASE(6) ! PartBound%RotPeriodicBC !----------------------------------------------------------------------------------------------------------------------------------- CALL RotPeriodicBoundary(iPart,SideID,ElemID) diff --git a/src/particles/boundary/particle_boundary_init.f90 b/src/particles/boundary/particle_boundary_init.f90 index 8b4f37cce..89a39c4dc 100644 --- a/src/particles/boundary/particle_boundary_init.f90 +++ b/src/particles/boundary/particle_boundary_init.f90 @@ -435,10 +435,6 @@ SUBROUTINE InitializeVariablesPartBoundary() CASE('periodic') PartBound%TargetBoundCond(iPartBound) = PartBound%PeriodicBC PartMeshHasPeriodicBCs = .TRUE. - CASE('simple_anode') - PartBound%TargetBoundCond(iPartBound) = PartBound%SimpleAnodeBC - CASE('simple_cathode') - PartBound%TargetBoundCond(iPartBound) = PartBound%SimpleCathodeBC CASE('symmetric') #if defined(IMPA) || defined(ROS) PartMeshHasReflectiveBCs=.TRUE. diff --git a/src/particles/boundary/particle_boundary_vars.f90 b/src/particles/boundary/particle_boundary_vars.f90 index 5ad22e8c3..84f2f04ca 100644 --- a/src/particles/boundary/particle_boundary_vars.f90 +++ b/src/particles/boundary/particle_boundary_vars.f90 @@ -17,6 +17,7 @@ MODULE MOD_Particle_Boundary_Vars !=================================================================================================================================== ! MODULES #if USE_MPI +USE MOD_Globals USE mpi #endif /*USE_MPI*/ ! IMPLICIT VARIABLE HANDLING @@ -155,62 +156,23 @@ MODULE MOD_Particle_Boundary_Vars REAL,ALLOCATABLE :: XiEQ_SurfSample(:) ! position of XiEQ_SurfSample REAL :: dXiEQ_SurfSample ! deltaXi in [-1,1] INTEGER :: OffSetSurfSide ! offset of local surf side -INTEGER :: OffSetInnerSurfSide ! offset of local inner surf side INTEGER :: nSurfBC ! number of surface side BCs CHARACTER(LEN=255),ALLOCATABLE :: SurfBCName(:) ! names of belonging surface BC #if USE_MPI -INTEGER,ALLOCATABLE :: OffSetSurfSideMPI(:) ! integer offset for particle boundary sampling -INTEGER,ALLOCATABLE :: OffSetInnerSurfSideMPI(:) ! integer offset for particle boundary sampling (innerBC) INTEGER :: nComputeNodeInnerBCs(2) ! Number of inner BCs with a larger global side ID on node #endif /*USE_MPI*/ -#if USE_MPI -TYPE tSurfaceSendList - INTEGER :: NativeProcID - INTEGER,ALLOCATABLE :: SendList(:) ! list containing surfsideid of sides to send to proc - INTEGER,ALLOCATABLE :: RecvList(:) ! list containing surfsideid of sides to recv from proc - - INTEGER,ALLOCATABLE :: SurfDistSendList(:) ! list containing surfsideid of sides to send to proc - INTEGER,ALLOCATABLE :: SurfDistRecvList(:) ! list containing surfsideid of sides to recv from proc - INTEGER,ALLOCATABLE :: H2OSendList(:) ! list containing surfsideid of sides to send to proc - INTEGER,ALLOCATABLE :: H2ORecvList(:) ! list containing surfsideid of sides to recv from proc - INTEGER,ALLOCATABLE :: O2HSendList(:) ! list containing surfsideid of sides to send to proc - INTEGER,ALLOCATABLE :: O2HRecvList(:) ! list containing surfsideid of sides to recv from proc - -END TYPE -#endif /*USE_MPI*/ - #if USE_MPI TYPE tMPIGROUP - INTEGER :: UNICATOR !< MPI communicator for surface sides (including sides inside the halo region) - INTEGER :: nProcs !< number of MPI processes for particles - INTEGER :: MyRank !< MyRank of PartMPIVAR%COMM + INTEGER :: UNICATOR=MPI_COMM_NULL !< MPI communicator for surface sides (including sides inside the halo region) + INTEGER :: nProcs !< number of MPI processes for particles + INTEGER :: MyRank !< MyRank within communicator END TYPE TYPE (tMPIGROUP) :: SurfCOMM #endif /*USE_MPI*/ - -TYPE tSurfaceMesh - INTEGER :: SampSize ! integer of sampsize - INTEGER :: ReactiveSampSize ! additional sample size on the surface due to use of - ! reactive surface modelling (reactions, liquid, etc.) - LOGICAL :: SurfOnProc ! flag if reflective boundary condition is on proc - INTEGER :: nSides ! Number of Sides on Surface (reflective) - INTEGER :: nBCSides ! Number of OuterSides with Surface (reflective) properties - INTEGER :: nInnerSides ! Number of InnerSides with Surface (reflective) properties - INTEGER :: nOutputSides ! Number of surfaces that are assigned to an MPI rank for - ! surface sampling (MacroSurfaceVal and MacroSurfaceSpecVal) - ! and output to .h5 (SurfData) purposes: - ! nOutputSides = bcsides + maser_innersides - !INTEGER :: nTotalSides ! Number of Sides on Surface incl. HALO sides - INTEGER :: nGlobalSides ! Global number of Sides on Surfaces (reflective) - INTEGER,ALLOCATABLE :: SideIDToSurfID(:) ! Mapping of side ID to surface side ID (reflective) - REAL, ALLOCATABLE :: SurfaceArea(:,:,:) ! Area of Surface - INTEGER,ALLOCATABLE :: SurfIDToSideID(:) ! Mapping of surface side ID (reflective) to side ID - INTEGER,ALLOCATABLE :: innerBCSideToHaloMap(:) ! map of inner BC ID on slave side to corresp. HaloSide -END TYPE - -TYPE (tSurfaceMesh) :: SurfMesh - +!----------------------------------------------------------------------------------------------------------------------------------- +! Porous BC +!----------------------------------------------------------------------------------------------------------------------------------- INTEGER :: nPorousSides ! Number of porous sides per compute node INTEGER,ALLOCPOINT :: MapSurfSideToPorousSide_Shared(:) ! Mapping of surface side to porous side INTEGER,ALLOCPOINT :: PorousBCInfo_Shared(:,:) ! Info and mappings for porous BCs [1:3,1:nPorousSides] @@ -236,13 +198,13 @@ MODULE MOD_Particle_Boundary_Vars ! REAL variable since the particle weight is used ! 1: Impinging particles ! 2: Deleted particles - +!----------------------------------------------------------------------------------------------------------------------------------- +! Particle Boundary +!----------------------------------------------------------------------------------------------------------------------------------- TYPE tPartBoundary INTEGER :: OpenBC = 1 ! = 1 (s.u.) Boundary Condition Integer Definition INTEGER :: ReflectiveBC = 2 ! = 2 (s.u.) Boundary Condition Integer Definition INTEGER :: PeriodicBC = 3 ! = 3 (s.u.) Boundary Condition Integer Definition - INTEGER :: SimpleAnodeBC = 4 ! = 4 (s.u.) Boundary Condition Integer Definition - INTEGER :: SimpleCathodeBC = 5 ! = 5 (s.u.) Boundary Condition Integer Definition INTEGER :: RotPeriodicBC = 6 ! = 6 (s.u.) Boundary Condition Integer Definition INTEGER :: RotPeriodicInterPlaneBC = 7 ! = 7 (s.u.) Boundary Condition Integer Definition INTEGER :: SymmetryBC = 10 ! = 10 (s.u.) Boundary Condition Integer Definition @@ -316,8 +278,9 @@ MODULE MOD_Particle_Boundary_Vars INTEGER :: nPartBound ! number of particle boundaries TYPE(tPartBoundary) :: PartBound ! Boundary Data for Particles - +!----------------------------------------------------------------------------------------------------------------------------------- ! Boundary particle output +!----------------------------------------------------------------------------------------------------------------------------------- LOGICAL :: DoBoundaryParticleOutputHDF5 ! Flag set automatically if particles crossing specific ! ! boundaries are to be saved to .h5 (position of intersection, ! ! velocity, species, internal energies) diff --git a/src/particles/particle_mpi/particle_mpi_vars.f90 b/src/particles/particle_mpi/particle_mpi_vars.f90 index 0d0603107..0804ad34d 100644 --- a/src/particles/particle_mpi/particle_mpi_vars.f90 +++ b/src/particles/particle_mpi/particle_mpi_vars.f90 @@ -17,7 +17,7 @@ MODULE MOD_Particle_MPI_Vars ! Contains global variables provided by the particle surfaces routines !=================================================================================================================================== ! MODULES -!USE mpi +USE MOD_Globals ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE PUBLIC @@ -35,7 +35,7 @@ MODULE MOD_Particle_MPI_Vars LOGICAL :: AbortExchangeProcs ! Terminate run if proc communication is non-symmetric TYPE tPartMPIGROUP - INTEGER :: COMM ! MPI communicator for PIC GTS region + INTEGER :: COMM=MPI_COMM_NULL ! MPI communicator for PIC GTS region INTEGER :: Request ! MPI request for asynchronous communication INTEGER :: nProcs ! number of MPI processes for particles INTEGER :: MyRank ! MyRank of PartMPIVAR%COMM @@ -63,7 +63,7 @@ MODULE MOD_Particle_MPI_Vars TYPE(tPartMPIConnect) , ALLOCATABLE :: DepoBGMConnect(:) ! MPI connect for each process #endif /*USE_MPI*/ TYPE(tPartMPIGROUP),ALLOCATABLE :: InitGroup(:) ! small communicator for initialization - INTEGER :: COMM ! MPI communicator for PIC GTS region + INTEGER :: COMM=MPI_COMM_NULL ! MPI communicator for PIC GTS region INTEGER :: nProcs ! number of MPI processes for particles INTEGER :: MyRank ! MyRank of PartMPIVAR%COMM LOGICAL :: MPIRoot ! Root, MPIRank=0 diff --git a/src/particles/surfacemodel/surfacemodel_analyze.f90 b/src/particles/surfacemodel/surfacemodel_analyze.f90 index f6be49250..8f3c4fea8 100644 --- a/src/particles/surfacemodel/surfacemodel_analyze.f90 +++ b/src/particles/surfacemodel/surfacemodel_analyze.f90 @@ -149,7 +149,7 @@ SUBROUTINE AnalyzeSurface(Time) USE MOD_Analyze_Vars ,ONLY: DoSurfModelAnalyze USE MOD_SurfaceModel_Analyze_Vars USE MOD_Restart_Vars ,ONLY: DoRestart -USE MOD_Particle_Boundary_Vars ,ONLY: nComputeNodeSurfSides,PartBound +USE MOD_Particle_Boundary_Vars ,ONLY: PartBound USE MOD_Particle_MPI_Vars ,ONLY: PartMPI USE MOD_SurfaceModel_Vars ,ONLY: nPorousBC, PorousBC USE MOD_Particle_Vars ,ONLY: nSpecies,UseNeutralization,NeutralizationBalanceGlobal,Species @@ -849,8 +849,6 @@ SUBROUTINE InitBoundaryParticleOutput() ' OpenBC = 1 \n'//& ' ReflectiveBC = 2 \n'//& ' PeriodicBC = 3 \n'//& - ' SimpleAnodeBC = 4 \n'//& - ' SimpleCathodeBC = 5 \n'//& ' RotPeriodicBC = 6 \n'//& ' SymmetryBC = 10 \n'//& ' SymmetryAxis = 11 ' From d886330a28839a7cdea114c96a35cd6459c9d73c Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Sun, 27 Aug 2023 15:04:44 +0200 Subject: [PATCH 162/495] Included open BCs in new communicator as well, bugfixes --- docs/documentation/developerguide/mpi.md | 18 ++++++------ src/hdg/hdg.f90 | 2 ++ src/io_hdf5/hdf5_output_state.f90 | 3 +- .../boundary/particle_boundary_init.f90 | 11 ++++--- src/particles/dsmc/dsmc_vars.f90 | 3 -- .../particle_mpi_boundary_sampling.f90 | 2 +- .../particle_mpi/particle_mpi_vars.f90 | 19 ++---------- .../surfacemodel/surfacemodel_analyze.f90 | 29 ++++++++----------- .../surfacemodel/surfacemodel_main.f90 | 2 +- 9 files changed, 37 insertions(+), 52 deletions(-) diff --git a/docs/documentation/developerguide/mpi.md b/docs/documentation/developerguide/mpi.md index a901be3b2..d8fed88c4 100644 --- a/docs/documentation/developerguide/mpi.md +++ b/docs/documentation/developerguide/mpi.md @@ -156,15 +156,15 @@ that either a communicator exists and/or every (other) processor has been set to ### Available communicators -| Handle | Description | Derived from | -| ----------------------- | --------------------------- | ----------------------- | -| MPI_COMM_WORLD | Default global communicator | - | -| MPI_COMM_SHARED | | MPI_COMM_WORLD | -| MPI_COMM_NODE | | MPI_COMM_WORLD | -| MPI_COMM_LEADERS | | MPI_COMM_WORLD | -| MPI_COMM_WORKERS | | MPI_COMM_WORLD | -| MPI_COMM_LEADERS_SHARED | | MPI_COMM_WORLD | -| MPI_COMM_LEADERS_SURF | | MPI_COMM_LEADERS_SHARED | +| Handle | Description | Derived from | +| ----------------------- | --------------------------------------------- | ----------------------- | +| MPI_COMM_WORLD | Default global communicator | - | +| MPI_COMM_NODE | Processors on a node | MPI_COMM_WORLD | +| MPI_COMM_LEADERS | Group of node leaders | MPI_COMM_WORLD | +| MPI_COMM_WORKERS | All remaining processors, who are not leaders | MPI_COMM_WORLD | +| MPI_COMM_SHARED | Processors on a node | MPI_COMM_WORLD | +| MPI_COMM_LEADERS_SHARED | Group of node leaders (myComputeNodeRank = 0) | MPI_COMM_WORLD | +| MPI_COMM_LEADERS_SURF | Node leaders with surface sides | MPI_COMM_LEADERS_SHARED | #### Feature-specific diff --git a/src/hdg/hdg.f90 b/src/hdg/hdg.f90 index 998f98825..bd1533612 100644 --- a/src/hdg/hdg.f90 +++ b/src/hdg/hdg.f90 @@ -3507,8 +3507,10 @@ SUBROUTINE FinalizeHDG() IF(EPC%COMM(iBC)%UNICATOR.NE.MPI_COMM_NULL) CALL MPI_COMM_FREE(EPC%COMM(iBC)%UNICATOR,iERROR) END DO SDEALLOCATE(EPC%COMM) +#if defined(PARTICLES) IF(BiasVoltage%COMM%UNICATOR.NE.MPI_COMM_NULL) CALL MPI_COMM_FREE(BiasVoltage%COMM%UNICATOR,iERROR) IF(CPPCOMM%UNICATOR.NE.MPI_COMM_NULL) CALL MPI_COMM_FREE(CPPCOMM%UNICATOR,iERROR) +#endif /*defined(PARTICLES)*/ #endif /*USE_MPI*/ #if USE_LOADBALANCE diff --git a/src/io_hdf5/hdf5_output_state.f90 b/src/io_hdf5/hdf5_output_state.f90 index 76a77c3d9..544b15a6a 100644 --- a/src/io_hdf5/hdf5_output_state.f90 +++ b/src/io_hdf5/hdf5_output_state.f90 @@ -170,8 +170,9 @@ SUBROUTINE WriteStateToHDF5(MeshFileName,OutputTime,PreviousTime) INTEGER :: SortedOffset,SortedStart,SortedEnd #ifdef PARTICLES INTEGER :: i,j,k,iElem +REAL,ALLOCATABLE :: BVDataHDF5(:,:) #endif /*PARTICLES*/ -REAL,ALLOCATABLE :: FPCDataHDF5(:,:),EPCDataHDF5(:,:),BVDataHDF5(:,:) +REAL,ALLOCATABLE :: FPCDataHDF5(:,:),EPCDataHDF5(:,:) INTEGER :: nVarFPC,nVarEPC #endif /*USE_HDG*/ !=================================================================================================================================== diff --git a/src/particles/boundary/particle_boundary_init.f90 b/src/particles/boundary/particle_boundary_init.f90 index 89a39c4dc..4abe6f977 100644 --- a/src/particles/boundary/particle_boundary_init.f90 +++ b/src/particles/boundary/particle_boundary_init.f90 @@ -601,7 +601,7 @@ SUBROUTINE InitParticleBoundarySurfSides() !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES INTEGER :: iSide,firstSide,lastSide,iSurfSide,GlobalSideID -INTEGER :: nSurfSidesProc +INTEGER :: nSurfSidesProc, nBCSidesProc INTEGER :: offsetSurfTotalSidesProc INTEGER,ALLOCATABLE :: GlobalSide2SurfSideProc(:,:) #if USE_MPI @@ -650,6 +650,7 @@ SUBROUTINE InitParticleBoundarySurfSides() GlobalSide2SurfSideProc = -1 nComputeNodeSurfSides = 0 +nBCSidesProc = 0 nSurfSidesProc = 0 ! check every BC side @@ -662,6 +663,8 @@ SUBROUTINE InitParticleBoundarySurfSides() IF (ElemInfo_Shared(ELEM_HALOFLAG,SideInfo_Shared(SIDE_ELEMID,iSide)).EQ.0) CYCLE #endif /*USE_MPI*/ + nBCSidesProc = nBCSidesProc + 1 + ! count number of reflective and rotationally periodic BC sides IF ((PartBound%TargetBoundCond(PartBound%MapToPartBC(SideInfo_Shared(SIDE_BCID,iSide))).EQ.PartBound%ReflectiveBC) .OR. & (PartBound%TargetBoundCond(PartBound%MapToPartBC(SideInfo_Shared(SIDE_BCID,iSide))).EQ.PartBound%RotPeriodicBC).OR. & @@ -849,14 +852,14 @@ SUBROUTINE InitParticleBoundarySurfSides() ! free temporary arrays DEALLOCATE(GlobalSide2SurfSideProc) -! create a communicator between processors with a surface side (including sides in the halo region) +! create a communicator between processors with a BC side (including open BCs and sides in the halo region) #if USE_MPI ! Set the control of subset assignment (nonnegative integer). Processes with the same color are in the same new communicator. ! Make sure to include the root IF(MPIRoot) THEN color = 1337 ELSE - color = MERGE(1337, MPI_UNDEFINED, nSurfSidesProc.GT.0) + color = MERGE(1337, MPI_UNDEFINED, nBCSidesProc.GT.0) END IF ! Create new surface communicator. Pass MPI_INFO_NULL as rank to follow the original ordering CALL MPI_COMM_SPLIT(MPI_COMM_WORLD, color, MPI_INFO_NULL, SurfCOMM%UNICATOR, iError) @@ -866,7 +869,7 @@ SUBROUTINE InitParticleBoundarySurfSides() CALL MPI_COMM_SIZE(SurfCOMM%UNICATOR, SurfCOMM%nProcs, iError) ! inform about size of emission communicator LBWRITE(UNIT_StdOut,'(A,I0,A)') ' Surface sides: Communicator on ', SurfCOMM%nProcs,' procs' -END IF ! nSurfSidesProc.GT.0 +END IF ! nBCSidesProc.GT.0 #endif /*USE_MPI*/ LBWRITE(UNIT_stdOut,'(A)') ' INIT SURFACE SIDES DONE!' diff --git a/src/particles/dsmc/dsmc_vars.f90 b/src/particles/dsmc/dsmc_vars.f90 index 3b1ae16ef..990d8bc30 100644 --- a/src/particles/dsmc/dsmc_vars.f90 +++ b/src/particles/dsmc/dsmc_vars.f90 @@ -15,9 +15,6 @@ MODULE MOD_DSMC_Vars ! Contains the DSMC variables !=================================================================================================================================== ! MODULES -#if USE_MPI -USE MOD_Particle_MPI_Vars, ONLY: tPartMPIConnect -#endif ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE PUBLIC diff --git a/src/particles/particle_mpi/particle_mpi_boundary_sampling.f90 b/src/particles/particle_mpi/particle_mpi_boundary_sampling.f90 index 4d38fb90b..9f6fe8ddd 100644 --- a/src/particles/particle_mpi/particle_mpi_boundary_sampling.f90 +++ b/src/particles/particle_mpi/particle_mpi_boundary_sampling.f90 @@ -208,7 +208,7 @@ SUBROUTINE InitSurfCommunication() !--- Split communicator from MPI_COMM_LEADER_SHARED color = MERGE(1201,MPI_UNDEFINED,SurfOnNode) -! create new SurfMesh communicator for SurfMesh communication. Pass MPI_INFO_NULL as rank to follow the original ordering +! create new communicator between node leaders with surfaces. Pass MPI_INFO_NULL as rank to follow the original ordering CALL MPI_COMM_SPLIT(MPI_COMM_LEADERS_SHARED, color, MPI_INFO_NULL, MPI_COMM_LEADERS_SURF, IERROR) ! Do not participate in remainder of communication if no surf sides on node diff --git a/src/particles/particle_mpi/particle_mpi_vars.f90 b/src/particles/particle_mpi/particle_mpi_vars.f90 index 0804ad34d..87ab59a48 100644 --- a/src/particles/particle_mpi/particle_mpi_vars.f90 +++ b/src/particles/particle_mpi/particle_mpi_vars.f90 @@ -35,7 +35,9 @@ MODULE MOD_Particle_MPI_Vars LOGICAL :: AbortExchangeProcs ! Terminate run if proc communication is non-symmetric TYPE tPartMPIGROUP +#if USE_MPI INTEGER :: COMM=MPI_COMM_NULL ! MPI communicator for PIC GTS region +#endif /*USE_MPI*/ INTEGER :: Request ! MPI request for asynchronous communication INTEGER :: nProcs ! number of MPI processes for particles INTEGER :: MyRank ! MyRank of PartMPIVAR%COMM @@ -44,26 +46,11 @@ MODULE MOD_Particle_MPI_Vars INTEGER,ALLOCATABLE :: CommToGroup(:) ! list containing the rank in PartMPI%COMM END TYPE -TYPE tPeriodicPtr - INTEGER , ALLOCATABLE :: BGMPeriodicBorder(:,:) ! indices of periodic border nodes -END TYPE - -#if USE_MPI -TYPE tPartMPIConnect - TYPE(tPeriodicPtr) , ALLOCATABLE :: Periodic(:) ! data for different periodic borders for process - LOGICAL :: isBGMNeighbor ! Flag: which process is neighber wrt. bckgrnd mesh - LOGICAL :: isBGMPeriodicNeighbor ! Flag: which process is neighber wrt. bckgrnd mesh - INTEGER , ALLOCATABLE :: BGMBorder(:,:) ! indices of border nodes (1=min 2=max,xyz) - INTEGER :: BGMPeriodicBorderCount ! Number(#) of overlapping areas due to periodic bc -END TYPE -#endif /*USE_MPI*/ - TYPE tPartMPIVAR #if USE_MPI - TYPE(tPartMPIConnect) , ALLOCATABLE :: DepoBGMConnect(:) ! MPI connect for each process + INTEGER :: COMM=MPI_COMM_NULL ! MPI communicator for PIC GTS region #endif /*USE_MPI*/ TYPE(tPartMPIGROUP),ALLOCATABLE :: InitGroup(:) ! small communicator for initialization - INTEGER :: COMM=MPI_COMM_NULL ! MPI communicator for PIC GTS region INTEGER :: nProcs ! number of MPI processes for particles INTEGER :: MyRank ! MyRank of PartMPIVAR%COMM LOGICAL :: MPIRoot ! Root, MPIRank=0 diff --git a/src/particles/surfacemodel/surfacemodel_analyze.f90 b/src/particles/surfacemodel/surfacemodel_analyze.f90 index 8f3c4fea8..3e6e20134 100644 --- a/src/particles/surfacemodel/surfacemodel_analyze.f90 +++ b/src/particles/surfacemodel/surfacemodel_analyze.f90 @@ -150,7 +150,6 @@ SUBROUTINE AnalyzeSurface(Time) USE MOD_SurfaceModel_Analyze_Vars USE MOD_Restart_Vars ,ONLY: DoRestart USE MOD_Particle_Boundary_Vars ,ONLY: PartBound -USE MOD_Particle_MPI_Vars ,ONLY: PartMPI USE MOD_SurfaceModel_Vars ,ONLY: nPorousBC, PorousBC USE MOD_Particle_Vars ,ONLY: nSpecies,UseNeutralization,NeutralizationBalanceGlobal,Species #if USE_MPI @@ -193,7 +192,7 @@ SUBROUTINE AnalyzeSurface(Time) SurfModelAnalyzeSampleTime = Time - SurfModelAnalyzeSampleTime ! Set SurfModelAnalyzeSampleTime=Time at the end of this routine OutputCounter = 2 unit_index = 636 -IF(PartMPI%MPIRoot)THEN +IF(MPIRoot)THEN INQUIRE(UNIT = unit_index , OPENED = isOpen) IF(.NOT.isOpen)THEN outfile = 'SurfaceAnalyze.csv' @@ -288,7 +287,7 @@ SUBROUTINE AnalyzeSurface(Time) ! Output Analyzed variables !=================================================================================================================================== #if USE_MPI -IF(PartMPI%MPIRoot)THEN +IF(MPIRoot)THEN #endif /*USE_MPI*/ WRITE(unit_index,'(E23.16E3)',ADVANCE='NO') Time IF(CalcSurfCollCounter)THEN @@ -416,8 +415,8 @@ SUBROUTINE AnalyzeSurface(Time) ! Reset BPO containers DO iPartBound = 1, BPO%NPartBoundaries DO iSpec = 1, BPO%NSpecies - ! Reset PartMPI%MPIRoot counters after writing the data to the file, - ! non-PartMPI%MPIRoot are reset in SyncBoundaryParticleOutput() + ! Reset MPIRoot counters after writing the data to the file, + ! non-MPIRoot are reset in SyncBoundaryParticleOutput() BPO%RealPartOut(iPartBound,iSpec) = 0. END DO ! iSpec = 1, BPO%NSpecies END DO ! iPartBound = 1, BPO%NPartBoundaries @@ -432,8 +431,8 @@ SUBROUTINE AnalyzeSurface(Time) ELSE CALL WriteDataInfo(unit_index,RealScalar=SEE%RealElectronOut(iPartBound)/SurfModelAnalyzeSampleTime) END IF ! ABS(SurfModelAnalyzeSampleTime).LE.0.0 - ! Reset PartMPI%MPIRoot counters after writing the data to the file, - ! non-PartMPI%MPIRoot are reset in SyncBoundaryParticleOutput() + ! Reset MPIRoot counters after writing the data to the file, + ! non-MPIRoot are reset in SyncBoundaryParticleOutput() SEE%RealElectronOut(iPartBound) = 0. END DO ! iPartBound = 1, SEE%NPartBoundaries END IF ! CalcElectronSEE @@ -594,7 +593,6 @@ SUBROUTINE GetCollCounter(SurfCollNum,AdsorbNum, DesorbNum) USE MOD_Particle_Vars ,ONLY: nSpecies USE MOD_SurfaceModel_Analyze_Vars ,ONLY: SurfAnalyzeCount, SurfAnalyzeNumOfAds, SurfAnalyzeNumOfDes #if USE_MPI -USE MOD_Particle_MPI_Vars ,ONLY: PartMPI USE MOD_Particle_Boundary_Vars ,ONLY: SurfCOMM #endif /*USE_MPI*/ ! IMPLICIT VARIABLE HANDLING @@ -616,7 +614,7 @@ SUBROUTINE GetCollCounter(SurfCollNum,AdsorbNum, DesorbNum) END DO #if USE_MPI -IF(PartMPI%MPIRoot)THEN +IF(MPIRoot)THEN CALL MPI_REDUCE(MPI_IN_PLACE,SurfCollNum ,nSpecies,MPI_INTEGER,MPI_SUM,0,SurfCOMM%UNICATOR,IERROR) CALL MPI_REDUCE(MPI_IN_PLACE,AdsorbNum ,nSpecies,MPI_INTEGER,MPI_SUM,0,SurfCOMM%UNICATOR,IERROR) CALL MPI_REDUCE(MPI_IN_PLACE,DesorbNum ,nSpecies,MPI_INTEGER,MPI_SUM,0,SurfCOMM%UNICATOR,IERROR) @@ -643,7 +641,6 @@ SUBROUTINE GetPorousBCInfo() USE MOD_Globals USE MOD_SurfaceModel_Vars ,ONLY: nPorousBC USE MOD_SurfaceModel_Analyze_Vars ,ONLY: PorousBCOutput -USE MOD_Particle_MPI_Vars ,ONLY: PartMPI #if USE_MPI USE MOD_Particle_Boundary_Vars ,ONLY: SurfCOMM #endif /*USE_MPI*/ @@ -658,14 +655,14 @@ SUBROUTINE GetPorousBCInfo() INTEGER :: iPBC !=================================================================================================================================== #if USE_MPI -IF(PartMPI%MPIRoot)THEN +IF(MPIRoot)THEN CALL MPI_REDUCE(MPI_IN_PLACE , PorousBCOutput, 5*nPorousBC, MPI_DOUBLE_PRECISION, MPI_SUM, 0, SurfCOMM%UNICATOR, iError) ELSE CALL MPI_REDUCE(PorousBCOutput, PorousBCOutput, 5*nPorousBC, MPI_DOUBLE_PRECISION, MPI_SUM, 0, SurfCOMM%UNICATOR, iError) END IF #endif /*USE_MPI*/ -IF(PartMPI%MPIRoot)THEN +IF(MPIRoot)THEN DO iPBC = 1, nPorousBC IF(PorousBCOutput(1,iPBC).GT.0.0)THEN ! Pumping Speed (Output(2)) is the sum of all elements (counter over particles exiting through pump) @@ -686,7 +683,6 @@ SUBROUTINE SyncBoundaryParticleOutput() ! MODULES USE MOD_Globals USE MOD_SurfaceModel_Analyze_Vars ,ONLY: BPO -USE MOD_Particle_MPI_Vars ,ONLY: PartMPI USE MOD_Particle_Boundary_Vars ,ONLY: SurfCOMM ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -700,7 +696,7 @@ SUBROUTINE SyncBoundaryParticleOutput() INTEGER :: SendBufSize !=================================================================================================================================== SendBufSize = BPO%NPartBoundaries*BPO%NSpecies -IF(PartMPI%MPIRoot)THEN +IF(MPIRoot)THEN ! Map 2D array to vector for sending via MPI SendBuf = RESHAPE(BPO%RealPartOut,(/SendBufSize/)) CALL MPI_REDUCE(MPI_IN_PLACE,SendBuf(1:SendBufSize),SendBufSize,MPI_DOUBLE_PRECISION,MPI_SUM,0,SurfCOMM%UNICATOR,IERROR) @@ -726,7 +722,6 @@ SUBROUTINE SyncElectronSEE() ! MODULES USE MOD_Globals USE MOD_SurfaceModel_Analyze_Vars ,ONLY: SEE -USE MOD_Particle_MPI_Vars ,ONLY: PartMPI USE MOD_Particle_Boundary_Vars ,ONLY: SurfCOMM ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -737,11 +732,11 @@ SUBROUTINE SyncElectronSEE() !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES !=================================================================================================================================== -IF (PartMPI%MPIRoot) THEN +IF (MPIRoot) THEN CALL MPI_REDUCE(MPI_IN_PLACE , SEE%RealElectronOut, SEE%NPartBoundaries,MPI_DOUBLE_PRECISION,MPI_SUM,0,SurfCOMM%UNICATOR,IERROR) ELSE CALL MPI_REDUCE(SEE%RealElectronOut , 0 , SEE%NPartBoundaries,MPI_DOUBLE_PRECISION,MPI_SUM,0,SurfCOMM%UNICATOR,IERROR) - ! Reset non PartMPI%MPIRoot counters, PartMPI%MPIRoot counters are reset after writing the data to the file + ! Reset non MPIRoot counters, MPIRoot counters are reset after writing the data to the file SEE%RealElectronOut = 0. END IF diff --git a/src/particles/surfacemodel/surfacemodel_main.f90 b/src/particles/surfacemodel/surfacemodel_main.f90 index 9f06c8796..d84406800 100644 --- a/src/particles/surfacemodel/surfacemodel_main.f90 +++ b/src/particles/surfacemodel/surfacemodel_main.f90 @@ -919,7 +919,7 @@ SUBROUTINE StickingCoefficientModel(PartID,SideID,n_Loc) IF(ParticleSticks) THEN ! Remove the particle from the simulation (total energy was added to the sampled heat flux before the interaction) - CALL RemoveParticle(PartID) + CALL RemoveParticle(PartID,BCID=locBCID) ELSE ! Perform regular Maxwell scattering CALL MaxwellScattering(PartID,SideID,n_Loc) From 291b9d088298411131d6ddc0d2df1a91ce469c8c Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Tue, 29 Aug 2023 01:38:23 +0200 Subject: [PATCH 163/495] Looping over nBCSides to build communicator; Added comparison of electric current at the exit of the thermionic emission test case --- .../PartAnalyze_ref.csv | 25 +++++++++------- .../SurfaceAnalyze_ref.csv | 17 +++++++++++ .../analyze.ini | 15 +++++++--- .../channel_mesh.h5 | Bin 23858 -> 15858 bytes .../command_line.ini | 2 +- .../hopr.ini | 4 +-- .../parameter.ini | 28 +++++++++++------- .../readme.md | 1 + .../2D_Landmark/command_line.ini | 1 - .../2D_Landmark/parameter.ini | 10 ------- .../PartAnalyze_ref.csv | 24 --------------- .../turner_bias-voltage_AC-DC/analyze.ini | 7 ----- .../boundary/particle_boundary_condition.f90 | 3 ++ .../boundary/particle_boundary_init.f90 | 15 +++++++--- .../surfacemodel/surfacemodel_analyze.f90 | 7 ++--- 15 files changed, 81 insertions(+), 78 deletions(-) create mode 100644 regressioncheck/CHE_poisson/SurfFlux_ThermionicEmission_Schottky/SurfaceAnalyze_ref.csv delete mode 100644 regressioncheck/NIG_PIC_poisson_RK3/turner_bias-voltage_AC-DC/PartAnalyze_ref.csv diff --git a/regressioncheck/CHE_poisson/SurfFlux_ThermionicEmission_Schottky/PartAnalyze_ref.csv b/regressioncheck/CHE_poisson/SurfFlux_ThermionicEmission_Schottky/PartAnalyze_ref.csv index 90436bcef..faab753f3 100644 --- a/regressioncheck/CHE_poisson/SurfFlux_ThermionicEmission_Schottky/PartAnalyze_ref.csv +++ b/regressioncheck/CHE_poisson/SurfFlux_ThermionicEmission_Schottky/PartAnalyze_ref.csv @@ -1,12 +1,17 @@ 001-TIME,002-Current-Spec-001-SF-001 0.0000000000000000E+000,0.0000000000000000E+000 -0.1000000000000000E-011,0.1467593701480000E+001 -0.2000000000000000E-011,0.1467433483827000E+001 -0.3000000000000000E-011,0.1467433483827000E+001 -0.4000000000000000E-011,0.1467433483827000E+001 -0.5000000000000000E-011,0.1467593701480000E+001 -0.5999999999999999E-011,0.1467593701480000E+001 -0.6999999999999999E-011,0.1467433483827000E+001 -0.8000000000000000E-011,0.1467593701480000E+001 -0.9000000000000000E-011,0.1467433483827000E+001 -0.9999999999999999E-011,0.1467593701480000E+001 +0.2000000000000000E-010,0.1467513592653500E+001 +0.4000000000000000E-010,0.1467513592653500E+001 +0.6000000000000000E-010,0.1467513592653500E+001 +0.8000000000000000E-010,0.1467433483827000E+001 +0.1000000000000000E-009,0.1467513592653499E+001 +0.1200000000000000E-009,0.1467593701480000E+001 +0.1400000000000000E-009,0.1467433483827000E+001 +0.1600000000000000E-009,0.1467513592653500E+001 +0.1800000000000000E-009,0.1467593701480000E+001 +0.2000000000000000E-009,0.1467513592653501E+001 +0.2200000000000000E-009,0.1467433483827000E+001 +0.2400000000000000E-009,0.1467513592653500E+001 +0.2600000000000000E-009,0.1467513592653500E+001 +0.2800000000000000E-009,0.1467513592653500E+001 +0.3000000000000000E-009,0.1467513592653498E+001 diff --git a/regressioncheck/CHE_poisson/SurfFlux_ThermionicEmission_Schottky/SurfaceAnalyze_ref.csv b/regressioncheck/CHE_poisson/SurfFlux_ThermionicEmission_Schottky/SurfaceAnalyze_ref.csv new file mode 100644 index 000000000..8f0ace133 --- /dev/null +++ b/regressioncheck/CHE_poisson/SurfFlux_ThermionicEmission_Schottky/SurfaceAnalyze_ref.csv @@ -0,0 +1,17 @@ +001-TIME,002-Flux-Spec-001-BC_Xplus,003-TotalElectricCurrent-BC_Xplus +0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000 +0.2000000000000000E-010,0.0000000000000000E+000,0.0000000000000000E+000 +0.4000000000000000E-010,0.0000000000000000E+000,0.0000000000000000E+000 +0.6000000000000000E-010,0.0000000000000000E+000,0.0000000000000000E+000 +0.8000000000000000E-010,0.0000000000000000E+000,0.0000000000000000E+000 +0.1000000000000000E-009,0.0000000000000000E+000,0.0000000000000000E+000 +0.1200000000000000E-009,0.0000000000000000E+000,0.0000000000000000E+000 +0.1400000000000000E-009,0.0000000000000000E+000,0.0000000000000000E+000 +0.1600000000000000E-009,0.0000000000000000E+000,0.0000000000000000E+000 +0.1800000000000000E-009,0.0000000000000000E+000,0.0000000000000000E+000 +0.2000000000000000E-009,0.0000000000000000E+000,0.0000000000000000E+000 +0.2200000000000000E-009,0.0000000000000000E+000,0.0000000000000000E+000 +0.2400000000000000E-009,0.2500000000000002E+017,-.4005441325000004E-002 +0.2600000000000000E-009,0.6887500000000006E+019,-.1103499085037501E+001 +0.2800000000000000E-009,0.9169500000000008E+019,-.1469115769183501E+001 +0.3000000000000000E-009,0.9144999999999985E+019,-.1465190436684997E+001 diff --git a/regressioncheck/CHE_poisson/SurfFlux_ThermionicEmission_Schottky/analyze.ini b/regressioncheck/CHE_poisson/SurfFlux_ThermionicEmission_Schottky/analyze.ini index acbbd87ef..e72bb0a44 100644 --- a/regressioncheck/CHE_poisson/SurfFlux_ThermionicEmission_Schottky/analyze.ini +++ b/regressioncheck/CHE_poisson/SurfFlux_ThermionicEmission_Schottky/analyze.ini @@ -1,5 +1,12 @@ -! compare the last line of PartAnalyze.csv with a reference file -compare_data_file_name = PartAnalyze.csv -compare_data_file_reference = PartAnalyze_ref.csv -compare_data_file_tolerance = 5e-3 +! compare the current entering through the surface flux +compare_column_file = PartAnalyze.csv +compare_column_reference_file = PartAnalyze_ref.csv +compare_column_index = 1 +compare_column_tolerance_value = 0.01 +compare_column_tolerance_type = relative + +! compare the current leaving the domain +compare_data_file_name = SurfaceAnalyze.csv +compare_data_file_reference = SurfaceAnalyze_ref.csv +compare_data_file_tolerance = 0.01 compare_data_file_tolerance_type = relative diff --git a/regressioncheck/CHE_poisson/SurfFlux_ThermionicEmission_Schottky/channel_mesh.h5 b/regressioncheck/CHE_poisson/SurfFlux_ThermionicEmission_Schottky/channel_mesh.h5 index dc042beac4f368c5e3517b1ed87c99819b8fe5e3..0edf3c72693af2da41c430f25582736a1fcd990c 100644 GIT binary patch delta 2595 zcmZuzZD>r4}qCb898x44!G+UeF*tFRA-1IO@>cJ9MY zQR|OE8QW+)Fs8z|?8kl#Ce^x8!lq_027;sRgN=bK!Uj{=Kz|JxbLY7q_8Rtvllz|M zJs;0G@0<7LLQTATbhg)bw_MF`><$T{AP5EvhQc3=WQ+9>CaWjY%gr`hk?e;MA3R@c z^NBN5_r1K{Xt&Y5&SFRywq~Lb5+shh?cn60Jue-4b^pNw7OwgP!B3yIB-WJr_`_I8 z*yeaFuJkEpqZ8#QKLxfR&k2I4SJ=uAewZiwTmvdmc$93jfop* z#Gj66wuj(w7c_d)KPon;VOs431U_@?2Y;|vt!V`v@X3Fv~9ZRRNf=Q+Ds63o-;AKl5 zmEdg9wKnObe@GtA+E&v(SOq{|5T>j3w`ftW`L5*Xo%W=aZGNu(f+*M4+2(tNrJxPJ zO~Y-AOG5*VV7%Y)9L z`Ps>WQ{wQouv_=<-^UqoQdpQl=Z&-&qpGfw)EP=44*b!L0E^fEH};olw6lkH7#dAR zHNA^1+~In5(}=F>4Ym#Pk~i1ybd$6E5Y;lj@+#OlC)UcCVjUU1Rjfj+*bTN0HO0Ek zn4j{o9&xqBJrvDFu;<=zZZ``Cs{6@_XyvDBR1Lc9dnsb5`j5Q6ob9~P za&$*iDHqqo@99NDE$4Y%X7TdvV;xMrUAxY)RK~oqidL+PF-p4KExVgcq`w8eBz^YBbFv39tz^h zL7Xxe>6>{5u3nGF;jwa-T=z~a4AX01#n%$5lSU`^ikKGpKksqt&_IEeqiD4)Ms=up_bE(qN`pG7ugy;@t(Y= zSa*jTdpliEsQMQUCvWVhtxm0F2kgE#_IXOJP)lQsqH^!Kz`cg7-gEI4#||^rPw%dX z(m$G{7gz%?Z_J(OzP^J|oNjN-U8p|)4M*wV6)(d%#;}XtPGUVo;>zy%={0RFbi7xg z16hSGWn?P$eL&N_5>@gGr_vJ5=J=t|Tt=cspGnghg%;O-PJMZql(h>~%quim4AZ58 zLVx9#lgabrMTOTD+FUf~+w3M9E`;e^K_)ZvG5yPS?+wb-7%*veAWY$b8WoG2t$%^c z0;gLyM-8@FEX`SQ!=)N6W;*GG;wPuFY~Igd3QS|m^a=cmQ5SlIZlZfSi+gHtlSWyv z=Xi}a+w=QQh_SeK*z35*u35(};vRJJoUoi%Fn}a0S>TK-5TvkaE{^0$78eKE)c@!p zzlsGLg&%TrJS1PuV%wb%ghyCe!_v!w)16_#naZ)?M7lWcA>2d zBAV^jGq!=nwRaI)>yM&?9Eonr)_n57j)~nlj(@$0F$M7G5u1@Uqoheh-Zu@P|e_@W(mEE%M z-T?ltY_wekNrr~LVEipX!`Z<2BQQU{XUtz+>>%^GGxW>zTQm@O!&(%CMd$e+J=?ZZ literal 23858 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 I = 1.4675 A (A = 1 cm^2) + * In the case with the Schottky effect, the current reduces slightly over time as the electrons in the domain reduce the potential difference diff --git a/regressioncheck/NIG_PIC_poisson_Boris-Leapfrog/2D_Landmark/command_line.ini b/regressioncheck/NIG_PIC_poisson_Boris-Leapfrog/2D_Landmark/command_line.ini index 65c96f0f6..906585720 100644 --- a/regressioncheck/NIG_PIC_poisson_Boris-Leapfrog/2D_Landmark/command_line.ini +++ b/regressioncheck/NIG_PIC_poisson_Boris-Leapfrog/2D_Landmark/command_line.ini @@ -1,2 +1 @@ MPI = 4,10 -!restart_file = 2Dplasma_test_State_000.00000000000000000.h5, 2Dplasma_test_State_000.00000005000000000.h5 diff --git a/regressioncheck/NIG_PIC_poisson_Boris-Leapfrog/2D_Landmark/parameter.ini b/regressioncheck/NIG_PIC_poisson_Boris-Leapfrog/2D_Landmark/parameter.ini index 10b209494..50f855e0e 100644 --- a/regressioncheck/NIG_PIC_poisson_Boris-Leapfrog/2D_Landmark/parameter.ini +++ b/regressioncheck/NIG_PIC_poisson_Boris-Leapfrog/2D_Landmark/parameter.ini @@ -71,13 +71,11 @@ PIC-AlgebraicExternalField = 1 ! 1: Charoy 2019 magnetic + electric field Part-maxParticleNumber = 500000 Part-nSpecies = 2 Part-FIBGMdeltas = (/2.5e-2 , 1.28e-2 , 0.01e-2/) -!Part-FactorFIBGM = (/ 500 , 256 , 1/) Part-FactorFIBGM = (/ 10 , 10 , 1/) PIC-DoDeposition = T PIC-DoInterpolation = T PIC-Deposition-Type = cell_volweight_mean -!PIC-AlgebraicExternalField = 1 DisplayLostParticles=T Part-Species1-MacroParticleFactor = 1.67e4 ! 1.67e2 originally used for z=1e-4 m (case2: 75 parts per cell with dx=dy=5e-5 m) @@ -91,17 +89,9 @@ Part-nBounds = 6 Part-Boundary1-SourceName = BC_ANODE Part-Boundary1-Condition = open -!Part-Boundary1-NbrOfSpeciesSwaps = 3 -!Part-Boundary1-SpeciesSwaps1 = (/1,0/) -!Part-Boundary1-SpeciesSwaps2 = (/2,0/) -!Part-Boundary1-SpeciesSwaps3 = (/3,0/) Part-Boundary2-SourceName = BC_CATHODE Part-Boundary2-Condition = open -!Part-Boundary2-NbrOfSpeciesSwaps = 3 -!Part-Boundary2-SpeciesSwaps1 = (/1,0/) -!Part-Boundary2-SpeciesSwaps2 = (/2,0/) -!Part-Boundary2-SpeciesSwaps3 = (/3,0/) Part-Boundary3-SourceName = BC_periodicy+ Part-Boundary3-Condition = periodic diff --git a/regressioncheck/NIG_PIC_poisson_RK3/turner_bias-voltage_AC-DC/PartAnalyze_ref.csv b/regressioncheck/NIG_PIC_poisson_RK3/turner_bias-voltage_AC-DC/PartAnalyze_ref.csv deleted file mode 100644 index fbf3ffa2d..000000000 --- a/regressioncheck/NIG_PIC_poisson_RK3/turner_bias-voltage_AC-DC/PartAnalyze_ref.csv +++ /dev/null @@ -1,24 +0,0 @@ -001-TIME,002-nPart-Spec-001,003-nPart-Spec-002,004-nPart-Spec-003,005-nPart-Spec-004,006-nPart-Spec-005,007-E-Vib001,008-E-Vib002,009-E-Vib003,010-E-Vib004,011-E-Vib005,012-E-Rot001,013-E-Rot002,014-E-Rot003,015-E-Rot004,016-E-Rot005,017-E-Elec001,018-E-Elec002,019-E-Elec003,020-E-Elec004,021-E-Elec005,022-E-TotalPart -0.0000000000000000E+000,0.0000000000000000E+000,0.4012000000000000E+004,0.4012000000000000E+004,0.0000000000000000E+000,0.8024000000000000E+004,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.2517594416481664E-013 -0.4580000000000000E-010,0.0000000000000000E+000,0.4011000000000000E+004,0.4012000000000000E+004,0.0000000000000000E+000,0.8023000000000000E+004,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.2518698200783414E-013 -0.9160000000000000E-010,0.0000000000000000E+000,0.4010000000000000E+004,0.4012000000000000E+004,0.0000000000000000E+000,0.8022000000000000E+004,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.2522462715369796E-013 -0.1374000000000000E-009,0.0000000000000000E+000,0.4008000000000000E+004,0.4012000000000000E+004,0.0000000000000000E+000,0.8020000000000000E+004,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.2528153121183654E-013 -0.1832000000000000E-009,0.0000000000000000E+000,0.4008000000000000E+004,0.4012000000000000E+004,0.0000000000000000E+000,0.8020000000000000E+004,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.2537316774570108E-013 -0.2290000000000000E-009,0.0000000000000000E+000,0.4007000000000000E+004,0.4012000000000000E+004,0.0000000000000000E+000,0.8019000000000000E+004,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.2547895782038987E-013 -0.2748000000000000E-009,0.0000000000000000E+000,0.4007000000000000E+004,0.4012000000000000E+004,0.0000000000000000E+000,0.8019000000000000E+004,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.2561151429942829E-013 -0.3206000000000000E-009,0.0000000000000000E+000,0.4005000000000000E+004,0.4012000000000000E+004,0.0000000000000000E+000,0.8017000000000000E+004,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.2575341266174985E-013 -0.3663999999999999E-009,0.0000000000000000E+000,0.4004000000000000E+004,0.4012000000000000E+004,0.0000000000000000E+000,0.8016000000000000E+004,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.2592967043329345E-013 -0.4121999999999999E-009,0.0000000000000000E+000,0.4002000000000000E+004,0.4013000000000000E+004,0.0000000000000000E+000,0.8015000000000000E+004,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.2606812409604058E-013 -0.4579999999999999E-009,0.0000000000000000E+000,0.4000000000000000E+004,0.4013000000000000E+004,0.0000000000000000E+000,0.8013000000000000E+004,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.2624571920908253E-013 -0.5000000000000000E-009,0.0000000000000000E+000,0.3999000000000000E+004,0.4013000000000000E+004,0.0000000000000000E+000,0.8012000000000000E+004,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.2641262427096647E-013 -0.5458000000000000E-009,0.0000000000000000E+000,0.3997000000000000E+004,0.4013000000000000E+004,0.0000000000000000E+000,0.8010000000000000E+004,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.2657709585005035E-013 -0.5916000000000000E-009,0.0000000000000000E+000,0.3997000000000000E+004,0.4013000000000000E+004,0.0000000000000000E+000,0.8010000000000000E+004,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.2680186010280453E-013 -0.6374000000000000E-009,0.0000000000000000E+000,0.3996000000000000E+004,0.4013000000000000E+004,0.0000000000000000E+000,0.8009000000000000E+004,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.2703333139144175E-013 -0.6832000000000000E-009,0.0000000000000000E+000,0.3993000000000000E+004,0.4013000000000000E+004,0.0000000000000000E+000,0.8006000000000000E+004,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.2722071667924760E-013 -0.7290000000000000E-009,0.0000000000000000E+000,0.3991000000000000E+004,0.4013000000000000E+004,0.0000000000000000E+000,0.8004000000000000E+004,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.2736908745529201E-013 -0.7748000000000000E-009,0.0000000000000000E+000,0.3989000000000000E+004,0.4013000000000000E+004,0.0000000000000000E+000,0.8002000000000000E+004,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.2756365047732255E-013 -0.8205999999999999E-009,0.0000000000000000E+000,0.3985000000000000E+004,0.4013000000000000E+004,0.0000000000000000E+000,0.7998000000000000E+004,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.2774018444632331E-013 -0.8663999999999999E-009,0.0000000000000000E+000,0.3982000000000000E+004,0.4013000000000000E+004,0.0000000000000000E+000,0.7995000000000000E+004,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.2784862968426264E-013 -0.9121999999999999E-009,0.0000000000000000E+000,0.3980000000000000E+004,0.4013000000000000E+004,0.0000000000000000E+000,0.7993000000000000E+004,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.2799497523940786E-013 -0.9580000000000000E-009,0.0000000000000000E+000,0.3978000000000000E+004,0.4013000000000000E+004,0.0000000000000000E+000,0.7991000000000000E+004,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.2813652599466704E-013 -0.1000000000000000E-008,0.0000000000000000E+000,0.3978000000000000E+004,0.4013000000000000E+004,0.0000000000000000E+000,0.7991000000000000E+004,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.2828197009080410E-013 diff --git a/regressioncheck/NIG_PIC_poisson_RK3/turner_bias-voltage_AC-DC/analyze.ini b/regressioncheck/NIG_PIC_poisson_RK3/turner_bias-voltage_AC-DC/analyze.ini index 91b4f21f3..dccb8ea36 100644 --- a/regressioncheck/NIG_PIC_poisson_RK3/turner_bias-voltage_AC-DC/analyze.ini +++ b/regressioncheck/NIG_PIC_poisson_RK3/turner_bias-voltage_AC-DC/analyze.ini @@ -1,10 +1,3 @@ -! compare the last row in PartAnalyze.csv with a reference file -!compare_data_file_name = PartAnalyze.csv -!compare_data_file_reference = PartAnalyze_ref.csv -!compare_data_file_tolerance = 20.0e-2 -!compare_data_file_tolerance_type = relative -!compare_data_file_max_differences = 2 - ! integrate columns x:y in a data file as integral(y(x), x, x(1), x(end)) integrate_line_file = SurfaceAnalyze.csv ! data file name integrate_line_columns = 0:9 ! columns x:y diff --git a/src/particles/boundary/particle_boundary_condition.f90 b/src/particles/boundary/particle_boundary_condition.f90 index 4ecf777a3..56119d81c 100644 --- a/src/particles/boundary/particle_boundary_condition.f90 +++ b/src/particles/boundary/particle_boundary_condition.f90 @@ -168,6 +168,7 @@ SUBROUTINE GetBoundaryInteraction(iPart,SideID,flip,ElemID,crossedBC,TriNum,IsIn END IF ! DoDdielectric !----------------------------------------------------------------------------------------------------------------------------------- CASE(7) ! PartBound%RotPeriodicInterPlaneBC + !----------------------------------------------------------------------------------------------------------------------------------- IF(PRESENT(IsInterPlanePart)) THEN CALL RotPeriodicInterPlaneBoundary(iPart,SideID,ElemID,IsInterplanePart) ELSE @@ -177,7 +178,9 @@ SUBROUTINE GetBoundaryInteraction(iPart,SideID,flip,ElemID,crossedBC,TriNum,IsIn CASE(10,11) ! PartBound%SymmetryBC !----------------------------------------------------------------------------------------------------------------------------------- CALL PerfectReflection(iPart,SideID,n_loc,opt_Symmetry=.TRUE.) + !----------------------------------------------------------------------------------------------------------------------------------- CASE DEFAULT + !----------------------------------------------------------------------------------------------------------------------------------- CALL abort(__STAMP__,' ERROR: PartBound not associated!. (unknown case)') END SELECT !PartBound%MapToPartBC(SideInfo_Shared(SIDE_BCID,SideID) END ASSOCIATE diff --git a/src/particles/boundary/particle_boundary_init.f90 b/src/particles/boundary/particle_boundary_init.f90 index 4abe6f977..b6355c5aa 100644 --- a/src/particles/boundary/particle_boundary_init.f90 +++ b/src/particles/boundary/particle_boundary_init.f90 @@ -575,6 +575,7 @@ SUBROUTINE InitParticleBoundarySurfSides() USE MOD_Particle_Boundary_Vars ,ONLY: nComputeNodeSurfSides,nComputeNodeSurfTotalSides,nComputeNodeSurfOutputSides USE MOD_Particle_Boundary_Vars ,ONLY: GlobalSide2SurfSide,SurfSide2GlobalSide #if USE_MPI +USE MOD_Mesh_Vars ,ONLY: nBCSides, offsetElem, SideToElem USE MOD_Particle_Mesh_Vars ,ONLY: ElemInfo_Shared USE MOD_MPI_Shared USE MOD_MPI_Shared_Vars ,ONLY: MPI_COMM_SHARED @@ -609,7 +610,7 @@ SUBROUTINE InitParticleBoundarySurfSides() INTEGER :: GlobalElemID,GlobalElemRank INTEGER :: sendbuf,recvbuf INTEGER :: NbGlobalElemID, NbElemRank, NbLeaderID, nSurfSidesTmp -INTEGER :: color +INTEGER :: color #endif /*USE_MPI*/ INTEGER :: NbGlobalSideID !=================================================================================================================================== @@ -650,7 +651,6 @@ SUBROUTINE InitParticleBoundarySurfSides() GlobalSide2SurfSideProc = -1 nComputeNodeSurfSides = 0 -nBCSidesProc = 0 nSurfSidesProc = 0 ! check every BC side @@ -663,8 +663,6 @@ SUBROUTINE InitParticleBoundarySurfSides() IF (ElemInfo_Shared(ELEM_HALOFLAG,SideInfo_Shared(SIDE_ELEMID,iSide)).EQ.0) CYCLE #endif /*USE_MPI*/ - nBCSidesProc = nBCSidesProc + 1 - ! count number of reflective and rotationally periodic BC sides IF ((PartBound%TargetBoundCond(PartBound%MapToPartBC(SideInfo_Shared(SIDE_BCID,iSide))).EQ.PartBound%ReflectiveBC) .OR. & (PartBound%TargetBoundCond(PartBound%MapToPartBC(SideInfo_Shared(SIDE_BCID,iSide))).EQ.PartBound%RotPeriodicBC).OR. & @@ -854,6 +852,15 @@ SUBROUTINE InitParticleBoundarySurfSides() ! create a communicator between processors with a BC side (including open BCs and sides in the halo region) #if USE_MPI +! Count the number of BC sides per processors. Note: cannot be done in the loop above, since it might happen that a processor +! might not get his own elements and thus will not be added to the communicator. +nBCSidesProc = 0 +DO iSide=1,nBCSides + GlobalElemID = SideToElem(S2E_ELEM_ID,iSide) + offsetElem + IF (ElemInfo_Shared(ELEM_HALOFLAG,GlobalElemID).EQ.0) CYCLE + nBCSidesProc = nBCSidesProc + 1 +END DO + ! Set the control of subset assignment (nonnegative integer). Processes with the same color are in the same new communicator. ! Make sure to include the root IF(MPIRoot) THEN diff --git a/src/particles/surfacemodel/surfacemodel_analyze.f90 b/src/particles/surfacemodel/surfacemodel_analyze.f90 index 3e6e20134..5210b01c6 100644 --- a/src/particles/surfacemodel/surfacemodel_analyze.f90 +++ b/src/particles/surfacemodel/surfacemodel_analyze.f90 @@ -696,15 +696,14 @@ SUBROUTINE SyncBoundaryParticleOutput() INTEGER :: SendBufSize !=================================================================================================================================== SendBufSize = BPO%NPartBoundaries*BPO%NSpecies + +! Map 2D array to vector for sending via MPI +SendBuf = RESHAPE(BPO%RealPartOut,(/SendBufSize/)) IF(MPIRoot)THEN - ! Map 2D array to vector for sending via MPI - SendBuf = RESHAPE(BPO%RealPartOut,(/SendBufSize/)) CALL MPI_REDUCE(MPI_IN_PLACE,SendBuf(1:SendBufSize),SendBufSize,MPI_DOUBLE_PRECISION,MPI_SUM,0,SurfCOMM%UNICATOR,IERROR) ! MAP vector back to 2D array BPO%RealPartOut = RESHAPE(SendBuf,(/BPO%NPartBoundaries,BPO%NSpecies/)) ELSE - ! Map 2D array to vector for sending via MPI - SendBuf = RESHAPE(BPO%RealPartOut,(/SendBufSize/)) CALL MPI_REDUCE(SendBuf(1:SendBufSize),0,SendBufSize,MPI_DOUBLE_PRECISION,MPI_SUM,0,SurfCOMM%UNICATOR,IERROR) ! Reset non SurfCOMM%UNICATOR counters, SurfCOMM%UNICATOR counters are reset after writing the data to the file BPO%RealPartOut = 0. From 2448777eaa2664e704d5ffe2a985089718ff74a3 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Wed, 30 Aug 2023 10:24:37 +0200 Subject: [PATCH 164/495] Fixes in photon wall sampling when using MPI and when compiling with MPI=OFF --- .../tracking/radtrans_tracking_output.f90 | 1 + .../tracking/radtrans_tracking_tools.f90 | 69 ++++++++++--------- src/radiation/ray_tracing/raytrace.f90 | 3 +- src/radiation/ray_tracing/raytrace_ini.f90 | 3 +- 4 files changed, 42 insertions(+), 34 deletions(-) diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 index 60cea8425..e4aa86340 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 @@ -259,6 +259,7 @@ SUBROUTINE WritePhotonSurfSampleToHDF5() CHARACTER(LEN=255) :: Statedummy CHARACTER(LEN=255) :: H5_Name, H5_Name2 CHARACTER(LEN=4),PARAMETER :: NodeTypeTemp = 'VISU' +!CHARACTER(LEN=4),PARAMETER :: NodeTypeTemp = 'VISU_INNER' CHARACTER(LEN=255),ALLOCATABLE :: Str2DVarNames(:) INTEGER :: GlobalSideID, iSurfSide, OutputCounter, SurfSideNb, p, q INTEGER,PARAMETER :: nVar2D=3 diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 index 7b39a8a2f..b9253ae8b 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 @@ -697,7 +697,7 @@ SUBROUTINE CalcAbsorptionRayTrace(IntersectionPos,GlobalElemID,PhotonDir) ! Loop over number of sub-samples NbrOfSamples = 20 ! Nloc+1 ! must be at least 3 for this sampling method (one point between the two intersections of the element)! -scaleFac = 1./REAL(NbrOfSamples) +!scaleFac = 1./REAL(NbrOfSamples) subdirection(1:3) = direction(1:3)/REAL(NbrOfSamples-1) sublength = VECNORM(subdirection(1:3)) !scaleFac = 1. @@ -709,35 +709,40 @@ SUBROUTINE CalcAbsorptionRayTrace(IntersectionPos,GlobalElemID,PhotonDir) DO iIntersec = 1, NbrOfSamples SamplePos = PhotonProps%PhotonStartPos(1:3) + direction(1:3)*REAL(iIntersec-1)/REAL(NbrOfSamples-1) - ! Get position in reference element - CALL GetPositionInRefElem(SamplePos(1:3),IntersectionPosRef(1:3),GlobalElemID) + ! ! Get position in reference element + ! CALL GetPositionInRefElem(SamplePos(1:3),IntersectionPosRef(1:3),GlobalElemID) + + ! k = a + ! DO ii = 0,b-1 + ! IF(ABS(IntersectionPosRef(1)).GE.N_Inter_Ray(Nloc)%GaussBorder(Nloc-ii))THEN + ! k = Nloc-ii + ! EXIT + ! END IF + ! END DO + ! k = NINT((Nloc+SIGN(2.0*k-Nloc,IntersectionPosRef(1)))/2) + ! !! y-direction + ! l = a + ! DO ii = 0,b-1 + ! IF(ABS(IntersectionPosRef(2)).GE.N_Inter_Ray(Nloc)%GaussBorder(Nloc-ii))THEN + ! l = Nloc-ii + ! EXIT + ! END IF + ! END DO + ! l = NINT((Nloc+SIGN(2.0*l-Nloc,IntersectionPosRef(2)))/2) + ! !! z-direction + ! m = a + ! DO ii = 0,b-1 + ! IF(ABS(IntersectionPosRef(3)).GE.N_Inter_Ray(Nloc)%GaussBorder(Nloc-ii))THEN + ! m = Nloc-ii + ! EXIT + ! END IF + ! END DO + ! m = NINT((Nloc+SIGN(2.0*m-Nloc,IntersectionPosRef(3)))/2) - k = a - DO ii = 0,b-1 - IF(ABS(IntersectionPosRef(1)).GE.N_Inter_Ray(Nloc)%GaussBorder(Nloc-ii))THEN - k = Nloc-ii - EXIT - END IF - END DO - k = NINT((Nloc+SIGN(2.0*k-Nloc,IntersectionPosRef(1)))/2) - !! y-direction - l = a - DO ii = 0,b-1 - IF(ABS(IntersectionPosRef(2)).GE.N_Inter_Ray(Nloc)%GaussBorder(Nloc-ii))THEN - l = Nloc-ii - EXIT - END IF - END DO - l = NINT((Nloc+SIGN(2.0*l-Nloc,IntersectionPosRef(2)))/2) - !! z-direction - m = a - DO ii = 0,b-1 - IF(ABS(IntersectionPosRef(3)).GE.N_Inter_Ray(Nloc)%GaussBorder(Nloc-ii))THEN - m = Nloc-ii - EXIT - END IF - END DO - m = NINT((Nloc+SIGN(2.0*m-Nloc,IntersectionPosRef(3)))/2) + CALL GetPositionInRefElem(SamplePos(1:3),IntersectionPosRef(1:3),GlobalElemID) + k = MINLOC(ABS(N_Inter_Ray(Nloc)%xGP(:) - IntersectionPosRef(1)),DIM=1) - 1 + l = MINLOC(ABS(N_Inter_Ray(Nloc)%xGP(:) - IntersectionPosRef(2)),DIM=1) - 1 + m = MINLOC(ABS(N_Inter_Ray(Nloc)%xGP(:) - IntersectionPosRef(3)),DIM=1) - 1 ! Scaling factor to ensure that rays that are counted multiple times in high-order elements do not increase the total energy ! deposited in the corresponding element @@ -1341,7 +1346,7 @@ SUBROUTINE CalcWallAbsoprtion(IntersectionPos, GlobSideID, DONE, ForceWallSample LOGICAL :: ForceWallSampleLoc !--------------------------------------------------------------------------------------------------! #if USE_MPI -ASSOCIATE( PhotonSampWall => PhotonSampWallProc ) +ASSOCIATE( PhotonSampWallProc => PhotonSampWall ) #endif /*USE_MPI*/ SurfSideID = GlobalSide2SurfSide(SURF_SIDEID,GlobSideID) ! Check if photon is to be added to PhotonSampWall independent of the actual absorption/reflection @@ -1361,8 +1366,8 @@ SUBROUTINE CalcWallAbsoprtion(IntersectionPos, GlobSideID, DONE, ForceWallSample END IF ! distance.LT.distanceMin END DO ! q = 1, nSurfSample END DO ! p = 1, nSurfSample - PhotonSampWallProc(1,p,q,SurfSideID) = PhotonSampWallProc(1,p,q,SurfSideID) + 1.0 - PhotonSampWallProc(2,p,q,SurfSideID) = PhotonSampWallProc(2,p,q,SurfSideID) + PhotonProps%PhotonEnergy + PhotonSampWall(1,p,q,SurfSideID) = PhotonSampWall(1,p,q,SurfSideID) + 1.0 + PhotonSampWall(2,p,q,SurfSideID) = PhotonSampWall(2,p,q,SurfSideID) + PhotonProps%PhotonEnergy ELSE PhotonSampWall(1,1,1,SurfSideID) = PhotonSampWall(1,1,1,SurfSideID) + 1.0 PhotonSampWall(2,1,1,SurfSideID) = PhotonSampWall(2,1,1,SurfSideID) + PhotonProps%PhotonEnergy diff --git a/src/radiation/ray_tracing/raytrace.f90 b/src/radiation/ray_tracing/raytrace.f90 index 89866d533..7c59fd67c 100644 --- a/src/radiation/ray_tracing/raytrace.f90 +++ b/src/radiation/ray_tracing/raytrace.f90 @@ -261,7 +261,7 @@ SUBROUTINE ReadRayTracingDataFromH5(onlySurfData) USE MOD_PreProc USE MOD_HDF5_Input ,ONLY: ReadArray,DatasetExists,GetDataSize,nDims,HSize,File_ID USE MOD_Photon_TrackingVars ,ONLY: RadiationSurfState,RadiationVolState,PhotonSampWall_loc -USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWallHDF5,PhotonSampWallHDF5_Shared,PhotonSampWallHDF5_Shared_Win +USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWallHDF5 USE MOD_Mesh_Vars ,ONLY: offsetElem,nElems,nGlobalElems USE MOD_RayTracing_Vars ,ONLY: N_DG_Ray_loc,Ray,nVarRay,U_N_Ray_loc,PREF_VDM_Ray,N_Inter_Ray,RayElemEmission USE MOD_ChangeBasis ,ONLY: ChangeBasis3D @@ -272,6 +272,7 @@ SUBROUTINE ReadRayTracingDataFromH5(onlySurfData) #if USE_MPI USE MOD_MPI_Shared USE MOD_MPI_Shared_Vars ,ONLY: MPI_COMM_SHARED,myComputeNodeRank +USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWallHDF5_Shared,PhotonSampWallHDF5_Shared_Win #endif /*USE_MPI*/ !#if MPI !#endif /*MPI*/ diff --git a/src/radiation/ray_tracing/raytrace_ini.f90 b/src/radiation/ray_tracing/raytrace_ini.f90 index 9741a5241..68f027d0d 100644 --- a/src/radiation/ray_tracing/raytrace_ini.f90 +++ b/src/radiation/ray_tracing/raytrace_ini.f90 @@ -117,6 +117,7 @@ SUBROUTINE InitRayTracing() END IF ! PerformRayTracing Ray%NodeType = NodeTypeVISU +!Ray%NodeType = 'VISU_INNER' ! Output of high-order p-adaptive info Ray%NMin = 1 ! GETINT('RayTracing-NMin') @@ -549,8 +550,8 @@ SUBROUTINE FinalizeRayTracing() #if USE_MPI USE MOD_MPI_Shared_Vars ,ONLY: MPI_COMM_SHARED USE MOD_MPI_Shared -USE MOD_Photon_TrackingVars #endif /*USE_MPI*/ +USE MOD_Photon_TrackingVars USE MOD_Mesh_Vars ,ONLY: nGlobalElems IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------! From 17963feceaffbb7cb062c174dcef5b6f15b3ab83 Mon Sep 17 00:00:00 2001 From: Franziska Hild Date: Wed, 30 Aug 2023 11:55:22 +0200 Subject: [PATCH 165/495] BGK userguide update --- docs/documentation/references.bib | 11 +++- .../Bhatnagar-Gross-Krook.md | 56 +++++++------------ 2 files changed, 30 insertions(+), 37 deletions(-) diff --git a/docs/documentation/references.bib b/docs/documentation/references.bib index 1c72dd77e..4fcca4049 100644 --- a/docs/documentation/references.bib +++ b/docs/documentation/references.bib @@ -66,6 +66,15 @@ @article{Pfeiffer2018b volume = {30}, year = {2018} } +@ARTICLE{Pfeiffer2021, +author = {Pfeiffer, Marcel and Mirza, Asim and Nizenkov, Paul}, +year = "2021", +journal = "Physics of Fluids", +volume = "33", +pages = "036106", +doi = "10.1063/5.0037915", +title = {{Multi-species modeling in the particle-based ellipsoidal statistical Bhatnagar–Gross–Krook method for monatomic gas species}}, +} @article{Jun2019, author = {Jun, Eunji and Pfeiffer, Marcel and Mieussens, Luc and Gorji, M. Hossein}, @@ -336,7 +345,7 @@ @article{Abe1994 } @phdthesis{Farbar2010, -author = {Farbar, Erin D.}, +author = {Farbar, Erin D.}, title = {Kinetic Simulation of Rarefied and Weakly Ionized Hypersonic Flow Fields.}, school = {University of Michigan, Horace H. Rackham School of Graduate Studies}, year = 2010, diff --git a/docs/documentation/userguide/features-and-models/Bhatnagar-Gross-Krook.md b/docs/documentation/userguide/features-and-models/Bhatnagar-Gross-Krook.md index 720795cfc..3527840a0 100644 --- a/docs/documentation/userguide/features-and-models/Bhatnagar-Gross-Krook.md +++ b/docs/documentation/userguide/features-and-models/Bhatnagar-Gross-Krook.md @@ -2,7 +2,7 @@ # Bhatnagar-Gross-Krook Collision Operator The implementation of the BGK-based collision operator is based on the publications by {cite}`Pfeiffer2018a` and {cite}`Pfeiffer2018b`. -It allows the simulation of gas flows in the continuum and transitional regime, where the DSMC method is computationally too expensive. +It allows the simulation of gas flows in the continuum and transitional regimes, where the DSMC method is computationally too expensive. The collision integral is hereby approximated by a relaxation process: $$ \left.\frac{\partial f}{\partial t}\right|_{\mathrm{coll}} \approx \nu(f^t-f), $$ @@ -11,74 +11,59 @@ where $f^t$ is the target distribution function and $\nu$ the relaxation frequen The current implementation supports: -- 3 different methods (i.e. different target distribution functions): Ellipsoidal Statistical, Shakov, and standard BGK -- Single species, monatomic and polyatomic gases -- Multi species, monatomic and diatomic gas mixtures +- Three different BGK methods (i.e. different target distribution functions): Ellipsoidal Statistical, Shakov, and standard BGK +- Single species: monatomic, diatomic, and polyatomic gases +- Gas mixtures with an arbitrary number of monatomic, diatomic, and polyatomic species - Thermal non-equilibrium with rotational and vibrational excitation (continuous or quantized treatment) -- 2D/Axisymmetric simulations +- 2D axisymmetric simulations - Variable time step (adaption of the distribution according to the maximal relaxation factor and linear scaling) Relevant publications of the developers: - Implementation and comparison of the ESBGK, SBGK, and Unified models in PICLas for atomic species {cite}`Pfeiffer2018a` -- Extension of the modelling to diatomic species including quantized vibrational energy treatment, validation of ESBGK with the Mach -20 hypersonic flow measurements of the heat flux on a $70^\circ$ cone {cite}`Pfeiffer2018b` -- Simulation of a nozzle expansion (including the pressure chamber) with ESBGK, SBGK and coupled ESBGK-DSMC, comparison to experimental -measurements {cite}`Pfeiffer2019a`,{cite}`Pfeiffer2019b` -- Extension to polyatomic molecules, simulation of the carbon dioxide hypersonic flow around a flat-faced cylinder, comparison of -ESBGK, SBGK and DSMC regarding the shock structure and heat flux {cite}`Pfeiffer2019c` -- Implemention of Brull's multi-species modelling using Wilke's mixture rules and collision integrals for the calculation of -transport coefficients (under review) +- Extension of the modeling to diatomic species including quantized vibrational energy treatment, validation of ESBGK with the Mach 20 hypersonic flow measurements of the heat flux on a $70^\circ$ cone {cite}`Pfeiffer2018b` +- Simulation of a nozzle expansion (including the pressure chamber) with ESBGK, SBGK and coupled ESBGK-DSMC, comparison to experimental measurements {cite}`Pfeiffer2019a`,{cite}`Pfeiffer2019b` +- Extension to polyatomic molecules, simulation of the carbon dioxide hypersonic flow around a flat-faced cylinder, comparison of ESBGK, SBGK and DSMC regarding the shock structure and heat flux {cite}`Pfeiffer2019c` +- Implemention of Brull's multi-species modeling for monatomic gas mixtures using Wilke's mixture rules and collision integrals for the calculation of transport coefficients {cite}`Pfeiffer2021` +- Extension of the implementation of Brull's ESBGK multi-species model to diatomic gas mixtures using Wilke's mixture rules (under review) +- Extension of the ESBGK method to multi-species modeling of polyatomic molecules, based on the ESBGK models of Mathiaud, Mieussens, Pfeiffer, and Brull, and including internal energies with multiple vibrational degrees of freedom, using Wilke's mixture rules and collision integrals in comparison (under review) To enable the simulation with the BGK module, the respective compiler setting has to be activated: PICLAS_TIMEDISCMETHOD = BGK-Flow -A parameter file and species initialization file is required, analogous to the DSMC setup. It is recommended to utilize a previous -DSMC parameter file to ensure a complete simulation setup. To enable the simulation with the BGK methods, select the BGK method, -ES (`= 1`), Shakov (`= 2`), and standard BGK (`= 3`): +A parameter file and species initialization file is required, analogous to the DSMC setup. It is recommended to utilize a previous DSMC parameter file to ensure a complete simulation setup. To enable the simulation with the BGK methods, select the BGK method, ES (`= 1`), Shakov (`= 2`), and standard BGK (`= 3`): Particles-BGK-CollModel = 1 -The **recommended method is ESBGK**. If the simulation contains a gas mixture, a choice for the determination of the transport -coefficients is available. The first model uses Wilke's mixture rules (`= 1`) to calculate the gas mixture viscosity and thermal -conductivity. The second model utilizes collision integrals (derived for the VHS model, `= 2`) to calculate these mixture properties. -While both allow mixtures with three or more components, only the implementation of Wilke's mixing rules allows diatomic molecules. +The **recommended method is ESBGK**. If the simulation contains a gas mixture, a choice for the determination of the transport coefficients is available. The first model uses Wilke's mixture rules (`= 1`) to calculate the gas mixture viscosity and thermal conductivity. The second model utilizes collision integrals (derived for the VHS model, `= 2`) to calculate these mixture properties. Particles-BGK-MixtureModel = 1 -The vibrational excitation can be controlled with the following flags, including the choice between continuous and quantized -vibrational energy. Quantized vibrational energy levels are currently only available for the single-species implementation. +The vibrational excitation can be controlled with the following flags, including the choice between continuous and quantized vibrational energy. Particles-BGK-DoVibRelaxation = T Particles-BGK-UseQuantVibEn = T -An octree cell refinement until the given number of particles is reached can be utilized, which corresponds to an equal refinement -in all three directions (x,y,z): +An octree cell refinement can be utilized until the given number of particles is reached, which corresponds to an equal refinement in all three directions (x,y,z): Particles-BGK-DoCellAdaptation = T Particles-BGK-MinPartsPerCell = 10 -It is recommended to utilize at least between 7 and 10 particles per (sub)cell. To enable the cell refinement above a certain number -density, the following option can be utilized +It is recommended to utilize at least between 7 and 10 particles per (sub)cell. To enable the cell refinement above a certain number density, the following option can be utilized: Particles-BGK-SplittingDens = 1E23 -A coupled BGK-DSMC simulation can be enabled, where the BGK method will be utilized if the number density $[\text{m}^{-3}]$ is -above a certain value: +A coupled BGK-DSMC simulation can be enabled, where the BGK method will be utilized if the number density $[\text{m}^{-3}]$ is above a certain value: Particles-CoupledBGKDSMC = T Particles-BGK-DSMC-SwitchDens = 1E22 -The flag `Particles-DSMC-CalcQualityFactors` controls the output of quality factors such as mean/maximal relaxation factor (mean: -average over a cell, max: maximal value within the octree), max rotational relaxation factor, which are defined as +The flag `Particles-DSMC-CalcQualityFactors` controls the output of quality factors such as mean/maximum relaxation factor (mean: average over a cell, max: maximal value within the octree), max. rotational relaxation factor, which are defined as $$ \frac{\Delta t}{\tau} < 1,$$ -where $\Delta t$ is the chosen time step and $1/\tau$ the relaxation frequency. The time step should be chosen as such that the -relaxation factors are below unity. The `BGK_DSMC_Ratio` gives the percentage of the sampled time during which the BGK model was -utilized. In a couple BGK-DSMC simulation this variable indicates the boundary between BGK and DSMC. However, a value below 1 can -occur for pure BGK simulations due to low particle numbers, when an element is skipped. +where $\Delta t$ is the chosen time step and $1/\tau$ the relaxation frequency. The time step should be chosen as such that the relaxation factors are below unity. The `BGK_DSMC_Ratio` gives the percentage of the sampled time during which the BGK model was utilized. In a coupled BGK-DSMC simulation this variable indicates the boundary between BGK and DSMC. However, a value below 1 can occur for pure BGK simulations due to low particle numbers, when an element is skipped. An option is available to utilize a moving average for the variables used in the calculation of the relaxation frequency: @@ -88,7 +73,6 @@ The purpose is to increase the sample size and reduce the noise for steady gas f Particles-BGK-MovingAverageFac = 0.01 -between zero and one must be defined with which the old $M^n$ and newly sampled moments $M$ are weighted -to define the moments for the next time step $M^{n+1}$: +between zero and one must be defined with which the old $M^n$ and newly sampled moments $M$ are weighted to define the moments for the next time step $M^{n+1}$: $$ M^{n+1}=f M+(1-f) M^n.$$ From 4cf19ed9ecb4d575d2786e17c8b9b652cfeef9fb Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Wed, 30 Aug 2023 16:22:13 +0200 Subject: [PATCH 166/495] Revert change PhotonSampWallProc --- .../radiative_transfer/tracking/radtrans_tracking_tools.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 index b9253ae8b..efd68b6dc 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 @@ -1346,7 +1346,7 @@ SUBROUTINE CalcWallAbsoprtion(IntersectionPos, GlobSideID, DONE, ForceWallSample LOGICAL :: ForceWallSampleLoc !--------------------------------------------------------------------------------------------------! #if USE_MPI -ASSOCIATE( PhotonSampWallProc => PhotonSampWall ) +ASSOCIATE( PhotonSampWall => PhotonSampWallProc ) #endif /*USE_MPI*/ SurfSideID = GlobalSide2SurfSide(SURF_SIDEID,GlobSideID) ! Check if photon is to be added to PhotonSampWall independent of the actual absorption/reflection From 381c2d4f5a73b7020eaaef01f5b13202fdb51951 Mon Sep 17 00:00:00 2001 From: Franziska Hild Date: Wed, 30 Aug 2023 17:08:56 +0200 Subject: [PATCH 167/495] BGK regressioncheck WEK_BGKFlow: new - Couette CO2-N2, deleted: 70degcone N2-O2, added recommended mixture option in userguide --- REGGIE.md | 4 +- .../Bhatnagar-Gross-Krook.md | 4 +- ...rfState_000.00200000000000000_reference.h5 | Bin 9648 -> 0 bytes .../WEK_BGKFlow/Flow_N2-O2_70degCone/DSMC.ini | 21 --- .../Flow_N2-O2_70degCone/analyze.ini | 7 - .../mesh_70degCone2D_Set1_noWake_mesh.h5 | Bin 203283 -> 0 bytes .../Flow_N2-O2_70degCone/parameter.ini | 156 ------------------ .../Flow_N2-O2_70degCone/readme.md | 4 - .../CouetteFlow_DSMCState_001.000000_ref.h5 | Bin 0 -> 54224 bytes .../DSMC.ini | 26 +++ .../analyze.ini | 8 + .../command_line.ini | 2 +- .../externals.ini | 9 + .../parameter.ini | 136 +++++++++++++++ .../post-vtk-DSMC-conversion/parameter.ini | 1 + .../pre-hopr/hopr.ini | 39 +++++ .../readme.md | 3 + 17 files changed, 227 insertions(+), 193 deletions(-) delete mode 100644 regressioncheck/WEK_BGKFlow/Flow_N2-O2_70degCone/70degCone2D_Set1_DSMCSurfState_000.00200000000000000_reference.h5 delete mode 100644 regressioncheck/WEK_BGKFlow/Flow_N2-O2_70degCone/DSMC.ini delete mode 100644 regressioncheck/WEK_BGKFlow/Flow_N2-O2_70degCone/analyze.ini delete mode 100755 regressioncheck/WEK_BGKFlow/Flow_N2-O2_70degCone/mesh_70degCone2D_Set1_noWake_mesh.h5 delete mode 100644 regressioncheck/WEK_BGKFlow/Flow_N2-O2_70degCone/parameter.ini delete mode 100644 regressioncheck/WEK_BGKFlow/Flow_N2-O2_70degCone/readme.md create mode 100644 regressioncheck/WEK_BGKFlow/MultiSpec_Supersonic_Couette_CO2-N2/CouetteFlow_DSMCState_001.000000_ref.h5 create mode 100644 regressioncheck/WEK_BGKFlow/MultiSpec_Supersonic_Couette_CO2-N2/DSMC.ini create mode 100644 regressioncheck/WEK_BGKFlow/MultiSpec_Supersonic_Couette_CO2-N2/analyze.ini rename regressioncheck/WEK_BGKFlow/{Flow_N2-O2_70degCone => MultiSpec_Supersonic_Couette_CO2-N2}/command_line.ini (76%) create mode 100644 regressioncheck/WEK_BGKFlow/MultiSpec_Supersonic_Couette_CO2-N2/externals.ini create mode 100644 regressioncheck/WEK_BGKFlow/MultiSpec_Supersonic_Couette_CO2-N2/parameter.ini create mode 100644 regressioncheck/WEK_BGKFlow/MultiSpec_Supersonic_Couette_CO2-N2/post-vtk-DSMC-conversion/parameter.ini create mode 100755 regressioncheck/WEK_BGKFlow/MultiSpec_Supersonic_Couette_CO2-N2/pre-hopr/hopr.ini create mode 100644 regressioncheck/WEK_BGKFlow/MultiSpec_Supersonic_Couette_CO2-N2/readme.md diff --git a/REGGIE.md b/REGGIE.md index 589591f98..d62e19251 100644 --- a/REGGIE.md +++ b/REGGIE.md @@ -439,7 +439,7 @@ Overview of the test cases performed every week. | ** | Flow_N2_70degCone | ** | 2D axisymmetric 70 degree cone | nProcs=6 | Surface Sampling, includes CalcSurfaceImpact and adaptive wall temperature | [Link](regressioncheck/WEK_DSMC/Flow_N2_70degCone/readme.md) | | ** | fully_periodic_3D | ** | Periodic boundary conditions in all three directions | nProcs=10,20,30 | Check whether particles end up outside of the domain | [Link](regressioncheck/WEK_DSMC/fully_periodic_3D/readme.md) | | ** | Surface_Sticking_Coefficient | ** | Channel flow with a sticking coefficient model | nProcs=5 | Surface sampling | [Link](regressioncheck/WEK_DSMC/Surface_Sticking_Coefficient/readme.md) | -| 5 | Flow_N2-O2_70degCone | [BGK](regressioncheck/WEK_BGKFlow/builds.ini) | 2D axisymmetric 70 degree cone with a N2-O2 mixture | nProcs=6 | | [Link](regressioncheck/WEK_DSMC/Flow_N2-O2_70degCone/readme.md) | -| ** | Flow_N2_70degCone | ** | 2D axisymmetric 70 degree cone | nProcs=6 | | [Link](regressioncheck/WEK_DSMC/Flow_N2_70degCone/readme.md) | +| 5 | Flow_N2_70degCone | [BGK](regressioncheck/WEK_BGKFlow/builds.ini) | 2D axisymmetric 70 degree cone | nProcs=6 | | [Link](regressioncheck/WEK_DSMC/Flow_N2_70degCone/readme.md) | | ** | MultiSpec_Supersonic_Couette_Ar-He | ** | Supersonic Couette flow with an Ar-He mixture | nProcs=5 | Temperature | [Link](regressioncheck/WEK_DSMC/MultiSpec_Supersonic_Couette_Ar-He/readme.md) | +| ** | MultiSpec_Supersonic_Couette_CO2-N2 | ** | Supersonic Couette flow with a CO2-N2 mixture | nProcs=5 | Temperature | [Link](regressioncheck/WEK_DSMC/MultiSpec_Supersonic_Couette_CO2-N2/readme.md) | | 6 | Flow_N2_70degCone | [FP](regressioncheck/WEK_FPFlow/builds.ini) | 2D axisymmetric 70 degree cone | nProcs=6 | Surface Sampling, includes CalcSurfaceImpact | [Link](regressioncheck/WEK_DSMC/Flow_N2_70degCone/readme.md) | diff --git a/docs/documentation/userguide/features-and-models/Bhatnagar-Gross-Krook.md b/docs/documentation/userguide/features-and-models/Bhatnagar-Gross-Krook.md index 3527840a0..05833f388 100644 --- a/docs/documentation/userguide/features-and-models/Bhatnagar-Gross-Krook.md +++ b/docs/documentation/userguide/features-and-models/Bhatnagar-Gross-Krook.md @@ -36,9 +36,9 @@ A parameter file and species initialization file is required, analogous to the D Particles-BGK-CollModel = 1 -The **recommended method is ESBGK**. If the simulation contains a gas mixture, a choice for the determination of the transport coefficients is available. The first model uses Wilke's mixture rules (`= 1`) to calculate the gas mixture viscosity and thermal conductivity. The second model utilizes collision integrals (derived for the VHS model, `= 2`) to calculate these mixture properties. +The **recommended method is ESBGK**. If the simulation contains a gas mixture, a choice for the determination of the transport coefficients is available. The first model uses Wilke's mixture rules (`= 1`) to calculate the gas mixture viscosity and thermal conductivity. The **recommended second model utilizes collision integrals** (derived for the VHS model, `= 2`) to calculate these mixture properties. - Particles-BGK-MixtureModel = 1 + Particles-BGK-MixtureModel = 2 The vibrational excitation can be controlled with the following flags, including the choice between continuous and quantized vibrational energy. diff --git a/regressioncheck/WEK_BGKFlow/Flow_N2-O2_70degCone/70degCone2D_Set1_DSMCSurfState_000.00200000000000000_reference.h5 b/regressioncheck/WEK_BGKFlow/Flow_N2-O2_70degCone/70degCone2D_Set1_DSMCSurfState_000.00200000000000000_reference.h5 deleted file mode 100644 index 6144f02876b7ffe2457ac561a9cf9e75e8e71353..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9648 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 E0d5wHI{*Lx diff --git a/regressioncheck/WEK_BGKFlow/Flow_N2-O2_70degCone/parameter.ini b/regressioncheck/WEK_BGKFlow/Flow_N2-O2_70degCone/parameter.ini deleted file mode 100644 index 03ab0e44e..000000000 --- a/regressioncheck/WEK_BGKFlow/Flow_N2-O2_70degCone/parameter.ini +++ /dev/null @@ -1,156 +0,0 @@ -! =============================================================================== ! -! EQUATION (linearscalaradvection) -! =============================================================================== ! -IniExactFunc = 0 - -! =============================================================================== ! -! DISCRETIZATION -! =============================================================================== ! -N = 1 ! Polynomial degree -NAnalyze = 1 ! Number of analyze points - -! =============================================================================== ! -! MESH -! =============================================================================== ! -MeshFile = mesh_70degCone2D_Set1_noWake_mesh.h5 -useCurveds = F -TrackingMethod = triatracking -! =============================================================================== ! -! OUTPUT / VISUALIZATION -! =============================================================================== ! -ProjectName = 70degCone2D_Set1 -Logging = F -printRandomSeeds = F -IterDisplayStep = 100 -! =============================================================================== ! -! CALCULATION -! =============================================================================== ! -tend = 2.0E-3 ! End time -Analyze_dt = 5.0E-4 ! Timestep of analyze outputs -CFLscale = 0.2 ! Scaling of theoretical CFL number -c0 = 299792458. -eps = 8.8541878176E-12 -mu = 12.566370614e-7 -! =============================================================================== ! -! LOAD BALANCE -! =============================================================================== ! -DoLoadBalance = T -PartWeightLoadBalance = T -DoInitialAutoRestart = T -InitialAutoRestart-PartWeightLoadBalance = T -LoadBalanceMaxSteps = 2 ! one initial and one at 5E-4 -! =============================================================================== ! -! BOUNDARIES -! =============================================================================== ! -Part-nBounds = 5 -Part-Boundary1-SourceName = IN -Part-Boundary1-Condition = open -Part-Boundary2-SourceName = OUT -Part-Boundary2-Condition = open -Part-Boundary3-SourceName = WALL -Part-Boundary3-Condition = reflective -Part-Boundary3-WallTemp = 300. -Part-Boundary3-TransACC = 1. -Part-Boundary3-MomentumACC = 1. -Part-Boundary3-VibACC = 1. -Part-Boundary3-RotACC = 1. -Part-Boundary4-SourceName = SYMAXIS -Part-Boundary4-Condition = symmetric_axis -Part-Boundary5-SourceName = ROTSYM -Part-Boundary5-Condition = symmetric -Part-FIBGMdeltas = (/0.001,0.001,0.01/) -! =============================================================================== ! -! PARTICLES -! =============================================================================== ! -Part-maxParticleNumber = 500000 -Part-nSpecies = 2 -! =============================================================================== ! -! Species1 N2 -! =============================================================================== ! -Part-Species1-ChargeIC=0 -Part-Species1-MassIC=4.65E-26 -Part-Species1-MacroParticleFactor = 1E10 - -Part-Species1-nInits = 1 -Part-Species1-Init1-SpaceIC = cell_local -Part-Species1-Init1-velocityDistribution = maxwell_lpn -Part-Species1-Init1-VeloIC = 1502.57 -Part-Species1-Init1-VeloVecIC = (/1.,0.,0./) -Part-Species1-Init1-PartDensity = 2.775E+020 -Part-Species1-Init1-MWTemperatureIC = 13.3 -Part-Species1-Init1-TempVib = 13.3 -Part-Species1-Init1-TempRot = 13.3 - -Part-Species1-nSurfaceFluxBCs = 1 -Part-Species1-Surfaceflux1-BC = 1 -Part-Species1-Surfaceflux1-velocityDistribution = maxwell_lpn -Part-Species1-Surfaceflux1-VeloIC = 1502.57 -Part-Species1-Surfaceflux1-VeloVecIC = (/1.,0.,0./) -Part-Species1-Surfaceflux1-PartDensity = 2.775E+020 -Part-Species1-Surfaceflux1-MWTemperatureIC = 13.3 -Part-Species1-Surfaceflux1-TempVib = 13.3 -Part-Species1-Surfaceflux1-TempRot = 13.3 -! =============================================================================== ! -! Species2 O2 -! =============================================================================== ! -Part-Species2-ChargeIC=0 -Part-Species2-MassIC=5.31400E-26 -Part-Species2-MacroParticleFactor = 1E10 - -Part-Species2-nInits = 1 -Part-Species2-Init1-SpaceIC = cell_local -Part-Species2-Init1-velocityDistribution = maxwell_lpn -Part-Species2-Init1-VeloIC = 1502.57 -Part-Species2-Init1-VeloVecIC = (/1.,0.,0./) -Part-Species2-Init1-PartDensity = 0.925E+020 -Part-Species2-Init1-MWTemperatureIC = 13.3 -Part-Species2-Init1-TempVib = 13.3 -Part-Species2-Init1-TempRot = 13.3 - -Part-Species2-nSurfaceFluxBCs = 1 -Part-Species2-Surfaceflux1-BC = 1 -Part-Species2-Surfaceflux1-velocityDistribution = maxwell_lpn -Part-Species2-Surfaceflux1-VeloIC = 1502.57 -Part-Species2-Surfaceflux1-VeloVecIC = (/1.,0.,0./) -Part-Species2-Surfaceflux1-PartDensity = 0.925E+020 -Part-Species2-Surfaceflux1-MWTemperatureIC = 13.3 -Part-Species2-Surfaceflux1-TempVib = 13.3 -Part-Species2-Surfaceflux1-TempRot = 13.3 -! =============================================================================== ! -! DSMC -! =============================================================================== ! -UseDSMC = T -ManualTimeStep= 2.0000E-07 -Particles-HaloEpsVelo = 12.000E+03 -Particles-NumberForDSMCOutputs = 1 -Part-TimeFracForSampling = 0.5 -Particles-DSMC-CalcSurfaceVal = T -Particles-DSMC-CalcQualityFactors = T -Particles-DSMCReservoirSim = F -Particles-DSMC-CollisMode = 2 !(1:elast coll, 2: elast + rela, 3:chem) -Part-NumberOfRandomSeeds = 2 -Particles-RandomSeed1 = 1 -Particles-RandomSeed2 = 2 -Particles-ModelForVibrationEnergy = 0 !(0:SHO, 1:TSHO) -Particles-DSMC-UseOctree = T -Particles-DSMC-UseNearestNeighbour = T -Particles-OctreePartNumNode = 40 -Particles-OctreePartNumNodeMin = 28 -Particles-MPIWeight = 1000 -! Symmetry -Particles-Symmetry-Order = 2 -Particles-Symmetry2DAxisymmetric = T -! Radial Weighting -Particles-RadialWeighting = T -Particles-RadialWeighting-PartScaleFactor = 60 -Particles-RadialWeighting-CloneMode = 2 -Particles-RadialWeighting-CloneDelay = 5 -! BGK-Flow -Particles-BGK-CollModel = 1 -Particles-BGK-MixtureModel = 1 -Particles-BGK-DoVibRelaxation = T -Particles-BGK-UseQuantVibEn = F -! BGK Refinement -Particles-BGK-DoCellAdaptation = T -Particles-BGK-MinPartsPerCell = 12 -Particles-BGK-SplittingDens = 3.8E20 diff --git a/regressioncheck/WEK_BGKFlow/Flow_N2-O2_70degCone/readme.md b/regressioncheck/WEK_BGKFlow/Flow_N2-O2_70degCone/readme.md deleted file mode 100644 index 7d59cfd97..000000000 --- a/regressioncheck/WEK_BGKFlow/Flow_N2-O2_70degCone/readme.md +++ /dev/null @@ -1,4 +0,0 @@ -# BGK-Flow - Hypersonic flow around a 70° Cone (Axisymmetric) -* Simulation of a hypersonic N2/O2 flow around a 70° blunted cone at M = 20 -* Test case based on Allègre, J., Bisch, D., & Lengrand, J. C. (1997). Experimental Rarefied Heat Transfer at Hypersonic Conditions over 70-Degree Blunted Cone. Journal of Spacecraft and Rockets, 34(6), 724–728. https://doi.org/10.2514/2.3302 -* Comparison of the heat flux with a reference surface state file (produced with DSMC) diff --git a/regressioncheck/WEK_BGKFlow/MultiSpec_Supersonic_Couette_CO2-N2/CouetteFlow_DSMCState_001.000000_ref.h5 b/regressioncheck/WEK_BGKFlow/MultiSpec_Supersonic_Couette_CO2-N2/CouetteFlow_DSMCState_001.000000_ref.h5 new file mode 100644 index 0000000000000000000000000000000000000000..7a11973208d5b486c876138d14962a0a06ba8787 GIT binary patch literal 54224 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 literal 0 HcmV?d00001 diff --git a/regressioncheck/WEK_BGKFlow/MultiSpec_Supersonic_Couette_CO2-N2/DSMC.ini b/regressioncheck/WEK_BGKFlow/MultiSpec_Supersonic_Couette_CO2-N2/DSMC.ini new file mode 100644 index 000000000..e606a8d77 --- /dev/null +++ b/regressioncheck/WEK_BGKFlow/MultiSpec_Supersonic_Couette_CO2-N2/DSMC.ini @@ -0,0 +1,26 @@ +! =============================================================================== ! +! Species1, CO2 +! =============================================================================== ! +Part-Species1-SpeciesName = CO2 +Part-Species1-PolyatomicMol = true +Part-Species1-InteractionID = 2 +Part-Species1-Tref = 273 +Part-Species1-dref = 5.10E-10 +Part-Species1-omega = 0.24 +Part-Species1-NumOfAtoms = 3 +Part-Species1-LinearMolec = true +Part-Species1-CharaTempVib1 = 959.66 +Part-Species1-CharaTempVib2 = 959.66 +Part-Species1-CharaTempVib3 = 1918.6 +Part-Species1-CharaTempVib4 = 3382 +Part-Species1-Ediss_eV = 5.45 +! =============================================================================== ! +! Species2, N2 +! =============================================================================== ! +Part-Species2-SpeciesName = N2 +Part-Species2-InteractionID = 2 +Part-Species2-Tref = 273 +Part-Species2-dref = 4.17E-10 +Part-Species2-omega = 0.24 +Part-Species2-CharaTempVib = 3393.3 +Part-Species2-Ediss_eV = 9.79 diff --git a/regressioncheck/WEK_BGKFlow/MultiSpec_Supersonic_Couette_CO2-N2/analyze.ini b/regressioncheck/WEK_BGKFlow/MultiSpec_Supersonic_Couette_CO2-N2/analyze.ini new file mode 100644 index 000000000..ee8aafcd1 --- /dev/null +++ b/regressioncheck/WEK_BGKFlow/MultiSpec_Supersonic_Couette_CO2-N2/analyze.ini @@ -0,0 +1,8 @@ +! hdf5 diff +h5diff_file = CouetteFlow_DSMCState_001.000000.h5 +h5diff_reference_file = CouetteFlow_DSMCState_001.000000_ref.h5 +h5diff_data_set = ElemData +h5diff_tolerance_value = 4 +h5diff_tolerance_type = absolute +h5diff_max_differences = 300 +h5diff_one_diff_per_run = T diff --git a/regressioncheck/WEK_BGKFlow/Flow_N2-O2_70degCone/command_line.ini b/regressioncheck/WEK_BGKFlow/MultiSpec_Supersonic_Couette_CO2-N2/command_line.ini similarity index 76% rename from regressioncheck/WEK_BGKFlow/Flow_N2-O2_70degCone/command_line.ini rename to regressioncheck/WEK_BGKFlow/MultiSpec_Supersonic_Couette_CO2-N2/command_line.ini index 11fbc4524..a2534cbf8 100644 --- a/regressioncheck/WEK_BGKFlow/Flow_N2-O2_70degCone/command_line.ini +++ b/regressioncheck/WEK_BGKFlow/MultiSpec_Supersonic_Couette_CO2-N2/command_line.ini @@ -1,2 +1,2 @@ -MPI=6 +MPI=5 cmd_suffix=DSMC.ini diff --git a/regressioncheck/WEK_BGKFlow/MultiSpec_Supersonic_Couette_CO2-N2/externals.ini b/regressioncheck/WEK_BGKFlow/MultiSpec_Supersonic_Couette_CO2-N2/externals.ini new file mode 100644 index 000000000..38d2ee749 --- /dev/null +++ b/regressioncheck/WEK_BGKFlow/MultiSpec_Supersonic_Couette_CO2-N2/externals.ini @@ -0,0 +1,9 @@ +! --- Externals Tool Reggie +MPI = 1 , 1 ! Single execution +externalbinary = ./bin/piclas2vtk , ./bin/hopr ! Relative binary path in build directory +externaldirectory = post-vtk-DSMC-conversion , ./pre-hopr ! Directory name, where the files are located for the external tool reggie +externalruntime = post , pre ! Run after piclas is completed (post: after, pre: before) +cmd_suffix = ../CouetteFlow_DSMCState_001.000000.h5 , ! Suffix for the binary execution +cmd_pre_execute = cp\s-r\s../pre-hopr\s. , ! "\s" resembles a white space character in the command (simply using " " is not allowed) + +nocrosscombination:MPI,externalbinary,externaldirectory,externalruntime,cmd_suffix,cmd_pre_execute diff --git a/regressioncheck/WEK_BGKFlow/MultiSpec_Supersonic_Couette_CO2-N2/parameter.ini b/regressioncheck/WEK_BGKFlow/MultiSpec_Supersonic_Couette_CO2-N2/parameter.ini new file mode 100644 index 000000000..aa3a184ae --- /dev/null +++ b/regressioncheck/WEK_BGKFlow/MultiSpec_Supersonic_Couette_CO2-N2/parameter.ini @@ -0,0 +1,136 @@ +! =============================================================================== ! +! EQUATION (linearscalaradvection) +! =============================================================================== ! +IniExactFunc = 0 +! =============================================================================== ! +! DISCRETIZATION +! =============================================================================== ! +N = 1 ! Polynomial degree +NAnalyze = 1 ! Number of analyze points +CFLscale = 0.2 ! Scaling of theoretical CFL number +! =============================================================================== ! +! POSTI +! =============================================================================== ! +NVisu = 1 ! Number of visualization points +TimeStampLength = 10 +! =============================================================================== ! +! MESH +! =============================================================================== ! +MeshFile = pre-hopr/tunnel_mesh.h5 +useCurveds = F +! =============================================================================== ! +! OUTPUT / VISUALIZATION +! =============================================================================== ! +ProjectName = CouetteFlow +Logging = F +WriteErrorFiles = F +! =============================================================================== ! +! CALCULATION +! =============================================================================== ! +IterDisplayStep = 1000 +Part-AnalyzeStep = 1000 + +tend = 1.0 +Analyze_dt = 0.25 + +ManualTimeStep = 1E-5 + +Particles-NumberForDSMCOutputs=1 +Part-TimeFracForSampling=0.75 +! =============================================================================== ! +! LOAD BALANCE +! =============================================================================== ! +DoLoadBalance = T +PartWeightLoadBalance = T + +! Initial load balance +DoInitialAutoRestart = T +InitialAutoRestart-PartWeightLoadBalance = T +LoadBalanceMaxSteps = 2 +Load-DeviationThreshold = 1E-9 +! =============================================================================== ! +! ESBGK +! =============================================================================== ! +Particles-BGK-CollModel = 1 ! 1: ESBGK, 2: SBGK, 3: BGK +Particles-BGK-MixtureModel = 2 +! =============================================================================== ! +! BOUNDARIES +! =============================================================================== ! +Part-nBounds=6 +Part-Boundary1-SourceName=BC_periodicx+ +Part-Boundary1-Condition=periodic +Part-Boundary2-SourceName=BC_periodicx- +Part-Boundary2-Condition=periodic +Part-Boundary3-SourceName=BC_periodicy+ +Part-Boundary3-Condition=reflective +Part-Boundary3-MomentumACC=1. +Part-Boundary3-TransACC=1. +Part-Boundary3-WallTemp=273. +Part-Boundary3-WallVelo=(/350,0.,0./) +Part-Boundary4-SourceName=BC_periodicy- +Part-Boundary4-Condition=reflective +Part-Boundary4-MomentumACC=1. +Part-Boundary4-TransACC=1. +Part-Boundary4-WallTemp=273. +Part-Boundary4-WallVelo=(/-350,0.,0./) +Part-Boundary5-SourceName=BC_periodicz+ +Part-Boundary5-Condition=periodic +Part-Boundary6-SourceName=BC_periodicz- +Part-Boundary6-Condition=periodic +Part-nPeriodicVectors=2 +Part-FIBGMdeltas=(/0.005,0.005,0.005/) +! =============================================================================== ! +! PARTICLES +! =============================================================================== ! +Part-maxParticleNumber=50000 +Part-nSpecies=2 +Part-Species1-MacroParticleFactor=1E11 +Part-Species2-MacroParticleFactor=1E11 +! =============================================================================== ! +! Species1 CO2 +! =============================================================================== ! +Part-Species1-MassIC = 7.306E-26 +Part-Species1-ChargeIC=0 + +Part-Species1-nInits=1 +Part-Species1-Init1-SpaceIC=cuboid +Part-Species1-Init1-PartDensity=6.5E19 +Part-Species1-Init1-velocityDistribution=maxwell_lpn +Part-Species1-Init1-MWTemperatureIC=273. +Part-Species1-Init1-TempVib=273. +Part-Species1-Init1-TempRot=273. +Part-Species1-Init1-BasePointIC=(/0.0,-0.5,0.0/) +Part-Species1-Init1-BaseVector1IC=(/0.005,0.0,0.0/) +Part-Species1-Init1-BaseVector2IC=(/0.,1.0,0.0/) +Part-Species1-Init1-CuboidHeightIC=0.005 +Part-Species1-Init1-VeloIC=0.0 +Part-Species1-Init1-VeloVecIC=(/1.,0.,0./) +! =============================================================================== ! +! Species2 N2 +! =============================================================================== ! +Part-Species2-ChargeIC=0 +Part-Species2-MassIC=4.65E-26 ! N2 Molecular Mass + +Part-Species2-nInits=1 +Part-Species2-Init1-SpaceIC=cuboid +Part-Species2-Init1-PartDensity=6.5E19 +Part-Species2-Init1-velocityDistribution=maxwell_lpn +Part-Species2-Init1-MWTemperatureIC=273. +Part-Species2-Init1-TempVib=273. +Part-Species2-Init1-TempRot=273. +Part-Species2-Init1-BasePointIC=(/0.0,-0.5,0.0/) +Part-Species2-Init1-BaseVector1IC=(/0.005,0.0,0.0/) +Part-Species2-Init1-BaseVector2IC=(/0.,1.0,0.0/) +Part-Species2-Init1-CuboidHeightIC=0.005 +Part-Species2-Init1-VeloIC=0.0 +Part-Species2-Init1-VeloVecIC=(/1.,0.,0./) +! =============================================================================== ! +! DSMC +! =============================================================================== ! +Particles-DSMC-CalcQualityFactors=true +UseDSMC=true +Particles-DSMC-CollisMode=2 !(1:elast coll, 2: elast + rela, 3:chem) +Part-NumberOfRandomSeeds =2 +Particles-RandomSeed1= 1 +Particles-RandomSeed2= 2 +Particles-HaloEpsVelo = 9000 diff --git a/regressioncheck/WEK_BGKFlow/MultiSpec_Supersonic_Couette_CO2-N2/post-vtk-DSMC-conversion/parameter.ini b/regressioncheck/WEK_BGKFlow/MultiSpec_Supersonic_Couette_CO2-N2/post-vtk-DSMC-conversion/parameter.ini new file mode 100644 index 000000000..26b9fd923 --- /dev/null +++ b/regressioncheck/WEK_BGKFlow/MultiSpec_Supersonic_Couette_CO2-N2/post-vtk-DSMC-conversion/parameter.ini @@ -0,0 +1 @@ +NVisu = 1 \ No newline at end of file diff --git a/regressioncheck/WEK_BGKFlow/MultiSpec_Supersonic_Couette_CO2-N2/pre-hopr/hopr.ini b/regressioncheck/WEK_BGKFlow/MultiSpec_Supersonic_Couette_CO2-N2/pre-hopr/hopr.ini new file mode 100755 index 000000000..17388af01 --- /dev/null +++ b/regressioncheck/WEK_BGKFlow/MultiSpec_Supersonic_Couette_CO2-N2/pre-hopr/hopr.ini @@ -0,0 +1,39 @@ +! =============================================================================== ! +! PREPROC +! =============================================================================== ! +projectname=tunnel +mode=1 ! 1 Cartesian 2 gambit file 3 CGNS +useCurveds=F +DebugVisu=T +!=============================================================================== ! +! MESH +!=============================================================================== ! + Mode =1 ! 1 Cartesian 2 gambit file 3 CGNS + nZones =1 ! number of zones + Corner =(/0.,-0.5,0.,,0.005,-0.5,0.,,0.005,0.5,0.,,0.,0.5,0.,,0.,-0.5,0.005,,0.005,-0.5,0.005,,0.005,0.5,0.005,,0.,0.5,0.005/) + nElems =(/1,100,1/) + BCIndex =(/5,3,2,4,1,6/) ! Indices of UserDefinedBoundaries + elemtype =108 ! Elementform (108: Hexaeder) + useCurveds =F ! T if curved boundaries defined + SpaceQuandt =1. ! characteristic length of the mesh + ConformConnect=T + +!=============================================================================== ! +! BOUNDARY CONDITIONS +!=============================================================================== ! + nUserDefinedBoundaries=6 + BoundaryName=BC_periodicx+ ! Periodic (+vv1) + BoundaryType=(/1,0,0,1/) ! Periodic (+vv1) + BoundaryName=BC_periodicx- ! Periodic (-vv1) + BoundaryType=(/1,0,0,-1/) ! Periodic (-vv1) + BoundaryName=BC_periodicy+ ! Periodic (+vv2) + BoundaryType=(/4,0,0,0/) ! Periodic (+vv2) + BoundaryName=BC_periodicy- ! Periodic (-vv2) + BoundaryType=(/4,0,0,0/) ! Periodic (-vv2) + BoundaryName=BC_periodicz+ ! Periodic (+vv3) + BoundaryType=(/1,0,0,2/) ! Periodic (+vv3) + BoundaryName=BC_periodicz- ! Periodic (-vv3) + BoundaryType=(/1,0,0,-2/) ! Periodic (-vv3) + nVV=2 ! Anzahl der Verschiebungsvektoren für periodische RB (=Anzahl periodische Ränder) + VV=(/0.005,0.,0./) ! Verschiebungsvektor 1 (x-Richtung) + VV=(/0.,0.,0.005/) ! Verschiebungsvektor 3 (z-Richtung) diff --git a/regressioncheck/WEK_BGKFlow/MultiSpec_Supersonic_Couette_CO2-N2/readme.md b/regressioncheck/WEK_BGKFlow/MultiSpec_Supersonic_Couette_CO2-N2/readme.md new file mode 100644 index 000000000..21d214e4d --- /dev/null +++ b/regressioncheck/WEK_BGKFlow/MultiSpec_Supersonic_Couette_CO2-N2/readme.md @@ -0,0 +1,3 @@ +# BGK Multispecies - Supersonic Couette flow +* Simulation of supersonic Couette flow: upper (y+) and lower (y-) boundaries with a wall velocity of +/-350 m/s, periodic boundary conditions in x and z +* CO2-N2 mixture From 743aecf943aab75e41eecde58a9d1b436649da8b Mon Sep 17 00:00:00 2001 From: Franziska Hild Date: Thu, 31 Aug 2023 15:19:17 +0200 Subject: [PATCH 168/495] BGK regressioncheck WEK_BGKFlow: updated ref files for Couette Ar-He + changed analyze.ini to 600 max diffs because of vibrational temperatures --- ...teFlow_DSMCState_001.000000_CollInt_ref.h5 | Bin 52488 -> 54216 bytes ...etteFlow_DSMCState_001.000000_Wilke_ref.h5 | Bin 52488 -> 54216 bytes .../analyze.ini | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) diff --git a/regressioncheck/WEK_BGKFlow/MultiSpec_Supersonic_Couette_Ar-He/CouetteFlow_DSMCState_001.000000_CollInt_ref.h5 b/regressioncheck/WEK_BGKFlow/MultiSpec_Supersonic_Couette_Ar-He/CouetteFlow_DSMCState_001.000000_CollInt_ref.h5 index 6091c765376a5fcecd0c86d2c50a38f7beec1576..a4322bc385869966766a634fa087d8869dabcc0b 100644 GIT binary patch literal 54216 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 H3GV*~=i!X^ literal 52488 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 diff --git a/regressioncheck/WEK_BGKFlow/MultiSpec_Supersonic_Couette_Ar-He/CouetteFlow_DSMCState_001.000000_Wilke_ref.h5 b/regressioncheck/WEK_BGKFlow/MultiSpec_Supersonic_Couette_Ar-He/CouetteFlow_DSMCState_001.000000_Wilke_ref.h5 index 6aa323bb9f9767ae0f0cf39c879c837dfd45ab2e..3cc6b5f34951ff996ed71a838b45aebc34f8d86a 100644 GIT binary patch literal 54216 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 Wpx*J_bSoQ}HwgRx_Wyw Date: Fri, 1 Sep 2023 08:30:38 +0200 Subject: [PATCH 169/495] BGK regressioncheck WEK_BGKFlow: comment in analyze.ini to 600 max diffs --- .../WEK_BGKFlow/MultiSpec_Supersonic_Couette_CO2-N2/analyze.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regressioncheck/WEK_BGKFlow/MultiSpec_Supersonic_Couette_CO2-N2/analyze.ini b/regressioncheck/WEK_BGKFlow/MultiSpec_Supersonic_Couette_CO2-N2/analyze.ini index 102af287d..550e3909b 100644 --- a/regressioncheck/WEK_BGKFlow/MultiSpec_Supersonic_Couette_CO2-N2/analyze.ini +++ b/regressioncheck/WEK_BGKFlow/MultiSpec_Supersonic_Couette_CO2-N2/analyze.ini @@ -4,5 +4,5 @@ h5diff_reference_file = CouetteFlow_DSMCState_001.000000_ref.h5 h5diff_data_set = ElemData h5diff_tolerance_value = 4 h5diff_tolerance_type = absolute -h5diff_max_differences = 600 +h5diff_max_differences = 600 ! Allowed differences for 3x100 densities and 3x100 vibrational temperatures h5diff_one_diff_per_run = T From df22d3c100641c108318bc85de06ef5297ea3f46 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Fri, 1 Sep 2023 11:18:24 +0200 Subject: [PATCH 170/495] Deactivate reggie compiling PETSc+INT8 for now --- regressioncheck/NIG_IntKind8/builds.ini | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/regressioncheck/NIG_IntKind8/builds.ini b/regressioncheck/NIG_IntKind8/builds.ini index 30db78f02..0393379e9 100644 --- a/regressioncheck/NIG_IntKind8/builds.ini +++ b/regressioncheck/NIG_IntKind8/builds.ini @@ -7,7 +7,8 @@ LIBS_BUILD_HDF5 = OFF PICLAS_POLYNOMIAL_DEGREE = N PICLAS_EQNSYSNAME = maxwell , maxwell , poisson , poisson PICLAS_TIMEDISCMETHOD = DSMC , RK4 , Leapfrog , Boris-Leapfrog -PICLAS_PETSC = OFF , OFF , OFF , ON +!PICLAS_PETSC = OFF , OFF , OFF , ON ! This used to test if petsc compiles with INT8 but if the code actually runs is untested +PICLAS_PETSC = OFF , OFF , OFF , OFF LIBS_USE_MPI = ON PICLAS_NODETYPE = GAUSS PICLAS_INTKIND8 = ON From d642d8d9f46e42187056c940cddf0625df9adb2e Mon Sep 17 00:00:00 2001 From: Julian Beyer Date: Mon, 4 Sep 2023 16:07:00 +0200 Subject: [PATCH 171/495] prepared for full mesh --- src/particles/particle_init.f90 | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/particles/particle_init.f90 b/src/particles/particle_init.f90 index f52581c37..1cbf00da9 100644 --- a/src/particles/particle_init.f90 +++ b/src/particles/particle_init.f90 @@ -243,6 +243,10 @@ SUBROUTINE InitParticleGlobals() LBWRITE(UNIT_stdOut,'(A)') "TrackingMethod set to TriaTracking due to Symmetry2D." END IF +#if (PP_TimeDiscMethod==600) + ! PerformRayTracing = .TRUE. !todo: uncomment if merged with feature.radtrans.ray.tracing +#endif + LBWRITE(UNIT_stdOut,'(A)')' INIT PARTICLE GLOBALS DONE' END SUBROUTINE InitParticleGlobals From d92ed54c082ca1bf7c3ab73aa3c144527eb68515 Mon Sep 17 00:00:00 2001 From: Julian Beyer Date: Mon, 4 Sep 2023 16:21:24 +0200 Subject: [PATCH 172/495] comments --- src/radiation/radiation_solver/radiation_atoms.f90 | 4 ++-- .../radiation_solver/radiation_excitation.f90 | 2 +- src/radiation/radiation_solver/radiation_main.f90 | 13 +++++++++---- .../radiation_solver/radiation_molecules.f90 | 2 +- 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/radiation/radiation_solver/radiation_atoms.f90 b/src/radiation/radiation_solver/radiation_atoms.f90 index 4dc9b6478..ca63a8ee6 100644 --- a/src/radiation/radiation_solver/radiation_atoms.f90 +++ b/src/radiation/radiation_solver/radiation_atoms.f90 @@ -38,7 +38,7 @@ MODULE MOD_Radiation_Atoms SUBROUTINE radiation_atoms(iElem, em_atom) !=================================================================================================================================== -! Main routine of atom radiation calculation +! Main routine of atomic radiation calculation !=================================================================================================================================== ! MODULES USE MOD_Globals @@ -143,7 +143,7 @@ SUBROUTINE radiation_atoms(iElem, em_atom) * SQRT(2*BoltzmannConst * T_mean * (Species(iSpec)%MassIC + Species(jSpec)%MassIC) & / (Pi*Species(iSpec)%MassIC*Species(jSpec)%MassIC)) END DO -! PRINT*, sigma_ij, T_mean, coll_freq_ij + nLines_considered = 0 ! --- loop over all transition lines diff --git a/src/radiation/radiation_solver/radiation_excitation.f90 b/src/radiation/radiation_solver/radiation_excitation.f90 index 3aacaff90..119c6243b 100644 --- a/src/radiation/radiation_solver/radiation_excitation.f90 +++ b/src/radiation/radiation_solver/radiation_excitation.f90 @@ -14,7 +14,7 @@ MODULE MOD_Radiation_Excitation !=================================================================================================================================== -! Module for calculation of the excited state density for radiation transitions +! Module for calculation of the excited state density for radiative transitions !=================================================================================================================================== ! MODULES ! IMPLICIT VARIABLE HANDLING diff --git a/src/radiation/radiation_solver/radiation_main.f90 b/src/radiation/radiation_solver/radiation_main.f90 index f020a5e43..8945a864e 100644 --- a/src/radiation/radiation_solver/radiation_main.f90 +++ b/src/radiation/radiation_solver/radiation_main.f90 @@ -38,7 +38,8 @@ MODULE MOD_Radiation SUBROUTINE radiation_main(iElem) !=================================================================================================================================== -! Main routine of radiation solver +! Main routine of the radiation solver, called cell-locally in the radtrans_init.f90 in each computational cell to calculate the +! local emission and absorption coefficients needed to solve the radiative transfer equation !=================================================================================================================================== ! MODULES USE MOD_Globals @@ -69,7 +70,7 @@ SUBROUTINE radiation_main(iElem) REAL :: em_tot, em_atom, em_mol, em_cont, sumAbsSpecies !=================================================================================================================================== -!------- initialize total emission variables +! --- initialize total emission variables em_atom = 0.0 em_mol = 0.0 em_cont = 0.0 @@ -78,6 +79,7 @@ SUBROUTINE radiation_main(iElem) !IF ( ((iElem+offsetElem).NE.208) .AND. ((iElem+offsetElem).NE.228) .AND. ((iElem+offsetElem).NE.3492) & !.AND. ((iElem+offsetElem).NE.4743) .AND. ((iElem+offsetElem).NE.6541)) RETURN +! --- get cell-local gas properties IF (RadiationSwitches%MacroRadInput) THEN DO iSpec = 1, nSpecies RadiationInput(iSpec)%NumDens = MacroRadInputParameters(iElem,iSpec,1) @@ -88,16 +90,20 @@ SUBROUTINE radiation_main(iElem) END DO END IF +! --- calculate upper state densities CALL radiation_excitation() +! --- calculate emission and absorption coefficients of atomic bound-bound radiation IF (RadiationSwitches%bb_at) THEN CALL radiation_atoms(iElem, em_atom) END IF +! --- calculate emission and absorption coefficients of diatomic/molecular bound-bound radiation IF (RadiationSwitches%bb_mol) THEN CALL radiation_molecules(iElem, em_mol) END IF +! --- calculate emission and absorption coefficients of contiuum radiation ! CALL radiation_continuum(iElem, em_cont) em_atom = em_atom * 4. * Pi @@ -110,8 +116,7 @@ SUBROUTINE radiation_main(iElem) ! WRITE(*,*) 'continuum emission : ', em_cont, '[w/m³]' ! WRITE(*,*) 'total emission : ', em_tot, '[w/m³]' ! WRITE(*,*) '' - - ! READ* + DO iWave=1, RadiationParameter%WaveLenDiscrCoarse sumAbsSpecies =SUM(Radiation_Absorption_SpeciesWave(iWave, :)) IF(sumAbsSpecies.GT.0.0) Radiation_Absorption_SpecPercent(iWave,:,GetGlobalElemID(iElem)) = NINT(Radiation_Absorption_SpeciesWave(iWave, :)/sumAbsSpecies*10000.) diff --git a/src/radiation/radiation_solver/radiation_molecules.f90 b/src/radiation/radiation_solver/radiation_molecules.f90 index 90a5d9560..7ba9cbb1d 100644 --- a/src/radiation/radiation_solver/radiation_molecules.f90 +++ b/src/radiation/radiation_solver/radiation_molecules.f90 @@ -38,7 +38,7 @@ MODULE MOD_Radiation_Molecules SUBROUTINE radiation_molecules(iElem, em_mol) !=================================================================================================================================== -! Main routine of atom radiation calculation +! Main routine of molecular radiation calculation !=================================================================================================================================== ! MODULES USE MOD_Globals From cb1af644261d1fe94df8cb4c62f819661a448b27 Mon Sep 17 00:00:00 2001 From: Tobias Ott Date: Mon, 4 Sep 2023 16:25:35 +0200 Subject: [PATCH 173/495] Ignore computation of imbalance when DoLoadBalance=F, even if PartWeightLoadBalance=T --- src/loadbalance/loadbalance.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/loadbalance/loadbalance.f90 b/src/loadbalance/loadbalance.f90 index 25d3ca63a..c42424b00 100644 --- a/src/loadbalance/loadbalance.f90 +++ b/src/loadbalance/loadbalance.f90 @@ -506,7 +506,7 @@ SUBROUTINE ComputeImbalance() REAL :: WeightSum_loc !=================================================================================================================================== -IF(.NOT.PerformLBSample .AND. .NOT.PerformPartWeightLB) THEN +IF(.NOT.PerformLBSample) THEN WeightSum = 0. TargetWeight = 0. CurrentImbalance = -1.0 From 906a95389c180f1fbf249ed86a83e27e9ca59852 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Mon, 4 Sep 2023 16:27:36 +0200 Subject: [PATCH 174/495] Changed reggies to use AbortExchangeProcs = T again --- regressioncheck/NIG_DSMC/RotPeriodicBCMulti/parameter.ini | 2 +- .../NIG_DSMC/RotPeriodicBCMultiInterPlane/parameter.ini | 2 +- .../volume_emission_polychromatic/parameter.ini | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/regressioncheck/NIG_DSMC/RotPeriodicBCMulti/parameter.ini b/regressioncheck/NIG_DSMC/RotPeriodicBCMulti/parameter.ini index 82b980e52..fb9e163e3 100644 --- a/regressioncheck/NIG_DSMC/RotPeriodicBCMulti/parameter.ini +++ b/regressioncheck/NIG_DSMC/RotPeriodicBCMulti/parameter.ini @@ -28,7 +28,7 @@ WriteErrorFiles = F CalcHaloInfo = T CalcMeshInfo = T CheckExchangeProcs = T -AbortExchangeProcs = F +AbortExchangeProcs = T !Particles-DSMC-CalcQualityFactors=T ! =============================================================================== ! ! CALCULATION diff --git a/regressioncheck/NIG_DSMC/RotPeriodicBCMultiInterPlane/parameter.ini b/regressioncheck/NIG_DSMC/RotPeriodicBCMultiInterPlane/parameter.ini index 1818c717f..7fd731482 100644 --- a/regressioncheck/NIG_DSMC/RotPeriodicBCMultiInterPlane/parameter.ini +++ b/regressioncheck/NIG_DSMC/RotPeriodicBCMultiInterPlane/parameter.ini @@ -28,7 +28,7 @@ WriteErrorFiles = F CalcHaloInfo = T CalcMeshInfo = T CheckExchangeProcs = T -AbortExchangeProcs = F +AbortExchangeProcs = T !Particles-DSMC-CalcQualityFactors=T ! =============================================================================== ! ! CALCULATION diff --git a/regressioncheck/NIG_Photoionization/volume_emission_polychromatic/parameter.ini b/regressioncheck/NIG_Photoionization/volume_emission_polychromatic/parameter.ini index bd91942d1..223fee34b 100644 --- a/regressioncheck/NIG_Photoionization/volume_emission_polychromatic/parameter.ini +++ b/regressioncheck/NIG_Photoionization/volume_emission_polychromatic/parameter.ini @@ -34,7 +34,7 @@ Part-AnalyzeStep = 1 CalcNumSpec = T CalcNumDens = T -CheckExchangeProcs = F ! deactivate the asymmetric communicator check +CheckExchangeProcs = T ! deactivate the asymmetric communicator check ! =============================================================================== ! ! CALCULATION ! =============================================================================== ! From 6fd2775d8877dca211258ce06c1a1e90680f4f6e Mon Sep 17 00:00:00 2001 From: Julian Beyer Date: Mon, 4 Sep 2023 16:56:18 +0200 Subject: [PATCH 175/495] comments and small improvements --- .../radiation_solver/radiation_readin.f90 | 6 +- .../radiation_solver/radiation_vars.f90 | 2 +- .../radiative_transfer/radtrans_init.f90 | 190 +----------------- .../radiative_transfer/radtrans_main.f90 | 12 +- .../radiative_transfer/radtrans_output.f90 | 4 +- .../radiative_transfer/radtrans_vars.f90 | 2 +- .../tracking/radtrans_tools.f90 | 31 ++- .../tracking/radtrans_tracking.f90 | 2 +- 8 files changed, 45 insertions(+), 204 deletions(-) diff --git a/src/radiation/radiation_solver/radiation_readin.f90 b/src/radiation/radiation_solver/radiation_readin.f90 index 0155bc4b8..d678cb71d 100644 --- a/src/radiation/radiation_solver/radiation_readin.f90 +++ b/src/radiation/radiation_solver/radiation_readin.f90 @@ -14,7 +14,7 @@ MODULE MOD_Radiation_ReadIn !=================================================================================================================================== -! Module for FPFLOW +! Module for Radiation !=================================================================================================================================== ! MODULES ! IMPLICIT VARIABLE HANDLING @@ -42,7 +42,7 @@ MODULE MOD_Radiation_ReadIn SUBROUTINE Radiation_readin_atoms(iSpec) !=================================================================================================================================== -! Performs FP Momentum Evaluation +! Reads-in species constants for atomic radiation !=================================================================================================================================== ! MODULES USE MOD_Globals @@ -119,7 +119,7 @@ END SUBROUTINE Radiation_readin_atoms SUBROUTINE Radiation_readin_molecules(iSpec) !=================================================================================================================================== -! Performs FP Momentum Evaluation +! Reads-in species constants for molecular radiation !=================================================================================================================================== ! MODULES USE MOD_Globals diff --git a/src/radiation/radiation_solver/radiation_vars.f90 b/src/radiation/radiation_solver/radiation_vars.f90 index b9f38a57a..4584dca85 100644 --- a/src/radiation/radiation_solver/radiation_vars.f90 +++ b/src/radiation/radiation_solver/radiation_vars.f90 @@ -13,7 +13,7 @@ !================================================================================================================================== MODULE MOD_Radiation_Vars !=================================================================================================================================== -! Contains the FP Flow variables +! Contains the radiation variables !=================================================================================================================================== ! MODULES ! IMPLICIT VARIABLE HANDLING diff --git a/src/radiation/radiative_transfer/radtrans_init.f90 b/src/radiation/radiative_transfer/radtrans_init.f90 index 08430dcbe..b7cefc4a8 100644 --- a/src/radiation/radiative_transfer/radtrans_init.f90 +++ b/src/radiation/radiative_transfer/radtrans_init.f90 @@ -14,7 +14,7 @@ MODULE MOD_RadiationTrans_Init !=================================================================================================================================== -! Initialization of Radiation Transport +! Initialization of Radiative Transfer !=================================================================================================================================== ! MODULES ! IMPLICIT VARIABLE HANDLING @@ -35,7 +35,7 @@ MODULE MOD_RadiationTrans_Init CONTAINS !================================================================================================================================== -!> Define parameters for FP-Flow +!> Define parameters for radiative transfer !================================================================================================================================== SUBROUTINE DefineParametersRadiationTrans() ! MODULES @@ -64,7 +64,7 @@ END SUBROUTINE DefineParametersRadiationTrans SUBROUTINE InitRadiationTransport() !=================================================================================================================================== -! Initialization of the radiation transport solver +! Initialization of the radiative transfer solver !=================================================================================================================================== ! MODULES USE MOD_Globals @@ -478,7 +478,7 @@ END SUBROUTINE InitRadiationTransport SUBROUTINE HALTON( ind, dims, rand ) !=================================================================================================================================== -! modified particle emmission for LD case +! Halton sequence for reducing stochastical noise in radiative transfer !=================================================================================================================================== ! MODULES ! IMPLICIT VARIABLE HANDLING @@ -514,7 +514,7 @@ END SUBROUTINE HALTON SUBROUTINE ElemInObsCone(ElemID, ElemInCone) !=================================================================================================================================== -! modified particle emmission for LD case +! Routine to check if element is in opening cone of observation angle of radiative transfer !=================================================================================================================================== ! MODULES USE MOD_Globals @@ -638,7 +638,7 @@ END SUBROUTINE ElemInObsCone SUBROUTINE ElemOnLineOfSight(ElemID, ElemInCone) !=================================================================================================================================== -! modified particle emmission for LD case +! Routine to check if element is on line of sight of radiative transfer !=================================================================================================================================== ! MODULES USE MOD_Globals @@ -731,7 +731,7 @@ END SUBROUTINE ElemOnLineOfSight INTEGER FUNCTION PRIME(n) !=================================================================================================================================== -! modified particle emmission for LD case +! contains prime numbers for initialization of Halton sequence !=================================================================================================================================== ! MODULES ! IMPLICIT VARIABLE HANDLING @@ -744,188 +744,18 @@ INTEGER FUNCTION PRIME(n) ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -INTEGER, PARAMETER :: prime_max=1600 +INTEGER, PARAMETER :: prime_max=50 INTEGER, SAVE :: icall = 0, npvec(prime_max) INTEGER, INTENT(IN) :: n !=================================================================================================================================== IF (icall.EQ.0) THEN icall = 1 - npvec(1:100) = (/ & + npvec(1:50) = (/ & 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, & 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, & 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, & 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, & - 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, & - 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, & - 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, & - 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, & - 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, & - 467, 479, 487, 491, 499, 503, 509, 521, 523, 541 /) - npvec(101:200) = (/ & - 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, & - 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, & - 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, & - 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, & - 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, & - 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, & - 947, 953, 967, 971, 977, 983, 991, 997, 1009, 1013, & - 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, & - 1087, 1091, 1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151, & - 1153, 1163, 1171, 1181, 1187, 1193, 1201, 1213, 1217, 1223 /) - npvec(201:300) = (/ & - 1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283, 1289, 1291, & - 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367, 1373, & - 1381, 1399, 1409, 1423, 1427, 1429, 1433, 1439, 1447, 1451, & - 1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499, 1511, & - 1523, 1531, 1543, 1549, 1553, 1559, 1567, 1571, 1579, 1583, & - 1597, 1601, 1607, 1609, 1613, 1619, 1621, 1627, 1637, 1657, & - 1663, 1667, 1669, 1693, 1697, 1699, 1709, 1721, 1723, 1733, & - 1741, 1747, 1753, 1759, 1777, 1783, 1787, 1789, 1801, 1811, & - 1823, 1831, 1847, 1861, 1867, 1871, 1873, 1877, 1879, 1889, & - 1901, 1907, 1913, 1931, 1933, 1949, 1951, 1973, 1979, 1987 /) - npvec(301:400) = (/ & - 1993, 1997, 1999, 2003, 2011, 2017, 2027, 2029, 2039, 2053, & - 2063, 2069, 2081, 2083, 2087, 2089, 2099, 2111, 2113, 2129, & - 2131, 2137, 2141, 2143, 2153, 2161, 2179, 2203, 2207, 2213, & - 2221, 2237, 2239, 2243, 2251, 2267, 2269, 2273, 2281, 2287, & - 2293, 2297, 2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357, & - 2371, 2377, 2381, 2383, 2389, 2393, 2399, 2411, 2417, 2423, & - 2437, 2441, 2447, 2459, 2467, 2473, 2477, 2503, 2521, 2531, & - 2539, 2543, 2549, 2551, 2557, 2579, 2591, 2593, 2609, 2617, & - 2621, 2633, 2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687, & - 2689, 2693, 2699, 2707, 2711, 2713, 2719, 2729, 2731, 2741 /) - npvec(401:500) = (/ & - 2749, 2753, 2767, 2777, 2789, 2791, 2797, 2801, 2803, 2819, & - 2833, 2837, 2843, 2851, 2857, 2861, 2879, 2887, 2897, 2903, & - 2909, 2917, 2927, 2939, 2953, 2957, 2963, 2969, 2971, 2999, & - 3001, 3011, 3019, 3023, 3037, 3041, 3049, 3061, 3067, 3079, & - 3083, 3089, 3109, 3119, 3121, 3137, 3163, 3167, 3169, 3181, & - 3187, 3191, 3203, 3209, 3217, 3221, 3229, 3251, 3253, 3257, & - 3259, 3271, 3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331, & - 3343, 3347, 3359, 3361, 3371, 3373, 3389, 3391, 3407, 3413, & - 3433, 3449, 3457, 3461, 3463, 3467, 3469, 3491, 3499, 3511, & - 3517, 3527, 3529, 3533, 3539, 3541, 3547, 3557, 3559, 3571 /) - npvec(501:600) = (/ & - 3581, 3583, 3593, 3607, 3613, 3617, 3623, 3631, 3637, 3643, & - 3659, 3671, 3673, 3677, 3691, 3697, 3701, 3709, 3719, 3727, & - 3733, 3739, 3761, 3767, 3769, 3779, 3793, 3797, 3803, 3821, & - 3823, 3833, 3847, 3851, 3853, 3863, 3877, 3881, 3889, 3907, & - 3911, 3917, 3919, 3923, 3929, 3931, 3943, 3947, 3967, 3989, & - 4001, 4003, 4007, 4013, 4019, 4021, 4027, 4049, 4051, 4057, & - 4073, 4079, 4091, 4093, 4099, 4111, 4127, 4129, 4133, 4139, & - 4153, 4157, 4159, 4177, 4201, 4211, 4217, 4219, 4229, 4231, & - 4241, 4243, 4253, 4259, 4261, 4271, 4273, 4283, 4289, 4297, & - 4327, 4337, 4339, 4349, 4357, 4363, 4373, 4391, 4397, 4409 /) - npvec(601:700) = (/ & - 4421, 4423, 4441, 4447, 4451, 4457, 4463, 4481, 4483, 4493, & - 4507, 4513, 4517, 4519, 4523, 4547, 4549, 4561, 4567, 4583, & - 4591, 4597, 4603, 4621, 4637, 4639, 4643, 4649, 4651, 4657, & - 4663, 4673, 4679, 4691, 4703, 4721, 4723, 4729, 4733, 4751, & - 4759, 4783, 4787, 4789, 4793, 4799, 4801, 4813, 4817, 4831, & - 4861, 4871, 4877, 4889, 4903, 4909, 4919, 4931, 4933, 4937, & - 4943, 4951, 4957, 4967, 4969, 4973, 4987, 4993, 4999, 5003, & - 5009, 5011, 5021, 5023, 5039, 5051, 5059, 5077, 5081, 5087, & - 5099, 5101, 5107, 5113, 5119, 5147, 5153, 5167, 5171, 5179, & - 5189, 5197, 5209, 5227, 5231, 5233, 5237, 5261, 5273, 5279 /) - npvec(701:800) = (/ & - 5281, 5297, 5303, 5309, 5323, 5333, 5347, 5351, 5381, 5387, & - 5393, 5399, 5407, 5413, 5417, 5419, 5431, 5437, 5441, 5443, & - 5449, 5471, 5477, 5479, 5483, 5501, 5503, 5507, 5519, 5521, & - 5527, 5531, 5557, 5563, 5569, 5573, 5581, 5591, 5623, 5639, & - 5641, 5647, 5651, 5653, 5657, 5659, 5669, 5683, 5689, 5693, & - 5701, 5711, 5717, 5737, 5741, 5743, 5749, 5779, 5783, 5791, & - 5801, 5807, 5813, 5821, 5827, 5839, 5843, 5849, 5851, 5857, & - 5861, 5867, 5869, 5879, 5881, 5897, 5903, 5923, 5927, 5939, & - 5953, 5981, 5987, 6007, 6011, 6029, 6037, 6043, 6047, 6053, & - 6067, 6073, 6079, 6089, 6091, 6101, 6113, 6121, 6131, 6133 /) - npvec(801:900) = (/ & - 6143, 6151, 6163, 6173, 6197, 6199, 6203, 6211, 6217, 6221, & - 6229, 6247, 6257, 6263, 6269, 6271, 6277, 6287, 6299, 6301, & - 6311, 6317, 6323, 6329, 6337, 6343, 6353, 6359, 6361, 6367, & - 6373, 6379, 6389, 6397, 6421, 6427, 6449, 6451, 6469, 6473, & - 6481, 6491, 6521, 6529, 6547, 6551, 6553, 6563, 6569, 6571, & - 6577, 6581, 6599, 6607, 6619, 6637, 6653, 6659, 6661, 6673, & - 6679, 6689, 6691, 6701, 6703, 6709, 6719, 6733, 6737, 6761, & - 6763, 6779, 6781, 6791, 6793, 6803, 6823, 6827, 6829, 6833, & - 6841, 6857, 6863, 6869, 6871, 6883, 6899, 6907, 6911, 6917, & - 6947, 6949, 6959, 6961, 6967, 6971, 6977, 6983, 6991, 6997 /) - npvec(901:1000) = (/ & - 7001, 7013, 7019, 7027, 7039, 7043, 7057, 7069, 7079, 7103, & - 7109, 7121, 7127, 7129, 7151, 7159, 7177, 7187, 7193, 7207, & - 7211, 7213, 7219, 7229, 7237, 7243, 7247, 7253, 7283, 7297, & - 7307, 7309, 7321, 7331, 7333, 7349, 7351, 7369, 7393, 7411, & - 7417, 7433, 7451, 7457, 7459, 7477, 7481, 7487, 7489, 7499, & - 7507, 7517, 7523, 7529, 7537, 7541, 7547, 7549, 7559, 7561, & - 7573, 7577, 7583, 7589, 7591, 7603, 7607, 7621, 7639, 7643, & - 7649, 7669, 7673, 7681, 7687, 7691, 7699, 7703, 7717, 7723, & - 7727, 7741, 7753, 7757, 7759, 7789, 7793, 7817, 7823, 7829, & - 7841, 7853, 7867, 7873, 7877, 7879, 7883, 7901, 7907, 7919 /) - npvec(1001:1100) = (/ & - 7927, 7933, 7937, 7949, 7951, 7963, 7993, 8009, 8011, 8017, & - 8039, 8053, 8059, 8069, 8081, 8087, 8089, 8093, 8101, 8111, & - 8117, 8123, 8147, 8161, 8167, 8171, 8179, 8191, 8209, 8219, & - 8221, 8231, 8233, 8237, 8243, 8263, 8269, 8273, 8287, 8291, & - 8293, 8297, 8311, 8317, 8329, 8353, 8363, 8369, 8377, 8387, & - 8389, 8419, 8423, 8429, 8431, 8443, 8447, 8461, 8467, 8501, & - 8513, 8521, 8527, 8537, 8539, 8543, 8563, 8573, 8581, 8597, & - 8599, 8609, 8623, 8627, 8629, 8641, 8647, 8663, 8669, 8677, & - 8681, 8689, 8693, 8699, 8707, 8713, 8719, 8731, 8737, 8741, & - 8747, 8753, 8761, 8779, 8783, 8803, 8807, 8819, 8821, 8831 /) - npvec(1101:1200) = (/ & - 8837, 8839, 8849, 8861, 8863, 8867, 8887, 8893, 8923, 8929, & - 8933, 8941, 8951, 8963, 8969, 8971, 8999, 9001, 9007, 9011, & - 9013, 9029, 9041, 9043, 9049, 9059, 9067, 9091, 9103, 9109, & - 9127, 9133, 9137, 9151, 9157, 9161, 9173, 9181, 9187, 9199, & - 9203, 9209, 9221, 9227, 9239, 9241, 9257, 9277, 9281, 9283, & - 9293, 9311, 9319, 9323, 9337, 9341, 9343, 9349, 9371, 9377, & - 9391, 9397, 9403, 9413, 9419, 9421, 9431, 9433, 9437, 9439, & - 9461, 9463, 9467, 9473, 9479, 9491, 9497, 9511, 9521, 9533, & - 9539, 9547, 9551, 9587, 9601, 9613, 9619, 9623, 9629, 9631, & - 9643, 9649, 9661, 9677, 9679, 9689, 9697, 9719, 9721, 9733 /) - npvec(1201:1300) = (/ & - 9739, 9743, 9749, 9767, 9769, 9781, 9787, 9791, 9803, 9811, & - 9817, 9829, 9833, 9839, 9851, 9857, 9859, 9871, 9883, 9887, & - 9901, 9907, 9923, 9929, 9931, 9941, 9949, 9967, 9973,10007, & - 10009,10037,10039,10061,10067,10069,10079,10091,10093,10099, & - 10103,10111,10133,10139,10141,10151,10159,10163,10169,10177, & - 10181,10193,10211,10223,10243,10247,10253,10259,10267,10271, & - 10273,10289,10301,10303,10313,10321,10331,10333,10337,10343, & - 10357,10369,10391,10399,10427,10429,10433,10453,10457,10459, & - 10463,10477,10487,10499,10501,10513,10529,10531,10559,10567, & - 10589,10597,10601,10607,10613,10627,10631,10639,10651,10657 /) - npvec(1301:1400) = (/ & - 10663,10667,10687,10691,10709,10711,10723,10729,10733,10739, & - 10753,10771,10781,10789,10799,10831,10837,10847,10853,10859, & - 10861,10867,10883,10889,10891,10903,10909,10937,10939,10949, & - 10957,10973,10979,10987,10993,11003,11027,11047,11057,11059, & - 11069,11071,11083,11087,11093,11113,11117,11119,11131,11149, & - 11159,11161,11171,11173,11177,11197,11213,11239,11243,11251, & - 11257,11261,11273,11279,11287,11299,11311,11317,11321,11329, & - 11351,11353,11369,11383,11393,11399,11411,11423,11437,11443, & - 11447,11467,11471,11483,11489,11491,11497,11503,11519,11527, & - 11549,11551,11579,11587,11593,11597,11617,11621,11633,11657 /) - npvec(1401:1500) = (/ & - 11677,11681,11689,11699,11701,11717,11719,11731,11743,11777, & - 11779,11783,11789,11801,11807,11813,11821,11827,11831,11833, & - 11839,11863,11867,11887,11897,11903,11909,11923,11927,11933, & - 11939,11941,11953,11959,11969,11971,11981,11987,12007,12011, & - 12037,12041,12043,12049,12071,12073,12097,12101,12107,12109, & - 12113,12119,12143,12149,12157,12161,12163,12197,12203,12211, & - 12227,12239,12241,12251,12253,12263,12269,12277,12281,12289, & - 12301,12323,12329,12343,12347,12373,12377,12379,12391,12401, & - 12409,12413,12421,12433,12437,12451,12457,12473,12479,12487, & - 12491,12497,12503,12511,12517,12527,12539,12541,12547,12553 /) - npvec(1501:1600) = (/ & - 12569,12577,12583,12589,12601,12611,12613,12619,12637,12641, & - 12647,12653,12659,12671,12689,12697,12703,12713,12721,12739, & - 12743,12757,12763,12781,12791,12799,12809,12821,12823,12829, & - 12841,12853,12889,12893,12899,12907,12911,12917,12919,12923, & - 12941,12953,12959,12967,12973,12979,12983,13001,13003,13007, & - 13009,13033,13037,13043,13049,13063,13093,13099,13103,13109, & - 13121,13127,13147,13151,13159,13163,13171,13177,13183,13187, & - 13217,13219,13229,13241,13249,13259,13267,13291,13297,13309, & - 13313,13327,13331,13337,13339,13367,13381,13397,13399,13411, & - 13417,13421,13441,13451,13457,13463,13469,13477,13487,13499 /) + 179, 181, 191, 193, 197, 199, 211, 223, 227, 229 /) END IF IF (n.EQ.-1) THEN PRIME = prime_max diff --git a/src/radiation/radiative_transfer/radtrans_main.f90 b/src/radiation/radiative_transfer/radtrans_main.f90 index 156726528..bc66ff916 100644 --- a/src/radiation/radiative_transfer/radtrans_main.f90 +++ b/src/radiation/radiative_transfer/radtrans_main.f90 @@ -194,7 +194,7 @@ END SUBROUTINE RadTrans_main FUNCTION SetPhotonEnergy(iElem, Point, iWave) !=================================================================================================================================== -!> Calculation of the vibrational temperature (zero-point search) for the TSHO (Truncated Simple Harmonic Oscillator) +!> assigns each photon an energy !=================================================================================================================================== ! MODULES USE MOD_Globals @@ -251,7 +251,7 @@ END FUNCTION SetPhotonEnergy FUNCTION SetPhotonPos(iElem, globPhotNum) !=================================================================================================================================== -!> Calculation of the vibrational temperature (zero-point search) for the TSHO (Truncated Simple Harmonic Oscillator) +!> assigns each photon a postion !=================================================================================================================================== ! MODULES USE MOD_Globals @@ -316,7 +316,7 @@ END FUNCTION SetPhotonPos FUNCTION SetPhotonStartDirection(iElem, iPhot, RandRot) !=================================================================================================================================== -! modified particle emmission for LD case +! assigns each photon a velocity vector (direction velocity is speed of light) !=================================================================================================================================== ! MODULES USE MOD_Globals @@ -402,7 +402,7 @@ END FUNCTION SetPhotonStartDirection FUNCTION RandomRotMatrix() !=================================================================================================================================== -! Calculation of the vibrational temperature (zero-point search) for the TSHO (Truncated Simple Harmonic Oscillator) +! Rotation matrix with random rotational angle to avoid preferred directions !=================================================================================================================================== ! MODULES USE MOD_Globals_Vars, ONLY : Pi @@ -430,7 +430,7 @@ END FUNCTION RandomRotMatrix FUNCTION SetParticleWavelengthAR(iElem) !=================================================================================================================================== -! modified particle emmission for LD case +! assigns wavelength to each photon (acceptance rejection) !=================================================================================================================================== ! MODULES USE MOD_Globals @@ -488,7 +488,7 @@ END FUNCTION SetParticleWavelengthAR FUNCTION SetParticleWavelengthBiSec(iElem) !=================================================================================================================================== -! modified particle emmission for LD case +! assigns wavelength to each photon (bisection) !=================================================================================================================================== ! MODULES USE MOD_Globals diff --git a/src/radiation/radiative_transfer/radtrans_output.f90 b/src/radiation/radiative_transfer/radtrans_output.f90 index 26dc905ef..53fb09928 100644 --- a/src/radiation/radiative_transfer/radtrans_output.f90 +++ b/src/radiation/radiative_transfer/radtrans_output.f90 @@ -14,7 +14,7 @@ MODULE MOD_RadTrans_Output !=================================================================================================================================== -! Module for DSMC Sampling and Output +! Module for output of radiative transfer solver !=================================================================================================================================== ! MODULES ! IMPLICIT VARIABLE HANDLING @@ -315,7 +315,7 @@ END SUBROUTINE WriteRadiationToHDF5 SUBROUTINE MPI_ExchangeRadiationInfo() !=================================================================================================================================== -! Writes DSMC state values to HDF5 +! MPI routine for output of radiative transfer solver !=================================================================================================================================== ! MODULES USE MOD_Globals diff --git a/src/radiation/radiative_transfer/radtrans_vars.f90 b/src/radiation/radiative_transfer/radtrans_vars.f90 index c81600988..b9587a0b4 100644 --- a/src/radiation/radiative_transfer/radtrans_vars.f90 +++ b/src/radiation/radiative_transfer/radtrans_vars.f90 @@ -14,7 +14,7 @@ MODULE MOD_RadiationTrans_Vars !=================================================================================================================================== -! Contains the tadiation transport variables +! Contains the radiative transfer variables !=================================================================================================================================== ! MODULES ! IMPLICIT VARIABLE HANDLING diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tools.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tools.f90 index 5e563f171..45afa924f 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tools.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tools.f90 @@ -14,7 +14,7 @@ MODULE MOD_Photon_TrackingTools !=================================================================================================================================== -! Contains global variables provided by the particle surfaces routines +! Routines for photon tracking in radiave transfer solver !=================================================================================================================================== ! MODULES ! IMPLICIT VARIABLE HANDLING @@ -512,7 +512,7 @@ END SUBROUTINE RotatePhotonIn2DPlane SUBROUTINE PhotonIntersectionWithSide(iLocSide,Element,TriNum, IntersectionPos, IsMortar) !--------------------------------------------------------------------------------------------------! -!Based on PerfectReflection3D +! Based on PerfectReflection3D !--------------------------------------------------------------------------------------------------! USE MOD_Particle_Mesh_Vars, ONLY : ElemSideNodeID_Shared, NodeCoords_Shared USE MOD_RadiationTrans_Vars, ONLY:PhotonProps @@ -609,7 +609,7 @@ END SUBROUTINE PhotonIntersectionWithSide SUBROUTINE CalcAbsoprtionMC(IntersectionPos,Element, DONE) !--------------------------------------------------------------------------------------------------! -!Based on PerfectReflection3D +! Calculates absorbed energy of photons along their paths stochastically !--------------------------------------------------------------------------------------------------! USE MOD_RadiationTrans_Vars, ONLY:PhotonProps,RadiationElemAbsEnergy, RadiationElemAbsEnergySpec USE MOD_Radiation_Vars, ONLY:Radiation_Absorption_spec, Radiation_Absorption_SpecPercent @@ -646,7 +646,11 @@ SUBROUTINE CalcAbsoprtionMC(IntersectionPos,Element, DONE) END SUBROUTINE CalcAbsoprtionMC + SUBROUTINE CalcAbsoprtionAnalytic(IntersectionPos,Element, DONE) +!--------------------------------------------------------------------------------------------------! +! Calculates absorbed energy of photons along their paths analytically +!--------------------------------------------------------------------------------------------------! !DEC$ ATTRIBUTES FORCEINLINE :: ParticleThroughSideLastPosCheck USE MOD_Globals USE MOD_RadiationTrans_Vars, ONLY:PhotonProps, RadTrans @@ -696,7 +700,11 @@ SUBROUTINE CalcAbsoprtionAnalytic(IntersectionPos,Element, DONE) END SUBROUTINE CalcAbsoprtionAnalytic + SUBROUTINE CalcAbsoprtion(IntersectionPos,Element, DONE) + !--------------------------------------------------------------------------------------------------! +! Calculates absorbed energy of photons along their paths +!--------------------------------------------------------------------------------------------------! USE MOD_Globals USE MOD_RadiationTrans_Vars, ONLY : RadiationAbsorptionModel !--------------------------------------------------------------------------------------------------! @@ -723,7 +731,7 @@ END SUBROUTINE CalcAbsoprtion SUBROUTINE PerfectPhotonReflection(iLocSide,Element,TriNum, IntersectionPos, IntersecAlreadyCalc) !--------------------------------------------------------------------------------------------------! -!Based on PerfectReflection3D +! Determines velocity vectors of photons after a perfect reflection at a boundary !--------------------------------------------------------------------------------------------------! USE MOD_Particle_Mesh_Vars, ONLY : NodeCoords_Shared, ElemSideNodeID_Shared USE MOD_RadiationTrans_Vars, ONLY : PhotonProps @@ -819,7 +827,7 @@ END SUBROUTINE PerfectPhotonReflection SUBROUTINE PerfectPhotonReflection2D(iLocSide,Element, IntersectionPos) !--------------------------------------------------------------------------------------------------! -!Based on PerfectReflection3D +! Determines velocity vectors of photons after a perfect reflection at a boundary (2D rotationally symmetric) !--------------------------------------------------------------------------------------------------! USE MOD_Particle_Mesh_Vars, ONLY : SideNormalEdge2D_Shared USE MOD_RadiationTrans_Vars, ONLY : PhotonProps @@ -865,7 +873,7 @@ END SUBROUTINE PerfectPhotonReflection2D SUBROUTINE DiffusePhotonReflection(iLocSide,Element,TriNum, IntersectionPos, IntersecAlreadyCalc) !--------------------------------------------------------------------------------------------------! -!Based on PerfectReflection3D +! Determines velocity vectors of photons after a diffuse reflection at a boundary !--------------------------------------------------------------------------------------------------! USE MOD_Particle_Mesh_Vars, ONLY : ElemSideNodeID_Shared, NodeCoords_Shared USE MOD_RadiationTrans_Vars, ONLY : PhotonProps @@ -973,7 +981,7 @@ END SUBROUTINE DiffusePhotonReflection SUBROUTINE DiffusePhotonReflection2D(iLocSide,Element, IntersectionPos) !--------------------------------------------------------------------------------------------------! -!Based on PerfectReflection3D +! Determines velocity vectors of photons after a diffuse reflection at a boundary (2D rotationally symmetric) !--------------------------------------------------------------------------------------------------! USE MOD_Particle_Mesh_Vars, ONLY : SideNormalEdge2D_Shared USE MOD_RadiationTrans_Vars, ONLY : PhotonProps @@ -1026,6 +1034,9 @@ SUBROUTINE DiffusePhotonReflection2D(iLocSide,Element, IntersectionPos) END SUBROUTINE DiffusePhotonReflection2D SUBROUTINE CalcWallAbsoprtion(GlobSideID, DONE) +!--------------------------------------------------------------------------------------------------! +! Calculates the absorbed energy if a photon hits a wall +!--------------------------------------------------------------------------------------------------! USE MOD_RadiationTrans_Vars, ONLY : PhotonSampWall, PhotonProps USE MOD_Particle_Boundary_Vars, ONLY:PartBound, GlobalSide2SurfSide USE MOD_Particle_Mesh_Vars ,ONLY: SideInfo_Shared @@ -1053,7 +1064,7 @@ END SUBROUTINE CalcWallAbsoprtion LOGICAL FUNCTION PointInObsCone(Point) !=================================================================================================================================== -! modified particle emmission for LD case +! checks if a point is in the opening cone of an external observer !=================================================================================================================================== ! MODULES USE MOD_Globals @@ -1079,7 +1090,7 @@ END FUNCTION PointInObsCone LOGICAL FUNCTION PhotonIntersectSensor(Point, Direction) !=================================================================================================================================== -! modified particle emmission for LD case +! checks if the photon's apth intersect with the opening cone of an external observer !=================================================================================================================================== ! MODULES USE MOD_Globals @@ -1115,7 +1126,7 @@ END FUNCTION PhotonIntersectSensor LOGICAL FUNCTION PhotonOnLineOfSight(Direction) !=================================================================================================================================== -! modified particle emmission for LD case +! checks if a photon is on the simulated line of sight !=================================================================================================================================== ! MODULES USE MOD_Globals diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 index 6f24aa9a1..0c1a797f8 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 @@ -14,7 +14,7 @@ MODULE MOD_Photon_Tracking !=================================================================================================================================== -! Contains global variables provided by the particle surfaces routines +! Routines for photon tracking in radiave transfer solver !=================================================================================================================================== ! MODULES ! IMPLICIT VARIABLE HANDLING From 59a75bc0865c8815253c62e46a2c5aa1ea5ade8a Mon Sep 17 00:00:00 2001 From: Tobias Ott Date: Mon, 4 Sep 2023 17:21:01 +0200 Subject: [PATCH 176/495] Set potential of a single DOF instead of a whole side --- src/hdg/elem_mat.f90 | 12 +-- src/hdg/hdg.f90 | 188 +++++++------------------------------------ src/hdg/hdg_vars.f90 | 11 +-- 3 files changed, 35 insertions(+), 176 deletions(-) diff --git a/src/hdg/elem_mat.f90 b/src/hdg/elem_mat.f90 index d7fd7b25c..902aaa90f 100644 --- a/src/hdg/elem_mat.f90 +++ b/src/hdg/elem_mat.f90 @@ -285,7 +285,7 @@ SUBROUTINE Elem_Mat(td_iter) END DO !g1 END DO !g2 END DO !g3 - + ! Invert Dhat #ifdef VDM_ANALYTICAL ! Computes InvDhat via analytical expression (only works for Lagrange polynomials, hence the "analytical" @@ -359,14 +359,6 @@ SUBROUTINE Elem_Mat(td_iter) Smat_BC(:,:,iLocSide,iBCSide) = Smat(:,:,iLocSide,locBCSideID,ElemID) END DO END DO -! Fill ZeroPotentialSide Smat -IF (ZeroPotentialSideID.GT.0) THEN - locBCSideID = SideToElem(S2E_LOC_SIDE_ID,ZeroPotentialSideID) - ElemID = SideToElem(S2E_ELEM_ID,ZeroPotentialSideID) - DO iLocSide=1,6 - Smat_zeroPotential(:,:,iLocSide) = Smat(:,:,iLocSide,locBCSideID,ElemID) - END DO -END IF ! Fill Smat for PETSc with remaining DOFs DO iElem=1,PP_nElems DO iLocSide=1,6 @@ -411,6 +403,8 @@ SUBROUTINE Elem_Mat(td_iter) END DO PetscCallA(MatAssemblyBegin(Smat_petsc,MAT_FINAL_ASSEMBLY,ierr)) PetscCallA(MatAssemblyEnd(Smat_petsc,MAT_FINAL_ASSEMBLY,ierr)) + +IF(SetZeroPotentialDOF) PetscCallA(MatZeroRowsColumns(Smat_petsc,1, (/0/), 1, PETSC_IGNORE, PETSC_IGNORE,ierr)) #endif diff --git a/src/hdg/hdg.f90 b/src/hdg/hdg.f90 index 92454b3f2..bff1b3a14 100644 --- a/src/hdg/hdg.f90 +++ b/src/hdg/hdg.f90 @@ -81,7 +81,6 @@ SUBROUTINE DefineParametersHDG() CALL prms%CreateIntOption( 'HDGSkipInit' ,'Number of time step iterations until the HDG solver is called (i.e. all intermediate calls are skipped) while time < HDGSkip_t0 (if HDGSkip > 0)', '0') CALL prms%CreateRealOption( 'HDGSkip_t0' ,'Time during which HDGSkipInit is used instead of HDGSkip (if HDGSkip > 0)', '0.') CALL prms%CreateLogicalOption('HDGDisplayConvergence' ,'Display divergence criteria: Iterations, RunTime and Residual', '.FALSE.') -CALL prms%CreateIntOption( 'HDGZeroPotentialDir' ,'Direction in which a Dirichlet condition with phi=0 is superimposed on the boundary conditions (1: x, 2: y, 3: z). The default chooses the direction automatically when no other Dirichlet boundary conditions are defined.','-1') CALL prms%CreateRealArrayOption( 'EPC-Resistance' , 'Vector (length corresponds to the number of EPC boundaries) with the resistance for each EPC in Ohm', no=0) #if defined(PARTICLES) CALL prms%CreateLogicalOption( 'UseBiasVoltage' , 'Activate usage of bias voltage adjustment (for specific boundaries only)', '.FALSE.') @@ -148,6 +147,7 @@ SUBROUTINE InitHDG() INTEGER :: i,j,k,r,iElem,SideID INTEGER :: BCType,BCState REAL :: D(0:PP_N,0:PP_N) +INTEGER :: nDirichletBCsidesGlobal #if USE_PETSC PetscErrorCode :: ierr INTEGER :: iProc @@ -273,8 +273,21 @@ SUBROUTINE InitHDG() CALL InitBV() #endif /*defined(PARTICLES)*/ -! Check if zero potential must be set on a boundary (or periodic side) -CALL InitZeroPotential() +! Get the global number of Dirichlet boundaries. If there are none, the potential of a single DOF must be set. +#if USE_MPI + IF(MPIroot)THEN + CALL MPI_REDUCE(nDirichletBCsides , nDirichletBCsidesGlobal , 1 , MPI_INTEGER , MPI_MAX , 0 , MPI_COMM_WORLD , IERROR) + ELSE + CALL MPI_REDUCE(nDirichletBCsides , 0 , 1 , MPI_INTEGER , MPI_MAX , 0 , MPI_COMM_WORLD , IERROR) + END IF +#else + nDirichletBCsidesGlobal = nDirichletBCsides +#endif /*USE_MPI*/ +IF(MPIroot .AND. (nDirichletBCsidesGlobal.EQ.0)) THEN + SetZeroPotentialDOF = .TRUE. +ELSE + SetZeroPotentialDOF = .FALSE. +END IF IF(nDirichletBCsides.GT.0)ALLOCATE(DirichletBC(nDirichletBCsides)) IF(nNeumannBCsides .GT.0)THEN @@ -321,7 +334,6 @@ SUBROUTINE InitHDG() END IF END DO nPETScUniqueSides = nSides-nDirichletBCSides-nMPISides_YOUR-nMortarMasterSides-nConductorBCsides -IF(ZeroPotentialSideID.GT.0) nPETScUniqueSides = nPETScUniqueSides - 1 CALL MPI_ALLGATHER(nPETScUniqueSides,1,MPI_INTEGER,OffsetPETScSideMPI,1,MPI_INTEGER,MPI_COMM_WORLD,IERROR) DO iProc=1, myrank OffsetPETScSide = OffsetPETScSide + OffsetPETScSideMPI(iProc) @@ -333,9 +345,9 @@ SUBROUTINE InitHDG() ALLOCATE(PETScLocalToSideID(nPETScUniqueSides+nMPISides_YOUR)) PETScGlobal=-1 PETScLocalToSideID=-1 -PETScLocalID=0 ! = nSides-nDirichletBCSides (-ZeroPotentialSide) +PETScLocalID=0 ! = nSides-nDirichletBCSides DO SideID=1,nSides!-nMPISides_YOUR - IF((MaskedSide(SideID).GT.0).OR.(SideID.EQ.ZeroPotentialSideID)) CYCLE + IF(MaskedSide(SideID).GT.0) CYCLE PETScLocalID=PETScLocalID+1 PETScLocalToSideID(PETScLocalID)=SideID PETScGlobal(SideID)=PETScLocalID+OffsetPETScSide-1 ! PETSc arrays start at 0! @@ -430,10 +442,6 @@ SUBROUTINE InitHDG() #if USE_PETSC ALLOCATE(Smat_BC(nGP_face,nGP_face,6,nDirichletBCSides)) Smat_BC = 0. -IF(ZeroPotentialSideID.GT.0) THEN - ALLOCATE(Smat_zeroPotential(nGP_face,nGP_face,6)) - Smat_zeroPotential = 0. -END IF PetscCallA(MatCreate(PETSC_COMM_WORLD,Smat_petsc,ierr)) PetscCallA(MatSetBlockSize(Smat_petsc,nGP_face,ierr)) @@ -526,130 +534,6 @@ SUBROUTINE InitHDG() END SUBROUTINE InitHDG -!=================================================================================================================================== -!> Check if any Dirichlet BCs are present (globally, not only on the local processor). -!> If there are none, an arbitrary potential is set at one of the boundaries to ensure -!> convergence of the HDG solver. This is required for setups where fully periodic and/or Neumann boundaries are solely used. -!> This only works for Cartesian meshes, i.e., that the boundary faces must be perpendicular to two of the three Cartesian axes -!=================================================================================================================================== -SUBROUTINE InitZeroPotential() -! MODULES -USE MOD_PreProc -USE MOD_Globals -USE MOD_HDG_Vars ,ONLY: ZeroPotentialSideID,HDGZeroPotentialDir -USE MOD_Mesh ,ONLY: GetMeshMinMaxBoundaries -USE MOD_Mesh_Vars ,ONLY: nBCs,BoundaryType,nSides,BC,xyzMinMax,NGeo,Face_xGP -USE MOD_ReadInTools ,ONLY: PrintOption,GETINT -#if USE_LOADBALANCE -USE MOD_LoadBalance_Vars ,ONLY: PerformLoadBalance -#endif /*USE_LOADBALANCE*/ -IMPLICIT NONE -!----------------------------------------------------------------------------------------------------------------------------------! -! INPUT / OUTPUT VARIABLES -!----------------------------------------------------------------------------------------------------------------------------------- -! LOCAL VARIABLES -INTEGER :: SideID,BCAlpha,BCType,BCState,iBC,nZeroPotentialSides,nZeroPotentialSidesGlobal,ZeroPotentialDir -INTEGER :: nZeroPotentialSidesMax,BCSide -REAL,DIMENSION(3) :: x,v1,v2,v3 -REAL :: norm,I(3,3) -!=================================================================================================================================== -! Initialize variables -HDGZeroPotentialDir = GETINT('HDGZeroPotentialDir') -ZeroPotentialSideID = -1 -I(:,1) = (/1. , 0. , 0./) -I(:,2) = (/0. , 1. , 0./) -I(:,3) = (/0. , 0. , 1./) - -! Every processor has to check every BC -DO iBC=1,nBCs - BCType = BoundaryType(iBC,BC_TYPE) ! 1 - BCState = BoundaryType(iBC,BC_STATE) ! 2 - SELECT CASE(BCType) - CASE(1) ! periodic - ! do nothing - CASE(HDGDIRICHLETBCSIDEIDS) ! Dirichlet - ZeroPotentialSideID = 0 ! no zero potential required - EXIT ! as soon as one Dirichlet BC is found, no zero potential must be used - CASE(10,11) ! Neumann - ! do nothing - CASE(20) ! FPC - ! do nothing - CASE DEFAULT ! unknown BCType - CALL CollectiveStop(__STAMP__,' unknown BC Type in hdg.f90!',IntInfo=BCType) - END SELECT ! BCType -END DO - -! If a Dirichlet BC is found ZeroPotentialSideID is zero and the following is skipped -IF(ZeroPotentialSideID.EQ.-1)THEN - ! Check if the user has selected a specific direction - IF(HDGZeroPotentialDir.EQ.-1)THEN - ! Select the direction (x, y or z), which has the largest extent (to account for 1D and 2D setups for example) - CALL GetMeshMinMaxBoundaries() - - ! Calc max extents in each direction for comparison - x(1) = xyzMinMax(2)-xyzMinMax(1) - x(2) = xyzMinMax(4)-xyzMinMax(3) - x(3) = xyzMinMax(6)-xyzMinMax(5) - ZeroPotentialDir=MAXLOC(x,DIM=1) - ELSE - ZeroPotentialDir = HDGZeroPotentialDir - END IF ! HDGZeroPotentialDir.EQ.-1 - CALL PrintOption('Zero potential side activated in direction (1: x, 2: y, 3: z)','OUTPUT',IntOpt=ZeroPotentialDir) - - nZeroPotentialSides = 0 ! Initialize - DO SideID=1,nSides ! Periodic sides are not within the 1,nBCSides list ! - IF(MAXVAL(ABS(Face_xGP(:,:,:,SideID))).LE.0.) CYCLE ! slave sides - BCSide=BC(SideID) - IF(BCSide.EQ.0) CYCLE ! inner sides - BCType =BoundaryType(BCSide,BC_TYPE) - BCState=BoundaryType(BCSide,BC_STATE) - BCAlpha=BoundaryType(BCSide,BC_ALPHA) - IF(BCType.EQ.0) CYCLE ! skip inner sides - - ! Check if the normal vector of the face points in the direction (or negative direction) of the ZeroPotentialDir (tolerance 1e-5) - v1(:) = Face_xGP(1:3 , NGeo , 0 , SideID) - Face_xGP(1:3 , 0 , 0 , SideID) - v2(:) = Face_xGP(1:3 , 0 , NGeo , SideID) - Face_xGP(1:3 , 0 , 0 , SideID) - v3(:) = CROSSNORM(v1,v2) - norm = ABS(DOT_PRODUCT(I(:,ZeroPotentialDir),v3)) - IF(ALMOSTEQUALRELATIVE(norm, 1.0, 1E-5))THEN - ZeroPotentialSideID = SideID - nZeroPotentialSides = nZeroPotentialSides + 1 - END IF ! ALMOSTEQUALRELATIVE(norm, 1.0, 1E-5) - END DO - -#if USE_MPI - ! Combine number of found zero potential sides to make sure that at least one is found - IF(MPIroot)THEN - CALL MPI_REDUCE(nZeroPotentialSides , nZeroPotentialSidesGlobal , 1 , MPI_INTEGER , MPI_SUM , 0 , MPI_COMM_WORLD , IERROR) - CALL MPI_REDUCE(nZeroPotentialSides , nZeroPotentialSidesMax , 1 , MPI_INTEGER , MPI_MAX , 0 , MPI_COMM_WORLD , IERROR) - ELSE - CALL MPI_REDUCE(nZeroPotentialSides , 0 , 1 , MPI_INTEGER , MPI_SUM , 0 , MPI_COMM_WORLD , IERROR) - CALL MPI_REDUCE(nZeroPotentialSides , 0 , 1 , MPI_INTEGER , MPI_MAX , 0 , MPI_COMM_WORLD , IERROR) - END IF -#else - nZeroPotentialSidesGlobal = nZeroPotentialSides -#endif /*USE_MPI*/ - LBWRITE(UNIT_StdOut,'(A,I0)') " Found (global) number of zero potential sides: ", nZeroPotentialSidesMax - - ! Sanity checks for root - IF(MPIroot)THEN - ! 1) multiples sides found - IF(nZeroPotentialSidesMax.GT.1)THEN - LBWRITE(UNIT_StdOut,'(A)') " WARNING: Found more than 1 zero potential side on a proc and currently, only one can be considered." - LBWRITE(UNIT_StdOut,'(A,I0,A)') " WARNING: nZeroPotentialSidesGlobal: ", nZeroPotentialSidesMax, " (may lead to problems)" - END IF - - ! 2) no sides found - IF(nZeroPotentialSidesGlobal.EQ.0)THEN - WRITE(UNIT_StdOut,*) " Sanity check: this fails when the mesh is not Cartesian. This needs to be implemented if required." - CALL abort(__STAMP__,'Setup has no Dirichlet BCs and no zero potential sides where found.') - END IF - END IF -END IF ! ZeroPotentialSideID.EQ.0 - -END SUBROUTINE InitZeroPotential - - !=================================================================================================================================== !> Create containers and communicators for each floating boundary condition where impacting charges are accumulated. !> @@ -2023,8 +1907,8 @@ SUBROUTINE HDGLinear(time,U_out) END IF ! UseFPC #endif /*USE_PETSC && defined(PARTICLES)*/ - ! Check if zero potential sides are present - IF(ZeroPotentialSideID.GT.0) lambda(iVar,:,ZeroPotentialSideID) = ZeroPotentialValue + ! Set potential to zero + IF(SetZeroPotentialDOF) lambda(iVar,1,1) = 0. END DO !volume source (volume RHS of u system) @@ -2087,19 +1971,6 @@ SUBROUTINE HDGLinear(time,U_out) RHS_face(1,:,SideID),1) END DO END DO -!!!! add ZeroPotentialSide -IF(ZeroPotentialSideID.GT.0)THEN - locBCSideID = SideToElem(S2E_LOC_SIDE_ID,ZeroPotentialSideID) - ElemID = SideToElem(S2E_ELEM_ID,ZeroPotentialSideID) - DO iLocSide=1,6 - SideID = ElemToSide(E2S_SIDE_ID,iLocSide,ElemID) - IF(PETScGlobal(SideID).EQ.-1) CYCLE - CALL DGEMV('N',nGP_face,nGP_face,-1., & - Smat_zeroPotential(:,:,iLocSide), nGP_face, & - lambda(1,:,ZeroPotentialSideID),1,1.,& !add to RHS_face - RHS_face(1,:,SideID),1) - END DO -END IF #endif #if (PP_nVar!=1) @@ -2966,7 +2837,7 @@ END SUBROUTINE DisplayConvergence SUBROUTINE EvalResidual(RHS,lambda,R,iVar) ! MODULES USE MOD_Globals -USE MOD_HDG_Vars ,ONLY: nGP_face,nDirichletBCSides,DirichletBC,ZeroPotentialSideID,ZeroPotentialValue +USE MOD_HDG_Vars ,ONLY: nGP_face,nDirichletBCSides,DirichletBC,SetZeroPotentialDOF USE MOD_Mesh_Vars ,ONLY: nSides IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -2999,8 +2870,8 @@ SUBROUTINE EvalResidual(RHS,lambda,R,iVar) R(:,DirichletBC(BCsideID))=0. END DO ! SideID=1,nSides - ! Set potential to zero - IF(ZeroPotentialSideID.GT.0) R(:,ZeroPotentialSideID)= 0. + ! Set residual to zero + IF(SetZeroPotentialDOF) R(1,1) = 0. #if (PP_nVar!=1) END IF @@ -3022,7 +2893,7 @@ END SUBROUTINE EvalResidual SUBROUTINE MatVec(lambda, mv, iVar) ! MODULES USE MOD_Globals -USE MOD_HDG_Vars ,ONLY: Smat,nGP_face,nDirichletBCSides,DirichletBC,ZeroPotentialSideID,ZeroPotentialValue +USE MOD_HDG_Vars ,ONLY: Smat,nGP_face,nDirichletBCSides,DirichletBC,SetZeroPotentialDOF USE MOD_Mesh_Vars ,ONLY: nSides, SideToElem, ElemToSide, nMPIsides_YOUR USE MOD_FillMortar_HDG ,ONLY: BigToSmallMortar_HDG,SmallToBigMortar_HDG #if USE_MPI @@ -3159,13 +3030,13 @@ SUBROUTINE MatVec(lambda, mv, iVar) IF (iVar.EQ.4) THEN #endif -!set mv on Dirichlet BC to zero! -DO BCsideID=1,nDirichletBCSides - mv(:,DirichletBC(BCsideID))=0. -END DO ! SideID=1,nSides + !set mv on Dirichlet BC to zero! + DO BCsideID=1,nDirichletBCSides + mv(:,DirichletBC(BCsideID))=0. + END DO ! SideID=1,nSides ! Set potential to zero - IF(ZeroPotentialSideID.GT.0) mv(:,ZeroPotentialSideID) = 0. + IF(SetZeroPotentialDOF) mv(1,1) = 0. #if (PP_nVar!=1) END IF @@ -3427,7 +3298,6 @@ SUBROUTINE FinalizeHDG() SDEALLOCATE(PETScGlobal) SDEALLOCATE(PETScLocalToSideID) SDEALLOCATE(Smat_BC) -SDEALLOCATE(Smat_zeroPotential) SDEALLOCATE(SmallMortarType) #endif SDEALLOCATE(NonlinVolumeFac) diff --git a/src/hdg/hdg_vars.f90 b/src/hdg/hdg_vars.f90 index 1c1d83384..f3f5b9c4d 100644 --- a/src/hdg/hdg_vars.f90 +++ b/src/hdg/hdg_vars.f90 @@ -46,11 +46,10 @@ MODULE MOD_HDG_Vars VecScatter :: scatter_conductors_petsc IS :: idx_local_conductors_petsc IS :: idx_global_conductors_petsc -INTEGER,ALLOCATABLE :: PETScGlobal(:) !< PETScGlobal(SideID) maps the local SideID to global PETScSideID +INTEGER,ALLOCATABLE :: PETScGlobal(:) !< PETScGlobal(SideID) maps the local SideID to global PETScSideID INTEGER,ALLOCATABLE :: PETScLocalToSideID(:) !< PETScLocalToSideID(PETScLocalSideID) maps the local PETSc side to SideID REAL,ALLOCATABLE :: Smat_BC(:,:,:,:) !< side to side matrix for dirichlet (D) BCs, (ngpface,ngpface,6Sides,DSides) -REAL,ALLOCATABLE :: Smat_zeroPotential(:,:,:) !< side to side matrix for zero potential Side, (ngpface,ngpface,6Sides) -INTEGER :: nPETScSides !< nSides - nDirichletSides - nZeroPotentialSides +INTEGER :: nPETScSides !< nSides - nDirichletSides INTEGER :: nPETScUniqueSides !< nPETScSides - nMPISides_YOUR INTEGER :: nPETScUniqueSidesGlobal #endif @@ -71,13 +70,9 @@ MODULE MOD_HDG_Vars REAL,ALLOCATABLE :: qn_face(:,:,:) !< for Neumann BC REAL,ALLOCATABLE :: qn_face_MagStat(:,:,:) !< for Neumann BC INTEGER :: nDirichletBCsides -INTEGER :: ZeroPotentialSideID !< SideID, where the solution is set zero to enforce convergence -REAL,PARAMETER :: ZeroPotentialValue=0. !< This can be set to an arbitrary value (in the range of the potential solution) -INTEGER :: HDGZeroPotentialDir !< Direction in which a Dirichlet condition with phi=0 is superimposed on the boundary - !< conditions. Default chooses the direction automatically when no other Dirichlet - !< boundary conditions are defined. INTEGER :: nNeumannBCsides INTEGER :: nConductorBCsides !< Number of processor-local sides that are conductors (FPC) in [1:nBCSides] +LOGICAL :: SetZeroPotentialDOF !< Flag to set a single DOF, if only periodic and Neumann boundaries are present INTEGER,ALLOCATABLE :: ConductorBC(:) INTEGER,ALLOCATABLE :: DirichletBC(:) INTEGER,ALLOCATABLE :: NeumannBC(:) From ca0c3e971ea8e1d761783007b946af0eb590baff Mon Sep 17 00:00:00 2001 From: Tobias Ott Date: Mon, 4 Sep 2023 17:43:19 +0200 Subject: [PATCH 177/495] Fixed PETSc Call to set smat entries for ZeroPotentialDOF --- src/hdg/elem_mat.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hdg/elem_mat.f90 b/src/hdg/elem_mat.f90 index 902aaa90f..5227edc79 100644 --- a/src/hdg/elem_mat.f90 +++ b/src/hdg/elem_mat.f90 @@ -404,7 +404,7 @@ SUBROUTINE Elem_Mat(td_iter) PetscCallA(MatAssemblyBegin(Smat_petsc,MAT_FINAL_ASSEMBLY,ierr)) PetscCallA(MatAssemblyEnd(Smat_petsc,MAT_FINAL_ASSEMBLY,ierr)) -IF(SetZeroPotentialDOF) PetscCallA(MatZeroRowsColumns(Smat_petsc,1, (/0/), 1, PETSC_IGNORE, PETSC_IGNORE,ierr)) +IF(SetZeroPotentialDOF) PetscCallA(MatZeroRowsColumns(Smat_petsc,1,(/0/),1.,PETSC_NULL_VEC,PETSC_NULL_VEC,ierr)) #endif From 09db00408e81aada345f474f01f69817fb08f531 Mon Sep 17 00:00:00 2001 From: Tobias Ott Date: Mon, 4 Sep 2023 17:59:52 +0200 Subject: [PATCH 178/495] Removed unused PerformPartWeightLB --- src/loadbalance/loadbalance.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/loadbalance/loadbalance.f90 b/src/loadbalance/loadbalance.f90 index c42424b00..37e610dc3 100644 --- a/src/loadbalance/loadbalance.f90 +++ b/src/loadbalance/loadbalance.f90 @@ -488,7 +488,7 @@ SUBROUTINE ComputeImbalance() !----------------------------------------------------------------------------------------------------------------------------------! USE MOD_Globals USE MOD_LoadBalance_Vars ,ONLY: WeightSum, TargetWeight,CurrentImbalance, MaxWeight, MinWeight -USE MOD_LoadBalance_Vars ,ONLY: ElemTime, PerformLBSample, PerformPartWeightLB, DeviationThreshold +USE MOD_LoadBalance_Vars ,ONLY: ElemTime, PerformLBSample, DeviationThreshold #if !((PP_TimeDiscMethod==4) || (PP_TimeDiscMethod==42) || (PP_TimeDiscMethod==300) || (PP_TimeDiscMethod==400)) USE MOD_LoadBalance_Vars ,ONLY: ElemTimeFieldTot,ElemTimeField #endif /*!((PP_TimeDiscMethod==4) || (PP_TimeDiscMethod==42) || (PP_TimeDiscMethod==300) || (PP_TimeDiscMethod==400))*/ From 43fd28aa13dfef4a1b7a17d47deef18f7927ed4f Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Mon, 4 Sep 2023 18:20:59 +0200 Subject: [PATCH 179/495] Only use doParticle_In in particle MPI for IMPA --- src/particles/particle_mpi/particle_mpi.f90 | 15 ++++++++++++++- src/particles/pic/deposition/pic_depo_method.f90 | 2 +- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/particles/particle_mpi/particle_mpi.f90 b/src/particles/particle_mpi/particle_mpi.f90 index b82cb41d1..98bcbb459 100644 --- a/src/particles/particle_mpi/particle_mpi.f90 +++ b/src/particles/particle_mpi/particle_mpi.f90 @@ -289,7 +289,11 @@ SUBROUTINE IRecvNbOfParticles() END SUBROUTINE IRecvNbOfParticles +#if defined(IMPA) SUBROUTINE SendNbOfParticles(doParticle_In) +#else +SUBROUTINE SendNbOfParticles() +#endif /*defined(IMPA)*/ !=================================================================================================================================== ! This routine sends the number of send particles, for which the following steps are performed: ! 1) Compute number of Send Particles @@ -314,17 +318,23 @@ SUBROUTINE SendNbOfParticles(doParticle_In) IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES +#if defined(IMPA) LOGICAL,INTENT(IN),OPTIONAL :: doParticle_In(1:PDM%ParticleVecLength) +#endif /*defined(IMPA)*/ !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES +#if defined(IMPA) LOGICAL :: doPartInExists +#endif /*defined(IMPA)*/ INTEGER :: iPart,ElemID, iPolyatMole INTEGER :: iProc,ProcID !=================================================================================================================================== +#if defined(IMPA) doPartInExists=.FALSE. IF(PRESENT(DoParticle_IN)) doPartInExists=.TRUE. +#endif /*defined(IMPA)*/ ! 1) get number of send particles !--- Count number of particles in cells in the halo region and add them to the message @@ -335,12 +345,15 @@ SUBROUTINE SendNbOfParticles(doParticle_In) ! ! Activate phantom/ghost particles ! IF(PartSpecies(iPart).LT.0) PDM%ParticleInside(iPart) = .TRUE. - ! TODO: Info why and under which conditions the following 'CYCLE' is called +#if defined(IMPA) IF(doPartInExists)THEN IF (.NOT.(PDM%ParticleInside(iPart).AND.DoParticle_In(iPart))) CYCLE ELSE +#endif /*defined(IMPA)*/ IF (.NOT.PDM%ParticleInside(iPart)) CYCLE +#if defined(IMPA) END IF +#endif /*defined(IMPA)*/ ! This is already the global ElemID ElemID = PEM%GlobalElemID(iPart) diff --git a/src/particles/pic/deposition/pic_depo_method.f90 b/src/particles/pic/deposition/pic_depo_method.f90 index 895e9e54e..87d811007 100644 --- a/src/particles/pic/deposition/pic_depo_method.f90 +++ b/src/particles/pic/deposition/pic_depo_method.f90 @@ -261,7 +261,7 @@ SUBROUTINE DepositionMethod_CVW(doParticle_In, stage_opt) ALLOCATE(BGMSourceCellVol(SourceDim:4,0:1,0:1,0:1,1:nElems)) BGMSourceCellVol(:,:,:,:,:) = 0.0 DO iPart = 1,PDM%ParticleVecLength - ! TODO: Info why and under which conditions the following 'CYCLE' is called + ! TODO: The cycle with .AND.doParticle_In is used for analysis or IMPA IF(PRESENT(doParticle_In))THEN IF (.NOT.(PDM%ParticleInside(iPart).AND.doParticle_In(iPart))) CYCLE ELSE From 4e5386dce723abdefaef4412f8346874f32fa00c Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Mon, 4 Sep 2023 18:41:39 +0200 Subject: [PATCH 180/495] Clarified abort message for number of periodic vectors in parameter and mesh file check --- src/particles/particle_mesh/particle_mesh_tools.f90 | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/particles/particle_mesh/particle_mesh_tools.f90 b/src/particles/particle_mesh/particle_mesh_tools.f90 index bd24bea1f..bc4847066 100644 --- a/src/particles/particle_mesh/particle_mesh_tools.f90 +++ b/src/particles/particle_mesh/particle_mesh_tools.f90 @@ -1794,7 +1794,11 @@ SUBROUTINE ComputePeriodicVec() ! Find number of periodic vectors nPeriodicVectorsParameterIni = GEO%nPeriodicVectors GEO%nPeriodicVectors = MERGE(MAXVAL(BoundaryType(:,BC_ALPHA)),0,PartMeshHasPeriodicBCs) -IF(nPeriodicVectorsParameterIni.NE.GEO%nPeriodicVectors) CALL CollectiveStop(__STAMP__,'Wrong number of periodic vectors!') +IF(nPeriodicVectorsParameterIni.GT.GEO%nPeriodicVectors)THEN + SWRITE (*,*) "Number of periodic vectors in parameter file: ", nPeriodicVectorsParameterIni + SWRITE (*,*) "Number of periodic vectors in mesh file: ", GEO%nPeriodicVectors + CALL CollectiveStop(__STAMP__,'Wrong number of periodic vectors!') +END IF IF (GEO%nPeriodicVectors.EQ.0) RETURN firstElem = offsetElem+1 From a4c926acecae9a4f52ca008028f2a7121c95f260 Mon Sep 17 00:00:00 2001 From: Franziska Hild Date: Mon, 4 Sep 2023 19:02:31 +0200 Subject: [PATCH 181/495] LastPartPos = reference position for DSMC octree but no BGK cell refinement + abort for latency hiding with coupled BGK-DSMC --- src/particles/bgk/bgk_init.f90 | 12 ++++++++-- src/particles/dsmc/dsmc_particle_pairing.f90 | 14 ++++++------ src/timedisc/timedisc_TimeStep_BGK.f90 | 23 ++++++++++---------- 3 files changed, 29 insertions(+), 20 deletions(-) diff --git a/src/particles/bgk/bgk_init.f90 b/src/particles/bgk/bgk_init.f90 index 1d8fcae12..bedd1c728 100644 --- a/src/particles/bgk/bgk_init.f90 +++ b/src/particles/bgk/bgk_init.f90 @@ -97,6 +97,9 @@ SUBROUTINE InitBGK() USE MOD_DSMC_ParticlePairing ,ONLY: DSMC_init_octree USE MOD_Globals_Vars ,ONLY: Pi, BoltzmannConst USE MOD_Basis ,ONLY: PolynomialDerivativeMatrix +#if USE_MPI +USE MOD_Particle_MPI_Vars ,ONLY: DoParticleLatencyHiding +#endif /*USE_MPI*/ #if USE_LOADBALANCE USE MOD_LoadBalance_Vars ,ONLY: PerformLoadBalance #endif /*USE_LOADBALANCE*/ @@ -137,9 +140,14 @@ SUBROUTINE InitBGK() ! Coupled BGK with DSMC, use a number density as limit above which BGK is used, and below which DSMC is used CoupledBGKDSMC = GETLOGICAL('Particles-CoupledBGKDSMC') IF(CoupledBGKDSMC) THEN - IF (DoVirtualCellMerge) THEN + IF (DoVirtualCellMerge) THEN CALL abort(__STAMP__,'Virtual cell merge not implemented for coupled DSMC-BGK simulations!') END IF +#if USE_MPI + IF (DoParticleLatencyHiding) THEN + CALL abort(__STAMP__,'Particle latency hiding not implemented for coupled DSMC-BGK simulations!') + END IF +#endif /*USE_MPI*/ BGKDSMCSwitchDens = GETREAL('Particles-BGK-DSMC-SwitchDens') ELSE IF(RadialWeighting%DoRadialWeighting) RadialWeighting%PerformCloning = .TRUE. @@ -290,7 +298,7 @@ RECURSIVE SUBROUTINE DeleteNodeAverage(NodeAverage) INTEGER :: iLoop, nLoop !=================================================================================================================================== nLoop = 2**Symmetry%Order -IF(ASSOCIATED(NodeAverage%SubNode)) THEN +IF(ASSOCIATED(NodeAverage%SubNode)) THEN DO iLoop = 1, nLoop CALL DeleteNodeAverage(NodeAverage%SubNode(iLoop)) END DO diff --git a/src/particles/dsmc/dsmc_particle_pairing.f90 b/src/particles/dsmc/dsmc_particle_pairing.f90 index 8c6f0e6d5..7012f867e 100644 --- a/src/particles/dsmc/dsmc_particle_pairing.f90 +++ b/src/particles/dsmc/dsmc_particle_pairing.f90 @@ -75,7 +75,7 @@ SUBROUTINE DSMC_pairing_standard(iElem) IF (DoVirtualCellMerge) THEN ! 1.) Create particle index list for pairing in the case of virtually merged cells. So, all particles from the merged cells are ! used for the pairing and the collisions. - IF(VirtMergedCells(iElem)%isMerged) RETURN + IF(VirtMergedCells(iElem)%isMerged) RETURN nPartMerged = nPart DO iMergeElem = 1, VirtMergedCells(iElem)%NumOfMergedCells nPartMerged = nPartMerged + PEM%pNumber(VirtMergedCells(iElem)%MergedCellID(iMergeElem)) @@ -102,7 +102,7 @@ SUBROUTINE DSMC_pairing_standard(iElem) elemVolume = VirtMergedCells(iELem)%MergedVolume ELSE elemVolume = ElemVolume_Shared(GetCNElemID(iElem+offSetElem)) - END IF + END IF ELSE nPartMerged = nPart ALLOCATE(iPartIndx(nPart)) @@ -117,7 +117,7 @@ SUBROUTINE DSMC_pairing_standard(iElem) iPart = PEM%pNext(iPart) END DO elemVolume = ElemVolume_Shared(GetCNElemID(iElem+offSetElem)) -END IF +END IF ! 2.) Perform pairing (random pairing or nearest neighbour pairing) and collision (including the decision for a reaction/relaxation) CALL PerformPairingAndCollision(iPartIndx, nPartMerged, iElem , elemVolume) @@ -191,7 +191,7 @@ SUBROUTINE DSMC_pairing_octree(iElem) END DO DoMergedCell = .TRUE. END IF -END IF +END IF IF (DoMergedCell) THEN CALL PerformPairingAndCollision(TreeNode%iPartIndx_Node, nPartMerged, iElem, VirtMergedCells(iELem)%MergedVolume) @@ -805,7 +805,7 @@ SUBROUTINE DSMC_pairing_quadtree(iElem) END DO DoMergedCell = .TRUE. END IF -END IF +END IF IF (DoMergedCell) THEN CALL PerformPairingAndCollision(TreeNode%iPartIndx_Node, nPartMerged, iElem, VirtMergedCells(iELem)%MergedVolume) @@ -836,7 +836,7 @@ SUBROUTINE DSMC_pairing_quadtree(iElem) TreeNode%PNum_Node = nPart iPart = PEM%pStart(iElem) ! create particle index list for pairing DO iLoop = 1, nPart - ! Attention: LastPartPos is the reference position here + ! Attention: LastPartPos is the reference position here, set in timedisc_TimeStep_DSMC.f90 / timedisc_TimeStep_BGK.f90 TreeNode%MappedPartStates(1:2,iLoop) = LastPartPos(1:2,iPart) iPart = PEM%pNext(iPart) END DO @@ -1100,7 +1100,7 @@ SUBROUTINE DSMC_pairing_dotree(iElem) iPart = PEM%pNext(iPart) END DO TreeNode%NodeDepth = 1 - ElemNodeVol(iElem)%Root%NodeDepth = 1 + ElemNodeVol(iElem)%Root%NodeDepth = 1 ElemNodeVol(iElem)%Root%MidPoint(1:3) = (/0.0,0.0,0.0/) CALL AddDoTreeNode(TreeNode, iElem, ElemNodeVol(iElem)%Root) DEALLOCATE(TreeNode%MappedPartStates) diff --git a/src/timedisc/timedisc_TimeStep_BGK.f90 b/src/timedisc/timedisc_TimeStep_BGK.f90 index a8287a4e6..5db0421aa 100644 --- a/src/timedisc/timedisc_TimeStep_BGK.f90 +++ b/src/timedisc/timedisc_TimeStep_BGK.f90 @@ -52,6 +52,7 @@ SUBROUTINE TimeStep_BGK() #if USE_MPI USE MOD_Particle_MPI ,ONLY: IRecvNbOfParticles, MPIParticleSend,MPIParticleRecv,SendNbOfparticles USE MOD_Particle_MPI_Vars ,ONLY: DoParticleLatencyHiding +USE MOD_Globals ,ONLY: CollectiveStop #endif /*USE_MPI*/ USE MOD_BGK ,ONLY: BGK_main, BGK_DSMC_main USE MOD_BGK_Vars ,ONLY: CoupledBGKDSMC,DoBGKCellAdaptation @@ -161,8 +162,8 @@ SUBROUTINE TimeStep_BGK() CALL MPIParticleSend(.TRUE.) #endif /*USE_MPI*/ -IF(DoBGKCellAdaptation)THEN - IF(Symmetry%Order.EQ.2)THEN +IF(DoBGKCellAdaptation.OR.(CoupledBGKDSMC.AND.DSMC%UseOctree)) THEN + IF(Symmetry%Order.EQ.2) THEN DO iPart=1,PDM%ParticleVecLength IF (PDM%ParticleInside(iPart)) THEN ! Store reference position in LastPartPos array to reduce memory demand @@ -177,7 +178,7 @@ SUBROUTINE TimeStep_BGK() END IF END DO END IF ! Symmetry%Order.EQ.2 -END IF ! DoBGKCellAdaptation +END IF ! DoBGKCellAdaptation.OR.(CoupledBGKDSMC.AND.DSMC%UseOctree) IF(UseRotRefFrame) THEN DO iPart = 1,PDM%ParticleVecLength @@ -198,11 +199,11 @@ SUBROUTINE TimeStep_BGK() #if USE_MPI IF(DoParticleLatencyHiding)THEN - IF (CoupledBGKDSMC) THEN - CALL BGK_DSMC_main(1) - ELSE + ! IF (CoupledBGKDSMC) THEN + ! CALL BGK_DSMC_main(1) + ! ELSE CALL BGK_main(1) - END IF + ! END IF END IF ! DoParticleLatencyHiding ! finish communication @@ -219,11 +220,11 @@ SUBROUTINE TimeStep_BGK() !#endif /*EXTRAE*/ #if USE_MPI IF(DoParticleLatencyHiding)THEN - IF (CoupledBGKDSMC) THEN - CALL BGK_DSMC_main(2) - ELSE + ! IF (CoupledBGKDSMC) THEN + ! CALL BGK_DSMC_main(2) + ! ELSE CALL BGK_main(2) - END IF + ! END IF ELSE #endif /*USE_MPI*/ IF (CoupledBGKDSMC) THEN From 8e9f4198ec91dc8b837709290a4aab6e4fb185b8 Mon Sep 17 00:00:00 2001 From: Felix Garmirian Date: Tue, 5 Sep 2023 11:25:18 +0200 Subject: [PATCH 182/495] PartMPI/MPI_COMM_WORLD replaced by MPI_COMM_PICLAS --- docs/documentation/developerguide/mpi.md | 2 +- src/analyze/analyze.f90 | 78 +++---- src/analyze/analyzefield.f90 | 36 ++-- src/equations/magnetostatic/calctimestep.f90 | 2 +- .../magnetostatic_poisson/calctimestep.f90 | 2 +- src/equations/maxwell/calctimestep.f90 | 2 +- src/equations/maxwell/equation.f90 | 10 +- src/equations/maxwell/getboundaryflux.f90 | 4 +- src/equations/maxwell_pois/calctimestep.f90 | 2 +- src/equations/maxwell_pois/equation.f90 | 4 +- .../maxwell_pois/getboundaryflux.f90 | 4 +- src/equations/poisson/calctimestep.f90 | 2 +- src/equations/poisson/equation.f90 | 6 +- src/equations/poisson/getboundaryflux.f90 | 2 +- src/globals/globals.f90 | 1 + src/hdg/fillmortar_hdg.f90 | 1 - src/hdg/hdg.f90 | 35 ++- src/interfaces/interfaces.f90 | 6 +- src/io_hdf5/hdf5_input.f90 | 6 +- src/io_hdf5/hdf5_input_particle.f90 | 5 +- src/io_hdf5/hdf5_output.f90 | 10 +- src/io_hdf5/hdf5_output_elemdata.f90 | 4 +- src/io_hdf5/hdf5_output_field.f90 | 24 +-- src/io_hdf5/hdf5_output_particle.f90 | 72 +++---- src/io_hdf5/hdf5_output_state.f90 | 6 +- .../linearoperator/linearoperator.f90 | 2 +- src/linearsolver/linearsolver.f90 | 2 +- src/linearsolver/newton.f90 | 2 +- src/linearsolver/particlesolver.f90 | 29 ++- src/loadbalance/loadbalance.f90 | 12 +- src/mesh/mesh.f90 | 2 +- src/mesh/mesh_readin.f90 | 6 +- src/mesh/mesh_tools.f90 | 2 +- src/mpi/mpi.f90 | 48 +++-- src/mpi/mpi_shared.f90 | 8 +- src/output/output_vtk.f90 | 12 +- src/particles/analyze/particle_analyze.f90 | 61 +++--- .../analyze/particle_analyze_code.f90 | 3 +- .../analyze/particle_analyze_output.f90 | 6 +- .../analyze/particle_analyze_tools.f90 | 200 ++++++++---------- .../boundary/particle_boundary_init.f90 | 10 +- src/particles/dsmc/dsmc_analyze.f90 | 14 +- src/particles/dsmc/dsmc_bg_gas.f90 | 4 +- src/particles/dsmc/dsmc_init.f90 | 6 +- .../emission/particle_br_electron_fluid.f90 | 12 +- src/particles/emission/particle_emission.f90 | 18 +- .../emission/particle_emission_init.f90 | 5 +- .../particle_position_and_velocity.f90 | 40 ++-- .../emission/particle_surface_flux.f90 | 15 +- .../emission/particle_surface_flux_init.f90 | 21 +- src/particles/particle_init.f90 | 13 +- src/particles/particle_mesh/particle_bgm.f90 | 12 +- src/particles/particle_mpi/particle_mpi.f90 | 38 +--- .../particle_mpi/particle_mpi_emission.f90 | 136 ++++++------ .../particle_mpi/particle_mpi_halo.f90 | 18 +- .../particle_mpi/particle_mpi_vars.f90 | 12 +- src/particles/particle_operations.f90 | 2 +- src/particles/particle_timestep.f90 | 8 +- src/particles/pic/analyze/pic_analyze.f90 | 22 +- src/particles/pic/deposition/pic_depo.f90 | 46 ++-- .../pic/deposition/pic_depo_method.f90 | 12 +- .../pic/deposition/pic_depo_tools.f90 | 2 +- .../pic/interpolation/init_BGField.f90 | 2 +- src/particles/restart/particle_readin.f90 | 18 +- src/particles/restart/particle_restart.f90 | 57 +++-- .../sampling/particle_sampling_adaptive.f90 | 27 ++- src/particles/tracking/particle_tracing.f90 | 2 +- src/particles/ttm/ttm_init.f90 | 5 +- src/posti/dmd/dmd_main.f90 | 28 +-- src/posti/piclas2vtk/piclas2vtk.f90 | 16 +- src/posti/superB/superB_tools.f90 | 8 +- src/precond/precond.f90 | 2 +- src/readIMD/readIMD.f90 | 38 ++-- src/readintools/readintools.f90 | 6 +- src/recordpoints/recordpoints.f90 | 4 +- src/restart/restart.f90 | 2 +- src/restart/restart_field.f90 | 12 +- src/timedisc/timedisc.f90 | 4 +- .../timedisc_TimeStepByImplicitRK.f90 | 7 +- .../timedisc_TimeStepByRosenbrock.f90 | 7 +- 80 files changed, 665 insertions(+), 767 deletions(-) diff --git a/docs/documentation/developerguide/mpi.md b/docs/documentation/developerguide/mpi.md index d8fed88c4..ba3ba0a48 100644 --- a/docs/documentation/developerguide/mpi.md +++ b/docs/documentation/developerguide/mpi.md @@ -170,7 +170,7 @@ that either a communicator exists and/or every (other) processor has been set to | Handle | Description | Derived from | | ------------------------------------ | ---------------------------------------------------------------------- | -------------- | -| PartMPI%InitGroup(nInitRegions)%COMM | Emission groups | PartMPI%COMM | +| PartMPIInitGroup(nInitRegions)%COMM | Emission groups | MPI_COMM_PICLAS| | SurfCOMM%UNICATOR | Processors with a surface side (e.g. reflective), including halo sides | MPI_COMM_WORLD | | CPPCOMM%UNICATOR | Coupled power potential | MPI_COMM_WORLD | | EDC%COMM(iEDCBC)%UNICATOR | Electric displacement current (per BC) | MPI_COMM_WORLD | diff --git a/src/analyze/analyze.f90 b/src/analyze/analyze.f90 index 02718e01c..d3aca80ed 100644 --- a/src/analyze/analyze.f90 +++ b/src/analyze/analyze.f90 @@ -333,11 +333,11 @@ SUBROUTINE InitAnalyze() END DO ! iElem = 1, nElems #if USE_MPI IF(MPIroot)THEN - CALL MPI_REDUCE(MPI_IN_PLACE , PPWCellMin , 1 , MPI_DOUBLE_PRECISION , MPI_MIN , 0 , MPI_COMM_WORLD , iError) - CALL MPI_REDUCE(MPI_IN_PLACE , PPWCellMax , 1 , MPI_DOUBLE_PRECISION , MPI_MAX , 0 , MPI_COMM_WORLD , iError) + CALL MPI_REDUCE(MPI_IN_PLACE , PPWCellMin , 1 , MPI_DOUBLE_PRECISION , MPI_MIN , 0 , MPI_COMM_PICLAS , iError) + CALL MPI_REDUCE(MPI_IN_PLACE , PPWCellMax , 1 , MPI_DOUBLE_PRECISION , MPI_MAX , 0 , MPI_COMM_PICLAS , iError) ELSE - CALL MPI_REDUCE(PPWCellMin , 0 , 1 , MPI_DOUBLE_PRECISION , MPI_MIN , 0 , MPI_COMM_WORLD , iError) - CALL MPI_REDUCE(PPWCellMax , 0 , 1 , MPI_DOUBLE_PRECISION , MPI_MAX , 0 , MPI_COMM_WORLD , iError) + CALL MPI_REDUCE(PPWCellMin , 0 , 1 , MPI_DOUBLE_PRECISION , MPI_MIN , 0 , MPI_COMM_PICLAS , iError) + CALL MPI_REDUCE(PPWCellMax , 0 , 1 , MPI_DOUBLE_PRECISION , MPI_MAX , 0 , MPI_COMM_PICLAS , iError) ! in this case the receive value is not relevant. END IF #endif /*USE_MPI*/ @@ -421,11 +421,11 @@ SUBROUTINE CalcError(time,L_2_Error,L_Inf_Error) END DO ! iElem=1,PP_nElems #if USE_MPI IF(MPIroot)THEN - CALL MPI_REDUCE(MPI_IN_PLACE , L_2_Error , PP_nVar , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_WORLD , iError) - CALL MPI_REDUCE(MPI_IN_PLACE , L_Inf_Error , PP_nVar , MPI_DOUBLE_PRECISION , MPI_MAX , 0 , MPI_COMM_WORLD , iError) + CALL MPI_REDUCE(MPI_IN_PLACE , L_2_Error , PP_nVar , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_PICLAS , iError) + CALL MPI_REDUCE(MPI_IN_PLACE , L_Inf_Error , PP_nVar , MPI_DOUBLE_PRECISION , MPI_MAX , 0 , MPI_COMM_PICLAS , iError) ELSE - CALL MPI_REDUCE(L_2_Error , 0 , PP_nVar , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_WORLD , iError) - CALL MPI_REDUCE(L_Inf_Error , 0 , PP_nVar , MPI_DOUBLE_PRECISION , MPI_MAX , 0 , MPI_COMM_WORLD , iError) + CALL MPI_REDUCE(L_2_Error , 0 , PP_nVar , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_PICLAS , iError) + CALL MPI_REDUCE(L_Inf_Error , 0 , PP_nVar , MPI_DOUBLE_PRECISION , MPI_MAX , 0 , MPI_COMM_PICLAS , iError) ! in this case the receive value is not relevant. END IF #endif /*USE_MPI*/ @@ -497,11 +497,11 @@ SUBROUTINE CalcErrorPartSource(PartSource_nVar,L_2_PartSource,L_Inf_PartSource) END DO ! iElem=1,PP_nElems #if USE_MPI IF(MPIroot)THEN - CALL MPI_REDUCE(MPI_IN_PLACE , L_2_PartSource , PartSource_nVar , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_WORLD , iError) - CALL MPI_REDUCE(MPI_IN_PLACE , L_Inf_PartSource , PartSource_nVar , MPI_DOUBLE_PRECISION , MPI_MAX , 0 , MPI_COMM_WORLD , iError) + CALL MPI_REDUCE(MPI_IN_PLACE , L_2_PartSource , PartSource_nVar , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_PICLAS , iError) + CALL MPI_REDUCE(MPI_IN_PLACE , L_Inf_PartSource , PartSource_nVar , MPI_DOUBLE_PRECISION , MPI_MAX , 0 , MPI_COMM_PICLAS , iError) ELSE - CALL MPI_REDUCE(L_2_PartSource , 0 , PartSource_nVar , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_WORLD , iError) - CALL MPI_REDUCE(L_Inf_PartSource , 0 , PartSource_nVar , MPI_DOUBLE_PRECISION , MPI_MAX , 0 , MPI_COMM_WORLD , iError) + CALL MPI_REDUCE(L_2_PartSource , 0 , PartSource_nVar , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_PICLAS , iError) + CALL MPI_REDUCE(L_Inf_PartSource , 0 , PartSource_nVar , MPI_DOUBLE_PRECISION , MPI_MAX , 0 , MPI_COMM_PICLAS , iError) ! in this case the receive value is not relevant. END IF #endif /*USE_MPI*/ @@ -602,13 +602,13 @@ SUBROUTINE CalcErrorStateFiles(nVar,N1,N2,U1,U2) END DO ! iElem=1,nElems #if USE_MPI IF(MPIroot)THEN - CALL MPI_REDUCE(MPI_IN_PLACE , L_2_Error , nVar , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_WORLD , iError) - CALL MPI_REDUCE(MPI_IN_PLACE , volume , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_WORLD , iError) - CALL MPI_REDUCE(MPI_IN_PLACE , L_Inf_Error , nVar , MPI_DOUBLE_PRECISION , MPI_MAX , 0 , MPI_COMM_WORLD , iError) + CALL MPI_REDUCE(MPI_IN_PLACE , L_2_Error , nVar , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_PICLAS , iError) + CALL MPI_REDUCE(MPI_IN_PLACE , volume , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_PICLAS , iError) + CALL MPI_REDUCE(MPI_IN_PLACE , L_Inf_Error , nVar , MPI_DOUBLE_PRECISION , MPI_MAX , 0 , MPI_COMM_PICLAS , iError) ELSE - CALL MPI_REDUCE(L_2_Error , L_2_Error2 , nVar , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_WORLD , iError) - CALL MPI_REDUCE(volume , volume2 , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_WORLD , iError) - CALL MPI_REDUCE(L_Inf_Error , L_Inf_Error2 , nVar , MPI_DOUBLE_PRECISION , MPI_MAX , 0 , MPI_COMM_WORLD , iError) + CALL MPI_REDUCE(L_2_Error , L_2_Error2 , nVar , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_PICLAS , iError) + CALL MPI_REDUCE(volume , volume2 , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_PICLAS , iError) + CALL MPI_REDUCE(L_Inf_Error , L_Inf_Error2 , nVar , MPI_DOUBLE_PRECISION , MPI_MAX , 0 , MPI_COMM_PICLAS , iError) ! in this case the receive value is not relevant. END IF #endif /*USE_MPI*/ @@ -707,13 +707,13 @@ SUBROUTINE CalcErrorStateFileSigma(nVar,N1,U1) END DO ! iElem=1,nElems #if USE_MPI IF(MPIroot)THEN - CALL MPI_REDUCE(MPI_IN_PLACE , L_2_Error , nVar , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_WORLD , iError) - CALL MPI_REDUCE(MPI_IN_PLACE , volume , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_WORLD , iError) - CALL MPI_REDUCE(MPI_IN_PLACE , L_Inf_Error , nVar , MPI_DOUBLE_PRECISION , MPI_MAX , 0 , MPI_COMM_WORLD , iError) + CALL MPI_REDUCE(MPI_IN_PLACE , L_2_Error , nVar , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_PICLAS , iError) + CALL MPI_REDUCE(MPI_IN_PLACE , volume , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_PICLAS , iError) + CALL MPI_REDUCE(MPI_IN_PLACE , L_Inf_Error , nVar , MPI_DOUBLE_PRECISION , MPI_MAX , 0 , MPI_COMM_PICLAS , iError) ELSE - CALL MPI_REDUCE(L_2_Error , L_2_Error2 , nVar , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_WORLD , iError) - CALL MPI_REDUCE(volume , volume2 , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_WORLD , iError) - CALL MPI_REDUCE(L_Inf_Error , L_Inf_Error2 , nVar , MPI_DOUBLE_PRECISION , MPI_MAX , 0 , MPI_COMM_WORLD , iError) + CALL MPI_REDUCE(L_2_Error , L_2_Error2 , nVar , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_PICLAS , iError) + CALL MPI_REDUCE(volume , volume2 , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_PICLAS , iError) + CALL MPI_REDUCE(L_Inf_Error , L_Inf_Error2 , nVar , MPI_DOUBLE_PRECISION , MPI_MAX , 0 , MPI_COMM_PICLAS , iError) ! in this case the receive value is not relevant. END IF #endif /*USE_MPI*/ @@ -1243,13 +1243,13 @@ SUBROUTINE PerformAnalyze(OutputTime,FirstOrLastIter,OutPutHDF5) IF(OutPutHDF5 .AND. MeasureTrackTime)THEN #if USE_MPI IF(MPIRoot) THEN - CALL MPI_REDUCE(MPI_IN_PLACE , nTracks , 1 , MPI_INTEGER , MPI_SUM , 0 , MPI_COMM_WORLD , IERROR) - CALL MPI_REDUCE(MPI_IN_PLACE , tTracking , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_WORLD , IERROR) - CALL MPI_REDUCE(MPI_IN_PLACE , tLocalization , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_WORLD , IERROR) + CALL MPI_REDUCE(MPI_IN_PLACE , nTracks , 1 , MPI_INTEGER , MPI_SUM , 0 , MPI_COMM_PICLAS , IERROR) + CALL MPI_REDUCE(MPI_IN_PLACE , tTracking , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_PICLAS , IERROR) + CALL MPI_REDUCE(MPI_IN_PLACE , tLocalization , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_PICLAS , IERROR) ELSE ! no Root - CALL MPI_REDUCE(nTracks , RECI , 1 , MPI_INTEGER , MPI_SUM , 0 , MPI_COMM_WORLD , IERROR) - CALL MPI_REDUCE(tTracking , RECR , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_WORLD , IERROR) - CALL MPI_REDUCE(tLocalization , RECR , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_WORLD , IERROR) + CALL MPI_REDUCE(nTracks , RECI , 1 , MPI_INTEGER , MPI_SUM , 0 , MPI_COMM_PICLAS , IERROR) + CALL MPI_REDUCE(tTracking , RECR , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_PICLAS , IERROR) + CALL MPI_REDUCE(tLocalization , RECR , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_PICLAS , IERROR) END IF #endif /*USE_MPI*/ SWRITE(UNIT_StdOut,'(132("-"))') @@ -1281,9 +1281,9 @@ SUBROUTINE PerformAnalyze(OutputTime,FirstOrLastIter,OutPutHDF5) ! TotalSideBoundingBoxVolume=SUM(SideBoundingBoxVolume) !#if USE_MPI ! IF(MPIRoot) THEN -! CALL MPI_REDUCE(MPI_IN_PLACE, TotalSideBoundingBoxVolume , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_WORLD , IERROR) +! CALL MPI_REDUCE(MPI_IN_PLACE, TotalSideBoundingBoxVolume , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_PICLAS , IERROR) ! ELSE ! no Root -! CALL MPI_REDUCE(TotalSideBoundingBoxVolume , 0 , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_WORLD , IERROR) +! CALL MPI_REDUCE(TotalSideBoundingBoxVolume , 0 , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_PICLAS , IERROR) ! END IF !#endif /*USE_MPI*/ ! SWRITE(UNIT_stdOut,'(A35,E15.7)') ' Total Volume of SideBoundingBox: ' , TotalSideBoundingBoxVolume @@ -1413,13 +1413,13 @@ SUBROUTINE CodeAnalyzeOutput(TIME) ! MPI Communication #if USE_MPI IF(MPIRoot) THEN - CALL MPI_REDUCE(MPI_IN_PLACE , rBoundingBoxChecks , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_WORLD , IERROR) - CALL MPI_REDUCE(MPI_IN_PLACE , rPerformBezierClip , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_WORLD , IERROR) - CALL MPI_REDUCE(MPI_IN_PLACE , rPerformBezierNewton , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_WORLD , IERROR) + CALL MPI_REDUCE(MPI_IN_PLACE , rBoundingBoxChecks , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_PICLAS , IERROR) + CALL MPI_REDUCE(MPI_IN_PLACE , rPerformBezierClip , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_PICLAS , IERROR) + CALL MPI_REDUCE(MPI_IN_PLACE , rPerformBezierNewton , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_PICLAS , IERROR) ELSE ! no Root - CALL MPI_REDUCE(rBoundingBoxChecks , rDummy , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_WORLD , IERROR) - CALL MPI_REDUCE(rPerformBezierClip , rDummy , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_WORLD , IERROR) - CALL MPI_REDUCE(rPerformBezierNewton , rDummy , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_WORLD , IERROR) + CALL MPI_REDUCE(rBoundingBoxChecks , rDummy , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_PICLAS , IERROR) + CALL MPI_REDUCE(rPerformBezierClip , rDummy , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_PICLAS , IERROR) + CALL MPI_REDUCE(rPerformBezierNewton , rDummy , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_PICLAS , IERROR) END IF #endif /*USE_MPI*/ @@ -1559,7 +1559,7 @@ SUBROUTINE InitCalcElectricTimeDerivativeSurface() EDC%COMM(iEDCBC)%ID=iEDCBC ! create new emission communicator for electric displacement current communication. Pass MPI_INFO_NULL as rank to follow the original ordering - CALL MPI_COMM_SPLIT(MPI_COMM_WORLD, color, MPI_INFO_NULL, EDC%COMM(iEDCBC)%UNICATOR, iError) + CALL MPI_COMM_SPLIT(MPI_COMM_PICLAS, color, MPI_INFO_NULL, EDC%COMM(iEDCBC)%UNICATOR, iError) ! Find my rank on the shared communicator, comm size and proc name IF(BConProc(iEDCBC))THEN diff --git a/src/analyze/analyzefield.f90 b/src/analyze/analyzefield.f90 index 3e9080bc2..0804bb206 100644 --- a/src/analyze/analyzefield.f90 +++ b/src/analyze/analyzefield.f90 @@ -558,7 +558,7 @@ SUBROUTINE CalcPoyntingIntegral(PoyntingIntegral,doProlong) END DO ! iElems #if USE_MPI - CALL MPI_REDUCE (PoyntingIntegral(:) , SumSabs(:) , nPoyntingIntPlanes , MPI_DOUBLE_PRECISION ,MPI_SUM, 0, MPI_COMM_WORLD,IERROR) + CALL MPI_REDUCE(PoyntingIntegral(:) , SumSabs(:) , nPoyntingIntPlanes , MPI_DOUBLE_PRECISION ,MPI_SUM, 0, MPI_COMM_PICLAS,IERROR) PoyntingIntegral(:) = SumSabs(:) #endif /*USE_MPI*/ @@ -803,7 +803,7 @@ SUBROUTINE GetPoyntingIntPlane() ! prolonged values of mu_r and no MPI information has to be sent. The master side cannot currently be outside of the dielectric ! region (e.g. in vacuum) because that is not allowed. If this would be allowed that MPI rank would need the information of the ! prolonged dielectric material properties from the slave side - CALL MPI_ALLREDUCE(MPI_IN_PLACE,PoyntingUseMuR_Inv,1,MPI_LOGICAL,MPI_LOR,MPI_COMM_WORLD,iError) + CALL MPI_ALLREDUCE(MPI_IN_PLACE,PoyntingUseMuR_Inv,1,MPI_LOGICAL,MPI_LOR,MPI_COMM_PICLAS,iError) #endif ! Determine mu_r on faces within a dielectric region for calculating the Poynting vector and communicate the ! prolonged values via MPI @@ -815,9 +815,9 @@ SUBROUTINE GetPoyntingIntPlane() #if USE_MPI sumFaces=0 sumAllFaces=0 - CALL MPI_REDUCE(nFaces , sumFaces , nPoyntingIntPlanes , MPI_INTEGER, MPI_SUM,0, MPI_COMM_WORLD, IERROR) + CALL MPI_REDUCE(nFaces , sumFaces , nPoyntingIntPlanes , MPI_INTEGER, MPI_SUM,0, MPI_COMM_PICLAS, IERROR) !nFaces(:) = sumFaces(:) - CALL MPI_REDUCE(nPoyntingIntSides , sumAllFaces , 1 , MPI_INTEGER, MPI_SUM,0, MPI_COMM_WORLD, IERROR) + CALL MPI_REDUCE(nPoyntingIntSides , sumAllFaces , 1 , MPI_INTEGER, MPI_SUM,0, MPI_COMM_PICLAS, IERROR) !nPoyntingIntSides = sumAllFaces #else sumFaces=nFaces @@ -996,18 +996,18 @@ SUBROUTINE CalcPotentialEnergy(WEl) #if USE_MPI ! todo: only one reduce with array IF(MPIRoot)THEN - CALL MPI_REDUCE(MPI_IN_PLACE,WEl , 1 , MPI_DOUBLE_PRECISION, MPI_SUM,0, MPI_COMM_WORLD, IERROR) + CALL MPI_REDUCE(MPI_IN_PLACE,WEl , 1 , MPI_DOUBLE_PRECISION, MPI_SUM,0, MPI_COMM_PICLAS, IERROR) #if (PP_nVar==8) - CALL MPI_REDUCE(MPI_IN_PLACE,WMag , 1 , MPI_DOUBLE_PRECISION, MPI_SUM,0, MPI_COMM_WORLD, IERROR) - CALL MPI_REDUCE(MPI_IN_PLACE,Wphi , 1 , MPI_DOUBLE_PRECISION, MPI_SUM,0, MPI_COMM_WORLD, IERROR) - CALL MPI_REDUCE(MPI_IN_PLACE,Wpsi , 1 , MPI_DOUBLE_PRECISION, MPI_SUM,0, MPI_COMM_WORLD, IERROR) + CALL MPI_REDUCE(MPI_IN_PLACE,WMag , 1 , MPI_DOUBLE_PRECISION, MPI_SUM,0, MPI_COMM_PICLAS, IERROR) + CALL MPI_REDUCE(MPI_IN_PLACE,Wphi , 1 , MPI_DOUBLE_PRECISION, MPI_SUM,0, MPI_COMM_PICLAS, IERROR) + CALL MPI_REDUCE(MPI_IN_PLACE,Wpsi , 1 , MPI_DOUBLE_PRECISION, MPI_SUM,0, MPI_COMM_PICLAS, IERROR) #endif /*PP_nVar=8*/ ELSE - CALL MPI_REDUCE(WEl ,RD , 1 , MPI_DOUBLE_PRECISION, MPI_SUM,0, MPI_COMM_WORLD, IERROR) + CALL MPI_REDUCE(WEl ,RD , 1 , MPI_DOUBLE_PRECISION, MPI_SUM,0, MPI_COMM_PICLAS, IERROR) #if (PP_nVar==8) - CALL MPI_REDUCE(WMag ,RD , 1 , MPI_DOUBLE_PRECISION, MPI_SUM,0, MPI_COMM_WORLD, IERROR) - CALL MPI_REDUCE(Wphi ,RD , 1 , MPI_DOUBLE_PRECISION, MPI_SUM,0, MPI_COMM_WORLD, IERROR) - CALL MPI_REDUCE(Wpsi ,RD , 1 , MPI_DOUBLE_PRECISION, MPI_SUM,0, MPI_COMM_WORLD, IERROR) + CALL MPI_REDUCE(WMag ,RD , 1 , MPI_DOUBLE_PRECISION, MPI_SUM,0, MPI_COMM_PICLAS, IERROR) + CALL MPI_REDUCE(Wphi ,RD , 1 , MPI_DOUBLE_PRECISION, MPI_SUM,0, MPI_COMM_PICLAS, IERROR) + CALL MPI_REDUCE(Wpsi ,RD , 1 , MPI_DOUBLE_PRECISION, MPI_SUM,0, MPI_COMM_PICLAS, IERROR) #endif /*PP_nVar=8*/ END IF #endif /*USE_MPI*/ @@ -1197,14 +1197,14 @@ SUBROUTINE CalcPotentialEnergy_Dielectric(WEl) #if USE_MPI IF(MPIRoot)THEN - CALL MPI_REDUCE(MPI_IN_PLACE,WEl , 1 , MPI_DOUBLE_PRECISION, MPI_SUM,0, MPI_COMM_WORLD, IERROR) + CALL MPI_REDUCE(MPI_IN_PLACE,WEl , 1 , MPI_DOUBLE_PRECISION, MPI_SUM,0, MPI_COMM_PICLAS, IERROR) #if (PP_nVar==8) - CALL MPI_REDUCE(MPI_IN_PLACE,WMag , 1 , MPI_DOUBLE_PRECISION, MPI_SUM,0, MPI_COMM_WORLD, IERROR) + CALL MPI_REDUCE(MPI_IN_PLACE,WMag , 1 , MPI_DOUBLE_PRECISION, MPI_SUM,0, MPI_COMM_PICLAS, IERROR) #endif /*PP_nVar=8*/ ELSE - CALL MPI_REDUCE(WEl ,RD , 1 , MPI_DOUBLE_PRECISION, MPI_SUM,0, MPI_COMM_WORLD, IERROR) + CALL MPI_REDUCE(WEl ,RD , 1 , MPI_DOUBLE_PRECISION, MPI_SUM,0, MPI_COMM_PICLAS, IERROR) #if (PP_nVar==8) - CALL MPI_REDUCE(WMag ,RD , 1 , MPI_DOUBLE_PRECISION, MPI_SUM,0, MPI_COMM_WORLD, IERROR) + CALL MPI_REDUCE(WMag ,RD , 1 , MPI_DOUBLE_PRECISION, MPI_SUM,0, MPI_COMM_PICLAS, IERROR) #endif /*PP_nVar=8*/ END IF #endif /*USE_MPI*/ @@ -1502,7 +1502,7 @@ SUBROUTINE CalculateAverageElectricPotential() !AverageElectricPotentialProc = AverageElectricPotentialProc / (1e-4 * 1.28e-2) #if USE_MPI - CALL MPI_ALLREDUCE(AverageElectricPotentialProc , AverageElectricPotential , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , MPI_COMM_WORLD , IERROR) + CALL MPI_ALLREDUCE(AverageElectricPotentialProc , AverageElectricPotential , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , MPI_COMM_PICLAS , IERROR) #else AverageElectricPotential = AverageElectricPotentialProc #endif /*USE_MPI*/ @@ -1585,7 +1585,7 @@ SUBROUTINE GetAverageElectricPotentialPlane() END DO !iElem=1,nElems #if USE_MPI -CALL MPI_ALLREDUCE(nAverageElecPotSides , AverageElectricPotentialFaces , 1 , MPI_INTEGER , MPI_SUM , MPI_COMM_WORLD , IERROR) +CALL MPI_ALLREDUCE(nAverageElecPotSides , AverageElectricPotentialFaces , 1 , MPI_INTEGER , MPI_SUM , MPI_COMM_PICLAS , IERROR) #else AverageElectricPotentialFaces=nAverageElecPotSides #endif /*USE_MPI*/ diff --git a/src/equations/magnetostatic/calctimestep.f90 b/src/equations/magnetostatic/calctimestep.f90 index d9563065c..4f671a249 100644 --- a/src/equations/magnetostatic/calctimestep.f90 +++ b/src/equations/magnetostatic/calctimestep.f90 @@ -74,7 +74,7 @@ FUNCTION CALCTIMESTEP() END DO ! iElem=1,PP_nElems TimeStep(2)=MIN(TimeStep(2),4./maxLambda_v) #if USE_MPI -CALL MPI_ALLREDUCE(MPI_IN_PLACE,TimeStep,2,MPI_DOUBLE_PRECISION,MPI_MIN,MPI_COMM_WORLD,iError) +CALL MPI_ALLREDUCE(MPI_IN_PLACE,TimeStep,2,MPI_DOUBLE_PRECISION,MPI_MIN,MPI_COMM_PICLAS,iError) #endif CalcTimeStep=MINVAL(TimeStep) IF(CalcTimeStep.NE.CalcTimeStep)THEN diff --git a/src/equations/magnetostatic_poisson/calctimestep.f90 b/src/equations/magnetostatic_poisson/calctimestep.f90 index 4ab2db30a..89b9f318f 100644 --- a/src/equations/magnetostatic_poisson/calctimestep.f90 +++ b/src/equations/magnetostatic_poisson/calctimestep.f90 @@ -74,7 +74,7 @@ FUNCTION CALCTIMESTEP() END DO ! iElem=1,PP_nElems TimeStep(2)=MIN(TimeStep(2),4./maxLambda_v) #if USE_MPI -CALL MPI_ALLREDUCE(MPI_IN_PLACE,TimeStep,2,MPI_DOUBLE_PRECISION,MPI_MIN,MPI_COMM_WORLD,iError) +CALL MPI_ALLREDUCE(MPI_IN_PLACE,TimeStep,2,MPI_DOUBLE_PRECISION,MPI_MIN,MPI_COMM_PICLAS,iError) #endif CalcTimeStep=MINVAL(TimeStep) IF(CalcTimeStep.NE.CalcTimeStep)THEN diff --git a/src/equations/maxwell/calctimestep.f90 b/src/equations/maxwell/calctimestep.f90 index 44cb6b4e0..c4bbf5d7a 100644 --- a/src/equations/maxwell/calctimestep.f90 +++ b/src/equations/maxwell/calctimestep.f90 @@ -103,7 +103,7 @@ FUNCTION CALCTIMESTEP() END IF END DO ! iElem #if USE_MPI -CALL MPI_ALLREDUCE(locTimeStepConv,TimeStepConv,1,MPI_DOUBLE_PRECISION,MPI_MIN,MPI_COMM_WORLD,iError) +CALL MPI_ALLREDUCE(locTimeStepConv,TimeStepConv,1,MPI_DOUBLE_PRECISION,MPI_MIN,MPI_COMM_PICLAS,iError) #else TimeStepConv=locTimeStepConv #endif /*USE_MPI*/ diff --git a/src/equations/maxwell/equation.f90 b/src/equations/maxwell/equation.f90 index 34e6231f4..265e2016e 100644 --- a/src/equations/maxwell/equation.f90 +++ b/src/equations/maxwell/equation.f90 @@ -1326,7 +1326,7 @@ SUBROUTINE GetWaveGuideRadius(DoSide) END DO #if USE_MPI -CALL MPI_ALLREDUCE(MPI_IN_PLACE,TERadius,1,MPI_DOUBLE_PRECISION,MPI_MAX,MPI_COMM_WORLD,iError) +CALL MPI_ALLREDUCE(MPI_IN_PLACE,TERadius,1,MPI_DOUBLE_PRECISION,MPI_MAX,MPI_COMM_PICLAS,iError) #endif /*USE_MPI*/ LBWRITE(UNIT_StdOut,*) ' Found waveguide radius of ', TERadius @@ -1342,7 +1342,7 @@ SUBROUTINE InitExactFlux() USE MOD_PreProc USE MOD_Globals ,ONLY: abort,UNIT_stdOut,mpiroot,CollectiveStop #if USE_MPI -USE MOD_Globals ,ONLY: MPI_COMM_WORLD,MPI_SUM,MPI_INTEGER,IERROR +USE MOD_Globals ,ONLY: MPI_COMM_PICLAS,MPI_SUM,MPI_INTEGER,IERROR #endif USE MOD_Mesh_Vars ,ONLY: nElems,ElemToSide,SideToElem,lastMPISide_MINE USE MOD_Interfaces ,ONLY: FindElementInRegion,FindInterfacesInRegion,CountAndCreateMappings @@ -1406,7 +1406,7 @@ SUBROUTINE InitExactFlux() #if USE_MPI sumExactFluxMasterInterFaces=0 - CALL MPI_REDUCE(nExactFluxMasterInterFaces , sumExactFluxMasterInterFaces , 1 , MPI_INTEGER, MPI_SUM,0, MPI_COMM_WORLD, IERROR) + CALL MPI_REDUCE(nExactFluxMasterInterFaces , sumExactFluxMasterInterFaces , 1 , MPI_INTEGER, MPI_SUM,0, MPI_COMM_PICLAS, IERROR) #else sumExactFluxMasterInterFaces=nExactFluxMasterInterFaces #endif /*USE_MPI*/ @@ -1430,7 +1430,7 @@ SUBROUTINE InitExactFlux() #if USE_MPI sumExactFluxMasterInterFaces=0 - CALL MPI_REDUCE(nExactFluxMasterInterFaces , sumExactFluxMasterInterFaces , 1 , MPI_INTEGER, MPI_SUM,0, MPI_COMM_WORLD, IERROR) + CALL MPI_REDUCE(nExactFluxMasterInterFaces , sumExactFluxMasterInterFaces , 1 , MPI_INTEGER, MPI_SUM,0, MPI_COMM_PICLAS, IERROR) #else sumExactFluxMasterInterFaces=nExactFluxMasterInterFaces #endif /*USE_MPI*/ @@ -1462,7 +1462,7 @@ SUBROUTINE InitExactFlux() SDEALLOCATE(ElemToExactFlux) SDEALLOCATE(FaceToExactFlux) SDEALLOCATE(FaceToExactFluxInter) -!CALL MPI_BARRIER(MPI_COMM_WORLD, iError) +!CALL MPI_BARRIER(MPI_COMM_PICLAS, iError) !stop END SUBROUTINE InitExactFlux diff --git a/src/equations/maxwell/getboundaryflux.f90 b/src/equations/maxwell/getboundaryflux.f90 index 2a42d0ac2..4bc0c47f1 100644 --- a/src/equations/maxwell/getboundaryflux.f90 +++ b/src/equations/maxwell/getboundaryflux.f90 @@ -97,7 +97,7 @@ SUBROUTINE InitBC() END DO MaxBCStateGLobal=MaxBCState #if USE_MPI -CALL MPI_ALLREDUCE(MPI_IN_PLACE,MaxBCStateGlobal,1,MPI_INTEGER,MPI_MAX,MPI_COMM_WORLD,iError) +CALL MPI_ALLREDUCE(MPI_IN_PLACE,MaxBCStateGlobal,1,MPI_INTEGER,MPI_MAX,MPI_COMM_PICLAS,iError) #endif /*USE_MPI*/ ! Sanity check for BCs @@ -451,7 +451,7 @@ SUBROUTINE ReadBCFlow(FileName) REAL,ALLOCATABLE :: xGP_tmp(:),wBary_tmp(:),wGP_tmp(:) !=================================================================================================================================== SWRITE(UNIT_StdOut,'(A,A)')' Read BC state from file "',FileName -CALL OpenDataFile(FileName,create=.FALSE.,readOnly=.TRUE.,single=.FALSE.,communicatorOpt=MPI_COMM_WORLD) +CALL OpenDataFile(FileName,create=.FALSE.,readOnly=.TRUE.,single=.FALSE.,communicatorOpt=MPI_COMM_PICLAS) CALL GetDataProps('DG_Solution',nVar_HDF5,N_HDF5,nElems_HDF5,NodeType_HDF5) IF(((N_HDF5.NE.PP_N) .OR. (TRIM(NodeType_HDF5).NE.TRIM(NodeType))))THEN InterpolateSolution=.TRUE. diff --git a/src/equations/maxwell_pois/calctimestep.f90 b/src/equations/maxwell_pois/calctimestep.f90 index 60da337f2..828da56b4 100644 --- a/src/equations/maxwell_pois/calctimestep.f90 +++ b/src/equations/maxwell_pois/calctimestep.f90 @@ -102,7 +102,7 @@ FUNCTION CALCTIMESTEP() END IF END DO ! iElem #if USE_MPI -CALL MPI_ALLREDUCE(MPI_IN_PLACE,TimeStepConv,1,MPI_DOUBLE_PRECISION,MPI_MIN,MPI_COMM_WORLD,iError) +CALL MPI_ALLREDUCE(MPI_IN_PLACE,TimeStepConv,1,MPI_DOUBLE_PRECISION,MPI_MIN,MPI_COMM_PICLAS,iError) #endif /*USE_MPI*/ CalcTimeStep=TimeStepConv END FUNCTION CALCTIMESTEP diff --git a/src/equations/maxwell_pois/equation.f90 b/src/equations/maxwell_pois/equation.f90 index 824bbe885..231e0aa0e 100644 --- a/src/equations/maxwell_pois/equation.f90 +++ b/src/equations/maxwell_pois/equation.f90 @@ -1121,7 +1121,7 @@ SUBROUTINE StartExchangeMPIData_Pois(FaceData,LowerBound,UpperBound,SendRequest, SideID_start=OffsetMPISides_send(iNbProc-1,SendID)+1 SideID_end =OffsetMPISides_send(iNbProc,SendID) CALL MPI_ISEND(FaceData(:,:,:,SideID_start:SideID_end),nSendVal,MPI_DOUBLE_PRECISION, & - nbProc(iNbProc),0,MPI_COMM_WORLD,SendRequest(iNbProc),iError) + nbProc(iNbProc),0,MPI_COMM_PICLAS,SendRequest(iNbProc),iError) END IF ! Start receive face data IF(nMPISides_rec(iNbProc,SendID).GT.0)THEN @@ -1129,7 +1129,7 @@ SUBROUTINE StartExchangeMPIData_Pois(FaceData,LowerBound,UpperBound,SendRequest, SideID_start=OffsetMPISides_rec(iNbProc-1,SendID)+1 SideID_end =OffsetMPISides_rec(iNbProc,SendID) CALL MPI_IRECV(FaceData(:,:,:,SideID_start:SideID_end),nRecVal,MPI_DOUBLE_PRECISION, & - nbProc(iNbProc),0,MPI_COMM_WORLD,RecRequest(iNbProc),iError) + nbProc(iNbProc),0,MPI_COMM_PICLAS,RecRequest(iNbProc),iError) END IF END DO !iProc=1,nNBProcs END SUBROUTINE StartExchangeMPIData_Pois diff --git a/src/equations/maxwell_pois/getboundaryflux.f90 b/src/equations/maxwell_pois/getboundaryflux.f90 index a17c2959e..ceb927151 100644 --- a/src/equations/maxwell_pois/getboundaryflux.f90 +++ b/src/equations/maxwell_pois/getboundaryflux.f90 @@ -102,7 +102,7 @@ SUBROUTINE InitBC() END DO MaxBCStateGLobal=MaxBCState #if USE_MPI -CALL MPI_ALLREDUCE(MPI_IN_PLACE,MaxBCStateGlobal,1,MPI_INTEGER,MPI_MAX,MPI_COMM_WORLD,iError) +CALL MPI_ALLREDUCE(MPI_IN_PLACE,MaxBCStateGlobal,1,MPI_INTEGER,MPI_MAX,MPI_COMM_PICLAS,iError) #endif /*USE_MPI*/ ! Sanity check for BCs @@ -422,7 +422,7 @@ SUBROUTINE ReadBCFlow(FileName) REAL,ALLOCATABLE :: xGP_tmp(:),wBary_tmp(:),wGP_tmp(:) !=================================================================================================================================== SWRITE(UNIT_StdOut,'(A,A)')' Read BC state from file "',FileName -CALL OpenDataFile(FileName,create=.FALSE.,readOnly=.TRUE.,single=.FALSE.,communicatorOpt=MPI_COMM_WORLD) +CALL OpenDataFile(FileName,create=.FALSE.,readOnly=.TRUE.,single=.FALSE.,communicatorOpt=MPI_COMM_PICLAS) CALL GetDataProps('DG_Solution',nVar_HDF5,N_HDF5,nELems_HDF5,NodeType_HDF5) IF(((N_HDF5.NE.PP_N) .OR. (TRIM(NodeType_HDF5).NE.TRIM(NodeType))))THEN diff --git a/src/equations/poisson/calctimestep.f90 b/src/equations/poisson/calctimestep.f90 index 4ab2db30a..89b9f318f 100644 --- a/src/equations/poisson/calctimestep.f90 +++ b/src/equations/poisson/calctimestep.f90 @@ -74,7 +74,7 @@ FUNCTION CALCTIMESTEP() END DO ! iElem=1,PP_nElems TimeStep(2)=MIN(TimeStep(2),4./maxLambda_v) #if USE_MPI -CALL MPI_ALLREDUCE(MPI_IN_PLACE,TimeStep,2,MPI_DOUBLE_PRECISION,MPI_MIN,MPI_COMM_WORLD,iError) +CALL MPI_ALLREDUCE(MPI_IN_PLACE,TimeStep,2,MPI_DOUBLE_PRECISION,MPI_MIN,MPI_COMM_PICLAS,iError) #endif CalcTimeStep=MINVAL(TimeStep) IF(CalcTimeStep.NE.CalcTimeStep)THEN diff --git a/src/equations/poisson/equation.f90 b/src/equations/poisson/equation.f90 index 65339207a..4bd4702fe 100644 --- a/src/equations/poisson/equation.f90 +++ b/src/equations/poisson/equation.f90 @@ -287,7 +287,7 @@ SUBROUTINE InitCoupledPowerPotential() USE MOD_ReadInTools ,ONLY: GETREALARRAY,GETREAL,GETINTFROMSTR,CountOption USE MOD_Mesh_Vars ,ONLY: BoundaryType,nBCs #if USE_MPI -USE MOD_Globals ,ONLY: IERROR,MPI_COMM_NULL,MPI_DOUBLE_PRECISION,MPI_COMM_WORLD,MPI_INFO_NULL,MPI_UNDEFINED,MPIRoot +USE MOD_Globals ,ONLY: IERROR,MPI_COMM_NULL,MPI_DOUBLE_PRECISION,MPI_COMM_PICLAS,MPI_INFO_NULL,MPI_UNDEFINED,MPIRoot USE MOD_Globals ,ONLY: UNIT_StdOut USE MOD_HDG_Vars ,ONLY: CPPCOMM USE MOD_Mesh_Vars ,ONLY: nBCSides,BC @@ -378,7 +378,7 @@ SUBROUTINE InitCoupledPowerPotential() CPPCOMM%ID = CPPBoundaries ! create new emission communicator for coupled power potential communication. Pass MPI_INFO_NULL as rank to follow the original ordering -CALL MPI_COMM_SPLIT(MPI_COMM_WORLD, color, MPI_INFO_NULL, CPPCOMM%UNICATOR, iError) +CALL MPI_COMM_SPLIT(MPI_COMM_PICLAS, color, MPI_INFO_NULL, CPPCOMM%UNICATOR, iError) ! Find my rank on the shared communicator, comm size and proc name IF(BConProc)THEN @@ -739,7 +739,7 @@ SUBROUTINE ExactFunc(ExactFunction,x,resu,t,ElemID,iRefState,iLinState,BCState) SWRITE(*,*) "r1=",r1 CALL abort(__STAMP__,'Point source in dielectric region: Cannot evaluate the exact function at the singularity!') END IF - resu(1:PP_nVar) = (2.0*Q/eps12) * 1./r1 + resu(1:PP_nVar) = (2.0*Q/eps12) * 1./r1 END IF END ASSOCIATE CASE(500) ! Coaxial capacitor with Floating Boundary Condition (FPC) with from diff --git a/src/equations/poisson/getboundaryflux.f90 b/src/equations/poisson/getboundaryflux.f90 index 2d8ad66fb..d767fafb3 100644 --- a/src/equations/poisson/getboundaryflux.f90 +++ b/src/equations/poisson/getboundaryflux.f90 @@ -95,7 +95,7 @@ SUBROUTINE InitBC() END DO MaxBCStateGLobal=MaxBCState #if USE_MPI -CALL MPI_ALLREDUCE(MPI_IN_PLACE,MaxBCStateGlobal,1,MPI_INTEGER,MPI_MAX,MPI_COMM_WORLD,iError) +CALL MPI_ALLREDUCE(MPI_IN_PLACE,MaxBCStateGlobal,1,MPI_INTEGER,MPI_MAX,MPI_COMM_PICLAS,iError) #endif /*USE_MPI*/ ! Sanity check for BCs diff --git a/src/globals/globals.f90 b/src/globals/globals.f90 index ce1737da8..4a62619c8 100644 --- a/src/globals/globals.f90 +++ b/src/globals/globals.f90 @@ -39,6 +39,7 @@ MODULE MOD_Globals INTEGER :: MPI_COMM_NODE ! local node subgroup INTEGER :: MPI_COMM_LEADERS ! all node masters INTEGER :: MPI_COMM_WORKERS ! all non-master nodes +INTEGER :: MPI_COMM_PICLAS ! all nodes LOGICAL :: MPIRoot,MPILocalRoot #if USE_MPI !#include "mpif.h" diff --git a/src/hdg/fillmortar_hdg.f90 b/src/hdg/fillmortar_hdg.f90 index 3a1ca87ea..b25250440 100644 --- a/src/hdg/fillmortar_hdg.f90 +++ b/src/hdg/fillmortar_hdg.f90 @@ -67,7 +67,6 @@ SUBROUTINE InitMortar_HDG() #if USE_PETSC USE MOD_HDG_Vars ,ONLY: SmallMortarType #if USE_MPI -USE MOD_MPI_Shared_Vars ,ONLY: MPI_COMM_WORLD USE MOD_MPI ,ONLY: StartReceiveMPIDataInt,StartSendMPIDataInt,FinishExchangeMPIData USE MOD_MPI_Vars #endif /*USE_MPI*/ diff --git a/src/hdg/hdg.f90 b/src/hdg/hdg.f90 index bd1533612..f4cd42c66 100644 --- a/src/hdg/hdg.f90 +++ b/src/hdg/hdg.f90 @@ -128,7 +128,6 @@ SUBROUTINE InitHDG() USE PETSc USE MOD_Mesh_Vars ,ONLY: nMPISides_YOUR #if USE_MPI -USE MOD_MPI_Shared_Vars ,ONLY: MPI_COMM_WORLD USE MOD_MPI ,ONLY: StartReceiveMPIDataInt,StartSendMPIDataInt,FinishExchangeMPIData USE MOD_MPI_Vars #endif /*USE_MPI*/ @@ -322,7 +321,7 @@ SUBROUTINE InitHDG() END DO nPETScUniqueSides = nSides-nDirichletBCSides-nMPISides_YOUR-nMortarMasterSides-nConductorBCsides IF(ZeroPotentialSideID.GT.0) nPETScUniqueSides = nPETScUniqueSides - 1 -CALL MPI_ALLGATHER(nPETScUniqueSides,1,MPI_INTEGER,OffsetPETScSideMPI,1,MPI_INTEGER,MPI_COMM_WORLD,IERROR) +CALL MPI_ALLGATHER(nPETScUniqueSides,1,MPI_INTEGER,OffsetPETScSideMPI,1,MPI_INTEGER,MPI_COMM_PICLAS,IERROR) DO iProc=1, myrank OffsetPETScSide = OffsetPETScSide + OffsetPETScSideMPI(iProc) END DO @@ -446,7 +445,7 @@ SUBROUTINE InitHDG() ! ALLOCATE(FPC%GroupGlobal(1:FPC%nFPCBounds)) ! FPC%GroupGlobal(1:FPC%nFPCBounds) = FPC%Group(1:FPC%nFPCBounds,3) ! ! TODO is this allreduce required? -! !CALL MPI_ALLREDUCE(FPC%Group(1:FPC%nFPCBounds,3),FPC%GroupGlobal(1:FPC%nFPCBounds), FPC%nFPCBounds, MPI_DOUBLE_PRECISION, MPI_SUM, MPI_COMM_WORLD, IERROR) +! !CALL MPI_ALLREDUCE(FPC%Group(1:FPC%nFPCBounds,3),FPC%GroupGlobal(1:FPC%nFPCBounds), FPC%nFPCBounds, MPI_DOUBLE_PRECISION, MPI_SUM, MPI_COMM_PICLAS, IERROR) ! nAffectedBlockSides = MAXVAL(FPC%GroupGlobal(:)) ! DEALLOCATE(FPC%GroupGlobal) ! nAffectedBlockSides = MAX(22,nAffectedBlockSides*6) @@ -620,11 +619,11 @@ SUBROUTINE InitZeroPotential() #if USE_MPI ! Combine number of found zero potential sides to make sure that at least one is found IF(MPIroot)THEN - CALL MPI_REDUCE(nZeroPotentialSides , nZeroPotentialSidesGlobal , 1 , MPI_INTEGER , MPI_SUM , 0 , MPI_COMM_WORLD , IERROR) - CALL MPI_REDUCE(nZeroPotentialSides , nZeroPotentialSidesMax , 1 , MPI_INTEGER , MPI_MAX , 0 , MPI_COMM_WORLD , IERROR) + CALL MPI_REDUCE(nZeroPotentialSides , nZeroPotentialSidesGlobal , 1 , MPI_INTEGER , MPI_SUM , 0 , MPI_COMM_PICLAS , IERROR) + CALL MPI_REDUCE(nZeroPotentialSides , nZeroPotentialSidesMax , 1 , MPI_INTEGER , MPI_MAX , 0 , MPI_COMM_PICLAS , IERROR) ELSE - CALL MPI_REDUCE(nZeroPotentialSides , 0 , 1 , MPI_INTEGER , MPI_SUM , 0 , MPI_COMM_WORLD , IERROR) - CALL MPI_REDUCE(nZeroPotentialSides , 0 , 1 , MPI_INTEGER , MPI_MAX , 0 , MPI_COMM_WORLD , IERROR) + CALL MPI_REDUCE(nZeroPotentialSides , 0 , 1 , MPI_INTEGER , MPI_SUM , 0 , MPI_COMM_PICLAS , IERROR) + CALL MPI_REDUCE(nZeroPotentialSides , 0 , 1 , MPI_INTEGER , MPI_MAX , 0 , MPI_COMM_PICLAS , IERROR) END IF #else nZeroPotentialSidesGlobal = nZeroPotentialSides @@ -664,7 +663,7 @@ END SUBROUTINE InitZeroPotential !=================================================================================================================================== SUBROUTINE InitFPC() ! MODULES -USE MOD_Globals ! ,ONLY: MPIRoot,iError,myrank,UNIT_stdOut,MPI_COMM_WORLD +USE MOD_Globals ! ,ONLY: MPIRoot,iError,myrank,UNIT_stdOut,MPI_COMM_PICLAS USE MOD_Preproc USE MOD_Mesh_Vars ,ONLY: nBCs,BoundaryType USE MOD_Analyze_Vars ,ONLY: DoFieldAnalyze @@ -881,7 +880,7 @@ SUBROUTINE InitFPC() FPC%COMM(iUniqueFPCBC)%ID=iUniqueFPCBC ! create new emission communicator for floating boundary condition communication. Pass MPI_INFO_NULL as rank to follow the original ordering - CALL MPI_COMM_SPLIT(MPI_COMM_WORLD, color, MPI_INFO_NULL, FPC%COMM(iUniqueFPCBC)%UNICATOR, iError) + CALL MPI_COMM_SPLIT(MPI_COMM_PICLAS, color, MPI_INFO_NULL, FPC%COMM(iUniqueFPCBC)%UNICATOR, iError) ! Find my rank on the shared communicator, comm size and proc name IF(BConProc(iUniqueFPCBC))THEN @@ -946,7 +945,7 @@ END SUBROUTINE InitFPC !=================================================================================================================================== SUBROUTINE InitEPC() ! MODULES -USE MOD_Globals ! ,ONLY: MPIRoot,iError,myrank,UNIT_stdOut,MPI_COMM_WORLD +USE MOD_Globals ! ,ONLY: MPIRoot,iError,myrank,UNIT_stdOut,MPI_COMM_PICLAS USE MOD_Preproc USE MOD_Mesh_Vars ,ONLY: nBCs,BoundaryType USE MOD_Analyze_Vars ,ONLY: DoFieldAnalyze @@ -1160,7 +1159,7 @@ SUBROUTINE InitEPC() ! Create new emission communicator for Electric potential boundary condition communication. ! Pass MPI_INFO_NULL as rank to follow the original ordering - CALL MPI_COMM_SPLIT(MPI_COMM_WORLD, color, MPI_INFO_NULL, EPC%COMM(iUniqueEPCBC)%UNICATOR, iError) + CALL MPI_COMM_SPLIT(MPI_COMM_PICLAS, color, MPI_INFO_NULL, EPC%COMM(iUniqueEPCBC)%UNICATOR, iError) ! Find my rank on the shared communicator, comm size and proc name IF(BConProc(iUniqueEPCBC))THEN @@ -1233,7 +1232,7 @@ SUBROUTINE InitBV() USE MOD_LoadBalance_Vars ,ONLY: PerformLoadBalance #endif /*USE_LOADBALANCE*/ #if USE_MPI -USE MOD_Globals ,ONLY: IERROR,MPI_COMM_NULL,MPI_DOUBLE_PRECISION,MPI_COMM_WORLD,MPI_INFO_NULL,MPI_UNDEFINED,MPIRoot +USE MOD_Globals ,ONLY: IERROR,MPI_COMM_NULL,MPI_DOUBLE_PRECISION,MPI_COMM_PICLAS,MPI_INFO_NULL,MPI_UNDEFINED,MPIRoot USE MOD_Mesh_Vars ,ONLY: nBCSides,BC #endif /*USE_MPI*/ IMPLICIT NONE @@ -1334,7 +1333,7 @@ SUBROUTINE InitBV() BiasVoltage%COMM%ID = BVBoundaries ! Create new emission communicator for electric potential boundary condition communication. Pass MPI_INFO_NULL as rank to follow the original ordering -CALL MPI_COMM_SPLIT(MPI_COMM_WORLD, color, MPI_INFO_NULL, BiasVoltage%COMM%UNICATOR, iError) +CALL MPI_COMM_SPLIT(MPI_COMM_PICLAS, color, MPI_INFO_NULL, BiasVoltage%COMM%UNICATOR, iError) ! Find my rank on the shared communicator, comm size and process name IF(BConProc)THEN @@ -2720,7 +2719,7 @@ SUBROUTINE CheckNonLinRes(RHS,lambda,converged,Norm_R2) #if USE_MPI IF(MPIroot) converged=(Norm_R2.LT.EpsNonLinear**2) - CALL MPI_BCAST(converged,1,MPI_LOGICAL,0,MPI_COMM_WORLD,iError) + CALL MPI_BCAST(converged,1,MPI_LOGICAL,0,MPI_COMM_PICLAS,iError) #else converged=(Norm_R2.LT.EpsNonLinear**2) #endif /*USE_MPI*/ @@ -2804,14 +2803,14 @@ SUBROUTINE CG_solver(RHS,lambda,iVar) IF(useRelativeAbortCrit)THEN #if USE_MPI IF(MPIroot) converged=(Norm_R2.LT.1e-16) - CALL MPI_BCAST(converged,1,MPI_LOGICAL,0,MPI_COMM_WORLD,iError) + CALL MPI_BCAST(converged,1,MPI_LOGICAL,0,MPI_COMM_PICLAS,iError) #else converged=(Norm_R2.LT.1e-16) #endif /*USE_MPI*/ ELSE #if USE_MPI IF(MPIroot) converged=(Norm_R2.LT.EpsCG**2) - CALL MPI_BCAST(converged,1,MPI_LOGICAL,0,MPI_COMM_WORLD,iError) + CALL MPI_BCAST(converged,1,MPI_LOGICAL,0,MPI_COMM_PICLAS,iError) #else converged=(Norm_R2.LT.EpsCG**2) #endif /*USE_MPI*/ @@ -2873,7 +2872,7 @@ SUBROUTINE CG_solver(RHS,lambda,iVar) CALL SYSTEM_CLOCK(count=CounterStart) #endif /*defined(MEASURE_MPI_WAIT)*/ - CALL MPI_BCAST(converged,1,MPI_LOGICAL,0,MPI_COMM_WORLD,iError) + CALL MPI_BCAST(converged,1,MPI_LOGICAL,0,MPI_COMM_PICLAS,iError) #if defined(MEASURE_MPI_WAIT) CALL SYSTEM_CLOCK(count=CounterEnd, count_rate=Rate) @@ -3238,7 +3237,7 @@ SUBROUTINE VectorDotProduct(dim1,A,B,Resu) #if USE_MPI ResuSend=Resu - CALL MPI_ALLREDUCE(ResuSend,Resu,1,MPI_DOUBLE_PRECISION,MPI_SUM,MPI_COMM_WORLD,iError) + CALL MPI_ALLREDUCE(ResuSend,Resu,1,MPI_DOUBLE_PRECISION,MPI_SUM,MPI_COMM_PICLAS,iError) #endif #if defined(MEASURE_MPI_WAIT) diff --git a/src/interfaces/interfaces.f90 b/src/interfaces/interfaces.f90 index 868e33f6d..c09ca59c2 100644 --- a/src/interfaces/interfaces.f90 +++ b/src/interfaces/interfaces.f90 @@ -822,9 +822,9 @@ SUBROUTINE CountAndCreateMappings(TypeName,& END DO sumGlobalFaces = 0 sumGlobalInterFaces = 0 - CALL MPI_REDUCE(nElems ,nGlobalSpecialElems,1,MPI_INTEGER,MPI_SUM,0,MPI_COMM_WORLD,iError) - CALL MPI_REDUCE(nMasterfaces ,nGlobalFaces ,1,MPI_INTEGER,MPI_SUM,0,MPI_COMM_WORLD,IERROR) - CALL MPI_REDUCE(nMasterInterFaces,nGlobalInterfaces ,1,MPI_INTEGER,MPI_SUM,0,MPI_COMM_WORLD,IERROR) + CALL MPI_REDUCE(nElems ,nGlobalSpecialElems,1,MPI_INTEGER,MPI_SUM,0,MPI_COMM_PICLAS,iError) + CALL MPI_REDUCE(nMasterfaces ,nGlobalFaces ,1,MPI_INTEGER,MPI_SUM,0,MPI_COMM_PICLAS,IERROR) + CALL MPI_REDUCE(nMasterInterFaces,nGlobalInterfaces ,1,MPI_INTEGER,MPI_SUM,0,MPI_COMM_PICLAS,IERROR) #else nGlobalSpecialElems = nElems sumGlobalFaces = nFaces diff --git a/src/io_hdf5/hdf5_input.f90 b/src/io_hdf5/hdf5_input.f90 index ce039326a..061c57c3c 100644 --- a/src/io_hdf5/hdf5_input.f90 +++ b/src/io_hdf5/hdf5_input.f90 @@ -182,7 +182,7 @@ FUNCTION ISVALIDMESHFILE(MeshFileName) CALL H5PCREATE_F(H5P_FILE_ACCESS_F, Plist_ID, iError) #if USE_MPI ! Setup file access property list with parallel I/O access (MPI) -CALL H5PSET_FAPL_MPIO_F(Plist_ID,MPI_COMM_WORLD, MPIInfo, iError) +CALL H5PSET_FAPL_MPIO_F(Plist_ID,MPI_COMM_PICLAS, MPIInfo, iError) #endif /*USE_MPI*/ ! Check if file exists @@ -699,7 +699,7 @@ SUBROUTINE GetHDF5NextFileName(FileName,NextFileName_HDF5) ! INPUT/OUTPUT VARIABLES CHARACTER(LEN=*),INTENT(IN) :: FileName !< filename to check #if USE_MPI -LOGICAL,INTENT(IN) :: single !< switch whether file is being accessed in parallel my MPI_COMM_WORLD +LOGICAL,INTENT(IN) :: single !< switch whether file is being accessed in parallel my MPI_COMM_PICLAS #endif CHARACTER(LEN=255),INTENT(OUT) :: NextFileName_HDF5 !< output: follow up file according to checked file opened !----------------------------------------------------------------------------------------------------------------------------------- @@ -720,7 +720,7 @@ SUBROUTINE GetHDF5NextFileName(FileName,NextFileName_HDF5) #if USE_MPI IF(.NOT.single)THEN ! Set property list to MPI IO - CALL H5PSET_FAPL_MPIO_F(Plist_ID, MPI_COMM_WORLD, MPI_INFO_NULL, iError) + CALL H5PSET_FAPL_MPIO_F(Plist_ID, MPI_COMM_PICLAS, MPI_INFO_NULL, iError) END IF #endif /*USE_MPI*/ ! Open file diff --git a/src/io_hdf5/hdf5_input_particle.f90 b/src/io_hdf5/hdf5_input_particle.f90 index 9eade00d6..35b8134d9 100644 --- a/src/io_hdf5/hdf5_input_particle.f90 +++ b/src/io_hdf5/hdf5_input_particle.f90 @@ -187,7 +187,6 @@ SUBROUTINE ReadEmissionVariablesFromHDF5() USE MOD_Globals !USE MOD_PreProc USE MOD_Particle_Vars ,ONLY: Species,nSpecies -USE MOD_Particle_MPI_Vars ,ONLY: PartMPI USE MOD_Particle_Vars ,ONLY: NeutralizationBalanceGlobal !USE MOD_Particle_Vars ,ONLY: NeutralizationBalance USE MOD_HDF5_Input ,ONLY: ReadArray,DatasetExists @@ -215,7 +214,7 @@ SUBROUTINE ReadEmissionVariablesFromHDF5() ! Only the root reads the data and replaces his value, which will be communicated via the all-reduce (he also does the ! initial output) - IF(PartMPI%MPIRoot)THEN + IF(MPIRoot)THEN IF(.NOT.FILEEXISTS(RestartFile)) & CALL abort(__STAMP__,'Error in ReadEmissionVariablesFromHDF5() becuase RestartFile does not exist: '//TRIM(RestartFile)) @@ -242,7 +241,7 @@ SUBROUTINE ReadEmissionVariablesFromHDF5() ! ! Communicate number of particles with all procs in the same init group to the global root for output ! InitGroup=Species(iSpec)%Init(iInit)%InitCOMM ! ! Only processors which are part of group take part in the communication -! CALL MPI_BCAST(Box_X, 3, MPI_DOUBLE_PRECISION, 0, MPI_COMM_WORLD, iError) +! CALL MPI_BCAST(Box_X, 3, MPI_DOUBLE_PRECISION, 0, MPI_COMM_PICLAS, iError) !#endif /*USE_MPI*/ END SELECT diff --git a/src/io_hdf5/hdf5_output.f90 b/src/io_hdf5/hdf5_output.f90 index 0658c5ae7..9c2e72e58 100644 --- a/src/io_hdf5/hdf5_output.f90 +++ b/src/io_hdf5/hdf5_output.f90 @@ -117,7 +117,7 @@ SUBROUTINE WriteTimeAverage(MeshFileName,OutputTime,PreviousTime,VarNamesAvg,Var CALL CloseDataFile() END IF #if USE_MPI - CALL MPI_BARRIER(MPI_COMM_WORLD,iError) + CALL MPI_BARRIER(MPI_COMM_PICLAS,iError) #endif /*USE_MPI*/ ! Reopen file and write DG solution @@ -147,7 +147,7 @@ SUBROUTINE WriteTimeAverage(MeshFileName,OutputTime,PreviousTime,VarNamesAvg,Var CALL CloseDataFile() END IF #if USE_MPI - CALL MPI_BARRIER(MPI_COMM_WORLD,iError) + CALL MPI_BARRIER(MPI_COMM_PICLAS,iError) #endif /*USE_MPI*/ ! Reopen file and write DG solution @@ -825,7 +825,7 @@ SUBROUTINE GatheredWriteArray(FileName,create,DataSetName,rank,nValGlobal,nVal,o SDEALLOCATE(UStr) ELSE #endif - CALL OpenDataFile(FileName,create=create,single=.FALSE.,readOnly=.FALSE.,communicatorOpt=MPI_COMM_WORLD) + CALL OpenDataFile(FileName,create=create,single=.FALSE.,readOnly=.FALSE.,communicatorOpt=MPI_COMM_PICLAS) IF(PRESENT(RealArray)) CALL WriteArrayToHDF5(DataSetName , rank , nValGlobal , nVal , & offset , collective , RealArray=RealArray) IF(PRESENT(IntegerArray)) CALL WriteArrayToHDF5(DataSetName , rank , nValGlobal , nVal , & @@ -921,8 +921,8 @@ SUBROUTINE DistributedWriteArray(FileName,DataSetName,rank,nValGlobal,nVal,offse ELSE ! 3: else write with all procs of the given communicator ! communicator_opt has to be the given communicator or else procs that are not in the given communicator might block the write out - ! e.g. surface communicator contains only procs with physical surface and MPI_COMM_WORLD contains every proc - ! Consequently, MPI_COMM_WORLD would block communication + ! e.g. surface communicator contains only procs with physical surface and MPI_COMM_PICLAS contains every proc + ! Consequently, MPI_COMM_PICLAS would block communication CALL OpenDataFile(FileName,create=.FALSE.,single=.FALSE.,readOnly=.FALSE.,communicatorOpt=communicator) IF(PRESENT(RealArray)) CALL WriteArrayToHDF5(DataSetName , rank , nValGlobal , nVal , & offset , collective , RealArray=RealArray) diff --git a/src/io_hdf5/hdf5_output_elemdata.f90 b/src/io_hdf5/hdf5_output_elemdata.f90 index 312bd2e2d..3524500ca 100644 --- a/src/io_hdf5/hdf5_output_elemdata.f90 +++ b/src/io_hdf5/hdf5_output_elemdata.f90 @@ -169,7 +169,7 @@ SUBROUTINE WriteMyInvisibleRankToHDF5() FileName=TRIM(ProjectName)//'_MyInvisibleRank.h5' IF(MPIRoot) CALL GenerateFileSkeleton('MyInvisibleRank',N_variables,StrVarNames,TRIM(MeshFile),OutputTime,FileNameIn=FileName) #if USE_MPI - CALL MPI_BARRIER(MPI_COMM_WORLD,iError) + CALL MPI_BARRIER(MPI_COMM_PICLAS,iError) #endif ! Write all 'ElemData' arrays to a single container in the state.h5 file @@ -212,7 +212,7 @@ SUBROUTINE WriteLostRotPeriodicSidesToHDF5() FileName=TRIM(ProjectName)//'_LostRotPeriodicSides.h5' IF(MPIRoot) CALL GenerateFileSkeleton('LostRotPeriodicSides',N_variables,StrVarNames,TRIM(MeshFile),OutputTime,FileNameIn=FileName) #if USE_MPI - CALL MPI_BARRIER(MPI_COMM_WORLD,iError) + CALL MPI_BARRIER(MPI_COMM_PICLAS,iError) #endif ! Write all 'ElemData' arrays to a single container in the state.h5 file diff --git a/src/io_hdf5/hdf5_output_field.f90 b/src/io_hdf5/hdf5_output_field.f90 index 53b54b70e..856793131 100644 --- a/src/io_hdf5/hdf5_output_field.f90 +++ b/src/io_hdf5/hdf5_output_field.f90 @@ -96,10 +96,10 @@ SUBROUTINE WriteDielectricGlobalToHDF5() FileName=TRIM(TIMESTAMP(TRIM(ProjectName)//'_DielectricGlobal',OutputTime))//'.h5' IF(MPIRoot) CALL GenerateFileSkeleton('DielectricGlobal',N_variables,StrVarNames,TRIM(MeshFile),OutputTime) #if USE_MPI - CALL MPI_BARRIER(MPI_COMM_WORLD,iError) + CALL MPI_BARRIER(MPI_COMM_PICLAS,iError) #endif IF(MPIRoot)THEN - CALL OpenDataFile(FileName,create=.FALSE.,single=.TRUE.,readOnly=.FALSE.,communicatorOpt=MPI_COMM_WORLD) + CALL OpenDataFile(FileName,create=.FALSE.,single=.TRUE.,readOnly=.FALSE.,communicatorOpt=MPI_COMM_PICLAS) CALL WriteAttributeToHDF5(File_ID,'VarNamesDielectricGlobal',N_variables,StrArray=StrVarNames) CALL CloseDataFile() END IF ! MPIRoot @@ -175,9 +175,9 @@ SUBROUTINE WriteBRAverageElemToHDF5(isBRAverageElem) FileName=TRIM(TIMESTAMP(TRIM(ProjectName)//'_BRAverageElem',OutputTime))//'.h5' IF(MPIRoot) CALL GenerateFileSkeleton('BRAverageElem',N_variables,StrVarNames,TRIM(MeshFile),OutputTime) #if USE_MPI - CALL MPI_BARRIER(MPI_COMM_WORLD,iError) + CALL MPI_BARRIER(MPI_COMM_PICLAS,iError) #endif - CALL OpenDataFile(FileName,create=.FALSE.,single=.FALSE.,readOnly=.FALSE.,communicatorOpt=MPI_COMM_WORLD) + CALL OpenDataFile(FileName,create=.FALSE.,single=.FALSE.,readOnly=.FALSE.,communicatorOpt=MPI_COMM_PICLAS) CALL WriteAttributeToHDF5(File_ID,'VarNamesBRAverageElem',N_variables,StrArray=StrVarNames) CALL CloseDataFile() @@ -258,9 +258,9 @@ SUBROUTINE WritePMLzetaGlobalToHDF5() FileName=TRIM(TIMESTAMP(TRIM(ProjectName)//'_PMLZetaGlobal',OutputTime))//'.h5' IF(MPIRoot) CALL GenerateFileSkeleton('PMLZetaGlobal',N_variables,StrVarNames,TRIM(MeshFile),OutputTime) #if USE_MPI - CALL MPI_BARRIER(MPI_COMM_WORLD,iError) + CALL MPI_BARRIER(MPI_COMM_PICLAS,iError) #endif - CALL OpenDataFile(FileName,create=.FALSE.,single=.FALSE.,readOnly=.FALSE.,communicatorOpt=MPI_COMM_WORLD) + CALL OpenDataFile(FileName,create=.FALSE.,single=.FALSE.,readOnly=.FALSE.,communicatorOpt=MPI_COMM_PICLAS) CALL WriteAttributeToHDF5(File_ID,'VarNamesPMLzetaGlobal',N_variables,StrArray=StrVarNames) CALL CloseDataFile() @@ -372,9 +372,9 @@ SUBROUTINE WriteBGFieldToHDF5(OutputTime) CALL copy_userblock(TRIM(FileName)//C_NULL_CHAR,TRIM(UserblockTmpFile)//C_NULL_CHAR) END IF #if USE_MPI -CALL MPI_BARRIER(MPI_COMM_WORLD,iError) +CALL MPI_BARRIER(MPI_COMM_PICLAS,iError) #endif /*USE_MPI*/ -CALL OpenDataFile(FileName,create=.FALSE.,single=.FALSE.,readOnly=.FALSE.,communicatorOpt=MPI_COMM_WORLD) +CALL OpenDataFile(FileName,create=.FALSE.,single=.FALSE.,readOnly=.FALSE.,communicatorOpt=MPI_COMM_PICLAS) nVal=nGlobalElems ! For the MPI case this must be replaced by the global number of elements (sum over all procs) @@ -477,9 +477,9 @@ SUBROUTINE WriteBGFieldAnalyticToHDF5() CALL copy_userblock(TRIM(FileName)//C_NULL_CHAR,TRIM(UserblockTmpFile)//C_NULL_CHAR) END IF #if USE_MPI -CALL MPI_BARRIER(MPI_COMM_WORLD,iError) +CALL MPI_BARRIER(MPI_COMM_PICLAS,iError) #endif /*USE_MPI*/ -CALL OpenDataFile(FileName,create=.FALSE.,single=.FALSE.,readOnly=.FALSE.,communicatorOpt=MPI_COMM_WORLD) +CALL OpenDataFile(FileName,create=.FALSE.,single=.FALSE.,readOnly=.FALSE.,communicatorOpt=MPI_COMM_PICLAS) nVal=nGlobalElems ! For the MPI case this must be replaced by the global number of elements (sum over all procs) @@ -663,9 +663,9 @@ SUBROUTINE WriteErrorNormsToHDF5(OutputTime) CALL copy_userblock(TRIM(FileName)//C_NULL_CHAR,TRIM(UserblockTmpFile)//C_NULL_CHAR) END IF #if USE_MPI -CALL MPI_BARRIER(MPI_COMM_WORLD,iError) +CALL MPI_BARRIER(MPI_COMM_PICLAS,iError) #endif /*USE_MPI*/ -CALL OpenDataFile(FileName,create=.FALSE.,single=.FALSE.,readOnly=.FALSE.,communicatorOpt=MPI_COMM_WORLD) +CALL OpenDataFile(FileName,create=.FALSE.,single=.FALSE.,readOnly=.FALSE.,communicatorOpt=MPI_COMM_PICLAS) nVal=nGlobalElems ! For the MPI case this must be replaced by the global number of elements (sum over all procs) diff --git a/src/io_hdf5/hdf5_output_particle.f90 b/src/io_hdf5/hdf5_output_particle.f90 index 106243fbc..71621cf8e 100644 --- a/src/io_hdf5/hdf5_output_particle.f90 +++ b/src/io_hdf5/hdf5_output_particle.f90 @@ -182,10 +182,10 @@ SUBROUTINE WriteNodeSourceExtToHDF5(OutputTime) FileName=TRIM(TIMESTAMP(TRIM(ProjectName)//'_NodeSourceExtGlobal',OutputTime))//'.h5' IF(MPIRoot) CALL GenerateFileSkeleton('NodeSourceExtGlobal',N_variables,StrVarNames,TRIM(MeshFile),OutputTime) #if USE_MPI - CALL MPI_BARRIER(MPI_COMM_WORLD,iError) + CALL MPI_BARRIER(MPI_COMM_PICLAS,iError) #endif IF(MPIRoot)THEN - CALL OpenDataFile(FileName,create=.FALSE.,single=.TRUE.,readOnly=.FALSE.,communicatorOpt=MPI_COMM_WORLD) + CALL OpenDataFile(FileName,create=.FALSE.,single=.TRUE.,readOnly=.FALSE.,communicatorOpt=MPI_COMM_PICLAS) CALL WriteAttributeToHDF5(File_ID,'VarNamesNodeSourceExtGlobal',N_variables,StrArray=StrVarNames) CALL CloseDataFile() END IF ! MPIRoot @@ -277,9 +277,6 @@ SUBROUTINE WriteParticleToHDF5(FileName) USE MOD_Particle_Vars ,ONLY: PartInt,PartData,PartDataSize,locnPart,offsetnPart,PartIntSize,PartDataVarNames USE MOD_part_tools ,ONLY: UpdateNextFreePosition USE MOD_DSMC_Vars ,ONLY: UseDSMC, DSMC -#if USE_MPI -USE MOD_Particle_MPI_Vars ,ONLY: PartMPI -#endif /*USE_MPI*/ #if USE_LOADBALANCE USE MOD_LoadBalance_Vars ,ONLY: PerformLoadBalance,UseH5IOLoadBalance #endif /*USE_LOADBALANCE*/ @@ -360,7 +357,7 @@ SUBROUTINE WriteParticleToHDF5(FileName) nVal = (/PartDataSize , locnPart /) , & offset = (/0_IK , offsetnPart/) , & collective = UseCollectiveIO , offSetDim= 2 , & - communicator = PartMPI%COMM , RealArray= PartData) + communicator = MPI_COMM_PICLAS , RealArray= PartData) ! Output of the element-wise time step as a separate container in state file IF(VarTimeStep%UseDistribution) THEN CALL DistributedWriteArray(FileName , & @@ -369,7 +366,7 @@ SUBROUTINE WriteParticleToHDF5(FileName) nVal = (/PP_nElems , 1_IK/) , & offset = (/offsetElem , 0_IK/) , & collective = UseCollectiveIO , offSetDim = 1 , & - communicator = PartMPI%COMM , RealArray = VarTimeStep%ElemFac) + communicator = MPI_COMM_PICLAS , RealArray = VarTimeStep%ElemFac) END IF #else CALL OpenDataFile(FileName,create=.FALSE.,single=.TRUE.,readOnly=.FALSE.) @@ -414,7 +411,7 @@ SUBROUTINE WriteParticleToHDF5(FileName) nVal = (/MaxQuantNum , locnPart /) , & offset = (/0_IK , offsetnPart /) , & collective = UseCollectiveIO , offSetDim = 2 , & - communicator = PartMPI%COMM , IntegerArray_i4 = VibQuantData) + communicator = MPI_COMM_PICLAS , IntegerArray_i4 = VibQuantData) #else CALL OpenDataFile(FileName,create=.FALSE.,single=.TRUE.,readOnly=.FALSE.) CALL WriteArrayToHDF5(DataSetName = 'VibQuantData' , rank = 2 , & @@ -459,7 +456,7 @@ SUBROUTINE WriteParticleToHDF5(FileName) nVal = (/MaxElecQuant , locnPart /) , & offset = (/0_IK , offsetnPart /) , & collective = UseCollectiveIO , offSetDim = 2 , & - communicator = PartMPI%COMM , RealArray = ElecDistriData) + communicator = MPI_COMM_PICLAS , RealArray = ElecDistriData) #else CALL OpenDataFile(FileName,create=.FALSE.,single=.TRUE.,readOnly=.FALSE.) CALL WriteArrayToHDF5(DataSetName = 'ElecDistriData' , rank = 2 , & @@ -502,7 +499,7 @@ SUBROUTINE WriteParticleToHDF5(FileName) nVal = (/3_IK , locnPart /) , & offset = (/0_IK , offsetnPart /) , & collective = UseCollectiveIO , offSetDim = 2 , & - communicator = PartMPI%COMM , RealArray = AD_Data) + communicator = MPI_COMM_PICLAS , RealArray = AD_Data) #else CALL OpenDataFile(FileName,create=.FALSE.,single=.TRUE.,readOnly=.FALSE.) CALL WriteArrayToHDF5(DataSetName = 'ADVeloData' , rank = 2 , & @@ -552,9 +549,6 @@ SUBROUTINE WriteBoundaryParticleToHDF5(MeshFileName,OutputTime,PreviousTime) USE MOD_Particle_Boundary_Vars ,ONLY: PartStateBoundary,PartStateBoundaryVecLength,nVarPartStateBoundary USE MOD_Particle_Analyze_Tools ,ONLY: CalcEkinPart2 USE MOD_TimeDisc_Vars ,ONLY: iter -#if USE_MPI -USE MOD_Particle_MPI_Vars ,ONLY: PartMPI -#endif /*USE_MPI*/ ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -606,7 +600,7 @@ SUBROUTINE WriteBoundaryParticleToHDF5(MeshFileName,OutputTime,PreviousTime) ! Reopen file and write DG solution #if USE_MPI -CALL MPI_BARRIER(MPI_COMM_WORLD,iError) +CALL MPI_BARRIER(MPI_COMM_PICLAS,iError) #endif ! 3xPos [m], 3xvelo [m/s], species [-] @@ -720,7 +714,7 @@ SUBROUTINE WriteBoundaryParticleToHDF5(MeshFileName,OutputTime,PreviousTime) nVal = (/ PartDataSizeLoc, locnPart /) , & offset = (/ 0_IK , offsetnPart /) , & collective = UseCollectiveIO , offSetDim = 2 , & - communicator = PartMPI%COMM , RealArray = PartData) + communicator = MPI_COMM_PICLAS , RealArray = PartData) #else CALL OpenDataFile(FileName,create=.FALSE.,single=.TRUE.,readOnly=.FALSE.) CALL WriteArrayToHDF5(DataSetName = 'PartData' , rank = 2 , & @@ -763,9 +757,6 @@ SUBROUTINE WriteLostParticlesToHDF5(MeshFileName,OutputTime) USE MOD_Particle_Tracking_Vars ,ONLY: TotalNbrOfMissingParticlesSum USE MOD_Equation_Vars ,ONLY: StrVarNames USE MOD_Particle_Analyze_Tools ,ONLY: CalcEkinPart2 -#if USE_MPI -USE MOD_Particle_MPI_Vars ,ONLY: PartMPI -#endif /*USE_MPI*/ ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -803,7 +794,7 @@ SUBROUTINE WriteLostParticlesToHDF5(MeshFileName,OutputTime) ! Reopen file and write DG solution #if USE_MPI -CALL MPI_BARRIER(MPI_COMM_WORLD,iError) +CALL MPI_BARRIER(MPI_COMM_PICLAS,iError) #endif ! Set number of local particles @@ -914,7 +905,7 @@ SUBROUTINE WriteLostParticlesToHDF5(MeshFileName,OutputTime) nVal = (/ PartLostDataSize , locnPart /) , & offset = (/ 0_IK , offsetnPart /) , & collective = UseCollectiveIO , offSetDim = 2 , & - communicator = PartMPI%COMM , RealArray = PartData) + communicator = MPI_COMM_PICLAS , RealArray = PartData) #else CALL OpenDataFile(FileName,create=.FALSE.,single=.TRUE.,readOnly=.FALSE.) CALL WriteArrayToHDF5(DataSetName = 'PartData' , rank = 2 , & @@ -1011,7 +1002,7 @@ SUBROUTINE WriteAdaptiveInfoToHDF5(FileName) END DO WRITE(H5_Name,'(A)') 'AdaptiveInfo' -CALL OpenDataFile(FileName,create=.FALSE.,single=.FALSE.,readOnly=.FALSE.,communicatorOpt=MPI_COMM_WORLD) +CALL OpenDataFile(FileName,create=.FALSE.,single=.FALSE.,readOnly=.FALSE.,communicatorOpt=MPI_COMM_PICLAS) ! Associate construct for integer KIND=8 possibility ASSOCIATE (& @@ -1084,7 +1075,7 @@ SUBROUTINE WriteAdaptiveRunningAverageToHDF5(FileName) CALL CloseDataFile() END IF -CALL OpenDataFile(FileName,create=.FALSE.,single=.FALSE.,readOnly=.FALSE.,communicatorOpt=MPI_COMM_WORLD) +CALL OpenDataFile(FileName,create=.FALSE.,single=.FALSE.,readOnly=.FALSE.,communicatorOpt=MPI_COMM_PICLAS) ! Associate construct for integer KIND=8 possibility ASSOCIATE (& AdaptBCSampleElemNumGlobal => INT(AdaptBCSampleElemNumGlobal,IK) ,& @@ -1122,9 +1113,6 @@ SUBROUTINE WriteAdaptBCPartNumOutToHDF5(FileName) USE MOD_Restart_Vars ,ONLY: DoRestart USE MOD_Particle_Vars ,ONLY: nSpecies, Species USE MOD_Particle_Sampling_Vars ,ONLY: AdaptBCPartNumOut -#if USE_MPI -USE MOD_Particle_MPI_Vars ,ONLY: PartMPI -#endif /*USE_MPI*/ ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -1146,9 +1134,9 @@ SUBROUTINE WriteAdaptBCPartNumOutToHDF5(FileName) #if USE_MPI IF(MPIRoot)THEN ALLOCATE(AdaptBCPartNumOutTemp(1:nSpecies,1:nSurfacefluxBCs)) - CALL MPI_REDUCE(AdaptBCPartNumOut,AdaptBCPartNumOutTemp,nSpecies*nSurfacefluxBCs,MPI_INTEGER,MPI_SUM,0,PartMPI%COMM,IERROR) + CALL MPI_REDUCE(AdaptBCPartNumOut,AdaptBCPartNumOutTemp,nSpecies*nSurfacefluxBCs,MPI_INTEGER,MPI_SUM,0,MPI_COMM_PICLAS,IERROR) ELSE - CALL MPI_REDUCE(AdaptBCPartNumOut,MPI_IN_PLACE ,nSpecies*nSurfacefluxBCs,MPI_INTEGER,MPI_SUM,0,PartMPI%COMM,IERROR) + CALL MPI_REDUCE(AdaptBCPartNumOut,MPI_IN_PLACE ,nSpecies*nSurfacefluxBCs,MPI_INTEGER,MPI_SUM,0,MPI_COMM_PICLAS,IERROR) END IF #endif @@ -1275,7 +1263,7 @@ SUBROUTINE WriteVibProbInfoToHDF5(FileName) END IF WRITE(H5_Name,'(A)') 'VibProbInfo' - CALL OpenDataFile(FileName,create=.FALSE.,single=.FALSE.,readOnly=.FALSE.,communicatorOpt=MPI_COMM_WORLD) + CALL OpenDataFile(FileName,create=.FALSE.,single=.FALSE.,readOnly=.FALSE.,communicatorOpt=MPI_COMM_PICLAS) ! Associate construct for integer KIND=8 possibility ASSOCIATE (& @@ -1293,7 +1281,7 @@ SUBROUTINE WriteVibProbInfoToHDF5(FileName) SDEALLOCATE(StrVarNames) ELSE ! DSMC%VibRelaxProb < 2.0 #if USE_MPI - CALL OpenDataFile(FileName,create=.FALSE.,single=.FALSE.,readOnly=.FALSE.,communicatorOpt=MPI_COMM_WORLD) + CALL OpenDataFile(FileName,create=.FALSE.,single=.FALSE.,readOnly=.FALSE.,communicatorOpt=MPI_COMM_PICLAS) #else CALL OpenDataFile(FileName,create=.FALSE.,single=.TRUE.,readOnly=.FALSE.) #endif @@ -1483,7 +1471,7 @@ SUBROUTINE WriteClonesToHDF5(FileName) END IF #if USE_MPI -CALL OpenDataFile(FileName,create=.FALSE.,single=.FALSE.,readOnly=.FALSE.,communicatorOpt=MPI_COMM_WORLD) +CALL OpenDataFile(FileName,create=.FALSE.,single=.FALSE.,readOnly=.FALSE.,communicatorOpt=MPI_COMM_PICLAS) #else CALL OpenDataFile(FileName,create=.FALSE.,single=.TRUE.,readOnly=.FALSE.) #endif @@ -1612,9 +1600,9 @@ SUBROUTINE WriteElectroMagneticPICFieldToHDF5() CALL copy_userblock(TRIM(FileName)//C_NULL_CHAR,TRIM(UserblockTmpFile)//C_NULL_CHAR) END IF #if USE_MPI -CALL MPI_BARRIER(MPI_COMM_WORLD,iError) +CALL MPI_BARRIER(MPI_COMM_PICLAS,iError) #endif /*USE_MPI*/ -CALL OpenDataFile(FileName,create=.FALSE.,single=.FALSE.,readOnly=.FALSE.,communicatorOpt=MPI_COMM_WORLD) +CALL OpenDataFile(FileName,create=.FALSE.,single=.FALSE.,readOnly=.FALSE.,communicatorOpt=MPI_COMM_PICLAS) nVal=nGlobalElems ! For the MPI case this must be replaced by the global number of elements (sum over all procs) @@ -1659,7 +1647,6 @@ SUBROUTINE WriteEmissionVariablesToHDF5(FileName) USE MOD_Globals !USE MOD_PreProc USE MOD_Particle_Vars ,ONLY: Species,nSpecies -USE MOD_Particle_MPI_Vars ,ONLY: PartMPI USE MOD_Particle_Vars ,ONLY: NeutralizationBalanceGlobal ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -1675,7 +1662,7 @@ SUBROUTINE WriteEmissionVariablesToHDF5(FileName) INTEGER(KIND=IK) :: NeutralizationBalanceTmp(1:1) ! This is a dummy array of size 1 ! !=================================================================================================================================== ! Only root writes the data -IF(.NOT.PartMPI%MPIRoot) RETURN +IF(.NOT.MPIRoot) RETURN ! Loop over all species and inits DO iSpec=1,nSpecies @@ -1718,9 +1705,6 @@ SUBROUTINE GetOffsetAndGlobalNumberOfParts(CallingRoutine,offsetnPart,globnPart, ! MODULES USE MOD_PreProc USE MOD_Globals -#if USE_MPI -USE MOD_Particle_MPI_Vars ,ONLY: PartMPI -#endif /*USE_MPI*/ ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -1742,11 +1726,11 @@ SUBROUTINE GetOffsetAndGlobalNumberOfParts(CallingRoutine,offsetnPart,globnPart, #if USE_MPI locnPart8 = INT(locnPart,8) locnPart8Recv = 0_IK -CALL MPI_EXSCAN(locnPart8,locnPart8Recv,1,MPI_INTEGER8,MPI_SUM,MPI_COMM_WORLD,iError) +CALL MPI_EXSCAN(locnPart8,locnPart8Recv,1,MPI_INTEGER8,MPI_SUM,MPI_COMM_PICLAS,iError) offsetnPart = INT(locnPart8Recv,KIND=IK) ! Last proc calculates the global number and broadcasts it IF(myrank.EQ.nProcessors-1) locnPart8=locnPart8Recv+locnPart8 -CALL MPI_BCAST(locnPart8,1,MPI_INTEGER8,nProcessors-1,MPI_COMM_WORLD,iError) +CALL MPI_BCAST(locnPart8,1,MPI_INTEGER8,nProcessors-1,MPI_COMM_PICLAS,iError) !global numbers globnPart8=locnPart8 GlobalNbrOfParticlesUpdated = .TRUE. @@ -1766,12 +1750,12 @@ SUBROUTINE GetOffsetAndGlobalNumberOfParts(CallingRoutine,offsetnPart,globnPart, SimNumSpecMin = 0 SimNumSpecMax = 0 IF(GetMinMaxNbrOfParticles)THEN - IF (PartMPI%MPIRoot) THEN - CALL MPI_REDUCE(locnPart , SimNumSpecMin , 1 , MPI_INTEGER_INT_KIND , MPI_MIN , 0 , PartMPI%COMM , IERROR) - CALL MPI_REDUCE(locnPart , SimNumSpecMax , 1 , MPI_INTEGER_INT_KIND , MPI_MAX , 0 , PartMPI%COMM , IERROR) + IF (MPIRoot) THEN + CALL MPI_REDUCE(locnPart , SimNumSpecMin , 1 , MPI_INTEGER_INT_KIND , MPI_MIN , 0 , MPI_COMM_PICLAS , IERROR) + CALL MPI_REDUCE(locnPart , SimNumSpecMax , 1 , MPI_INTEGER_INT_KIND , MPI_MAX , 0 , MPI_COMM_PICLAS , IERROR) ELSE - CALL MPI_REDUCE(locnPart , 0 , 1 , MPI_INTEGER_INT_KIND , MPI_MIN , 0 , PartMPI%COMM , IERROR) - CALL MPI_REDUCE(locnPart , 0 , 1 , MPI_INTEGER_INT_KIND , MPI_MAX , 0 , PartMPI%COMM , IERROR) + CALL MPI_REDUCE(locnPart , 0 , 1 , MPI_INTEGER_INT_KIND , MPI_MIN , 0 , MPI_COMM_PICLAS , IERROR) + CALL MPI_REDUCE(locnPart , 0 , 1 , MPI_INTEGER_INT_KIND , MPI_MAX , 0 , MPI_COMM_PICLAS , IERROR) END IF END IF ! GetMinMaxNbrOfParticles diff --git a/src/io_hdf5/hdf5_output_state.f90 b/src/io_hdf5/hdf5_output_state.f90 index 544b15a6a..af92f7d8c 100644 --- a/src/io_hdf5/hdf5_output_state.f90 +++ b/src/io_hdf5/hdf5_output_state.f90 @@ -238,7 +238,7 @@ SUBROUTINE WriteStateToHDF5(MeshFileName,OutputTime,PreviousTime) ! Reopen file and write DG solution #if USE_MPI -CALL MPI_BARRIER(MPI_COMM_WORLD,iError) +CALL MPI_BARRIER(MPI_COMM_PICLAS,iError) #endif ! Associate construct for integer KIND=8 possibility @@ -492,7 +492,7 @@ SUBROUTINE WriteStateToHDF5(MeshFileName,OutputTime,PreviousTime) #ifdef PARTICLES ! output of last source term #if USE_MPI - CALL MPI_BARRIER(MPI_COMM_WORLD,iError) + CALL MPI_BARRIER(MPI_COMM_PICLAS,iError) #endif /*USE_MPI*/ IF(OutputSource) THEN #if USE_HDG @@ -564,7 +564,7 @@ SUBROUTINE WriteStateToHDF5(MeshFileName,OutputTime,PreviousTime) IF(RadialWeighting%PerformCloning) CALL WriteClonesToHDF5(FileName) IF (PartBound%OutputWallTemp) CALL WriteAdaptiveWallTempToHDF5(FileName) #if USE_MPI -CALL MPI_BARRIER(MPI_COMM_WORLD,iError) +CALL MPI_BARRIER(MPI_COMM_PICLAS,iError) #endif /*USE_MPI*/ ! For restart purposes, store the electron bulk temperature in .h5 state ! Only root writes the container diff --git a/src/linearsolver/linearoperator/linearoperator.f90 b/src/linearsolver/linearoperator/linearoperator.f90 index 65c1eee4a..1ee47f069 100644 --- a/src/linearsolver/linearoperator/linearoperator.f90 +++ b/src/linearsolver/linearoperator/linearoperator.f90 @@ -311,7 +311,7 @@ SUBROUTINE VectorDotProduct(a,b,resu) #if USE_MPI ResuSend=Resu - CALL MPI_ALLREDUCE(ResuSend,resu,1,MPI_DOUBLE_PRECISION,MPI_SUM,MPI_COMM_WORLD,iError) + CALL MPI_ALLREDUCE(ResuSend,resu,1,MPI_DOUBLE_PRECISION,MPI_SUM,MPI_COMM_PICLAS,iError) #endif END SUBROUTINE VectorDotProduct diff --git a/src/linearsolver/linearsolver.f90 b/src/linearsolver/linearsolver.f90 index bd8c36bf3..66cf8b44a 100644 --- a/src/linearsolver/linearsolver.f90 +++ b/src/linearsolver/linearsolver.f90 @@ -170,7 +170,7 @@ SUBROUTINE InitLinearSolver() #if !(USE_HDG) nDofGlobalMPI=nDofGlobal #if USE_MPI - CALL MPI_ALLREDUCE(MPI_IN_PLACE,nDofGlobalMPI,1,MPI_INTEGER,MPI_SUM,MPI_COMM_WORLD,iError) + CALL MPI_ALLREDUCE(MPI_IN_PLACE,nDofGlobalMPI,1,MPI_INTEGER,MPI_SUM,MPI_COMM_PICLAS,iError) #endif eps_LinearSolver = GETREAL('eps_LinearSolver','1e-3') diff --git a/src/linearsolver/newton.f90 b/src/linearsolver/newton.f90 index 9c8832d96..db31953c4 100644 --- a/src/linearsolver/newton.f90 +++ b/src/linearsolver/newton.f90 @@ -172,7 +172,7 @@ SUBROUTINE ImplicitNorm(t,coeff,R,Norm_R,Delta_Norm_R,Delta_Norm_Rel,First) NormArray(1)=Norm_R NormArray(2)=Delta_Norm_R NormArray(3)=Delta_Norm_Rel -CALL MPI_ALLREDUCE(NormArray,GlobalNormArray,3,MPI_DOUBLE_PRECISION,MPI_SUM,MPI_COMM_WORLD,iError) +CALL MPI_ALLREDUCE(NormArray,GlobalNormArray,3,MPI_DOUBLE_PRECISION,MPI_SUM,MPI_COMM_PICLAS,iError) Norm_R = SQRT(GlobalNormArray(1)) Delta_Norm_R = SQRT(GlobalNormArray(2)) Delta_Norm_Rel = SQRT(GlobalNormArray(3)) diff --git a/src/linearsolver/particlesolver.f90 b/src/linearsolver/particlesolver.f90 index 02ef9d0a6..8b6a8de2e 100644 --- a/src/linearsolver/particlesolver.f90 +++ b/src/linearsolver/particlesolver.f90 @@ -159,9 +159,6 @@ SUBROUTINE SelectImplicitParticles() USE MOD_TimeDisc_Vars ,ONLY: dt,nRKStages,iter USE MOD_Globals_Vars ,ONLY: c2_inv USE MOD_LinearSolver_Vars ,ONLY: DoPrintConvInfo -#if USE_MPI -USE MOD_Particle_MPI_Vars ,ONLY: PartMPI -#endif /*USE_MPI*/ !----------------------------------------------------------------------------------------------------------------------------------! ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -232,12 +229,12 @@ SUBROUTINE SelectImplicitParticles() IF(.NOT.PartIsImplicit(iPart)) nExp=nExp+1 END DO #if USE_MPI - IF(PartMPI%MPIRoot)THEN - CALL MPI_REDUCE(MPI_IN_PLACE,nExp,1,MPI_INTEGER,MPI_SUM,0,PartMPI%COMM, IERROR) - CALL MPI_REDUCE(MPI_IN_PLACE,nImp,1,MPI_INTEGER,MPI_SUM,0,PartMPI%COMM, IERROR) + IF(MPIRoot)THEN + CALL MPI_REDUCE(MPI_IN_PLACE,nExp,1,MPI_INTEGER,MPI_SUM,0,MPI_COMM_PICLAS, IERROR) + CALL MPI_REDUCE(MPI_IN_PLACE,nImp,1,MPI_INTEGER,MPI_SUM,0,MPI_COMM_PICLAS, IERROR) ELSE - CALL MPI_REDUCE(nExp ,iPart,1,MPI_INTEGER,MPI_SUM,0,PartMPI%COMM, IERROR) - CALL MPI_REDUCE(nImp ,iPart,1,MPI_INTEGER,MPI_SUM,0,PartMPI%COMM, IERROR) + CALL MPI_REDUCE(nExp ,iPart,1,MPI_INTEGER,MPI_SUM,0,MPI_COMM_PICLAS, IERROR) + CALL MPI_REDUCE(nImp ,iPart,1,MPI_INTEGER,MPI_SUM,0,MPI_COMM_PICLAS, IERROR) END IF #endif /*USE_MPI*/ SWRITE(UNIT_StdOut,'(A,I0,x,I0)') ' Particles explicit/implicit ', nExp, nImp @@ -264,7 +261,6 @@ SUBROUTINE ParticleNewton(t,coeff,Mode,doParticle_In,opt_In,AbortTol_In) USE MOD_Part_RHS ,ONLY: CalcPartRHS #if USE_MPI USE MOD_Particle_MPI ,ONLY: IRecvNbOfParticles, MPIParticleSend,MPIParticleRecv,SendNbOfparticles -USE MOD_Particle_MPI_Vars ,ONLY: PartMPI #if USE_LOADBALANCE USE MOD_LoadBalance_Timers ,ONLY: LBStartTime,LBPauseTime,LBSplitTime #endif /*USE_LOADBALANCE*/ @@ -422,7 +418,7 @@ SUBROUTINE ParticleNewton(t,coeff,Mode,doParticle_In,opt_In,AbortTol_In) IF(ANY(DoPartInNewton)) DoNewton=.TRUE. #if USE_MPI !set T if at least 1 proc has to do newton -CALL MPI_ALLREDUCE(MPI_IN_PLACE,DoNewton,1,MPI_LOGICAL,MPI_LOR,PartMPI%COMM,iError) +CALL MPI_ALLREDUCE(MPI_IN_PLACE,DoNewton,1,MPI_LOGICAL,MPI_LOR,MPI_COMM_PICLAS,iError) #endif /*USE_MPI*/ IF(DoPrintConvInfo)THEN @@ -435,7 +431,7 @@ SUBROUTINE ParticleNewton(t,coeff,Mode,doParticle_In,opt_In,AbortTol_In) END DO ! iPart #if USE_MPI !set T if at least 1 proc has to do newton - CALL MPI_ALLREDUCE(MPI_IN_PLACE,Counter,1,MPI_INTEGER,MPI_SUM,PartMPI%COMM,iError) + CALL MPI_ALLREDUCE(MPI_IN_PLACE,Counter,1,MPI_INTEGER,MPI_SUM,MPI_COMM_PICLAS,iError) #endif /*USE_MPI*/ SWRITE(UNIT_StdOut,'(A,I0)') ' Initial particle number in newton: ',Counter END IF @@ -487,7 +483,7 @@ SUBROUTINE ParticleNewton(t,coeff,Mode,doParticle_In,opt_In,AbortTol_In) IF(ANY(DoPartInNewton)) DoNewton=.TRUE. #if USE_MPI !set T if at least 1 proc has to do newton - CALL MPI_ALLREDUCE(MPI_IN_PLACE,DoNewton,1,MPI_LOGICAL,MPI_LOR,PartMPI%COMM,iError) + CALL MPI_ALLREDUCE(MPI_IN_PLACE,DoNewton,1,MPI_LOGICAL,MPI_LOR,MPI_COMM_PICLAS,iError) #endif /*USE_MPI*/ IF(DoPrintConvInfo)THEN Counter=0 @@ -498,7 +494,7 @@ SUBROUTINE ParticleNewton(t,coeff,Mode,doParticle_In,opt_In,AbortTol_In) END DO ! iPart #if USE_MPI !set T if at least 1 proc has to do newton - CALL MPI_ALLREDUCE(MPI_IN_PLACE,Counter,1,MPI_INTEGER,MPI_SUM,PartMPI%COMM,iError) + CALL MPI_ALLREDUCE(MPI_IN_PLACE,Counter,1,MPI_INTEGER,MPI_SUM,MPI_COMM_PICLAS,iError) #endif /*USE_MPI*/ END IF END DO @@ -706,7 +702,6 @@ SUBROUTINE Particle_Armijo(t,coeff,AbortTol,nInnerPartNewton) USE MOD_LinearSolver_Vars ,ONLY: DoFullNewton!,PartNewtonRelaxation #if USE_MPI USE MOD_Particle_MPI ,ONLY: IRecvNbOfParticles, MPIParticleSend,MPIParticleRecv,SendNbOfparticles -USE MOD_Particle_MPI_Vars ,ONLY: PartMPI #if USE_LOADBALANCE USE MOD_LoadBalance_Timers ,ONLY: LBStartTime,LBPauseTime,LBSplitTime #endif /*USE_LOADBALANCE*/ @@ -950,7 +945,7 @@ SUBROUTINE Particle_Armijo(t,coeff,AbortTol,nInnerPartNewton) CALL LBStartTime(tLBStart) #endif /*USE_LOADBALANCE*/ !set T if at least 1 proc has to do newton -CALL MPI_ALLREDUCE(MPI_IN_PLACE,DoSetLambda,1,MPI_LOGICAL,MPI_LOR,PartMPI%COMM,iError) +CALL MPI_ALLREDUCE(MPI_IN_PLACE,DoSetLambda,1,MPI_LOGICAL,MPI_LOR,MPI_COMM_PICLAS,iError) #if USE_LOADBALANCE CALL LBSplitTime(LB_PARTCOMM,tLBStart) #endif /*USE_LOADBALANCE*/ @@ -1129,7 +1124,7 @@ SUBROUTINE Particle_Armijo(t,coeff,AbortTol,nInnerPartNewton) IF(ANY(.NOT.PartLambdaAccept)) DoSetLambda=.TRUE. #if USE_MPI !set T if at least 1 proc has to do newton - CALL MPI_ALLREDUCE(MPI_IN_PLACE,DoSetLambda,1,MPI_LOGICAL,MPI_LOR,PartMPI%COMM,iError) + CALL MPI_ALLREDUCE(MPI_IN_PLACE,DoSetLambda,1,MPI_LOGICAL,MPI_LOR,MPI_COMM_PICLAS,iError) #endif /*USE_MPI*/ iCounter=0 DO iPart=1,PDM%ParticleVecLength @@ -1141,7 +1136,7 @@ SUBROUTINE Particle_Armijo(t,coeff,AbortTol,nInnerPartNewton) IF(DoPrintConvInfo)THEN #if USE_MPI !set T if at least 1 proc has to do newton - CALL MPI_ALLREDUCE(MPI_IN_PLACE,iCounter,1,MPI_INTEGER,MPI_SUM,PartMPI%COMM,iError) + CALL MPI_ALLREDUCE(MPI_IN_PLACE,iCounter,1,MPI_INTEGER,MPI_SUM,MPI_COMM_PICLAS,iError) #endif /*USE_MPI*/ SWRITE(UNIT_stdOut,'(A20,2x,L,2x,I10)') ' Accept?: ', DoSetLambda,iCounter END IF diff --git a/src/loadbalance/loadbalance.f90 b/src/loadbalance/loadbalance.f90 index 25d3ca63a..9b7c30f3f 100644 --- a/src/loadbalance/loadbalance.f90 +++ b/src/loadbalance/loadbalance.f90 @@ -517,15 +517,15 @@ SUBROUTINE ComputeImbalance() #else ! Collect ElemTime for particles and field separately (only on root process) ! Skip the reduce for DSMC timedisc - CALL MPI_REDUCE(ElemTimeField , ElemTimeFieldTot , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_WORLD , IERROR) + CALL MPI_REDUCE(ElemTimeField , ElemTimeFieldTot , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_PICLAS , IERROR) WeightSum = ElemTimeFieldTot ! only correct on MPI root #endif /*(PP_TimeDiscMethod==4) || (PP_TimeDiscMethod==42) || (PP_TimeDiscMethod==300) || (PP_TimeDiscMethod==400)*/ #ifdef PARTICLES - CALL MPI_REDUCE(ElemTimePart , ElemTimePartTot , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_WORLD , IERROR) + CALL MPI_REDUCE(ElemTimePart , ElemTimePartTot , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_PICLAS , IERROR) WeightSum = WeightSum + ElemTimePartTot ! only correct on MPI root #endif /*PARTICLES*/ ! send WeightSum from MPI root to all other procs - CALL MPI_BCAST(WeightSum,1,MPI_DOUBLE_PRECISION,0,MPI_COMM_WORLD,iError) + CALL MPI_BCAST(WeightSum,1,MPI_DOUBLE_PRECISION,0,MPI_COMM_PICLAS,iError) ! Sanity check IF(.NOT.ISFINITE(WeightSum)) CALL abort(__STAMP__,'Loadbalance: WeightSum is infinite!') @@ -536,9 +536,9 @@ SUBROUTINE ComputeImbalance() IPWRITE(*,*) 'Info: The measured time of all elems is zero. ALMOSTZERO(WeightSum)=.TRUE., SUM(ElemTime)=',WeightSum_loc END IF - !CALL MPI_ALLREDUCE(WeightSum_loc,TargetWeight,1,MPI_DOUBLE_PRECISION,MPI_SUM,MPI_COMM_WORLD,iError) - CALL MPI_ALLREDUCE(WeightSum_loc,MaxWeight ,1,MPI_DOUBLE_PRECISION,MPI_MAX,MPI_COMM_WORLD,iError) - CALL MPI_ALLREDUCE(WeightSum_loc,MinWeight ,1,MPI_DOUBLE_PRECISION,MPI_MIN,MPI_COMM_WORLD,iError) + !CALL MPI_ALLREDUCE(WeightSum_loc,TargetWeight,1,MPI_DOUBLE_PRECISION,MPI_SUM,MPI_COMM_PICLAS,iError) + CALL MPI_ALLREDUCE(WeightSum_loc,MaxWeight ,1,MPI_DOUBLE_PRECISION,MPI_MAX,MPI_COMM_PICLAS,iError) + CALL MPI_ALLREDUCE(WeightSum_loc,MinWeight ,1,MPI_DOUBLE_PRECISION,MPI_MIN,MPI_COMM_PICLAS,iError) !WeightSum = TargetWeight ! Set total weight for writing to file !IF(MPIRoot)THEN diff --git a/src/mesh/mesh.f90 b/src/mesh/mesh.f90 index 8e6761d02..a6ea69782 100644 --- a/src/mesh/mesh.f90 +++ b/src/mesh/mesh.f90 @@ -930,7 +930,7 @@ SUBROUTINE setSideRanges() USE MOD_Mesh_Vars ,ONLY: nGlobalUniqueSidesFromMesh,nGlobalUniqueSides,nMortarMPISides,nUniqueSides #if USE_MPI USE MOD_Globals ,ONLY: myrank -USE MOD_Globals ,ONLY: iError,MPI_COMM_WORLD +USE MOD_Globals ,ONLY: iError USE mpi #endif /*USE_MPI*/ #endif /*USE_HDG*/ diff --git a/src/mesh/mesh_readin.f90 b/src/mesh/mesh_readin.f90 index 52a7e9f74..4ff69cd50 100644 --- a/src/mesh/mesh_readin.f90 +++ b/src/mesh/mesh_readin.f90 @@ -283,7 +283,7 @@ SUBROUTINE ReadMesh(FileString,ReadNodes) GETTIME(StartT) ! Get ElemInfo from Mesh file - CALL OpenDataFile(FileString,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_WORLD) + CALL OpenDataFile(FileString,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_PICLAS) CALL GetDataSize(File_ID,'ElemInfo',nDims,HSize) CALL ReadAttribute(File_ID,'nUniqueSides',1,IntScalar=nGlobalUniqueSidesFromMesh) CALL ReadAttribute(File_ID,'nSides',1,IntScalar=nNonUniqueGlobalSides) @@ -1007,7 +1007,7 @@ SUBROUTINE ReadMeshNodes() offsetNodeID => INT(offsetNodeID,IK) ) ALLOCATE(NodeCoords_indx(3,nNodeIDs)) ! read all nodes - CALL OpenDataFile(MeshFile,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_WORLD) + CALL OpenDataFile(MeshFile,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_PICLAS) CALL ReadArray('NodeCoords',2,(/3_IK,nNodeIDs/),offsetNodeID,2,RealArray=NodeCoords_indx) CALL CloseDataFile() END ASSOCIATE @@ -1020,7 +1020,7 @@ SUBROUTINE ReadMeshNodes() nNodeIDs => INT(nNodeIDs,IK) ,& offsetNodeID => INT(offsetNodeID,IK) ) ALLOCATE(NodeInfo(FirstNodeInd:LastNodeInd)) - CALL OpenDataFile(MeshFile,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_WORLD) + CALL OpenDataFile(MeshFile,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_PICLAS) CALL ReadArray('GlobalNodeIDs',1,(/nNodeIDs/),offsetNodeID,1,IntegerArray_i4=NodeInfo) CALL CloseDataFile() END ASSOCIATE diff --git a/src/mesh/mesh_tools.f90 b/src/mesh/mesh_tools.f90 index aee6bafca..5cfda3979 100644 --- a/src/mesh/mesh_tools.f90 +++ b/src/mesh/mesh_tools.f90 @@ -408,7 +408,7 @@ END FUNCTION GetGlobalSide2CNTotalSide SUBROUTINE GetMasteriLocSides() ! MODULES USE MOD_PreProc -USE MOD_globals ,ONLY: abort,MPI_COMM_WORLD +USE MOD_globals ,ONLY: abort USE MOD_Mesh_Vars ,ONLY: MortarType,SideToElem,MortarInfo USE MOD_Mesh_Vars ,ONLY: firstMortarInnerSide,lastMortarInnerSide USE MOD_HDG_Vars ,ONLY: nGP_face, iLocSides diff --git a/src/mpi/mpi.f90 b/src/mpi/mpi.f90 index 5e4c10f40..1266098d3 100644 --- a/src/mpi/mpi.f90 +++ b/src/mpi/mpi.f90 @@ -194,16 +194,19 @@ SUBROUTINE InitMPIvars() RecRequest_Geo = MPI_REQUEST_NULL DataSizeSide =(PP_N+1)*(PP_N+1) +! General communicator +CALL MPI_COMM_DUP (MPI_COMM_WORLD,MPI_COMM_PICLAS,iError) + ! split communicator into smaller groups (e.g. for local nodes) GroupSize=GETINT('GroupSize','0') IF(GroupSize.LT.1)THEN ! group procs by node ! Split the node communicator (shared memory) from the global communicator on physical processor or node level #if (CORE_SPLIT==1) - CALL MPI_COMM_SPLIT(MPI_COMM_WORLD,myRank,0,MPI_COMM_NODE,iError) + CALL MPI_COMM_SPLIT(MPI_COMM_PICLAS,myRank,0,MPI_COMM_NODE,iError) #elif (CORE_SPLIT==0) ! Note that using SharedMemoryMethod=OMPI_COMM_TYPE_CORE somehow does not work in every case (intel/amd processors) ! Also note that OMPI_COMM_TYPE_CORE is undefined when not using OpenMPI - CALL MPI_COMM_SPLIT_TYPE(MPI_COMM_WORLD,SharedMemoryMethod,0,MPI_INFO_NULL,MPI_COMM_NODE,IERROR) + CALL MPI_COMM_SPLIT_TYPE(MPI_COMM_PICLAS,SharedMemoryMethod,0,MPI_INFO_NULL,MPI_COMM_NODE,IERROR) #else ! Check if more nodes than procs are required or ! if the resulting split would create unequal procs per node @@ -216,11 +219,11 @@ SUBROUTINE InitMPIvars() ! Group procs so that every CORE_SPLIT procs are in the same group color = INT(REAL(myrank*CORE_SPLIT)/REAL(nProcessors_Global))+1 END IF ! (CORE_SPLIT.GE.nProcessors_Global).OR.(MOD().GT.0) - CALL MPI_COMM_SPLIT(MPI_COMM_WORLD,color,0,MPI_COMM_NODE,iError) + CALL MPI_COMM_SPLIT(MPI_COMM_PICLAS,color,0,MPI_COMM_NODE,iError) #endif ELSE ! use groupsize color=myRank/GroupSize - CALL MPI_COMM_SPLIT(MPI_COMM_WORLD,color,0,MPI_COMM_NODE,iError) + CALL MPI_COMM_SPLIT(MPI_COMM_PICLAS,color,0,MPI_COMM_NODE,iError) END IF CALL MPI_COMM_RANK(MPI_COMM_NODE,myLocalRank,iError) CALL MPI_COMM_SIZE(MPI_COMM_NODE,nLocalProcs,iError) @@ -240,12 +243,12 @@ SUBROUTINE InitMPIvars() myLeaderRank=-1 myWorkerRank=-1 IF(myLocalRank.EQ.0)THEN - CALL MPI_COMM_SPLIT(MPI_COMM_WORLD,0,0,MPI_COMM_LEADERS,iError) + CALL MPI_COMM_SPLIT(MPI_COMM_PICLAS,0,0,MPI_COMM_LEADERS,iError) CALL MPI_COMM_RANK( MPI_COMM_LEADERS,myLeaderRank,iError) CALL MPI_COMM_SIZE( MPI_COMM_LEADERS,nLeaderProcs,iError) nWorkerProcs=nProcessors-nLeaderProcs ELSE - CALL MPI_COMM_SPLIT(MPI_COMM_WORLD,1,0,MPI_COMM_WORKERS,iError) + CALL MPI_COMM_SPLIT(MPI_COMM_PICLAS,1,0,MPI_COMM_WORKERS,iError) CALL MPI_COMM_RANK( MPI_COMM_WORKERS,myWorkerRank,iError) CALL MPI_COMM_SIZE( MPI_COMM_WORKERS,nWorkerProcs,iError) nLeaderProcs=nProcessors-nWorkerProcs @@ -284,7 +287,7 @@ SUBROUTINE StartReceiveMPIData(firstDim,FaceData,LowerBound,UpperBound,MPIReques SideID_start=OffsetMPISides_rec(iNbProc-1,SendID)+1 SideID_end =OffsetMPISides_rec(iNbProc,SendID) CALL MPI_IRECV(FaceData(:,:,:,SideID_start:SideID_end),nRecVal,MPI_DOUBLE_PRECISION, & - nbProc(iNbProc),0,MPI_COMM_WORLD,MPIRequest(iNbProc),iError) + nbProc(iNbProc),0,MPI_COMM_PICLAS,MPIRequest(iNbProc),iError) ELSE MPIRequest(iNbProc)=MPI_REQUEST_NULL END IF @@ -319,7 +322,7 @@ SUBROUTINE StartSendMPIData(firstDim,FaceData,LowerBound,UpperBound,MPIRequest,S SideID_start=OffsetMPISides_send(iNbProc-1,SendID)+1 SideID_end =OffsetMPISides_send(iNbProc,SendID) CALL MPI_ISEND(FaceData(:,:,:,SideID_start:SideID_end),nSendVal,MPI_DOUBLE_PRECISION, & - nbProc(iNbProc),0,MPI_COMM_WORLD,MPIRequest(iNbProc),iError) + nbProc(iNbProc),0,MPI_COMM_PICLAS,MPIRequest(iNbProc),iError) ELSE MPIRequest(iNbProc)=MPI_REQUEST_NULL END IF @@ -413,14 +416,14 @@ SUBROUTINE StartReceiveMPIDataInt(firstDim,FaceData,LowerBound,UpperBound,MPIReq SideID_start=OffsetMPISides_rec(iNbProc-1,SendID)+1 SideID_end =OffsetMPISides_rec(iNbProc,SendID) CALL MPI_IRECV(FaceData(:,SideID_start:SideID_end),nRecVal,MPI_INTEGER, & - nbProc(iNbProc),0,MPI_COMM_WORLD,MPIRequest(iNbProc),iError) + nbProc(iNbProc),0,MPI_COMM_PICLAS,MPIRequest(iNbProc),iError) ELSE MPIRequest(iNbProc)=MPI_REQUEST_NULL END IF END DO !iProc=1,nNBProcs END SUBROUTINE StartReceiveMPIDataInt - - + + !=================================================================================================================================== !> See above, but for for send direction !=================================================================================================================================== @@ -448,7 +451,7 @@ SUBROUTINE StartSendMPIDataInt(firstDim,FaceData,LowerBound,UpperBound,MPIReques SideID_start=OffsetMPISides_send(iNbProc-1,SendID)+1 SideID_end =OffsetMPISides_send(iNbProc,SendID) CALL MPI_ISEND(FaceData(:,SideID_start:SideID_end),nSendVal,MPI_INTEGER, & - nbProc(iNbProc),0,MPI_COMM_WORLD,MPIRequest(iNbProc),iError) + nbProc(iNbProc),0,MPI_COMM_PICLAS,MPIRequest(iNbProc),iError) ELSE MPIRequest(iNbProc)=MPI_REQUEST_NULL END IF @@ -506,6 +509,7 @@ SUBROUTINE FinalizeMPI() ! Free the communicators IF(MPI_COMM_NODE .NE.MPI_COMM_NULL) CALL MPI_COMM_FREE(MPI_COMM_NODE ,IERROR) IF(MPI_COMM_LEADERS.NE.MPI_COMM_NULL) CALL MPI_COMM_FREE(MPI_COMM_LEADERS,IERROR) +IF(MPI_COMM_PICLAS .NE.MPI_COMM_NULL) CALL MPI_COMM_FREE(MPI_COMM_PICLAS ,IERROR) #if USE_LOADBALANCE IF (.NOT.(PerformLoadBalance.AND.(.NOT.UseH5IOLoadBalance))) THEN @@ -614,19 +618,19 @@ SUBROUTINE OutputMPIW8Time() IF(MPIroot)THEN ALLOCATE(MPIW8TimeProc(MPIW8SIZE*nProcessors)) ALLOCATE(MPIW8CountProc(MPIW8SIZE*nProcessors)) - CALL MPI_REDUCE(MPIW8TimeSim , MPIW8TimeSimeGlobal , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_WORLD , iError) - CALL MPI_REDUCE(MPIW8Time , MPIW8TimeGlobal , MPIW8SIZE , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_WORLD , iError) - CALL MPI_REDUCE(MPIW8Count , MPIW8CountGlobal , MPIW8SIZE , MPI_INTEGER8 , MPI_SUM , 0 , MPI_COMM_WORLD , iError) + CALL MPI_REDUCE(MPIW8TimeSim , MPIW8TimeSimeGlobal , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_PICLAS , iError) + CALL MPI_REDUCE(MPIW8Time , MPIW8TimeGlobal , MPIW8SIZE , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_PICLAS , iError) + CALL MPI_REDUCE(MPIW8Count , MPIW8CountGlobal , MPIW8SIZE , MPI_INTEGER8 , MPI_SUM , 0 , MPI_COMM_PICLAS , iError) - CALL MPI_GATHER(MPIW8Time , MPIW8SIZE , MPI_DOUBLE_PRECISION , MPIW8TimeProc , MPIW8SIZE , MPI_DOUBLE_PRECISION , 0 , MPI_COMM_WORLD , iError) - CALL MPI_GATHER(MPIW8Count , MPIW8SIZE , MPI_INTEGER8 , MPIW8CountProc , MPIW8SIZE , MPI_INTEGER8 , 0 , MPI_COMM_WORLD , iError) + CALL MPI_GATHER(MPIW8Time , MPIW8SIZE , MPI_DOUBLE_PRECISION , MPIW8TimeProc , MPIW8SIZE , MPI_DOUBLE_PRECISION , 0 , MPI_COMM_PICLAS , iError) + CALL MPI_GATHER(MPIW8Count , MPIW8SIZE , MPI_INTEGER8 , MPIW8CountProc , MPIW8SIZE , MPI_INTEGER8 , 0 , MPI_COMM_PICLAS , iError) ELSE - CALL MPI_REDUCE(MPIW8TimeSim , 0 , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_WORLD , IError) - CALL MPI_REDUCE(MPIW8Time , 0 , MPIW8SIZE , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_WORLD , IError) - CALL MPI_REDUCE(MPIW8Count , 0 , MPIW8SIZE , MPI_INTEGER8 , MPI_SUM , 0 , MPI_COMM_WORLD , IError) + CALL MPI_REDUCE(MPIW8TimeSim , 0 , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_PICLAS , IError) + CALL MPI_REDUCE(MPIW8Time , 0 , MPIW8SIZE , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_PICLAS , IError) + CALL MPI_REDUCE(MPIW8Count , 0 , MPIW8SIZE , MPI_INTEGER8 , MPI_SUM , 0 , MPI_COMM_PICLAS , IError) - CALL MPI_GATHER(MPIW8Time , MPIW8SIZE , MPI_DOUBLE_PRECISION , 0 , 0 , 0 , 0 , MPI_COMM_WORLD , iError) - CALL MPI_GATHER(MPIW8Count , MPIW8SIZE , MPI_INTEGER8 , 0 , 0 , 0 , 0 , MPI_COMM_WORLD , iError) + CALL MPI_GATHER(MPIW8Time , MPIW8SIZE , MPI_DOUBLE_PRECISION , 0 , 0 , 0 , 0 , MPI_COMM_PICLAS , iError) + CALL MPI_GATHER(MPIW8Count , MPIW8SIZE , MPI_INTEGER8 , 0 , 0 , 0 , 0 , MPI_COMM_PICLAS , iError) END IF ! -------------------------------------------------- diff --git a/src/mpi/mpi_shared.f90 b/src/mpi/mpi_shared.f90 index 57af7f263..34b142f32 100644 --- a/src/mpi/mpi_shared.f90 +++ b/src/mpi/mpi_shared.f90 @@ -143,11 +143,11 @@ SUBROUTINE InitMPIShared() ! Split the node communicator (shared memory) from the global communicator on physical processor or node level #if (CORE_SPLIT==1) - CALL MPI_COMM_SPLIT(MPI_COMM_WORLD,myRank,0,MPI_COMM_SHARED,iError) + CALL MPI_COMM_SPLIT(MPI_COMM_PICLAS,myRank,0,MPI_COMM_SHARED,iError) #elif (CORE_SPLIT==0) ! Note that using SharedMemoryMethod=OMPI_COMM_TYPE_CORE somehow does not work in every case (intel/amd processors) ! Also note that OMPI_COMM_TYPE_CORE is undefined when not using OpenMPI - CALL MPI_COMM_SPLIT_TYPE(MPI_COMM_WORLD,SharedMemoryMethod,0,MPI_INFO_NULL,MPI_COMM_SHARED,IERROR) + CALL MPI_COMM_SPLIT_TYPE(MPI_COMM_PICLAS,SharedMemoryMethod,0,MPI_INFO_NULL,MPI_COMM_SHARED,IERROR) #else ! Check if more nodes than procs are required or ! if the resulting split would create unequal procs per node @@ -160,7 +160,7 @@ SUBROUTINE InitMPIShared() ! Group procs so that every CORE_SPLIT procs are in the same group color = INT(REAL(myRank)/REAL(CORE_SPLIT)) END IF ! (CORE_SPLIT.GE.nProcessors_Global).OR.(MOD().GT.0) - CALL MPI_COMM_SPLIT(MPI_COMM_WORLD,color,0,MPI_COMM_SHARED,iError) + CALL MPI_COMM_SPLIT(MPI_COMM_PICLAS,color,0,MPI_COMM_SHARED,iError) #endif ! Find my rank on the shared communicator, comm size and proc name @@ -187,7 +187,7 @@ SUBROUTINE InitMPIShared() MPI_COMM_LEADERS_SHARED=MPI_COMM_NULL myLeaderGroupRank=-1 color = MERGE(101,MPI_UNDEFINED,myComputeNodeRank.EQ.0) -CALL MPI_COMM_SPLIT(MPI_COMM_WORLD,color,0,MPI_COMM_LEADERS_SHARED,IERROR) +CALL MPI_COMM_SPLIT(MPI_COMM_PICLAS,color,0,MPI_COMM_LEADERS_SHARED,IERROR) IF(myComputeNodeRank.EQ.0)THEN CALL MPI_COMM_RANK(MPI_COMM_LEADERS_SHARED,myLeaderGroupRank,IERROR) CALL MPI_COMM_SIZE(MPI_COMM_LEADERS_SHARED,nLeaderGroupProcs,IERROR) diff --git a/src/output/output_vtk.f90 b/src/output/output_vtk.f90 index bacb6a3d9..1a7264bb5 100644 --- a/src/output/output_vtk.f90 +++ b/src/output/output_vtk.f90 @@ -207,7 +207,7 @@ SUBROUTINE WriteDataToVTK(nVal,NVisu,nElems,VarNames,Coord,Value,FileString,dim, ! get total number of elements on all processors #if USE_MPI -CALL MPI_GATHER(nElems,1,MPI_INTEGER,nElems_glob,1,MPI_INTEGER,0,MPI_COMM_WORLD,iError) +CALL MPI_GATHER(nElems,1,MPI_INTEGER,nElems_glob,1,MPI_INTEGER,0,MPI_COMM_PICLAS,iError) #else nElems_glob(0) = nElems #endif @@ -309,16 +309,16 @@ SUBROUTINE WriteDataToVTK(nVal,NVisu,nElems,VarNames,Coord,Value,FileString,dim, DO iProc=1,nProcessors-1 nElems_proc=nElems_glob(iProc) IF (nElems_proc.GT.0) THEN - CALL MPI_RECV(buf(:,:,:,1:nElems_proc),nElems_proc*NVisu_elem,MPI_DOUBLE_PRECISION,iProc,0,MPI_COMM_WORLD,MPIstatus,iError) + CALL MPI_RECV(buf(:,:,:,1:nElems_proc),nElems_proc*NVisu_elem,MPI_DOUBLE_PRECISION,iProc,0,MPI_COMM_PICLAS,MPIstatus,iError) WRITE(ivtk) REAL(buf(:,:,:,1:nElems_proc),4) END IF END DO !iProc ELSE IF (nElems.GT.0) THEN IF (nValAtLastDimension_loc) THEN - CALL MPI_SEND(Value(:,:,:,:,iVal),nElems*NVisu_elem,MPI_DOUBLE_PRECISION, 0,0,MPI_COMM_WORLD,iError) + CALL MPI_SEND(Value(:,:,:,:,iVal),nElems*NVisu_elem,MPI_DOUBLE_PRECISION, 0,0,MPI_COMM_PICLAS,iError) ELSE - CALL MPI_SEND(Value(iVal,:,:,:,:),nElems*NVisu_elem,MPI_DOUBLE_PRECISION, 0,0,MPI_COMM_WORLD,iError) + CALL MPI_SEND(Value(iVal,:,:,:,:),nElems*NVisu_elem,MPI_DOUBLE_PRECISION, 0,0,MPI_COMM_PICLAS,iError) END IF END IF #endif /*USE_MPI*/ @@ -341,13 +341,13 @@ SUBROUTINE WriteDataToVTK(nVal,NVisu,nElems,VarNames,Coord,Value,FileString,dim, DO iProc=1,nProcessors-1 nElems_proc=nElems_glob(iProc) IF (nElems_proc.GT.0) THEN - CALL MPI_RECV(buf2(:,:,:,:,1:nElems_proc),nElems_proc*NVisu_elem*3,MPI_DOUBLE_PRECISION,iProc,0,MPI_COMM_WORLD,MPIstatus,iError) + CALL MPI_RECV(buf2(:,:,:,:,1:nElems_proc),nElems_proc*NVisu_elem*3,MPI_DOUBLE_PRECISION,iProc,0,MPI_COMM_PICLAS,MPIstatus,iError) WRITE(ivtk) REAL(buf2(:,:,:,:,1:nElems_proc),4) END IF END DO !iProc ELSE IF (nElems.GT.0) THEN - CALL MPI_SEND(Coord(:,:,:,:,:),nElems*NVisu_elem*3,MPI_DOUBLE_PRECISION, 0,0,MPI_COMM_WORLD,iError) + CALL MPI_SEND(Coord(:,:,:,:,:),nElems*NVisu_elem*3,MPI_DOUBLE_PRECISION, 0,0,MPI_COMM_PICLAS,iError) END IF #endif /*USE_MPI*/ END IF !MPIroot diff --git a/src/particles/analyze/particle_analyze.f90 b/src/particles/analyze/particle_analyze.f90 index 2c19eb39f..95971ddcb 100644 --- a/src/particles/analyze/particle_analyze.f90 +++ b/src/particles/analyze/particle_analyze.f90 @@ -578,7 +578,7 @@ SUBROUTINE InitParticleAnalyze() !-- Coupled Power CalcCoupledPower = GETLOGICAL('CalcCoupledPower') #if USE_HDG -IF(UseCoupledPowerPotential.AND.(.NOT.CalcCoupledPower)) CALL abort(__STAMP__,'Coupled power potential requires CalcCoupledPower=T') +IF(UseCoupledPowerPotential.AND.(.NOT.CalcCoupledPower)) CALL abort(__STAMP__,'Coupled power potential requires CalcCoupledPower=T') #endif /*USE_HDG*/ IF(CalcCoupledPower) THEN @@ -814,7 +814,7 @@ SUBROUTINE InitBulkElectronTemp() END IF ! MPIRoot #if USE_MPI ! Broadcast from root to other processors. Only root knows if BulkElectronTempExists=T/F so always broadcast message - CALL MPI_BCAST(BulkElectronTemp,1, MPI_DOUBLE_PRECISION,0,MPI_COMM_WORLD,iERROR) + CALL MPI_BCAST(BulkElectronTemp,1, MPI_DOUBLE_PRECISION,0,MPI_COMM_PICLAS,iERROR) IF(SurfModSEEelectronTempAutoamtic) BulkElectronTempSEE = BulkElectronTemp #endif /*USE_MPI*/ END IF ! CalcBulkElectronTemp @@ -843,7 +843,6 @@ SUBROUTINE AnalyzeParticles(Time) USE MOD_FPFlow_Vars ,ONLY: FP_MaxRelaxFactor,FP_MaxRotRelaxFactor,FP_MeanRelaxFactor,FP_MeanRelaxFactorCounter USE MOD_FPFlow_Vars ,ONLY: FP_PrandtlNumber,FPInitDone USE MOD_Particle_Analyze_Vars -USE MOD_Particle_MPI_Vars ,ONLY: PartMPI USE MOD_Particle_Vars ,ONLY: Species,nSpecies USE MOD_PIC_Analyze ,ONLY: CalcDepositedCharge USE MOD_Restart_Vars ,ONLY: RestartTime,DoRestart @@ -941,7 +940,7 @@ SUBROUTINE AnalyzeParticles(Time) #endif OutputCounter = 2 unit_index = 535 - IF (PartMPI%MPIRoot) THEN + IF (MPIRoot) THEN INQUIRE(UNIT = unit_index , OPENED = isOpen) IF (.NOT.isOpen) THEN outfile = 'PartAnalyze.csv' @@ -1323,20 +1322,20 @@ SUBROUTINE AnalyzeParticles(Time) IF(CalcLaserInteraction)THEN CALL CalcKineticEnergyAndMaximum(Ekin,EkinMax) #if USE_MPI - IF(PartMPI%MPIRoot)THEN - CALL MPI_REDUCE(MPI_IN_PLACE , EkinMax , nSpecies , MPI_DOUBLE_PRECISION , MPI_MAX , 0 , PartMPI%COMM , iError) + IF(MPIRoot)THEN + CALL MPI_REDUCE(MPI_IN_PLACE , EkinMax , nSpecies , MPI_DOUBLE_PRECISION , MPI_MAX , 0 , MPI_COMM_PICLAS , iError) ELSE - CALL MPI_REDUCE(EkinMax , 0. , nSpecies , MPI_DOUBLE_PRECISION , MPI_MAX , 0 , PartMPI%COMM , iError) + CALL MPI_REDUCE(EkinMax , 0. , nSpecies , MPI_DOUBLE_PRECISION , MPI_MAX , 0 , MPI_COMM_PICLAS , iError) END IF #endif /*USE_MPI*/ ELSE CALL CalcKineticEnergy(Ekin) END IF #if USE_MPI - IF(PartMPI%MPIRoot)THEN - CALL MPI_REDUCE(MPI_IN_PLACE , Ekin , nSpecAnalyze , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , PartMPI%COMM , IERROR) + IF(MPIRoot)THEN + CALL MPI_REDUCE(MPI_IN_PLACE , Ekin , nSpecAnalyze , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_PICLAS , IERROR) ELSE - CALL MPI_REDUCE(Ekin , 0. , nSpecAnalyze , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , PartMPI%COMM , IERROR) + CALL MPI_REDUCE(Ekin , 0. , nSpecAnalyze , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_PICLAS , IERROR) END IF #endif /*USE_MPI*/ END IF @@ -1346,7 +1345,7 @@ SUBROUTINE AnalyzeParticles(Time) ! CalcEint(1) is required for Ekin IF(CalcTemp(1).AND.CalcEint(1)) THEN CALL CalcMixtureTemp(NumSpec,Temp,IntTemp,IntEn,TempTotal,Xi_Vib,Xi_Elec) ! contains MPI Communication - IF(PartMPI%MPIRoot) ETotal = Ekin(nSpecAnalyze) + IntEn(nSpecAnalyze,1) + IntEn(nSpecAnalyze,2) + IntEn(nSpecAnalyze,3) + IF(MPIRoot) ETotal = Ekin(nSpecAnalyze) + IntEn(nSpecAnalyze,1) + IntEn(nSpecAnalyze,2) + IntEn(nSpecAnalyze,3) END IF !----------------------------------------------------------------------------------------------------------------------------------- ! Determine the maximal collision probability for whole reservoir and mean collision probability (only for one cell reservoirs, @@ -1378,7 +1377,7 @@ SUBROUTINE AnalyzeParticles(Time) IF(iter.GT.0) THEN MaxCollProb = DSMC%CollProbMax IF(DSMC%CollProbMeanCount.GT.0) MeanCollProb = DSMC%CollProbMean / DSMC%CollProbMeanCount - IF (PartMPI%MPIRoot) THEN + IF (MPIRoot) THEN IF(TempTotal(nSpecAnalyze).GT.0.0) MeanFreePath = CalcMeanFreePath(NumSpecTmp(1:nSpecies), NumSpecTmp(nSpecAnalyze), & MeshVolume, TempTotal(nSpecAnalyze)) END IF @@ -1400,8 +1399,8 @@ SUBROUTINE AnalyzeParticles(Time) #if USE_MPI ! Collect sum on MPIRoot tmpArray = (/PCoupl, PCouplAverage/) - IF(PartMPI%MPIRoot)THEN - CALL MPI_REDUCE(MPI_IN_PLACE, tmpArray, 2, MPI_DOUBLE_PRECISION, MPI_SUM, 0, PartMPI%COMM, IERROR) + IF(MPIRoot)THEN + CALL MPI_REDUCE(MPI_IN_PLACE, tmpArray, 2, MPI_DOUBLE_PRECISION, MPI_SUM, 0, MPI_COMM_PICLAS, IERROR) PCoupl = tmpArray(1) PCouplAverage = tmpArray(2) #endif /*USE_MPI*/ @@ -1426,33 +1425,33 @@ SUBROUTINE AnalyzeParticles(Time) #endif /*USE_HDG*/ #if USE_MPI ELSE - CALL MPI_REDUCE(tmpArray, 0, 2, MPI_DOUBLE_PRECISION, MPI_SUM, 0, PartMPI%COMM, IERROR) + CALL MPI_REDUCE(tmpArray, 0, 2, MPI_DOUBLE_PRECISION, MPI_SUM, 0, MPI_COMM_PICLAS, IERROR) ! Reset for all processes execpt the MPIRoot (this process keeps the old value, which is therefore considered only once in the ! next MPI reduce call) PCouplAverage = 0. - END IF ! PartMPI%MPIRoot + END IF ! MPIRoot END IF ! Switch between root and non-root processes - IF (PartMPI%MPIRoot) THEN + IF (MPIRoot) THEN IF (CalcPartBalance)THEN - CALL MPI_REDUCE(MPI_IN_PLACE,nPartIn(1:nSpecAnalyze) ,nSpecAnalyze,MPI_INTEGER ,MPI_SUM,0,PartMPI%COMM,IERROR) - CALL MPI_REDUCE(MPI_IN_PLACE,nPartOut(1:nSpecAnalyze) ,nSpecAnalyze,MPI_INTEGER ,MPI_SUM,0,PartMPI%COMM,IERROR) - CALL MPI_REDUCE(MPI_IN_PLACE,PartEkinIn(1:nSpecAnalyze) ,nSpecAnalyze,MPI_DOUBLE_PRECISION,MPI_SUM,0,PartMPI%COMM,IERROR) - CALL MPI_REDUCE(MPI_IN_PLACE,PartEkinOut(1:nSpecAnalyze),nSpecAnalyze,MPI_DOUBLE_PRECISION,MPI_SUM,0,PartMPI%COMM,IERROR) + CALL MPI_REDUCE(MPI_IN_PLACE,nPartIn(1:nSpecAnalyze) ,nSpecAnalyze,MPI_INTEGER ,MPI_SUM,0,MPI_COMM_PICLAS,IERROR) + CALL MPI_REDUCE(MPI_IN_PLACE,nPartOut(1:nSpecAnalyze) ,nSpecAnalyze,MPI_INTEGER ,MPI_SUM,0,MPI_COMM_PICLAS,IERROR) + CALL MPI_REDUCE(MPI_IN_PLACE,PartEkinIn(1:nSpecAnalyze) ,nSpecAnalyze,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_PICLAS,IERROR) + CALL MPI_REDUCE(MPI_IN_PLACE,PartEkinOut(1:nSpecAnalyze),nSpecAnalyze,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_PICLAS,IERROR) END IF ELSE ! no Root IF (CalcPartBalance)THEN - CALL MPI_REDUCE(nPartIn ,0,nSpecAnalyze,MPI_INTEGER ,MPI_SUM,0,PartMPI%COMM,IERROR) - CALL MPI_REDUCE(nPartOut ,0,nSpecAnalyze,MPI_INTEGER ,MPI_SUM,0,PartMPI%COMM,IERROR) - CALL MPI_REDUCE(PartEkinIn ,0,nSpecAnalyze,MPI_DOUBLE_PRECISION,MPI_SUM,0,PartMPI%COMM,IERROR) - CALL MPI_REDUCE(PartEkinOut,0,nSpecAnalyze,MPI_DOUBLE_PRECISION,MPI_SUM,0,PartMPI%COMM,IERROR) + CALL MPI_REDUCE(nPartIn ,0,nSpecAnalyze,MPI_INTEGER ,MPI_SUM,0,MPI_COMM_PICLAS,IERROR) + CALL MPI_REDUCE(nPartOut ,0,nSpecAnalyze,MPI_INTEGER ,MPI_SUM,0,MPI_COMM_PICLAS,IERROR) + CALL MPI_REDUCE(PartEkinIn ,0,nSpecAnalyze,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_PICLAS,IERROR) + CALL MPI_REDUCE(PartEkinOut,0,nSpecAnalyze,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_PICLAS,IERROR) END IF #endif /*USE_MPI*/ END IF !----------------------------------------------------------------------------------------------------------------------------------- ! Analyze Routines that require MPI_REDUCE of other variables ! Moving Average of PCoupl: -IF(CalcCoupledPower.AND.PartMPI%MPIRoot) THEN +IF(CalcCoupledPower.AND.MPIRoot) THEN ! Moving Average of PCoupl: TimeDelta = Time-RestartTime IF(ABS(TimeDelta).GT.0.0) PCouplAverage = PCouplAverage / TimeDelta @@ -1465,7 +1464,7 @@ SUBROUTINE AnalyzeParticles(Time) #endif /*USE_HDG*/ !----------------------------------------------------------------------------------------------------------------------------------- ! Perform averaging/summation of the MPI communicated variables on the root only (and for the non-MPI case, MPIRoot is set to true) -IF(PartMPI%MPIRoot) THEN +IF(MPIRoot) THEN IF (CalcPartBalance)THEN IF(nSpecies.GT.1) THEN nPartIn(nSpecies+1) = SUM(nPartIn(1:nSpecies)) @@ -1488,7 +1487,7 @@ SUBROUTINE AnalyzeParticles(Time) IF(BGK_MeanRelaxFactorCounter.GT.0) BGK_MeanRelaxFactor = BGK_MeanRelaxFactor / REAL(BGK_MeanRelaxFactorCounter) END IF END IF -END IF ! PartMPI%MPIRoot +END IF ! MPIRoot IF(CalcCoupledPower) THEN ! Moving Average of PCoupl for each species @@ -1517,7 +1516,7 @@ SUBROUTINE AnalyzeParticles(Time) ! Output Routines !=================================================================================================================================== #if USE_MPI -IF (PartMPI%MPIROOT) THEN +IF (MPIRoot) THEN #endif /*USE_MPI*/ WRITE(unit_index,'(E23.16E3)',ADVANCE='NO') Time IF (CalcSimNumSpec) THEN @@ -1745,11 +1744,11 @@ SUBROUTINE AnalyzeParticles(Time) ! Finish the line with new line character WRITE(unit_index,'(A)') '' #if USE_MPI -END IF ! PartMPI%MPIROOT +END IF ! MPIRoot #endif /*USE_MPI*/ !----------------------------------------------------------------------------------------------------------------------------------- ! Reset coupled power to particles if output of coupled power is active -IF (CalcCoupledPower.AND.PartMPI%MPIRoot) THEN +IF (CalcCoupledPower.AND.MPIRoot) THEN IF(ABS(TimeDelta).GT.0.0) PCouplAverage = PCouplAverage * TimeDelta ! PCouplAverage is reset END IF !----------------------------------------------------------------------------------------------------------------------------------- diff --git a/src/particles/analyze/particle_analyze_code.f90 b/src/particles/analyze/particle_analyze_code.f90 index 6fda4b41e..0a68ed0fd 100644 --- a/src/particles/analyze/particle_analyze_code.f90 +++ b/src/particles/analyze/particle_analyze_code.f90 @@ -572,7 +572,6 @@ SUBROUTINE AnalyticParticleMovement(time,iter) USE MOD_Analyze_Vars ,ONLY: OutputErrorNorms USE MOD_Particle_Analyze_Vars ,ONLY: TrackParticlePosition USE MOD_PICInterpolation_Vars ,ONLY: L_2_Error_Part,AnalyticPartDim -USE MOD_Particle_MPI_Vars ,ONLY: PartMPI ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !---------------------------------------------------------------------------------------------------------------------------------- @@ -588,7 +587,7 @@ SUBROUTINE AnalyticParticleMovement(time,iter) !=================================================================================================================================== CALL CalcErrorParticle(time,iter,PartStateAnalytic) -IF(PartMPI%MPIRoot.AND.OutputErrorNorms) THEN +IF(MPIRoot.AND.OutputErrorNorms) THEN WRITE(UNIT_StdOut,'(A13,ES16.7)')' Sim time : ',time WRITE(formatStr,'(A5,I1,A7)')'(A13,',AnalyticPartDim,'ES16.7)' WRITE(UNIT_StdOut,formatStr)' L2_Part : ',L_2_Error_Part diff --git a/src/particles/analyze/particle_analyze_output.f90 b/src/particles/analyze/particle_analyze_output.f90 index d7b172548..66e3b8f84 100644 --- a/src/particles/analyze/particle_analyze_output.f90 +++ b/src/particles/analyze/particle_analyze_output.f90 @@ -37,7 +37,7 @@ SUBROUTINE WriteParticleTrackingData(time,iter) !----------------------------------------------------------------------------------------------------------------------------------! ! MODULES ! !----------------------------------------------------------------------------------------------------------------------------------! -USE MOD_Globals ,ONLY: FILEEXISTS,unit_stdout,DOTPRODUCT,abort,MPI_COMM_WORLD,iError,MPIRoot +USE MOD_Globals ,ONLY: FILEEXISTS,unit_stdout,DOTPRODUCT,abort,MPI_COMM_PICLAS,iError,MPIRoot USE MOD_Restart_Vars ,ONLY: DoRestart USE MOD_Particle_Vars ,ONLY: PartState, PDM, PEM USE MOD_Particle_Analyze_Vars ,ONLY: printDiff,printDiffVec,printDiffTime @@ -112,7 +112,7 @@ SUBROUTINE WriteParticleTrackingData(time,iter) #if USE_MPI ! Barrier is required is root creates file and other processor prints to this file -IF(CreateFile) CALL MPI_BARRIER(MPI_COMM_WORLD,iError) +IF(CreateFile) CALL MPI_BARRIER(MPI_COMM_PICLAS,iError) #endif /*USE_MPI*/ CALL UpdateNextFreePosition() @@ -214,7 +214,7 @@ SUBROUTINE DisplayCoupledPowerPart() ! Sum the power #if USE_MPI -CALL MPI_REDUCE(PTotal(1:nSpecies),SumPTotal(1:nSpecies),nSpecies,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_WORLD,iError) +CALL MPI_REDUCE(PTotal(1:nSpecies),SumPTotal(1:nSpecies),nSpecies,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_PICLAS,iError) #else SumPTotal(1:nSpecies)=PTotal(1:nSpecies) #endif diff --git a/src/particles/analyze/particle_analyze_tools.f90 b/src/particles/analyze/particle_analyze_tools.f90 index d8a7878db..b1ee3777e 100644 --- a/src/particles/analyze/particle_analyze_tools.f90 +++ b/src/particles/analyze/particle_analyze_tools.f90 @@ -184,9 +184,6 @@ SUBROUTINE CalcNumPartsOfSpec(NumSpec,SimNumSpec,CalcNumSpec_IN,CalcSimNumSpec_I USE MOD_DSMC_Vars ,ONLY: BGGas, DSMC USE MOD_Particle_Vars ,ONLY: nSpecies, Species USE MOD_part_tools ,ONLY: GetParticleWeight -#if USE_MPI -USE MOD_Particle_MPI_Vars ,ONLY: PartMPI -#endif !----------------------------------------------------------------------------------------------------------------------------------! ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -238,16 +235,16 @@ SUBROUTINE CalcNumPartsOfSpec(NumSpec,SimNumSpec,CalcNumSpec_IN,CalcSimNumSpec_I END IF #if USE_MPI -IF (PartMPI%MPIRoot) THEN - IF(CalcNumSpec_IN) CALL MPI_REDUCE(MPI_IN_PLACE , NumSpec , nSpecAnalyze , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , PartMPI%COMM , IERROR) - IF(CalcSimNumSpec_IN) CALL MPI_REDUCE(SUM(SimNumSpec) , SimNumSpecMin , 1 , MPI_INTEGER_INT_KIND , MPI_MIN , 0 , PartMPI%COMM , IERROR) - IF(CalcSimNumSpec_IN) CALL MPI_REDUCE(SUM(SimNumSpec) , SimNumSpecMax , 1 , MPI_INTEGER_INT_KIND , MPI_MAX , 0 , PartMPI%COMM , IERROR) - IF(CalcSimNumSpec_IN) CALL MPI_REDUCE(MPI_IN_PLACE , SimNumSpec , nSpecAnalyze , MPI_INTEGER_INT_KIND , MPI_SUM , 0 , PartMPI%COMM , IERROR) +IF (MPIRoot) THEN + IF(CalcNumSpec_IN) CALL MPI_REDUCE(MPI_IN_PLACE , NumSpec , nSpecAnalyze , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_PICLAS , IERROR) + IF(CalcSimNumSpec_IN) CALL MPI_REDUCE(SUM(SimNumSpec) , SimNumSpecMin , 1 , MPI_INTEGER_INT_KIND , MPI_MIN , 0 , MPI_COMM_PICLAS , IERROR) + IF(CalcSimNumSpec_IN) CALL MPI_REDUCE(SUM(SimNumSpec) , SimNumSpecMax , 1 , MPI_INTEGER_INT_KIND , MPI_MAX , 0 , MPI_COMM_PICLAS , IERROR) + IF(CalcSimNumSpec_IN) CALL MPI_REDUCE(MPI_IN_PLACE , SimNumSpec , nSpecAnalyze , MPI_INTEGER_INT_KIND , MPI_SUM , 0 , MPI_COMM_PICLAS , IERROR) ELSE - IF(CalcNumSpec_IN) CALL MPI_REDUCE(NumSpec , 0 , nSpecAnalyze , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , PartMPI%COMM , IERROR) - IF(CalcSimNumSpec_IN) CALL MPI_REDUCE(SUM(SimNumSpec) , 0 , 1 , MPI_INTEGER_INT_KIND , MPI_MIN , 0 , PartMPI%COMM , IERROR) - IF(CalcSimNumSpec_IN) CALL MPI_REDUCE(SUM(SimNumSpec) , 0 , 1 , MPI_INTEGER_INT_KIND , MPI_MAX , 0 , PartMPI%COMM , IERROR) - IF(CalcSimNumSpec_IN) CALL MPI_REDUCE(SimNumSpec , 0 , nSpecAnalyze , MPI_INTEGER_INT_KIND , MPI_SUM , 0 , PartMPI%COMM , IERROR) + IF(CalcNumSpec_IN) CALL MPI_REDUCE(NumSpec , 0 , nSpecAnalyze , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_PICLAS , IERROR) + IF(CalcSimNumSpec_IN) CALL MPI_REDUCE(SUM(SimNumSpec) , 0 , 1 , MPI_INTEGER_INT_KIND , MPI_MIN , 0 , MPI_COMM_PICLAS , IERROR) + IF(CalcSimNumSpec_IN) CALL MPI_REDUCE(SUM(SimNumSpec) , 0 , 1 , MPI_INTEGER_INT_KIND , MPI_MAX , 0 , MPI_COMM_PICLAS , IERROR) + IF(CalcSimNumSpec_IN) CALL MPI_REDUCE(SimNumSpec , 0 , nSpecAnalyze , MPI_INTEGER_INT_KIND , MPI_SUM , 0 , MPI_COMM_PICLAS , IERROR) END IF #endif /*USE_MPI*/ @@ -255,7 +252,7 @@ SUBROUTINE CalcNumPartsOfSpec(NumSpec,SimNumSpec,CalcNumSpec_IN,CalcSimNumSpec_I IF(CalcSimNumSpec_IN)THEN GlobalNbrOfParticlesUpdated = .TRUE. #if USE_MPI - IF(PartMPI%MPIRoot)THEN + IF(MPIRoot)THEN #endif /*USE_MPI*/ nGlobalNbrOfParticles(1) = INT(SimNumSpecMin,KIND=IK) nGlobalNbrOfParticles(2) = INT(SimNumSpecMax,KIND=IK) @@ -264,7 +261,7 @@ SUBROUTINE CalcNumPartsOfSpec(NumSpec,SimNumSpec,CalcNumSpec_IN,CalcSimNumSpec_I nGlobalNbrOfParticles(5) = MAX(nGlobalNbrOfParticles(2),nGlobalNbrOfParticles(5)) nGlobalNbrOfParticles(6) = MAX(nGlobalNbrOfParticles(3),nGlobalNbrOfParticles(6)) #if USE_MPI - END IF ! PartMPI%MPIRoot + END IF ! MPIRoot #endif /*USE_MPI*/ END IF ! CalcSimNumSpec_IN @@ -386,7 +383,6 @@ SUBROUTINE CalculatePartElemData() USE MOD_Particle_Analyze_Vars ,ONLY: CalcCyclotronFrequency #if USE_MPI USE MOD_Globals -USE MOD_Particle_MPI_Vars ,ONLY: PartMPI USE MOD_Particle_Analyze_Vars ,ONLY: PPDCellResolved,PICTimeCellResolved,PICValidPlasmaCellSum #endif /*USE_MPI*/ !----------------------------------------------------------------------------------------------------------------------------------! @@ -457,8 +453,8 @@ SUBROUTINE CalculatePartElemData() tmpArray(6) = PICValidPlasmaCellSum ! Collect sum on MPIRoot - IF(PartMPI%MPIRoot)THEN - CALL MPI_REDUCE(MPI_IN_PLACE , tmpArray , 6 , MPI_INTEGER , MPI_SUM , 0 , PartMPI%COMM , IERROR) + IF(MPIRoot)THEN + CALL MPI_REDUCE(MPI_IN_PLACE , tmpArray , 6 , MPI_INTEGER , MPI_SUM , 0 , MPI_COMM_PICLAS , IERROR) IF(CalcPointsPerDebyeLength)THEN PPDCellResolved(1) = tmpArray(1) PPDCellResolved(2) = tmpArray(2) @@ -470,8 +466,8 @@ SUBROUTINE CalculatePartElemData() END IF ! CalcPICTimeStep PICValidPlasmaCellSum = tmpArray(6) ELSE - CALL MPI_REDUCE(tmpArray , 0 , 6 , MPI_INTEGER , MPI_SUM , 0 , PartMPI%COMM , IERROR) - END IF ! PartMPI%MPIRoot + CALL MPI_REDUCE(tmpArray , 0 , 6 , MPI_INTEGER , MPI_SUM , 0 , MPI_COMM_PICLAS , IERROR) + END IF ! MPIRoot END IF ! CalcPointsPerDebyeLength.OR.CalcPICTimeStep #endif /*USE_MPI*/ @@ -781,7 +777,7 @@ SUBROUTINE CalcShapeEfficiencyR() USE MOD_Particle_Vars USE MOD_Preproc #if USE_MPI -USE MOD_Particle_MPI_Vars ,ONLY: PartMPI +USE MOD_Globals #endif ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -856,8 +852,8 @@ SUBROUTINE CalcShapeEfficiencyR() END DO ! i IF(NbrOfComps.GT.0.0)THEN #if USE_MPI - WRITE(*,*) 'ShapeEfficiency (Proc,%,%Elems)',PartMPI%MyRank,100*NbrWithinRadius/NbrOfComps,100*NbrOfElemsWithinRadius/NbrOfElems - WRITE(*,*) 'ShapeEfficiency (Elems) for Proc',PartMPI%MyRank,'is',100*NbrOfElemsWithinRadius/NbrOfElems,'%' + WRITE(*,*) 'ShapeEfficiency (Proc,%,%Elems)',myRank,100*NbrWithinRadius/NbrOfComps,100*NbrOfElemsWithinRadius/NbrOfElems + WRITE(*,*) 'ShapeEfficiency (Elems) for Proc',myRank,'is',100*NbrOfElemsWithinRadius/NbrOfElems,'%' #else WRITE(*,*) 'ShapeEfficiency (%,%Elems)',100*NbrWithinRadius/NbrOfComps, 100*NbrOfElemsWithinRadius/NbrOfElems WRITE(*,*) 'ShapeEfficiency (Elems) is',100*NbrOfElemsWithinRadius/NbrOfElems,'%' @@ -917,8 +913,8 @@ SUBROUTINE CalcShapeEfficiencyR() END DO ! i IF(NbrOfComps.GT.0)THEN #if USE_MPI - WRITE(*,*) 'ShapeEfficiency (Proc,%,%Elems)',PartMPI%MyRank,100*NbrWithinRadius/NbrOfComps,100*NbrOfElemsWithinRadius/NbrOfElems - WRITE(*,*) 'ShapeEfficiency (Elems) for Proc',PartMPI%MyRank,'is',100*NbrOfElemsWithinRadius/NbrOfElems,'%' + WRITE(*,*) 'ShapeEfficiency (Proc,%,%Elems)',myRank,100*NbrWithinRadius/NbrOfComps,100*NbrOfElemsWithinRadius/NbrOfElems + WRITE(*,*) 'ShapeEfficiency (Elems) for Proc',myRank,'is',100*NbrOfElemsWithinRadius/NbrOfElems,'%' #else WRITE(*,*) 'ShapeEfficiency (%,%Elems)',100*NbrWithinRadius/NbrOfComps,100*NbrOfElemsWithinRadius/NbrOfElems WRITE(*,*) 'ShapeEfficiency (Elems) is',100*NbrOfElemsWithinRadius/NbrOfElems,'%' @@ -1178,7 +1174,6 @@ PPURE SUBROUTINE CalcNumberDensity(NumSpec,NumDens) USE MOD_Particle_Analyze_Vars ,ONLY: nSpecAnalyze USE MOD_Particle_Vars ,ONLY: Species,nSpecies,usevMPF USE MOD_Particle_Mesh_Vars ,ONLY: MeshVolume -USE MOD_Particle_MPI_Vars ,ONLY: PartMPI !----------------------------------------------------------------------------------------------------------------------------------! ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -1193,7 +1188,7 @@ PPURE SUBROUTINE CalcNumberDensity(NumSpec,NumDens) !=================================================================================================================================== ! Only root does calculation -IF(.NOT.PartMPI%MPIRoot) RETURN +IF(.NOT.MPIRoot) RETURN IF(usevMPF.OR.RadialWeighting%DoRadialWeighting) THEN NumDens(1:nSpecies) = NumSpec(1:nSpecies) / MeshVolume @@ -1230,9 +1225,6 @@ SUBROUTINE CalcNumberDensityBGGasDistri() USE MOD_Particle_Vars ,ONLY: nSpecies USE MOD_Particle_Mesh_Vars ,ONLY: MeshVolume,ElemVolume_Shared USE MOD_Mesh_Tools ,ONLY: GetCNElemID -#if USE_MPI -USE MOD_Particle_MPI_Vars ,ONLY: PartMPI -#endif /*USE_MPI*/ USE MOD_Mesh_Vars ,ONLY: nElems,offSetElem !----------------------------------------------------------------------------------------------------------------------------------! ! IMPLICIT VARIABLE HANDLING @@ -1265,10 +1257,10 @@ SUBROUTINE CalcNumberDensityBGGasDistri() ! Communicate #if USE_MPI -IF(PartMPI%MPIRoot)THEN - CALL MPI_REDUCE(MPI_IN_PLACE , DistriNumDens, BGGas%NumberOfSpecies, MPI_DOUBLE_PRECISION, MPI_SUM, 0,PartMPI%COMM ,IERROR) +IF(MPIRoot)THEN + CALL MPI_REDUCE(MPI_IN_PLACE , DistriNumDens, BGGas%NumberOfSpecies, MPI_DOUBLE_PRECISION, MPI_SUM, 0,MPI_COMM_PICLAS ,IERROR) ELSE - CALL MPI_REDUCE(DistriNumDens, 0. , BGGas%NumberOfSpecies, MPI_DOUBLE_PRECISION, MPI_SUM, 0,PartMPI%COMM ,IERROR) + CALL MPI_REDUCE(DistriNumDens, 0. , BGGas%NumberOfSpecies, MPI_DOUBLE_PRECISION, MPI_SUM, 0,MPI_COMM_PICLAS ,IERROR) END IF #endif /*USE_MPI*/ BGGas%DistributionNumDens = DistriNumDens @@ -1296,7 +1288,6 @@ SUBROUTINE CalcSurfaceFluxInfo() USE MOD_Particle_Sampling_Vars ,ONLY: UseAdaptive, AdaptBCMacroVal, AdaptBCMapElemToSample, AdaptBCAreaSurfaceFlux USE MOD_Particle_Sampling_Vars ,ONLY: AdaptBCAverageValBC, AdaptBCAverageMacroVal USE MOD_Mesh_Vars ,ONLY: SideToElem -USE MOD_Particle_MPI_Vars ,ONLY: PartMPI #if USE_MPI USE MOD_Particle_Analyze_Vars ,ONLY: nSpecAnalyze #endif /*USE_MPI*/ @@ -1371,21 +1362,21 @@ SUBROUTINE CalcSurfaceFluxInfo() ! distribution at the BC, ie. NOT if AdaptBCAverageValBC = T) #if USE_MPI MaxSurfaceFluxBCs = MAXVAL(Species(:)%nSurfacefluxBCs) -IF (PartMPI%MPIRoot) THEN +IF (MPIRoot) THEN CALL MPI_REDUCE(MPI_IN_PLACE,FlowRateSurfFlux(1:nSpecAnalyze,1:MaxSurfaceFluxBCs),nSpecAnalyze*MaxSurfaceFluxBCs,& - MPI_DOUBLE_PRECISION,MPI_SUM,0,PartMPI%COMM,IERROR) + MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_PICLAS,IERROR) IF(UseAdaptive.AND.(.NOT.AdaptBCAverageValBC)) THEN CALL MPI_REDUCE(MPI_IN_PLACE,PressureAdaptiveBC(1:nSpecAnalyze,1:MaxSurfaceFluxBCs),nSpecAnalyze*MaxSurfaceFluxBCs,& - MPI_DOUBLE_PRECISION,MPI_SUM,0,PartMPI%COMM,IERROR) + MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_PICLAS,IERROR) END IF ELSE ! no Root - CALL MPI_REDUCE(FlowRateSurfFlux,FlowRateSurfFlux,nSpecAnalyze*MaxSurfaceFluxBCs,MPI_DOUBLE_PRECISION,MPI_SUM,0,PartMPI%COMM,IERROR) - IF(UseAdaptive.AND.(.NOT.AdaptBCAverageValBC)) CALL MPI_REDUCE(PressureAdaptiveBC,PressureAdaptiveBC,nSpecAnalyze*MaxSurfaceFluxBCs,MPI_DOUBLE_PRECISION,MPI_SUM,0,PartMPI%COMM,IERROR) + CALL MPI_REDUCE(FlowRateSurfFlux,FlowRateSurfFlux,nSpecAnalyze*MaxSurfaceFluxBCs,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_PICLAS,IERROR) + IF(UseAdaptive.AND.(.NOT.AdaptBCAverageValBC)) CALL MPI_REDUCE(PressureAdaptiveBC,PressureAdaptiveBC,nSpecAnalyze*MaxSurfaceFluxBCs,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_PICLAS,IERROR) END IF #endif /*USE_MPI*/ ! 3) Consider Part-AnalyzeStep for FlowRateSurfFlux and determine the average pressure (value does not depend on the Part-AnalyzeStep) -IF (PartMPI%MPIRoot) THEN +IF (MPIRoot) THEN IF(PartAnalyzeStep.GT.1)THEN IF(PartAnalyzeStep.EQ.HUGE(PartAnalyzeStep))THEN FlowRateSurfFlux = FlowRateSurfFlux / iter @@ -1423,7 +1414,6 @@ SUBROUTINE CalcMixtureTemp(NumSpec,Temp,IntTemp,IntEn,TempTotal,Xi_Vib,Xi_Elec) USE MOD_Globals USE MOD_PARTICLE_Vars ,ONLY: nSpecies USE MOD_Particle_Analyze_Vars ,ONLY: nSpecAnalyze -USE MOD_Particle_MPI_Vars ,ONLY: PartMPI USE MOD_DSMC_Vars ,ONLY: SpecDSMC, CollisMode, DSMC USE MOD_part_tools ,ONLY: CalcXiElec USE MOD_DSMC_Relaxation ,ONLY: CalcXiVib @@ -1447,7 +1437,7 @@ SUBROUTINE CalcMixtureTemp(NumSpec,Temp,IntTemp,IntEn,TempTotal,Xi_Vib,Xi_Elec) IF (CollisMode.GT.1) THEN CALL CalcIntTempsAndEn(NumSpec,IntTemp,IntEn) - IF(PartMPI%MPIRoot)THEN + IF(MPIRoot)THEN TempTotal = 0.0 Xi_Vib = 0.0 Xi_Elec = 0.0 @@ -1486,7 +1476,7 @@ SUBROUTINE CalcMixtureTemp(NumSpec,Temp,IntTemp,IntEn,TempTotal,Xi_Vib,Xi_Elec) END IF END IF ELSE - IF(PartMPI%MPIRoot)THEN + IF(MPIRoot)THEN TempTotal = Temp IntTemp = 0.0 IntEn = 0.0 @@ -1507,7 +1497,6 @@ SUBROUTINE CalcIntTempsAndEn(NumSpec,IntTemp,IntEn) USE MOD_Globals_Vars ,ONLY: BoltzmannConst USE MOD_Particle_Vars ,ONLY: PartSpecies, Species, PDM, nSpecies, usevMPF USE MOD_DSMC_Vars ,ONLY: PartStateIntEn, SpecDSMC, DSMC -USE MOD_Particle_MPI_Vars ,ONLY: PartMPI USE MOD_Particle_Analyze_Vars ,ONLY: nSpecAnalyze USE MOD_part_tools ,ONLY: GetParticleWeight USE MOD_DSMC_Vars ,ONLY: RadialWeighting @@ -1549,19 +1538,19 @@ SUBROUTINE CalcIntTempsAndEn(NumSpec,IntTemp,IntEn) END DO #if USE_MPI -IF(PartMPI%MPIRoot)THEN - CALL MPI_REDUCE(MPI_IN_PLACE,EVib ,nSpecies, MPI_DOUBLE_PRECISION, MPI_SUM,0, PartMPI%COMM, IERROR) - CALL MPI_REDUCE(MPI_IN_PLACE,ERot ,nSpecies, MPI_DOUBLE_PRECISION, MPI_SUM,0, PartMPI%COMM, IERROR) - IF(DSMC%ElectronicModel.GT.0) CALL MPI_REDUCE(MPI_IN_PLACE,Eelec,nSpecies, MPI_DOUBLE_PRECISION, MPI_SUM,0, PartMPI%COMM, IERROR) +IF(MPIRoot)THEN + CALL MPI_REDUCE(MPI_IN_PLACE,EVib ,nSpecies, MPI_DOUBLE_PRECISION, MPI_SUM,0, MPI_COMM_PICLAS, IERROR) + CALL MPI_REDUCE(MPI_IN_PLACE,ERot ,nSpecies, MPI_DOUBLE_PRECISION, MPI_SUM,0, MPI_COMM_PICLAS, IERROR) + IF(DSMC%ElectronicModel.GT.0) CALL MPI_REDUCE(MPI_IN_PLACE,Eelec,nSpecies, MPI_DOUBLE_PRECISION, MPI_SUM,0, MPI_COMM_PICLAS, IERROR) ELSE - CALL MPI_REDUCE(EVib ,RD ,nSpecies, MPI_DOUBLE_PRECISION, MPI_SUM,0, PartMPI%COMM, IERROR) - CALL MPI_REDUCE(ERot ,RD ,nSpecies, MPI_DOUBLE_PRECISION, MPI_SUM,0, PartMPI%COMM, IERROR) - IF(DSMC%ElectronicModel.GT.0) CALL MPI_REDUCE(Eelec ,RD ,nSpecies, MPI_DOUBLE_PRECISION, MPI_SUM,0, PartMPI%COMM, IERROR) + CALL MPI_REDUCE(EVib ,RD ,nSpecies, MPI_DOUBLE_PRECISION, MPI_SUM,0, MPI_COMM_PICLAS, IERROR) + CALL MPI_REDUCE(ERot ,RD ,nSpecies, MPI_DOUBLE_PRECISION, MPI_SUM,0, MPI_COMM_PICLAS, IERROR) + IF(DSMC%ElectronicModel.GT.0) CALL MPI_REDUCE(Eelec ,RD ,nSpecies, MPI_DOUBLE_PRECISION, MPI_SUM,0, MPI_COMM_PICLAS, IERROR) END IF #endif /*USE_MPI*/ ! final computation is only done for the root -IF(PartMPI%MPIRoot)THEN +IF(MPIRoot)THEN ! Calc TVib, TRot DO iSpec = 1, nSpecies NumSpecTemp = NumSpec(iSpec) @@ -1632,7 +1621,6 @@ SUBROUTINE CalcTransTemp(NumSpec, Temp) USE MOD_part_tools ,ONLY: GetParticleWeight USE MOD_Particle_Vars ,ONLY: PartSpecies, PartState, Species, PDM USE MOD_Particle_Analyze_Vars ,ONLY: nSpecAnalyze -USE MOD_Particle_MPI_Vars ,ONLY: PartMPI USE MOD_DSMC_Vars ,ONLY: DSMC, AmbipolElecVelo USE MOD_Particle_Vars ,ONLY: CalcBulkElectronTemp,BulkElectronTemp,BulkElectronTempSpecID #if USE_MPI @@ -1672,14 +1660,14 @@ SUBROUTINE CalcTransTemp(NumSpec, Temp) END DO #if USE_MPI -IF(PartMPI%MPIRoot)THEN - CALL MPI_REDUCE(MPI_IN_PLACE,PartVandV2,nSpecies*6,MPI_DOUBLE_PRECISION,MPI_SUM,0,PartMPI%COMM, IERROR) +IF(MPIRoot)THEN + CALL MPI_REDUCE(MPI_IN_PLACE,PartVandV2,nSpecies*6,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_PICLAS, IERROR) ELSE - CALL MPI_REDUCE(PartVandV2 ,PartVandV2,nSpecies*6,MPI_DOUBLE_PRECISION,MPI_SUM,0,PartMPI%COMM, IERROR) + CALL MPI_REDUCE(PartVandV2 ,PartVandV2,nSpecies*6,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_PICLAS, IERROR) END IF #endif /*USE_MPI*/ -IF(PartMPI%MPIRoot)THEN +IF(MPIRoot)THEN DO iSpec=1, nSpecies IF(NumSpec(iSpec).NE.0) THEN ! Compute velocity averages @@ -1707,7 +1695,7 @@ SUBROUTINE CalcTransTemp(NumSpec, Temp) END IF ! For SEE model that used the bulk electron temperature, use the global electron temperature -IF(PartMPI%MPIRoot.AND.CalcBulkElectronTemp)THEN +IF(MPIRoot.AND.CalcBulkElectronTemp)THEN ASSOCIATE( Te => BulkElectronTemp ,& T => Temp(BulkElectronTempSpecID)*Kelvin2eV) ! Smooth the bulk electron temperature by adjusting the difference by 50% @@ -1715,7 +1703,7 @@ SUBROUTINE CalcTransTemp(NumSpec, Temp) END ASSOCIATE END IF #if USE_MPI -IF(CalcBulkElectronTemp) CALL MPI_BCAST(BulkElectronTemp,1,MPI_DOUBLE_PRECISION,0,MPI_COMM_WORLD,iError) +IF(CalcBulkElectronTemp) CALL MPI_BCAST(BulkElectronTemp,1,MPI_DOUBLE_PRECISION,0,MPI_COMM_PICLAS,iError) IF(SurfModSEEelectronTempAutoamtic) BulkElectronTempSEE = BulkElectronTemp #endif /*USE_MPI*/ @@ -1899,9 +1887,6 @@ SUBROUTINE CalcRelaxProbRotVib(RotRelaxProb,VibRelaxProb) USE MOD_Particle_Vars ,ONLY: nSpecies USE MOD_DSMC_Vars ,ONLY: DSMC, VarVibRelaxProb, CollisMode USE MOD_Mesh_Vars ,ONLY: nElems, nGlobalElems -#if USE_MPI -USE MOD_Particle_MPI_Vars ,ONLY: PartMPI -#endif /*USE_MPI*/ ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -1929,13 +1914,13 @@ SUBROUTINE CalcRelaxProbRotVib(RotRelaxProb,VibRelaxProb) RotRelaxProb(2) = 0 END IF #if USE_MPI - IF(PartMPI%MPIRoot)THEN - CALL MPI_REDUCE(MPI_IN_PLACE,RotRelaxProb(1),1,MPI_DOUBLE_PRECISION,MPI_MAX,0,PartMPI%COMM, IERROR) - CALL MPI_REDUCE(MPI_IN_PLACE,RotRelaxProb(2),1,MPI_DOUBLE_PRECISION,MPI_SUM,0,PartMPI%COMM, IERROR) - RotRelaxProb(2) = RotRelaxProb(2) / REAL(PartMPI%nProcs) + IF(MPIRoot)THEN + CALL MPI_REDUCE(MPI_IN_PLACE,RotRelaxProb(1),1,MPI_DOUBLE_PRECISION,MPI_MAX,0,MPI_COMM_PICLAS, IERROR) + CALL MPI_REDUCE(MPI_IN_PLACE,RotRelaxProb(2),1,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_PICLAS, IERROR) + RotRelaxProb(2) = RotRelaxProb(2) / REAL(nProcessors) ELSE - CALL MPI_REDUCE(RotRelaxProb(1),RotRelaxProb(1),1,MPI_DOUBLE_PRECISION,MPI_MAX,0,PartMPI%COMM, IERROR) - CALL MPI_REDUCE(RotRelaxProb(2),RotRelaxProb(2),1,MPI_DOUBLE_PRECISION,MPI_SUM,0,PartMPI%COMM, IERROR) + CALL MPI_REDUCE(RotRelaxProb(1),RotRelaxProb(1),1,MPI_DOUBLE_PRECISION,MPI_MAX,0,MPI_COMM_PICLAS, IERROR) + CALL MPI_REDUCE(RotRelaxProb(2),RotRelaxProb(2),1,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_PICLAS, IERROR) END IF #endif /*USE_MPI*/ ELSE @@ -1953,25 +1938,25 @@ SUBROUTINE CalcRelaxProbRotVib(RotRelaxProb,VibRelaxProb) END DO VibRelaxProb(2)=VibRelaxProb(2)/(REAL(nSpecies)*REAL(nGlobalElems)) #if USE_MPI - IF(PartMPI%MPIRoot)THEN - CALL MPI_REDUCE(MPI_IN_PLACE,VibRelaxProb(1),1,MPI_DOUBLE_PRECISION,MPI_MAX,0,PartMPI%COMM, IERROR) - CALL MPI_REDUCE(MPI_IN_PLACE,VibRelaxProb(2),1,MPI_DOUBLE_PRECISION,MPI_SUM,0,PartMPI%COMM, IERROR) + IF(MPIRoot)THEN + CALL MPI_REDUCE(MPI_IN_PLACE,VibRelaxProb(1),1,MPI_DOUBLE_PRECISION,MPI_MAX,0,MPI_COMM_PICLAS, IERROR) + CALL MPI_REDUCE(MPI_IN_PLACE,VibRelaxProb(2),1,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_PICLAS, IERROR) ELSE - CALL MPI_REDUCE(VibRelaxProb(1),VibRelaxProb(1),1,MPI_DOUBLE_PRECISION,MPI_MAX,0,PartMPI%COMM, IERROR) - CALL MPI_REDUCE(VibRelaxProb(2),VibRelaxProb(2),1,MPI_DOUBLE_PRECISION,MPI_SUM,0,PartMPI%COMM, IERROR) + CALL MPI_REDUCE(VibRelaxProb(1),VibRelaxProb(1),1,MPI_DOUBLE_PRECISION,MPI_MAX,0,MPI_COMM_PICLAS, IERROR) + CALL MPI_REDUCE(VibRelaxProb(2),VibRelaxProb(2),1,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_PICLAS, IERROR) END IF #endif /*USE_MPI*/ ELSE VibRelaxProb = 0. #if USE_MPI - IF(PartMPI%MPIRoot)THEN - CALL MPI_REDUCE(MPI_IN_PLACE,DSMC%CalcVibProb(1:nSpecies,1),nSpecies,MPI_DOUBLE_PRECISION,MPI_SUM,0,PartMPI%COMM, IERROR) - CALL MPI_REDUCE(MPI_IN_PLACE,DSMC%CalcVibProb(1:nSpecies,2),nSpecies,MPI_DOUBLE_PRECISION,MPI_MAX,0,PartMPI%COMM, IERROR) - CALL MPI_REDUCE(MPI_IN_PLACE,DSMC%CalcVibProb(1:nSpecies,3),nSpecies,MPI_DOUBLE_PRECISION,MPI_SUM,0,PartMPI%COMM, IERROR) + IF(MPIRoot)THEN + CALL MPI_REDUCE(MPI_IN_PLACE,DSMC%CalcVibProb(1:nSpecies,1),nSpecies,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_PICLAS, IERROR) + CALL MPI_REDUCE(MPI_IN_PLACE,DSMC%CalcVibProb(1:nSpecies,2),nSpecies,MPI_DOUBLE_PRECISION,MPI_MAX,0,MPI_COMM_PICLAS, IERROR) + CALL MPI_REDUCE(MPI_IN_PLACE,DSMC%CalcVibProb(1:nSpecies,3),nSpecies,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_PICLAS, IERROR) ELSE - CALL MPI_REDUCE(DSMC%CalcVibProb(1:nSpecies,1),DSMC%CalcVibProb(1:nSpecies,1),nSpecies,MPI_DOUBLE_PRECISION,MPI_SUM,0,PartMPI%COMM, IERROR) - CALL MPI_REDUCE(DSMC%CalcVibProb(1:nSpecies,2),DSMC%CalcVibProb(1:nSpecies,2),nSpecies,MPI_DOUBLE_PRECISION,MPI_MAX,0,PartMPI%COMM, IERROR) - CALL MPI_REDUCE(DSMC%CalcVibProb(1:nSpecies,3),DSMC%CalcVibProb(1:nSpecies,3),nSpecies,MPI_DOUBLE_PRECISION,MPI_SUM,0,PartMPI%COMM, IERROR) + CALL MPI_REDUCE(DSMC%CalcVibProb(1:nSpecies,1),DSMC%CalcVibProb(1:nSpecies,1),nSpecies,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_PICLAS, IERROR) + CALL MPI_REDUCE(DSMC%CalcVibProb(1:nSpecies,2),DSMC%CalcVibProb(1:nSpecies,2),nSpecies,MPI_DOUBLE_PRECISION,MPI_MAX,0,MPI_COMM_PICLAS, IERROR) + CALL MPI_REDUCE(DSMC%CalcVibProb(1:nSpecies,3),DSMC%CalcVibProb(1:nSpecies,3),nSpecies,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_PICLAS, IERROR) END IF #endif /*USE_MPI*/ IF(MPIRoot)THEN @@ -2004,7 +1989,6 @@ SUBROUTINE CalcVelocities(PartVtrans, PartVtherm,NumSpec,SimNumSpec) USE MOD_Globals USE MOD_Particle_Analyze_Vars ,ONLY: VeloDirs USE MOD_Particle_Vars ,ONLY: PartState, PartSpecies, PDM, nSpecies, PartMPF, usevMPF -USE MOD_Particle_MPI_Vars ,ONLY: PartMPI USE MOD_Particle_Analyze_Vars ,ONLY: nSpecAnalyze ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -2044,14 +2028,14 @@ SUBROUTINE CalcVelocities(PartVtrans, PartVtherm,NumSpec,SimNumSpec) END DO #if USE_MPI - IF(PartMPI%MPIRoot)THEN - CALL MPI_REDUCE(MPI_IN_PLACE,PartVtrans ,4*nSpecies,MPI_DOUBLE_PRECISION, MPI_SUM,0, PartMPI%COMM, IERROR) + IF(MPIRoot)THEN + CALL MPI_REDUCE(MPI_IN_PLACE,PartVtrans ,4*nSpecies,MPI_DOUBLE_PRECISION, MPI_SUM,0, MPI_COMM_PICLAS, IERROR) ELSE - CALL MPI_REDUCE(PartVtrans ,RD ,4*nSpecies,MPI_DOUBLE_PRECISION, MPI_SUM,0, PartMPI%COMM, IERROR) + CALL MPI_REDUCE(PartVtrans ,RD ,4*nSpecies,MPI_DOUBLE_PRECISION, MPI_SUM,0, MPI_COMM_PICLAS, IERROR) END IF #endif /*USE_MPI*/ - IF(PartMPI%MPIRoot)THEN + IF(MPIRoot)THEN IF (usevMPF) THEN DO dir = 1,3 IF (VeloDirs(dir) .OR. VeloDirs(4)) THEN @@ -2080,7 +2064,7 @@ SUBROUTINE CalcVelocities(PartVtrans, PartVtherm,NumSpec,SimNumSpec) END IF #if USE_MPI - CALL MPI_BCAST(PartVtrans,4*nSpecies, MPI_DOUBLE_PRECISION,0,PartMPI%COMM,iERROR) + CALL MPI_BCAST(PartVtrans,4*nSpecies, MPI_DOUBLE_PRECISION,0,MPI_COMM_PICLAS,iERROR) #endif /*USE_MPI*/ ! calculate thermal velocity @@ -2101,14 +2085,14 @@ SUBROUTINE CalcVelocities(PartVtrans, PartVtherm,NumSpec,SimNumSpec) END DO #if USE_MPI - IF(PartMPI%MPIRoot)THEN - CALL MPI_REDUCE(MPI_IN_PLACE,PartVtherm,4*nSpecies,MPI_DOUBLE_PRECISION, MPI_SUM,0, PartMPI%COMM, IERROR) + IF(MPIRoot)THEN + CALL MPI_REDUCE(MPI_IN_PLACE,PartVtherm,4*nSpecies,MPI_DOUBLE_PRECISION, MPI_SUM,0, MPI_COMM_PICLAS, IERROR) ELSE - CALL MPI_REDUCE(PartVtherm ,RD ,4*nSpecies,MPI_DOUBLE_PRECISION, MPI_SUM,0, PartMPI%COMM, IERROR) + CALL MPI_REDUCE(PartVtherm ,RD ,4*nSpecies,MPI_DOUBLE_PRECISION, MPI_SUM,0, MPI_COMM_PICLAS, IERROR) END IF #endif /*USE_MPI*/ - IF(PartMPI%MPIRoot)THEN + IF(MPIRoot)THEN DO dir = 1,3 IF (VeloDirs(dir) .OR. VeloDirs(4)) THEN DO iSpec = 1,nSpecies @@ -2149,7 +2133,6 @@ SUBROUTINE CollRates(CRate) USE MOD_TimeDisc_Vars ,ONLY: dt, iter USE MOD_Particle_Vars ,ONLY: VarTimeStep USE MOD_Particle_Analyze_Vars ,ONLY: PartAnalyzeStep -USE MOD_Particle_MPI_Vars ,ONLY: PartMPI USE MOD_Particle_TimeStep ,ONLY: GetSpeciesTimeStep ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -2165,14 +2148,14 @@ SUBROUTINE CollRates(CRate) !=================================================================================================================================== #if USE_MPI -IF(PartMPI%MPIRoot)THEN - CALL MPI_REDUCE(MPI_IN_PLACE,DSMC%NumColl,CollInf%NumCase + 1,MPI_DOUBLE_PRECISION,MPI_SUM,0,PartMPI%COMM,IERROR) +IF(MPIRoot)THEN + CALL MPI_REDUCE(MPI_IN_PLACE,DSMC%NumColl,CollInf%NumCase + 1,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_PICLAS,IERROR) ELSE - CALL MPI_REDUCE(DSMC%NumColl,DSMC%NumColl,CollInf%NumCase + 1,MPI_DOUBLE_PRECISION,MPI_SUM,0,PartMPI%COMM,IERROR) + CALL MPI_REDUCE(DSMC%NumColl,DSMC%NumColl,CollInf%NumCase + 1,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_PICLAS,IERROR) END IF #endif /*USE_MPI*/ -IF(PartMPI%MPIRoot)THEN +IF(MPIRoot)THEN DSMC%NumColl(CollInf%NumCase + 1) = SUM(DSMC%NumColl(1:CollInf%NumCase)) DO iCase=1, CollInf%NumCase ! Species-specific time step @@ -2218,9 +2201,6 @@ SUBROUTINE CalcRelaxRates(NumSpec,VibRelaxProbCase) USE MOD_TimeDisc_Vars ,ONLY: dt, iter USE MOD_Particle_Analyze_Vars ,ONLY: PartAnalyzeStep USE MOD_Particle_TimeStep ,ONLY: GetSpeciesTimeStep -#if USE_MPI -USE MOD_Particle_MPI_Vars ,ONLY: PartMPI -#endif /*USE_MPI*/ ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -2236,15 +2216,15 @@ SUBROUTINE CalcRelaxRates(NumSpec,VibRelaxProbCase) #if USE_MPI IF(XSec_Relaxation) THEN - IF(PartMPI%MPIRoot)THEN - CALL MPI_REDUCE(MPI_IN_PLACE,SpecXSec(:)%VibCount,CollInf%NumCase,MPI_DOUBLE_PRECISION,MPI_SUM,0,PartMPI%COMM, IERROR) + IF(MPIRoot)THEN + CALL MPI_REDUCE(MPI_IN_PLACE,SpecXSec(:)%VibCount,CollInf%NumCase,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_PICLAS, IERROR) ELSE - CALL MPI_REDUCE(SpecXSec(:)%VibCount,SpecXSec(:)%VibCount,CollInf%NumCase,MPI_DOUBLE_PRECISION,MPI_SUM,0,PartMPI%COMM, IERROR) + CALL MPI_REDUCE(SpecXSec(:)%VibCount,SpecXSec(:)%VibCount,CollInf%NumCase,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_PICLAS, IERROR) END IF END IF #endif /*USE_MPI*/ VibRelaxProbCase = 0. -IF(PartMPI%MPIRoot)THEN +IF(MPIRoot)THEN IF(XSec_Relaxation) THEN DO iSpec=1,nSpecies IF(NumSpec(iSpec).LE.0.0) CYCLE @@ -2293,7 +2273,6 @@ SUBROUTINE CalcRelaxRatesElec(ElecRelaxRate) USE MOD_MCC_Vars ,ONLY: SpecXSec USE MOD_TimeDisc_Vars ,ONLY: dt, iter USE MOD_Particle_Analyze_Vars ,ONLY: PartAnalyzeStep -USE MOD_Particle_MPI_Vars ,ONLY: PartMPI USE MOD_Particle_TimeStep ,ONLY: GetSpeciesTimeStep ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -2321,14 +2300,14 @@ SUBROUTINE CalcRelaxRatesElec(ElecRelaxRate) END DO #if USE_MPI -IF(PartMPI%MPIRoot)THEN - CALL MPI_REDUCE(MPI_IN_PLACE,ElecRelaxRate,CollInf%NumCase*MaxLevel,MPI_DOUBLE_PRECISION,MPI_SUM,0,PartMPI%COMM,IERROR) +IF(MPIRoot)THEN + CALL MPI_REDUCE(MPI_IN_PLACE,ElecRelaxRate,CollInf%NumCase*MaxLevel,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_PICLAS,IERROR) ELSE - CALL MPI_REDUCE(ElecRelaxRate,ElecRelaxRate,CollInf%NumCase*MaxLevel,MPI_DOUBLE_PRECISION,MPI_SUM,0,PartMPI%COMM,IERROR) + CALL MPI_REDUCE(ElecRelaxRate,ElecRelaxRate,CollInf%NumCase*MaxLevel,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_PICLAS,IERROR) END IF #endif /*USE_MPI*/ -IF(PartMPI%MPIRoot)THEN +IF(MPIRoot)THEN DO iCase=1, CollInf%NumCase IF(SpecXSec(iCase)%UseElecXSec) THEN ! Species-specific time step @@ -2371,7 +2350,6 @@ SUBROUTINE ReacRates(NumSpec, RRate) USE MOD_TimeDisc_Vars ,ONLY: dt, iter USE MOD_Particle_Vars ,ONLY: Species, nSpecies, VarTimeStep USE MOD_Particle_Mesh_Vars ,ONLY: MeshVolume -USE MOD_Particle_MPI_Vars ,ONLY: PartMPI USE MOD_Particle_Analyze_Vars ,ONLY: PartAnalyzeStep USE MOD_Particle_TimeStep ,ONLY: GetSpeciesTimeStep ! IMPLICIT VARIABLE HANDLING @@ -2392,14 +2370,14 @@ SUBROUTINE ReacRates(NumSpec, RRate) !=================================================================================================================================== #if USE_MPI -IF(PartMPI%MPIRoot)THEN - CALL MPI_REDUCE(MPI_IN_PLACE ,ChemReac%NumReac,ChemReac%NumOfReact,MPI_DOUBLE_PRECISION,MPI_SUM,0,PartMPI%COMM,IERROR) +IF(MPIRoot)THEN + CALL MPI_REDUCE(MPI_IN_PLACE ,ChemReac%NumReac,ChemReac%NumOfReact,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_PICLAS,IERROR) ELSE - CALL MPI_REDUCE(ChemReac%NumReac,RD ,ChemReac%NumOfReact,MPI_DOUBLE_PRECISION,MPI_SUM,0,PartMPI%COMM,IERROR) + CALL MPI_REDUCE(ChemReac%NumReac,RD ,ChemReac%NumOfReact,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_PICLAS,IERROR) END IF #endif /*USE_MPI*/ -IF(PartMPI%MPIRoot)THEN +IF(MPIRoot)THEN DO iReac=1, ChemReac%NumOfReact iCase = ChemReac%ReactCase(iReac) ! Species-specific time step diff --git a/src/particles/boundary/particle_boundary_init.f90 b/src/particles/boundary/particle_boundary_init.f90 index b6355c5aa..2d5d7dc5f 100644 --- a/src/particles/boundary/particle_boundary_init.f90 +++ b/src/particles/boundary/particle_boundary_init.f90 @@ -540,7 +540,7 @@ SUBROUTINE InitializeVariablesPartBoundary() IF(ANY(PartBound%SurfaceModel.EQ.1)) THEN ! Open the species database - CALL OpenDataFile(TRIM(SpeciesDatabase),create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_WORLD) + CALL OpenDataFile(TRIM(SpeciesDatabase),create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_PICLAS) ! Check if the correct dataset exists StickingCoefficientExists = .FALSE. dsetname = TRIM('/Surface-Chemistry/StickingCoefficient') @@ -869,7 +869,7 @@ SUBROUTINE InitParticleBoundarySurfSides() color = MERGE(1337, MPI_UNDEFINED, nBCSidesProc.GT.0) END IF ! Create new surface communicator. Pass MPI_INFO_NULL as rank to follow the original ordering -CALL MPI_COMM_SPLIT(MPI_COMM_WORLD, color, MPI_INFO_NULL, SurfCOMM%UNICATOR, iError) +CALL MPI_COMM_SPLIT(MPI_COMM_PICLAS, color, MPI_INFO_NULL, SurfCOMM%UNICATOR, iError) ! Find my rank on the shared communicator, comm size and proc name IF(SurfCOMM%UNICATOR.NE.MPI_COMM_NULL)THEN CALL MPI_COMM_RANK(SurfCOMM%UNICATOR, SurfCOMM%MyRank, iError) @@ -1284,7 +1284,7 @@ SUBROUTINE InitRotPeriodicMapping() DatasetName = 'RotPeriodicMap-v'//TRIM(hilf) WRITE(UNIT=hilf,FMT='(ES10.4)') ManualTimeStep DatasetName = TRIM(DatasetName)//'-dt'//TRIM(hilf) -CALL OpenDataFile(MeshFile,create=.FALSE.,single=.FALSE.,readOnly=.FALSE.,communicatorOpt=MPI_COMM_WORLD) +CALL OpenDataFile(MeshFile,create=.FALSE.,single=.FALSE.,readOnly=.FALSE.,communicatorOpt=MPI_COMM_PICLAS) CALL DatasetExists(File_ID,TRIM(DatasetName),DatasetFound) CALL CloseDataFile() @@ -1716,7 +1716,7 @@ SUBROUTINE BuildParticleBoundaryRotPeriodic(notMappedTotal) CALL BARRIER_AND_SYNC(NumRotPeriodicNeigh_Shared_Win, MPI_COMM_SHARED) CALL BARRIER_AND_SYNC(RotPeriodicSideMapping_temp_Shared_Win, MPI_COMM_SHARED) ! The allreduce is only required when a global array for writing to .h5 is to be used -!CALL MPI_ALLREDUCE(MAXVAL(NumRotPeriodicNeigh) , MaxNumRotPeriodicNeigh , 1 , MPI_INTEGER , MPI_MAX , MPI_COMM_WORLD , iError) +!CALL MPI_ALLREDUCE(MAXVAL(NumRotPeriodicNeigh) , MaxNumRotPeriodicNeigh , 1 , MPI_INTEGER , MPI_MAX , MPI_COMM_PICLAS , iError) #endif /*USE_MPI*/ MaxNumRotPeriodicNeigh = MAXVAL(NumRotPeriodicNeigh) @@ -1748,7 +1748,7 @@ SUBROUTINE BuildParticleBoundaryRotPeriodic(notMappedTotal) END DO #if USE_MPI -CALL MPI_ALLREDUCE(notMapped , notMappedTotal , 1 , MPI_INTEGER , MPI_SUM , MPI_COMM_WORLD , IERROR) +CALL MPI_ALLREDUCE(notMapped , notMappedTotal , 1 , MPI_INTEGER , MPI_SUM , MPI_COMM_PICLAS , IERROR) #else notMappedTotal = notMapped #endif /*USE_MPI*/ diff --git a/src/particles/dsmc/dsmc_analyze.f90 b/src/particles/dsmc/dsmc_analyze.f90 index 9be9fc49e..6d28374e1 100644 --- a/src/particles/dsmc/dsmc_analyze.f90 +++ b/src/particles/dsmc/dsmc_analyze.f90 @@ -771,7 +771,7 @@ SUBROUTINE DSMC_output_calc(nVar,nVar_quality,nVarloc,DSMC_MacroVal) IF (DoVirtualCellMerge) THEN DO iElem = 1, nElems IF (VirtMergedCells(iElem)%isMerged) THEN - DSMC_MacroVal(:,iElem) = DSMC_MacroVal(:,VirtMergedCells(iElem)%MasterCell-offSetElem) + DSMC_MacroVal(:,iElem) = DSMC_MacroVal(:,VirtMergedCells(iElem)%MasterCell-offSetElem) END IF END DO END IF @@ -781,7 +781,7 @@ END SUBROUTINE DSMC_output_calc SUBROUTINE CalcMacroElecExcitation(MacroElecExcitation) !=================================================================================================================================== -!> +!> !=================================================================================================================================== ! MODULES USE MOD_PreProc @@ -802,7 +802,7 @@ SUBROUTINE CalcMacroElecExcitation(MacroElecExcitation) ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -! INTEGER :: +! INTEGER :: REAL :: TimeSample !=================================================================================================================================== @@ -820,7 +820,7 @@ SUBROUTINE CalcMacroElecExcitation(MacroElecExcitation) TimeSample = (Time-(1-DSMC%TimeFracSamp)*TEnd) END IF -! Rate +! Rate MacroElecExcitation = ExcitationSampleData / TimeSample END SUBROUTINE CalcMacroElecExcitation @@ -1017,7 +1017,7 @@ SUBROUTINE WriteDSMCToHDF5(MeshFileName,OutputTime) CALL WriteAttributeToHDF5(File_ID,'Time',1,RealScalar=OutputTime) CALL WriteAttributeToHDF5(File_ID,'MeshFile',1,StrScalar=(/TRIM(MeshFileName)/)) CALL WriteAttributeToHDF5(File_ID,'NSpecies',1,IntegerScalar=nSpecies) - ! Standard variable names + ! Standard variable names CALL WriteAttributeToHDF5(File_ID,'VarNamesAdd',nVar+nVar_quality,StrArray=StrVarNames) ! Additional variable names: electronic excitation rate output IF(SampleElecExcitation) CALL WriteAttributeToHDF5(File_ID,'VarNamesExci',ExcitationLevelCounter,StrArray=StrVarNamesElecExci) @@ -1025,11 +1025,11 @@ SUBROUTINE WriteDSMCToHDF5(MeshFileName,OutputTime) END IF #if USE_MPI -CALL MPI_BARRIER(MPI_COMM_WORLD,iError) +CALL MPI_BARRIER(MPI_COMM_PICLAS,iError) #endif ! Open data file for parallel output -CALL OpenDataFile(FileName,create=.false.,single=.FALSE.,readOnly=.FALSE.,communicatorOpt=MPI_COMM_WORLD) +CALL OpenDataFile(FileName,create=.false.,single=.FALSE.,readOnly=.FALSE.,communicatorOpt=MPI_COMM_PICLAS) ALLOCATE(DSMC_MacroVal(1:nVar+nVar_quality,nElems), STAT=ALLOCSTAT) IF (ALLOCSTAT.NE.0) THEN diff --git a/src/particles/dsmc/dsmc_bg_gas.f90 b/src/particles/dsmc/dsmc_bg_gas.f90 index dcbddbd00..2317de807 100644 --- a/src/particles/dsmc/dsmc_bg_gas.f90 +++ b/src/particles/dsmc/dsmc_bg_gas.f90 @@ -862,7 +862,7 @@ SUBROUTINE BGGas_ReadInDistribution() LBWRITE(UNIT_stdOut,*) 'BGGas distribution - Using macroscopic values from file: ',TRIM(MacroRestartFileName) -CALL OpenDataFile(MacroRestartFileName,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_WORLD) +CALL OpenDataFile(MacroRestartFileName,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_PICLAS) CALL GetDataSize(File_ID,'ElemData',nDims,HSize,attrib=.FALSE.) nVarHDF5 = INT(HSize(1),4) @@ -1145,7 +1145,7 @@ END SUBROUTINE BGGas_InitRegions !=================================================================================================================================== -!> Background gas regions: Set the internal temperatures in case of DSMC and CollisMode = 2/3 (not yet available during +!> Background gas regions: Set the internal temperatures in case of DSMC and CollisMode = 2/3 (not yet available during !> BGGas_InitRegions). Loop over all elements, species and inits per species to set values for molecules and/or atoms. !=================================================================================================================================== SUBROUTINE BGGas_RegionsSetInternalTemp() diff --git a/src/particles/dsmc/dsmc_init.f90 b/src/particles/dsmc/dsmc_init.f90 index 60e1be226..f2d7ff97d 100644 --- a/src/particles/dsmc/dsmc_init.f90 +++ b/src/particles/dsmc/dsmc_init.f90 @@ -1191,7 +1191,7 @@ SUBROUTINE SetVarVibProb2Elems() ! Set initial vibrational relaxation probability to all elements !=================================================================================================================================== ! MODULES ! -USE MOD_Globals ,ONLY: abort, IK, MPI_COMM_WORLD +USE MOD_Globals ,ONLY: abort, IK, MPI_COMM_PICLAS USE MOD_PARTICLE_Vars ,ONLY: nSpecies, Species USE MOD_Restart_Vars ,ONLY: DoRestart,RestartFile USE MOD_Particle_Vars ,ONLY: nSpecies, PartSpecies @@ -1228,7 +1228,7 @@ SUBROUTINE SetVarVibProb2Elems() VarVibRelaxProb%ProbVibAv = 0 VibProbInitDone = .FALSE. IF (DoRestart) THEN - CALL OpenDataFile(RestartFile,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_WORLD) + CALL OpenDataFile(RestartFile,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_PICLAS) ! read local ParticleInfo from HDF5 CALL DatasetExists(File_ID,'VibProbInfo',VibProbDataExists) IF(VibProbDataExists)THEN @@ -1518,7 +1518,7 @@ RECURSIVE SUBROUTINE DeleteNodeVolume(Node) INTEGER :: iLoop, nLoop !=================================================================================================================================== nLoop = 2**Symmetry%Order -IF(ASSOCIATED(Node%SubNode)) THEN +IF(ASSOCIATED(Node%SubNode)) THEN DO iLoop = 1, nLoop CALL DeleteNodeVolume(Node%SubNode(iLoop)) END DO diff --git a/src/particles/emission/particle_br_electron_fluid.f90 b/src/particles/emission/particle_br_electron_fluid.f90 index df94d3872..1abef0f12 100644 --- a/src/particles/emission/particle_br_electron_fluid.f90 +++ b/src/particles/emission/particle_br_electron_fluid.f90 @@ -257,7 +257,7 @@ SUBROUTINE InitializeVariablesElectronFluidRegions() END IF ! MPIRoot #if USE_MPI ! Broadcast from root to other processors - CALL MPI_BCAST(RegionElectronRefHDF5,3, MPI_DOUBLE_PRECISION,0,MPI_COMM_WORLD,iERROR) + CALL MPI_BCAST(RegionElectronRefHDF5,3, MPI_DOUBLE_PRECISION,0,MPI_COMM_PICLAS,iERROR) #endif /*USE_MPI*/ END IF ! DoRestart @@ -613,7 +613,7 @@ SUBROUTINE CalculateBRAutomaticElectronRef() ! Sum the number of elements (later required for averaging the cell-constant values globally on each processor) #if USE_MPI -CALL MPI_ALLREDUCE(RegionElectronRefNew , RegionElectronRefNewGlobal , 3 , MPI_DOUBLE_PRECISION , MPI_SUM , MPI_COMM_WORLD , IERROR) +CALL MPI_ALLREDUCE(RegionElectronRefNew , RegionElectronRefNewGlobal , 3 , MPI_DOUBLE_PRECISION , MPI_SUM , MPI_COMM_PICLAS , IERROR) #else RegionElectronRefNewGlobal = RegionElectronRefNew #endif /*USE_MPI*/ @@ -903,7 +903,7 @@ END FUNCTION LesserThanWithTolerance SUBROUTINE CreateElectronsFromBRFluid(CreateFromRestartFile) ! MODULES USE MOD_Globals -USE MOD_Globals ,ONLY: abort,MPIRoot,UNIT_stdOut,IK,MPI_COMM_WORLD +USE MOD_Globals ,ONLY: abort,MPIRoot,UNIT_stdOut,IK,MPI_COMM_PICLAS USE MOD_Globals_Vars ,ONLY: ElementaryCharge,BoltzmannConst USE MOD_PreProc USE MOD_Particle_Vars ,ONLY: PDM,PEM,PartState,nSpecies,Species,PartSpecies,usevMPF @@ -947,7 +947,7 @@ SUBROUTINE CreateElectronsFromBRFluid(CreateFromRestartFile) IF(CreateFromRestartFile)THEN ALLOCATE(ElectronDensityCell(1,1:PP_nElems)) ALLOCATE(ElectronTemperatureCell(1,1:PP_nElems)) - CALL OpenDataFile(RestartFile,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_WORLD) + CALL OpenDataFile(RestartFile,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_PICLAS) CALL DatasetExists(File_ID,'ElectronDensityCell',ElectronDensityCellExists) IF(ElectronDensityCellExists)THEN ! Associate construct for integer KIND=8 possibility @@ -1069,7 +1069,7 @@ SUBROUTINE CreateElectronsFromBRFluid(CreateFromRestartFile) END IF ! CreateFromRestartFile #if USE_MPI -CALL MPI_ALLREDUCE(MPI_IN_PLACE,BRNbrOfElectronsCreated,1,MPI_INTEGER,MPI_SUM,MPI_COMM_WORLD,iError) +CALL MPI_ALLREDUCE(MPI_IN_PLACE,BRNbrOfElectronsCreated,1,MPI_INTEGER,MPI_SUM,MPI_COMM_PICLAS,iError) #endif /*USE_MPI*/ SWRITE(UNIT_StdOut,'(A,I0,A)') ' Created a total of ',BRNbrOfElectronsCreated,' electrons.' @@ -1205,7 +1205,7 @@ SUBROUTINE InitBRAutomaticElectronRefElements() ! Sum the number of elements (later required for averaging the cell-constant values globally on each processor) #if USE_MPI -CALL MPI_ALLREDUCE(nBRAverageElems , nBRAverageElemsGlobal , 1 , MPI_INTEGER , MPI_SUM , MPI_COMM_WORLD , IERROR) +CALL MPI_ALLREDUCE(nBRAverageElems , nBRAverageElemsGlobal , 1 , MPI_INTEGER , MPI_SUM , MPI_COMM_PICLAS , IERROR) #else nBRAverageElemsGlobal = nBRAverageElems #endif /*USE_MPI*/ diff --git a/src/particles/emission/particle_emission.f90 b/src/particles/emission/particle_emission.f90 index 9d19810ca..7f772b69c 100644 --- a/src/particles/emission/particle_emission.f90 +++ b/src/particles/emission/particle_emission.f90 @@ -34,7 +34,7 @@ SUBROUTINE ParticleInserting() !=================================================================================================================================== ! Modules #if USE_MPI -USE MOD_Particle_MPI_Vars ,ONLY: PartMPI +USE MOD_Particle_MPI_Vars ,ONLY: PartMPIInitGroup #endif /*USE_MPI*/ USE MOD_Globals USE MOD_Globals_Vars ,ONLY: c,PI @@ -178,10 +178,10 @@ SUBROUTINE ParticleInserting() #if USE_MPI ! communicate number of particles with all procs in the same init group InitGroup=Species(i)%Init(iInit)%InitCOMM - IF(PartMPI%InitGroup(InitGroup)%COMM.NE.MPI_COMM_NULL) THEN + IF(PartMPIInitGroup(InitGroup)%COMM.NE.MPI_COMM_NULL) THEN ! only procs which are part of group take part in the communication !NbrOfParticle based on RandVals! - CALL MPI_BCAST(NbrOfParticle, 1, MPI_INTEGER,0,PartMPI%InitGroup(InitGroup)%COMM,IERROR) + CALL MPI_BCAST(NbrOfParticle, 1, MPI_INTEGER,0,PartMPIInitGroup(InitGroup)%COMM,IERROR) ELSE NbrOfParticle=0 END IF @@ -280,11 +280,11 @@ SUBROUTINE ParticleInserting() ! Communicate number of particles with all procs in the same init group InitGroup=Species(i)%Init(iInit)%InitCOMM NeutralizationBalanceGlobal=0 ! always nullify - IF(PartMPI%InitGroup(InitGroup)%COMM.NE.MPI_COMM_NULL) THEN + IF(PartMPIInitGroup(InitGroup)%COMM.NE.MPI_COMM_NULL) THEN ! Loop over all elements and count the ion surplus per element if element-local emission is used IF(nNeutralizationElems.GT.0) CALL CountNeutralizationParticles() ! Only processors which are part of group take part in the communication - CALL MPI_ALLREDUCE(NeutralizationBalance,NeutralizationBalanceGlobal,1,MPI_INTEGER,MPI_SUM,PartMPI%InitGroup(InitGroup)%COMM,IERROR) + CALL MPI_ALLREDUCE(NeutralizationBalance,NeutralizationBalanceGlobal,1,MPI_INTEGER,MPI_SUM,PartMPIInitGroup(InitGroup)%COMM,IERROR) ELSE NeutralizationBalanceGlobal=0 END IF @@ -359,18 +359,18 @@ SUBROUTINE ParticleInserting() ! Complete check if all particles were emitted successfully #if USE_MPI InitGroup=Species(i)%Init(iInit)%InitCOMM - IF (PartMPI%InitGroup(InitGroup)%COMM.NE.MPI_COMM_NULL .AND. Species(i)%Init(iInit)%sumOfRequestedParticles.GT.0) THEN + IF (PartMPIInitGroup(InitGroup)%COMM.NE.MPI_COMM_NULL .AND. Species(i)%Init(iInit)%sumOfRequestedParticles.GT.0) THEN #if defined(MEASURE_MPI_WAIT) CALL SYSTEM_CLOCK(count=CounterStart) #endif /*defined(MEASURE_MPI_WAIT)*/ - CALL MPI_WAIT(PartMPI%InitGroup(InitGroup)%Request, MPI_STATUS_IGNORE, iError) + CALL MPI_WAIT(PartMPIInitGroup(InitGroup)%Request, MPI_STATUS_IGNORE, iError) #if defined(MEASURE_MPI_WAIT) CALL SYSTEM_CLOCK(count=CounterEnd, count_rate=Rate) MPIW8TimePart(5) = MPIW8TimePart(5) + REAL(CounterEnd-CounterStart,8)/Rate MPIW8CountPart(5) = MPIW8CountPart(5) + 1_8 #endif /*defined(MEASURE_MPI_WAIT)*/ - IF(PartMPI%InitGroup(InitGroup)%MPIRoot) THEN + IF(PartMPIInitGroup(InitGroup)%MPIRoot) THEN #endif ! add number of matching error to particle emission to fit ! number of added particles @@ -390,7 +390,7 @@ SUBROUTINE ParticleInserting() ! WRITE(UNIT_stdOut,'(A,I0,A)') 'ParticleEmission_parallel: matched all (',NbrOfParticle,') particles!' END IF #if USE_MPI - END IF ! PartMPI%iProc.EQ.0 + END IF ! PartMPIInitGroup(InitGroup)%MPIRoot END IF #endif END DO ! iInit diff --git a/src/particles/emission/particle_emission_init.f90 b/src/particles/emission/particle_emission_init.f90 index c45b5ca21..a8dd2dcc6 100644 --- a/src/particles/emission/particle_emission_init.f90 +++ b/src/particles/emission/particle_emission_init.f90 @@ -747,9 +747,6 @@ SUBROUTINE DetermineInitialParticleNumber() !> !=================================================================================================================================== ! MODULES -#if USE_MPI -USE MOD_Particle_MPI_Vars ,ONLY: PartMPI -#endif /*USE_MPI*/ USE MOD_Globals USE MOD_Globals_Vars ,ONLY: PI USE MOD_DSMC_Vars ,ONLY: RadialWeighting, DSMC @@ -833,7 +830,7 @@ SUBROUTINE DetermineInitialParticleNumber() END IF ! Sum-up the number of particles to be inserted #if USE_MPI - insertParticles = insertParticles + INT(REAL(Species(iSpec)%Init(iInit)%ParticleNumber)/REAL(PartMPI%nProcs),8) + insertParticles = insertParticles + INT(REAL(Species(iSpec)%Init(iInit)%ParticleNumber)/REAL(nProcessors),8) #else insertParticles = insertParticles + INT(Species(iSpec)%Init(iInit)%ParticleNumber,8) #endif diff --git a/src/particles/emission/particle_position_and_velocity.f90 b/src/particles/emission/particle_position_and_velocity.f90 index b27368573..a67d4a9cc 100644 --- a/src/particles/emission/particle_position_and_velocity.f90 +++ b/src/particles/emission/particle_position_and_velocity.f90 @@ -52,7 +52,7 @@ SUBROUTINE SetParticlePositionCellLocal(FractNbr,iInit,NbrOfParticle) USE MOD_Particle_Vars ,ONLY: Species,Symmetry USE MOD_part_Emission_Tools ,ONLY: IntegerDivide,SetCellLocalParticlePosition #if USE_MPI -USE MOD_Particle_MPI_Vars ,ONLY: PartMPI +USE MOD_Particle_MPI_Vars ,ONLY: PartMPIInitGroup USE MOD_Particle_Mesh_Vars ,ONLY: LocalVolume #endif /*USE_MPI*/ !---------------------------------------------------------------------------------------------------------------------------------- @@ -88,15 +88,15 @@ SUBROUTINE SetParticlePositionCellLocal(FractNbr,iInit,NbrOfParticle) #if USE_MPI ! emission group communicator InitGroup=Species(FractNbr)%Init(iInit)%InitCOMM -IF(PartMPI%InitGroup(InitGroup)%COMM.EQ.MPI_COMM_NULL) THEN +IF(PartMPIInitGroup(InitGroup)%COMM.EQ.MPI_COMM_NULL) THEN NbrofParticle=0 RETURN END IF -IF (PartMPI%InitGroup(InitGroup)%nProcs.GT.1) THEN +IF (PartMPIInitGroup(InitGroup)%nProcs.GT.1) THEN IF (DoExactPartNumInsert) THEN !###$ ToDo - IF (PartMPI%InitGroup(InitGroup)%MPIROOT) THEN - ALLOCATE(ProcMeshVol(0:PartMPI%InitGroup(InitGroup)%nProcs-1)) - ALLOCATE(ProcNbrOfParticle(0:PartMPI%InitGroup(InitGroup)%nProcs-1)) + IF (PartMPIInitGroup(InitGroup)%MPIROOT) THEN + ALLOCATE(ProcMeshVol(0:PartMPIInitGroup(InitGroup)%nProcs-1)) + ALLOCATE(ProcNbrOfParticle(0:PartMPIInitGroup(InitGroup)%nProcs-1)) ProcMeshVol=0. ProcNbrOfParticle=0 ELSE ! to reduce global memory allocation if a lot of procs are used @@ -106,11 +106,11 @@ SUBROUTINE SetParticlePositionCellLocal(FractNbr,iInit,NbrOfParticle) ProcNbrOfParticle=0 END IF !InitGroup%MPIroot CALL MPI_GATHER(LocalVolume,1,MPI_DOUBLE_PRECISION & - ,ProcMeshVol,1,MPI_DOUBLE_PRECISION,0,PartMPI%InitGroup(InitGroup)%COMM,iError) - IF (PartMPI%InitGroup(InitGroup)%MPIROOT) THEN - CALL IntegerDivide(NbrOfParticle,PartMPI%InitGroup(InitGroup)%nProcs,ProcMeshVol,ProcNbrOfParticle) + ,ProcMeshVol,1,MPI_DOUBLE_PRECISION,0,PartMPIInitGroup(InitGroup)%COMM,iError) + IF (PartMPIInitGroup(InitGroup)%MPIROOT) THEN + CALL IntegerDivide(NbrOfParticle,PartMPIInitGroup(InitGroup)%nProcs,ProcMeshVol,ProcNbrOfParticle) END IF - CALL MPI_SCATTER(ProcNbrOfParticle, 1, MPI_INTEGER, chunksize, 1, MPI_INTEGER, 0, PartMPI%InitGroup(InitGroup)%COMM, IERROR) + CALL MPI_SCATTER(ProcNbrOfParticle, 1, MPI_INTEGER, chunksize, 1, MPI_INTEGER, 0, PartMPIInitGroup(InitGroup)%COMM, IERROR) SDEALLOCATE(ProcMeshVol) SDEALLOCATE(ProcNbrOfParticle) END IF @@ -149,7 +149,7 @@ SUBROUTINE SetParticlePosition(FractNbr,iInit,NbrOfParticle) USE MOD_DSMC_Vars ,ONLY: RadialWeighting #if USE_MPI USE MOD_Particle_MPI_Emission ,ONLY: SendEmissionParticlesToProcs -USE MOD_Particle_MPI_Vars ,ONLY: PartMPI +USE MOD_Particle_MPI_Vars ,ONLY: PartMPIInitGroup #endif /*USE_MPI*/ !---------------------------------------------------------------------------------------------------------------------------------- ! IMPLICIT VARIABLE HANDLING @@ -185,7 +185,7 @@ SUBROUTINE SetParticlePosition(FractNbr,iInit,NbrOfParticle) ! emission group communicator #if USE_MPI InitGroup=Species(FractNbr)%Init(iInit)%InitCOMM -IF(PartMPI%InitGroup(InitGroup)%COMM.EQ.MPI_COMM_NULL) THEN +IF(PartMPIInitGroup(InitGroup)%COMM.EQ.MPI_COMM_NULL) THEN NbrofParticle=0 RETURN END IF @@ -194,15 +194,15 @@ SUBROUTINE SetParticlePosition(FractNbr,iInit,NbrOfParticle) (TRIM(Species(FractNbr)%Init(iInit)%SpaceIC).EQ.'circle' ) .OR. & (TRIM(Species(FractNbr)%Init(iInit)%SpaceIC).EQ.'line_with_equidistant_distribution' )) THEN nChunks = 1 -ELSE IF (nbrOfParticle.GT.(PartMPI%InitGroup(InitGroup)%nProcs*10)) THEN - nChunks = PartMPI%InitGroup(InitGroup)%nProcs +ELSE IF (nbrOfParticle.GT.(PartMPIInitGroup(InitGroup)%nProcs*10)) THEN + nChunks = PartMPIInitGroup(InitGroup)%nProcs ELSE nChunks = 1 END IF ! Set default chunkSize chunkSize = INT(nbrOfParticle/nChunks) -IF (PartMPI%InitGroup(InitGroup)%MPIROOT) THEN +IF (PartMPIInitGroup(InitGroup)%MPIROOT) THEN chunkSize = chunkSize*(1-nChunks) + nbrOfParticle END IF @@ -218,7 +218,7 @@ SUBROUTINE SetParticlePosition(FractNbr,iInit,NbrOfParticle) #if USE_MPI ! all proc taking part in particle inserting -IF (PartMPI%InitGroup(InitGroup)%MPIROOT.OR.nChunks.GT.1) THEN +IF (PartMPIInitGroup(InitGroup)%MPIROOT.OR.nChunks.GT.1) THEN #endif ! Allocate part pos buffer IF(RadialWeighting%DoRadialWeighting.AND.(chunkSize.GT.PDM%maxParticleNumber)) THEN @@ -296,7 +296,7 @@ SUBROUTINE SetParticlePosition(FractNbr,iInit,NbrOfParticle) chunkSize = 0 END IF ! Need to open MPI communication regardless of the chunk number. Make it only dependent on the number of procs -IF (PartMPI%InitGroup(InitGroup)%nProcs.GT.1) THEN +IF (PartMPIInitGroup(InitGroup)%nProcs.GT.1) THEN CALL SendEmissionParticlesToProcs(chunkSize,DimSend,FractNbr,iInit,Species(FractNbr)%Init(iInit)%mySumOfMatchedParticles,particle_positions) ! Finish emission on local proc ELSE @@ -331,8 +331,8 @@ SUBROUTINE SetParticlePosition(FractNbr,iInit,NbrOfParticle) , MPI_INTEGER & , MPI_SUM & , 0 & - , PartMPI%InitGroup(InitGroup)%COMM & - , PartMPI%InitGroup(InitGroup)%Request & + , PartMPIInitGroup(InitGroup)%COMM & + , PartMPIInitGroup(InitGroup)%Request & , IERROR) #else ! in the serial case, particles are only emitted on the current processor @@ -546,7 +546,7 @@ SUBROUTINE SetPartPosAndVeloEmissionDistribution(iSpec,iInit,NbrOfParticle) ! modules !USE MOD_Globals USE MOD_PreProc -USE MOD_Globals ,ONLY: myrank,UNIT_StdOut,MPI_COMM_WORLD,abort +USE MOD_Globals ,ONLY: myrank,UNIT_StdOut,abort USE MOD_part_tools ,ONLY: InitializeParticleMaxwell,InterpolateEmissionDistribution2D USE MOD_Mesh_Vars ,ONLY: nElems,offsetElem USE MOD_Particle_Vars ,ONLY: Species, PDM, PartState, PEM, LastPartPos diff --git a/src/particles/emission/particle_surface_flux.f90 b/src/particles/emission/particle_surface_flux.f90 index 936941611..a1aa239e7 100644 --- a/src/particles/emission/particle_surface_flux.f90 +++ b/src/particles/emission/particle_surface_flux.f90 @@ -56,9 +56,6 @@ SUBROUTINE ParticleSurfaceflux() USE MOD_LoadBalance_Vars ,ONLY: nSurfacefluxPerElem USE MOD_LoadBalance_Timers ,ONLY: LBStartTime, LBElemSplitTime, LBPauseTime #endif /*USE_LOADBALANCE*/ -#if USE_MPI -USE MOD_Particle_MPI_Vars ,ONLY: PartMPI -#endif /*USE_MPI*/ ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -96,7 +93,7 @@ SUBROUTINE ParticleSurfaceflux() ! Adaptive BC, Type = 4 (Const. massflow): Sum-up the global number of particles exiting through BC and calculate new weights IF(SF%AdaptiveType.EQ.4) THEN #if USE_MPI - CALL MPI_ALLREDUCE(MPI_IN_PLACE,AdaptBCPartNumOut(iSpec,iSF),1,MPI_INTEGER,MPI_SUM,PartMPI%COMM,IERROR) + CALL MPI_ALLREDUCE(MPI_IN_PLACE,AdaptBCPartNumOut(iSpec,iSF),1,MPI_INTEGER,MPI_SUM,MPI_COMM_PICLAS,IERROR) #endif IF(.NOT.ALMOSTEQUAL(SF%AdaptiveMassflow,0.)) CALL CalcConstMassflowWeight(iSpec,iSF) END IF @@ -329,9 +326,6 @@ SUBROUTINE CalcPartInsSubSidesStandardCase(iSpec, iSF, PartInsSubSides) USE MOD_TimeDisc_Vars ,ONLY: dt, RKdtFrac, RKdtFracTotal, Time USE MOD_Particle_Surfaces_Vars ,ONLY: SurfFluxSideSize, BCdata_auxSF USE MOD_Part_Emission_Tools ,ONLY: IntegerDivide, SamplePoissonDistri -#if USE_MPI -USE MOD_Particle_MPI_Vars ,ONLY: PartMPI -#endif /*USE_MPI*/ ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -404,7 +398,7 @@ SUBROUTINE CalcPartInsSubSidesStandardCase(iSpec, iSF, PartInsSubSides) END IF !ReduceNoise, MPIroot #if USE_MPI IF (SF%ReduceNoise) THEN !scatter PartInsProc into PartInsSF of procs - CALL MPI_SCATTER(PartInsProc(0:nProcessors-1),1,MPI_INTEGER,PartInsSF,1,MPI_INTEGER,0,PartMPI%COMM,IERROR) + CALL MPI_SCATTER(PartInsProc(0:nProcessors-1),1,MPI_INTEGER,PartInsSF,1,MPI_INTEGER,0,MPI_COMM_PICLAS,IERROR) END IF !ReduceNoise #endif /*USE_MPI*/ !-- calc global to-be-inserted number of parts and distribute to SubSides (proc local) @@ -1059,9 +1053,6 @@ SUBROUTINE CalcConstMassflowWeight(iSpec,iSF) USE MOD_Particle_Surfaces_Vars ,ONLY: SurfMeshSubSideData, BCdata_auxSF, SurfFluxSideSize USE MOD_Mesh_Vars ,ONLY: SideToElem, offsetElem USE MOD_Particle_Mesh_Tools ,ONLY: GetGlobalNonUniqueSideID -#if USE_MPI -USE MOD_Particle_MPI_Vars ,ONLY: PartMPI -#endif !----------------------------------------------------------------------------------------------------------------------------------! ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -1152,7 +1143,7 @@ SUBROUTINE CalcConstMassflowWeight(iSpec,iSF) ! Calculate the total volume flow rate over the whole BC across all processors #if USE_MPI -CALL MPI_ALLREDUCE(MPI_IN_PLACE,nVFRTotal,1,MPI_DOUBLE,MPI_SUM,PartMPI%COMM,IERROR) +CALL MPI_ALLREDUCE(MPI_IN_PLACE,nVFRTotal,1,MPI_DOUBLE,MPI_SUM,MPI_COMM_PICLAS,IERROR) #endif ! Determine the weight of each side compared to the total volume flow rate diff --git a/src/particles/emission/particle_surface_flux_init.f90 b/src/particles/emission/particle_surface_flux_init.f90 index 3dc9f6fd1..17d5a0d1f 100644 --- a/src/particles/emission/particle_surface_flux_init.f90 +++ b/src/particles/emission/particle_surface_flux_init.f90 @@ -139,7 +139,6 @@ SUBROUTINE InitializeParticleSurfaceflux() USE MOD_DSMC_Vars ,ONLY: AmbiPolarSFMapping, DSMC, useDSMC #if USE_MPI USE MOD_Particle_Vars ,ONLY: DoPoissonRounding, DoTimeDepInflow -USE MOD_Particle_MPI_Vars ,ONLY: PartMPI #endif /*USE_MPI*/ #ifdef CODE_ANALYZE USE MOD_Particle_Vars ,ONLY: CountCircInflowType @@ -182,8 +181,8 @@ SUBROUTINE InitializeParticleSurfaceflux() CALL ReadInAndPrepareSurfaceFlux(MaxSurfacefluxBCs, nDataBC) #if USE_MPI -CALL MPI_ALLREDUCE(MPI_IN_PLACE,DoPoissonRounding,1,MPI_LOGICAL,MPI_LAND,PartMPI%COMM,iError) !set T if this is for all procs -CALL MPI_ALLREDUCE(MPI_IN_PLACE,DoTimeDepInflow,1,MPI_LOGICAL,MPI_LAND,PartMPI%COMM,iError) !set T if this is for all procs +CALL MPI_ALLREDUCE(MPI_IN_PLACE,DoPoissonRounding,1,MPI_LOGICAL,MPI_LAND,MPI_COMM_PICLAS,iError) !set T if this is for all procs +CALL MPI_ALLREDUCE(MPI_IN_PLACE,DoTimeDepInflow,1,MPI_LOGICAL,MPI_LAND,MPI_COMM_PICLAS,iError) !set T if this is for all procs #endif /*USE_MPI*/ CALL CreateSideListAndFinalizeAreasSurfFlux(nDataBC, BCdata_auxSFTemp) @@ -253,7 +252,7 @@ SUBROUTINE InitializeParticleSurfaceflux() IF(.NOT.Species(iSpec)%Surfaceflux(iSF)%CircularInflow) THEN totalAreaSF_global = 0.0 CALL MPI_ALLREDUCE(Species(iSpec)%Surfaceflux(iSF)%totalAreaSF,totalAreaSF_global,1, & - MPI_DOUBLE_PRECISION,MPI_SUM,PartMPI%COMM,IERROR) + MPI_DOUBLE_PRECISION,MPI_SUM,MPI_COMM_PICLAS,IERROR) Species(iSpec)%Surfaceflux(iSF)%totalAreaSF = totalAreaSF_global END IF #endif @@ -340,7 +339,7 @@ SUBROUTINE InitializeParticleSurfaceflux() END DO ! iSpec=1,nSpecies #if USE_MPI -CALL MPI_ALLREDUCE(MPI_IN_PLACE,DoSurfaceFlux,1,MPI_LOGICAL,MPI_LOR,PartMPI%COMM,iError) !set T if at least 1 proc have SFs +CALL MPI_ALLREDUCE(MPI_IN_PLACE,DoSurfaceFlux,1,MPI_LOGICAL,MPI_LOR,MPI_COMM_PICLAS,iError) !set T if at least 1 proc have SFs #endif /*USE_MPI*/ IF (.NOT.DoSurfaceFlux) THEN !-- no SFs defined LBWRITE(*,*) 'WARNING: No Sides for SurfacefluxBCs found! DoSurfaceFlux is now disabled!' @@ -695,9 +694,6 @@ SUBROUTINE CreateSideListAndFinalizeAreasSurfFlux(nDataBC, BCdata_auxSFTemp) USE MOD_DSMC_Symmetry ,ONLY: DSMC_1D_CalcSymmetryArea, DSMC_2D_CalcSymmetryArea, DSMC_2D_CalcSymmetryAreaSubSides USE MOD_DSMC_Vars ,ONLY: RadialWeighting USE MOD_Particle_Surfaces ,ONLY: CalcNormAndTangTriangle -#if USE_MPI -USE MOD_Particle_MPI_Vars ,ONLY: PartMPI -#endif /*USE_MPI*/ ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -872,7 +868,7 @@ SUBROUTINE CreateSideListAndFinalizeAreasSurfFlux(nDataBC, BCdata_auxSFTemp) DO iPartBound=1,nPartBound areasLoc(iPartBound)=BCdata_auxSF(iPartBound)%LocalArea END DO - CALL MPI_ALLREDUCE(areasLoc,areasGlob,nPartBound,MPI_DOUBLE_PRECISION,MPI_SUM,PartMPI%COMM,IERROR) + CALL MPI_ALLREDUCE(areasLoc,areasGlob,nPartBound,MPI_DOUBLE_PRECISION,MPI_SUM,MPI_COMM_PICLAS,IERROR) #endif DO iPartBound=1,nPartBound #if USE_MPI @@ -1049,9 +1045,6 @@ SUBROUTINE InitReduceNoiseSF(iSpec, iSF) ! MODULES USE MOD_Globals USE MOD_Particle_Vars ,ONLY: Species -#if USE_MPI -USE MOD_Particle_MPI_Vars ,ONLY: PartMPI -#endif /*USE_MPI*/ ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -1073,9 +1066,9 @@ SUBROUTINE InitReduceNoiseSF(iSpec, iSF) END IF !MPIroot #if USE_MPI CALL MPI_GATHER(Species(iSpec)%Surfaceflux(iSF)%VFR_total,1,MPI_DOUBLE_PRECISION & - ,Species(iSpec)%Surfaceflux(iSF)%VFR_total_allProcs,1,MPI_DOUBLE_PRECISION,0,PartMPI%COMM,iError) + ,Species(iSpec)%Surfaceflux(iSF)%VFR_total_allProcs,1,MPI_DOUBLE_PRECISION,0,MPI_COMM_PICLAS,iError) IF(MPIroot)THEN - DO iProc=0,PartMPI%nProcs-1 + DO iProc=0,nProcessors-1 Species(iSpec)%Surfaceflux(iSF)%VFR_total_allProcsTotal = Species(iSpec)%Surfaceflux(iSF)%VFR_total_allProcsTotal & + Species(iSpec)%Surfaceflux(iSF)%VFR_total_allProcs(iProc) END DO diff --git a/src/particles/particle_init.f90 b/src/particles/particle_init.f90 index 9d0ce0df7..308dd4106 100644 --- a/src/particles/particle_init.f90 +++ b/src/particles/particle_init.f90 @@ -130,7 +130,7 @@ SUBROUTINE DefineParametersParticles() 'i.e. how deep the merge extends into the mesh starting from \n'//& 'each cell. 0 is the least aggressive merge, 2 the most \n'//& 'aggressive merge.','0') -CALL prms%CreateIntOption( 'Part-MaxNumbCellsMerge' ,'Maximum number of cells to be merged.','4') +CALL prms%CreateIntOption( 'Part-MaxNumbCellsMerge' ,'Maximum number of cells to be merged.','4') CALL prms%SetSection("IMD") ! IMD things @@ -408,7 +408,6 @@ SUBROUTINE InitializeVariables() #if USE_MPI USE MOD_Particle_MPI_Emission ,ONLY: InitEmissionComm USE MOD_Particle_MPI_Halo ,ONLY: IdentifyPartExchangeProcs -USE MOD_Particle_MPI_Vars ,ONLY: PartMPI #endif /*USE_MPI*/ #ifdef CODE_ANALYZE USE MOD_PICInterpolation_Vars ,ONLY: DoInterpolationAnalytic @@ -504,7 +503,7 @@ SUBROUTINE InitializeVariables() #if USE_MPI CALL InitEmissionComm() -CALL MPI_BARRIER(PartMPI%COMM,IERROR) +CALL MPI_BARRIER(MPI_COMM_PICLAS,IERROR) #endif /*USE_MPI*/ #if defined(PARTICLES) && USE_HDG @@ -690,7 +689,7 @@ SUBROUTINE InitializeVariablesVirtualCellMerge() DoVirtualCellMerge = GETLOGICAL('Part-DoVirtualCellMerge') IF(DoVirtualCellMerge)THEN #if USE_MPI -DoParticleLatencyHiding = .FALSE. +DoParticleLatencyHiding = .FALSE. #endif VirtualCellMergeSpread = GETINT('Part-CellMergeSpread') MaxNumOfMergedCells = GETINT('Part-MaxNumbCellsMerge') @@ -1449,7 +1448,7 @@ SUBROUTINE InitRandomSeed(nRandomSeeds,SeedSize,Seeds) !=================================================================================================================================== ! MODULES #if USE_MPI -USE MOD_Particle_MPI_Vars, ONLY:PartMPI +USE MOD_Globals #endif ! IMPLICIT VARIABLE HANDLING !=================================================================================================================================== @@ -1501,9 +1500,9 @@ SUBROUTINE InitRandomSeed(nRandomSeeds,SeedSize,Seeds) DO iSeed = 1, SeedSize #if USE_MPI IF (nRandomSeeds.EQ.0) THEN - AuxilaryClock=AuxilaryClock+PartMPI%MyRank + AuxilaryClock=AuxilaryClock+myRank ELSE IF(nRandomSeeds.GT.0) THEN - AuxilaryClock=AuxilaryClock+(PartMPI%MyRank+1)*INT(Seeds(iSeed),8)*37 + AuxilaryClock=AuxilaryClock+(myRank+1)*INT(Seeds(iSeed),8)*37 END IF #else IF (nRandomSeeds.GT.0) THEN diff --git a/src/particles/particle_mesh/particle_bgm.f90 b/src/particles/particle_mesh/particle_bgm.f90 index f863fe648..e90e53ca2 100644 --- a/src/particles/particle_mesh/particle_bgm.f90 +++ b/src/particles/particle_mesh/particle_bgm.f90 @@ -383,7 +383,7 @@ SUBROUTINE BuildBGMAndIdentifyHaloRegion() END SELECT CharacteristicLengthMax = MAX(CharacteristicLengthMax,CharacteristicLength) END DO ! iElem = 1, nElems - CALL MPI_ALLREDUCE(MPI_IN_PLACE,CharacteristicLengthMax,1,MPI_DOUBLE_PRECISION,MPI_MAX,MPI_COMM_WORLD,iError) + CALL MPI_ALLREDUCE(MPI_IN_PLACE,CharacteristicLengthMax,1,MPI_DOUBLE_PRECISION,MPI_MAX,MPI_COMM_PICLAS,iError) r_sf = 1.1 * CharacteristicLengthMax ! Increase by 10% IF(CharacteristicLength.LE.0.) CALL abort(__STAMP__,'CharacteristicLength.LE.0. is not allowed.') CALL PrintOption('Global shape function radius from elements: PIC-shapefunction-radius' , 'INFO.' , RealOpt=r_sf) @@ -710,7 +710,7 @@ SUBROUTINE BuildBGMAndIdentifyHaloRegion() IF (MeshHasPeriodic) CALL CheckPeriodicSides (EnlargeBGM) CALL BARRIER_AND_SYNC(ElemInfo_Shared_Win,MPI_COMM_SHARED) IF (PartBound%UseRotPeriodicBC) CALL CheckRotPeriodicSides(EnlargeBGM) - CALL BARRIER_AND_SYNC(ElemInfo_Shared_Win,MPI_COMM_SHARED) + CALL BARRIER_AND_SYNC(ElemInfo_Shared_Win,MPI_COMM_SHARED) IF (PartBound%UseInterPlaneBC) CALL CheckInterPlaneSides(EnlargeBGM) CALL BARRIER_AND_SYNC(ElemInfo_Shared_Win,MPI_COMM_SHARED) @@ -1158,7 +1158,7 @@ SUBROUTINE BuildBGMAndIdentifyHaloRegion() END IF ! .NOT.PerformLoadBalance #endif /*USE_LOADBALANCE*/ END IF -CALL MPI_BARRIER(MPI_COMM_WORLD,iError) +CALL MPI_BARRIER(MPI_COMM_PICLAS,iError) #else hilf=' ' #endif /*CODE_ANALYZE*/ @@ -2001,10 +2001,10 @@ END SUBROUTINE CheckRotPeriodicSides SUBROUTINE CheckInterPlaneSides(EnlargeBGM) !=================================================================================================================================== !> checks the elements against inter plane -!> In addition to halo flat elements (normal halo region), find all elements on both side of a intermediate plane that +!> In addition to halo flat elements (normal halo region), find all elements on both side of a intermediate plane that !> are within range of the proc during a loop over all BCs: !> (1) Loop over all compute-node elements and check if they are within InterplaneRegion => Node is within InterplaneRegion -!> (2) Loop over all elements that are NOT on the compute node and add them as halo elements if they are within the corresponding +!> (2) Loop over all elements that are NOT on the compute node and add them as halo elements if they are within the corresponding !> InterplaneRegion !=================================================================================================================================== ! MODULES ! @@ -2058,7 +2058,7 @@ SUBROUTINE CheckInterPlaneSides(EnlargeBGM) END IF END DO IF(InInterPlaneRegion) THEN -! (2) Loop over all elements that are NOT on the compute node and add them as halo elements if they are within the corresponding +! (2) Loop over all elements that are NOT on the compute node and add them as halo elements if they are within the corresponding ! InterplaneRegion DO iElem = firstElem,lastElem ! only consider elements that are not already flagged diff --git a/src/particles/particle_mpi/particle_mpi.f90 b/src/particles/particle_mpi/particle_mpi.f90 index b82cb41d1..c12ae88a8 100644 --- a/src/particles/particle_mpi/particle_mpi.f90 +++ b/src/particles/particle_mpi/particle_mpi.f90 @@ -123,21 +123,6 @@ SUBROUTINE InitParticleMPI() IF(DoParticleLatencyHiding) CALL abort(__STAMP__,'DoParticleLatencyHiding=T not imeplemented for this time disc!') #endif /*!(PP_TimeDiscMethod==400)*/ -#if USE_MPI -CALL MPI_COMM_DUP (MPI_COMM_WORLD,PartMPI%COMM,iError) -CALL MPI_COMM_RANK(PartMPI%COMM,PartMPI%myRank,iError) -CALL MPI_COMM_SIZE(PartMPI%COMM,PartMPI%nProcs,iError) - -IF(PartMPI%nProcs.NE.nProcessors) CALL ABORT(__STAMP__,' MPI Communicater-size does not match!', IERROR) -PartCommSize = 0 -PartMPI%MPIRoot = .FALSE. -IF(PartMPI%MyRank.EQ.0) PartMPI%MPIRoot=.TRUE. -#else -PartMPI%myRank = 0 -PartMPI%nProcs = 1 -PartMPI%MPIRoot = .TRUE. -#endif /*USE_MPI*/ - ParticleMPIInitIsDone=.TRUE. LBWRITE(UNIT_stdOut,'(A)')' INIT PARTICLE MPI DONE!' LBWRITE(UNIT_StdOut,'(132("-"))') @@ -261,7 +246,7 @@ SUBROUTINE IRecvNbOfParticles() ! MODULES USE MOD_Globals USE MOD_Preproc -USE MOD_Particle_MPI_Vars, ONLY:PartMPI,PartMPIExchange +USE MOD_Particle_MPI_Vars, ONLY:PartMPIExchange USE MOD_Particle_MPI_Vars, ONLY:nExchangeProcessors,ExchangeProcToGlobalProc ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -279,7 +264,7 @@ SUBROUTINE IRecvNbOfParticles() , MPI_INTEGER & , ExchangeProcToGlobalProc(EXCHANGE_PROC_RANK,iProc) & , 1001 & - , PartMPI%COMM & + , MPI_COMM_PICLAS & , PartMPIExchange%RecvRequest(1,iProc) & , IERROR ) ! IF(IERROR.NE.MPI_SUCCESS) CALL ABORT(__STAMP__& @@ -306,7 +291,7 @@ SUBROUTINE SendNbOfParticles(doParticle_In) USE MOD_Part_Tools ,ONLY: isDepositParticle USE MOD_DSMC_Vars ,ONLY: DSMC,SpecDSMC, useDSMC, PolyatomMolDSMC USE MOD_Particle_Mesh_Vars ,ONLY: ElemInfo_Shared -USE MOD_Particle_MPI_Vars ,ONLY: PartMPI,PartMPIExchange,PartTargetProc +USE MOD_Particle_MPI_Vars ,ONLY: PartMPIExchange,PartTargetProc USE MOD_Particle_MPI_Vars, ONLY: nExchangeProcessors,ExchangeProcToGlobalProc,GlobalProcToExchangeProc, halo_eps_velo USE MOD_Particle_Vars ,ONLY: PartState,PartSpecies,PEM,PDM,Species ! variables for parallel deposition @@ -397,7 +382,7 @@ SUBROUTINE SendNbOfParticles(doParticle_In) , MPI_INTEGER & , ExchangeProcToGlobalProc(EXCHANGE_PROC_RANK,iProc) & , 1001 & - , PartMPI%COMM & + , MPI_COMM_PICLAS & , PartMPIExchange%SendRequest(1,iProc) & , IERROR ) IF(IERROR.NE.MPI_SUCCESS) CALL ABORT(& @@ -428,7 +413,7 @@ SUBROUTINE MPIParticleSend(UseOldVecLength) USE MOD_Preproc USE MOD_DSMC_Vars, ONLY:useDSMC, CollisMode, DSMC, PartStateIntEn, SpecDSMC, PolyatomMolDSMC, VibQuantsPar USE MOD_DSMC_Vars, ONLY:ElectronicDistriPart, AmbipolElecVelo -USE MOD_Particle_MPI_Vars, ONLY:PartMPI,PartMPIExchange,PartCommSize,PartSendBuf,PartRecvBuf,PartTargetProc!,PartHaloElemToProc +USE MOD_Particle_MPI_Vars, ONLY:PartMPIExchange,PartCommSize,PartSendBuf,PartRecvBuf,PartTargetProc!,PartHaloElemToProc USE MOD_Particle_MPI_Vars, ONLY:nExchangeProcessors,ExchangeProcToGlobalProc USE MOD_Particle_Tracking_Vars, ONLY:TrackingMethod USE MOD_Particle_Vars, ONLY:PartState,PartSpecies,usevMPF,PartMPF,PEM,PDM,PartPosRef,Species @@ -827,7 +812,7 @@ SUBROUTINE MPIParticleSend(UseOldVecLength) , MPI_DOUBLE_PRECISION & , ExchangeProcToGlobalProc(EXCHANGE_PROC_RANK,iProc) & , 1002 & - , PartMPI%COMM & + , MPI_COMM_PICLAS & , PartMPIExchange%RecvRequest(2,iProc) & , IERROR ) IF(IERROR.NE.MPI_SUCCESS) CALL ABORT(__STAMP__,' MPI Communication error', IERROR) @@ -858,7 +843,7 @@ SUBROUTINE MPIParticleSend(UseOldVecLength) , MPI_DOUBLE_PRECISION & , ExchangeProcToGlobalProc(EXCHANGE_PROC_RANK,iProc) & , 1002 & - , PartMPI%COMM & + , MPI_COMM_PICLAS & , PartMPIExchange%SendRequest(2,iProc) & , IERROR ) IF(IERROR.NE.MPI_SUCCESS) CALL ABORT(__STAMP__,' MPI Communication error', IERROR) @@ -882,7 +867,7 @@ SUBROUTINE MPIParticleRecv(DoMPIUpdateNextFreePos) USE MOD_Preproc USE MOD_DSMC_Vars ,ONLY: useDSMC, CollisMode, DSMC, PartStateIntEn, SpecDSMC, PolyatomMolDSMC, VibQuantsPar USE MOD_DSMC_Vars ,ONLY: ElectronicDistriPart, AmbipolElecVelo -USE MOD_Particle_MPI_Vars ,ONLY: PartMPIExchange,PartCommSize,PartRecvBuf,PartSendBuf!,PartMPI +USE MOD_Particle_MPI_Vars ,ONLY: PartMPIExchange,PartCommSize,PartRecvBuf,PartSendBuf USE MOD_Particle_MPI_Vars ,ONLY: nExchangeProcessors USE MOD_Particle_Tracking_Vars ,ONLY: TrackingMethod USE MOD_Particle_Vars ,ONLY: PartState,PartSpecies,usevMPF,PartMPF,PEM,PDM, PartPosRef, Species, LastPartPos @@ -1356,18 +1341,17 @@ SUBROUTINE FinalizeParticleMPI() END DO ! iSpec IF(nInitRegions.GT.0) THEN DO iInitRegions=1,nInitRegions - IF(PartMPI%InitGroup(iInitRegions)%COMM.NE.MPI_COMM_NULL) THEN - CALL MPI_COMM_FREE(PartMPI%InitGroup(iInitRegions)%Comm,iERROR) + IF(PartMPIInitGroup(iInitRegions)%COMM.NE.MPI_COMM_NULL) THEN + CALL MPI_COMM_FREE(PartMPIInitGroup(iInitRegions)%Comm,iERROR) END IF END DO ! iInitRegions END IF -IF(PartMPI%COMM.NE.MPI_COMM_NULL) CALL MPI_COMM_FREE(PartMPI%COMM,iERROR) SDEALLOCATE( PartMPIExchange%nPartsSend) SDEALLOCATE( PartMPIExchange%nPartsRecv) SDEALLOCATE( PartMPIExchange%RecvRequest) SDEALLOCATE( PartMPIExchange%SendRequest) -SDEALLOCATE( PartMPI%InitGroup) +SDEALLOCATE( PartMPIInitGroup) SDEALLOCATE( PartSendBuf) SDEALLOCATE( PartRecvBuf) SDEALLOCATE( ExchangeProcToGlobalProc) diff --git a/src/particles/particle_mpi/particle_mpi_emission.f90 b/src/particles/particle_mpi/particle_mpi_emission.f90 index 805067cd8..8ca5d1df7 100644 --- a/src/particles/particle_mpi/particle_mpi_emission.f90 +++ b/src/particles/particle_mpi/particle_mpi_emission.f90 @@ -42,7 +42,7 @@ SUBROUTINE InitEmissionComm() ! MODULES USE MOD_Globals USE MOD_Preproc -USE MOD_Particle_MPI_Vars ,ONLY: PartMPI,MPI_halo_eps +USE MOD_Particle_MPI_Vars ,ONLY: PartMPIInitGroup,MPI_halo_eps USE MOD_Particle_Vars ,ONLY: Species,nSpecies USE MOD_Particle_Mesh_Vars ,ONLY: GEO,SideInfo_Shared USE MOD_Mesh_Vars ,ONLY: nElems,BoundaryName @@ -79,7 +79,7 @@ SUBROUTINE InitEmissionComm() IF(nInitRegions.EQ.0) RETURN ! allocate communicators -ALLOCATE( PartMPI%InitGroup(1:nInitRegions)) +ALLOCATE( PartMPIInitGroup(1:nInitRegions)) ! Default value for neutralization regions (Landmark and Liu2010) nNeutralizationElems = -1 @@ -507,18 +507,18 @@ SUBROUTINE InitEmissionComm() END SELECT ! Sanity check if at least one proc will be on the new emission communicator - CALL MPI_ALLREDUCE(RegionOnProc,RegionExists,1,MPI_LOGICAL,MPI_LOR,MPI_COMM_WORLD,iError) + CALL MPI_ALLREDUCE(RegionOnProc,RegionExists,1,MPI_LOGICAL,MPI_LOR,MPI_COMM_PICLAS,iError) IF (.NOT. RegionExists) THEN WRITE(hilf,'(A,I0,A,I0)') 'Species',iSpec,'-Init',iInit CALL CollectiveStop(__STAMP__,'The emission region was not found on any processor. No processor in range for '//TRIM(hilf)) END IF - ! Add PartMPI%MPIRoot to specific inits automatically for output of analysis data to disk + ! Add MPIRoot to specific inits automatically for output of analysis data to disk ! The root sometimes also reads data during restart and broadcasts it to the other processors in the communicator SELECT CASE(TRIM(Species(iSpec)%Init(iInit)%SpaceIC)) CASE('2D_landmark_neutralization','2D_Liu2010_neutralization','3D_Liu2010_neutralization','2D_Liu2010_neutralization_Szabo',& '3D_Liu2010_neutralization_Szabo') - IF(PartMPI%MPIRoot) RegionOnProc=.TRUE. + IF(MPIRoot) RegionOnProc=.TRUE. END SELECT ! create new communicator @@ -527,37 +527,37 @@ SUBROUTINE InitEmissionComm() ! set communicator id Species(iSpec)%Init(iInit)%InitCOMM=nInitRegions ! create new emission communicator for emission communication. Pass MPI_INFO_NULL as rank to follow the original ordering - CALL MPI_COMM_SPLIT(PartMPI%COMM,color,MPI_INFO_NULL,PartMPI%InitGroup(nInitRegions)%COMM,iError) + CALL MPI_COMM_SPLIT(MPI_COMM_PICLAS,color,MPI_INFO_NULL,PartMPIInitGroup(nInitRegions)%COMM,iError) ! Find my rank on the shared communicator, comm size and proc name IF (RegionOnProc) THEN - CALL MPI_COMM_RANK(PartMPI%InitGroup(nInitRegions)%COMM,PartMPI%InitGroup(nInitRegions)%MyRank,iError) - CALL MPI_COMM_SIZE(PartMPI%InitGroup(nInitRegions)%COMM,PartMPI%InitGroup(nInitRegions)%nProcs,iError) + CALL MPI_COMM_RANK(PartMPIInitGroup(nInitRegions)%COMM,PartMPIInitGroup(nInitRegions)%MyRank,iError) + CALL MPI_COMM_SIZE(PartMPIInitGroup(nInitRegions)%COMM,PartMPIInitGroup(nInitRegions)%nProcs,iError) ! inform about size of emission communicator - IF (PartMPI%InitGroup(nInitRegions)%MyRank.EQ.0) THEN + IF (PartMPIInitGroup(nInitRegions)%MyRank.EQ.0) THEN #if USE_LOADBALANCE IF(.NOT.PerformLoadBalance)& #endif /*USE_LOADBALANCE*/ WRITE(UNIT_StdOut,'(A,I0,A,I0,A,I0,A)') ' Emission-Region,Emission-Communicator: ',nInitRegions,' on ',& - PartMPI%InitGroup(nInitRegions)%nProcs,' procs ('//TRIM(Species(iSpec)%Init(iInit)%SpaceIC)//', iSpec=',iSpec,')' + PartMPIInitGroup(nInitRegions)%nProcs,' procs ('//TRIM(Species(iSpec)%Init(iInit)%SpaceIC)//', iSpec=',iSpec,')' END IF END IF ! build mapping for procs on emission communicator - IF(PartMPI%InitGroup(nInitRegions)%COMM.NE.MPI_COMM_NULL) THEN - PartMPI%InitGroup(nInitRegions)%MPIRoot=MERGE(.TRUE.,.FALSE.,PartMPI%InitGroup(nInitRegions)%MyRank.EQ.0) - - ALLOCATE(PartMPI%InitGroup(nInitRegions)%GroupToComm(0:PartMPI%InitGroup(nInitRegions)%nProcs-1)) - PartMPI%InitGroup(nInitRegions)%GroupToComm(PartMPI%InitGroup(nInitRegions)%MyRank) = PartMPI%MyRank - CALL MPI_ALLGATHER(PartMPI%MyRank,1,MPI_INTEGER& - ,PartMPI%InitGroup(nInitRegions)%GroupToComm(0:PartMPI%InitGroup(nInitRegions)%nProcs-1)& - ,1,MPI_INTEGER,PartMPI%InitGroup(nInitRegions)%COMM,iERROR) - - ALLOCATE(PartMPI%InitGroup(nInitRegions)%CommToGroup(0:PartMPI%nProcs-1)) - PartMPI%InitGroup(nInitRegions)%CommToGroup(0:PartMPI%nProcs-1) = -1 - DO iRank = 0,PartMPI%InitGroup(nInitRegions)%nProcs-1 - PartMPI%InitGroup(nInitRegions)%CommToGroup(PartMPI%InitGroup(nInitRegions)%GroupToComm(iRank))=iRank + IF(PartMPIInitGroup(nInitRegions)%COMM.NE.MPI_COMM_NULL) THEN + PartMPIInitGroup(nInitRegions)%MPIRoot=MERGE(.TRUE.,.FALSE.,PartMPIInitGroup(nInitRegions)%MyRank.EQ.0) + + ALLOCATE(PartMPIInitGroup(nInitRegions)%GroupToComm(0:PartMPIInitGroup(nInitRegions)%nProcs-1)) + PartMPIInitGroup(nInitRegions)%GroupToComm(PartMPIInitGroup(nInitRegions)%MyRank) = myRank + CALL MPI_ALLGATHER(myRank,1,MPI_INTEGER& + ,PartMPIInitGroup(nInitRegions)%GroupToComm(0:PartMPIInitGroup(nInitRegions)%nProcs-1)& + ,1,MPI_INTEGER,PartMPIInitGroup(nInitRegions)%COMM,iERROR) + + ALLOCATE(PartMPIInitGroup(nInitRegions)%CommToGroup(0:nProcessors-1)) + PartMPIInitGroup(nInitRegions)%CommToGroup(0:nProcessors-1) = -1 + DO iRank = 0,PartMPIInitGroup(nInitRegions)%nProcs-1 + PartMPIInitGroup(nInitRegions)%CommToGroup(PartMPIInitGroup(nInitRegions)%GroupToComm(iRank))=iRank END DO ! iRank END IF @@ -582,7 +582,7 @@ SUBROUTINE SendEmissionParticlesToProcs(chunkSize,DimSend,FractNbr,iInit,mySumOf !USE MOD_Mesh_Tools ,ONLY: GetCNElemID !USE MOD_Particle_Mesh_Vars ,ONLY: FIBGM_nElems, FIBGM_offsetElem, FIBGM_Element USE MOD_Particle_Mesh_Vars ,ONLY: FIBGM_nElems,FIBGM_nTotalElems -USE MOD_Particle_MPI_Vars ,ONLY: PartMPI,PartMPIInsert,PartMPILocate +USE MOD_Particle_MPI_Vars ,ONLY: PartMPIInitGroup,PartMPIInsert,PartMPILocate USE MOD_Particle_MPI_Vars ,ONLY: EmissionSendBuf,EmissionRecvBuf USE MOD_Particle_Vars ,ONLY: PDM,PEM,PartState,PartPosRef,Species USE MOD_Particle_Tracking_Vars ,ONLY: TrackingMethod @@ -623,11 +623,11 @@ SUBROUTINE SendEmissionParticlesToProcs(chunkSize,DimSend,FractNbr,iInit,mySumOf InitGroup = Species(FractNbr)%Init(iInit)%InitCOMM ! Arrays for communication of particles not located in final element -ALLOCATE( PartMPIInsert%nPartsSend (2,0:PartMPI%InitGroup(InitGroup)%nProcs-1) & - , PartMPIInsert%nPartsRecv (1,0:PartMPI%InitGroup(InitGroup)%nProcs-1) & - , PartMPIInsert%SendRequest (2,0:PartMPI%InitGroup(InitGroup)%nProcs-1) & - , PartMPIInsert%RecvRequest (2,0:PartMPI%InitGroup(InitGroup)%nProcs-1) & - , PartMPIInsert%send_message( 0:PartMPI%InitGroup(InitGroup)%nProcs-1) & +ALLOCATE( PartMPIInsert%nPartsSend (2,0:PartMPIInitGroup(InitGroup)%nProcs-1) & + , PartMPIInsert%nPartsRecv (1,0:PartMPIInitGroup(InitGroup)%nProcs-1) & + , PartMPIInsert%SendRequest (2,0:PartMPIInitGroup(InitGroup)%nProcs-1) & + , PartMPIInsert%RecvRequest (2,0:PartMPIInitGroup(InitGroup)%nProcs-1) & + , PartMPIInsert%send_message( 0:PartMPIInitGroup(InitGroup)%nProcs-1) & , STAT=ALLOCSTAT) IF (ALLOCSTAT.NE.0) & CALL ABORT(__STAMP__,' Cannot allocate particle emission MPI arrays! ALLOCSTAT',ALLOCSTAT) @@ -636,12 +636,12 @@ SUBROUTINE SendEmissionParticlesToProcs(chunkSize,DimSend,FractNbr,iInit,mySumOf PartMPIInsert%nPartsRecv=0 ! Inter-CN communication -ALLOCATE( PartMPILocate%nPartsSend (2,0:PartMPI%InitGroup(InitGroup)%nProcs-1) & - , PartMPILocate%nPartsRecv (1,0:PartMPI%InitGroup(InitGroup)%nProcs-1) & - , PartMPILocate%SendRequest(2,0:PartMPI%InitGroup(InitGroup)%nProcs-1) & - , PartMPILocate%RecvRequest(2,0:PartMPI%InitGroup(InitGroup)%nProcs-1) & - , EmissionRecvBuf ( 0:PartMPI%InitGroup(InitGroup)%nProcs-1) & - , EmissionSendBuf ( 0:PartMPI%InitGroup(InitGroup)%nProcs-1) & +ALLOCATE( PartMPILocate%nPartsSend (2,0:PartMPIInitGroup(InitGroup)%nProcs-1) & + , PartMPILocate%nPartsRecv (1,0:PartMPIInitGroup(InitGroup)%nProcs-1) & + , PartMPILocate%SendRequest(2,0:PartMPIInitGroup(InitGroup)%nProcs-1) & + , PartMPILocate%RecvRequest(2,0:PartMPIInitGroup(InitGroup)%nProcs-1) & + , EmissionRecvBuf ( 0:PartMPIInitGroup(InitGroup)%nProcs-1) & + , EmissionSendBuf ( 0:PartMPIInitGroup(InitGroup)%nProcs-1) & , STAT=ALLOCSTAT) IF (ALLOCSTAT.NE.0) & CALL ABORT(__STAMP__,' Cannot allocate particle emission MPI arrays! ALLOCSTAT',ALLOCSTAT) @@ -665,8 +665,8 @@ SUBROUTINE SendEmissionParticlesToProcs(chunkSize,DimSend,FractNbr,iInit,mySumOf chunkState = -1 !--- 1/10 Open receive buffer (located and non-located particles) -DO iProc=0,PartMPI%InitGroup(InitGroup)%nProcs-1 - IF (iProc.EQ.PartMPI%InitGroup(InitGroup)%myRank) CYCLE +DO iProc=0,PartMPIInitGroup(InitGroup)%nProcs-1 + IF (iProc.EQ.PartMPIInitGroup(InitGroup)%myRank) CYCLE !--- MPI_IRECV lengths of lists of particles entering local mesh CALL MPI_IRECV( PartMPIInsert%nPartsRecv(:,iProc) & @@ -674,7 +674,7 @@ SUBROUTINE SendEmissionParticlesToProcs(chunkSize,DimSend,FractNbr,iInit,mySumOf , MPI_INTEGER & , iProc & , 1011 & - , PartMPI%InitGroup(InitGroup)%COMM & + , PartMPIInitGroup(InitGroup)%COMM & , PartMPIInsert%RecvRequest(1,iProc) & , IERROR) @@ -684,7 +684,7 @@ SUBROUTINE SendEmissionParticlesToProcs(chunkSize,DimSend,FractNbr,iInit,mySumOf , MPI_INTEGER & , iProc & , 1111 & - , PartMPI%InitGroup(InitGroup)%COMM & + , PartMPIInitGroup(InitGroup)%COMM & , PartMPILocate%RecvRequest(1,iProc) & , IERROR) END DO @@ -749,7 +749,7 @@ SUBROUTINE SendEmissionParticlesToProcs(chunkSize,DimSend,FractNbr,iInit,mySumOf ProcID = FIBGMProcs(iProc) IF (ProcID.EQ.myRank) CYCLE - tProc=PartMPI%InitGroup(InitGroup)%CommToGroup(ProcID) + tProc=PartMPIInitGroup(InitGroup)%CommToGroup(ProcID) ! Processor is not on emission communicator IF(tProc.EQ.-1) CYCLE @@ -761,8 +761,8 @@ SUBROUTINE SendEmissionParticlesToProcs(chunkSize,DimSend,FractNbr,iInit,mySumOf END DO ! i = 1, chunkSize !--- 2/10 Send number of non-located particles -DO iProc=0,PartMPI%InitGroup(InitGroup)%nProcs-1 - IF (iProc.EQ.PartMPI%InitGroup(InitGroup)%myRank) CYCLE +DO iProc=0,PartMPIInitGroup(InitGroup)%nProcs-1 + IF (iProc.EQ.PartMPIInitGroup(InitGroup)%myRank) CYCLE ! send particles !--- MPI_ISEND lengths of lists of particles leaving local mesh @@ -771,7 +771,7 @@ SUBROUTINE SendEmissionParticlesToProcs(chunkSize,DimSend,FractNbr,iInit,mySumOf , MPI_INTEGER & , iProc & , 1011 & - , PartMPI%InitGroup(InitGroup)%COMM & + , PartMPIInitGroup(InitGroup)%COMM & , PartMPIInsert%SendRequest(1,iProc) & , IERROR) IF (PartMPIInsert%nPartsSend(1,iProc).GT.0) THEN @@ -806,7 +806,7 @@ SUBROUTINE SendEmissionParticlesToProcs(chunkSize,DimSend,FractNbr,iInit,mySumOf ProcID = FIBGMProcs(iProc) IF (ProcID.EQ.myRank) CYCLE - tProc=PartMPI%InitGroup(InitGroup)%CommToGroup(ProcID) + tProc=PartMPIInitGroup(InitGroup)%CommToGroup(ProcID) ! Processor is not on emission communicator IF (tProc.EQ.-1) CYCLE @@ -827,8 +827,8 @@ SUBROUTINE SendEmissionParticlesToProcs(chunkSize,DimSend,FractNbr,iInit,mySumOf #if defined(MEASURE_MPI_WAIT) CALL SYSTEM_CLOCK(count=CounterStart) #endif /*defined(MEASURE_MPI_WAIT)*/ -DO iProc=0,PartMPI%InitGroup(InitGroup)%nProcs-1 - IF (iProc.EQ.PartMPI%InitGroup(InitGroup)%myRank) CYCLE +DO iProc=0,PartMPIInitGroup(InitGroup)%nProcs-1 + IF (iProc.EQ.PartMPIInitGroup(InitGroup)%myRank) CYCLE CALL MPI_WAIT(PartMPIInsert%SendRequest(1,iProc),msg_status(:),IERROR) IF (IERROR.NE.MPI_SUCCESS) CALL abort(__STAMP__,' MPI Communication error', IERROR) @@ -845,8 +845,8 @@ SUBROUTINE SendEmissionParticlesToProcs(chunkSize,DimSend,FractNbr,iInit,mySumOf ! Inter-CN communication ALLOCATE(recvPartPos(1:SUM(PartMPIInsert%nPartsRecv(1,:)*DimSend)), STAT=ALLOCSTAT) TotalNbrOfRecvParts = 0 -DO iProc=0,PartMPI%InitGroup(InitGroup)%nProcs-1 - IF (iProc.EQ.PartMPI%InitGroup(InitGroup)%myRank) CYCLE +DO iProc=0,PartMPIInitGroup(InitGroup)%nProcs-1 + IF (iProc.EQ.PartMPIInitGroup(InitGroup)%myRank) CYCLE IF (PartMPIInsert%nPartsRecv(1,iProc).GT.0) THEN !--- MPI_IRECV lengths of lists of particles entering local mesh @@ -855,7 +855,7 @@ SUBROUTINE SendEmissionParticlesToProcs(chunkSize,DimSend,FractNbr,iInit,mySumOf , MPI_DOUBLE_PRECISION & , iProc & , 1022 & - , PartMPI%InitGroup(InitGroup)%COMM & + , PartMPIInitGroup(InitGroup)%COMM & , PartMPIInsert%RecvRequest(2,iProc) & , IERROR) TotalNbrOfRecvParts = TotalNbrOfRecvParts + PartMPIInsert%nPartsRecv(1,iProc) @@ -867,7 +867,7 @@ SUBROUTINE SendEmissionParticlesToProcs(chunkSize,DimSend,FractNbr,iInit,mySumOf , MPI_DOUBLE_PRECISION & , iProc & , 1022 & - , PartMPI%InitGroup(InitGroup)%COMM & + , PartMPIInitGroup(InitGroup)%COMM & , PartMPIInsert%SendRequest(2,iProc) & , IERROR) END IF @@ -894,7 +894,7 @@ SUBROUTINE SendEmissionParticlesToProcs(chunkSize,DimSend,FractNbr,iInit,mySumOf IF (.NOT.InsideMyBGM(2,i)) CYCLE ! ProcID on emission communicator - tProc=PartMPI%InitGroup(InitGroup)%CommToGroup(ProcID) + tProc=PartMPIInitGroup(InitGroup)%CommToGroup(ProcID) ! Processor is not on emission communicator IF(tProc.EQ.-1) CALL ABORT(__STAMP__,'Error in particle_mpi_emission: proc not on emission communicator') @@ -933,8 +933,8 @@ SUBROUTINE SendEmissionParticlesToProcs(chunkSize,DimSend,FractNbr,iInit,mySumOf !--- / Send number of located particles ! Inter-CN communication -DO iProc=0,PartMPI%InitGroup(InitGroup)%nProcs-1 - IF (iProc.EQ.PartMPI%InitGroup(InitGroup)%myRank) CYCLE +DO iProc=0,PartMPIInitGroup(InitGroup)%nProcs-1 + IF (iProc.EQ.PartMPIInitGroup(InitGroup)%myRank) CYCLE ! send particles !--- MPI_ISEND lengths of lists of particles leaving local mesh @@ -943,7 +943,7 @@ SUBROUTINE SendEmissionParticlesToProcs(chunkSize,DimSend,FractNbr,iInit,mySumOf , MPI_INTEGER & , iProc & , 1111 & - , PartMPI%InitGroup(InitGroup)%COMM & + , PartMPIInitGroup(InitGroup)%COMM & , PartMPILocate%SendRequest(1,iProc) & , IERROR) IF (PartMPILocate%nPartsSend(1,iProc).GT.0) THEN @@ -963,7 +963,7 @@ SUBROUTINE SendEmissionParticlesToProcs(chunkSize,DimSend,FractNbr,iInit,mySumOf ProcID = ElemInfo_Shared(ELEM_RANK,ElemID) IF (ProcID.NE.myRank) THEN ! ProcID on emission communicator - tProc=PartMPI%InitGroup(InitGroup)%CommToGroup(ProcID) + tProc=PartMPIInitGroup(InitGroup)%CommToGroup(ProcID) ! Processor is not on emission communicator IF(tProc.EQ.-1) CYCLE @@ -980,8 +980,8 @@ SUBROUTINE SendEmissionParticlesToProcs(chunkSize,DimSend,FractNbr,iInit,mySumOf #if defined(MEASURE_MPI_WAIT) CALL SYSTEM_CLOCK(count=CounterStart) #endif /*defined(MEASURE_MPI_WAIT)*/ -DO iProc=0,PartMPI%InitGroup(InitGroup)%nProcs-1 - IF (iProc.EQ.PartMPI%InitGroup(InitGroup)%myRank) CYCLE +DO iProc=0,PartMPIInitGroup(InitGroup)%nProcs-1 + IF (iProc.EQ.PartMPIInitGroup(InitGroup)%myRank) CYCLE CALL MPI_WAIT(PartMPILocate%SendRequest(1,iProc),msg_status(:),IERROR) IF(IERROR.NE.MPI_SUCCESS) CALL abort(__STAMP__,' MPI Communication error', IERROR) @@ -994,8 +994,8 @@ SUBROUTINE SendEmissionParticlesToProcs(chunkSize,DimSend,FractNbr,iInit,mySumOf MPIW8CountPart(5) = MPIW8CountPart(5) + 1_8 #endif /*defined(MEASURE_MPI_WAIT)*/ -DO iProc=0,PartMPI%InitGroup(InitGroup)%nProcs-1 - IF (iProc.EQ.PartMPI%InitGroup(InitGroup)%myRank) CYCLE +DO iProc=0,PartMPIInitGroup(InitGroup)%nProcs-1 + IF (iProc.EQ.PartMPIInitGroup(InitGroup)%myRank) CYCLE ! Allocate receive array and open receive buffer if expecting particles from iProc IF (PartMPILocate%nPartsRecv(1,iProc).GT.0) THEN @@ -1011,7 +1011,7 @@ SUBROUTINE SendEmissionParticlesToProcs(chunkSize,DimSend,FractNbr,iInit,mySumOf , MPI_DOUBLE_PRECISION & , iProc & , 1122 & - , PartMPI%InitGroup(InitGroup)%COMM & + , PartMPIInitGroup(InitGroup)%COMM & , PartMPILocate%RecvRequest(2,iProc) & , IERROR ) IF(IERROR.NE.MPI_SUCCESS) & @@ -1026,7 +1026,7 @@ SUBROUTINE SendEmissionParticlesToProcs(chunkSize,DimSend,FractNbr,iInit,mySumOf , MPI_DOUBLE_PRECISION & , iProc & , 1122 & - , PartMPI%InitGroup(InitGroup)%COMM & + , PartMPIInitGroup(InitGroup)%COMM & , PartMPILocate%SendRequest(2,iProc) & , IERROR ) IF(IERROR.NE.MPI_SUCCESS) & @@ -1038,8 +1038,8 @@ SUBROUTINE SendEmissionParticlesToProcs(chunkSize,DimSend,FractNbr,iInit,mySumOf #if defined(MEASURE_MPI_WAIT) CALL SYSTEM_CLOCK(count=CounterStart) #endif /*defined(MEASURE_MPI_WAIT)*/ -DO iProc=0,PartMPI%InitGroup(InitGroup)%nProcs-1 - IF (iProc.EQ.PartMPI%InitGroup(InitGroup)%myRank) CYCLE +DO iProc=0,PartMPIInitGroup(InitGroup)%nProcs-1 + IF (iProc.EQ.PartMPIInitGroup(InitGroup)%myRank) CYCLE IF (PartMPIInsert%nPartsSend(1,iProc).GT.0) THEN CALL MPI_WAIT(PartMPIInsert%SendRequest(2,iProc),msg_status(:),IERROR) @@ -1091,8 +1091,8 @@ SUBROUTINE SendEmissionParticlesToProcs(chunkSize,DimSend,FractNbr,iInit,mySumOf #if defined(MEASURE_MPI_WAIT) CALL SYSTEM_CLOCK(count=CounterStart) #endif /*defined(MEASURE_MPI_WAIT)*/ -DO iProc=0,PartMPI%InitGroup(InitGroup)%nProcs-1 - IF (iProc.EQ.PartMPI%InitGroup(InitGroup)%myRank) CYCLE +DO iProc=0,PartMPIInitGroup(InitGroup)%nProcs-1 + IF (iProc.EQ.PartMPIInitGroup(InitGroup)%myRank) CYCLE IF (PartMPILocate%nPartsSend(1,iProc).GT.0) THEN CALL MPI_WAIT(PartMPILocate%SendRequest(2,iProc),msg_status(:),IERROR) @@ -1110,8 +1110,8 @@ SUBROUTINE SendEmissionParticlesToProcs(chunkSize,DimSend,FractNbr,iInit,mySumOf #endif /*defined(MEASURE_MPI_WAIT)*/ !--- 10/10 Write located particles -DO iProc=0,PartMPI%InitGroup(InitGroup)%nProcs-1 - IF (iProc.EQ.PartMPI%InitGroup(InitGroup)%myRank) CYCLE +DO iProc=0,PartMPIInitGroup(InitGroup)%nProcs-1 + IF (iProc.EQ.PartMPIInitGroup(InitGroup)%myRank) CYCLE IF (PartMPILocate%nPartsRecv(1,iProc).EQ.0) CYCLE DO i = 1,PartMPILocate%nPartsRecv(1,iProc) @@ -1138,7 +1138,7 @@ SUBROUTINE SendEmissionParticlesToProcs(chunkSize,DimSend,FractNbr,iInit,mySumOf !--- Clean up SDEALLOCATE(recvPartPos) SDEALLOCATE(chunkState) -DO iProc=0,PartMPI%InitGroup(InitGroup)%nProcs-1 +DO iProc=0,PartMPIInitGroup(InitGroup)%nProcs-1 SDEALLOCATE(EmissionRecvBuf(iProc)%content) SDEALLOCATE(EmissionSendBuf(iProc)%content) END DO diff --git a/src/particles/particle_mpi/particle_mpi_halo.f90 b/src/particles/particle_mpi/particle_mpi_halo.f90 index 5b4d3ec05..1656cffc1 100644 --- a/src/particles/particle_mpi/particle_mpi_halo.f90 +++ b/src/particles/particle_mpi/particle_mpi_halo.f90 @@ -167,7 +167,7 @@ SUBROUTINE IdentifyPartExchangeProcs , MPI_LOGICAL & , iProc & , 1999 & - , MPI_COMM_WORLD & + , MPI_COMM_PICLAS & , RecvRequest(iProc) & , IERROR) END DO @@ -970,7 +970,7 @@ SUBROUTINE IdentifyPartExchangeProcs END IF END DO IF(InInterPlaneRegion) THEN -! (2) Loop over all elements on the compute node and add the procs as halo_procs if they are within the corresponding +! (2) Loop over all elements on the compute node and add the procs as halo_procs if they are within the corresponding ! InterplaneRegion DO iElem = 1,nComputeNodeTotalElems ElemID = GetGlobalElemID(iElem) @@ -1010,7 +1010,7 @@ SUBROUTINE IdentifyPartExchangeProcs , MPI_LOGICAL & , iProc & , 1999 & - , MPI_COMM_WORLD & + , MPI_COMM_PICLAS & , SendRequest(iProc) & , IERROR) END DO @@ -1050,7 +1050,7 @@ SUBROUTINE IdentifyPartExchangeProcs END DO ! On smooth grids, nNonSymmetricExchangeProcs should be zero. Only output if previously missing particle exchange procs are found - CALL MPI_ALLREDUCE(nNonSymmetricExchangeProcs, nNonSymmetricExchangeProcsGlob, 1, MPI_INTEGER, MPI_SUM, MPI_COMM_WORLD, IERROR) + CALL MPI_ALLREDUCE(nNonSymmetricExchangeProcs, nNonSymmetricExchangeProcsGlob, 1, MPI_INTEGER, MPI_SUM, MPI_COMM_PICLAS, IERROR) ! Check sum of nNonSymmetricExchangeProcs over all processors IF(nNonSymmetricExchangeProcsGlob.GT.0)THEN SWRITE(UNIT_StdOut,'(X,131("~"))') @@ -1097,7 +1097,7 @@ SUBROUTINE IdentifyPartExchangeProcs END DO ! -- Average number of exchange processors -CALL MPI_REDUCE(nExchangeProcessors,nExchangeProcessorsGlobal,1,MPI_INTEGER,MPI_SUM,0,MPI_COMM_WORLD,iError) +CALL MPI_REDUCE(nExchangeProcessors,nExchangeProcessorsGlobal,1,MPI_INTEGER,MPI_SUM,0,MPI_COMM_PICLAS,iError) LBWRITE(UNIT_stdOut,'(A,I0,A)') ' | Started particle exchange communication with average ', & nExchangeProcessorsGlobal/nProcessors_Global , & ' partners per proc' @@ -1448,7 +1448,7 @@ SUBROUTINE IdentifyPartExchangeProcs , MPI_INTEGER & , ShapeMapping(iProc)%Rank & , 2003 & - , MPI_COMM_WORLD & + , MPI_COMM_PICLAS & , RecvRequest(iProc) & , IERROR) END DO @@ -1459,7 +1459,7 @@ SUBROUTINE IdentifyPartExchangeProcs , MPI_INTEGER & , ShapeMapping(iProc)%Rank & , 2003 & - , MPI_COMM_WORLD & + , MPI_COMM_PICLAS & , SendRequest(iProc) & , IERROR) END DO @@ -1479,7 +1479,7 @@ SUBROUTINE IdentifyPartExchangeProcs , MPI_INTEGER & , ShapeMapping(iProc)%Rank & , 2003 & - , MPI_COMM_WORLD & + , MPI_COMM_PICLAS & , RecvRequest(iProc) & , IERROR) END DO @@ -1489,7 +1489,7 @@ SUBROUTINE IdentifyPartExchangeProcs , MPI_INTEGER & , ShapeMapping(iProc)%Rank & , 2003 & - , MPI_COMM_WORLD & + , MPI_COMM_PICLAS & , SendRequest(iProc) & , IERROR) END DO diff --git a/src/particles/particle_mpi/particle_mpi_vars.f90 b/src/particles/particle_mpi/particle_mpi_vars.f90 index 87ab59a48..8c4ef23c2 100644 --- a/src/particles/particle_mpi/particle_mpi_vars.f90 +++ b/src/particles/particle_mpi/particle_mpi_vars.f90 @@ -46,17 +46,7 @@ MODULE MOD_Particle_MPI_Vars INTEGER,ALLOCATABLE :: CommToGroup(:) ! list containing the rank in PartMPI%COMM END TYPE -TYPE tPartMPIVAR -#if USE_MPI - INTEGER :: COMM=MPI_COMM_NULL ! MPI communicator for PIC GTS region -#endif /*USE_MPI*/ - TYPE(tPartMPIGROUP),ALLOCATABLE :: InitGroup(:) ! small communicator for initialization - INTEGER :: nProcs ! number of MPI processes for particles - INTEGER :: MyRank ! MyRank of PartMPIVAR%COMM - LOGICAL :: MPIRoot ! Root, MPIRank=0 -END TYPE - -TYPE (tPartMPIVAR) :: PartMPI +TYPE(tPartMPIGROUP),ALLOCATABLE :: PartMPIInitGroup(:) ! small communicator for initialization REAL :: SafetyFactor ! Factor to scale the halo region with MPI REAL :: halo_eps_velo ! halo_eps_velo diff --git a/src/particles/particle_operations.f90 b/src/particles/particle_operations.f90 index a077f8465..41ab0bda3 100644 --- a/src/particles/particle_operations.f90 +++ b/src/particles/particle_operations.f90 @@ -321,7 +321,7 @@ SUBROUTINE RemoveAllElectrons() END DO #if USE_MPI -CALL MPI_ALLREDUCE(MPI_IN_PLACE,NbrOfElectronsRemoved,1,MPI_INTEGER,MPI_SUM,MPI_COMM_WORLD,iError) +CALL MPI_ALLREDUCE(MPI_IN_PLACE,NbrOfElectronsRemoved,1,MPI_INTEGER,MPI_SUM,MPI_COMM_PICLAS,iError) #endif /*USE_MPI*/ IF(NbrOfElectronsRemoved.GT.0.AND.MPIRoot) WRITE(UNIT_StdOut,'(A,I0,A)') ' Removed a total of ',NbrOfElectronsRemoved,' electrons.' diff --git a/src/particles/particle_timestep.f90 b/src/particles/particle_timestep.f90 index cb5a09c59..6c95a5849 100644 --- a/src/particles/particle_timestep.f90 +++ b/src/particles/particle_timestep.f90 @@ -210,7 +210,7 @@ SUBROUTINE VarTimeStep_InitDistribution() IF(DoRestart) THEN ! Try to get the time step factor distribution directly from state file - CALL OpenDataFile(TRIM(RestartFile),create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_WORLD) + CALL OpenDataFile(TRIM(RestartFile),create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_PICLAS) CALL DatasetExists(File_ID,'ElemTimeStep',TimeStepExists) IF(TimeStepExists) THEN ! Allocate the array for the element-wise time step factor @@ -247,7 +247,7 @@ SUBROUTINE VarTimeStep_InitDistribution() 'ERROR: It is required to use a restart and macroscopic restart when adapting the time step distribution!') END IF ! Open DSMC state file - CALL OpenDataFile(MacroRestartFileName,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_WORLD) + CALL OpenDataFile(MacroRestartFileName,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_PICLAS) CALL GetDataProps('ElemData',nVar_HDF5,N_HDF5,nGlobalElems) @@ -404,7 +404,7 @@ END SUBROUTINE VarTimeStep_InitDistribution REAL FUNCTION GetParticleTimeStep(xPos, yPos, iElem) !=================================================================================================================================== -!> Calculates/determines the time step +!> Calculates/determines the time step !> a) at a position x/y (only in 2D/Axi) [VarTimeStep%UseLinearScaling] !> b) of the given element number (3D and VTS distribution) [VarTimeStep%UseDistribution] !=================================================================================================================================== @@ -565,4 +565,4 @@ SUBROUTINE VarTimeStep_CalcElemFacs() END SUBROUTINE VarTimeStep_CalcElemFacs -END MODULE MOD_Particle_TimeStep +END MODULE MOD_Particle_TimeStep diff --git a/src/particles/pic/analyze/pic_analyze.f90 b/src/particles/pic/analyze/pic_analyze.f90 index bcb83f108..a2c703655 100644 --- a/src/particles/pic/analyze/pic_analyze.f90 +++ b/src/particles/pic/analyze/pic_analyze.f90 @@ -55,9 +55,6 @@ SUBROUTINE VerifyDepositedCharge() #else USE MOD_PICDepo_Vars ,ONLY: PartSource #endif -#if USE_MPI -USE MOD_Particle_MPI_Vars ,ONLY: PartMPI -#endif /*USE_MPI*/ USE MOD_ChangeBasis ,ONLY: ChangeBasis3D ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -117,12 +114,12 @@ SUBROUTINE VerifyDepositedCharge() ! Collect info on MPI root process #if USE_MPI - IF(PartMPI%MPIRoot) THEN - CALL MPI_REDUCE(MPI_IN_PLACE , ChargeAnalytical , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , PartMPI%COMM , IERROR) - CALL MPI_REDUCE(MPI_IN_PLACE , ChargeNumerical , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , PartMPI%COMM , IERROR) + IF(MPIRoot) THEN + CALL MPI_REDUCE(MPI_IN_PLACE , ChargeAnalytical , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_PICLAS , IERROR) + CALL MPI_REDUCE(MPI_IN_PLACE , ChargeNumerical , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_PICLAS , IERROR) ELSE - CALL MPI_REDUCE(ChargeAnalytical , 0 , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , PartMPI%COMM , IERROR) - CALL MPI_REDUCE(ChargeNumerical , 0 , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , PartMPI%COMM , IERROR) + CALL MPI_REDUCE(ChargeAnalytical , 0 , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_PICLAS , IERROR) + CALL MPI_REDUCE(ChargeNumerical , 0 , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_PICLAS , IERROR) END IF #endif @@ -164,7 +161,6 @@ SUBROUTINE CalcDepositedCharge() #else USE MOD_PICDepo_Vars, ONLY:PartSource #endif -USE MOD_Particle_MPI_Vars, ONLY:PartMPI ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -213,14 +209,14 @@ SUBROUTINE CalcDepositedCharge() ! MPI Communication #if USE_MPI -IF (PartMPI%MPIRoot) THEN - CALL MPI_REDUCE(MPI_IN_PLACE,Charge , 2 , MPI_DOUBLE_PRECISION, MPI_SUM,0, PartMPI%COMM, IERROR) +IF (MPIRoot) THEN + CALL MPI_REDUCE(MPI_IN_PLACE,Charge , 2 , MPI_DOUBLE_PRECISION, MPI_SUM,0, MPI_COMM_PICLAS, IERROR) ELSE ! no Root - CALL MPI_REDUCE(Charge,RECBR ,2,MPI_DOUBLE_PRECISION,MPI_SUM,0,PartMPI%COMM, IERROR) + CALL MPI_REDUCE(Charge,RECBR ,2,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_PICLAS, IERROR) END IF #endif -IF (PartMPI%MPIRoot) THEN +IF (MPIRoot) THEN PartCharge(1)=Charge(1) ! absolute error PartCharge(2)=ABS(Charge(2)-Charge(1)) diff --git a/src/particles/pic/deposition/pic_depo.f90 b/src/particles/pic/deposition/pic_depo.f90 index b258b5d6a..5a212e060 100644 --- a/src/particles/pic/deposition/pic_depo.f90 +++ b/src/particles/pic/deposition/pic_depo.f90 @@ -382,7 +382,7 @@ SUBROUTINE InitializeDeposition() , MPI_INTEGER & , iProc & , 1999 & - , MPI_COMM_WORLD & + , MPI_COMM_PICLAS & , RecvRequestNonSymDepo(iProc) & , IERROR) END DO @@ -395,7 +395,7 @@ SUBROUTINE InitializeDeposition() , MPI_INTEGER & , iProc & , 1999 & - , MPI_COMM_WORLD & + , MPI_COMM_PICLAS & , SendRequestNonSymDepo(iProc) & , IERROR) END DO @@ -437,7 +437,7 @@ SUBROUTINE InitializeDeposition() , MPI_INTEGER & , NodeRecvDepoRankToGlobalRank(iProc) & , 666 & - , MPI_COMM_WORLD & + , MPI_COMM_PICLAS & , RecvRequest(iProc) & , IERROR) END DO @@ -464,7 +464,7 @@ SUBROUTINE InitializeDeposition() , MPI_INTEGER & , NodeSendDepoRankToGlobalRank(iProc) & , 666 & - , MPI_COMM_WORLD & + , MPI_COMM_PICLAS & , SendRequest(iProc) & , IERROR) END DO @@ -981,7 +981,7 @@ SUBROUTINE ExchangeNodeSourceExtTmp() , MPI_DOUBLE_PRECISION & , NodeRecvDepoRankToGlobalRank(iProc) & , 666 & - , MPI_COMM_WORLD & + , MPI_COMM_PICLAS & , RecvRequest(iProc) & , IERROR) END DO @@ -997,7 +997,7 @@ SUBROUTINE ExchangeNodeSourceExtTmp() , MPI_DOUBLE_PRECISION & , NodeSendDepoRankToGlobalRank(iProc) & , 666 & - , MPI_COMM_WORLD & + , MPI_COMM_PICLAS & , SendRequest(iProc) & , IERROR) END DO @@ -1298,7 +1298,7 @@ SUBROUTINE InitializePeriodicNodes(& , MPI_INTEGER & , iProc & , 1667 & - , MPI_COMM_WORLD & + , MPI_COMM_PICLAS & , RecvRequestNonSymDepo(iProc) & , IERROR) CALL MPI_ISEND( SendPeriodicNodes(iProc) & @@ -1306,7 +1306,7 @@ SUBROUTINE InitializePeriodicNodes(& , MPI_INTEGER & , iProc & , 1667 & - , MPI_COMM_WORLD & + , MPI_COMM_PICLAS & , SendRequestNonSymDepo(iProc) & , IERROR) END DO @@ -1329,7 +1329,7 @@ SUBROUTINE InitializePeriodicNodes(& , MPI_INTEGER & , iProc & , 667 & - , MPI_COMM_WORLD & + , MPI_COMM_PICLAS & , RecvRequestNonSymDepo(iProc) & , IERROR) END IF @@ -1339,7 +1339,7 @@ SUBROUTINE InitializePeriodicNodes(& , MPI_INTEGER & , iProc & , 667 & - , MPI_COMM_WORLD & + , MPI_COMM_PICLAS & , SendRequestNonSymDepo(iProc) & , IERROR) END IF @@ -1437,7 +1437,7 @@ SUBROUTINE InitializePeriodicNodes(& , MPI_INTEGER & , iProc & , 1667 & - , MPI_COMM_WORLD & + , MPI_COMM_PICLAS & , RecvRequestNonSymDepo(iProc) & , IERROR) CALL MPI_ISEND( SendPeriodicNodes(iProc) & @@ -1445,7 +1445,7 @@ SUBROUTINE InitializePeriodicNodes(& , MPI_INTEGER & , iProc & , 1667 & - , MPI_COMM_WORLD & + , MPI_COMM_PICLAS & , SendRequestNonSymDepo(iProc) & , IERROR) END DO @@ -1468,7 +1468,7 @@ SUBROUTINE InitializePeriodicNodes(& , MPI_INTEGER & , iProc & , 667 & - , MPI_COMM_WORLD & + , MPI_COMM_PICLAS & , RecvRequestNonSymDepo(iProc) & , IERROR) END IF @@ -1478,7 +1478,7 @@ SUBROUTINE InitializePeriodicNodes(& , MPI_INTEGER & , iProc & , 667 & - , MPI_COMM_WORLD & + , MPI_COMM_PICLAS & , SendRequestNonSymDepo(iProc) & , IERROR) END IF @@ -1520,7 +1520,7 @@ SUBROUTINE InitializePeriodicNodes(& , MPI_INTEGER & , iProc & , 667 & - , MPI_COMM_WORLD & + , MPI_COMM_PICLAS & , RecvRequestNonSymDepo(iProc) & , IERROR) END IF @@ -1530,7 +1530,7 @@ SUBROUTINE InitializePeriodicNodes(& , MPI_INTEGER & , iProc & , 667 & - , MPI_COMM_WORLD & + , MPI_COMM_PICLAS & , SendRequestNonSymDepo(iProc) & , IERROR) END IF @@ -1648,7 +1648,7 @@ SUBROUTINE InitializePeriodicNodes(& , MPI_INTEGER & , iProc & , 1667 & - , MPI_COMM_WORLD & + , MPI_COMM_PICLAS & , RecvRequestNonSymDepo(iProc) & , IERROR) CALL MPI_ISEND( SendPeriodicNodes(iProc) & @@ -1656,7 +1656,7 @@ SUBROUTINE InitializePeriodicNodes(& , MPI_INTEGER & , iProc & , 1667 & - , MPI_COMM_WORLD & + , MPI_COMM_PICLAS & , SendRequestNonSymDepo(iProc) & , IERROR) END DO @@ -1679,7 +1679,7 @@ SUBROUTINE InitializePeriodicNodes(& , MPI_INTEGER & , iProc & , 667 & - , MPI_COMM_WORLD & + , MPI_COMM_PICLAS & , RecvRequestNonSymDepo(iProc) & , IERROR) END IF @@ -1689,7 +1689,7 @@ SUBROUTINE InitializePeriodicNodes(& , MPI_INTEGER & , iProc & , 667 & - , MPI_COMM_WORLD & + , MPI_COMM_PICLAS & , SendRequestNonSymDepo(iProc) & , IERROR) END IF @@ -1733,7 +1733,7 @@ SUBROUTINE InitializePeriodicNodes(& , MPI_INTEGER & , iProc & , 667 & - , MPI_COMM_WORLD & + , MPI_COMM_PICLAS & , RecvRequestNonSymDepo(iProc) & , IERROR) END IF @@ -1743,7 +1743,7 @@ SUBROUTINE InitializePeriodicNodes(& , MPI_INTEGER & , iProc & , 667 & - , MPI_COMM_WORLD & + , MPI_COMM_PICLAS & , SendRequestNonSymDepo(iProc) & , IERROR) END IF @@ -1786,7 +1786,7 @@ SUBROUTINE InitializePeriodicNodes(& IF (ANY(PeriodicNodeMap(iNode)%Mapping.EQ.0)) THEN DO jNode = 1, PeriodicNodeMap(iNode)%nPeriodicNodes IF (PeriodicNodeMap(iNode)%Mapping(jNode).EQ.0) THEN - DO kNode =1, jNode - 1 + DO kNode =1, jNode - 1 zGlobalNode = PeriodicNodeMap(iNode)%Mapping(kNode) DO zNode = 1, PeriodicNodeMap(zGlobalNode)%nPeriodicNodes IF ((PeriodicNodeMap(zGlobalNode)%Mapping(zNode).NE.0).AND.(PeriodicNodeMap(zGlobalNode)%Mapping(zNode).NE.iNode)) THEN diff --git a/src/particles/pic/deposition/pic_depo_method.f90 b/src/particles/pic/deposition/pic_depo_method.f90 index 895e9e54e..dd4951ca6 100644 --- a/src/particles/pic/deposition/pic_depo_method.f90 +++ b/src/particles/pic/deposition/pic_depo_method.f90 @@ -545,7 +545,7 @@ SUBROUTINE DepositionMethod_CVWM(doParticle_In, stage_opt) , MPI_DOUBLE_PRECISION & , NodeRecvDepoRankToGlobalRank(iProc) & , 666 & - , MPI_COMM_WORLD & + , MPI_COMM_PICLAS & , RecvRequest(iProc) & , IERROR) END DO @@ -561,7 +561,7 @@ SUBROUTINE DepositionMethod_CVWM(doParticle_In, stage_opt) , MPI_DOUBLE_PRECISION & , NodeSendDepoRankToGlobalRank(iProc) & , 666 & - , MPI_COMM_WORLD & + , MPI_COMM_PICLAS & , SendRequest(iProc) & , IERROR) END DO @@ -593,7 +593,7 @@ SUBROUTINE DepositionMethod_CVWM(doParticle_In, stage_opt) , MPI_DOUBLE_PRECISION & , NodeRecvDepoRankToGlobalRank(iProc) & , 666 & - , MPI_COMM_WORLD & + , MPI_COMM_PICLAS & , RecvRequest(iProc) & , IERROR) END DO @@ -608,7 +608,7 @@ SUBROUTINE DepositionMethod_CVWM(doParticle_In, stage_opt) , MPI_DOUBLE_PRECISION & , NodeSendDepoRankToGlobalRank(iProc) & , 666 & - , MPI_COMM_WORLD & + , MPI_COMM_PICLAS & , SendRequest(iProc) & , IERROR) END DO @@ -794,7 +794,7 @@ SUBROUTINE DepositionMethod_SF(doParticle_In, stage_opt) , MPI_DOUBLE_PRECISION & , ShapeMapping(iProc)%Rank & , 2001 & - , MPI_COMM_WORLD & + , MPI_COMM_PICLAS & , RecvRequest(iProc) & , IERROR) ! IF (myComputeNodeRank.NE.0) THEN @@ -803,7 +803,7 @@ SUBROUTINE DepositionMethod_SF(doParticle_In, stage_opt) , MPI_DOUBLE_PRECISION & , ShapeMapping(iProc)%Rank & , 2001 & - , MPI_COMM_WORLD & + , MPI_COMM_PICLAS & , SendRequest(iProc) & , IERROR) ! END IF diff --git a/src/particles/pic/deposition/pic_depo_tools.f90 b/src/particles/pic/deposition/pic_depo_tools.f90 index 10440aa81..035664778 100644 --- a/src/particles/pic/deposition/pic_depo_tools.f90 +++ b/src/particles/pic/deposition/pic_depo_tools.f90 @@ -378,7 +378,7 @@ SUBROUTINE ReadTimeAverage(FileName) IF(.NOT.FILEEXISTS(FileName)) CALL abort(__STAMP__, & 'TimeAverage-File "'//TRIM(FileName)//'" does not exist',999,999.) END IF -CALL OpenDataFile(TRIM(FileName),create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_WORLD) +CALL OpenDataFile(TRIM(FileName),create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_PICLAS) ! get attributes CALL DatasetExists(File_ID,'DG_Solution',SolutionExists) diff --git a/src/particles/pic/interpolation/init_BGField.f90 b/src/particles/pic/interpolation/init_BGField.f90 index c4cbc6338..df2504d1f 100644 --- a/src/particles/pic/interpolation/init_BGField.f90 +++ b/src/particles/pic/interpolation/init_BGField.f90 @@ -129,7 +129,7 @@ SUBROUTINE InitializeBackgroundField ELSE BGFieldScaling = GETREAL('PIC-BGFieldScaling','1.') ! 2b) Read-in the parameters from the BGField file - CALL OpenDataFile(BGFileName,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_WORLD) + CALL OpenDataFile(BGFileName,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_PICLAS) CALL DatasetExists(File_ID,'BGField',BGFieldExists) ! backward compatibility CALL DatasetExists(File_ID,'DG_Solution',DG_SolutionExists) IF(BGFieldExists) THEN diff --git a/src/particles/restart/particle_readin.f90 b/src/particles/restart/particle_readin.f90 index 529cc4cda..7349770ce 100644 --- a/src/particles/restart/particle_readin.f90 +++ b/src/particles/restart/particle_readin.f90 @@ -156,7 +156,7 @@ SUBROUTINE ParticleReadin() CALL MPI_TYPE_CREATE_STRUCT(1,MPI_LENGTH,MPI_DISPLACEMENT,MPI_TYPE,MPI_STRUCT,iError) CALL MPI_TYPE_COMMIT(MPI_STRUCT,iError) - CALL MPI_ALLTOALLV(PartSourceLB,counts_send,disp_send,MPI_STRUCT,PartSource_HDF5,counts_recv,disp_recv,MPI_STRUCT,MPI_COMM_WORLD,iError) + CALL MPI_ALLTOALLV(PartSourceLB,counts_send,disp_send,MPI_STRUCT,PartSource_HDF5,counts_recv,disp_recv,MPI_STRUCT,MPI_COMM_PICLAS,iError) END ASSOCIATE DEALLOCATE(PartSourceLB) @@ -212,7 +212,7 @@ SUBROUTINE ParticleReadin() CALL MPI_TYPE_CREATE_STRUCT(1,MPI_LENGTH,MPI_DISPLACEMENT,MPI_TYPE,MPI_STRUCT,iError) CALL MPI_TYPE_COMMIT(MPI_STRUCT,iError) - CALL MPI_ALLTOALLV(NodeSourceExtEquiLB,counts_send,disp_send,MPI_STRUCT,NodeSourceExtEquiLBTmp,counts_recv,disp_recv,MPI_STRUCT,MPI_COMM_WORLD,iError) + CALL MPI_ALLTOALLV(NodeSourceExtEquiLB,counts_send,disp_send,MPI_STRUCT,NodeSourceExtEquiLBTmp,counts_recv,disp_recv,MPI_STRUCT,MPI_COMM_PICLAS,iError) END ASSOCIATE DEALLOCATE(NodeSourceExtEquiLB) ! Loop over all elements and store absolute charge values in equidistantly distributed nodes of PP_N=1 @@ -285,7 +285,7 @@ SUBROUTINE ParticleReadin() CALL MPI_TYPE_COMMIT(MPI_STRUCT,iError) ! Communicate PartInt over MPI - CALL MPI_ALLTOALLV(PartInt,counts_send,disp_send,MPI_STRUCT,PartIntTmp,counts_recv,disp_recv,MPI_STRUCT,MPI_COMM_WORLD,iError) + CALL MPI_ALLTOALLV(PartInt,counts_send,disp_send,MPI_STRUCT,PartIntTmp,counts_recv,disp_recv,MPI_STRUCT,MPI_COMM_PICLAS,iError) END ASSOCIATE ! Calculate the PartInt deltas @@ -336,7 +336,7 @@ SUBROUTINE ParticleReadin() CALL MPI_TYPE_COMMIT(MPI_STRUCT,iError) ! Communicate PartData over MPI - CALL MPI_ALLTOALLV(PartData,counts_send,disp_send,MPI_STRUCT,PartDataTmp,counts_recv,disp_recv,MPI_STRUCT,MPI_COMM_WORLD,iError) + CALL MPI_ALLTOALLV(PartData,counts_send,disp_send,MPI_STRUCT,PartDataTmp,counts_recv,disp_recv,MPI_STRUCT,MPI_COMM_PICLAS,iError) END ASSOCIATE CALL MOVE_ALLOC(PartDataTmp,PartData) PartDataExists = .TRUE. @@ -361,7 +361,7 @@ SUBROUTINE ParticleReadin() CALL MPI_TYPE_COMMIT(MPI_STRUCT,iError) ! Communicate VibQuantData over MPI - CALL MPI_ALLTOALLV(VibQuantData,counts_send,disp_send,MPI_STRUCT,VibQuantDataTmp,counts_recv,disp_recv,MPI_STRUCT,MPI_COMM_WORLD,iError) + CALL MPI_ALLTOALLV(VibQuantData,counts_send,disp_send,MPI_STRUCT,VibQuantDataTmp,counts_recv,disp_recv,MPI_STRUCT,MPI_COMM_PICLAS,iError) END ASSOCIATE CALL MOVE_ALLOC(VibQuantDataTmp,VibQuantData) END IF @@ -383,7 +383,7 @@ SUBROUTINE ParticleReadin() CALL MPI_TYPE_COMMIT(MPI_STRUCT,iError) ! Communicate ElecDistriData over MPI - CALL MPI_ALLTOALLV(ElecDistriData,counts_send,disp_send,MPI_STRUCT,ElecDistriDataTmp,counts_recv,disp_recv,MPI_STRUCT,MPI_COMM_WORLD,iError) + CALL MPI_ALLTOALLV(ElecDistriData,counts_send,disp_send,MPI_STRUCT,ElecDistriDataTmp,counts_recv,disp_recv,MPI_STRUCT,MPI_COMM_PICLAS,iError) END ASSOCIATE CALL MOVE_ALLOC(ElecDistriDataTmp,ElecDistriData) END IF @@ -405,7 +405,7 @@ SUBROUTINE ParticleReadin() CALL MPI_TYPE_COMMIT(MPI_STRUCT,iError) ! Communicate AD_Data over MPI - CALL MPI_ALLTOALLV(AD_Data,counts_send,disp_send,MPI_STRUCT,AD_DataTmp,counts_recv,disp_recv,MPI_STRUCT,MPI_COMM_WORLD,iError) + CALL MPI_ALLTOALLV(AD_Data,counts_send,disp_send,MPI_STRUCT,AD_DataTmp,counts_recv,disp_recv,MPI_STRUCT,MPI_COMM_PICLAS,iError) END ASSOCIATE CALL MOVE_ALLOC(AD_DataTmp,AD_Data) END IF @@ -426,7 +426,7 @@ SUBROUTINE ParticleReadin() IF(.NOT.RestartNullifySolution)THEN ! Use the solution in the restart file !-- read PartSource if relaxation is performed (might be needed for RestartHDG) IF (DoDeposition .AND. RelaxDeposition) THEN - CALL OpenDataFile(RestartFile,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_WORLD) + CALL OpenDataFile(RestartFile,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_PICLAS) CALL DatasetExists(File_ID,'DG_Source',DGSourceExists) IF(DGSourceExists)THEN IF(.NOT.InterpolateSolution)THEN! No interpolation needed, read solution directly from file @@ -482,7 +482,7 @@ SUBROUTINE ParticleReadin() END DO END IF - CALL OpenDataFile(RestartFile,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_WORLD) + CALL OpenDataFile(RestartFile,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_PICLAS) ! ------------------------------------------------ ! NodeSourceExt (external/additional charge source terms) ! ------------------------------------------------ diff --git a/src/particles/restart/particle_restart.f90 b/src/particles/restart/particle_restart.f90 index aec9ecfac..cb5922bd3 100644 --- a/src/particles/restart/particle_restart.f90 +++ b/src/particles/restart/particle_restart.f90 @@ -75,7 +75,6 @@ SUBROUTINE ParticleRestart() #endif /*USE_HDG*/ ! MPI #if USE_MPI -USE MOD_Particle_MPI_Vars ,ONLY: PartMPI USE MOD_Particle_Vars ,ONLY: PartDataSize #endif /*USE_MPI*/ USE MOD_Particle_Vars ,ONLY: VibQuantData,ElecDistriData,AD_Data @@ -112,14 +111,14 @@ SUBROUTINE ParticleRestart() INTEGER,ALLOCATABLE :: IndexOfFoundParticles(:),CompleteIndexOfFoundParticles(:) INTEGER :: CompleteNbrOfLost,CompleteNbrOfFound,CompleteNbrOfDuplicate REAL, ALLOCATABLE :: RecBuff(:,:) -INTEGER :: TotalNbrOfMissingParticles(0:PartMPI%nProcs-1), Displace(0:PartMPI%nProcs-1),CurrentPartNum -INTEGER :: OffsetTotalNbrOfMissingParticles(0:PartMPI%nProcs-1) -INTEGER :: NbrOfFoundParts, RecCount(0:PartMPI%nProcs-1) +INTEGER :: TotalNbrOfMissingParticles(0:nProcessors-1), Displace(0:nProcessors-1),CurrentPartNum +INTEGER :: OffsetTotalNbrOfMissingParticles(0:nProcessors-1) +INTEGER :: NbrOfFoundParts, RecCount(0:nProcessors-1) INTEGER, ALLOCATABLE :: SendBuffPoly(:), RecBuffPoly(:) REAL, ALLOCATABLE :: SendBuffAmbi(:), RecBuffAmbi(:), SendBuffElec(:), RecBuffElec(:) -INTEGER :: LostPartsPoly(0:PartMPI%nProcs-1), DisplacePoly(0:PartMPI%nProcs-1) -INTEGER :: LostPartsElec(0:PartMPI%nProcs-1), DisplaceElec(0:PartMPI%nProcs-1) -INTEGER :: LostPartsAmbi(0:PartMPI%nProcs-1), DisplaceAmbi(0:PartMPI%nProcs-1) +INTEGER :: LostPartsPoly(0:nProcessors-1), DisplacePoly(0:nProcessors-1) +INTEGER :: LostPartsElec(0:nProcessors-1), DisplaceElec(0:nProcessors-1) +INTEGER :: LostPartsAmbi(0:nProcessors-1), DisplaceAmbi(0:nProcessors-1) INTEGER :: iProc #endif /*USE_MPI*/ !=================================================================================================================================== @@ -444,12 +443,12 @@ SUBROUTINE ParticleRestart() ! Step 2: All particles that are not found within MyProc need to be communicated to the others and located there ! Combine number of lost particles of all processes and allocate variables ! Note: Particles that are lost on MyProc are also searched for here again - CALL MPI_ALLGATHER(NbrOfLostParticles, 1, MPI_INTEGER, TotalNbrOfMissingParticles, 1, MPI_INTEGER, PartMPI%COMM, IERROR) + CALL MPI_ALLGATHER(NbrOfLostParticles, 1, MPI_INTEGER, TotalNbrOfMissingParticles, 1, MPI_INTEGER, MPI_COMM_PICLAS, IERROR) NbrOfLostParticles=0 IF (useDSMC) THEN - IF (DSMC%NumPolyatomMolecs.GT.0) CALL MPI_ALLGATHER(CounterPoly, 1, MPI_INTEGER, LostPartsPoly, 1, MPI_INTEGER, PartMPI%COMM, IERROR) - IF (DSMC%ElectronicModel.EQ.2) CALL MPI_ALLGATHER(CounterElec, 1, MPI_INTEGER, LostPartsElec, 1, MPI_INTEGER, PartMPI%COMM, IERROR) - IF (DSMC%DoAmbipolarDiff) CALL MPI_ALLGATHER(CounterAmbi, 1, MPI_INTEGER, LostPartsAmbi, 1, MPI_INTEGER, PartMPI%COMM, IERROR) + IF (DSMC%NumPolyatomMolecs.GT.0) CALL MPI_ALLGATHER(CounterPoly, 1, MPI_INTEGER, LostPartsPoly, 1, MPI_INTEGER, MPI_COMM_PICLAS, IERROR) + IF (DSMC%ElectronicModel.EQ.2) CALL MPI_ALLGATHER(CounterElec, 1, MPI_INTEGER, LostPartsElec, 1, MPI_INTEGER, MPI_COMM_PICLAS, IERROR) + IF (DSMC%DoAmbipolarDiff) CALL MPI_ALLGATHER(CounterAmbi, 1, MPI_INTEGER, LostPartsAmbi, 1, MPI_INTEGER, MPI_COMM_PICLAS, IERROR) END IF ! useDSMC !TotalNbrOfMissingParticlesSum = SUM(INT(TotalNbrOfMissingParticles,8)) @@ -460,9 +459,9 @@ SUBROUTINE ParticleRestart() ! Set offsets OffsetTotalNbrOfMissingParticles(0) = 0 - DO iProc = 1, PartMPI%nProcs-1 + DO iProc = 1, nProcessors-1 OffsetTotalNbrOfMissingParticles(iProc) = OffsetTotalNbrOfMissingParticles(iProc-1) + TotalNbrOfMissingParticles(iProc-1) - END DO ! iProc = 0, PartMPI%nProcs-1 + END DO ! iProc = 0, nProcessors-1 ALLOCATE(RecBuff(PartDataSize,1:TotalNbrOfMissingParticlesSum)) IF (useDSMC) THEN @@ -484,7 +483,7 @@ SUBROUTINE ParticleRestart() END IF ! useDSMC ! Fill SendBuffer - NbrOfMissingParticles = OffsetTotalNbrOfMissingParticles(PartMPI%MyRank) + 1 + NbrOfMissingParticles = OffsetTotalNbrOfMissingParticles(myRank) + 1 CounterPoly = 0 CounterAmbi = 0 CounterElec = 0 @@ -550,7 +549,7 @@ SUBROUTINE ParticleRestart() CounterElec = 0 CounterAmbi = 0 - DO iProc = 0, PartMPI%nProcs-1 + DO iProc = 0, nProcessors-1 RecCount(iProc) = TotalNbrOfMissingParticles(iProc) Displace(iProc) = NbrOfMissingParticles NbrOfMissingParticles = NbrOfMissingParticles + TotalNbrOfMissingParticles(iProc) @@ -572,7 +571,7 @@ SUBROUTINE ParticleRestart() CounterAmbi = CounterAmbi + LostPartsAmbi(iProc) END IF END IF ! useDSMC - END DO ! iProc = 0, PartMPI%nProcs-1 + END DO ! iProc = 0, nProcessors-1 CALL MPI_ALLGATHERV( MPI_IN_PLACE & , 0 & @@ -581,19 +580,19 @@ SUBROUTINE ParticleRestart() , PartDataSize*TotalNbrOfMissingParticles(:) & , PartDataSize*OffsetTotalNbrOfMissingParticles(:) & , MPI_DOUBLE_PRECISION & - , PartMPI%COMM & + , MPI_COMM_PICLAS & , IERROR) IF (useDSMC) THEN ! Polyatomic - IF (DSMC%NumPolyatomMolecs.GT.0) CALL MPI_ALLGATHERV(SendBuffPoly, LostPartsPoly(PartMPI%MyRank), MPI_INTEGER, & - RecBuffPoly, LostPartsPoly, DisplacePoly, MPI_INTEGER, PartMPI%COMM, IERROR) + IF (DSMC%NumPolyatomMolecs.GT.0) CALL MPI_ALLGATHERV(SendBuffPoly, LostPartsPoly(myRank), MPI_INTEGER, & + RecBuffPoly, LostPartsPoly, DisplacePoly, MPI_INTEGER, MPI_COMM_PICLAS, IERROR) ! Electronic - IF (DSMC%ElectronicModel.EQ.2) CALL MPI_ALLGATHERV(SendBuffElec, LostPartsElec(PartMPI%MyRank), MPI_INTEGER, & - RecBuffElec, LostPartsElec, DisplaceElec, MPI_DOUBLE_PRECISION, PartMPI%COMM, IERROR) + IF (DSMC%ElectronicModel.EQ.2) CALL MPI_ALLGATHERV(SendBuffElec, LostPartsElec(myRank), MPI_INTEGER, & + RecBuffElec, LostPartsElec, DisplaceElec, MPI_DOUBLE_PRECISION, MPI_COMM_PICLAS, IERROR) ! Ambipolar Diffusion - IF (DSMC%DoAmbipolarDiff) CALL MPI_ALLGATHERV(SendBuffAmbi, LostPartsAmbi(PartMPI%MyRank), MPI_INTEGER, & - RecBuffAmbi, LostPartsAmbi, DisplaceAmbi, MPI_DOUBLE_PRECISION, PartMPI%COMM, IERROR) + IF (DSMC%DoAmbipolarDiff) CALL MPI_ALLGATHERV(SendBuffAmbi, LostPartsAmbi(myRank), MPI_INTEGER, & + RecBuffAmbi, LostPartsAmbi, DisplaceAmbi, MPI_DOUBLE_PRECISION, MPI_COMM_PICLAS, IERROR) END IF ! Keep track which particles are found on the current proc @@ -622,8 +621,8 @@ SUBROUTINE ParticleRestart() ! Do not search particles twice: Skip my own particles, because these have already been searched for before they are ! sent to all other procs - ASSOCIATE( myFirst => OffsetTotalNbrOfMissingParticles(PartMPI%MyRank) + 1 ,& - myLast => OffsetTotalNbrOfMissingParticles(PartMPI%MyRank) + TotalNbrOfMissingParticles(PartMPI%MyRank)) + ASSOCIATE( myFirst => OffsetTotalNbrOfMissingParticles(myRank) + 1 ,& + myLast => OffsetTotalNbrOfMissingParticles(myRank) + TotalNbrOfMissingParticles(myRank)) IF((iPart.GE.myFirst).AND.(iPart.LE.myLast))THEN IndexOfFoundParticles(iPart) = 0 CYCLE @@ -721,9 +720,9 @@ SUBROUTINE ParticleRestart() ! Combine number of found particles to make sure none are lost completely or found twice IF(MPIroot)THEN - CALL MPI_REDUCE(IndexOfFoundParticles,CompleteIndexOfFoundParticles,TotalNbrOfMissingParticlesSum,MPI_INTEGER,MPI_SUM,0,PartMPI%COMM,IERROR) + CALL MPI_REDUCE(IndexOfFoundParticles,CompleteIndexOfFoundParticles,TotalNbrOfMissingParticlesSum,MPI_INTEGER,MPI_SUM,0,MPI_COMM_PICLAS,IERROR) ELSE - CALL MPI_REDUCE(IndexOfFoundParticles,0 ,TotalNbrOfMissingParticlesSum,MPI_INTEGER,MPI_SUM,0,PartMPI%COMM,IERROR) + CALL MPI_REDUCE(IndexOfFoundParticles,0 ,TotalNbrOfMissingParticlesSum,MPI_INTEGER,MPI_SUM,0,MPI_COMM_PICLAS,IERROR) END IF CompleteNbrOfFound = 0 @@ -766,7 +765,7 @@ SUBROUTINE ParticleRestart() DEALLOCATE(CompleteIndexOfFoundParticles) END IF ! MPIRoot - CALL MPI_BCAST(NbrOfLostParticlesTotal,1,MPI_INTEGER,0,MPI_COMM_WORLD,iError) + CALL MPI_BCAST(NbrOfLostParticlesTotal,1,MPI_INTEGER,0,MPI_COMM_PICLAS,iError) NbrOfLostParticlesTotal_old = NbrOfLostParticlesTotal END IF ! TotalNbrOfMissingParticlesSum.GT.0 @@ -1112,7 +1111,7 @@ SUBROUTINE MacroscopicRestart() SWRITE(UNIT_stdOut,*) 'Using macroscopic values from file: ',TRIM(MacroRestartFileName) -CALL OpenDataFile(MacroRestartFileName,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_WORLD) +CALL OpenDataFile(MacroRestartFileName,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_PICLAS) ! Check if the provided file is a DSMC state file. CALL ReadAttribute(File_ID,'File_Type',1,StrScalar=File_Type) diff --git a/src/particles/sampling/particle_sampling_adaptive.f90 b/src/particles/sampling/particle_sampling_adaptive.f90 index 157ebc19d..05f912a84 100644 --- a/src/particles/sampling/particle_sampling_adaptive.f90 +++ b/src/particles/sampling/particle_sampling_adaptive.f90 @@ -81,9 +81,6 @@ SUBROUTINE InitAdaptiveBCSampling() USE MOD_Particle_Mesh_Vars ,ONLY: SideInfo_Shared, ElemVolume_Shared USE MOD_LoadBalance_Vars ,ONLY: DoLoadBalance, PerformLoadBalance, UseH5IOLoadBalance USE MOD_Mesh_Tools ,ONLY: GetCNElemID -#if USE_MPI -USE MOD_Particle_MPI_Vars ,ONLY: PartMPI -#endif /*USE_MPI*/ ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -166,16 +163,16 @@ SUBROUTINE InitAdaptiveBCSampling() #if USE_MPI IF(UseCircularInflow) THEN - IF(PartMPI%MPIRoot)THEN - CALL MPI_REDUCE(MPI_IN_PLACE,AdaptBCAreaSurfaceFlux,nSpecies*nSurfacefluxBCs,MPI_DOUBLE_PRECISION,MPI_SUM,0,PartMPI%COMM,iError) + IF(MPIRoot)THEN + CALL MPI_REDUCE(MPI_IN_PLACE,AdaptBCAreaSurfaceFlux,nSpecies*nSurfacefluxBCs,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_PICLAS,iError) ELSE - CALL MPI_REDUCE(AdaptBCAreaSurfaceFlux,0,nSpecies*nSurfacefluxBCs,MPI_DOUBLE_PRECISION,MPI_SUM,0,PartMPI%COMM,iError) + CALL MPI_REDUCE(AdaptBCAreaSurfaceFlux,0,nSpecies*nSurfacefluxBCs,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_PICLAS,iError) END IF END IF #endif /*USE_MPI*/ #if USE_MPI -CALL MPI_ALLREDUCE(MPI_IN_PLACE,AdaptBCVolSurfaceFlux,nSpecies*nSurfacefluxBCs,MPI_DOUBLE_PRECISION,MPI_SUM,PartMPI%COMM,iError) +CALL MPI_ALLREDUCE(MPI_IN_PLACE,AdaptBCVolSurfaceFlux,nSpecies*nSurfacefluxBCs,MPI_DOUBLE_PRECISION,MPI_SUM,MPI_COMM_PICLAS,iError) #endif /*USE_MPI*/ ! 1b) Add elements for the porous BCs @@ -214,9 +211,9 @@ SUBROUTINE InitAdaptiveBCSampling() #if USE_MPI ! Gather the number of sampling elements per proc -CALL MPI_GATHER(AdaptBCSampleElemNum,1,MPI_INTEGER_INT_KIND,offSetElemAdaptBCSampleMPI,1,MPI_INTEGER_INT_KIND,0,MPI_COMM_WORLD,iError) +CALL MPI_GATHER(AdaptBCSampleElemNum,1,MPI_INTEGER_INT_KIND,offSetElemAdaptBCSampleMPI,1,MPI_INTEGER_INT_KIND,0,MPI_COMM_PICLAS,iError) ! Distribute the number of elements per proc to each each proc -CALL MPI_BCAST(offSetElemAdaptBCSampleMPI,nProcessors,MPI_INTEGER,0,MPI_COMM_WORLD,iERROR) +CALL MPI_BCAST(offSetElemAdaptBCSampleMPI,nProcessors,MPI_INTEGER,0,MPI_COMM_PICLAS,iERROR) ! Determine the offset for the sampling elements IF(myRank.EQ.0) THEN offSetElemAdaptBCSample = 0 @@ -292,7 +289,7 @@ SUBROUTINE InitAdaptiveBCSampling() ! 4) If restart is done, check if adaptiveinfo exists in state, read it in and write to AdaptBCMacroValues IF (DoRestart) THEN - CALL OpenDataFile(RestartFile,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_WORLD) + CALL OpenDataFile(RestartFile,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_PICLAS) ! read local ParticleInfo from HDF5 CALL DatasetExists(File_ID,'AdaptiveInfo',AdaptiveDataExists) IF(AdaptiveDataExists)THEN @@ -588,7 +585,7 @@ SUBROUTINE AdaptiveBCSampling(initSampling_opt,initTruncAverage_opt) RelaxationFactor = AdaptBCRelaxFactor IF(AdaptBCSampIter.GT.0) THEN IF(AdaptBCTruncAverage.AND.(RestartSampIter.GT.0).AND.(RestartSampIter.LT.AdaptBCSampIter)) THEN - ! Truncated average: get the correct number of samples to calculate the average number density while the + ! Truncated average: get the correct number of samples to calculate the average number density while the ! sampling array is populated SamplingIteration = RestartSampIter ELSE @@ -665,9 +662,9 @@ SUBROUTINE AdaptiveBCSampling(initSampling_opt,initTruncAverage_opt) ! MPI Communication #if USE_MPI IF(MPIRoot)THEN - CALL MPI_REDUCE(MPI_IN_PLACE,AdaptBCMeanValues,8*nSpecies*nSurfacefluxBCs,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_WORLD,iError) + CALL MPI_REDUCE(MPI_IN_PLACE,AdaptBCMeanValues,8*nSpecies*nSurfacefluxBCs,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_PICLAS,iError) ELSE - CALL MPI_REDUCE(AdaptBCMeanValues,0.,8*nSpecies*nSurfacefluxBCs,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_WORLD,iError) + CALL MPI_REDUCE(AdaptBCMeanValues,0.,8*nSpecies*nSurfacefluxBCs,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_PICLAS,iError) END IF #endif /*USE_MPI*/ IF(MPIRoot) THEN @@ -726,8 +723,8 @@ SUBROUTINE AdaptiveBCSampling(initSampling_opt,initTruncAverage_opt) END DO END IF #if USE_MPI - CALL MPI_BCAST(AdaptBCMeanValues,8*nSpecies*nSurfacefluxBCs, MPI_DOUBLE_PRECISION,0,MPI_COMM_WORLD,iERROR) - CALL MPI_BCAST(AdaptBCAverageMacroVal,3*nSpecies*nSurfacefluxBCs, MPI_DOUBLE_PRECISION,0,MPI_COMM_WORLD,iERROR) + CALL MPI_BCAST(AdaptBCMeanValues,8*nSpecies*nSurfacefluxBCs, MPI_DOUBLE_PRECISION,0,MPI_COMM_PICLAS,iERROR) + CALL MPI_BCAST(AdaptBCAverageMacroVal,3*nSpecies*nSurfacefluxBCs, MPI_DOUBLE_PRECISION,0,MPI_COMM_PICLAS,iERROR) #endif /*USE_MPI*/ END IF END IF diff --git a/src/particles/tracking/particle_tracing.f90 b/src/particles/tracking/particle_tracing.f90 index 54f6d830c..c1414fcf5 100644 --- a/src/particles/tracking/particle_tracing.f90 +++ b/src/particles/tracking/particle_tracing.f90 @@ -594,7 +594,7 @@ SUBROUTINE ParticleTracing() !---------------------------------------------CODE_ANALYZE-------------------------------------------------------------------------- ! check if particle is still inside of bounding box of domain and in element #if USE_MPI -CALL MPI_BARRIER(MPI_COMM_WORLD,iError) +CALL MPI_BARRIER(MPI_COMM_PICLAS,iError) #endif /*USE_MPI*/ DO iPart=1,PDM%ParticleVecLength #ifdef IMPA diff --git a/src/particles/ttm/ttm_init.f90 b/src/particles/ttm/ttm_init.f90 index 4bd85de33..9d7c0f9dd 100644 --- a/src/particles/ttm/ttm_init.f90 +++ b/src/particles/ttm/ttm_init.f90 @@ -114,9 +114,6 @@ SUBROUTINE InitTTM() USE MOD_ReadInTools USE MOD_TTM_Vars USE MOD_Restart_Vars ,ONLY: DoRestart -#if USE_MPI -USE MOD_Particle_MPI_Vars ,ONLY: PartMPI -#endif /*USE_MPI*/ USE MOD_Mesh_Vars ,ONLY: ElemBaryNGeo USE MOD_Globals_Vars ,ONLY: BoltzmannConst,eps0 USE MOD_IO_HDF5 ,ONLY: AddToElemData,ElementOut @@ -196,7 +193,7 @@ SUBROUTINE InitTTM() ElemIsDone=.FALSE. LBWRITE(UNIT_stdOut,'(A,A)') " Reading TTM data from file (TTMFile): ",TRIM(TTMFile) #if USE_MPI - IF(.NOT.PartMPI%MPIROOT)THEN + IF(.NOT.MPIRoot)THEN CALL abort(& __STAMP__& ,'ERROR: Cannot SetParticlePosition in multi-core environment for SpaceIC=IMD!') diff --git a/src/posti/dmd/dmd_main.f90 b/src/posti/dmd/dmd_main.f90 index e52300131..08e17bc94 100644 --- a/src/posti/dmd/dmd_main.f90 +++ b/src/posti/dmd/dmd_main.f90 @@ -147,7 +147,7 @@ SUBROUTINE InitDMD() END IF ! nModes .GT. (nFiles-1) ! Open the first statefile to read necessary attributes -CALL OpenDataFile(Args(2),create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_WORLD) +CALL OpenDataFile(Args(2),create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_PICLAS) CALL ReadAttribute(File_ID,'MeshFile', 1,StrScalar=MeshFile_state) CALL ReadAttribute(File_ID,'Project_Name',1,StrScalar=ProjectName) CALL ReadAttribute(File_ID,'Time', 1,RealScalar=starttime) @@ -202,7 +202,7 @@ SUBROUTINE InitDMD() !WRITE(UNIT_stdOut,'(132("="))') ! Read Statefiles - CALL OpenDataFile(Args(iFile),create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_WORLD) + CALL OpenDataFile(Args(iFile),create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_PICLAS) offset=0 CALL ReadAttribute(File_ID,'Time', 1,RealScalar=time) CALL ReadArray('DG_Solution',5,& @@ -225,7 +225,7 @@ SUBROUTINE InitDMD() TimeEnd_State = time ! IF (useBaseflow) THEN -! CALL OpenDataFile(Baseflow,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_WORLD) +! CALL OpenDataFile(Baseflow,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_PICLAS) ! CALL ReadAttribute(File_ID,'File_Type',1,StrScalar =FileType) ! SELECT CASE(TRIM(FileType)) ! CASE('State') @@ -233,9 +233,9 @@ SUBROUTINE InitDMD() ! CALL ReadAttribute(File_ID,'Time', 1,RealScalar=time) ! CALL ReadArray('DG_Solution',5,& ! (/nVar_State,N_State+1,N_State+1,N_StateZ+1,nElems_State/),0,5,RealArray=Utmp) -! +! ! CALL CloseDataFile() -! +! ! CALL CalcEquationDMD(Utmp,Ktmp(:)) ! DO iFile = 2,nFiles+1 ! K(:,iFile-1) = K(:,iFile-1) - Ktmp @@ -256,24 +256,24 @@ SUBROUTINE InitDMD() ! END IF ! END DO ! END DO -! +! ! ALLOCATE(Ktmp(nDoFs*nVarDMD)) ! DEALLOCATE(Utmp) ! ALLOCATE(Utmp (HSize(1),0:N_State,0:N_State,0:N_StateZ,nElems_State)) -! +! ! CALL ReadArray('Mean',5,& ! (/INT(HSize(1)),N_State+1,N_State+1,N_StateZ+1,nElems_State/),0,5,RealArray=Utmp) ! CALL CloseDataFile() -! +! ! ktmp(:) = RESHAPE(Utmp(VarSortTimeAvg,:,:,:,:), (/nDoFs*nVarDMD/)) -! +! ! DO iFile = 2,nFiles+1 ! K(:,iFile-1) = K(:,iFile-1) - Ktmp ! END DO -! +! ! DEALLOCATE(ktmp) ! END SELECT -! +! ! END IF DEALLOCATE(Utmp) @@ -566,7 +566,7 @@ SUBROUTINE WriteDmdStateFile() IF(MPIRoot) CALL GenerateFileSkeleton('DMD',N_variables,StrVarNames,TRIM(MeshFile),Time_State,FileNameIn=TRIM(FileName),& WriteUserblockIn = .FALSE.) #if USE_MPI - CALL MPI_BARRIER(MPI_COMM_WORLD,iError) + CALL MPI_BARRIER(MPI_COMM_PICLAS,iError) #endif !write(*,*) "" @@ -574,7 +574,7 @@ SUBROUTINE WriteDmdStateFile() !WRITE (*,*) "nDofs,nVarDMD,nModes =", nDofs,nVarDMD,nModes !write(*,*) "OpenDataFile(TRIM(FileName),create=.FALSE.,single=.FALSE.,readOnly=.FALSE" -CALL OpenDataFile(TRIM(FileName),create=.FALSE.,single=.FALSE.,readOnly=.FALSE.,communicatorOpt=MPI_COMM_WORLD) +CALL OpenDataFile(TRIM(FileName),create=.FALSE.,single=.FALSE.,readOnly=.FALSE.,communicatorOpt=MPI_COMM_PICLAS) CALL WriteAttributeToHDF5( File_ID , 'DMD Start Time' , 1 , RealScalar=Time_State ) CALL WriteAttributeToHDF5( File_ID , 'DMD END Time' , 1 , RealScalar=TimeEnd_State ) CALL WriteAttributeToHDF5( File_ID , 'DMD dt' , 1 , RealScalar=dt ) @@ -587,7 +587,7 @@ SUBROUTINE WriteDmdStateFile() !WRITE (*,*) "N_State,N_StateZ,nElems_State =", N_State,N_StateZ,nElems_State !================= Actual data output =======================! ! Write DMD -CALL OpenDataFile(FileName,create=.FALSE.,single=.FALSE.,readOnly=.FALSE.,communicatorOpt=MPI_COMM_WORLD) +CALL OpenDataFile(FileName,create=.FALSE.,single=.FALSE.,readOnly=.FALSE.,communicatorOpt=MPI_COMM_PICLAS) IF (PlotSingleMode) THEN k=1 DO i = 1, nModes diff --git a/src/posti/piclas2vtk/piclas2vtk.f90 b/src/posti/piclas2vtk/piclas2vtk.f90 index 81667208f..5b7aa76d8 100644 --- a/src/posti/piclas2vtk/piclas2vtk.f90 +++ b/src/posti/piclas2vtk/piclas2vtk.f90 @@ -243,7 +243,7 @@ PROGRAM piclas2vtk SurfaceDataExists = .FALSE. PartDataExists = .FALSE. AdaptiveInfoExists = .FALSE. - CALL OpenDataFile(InputStateFile,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_WORLD) + CALL OpenDataFile(InputStateFile,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_PICLAS) ! Get the type of the .h5 file CALL ReadAttribute(File_ID,'File_Type',1,StrScalar=File_Type) ! Check which containers are present @@ -284,7 +284,7 @@ PROGRAM piclas2vtk END IF ! Build connectivity for element/volume output IF(ElemDataExists.AND..NOT.ElemMeshInit) THEN - CALL OpenDataFile(MeshFile,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_WORLD) + CALL OpenDataFile(MeshFile,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_PICLAS) CALL ReadAttribute(File_ID,'nUniqueNodes',1,IntScalar=nUniqueNodes) CALL CloseDataFile() ALLOCATE(ElemUniqueNodeID(1:8,1:nGlobalElems)) @@ -608,7 +608,7 @@ SUBROUTINE ConvertDGSolution(InputStateFile,NVisu,NodeTypeVisuOut,OutputName,DGS CHARACTER(LEN=255) :: DMDFields(1:16), Dataset !=================================================================================================================================== ! 1.) Open given file to get the number of elements, the order and the name of the mesh file -CALL OpenDataFile(InputStateFile,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_WORLD) +CALL OpenDataFile(InputStateFile,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_PICLAS) ! Check if data set exists, if not return CALL DatasetExists(File_ID,TRIM(DGSolutionDataset),DGSolutionDatasetExists) @@ -695,7 +695,7 @@ SUBROUTINE ConvertDGSolution(InputStateFile,NVisu,NodeTypeVisuOut,OutputName,DGS END DO ! Read in solution -CALL OpenDataFile(InputStateFile,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_WORLD) +CALL OpenDataFile(InputStateFile,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_PICLAS) ! Associate construct for integer KIND=8 possibility ASSOCIATE (& @@ -866,7 +866,7 @@ SUBROUTINE ConvertPartData(InputStateFile) LOGICAL :: FileVersionExists !=================================================================================================================================== -CALL OpenDataFile(InputStateFile,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_WORLD) +CALL OpenDataFile(InputStateFile,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_PICLAS) CALL ReadAttribute(File_ID,'Project_Name',1,StrScalar=ProjectName) CALL ReadAttribute(File_ID,'Time',1,RealScalar=OutputTime) @@ -979,7 +979,7 @@ SUBROUTINE ConvertElemData(InputStateFile,ArrayName,VarName) !=================================================================================================================================== ! Read in solution -CALL OpenDataFile(InputStateFile,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_WORLD) +CALL OpenDataFile(InputStateFile,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_PICLAS) CALL ReadAttribute(File_ID,'Project_Name',1,StrScalar=ProjectName) CALL ReadAttribute(File_ID,'Time',1,RealScalar=OutputTime) CALL ReadAttribute(File_ID,'File_Type',1,StrScalar=File_Type) @@ -1048,7 +1048,7 @@ SUBROUTINE ConvertSurfaceData(InputStateFile) !=================================================================================================================================== ! Read in solution -CALL OpenDataFile(InputStateFile,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_WORLD) +CALL OpenDataFile(InputStateFile,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_PICLAS) CALL ReadAttribute(File_ID,'Project_Name',1,StrScalar=ProjectName) CALL ReadAttribute(File_ID,'Time',1,RealScalar=OutputTime) CALL ReadAttribute(File_ID,'DSMC_nSurfSample',1,IntScalar=nSurfSample) @@ -1134,7 +1134,7 @@ SUBROUTINE BuildSurfMeshConnectivity(InputStateFile) REAL, ALLOCATABLE :: TempNodeCoords(:,:) LOGICAL :: IsSortedSurfNode !=================================================================================================================================== -CALL OpenDataFile(InputStateFile,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_WORLD) +CALL OpenDataFile(InputStateFile,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_PICLAS) SWRITE(UNIT_stdOut,'(A,A)')' GET NUMBER AND NAMES OF SURFACE-BCSIDES IN HDF5 FILE... ' CALL GetDataSize(File_ID,'BC_Surf',nDims,HSize,attrib=.true.) diff --git a/src/posti/superB/superB_tools.f90 b/src/posti/superB/superB_tools.f90 index a1a591fd6..2504d898c 100644 --- a/src/posti/superB/superB_tools.f90 +++ b/src/posti/superB/superB_tools.f90 @@ -190,11 +190,11 @@ SUBROUTINE CalcErrorSuperB(L_2_Error,L_Inf_Error,ExactFunctionNumber,iCoilOrMagn END DO ! iElem=1,PP_nElems #if USE_MPI IF(MPIroot)THEN - CALL MPI_REDUCE(MPI_IN_PLACE , L_2_Error , 4 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_WORLD , iError) - CALL MPI_REDUCE(MPI_IN_PLACE , L_Inf_Error , 4 , MPI_DOUBLE_PRECISION , MPI_MAX , 0 , MPI_COMM_WORLD , iError) + CALL MPI_REDUCE(MPI_IN_PLACE , L_2_Error , 4 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_PICLAS , iError) + CALL MPI_REDUCE(MPI_IN_PLACE , L_Inf_Error , 4 , MPI_DOUBLE_PRECISION , MPI_MAX , 0 , MPI_COMM_PICLAS , iError) ELSE - CALL MPI_REDUCE(L_2_Error , 0 , 4 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_WORLD , iError) - CALL MPI_REDUCE(L_Inf_Error , 0 , 4 , MPI_DOUBLE_PRECISION , MPI_MAX , 0 , MPI_COMM_WORLD , iError) + CALL MPI_REDUCE(L_2_Error , 0 , 4 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_PICLAS , iError) + CALL MPI_REDUCE(L_Inf_Error , 0 , 4 , MPI_DOUBLE_PRECISION , MPI_MAX , 0 , MPI_COMM_PICLAS , iError) ! in this case the receive value is not relevant. END IF #endif /*USE_MPI*/ diff --git a/src/precond/precond.f90 b/src/precond/precond.f90 index 9ffdfacf0..513d4034f 100644 --- a/src/precond/precond.f90 +++ b/src/precond/precond.f90 @@ -378,7 +378,7 @@ SUBROUTINE BuildPrecond(t,tStage,tDeriv,alpha,dt) END DO ! ! iELEM #if USE_MPI -CALL MPI_REDUCE(TotalTime,TotalTimeMPI ,3,MPI_DOUBLE_PRECISION,MPI_MAX,0,MPI_COMM_WORLD,IERROR) +CALL MPI_REDUCE(TotalTime,TotalTimeMPI ,3,MPI_DOUBLE_PRECISION,MPI_MAX,0,MPI_COMM_PICLAS,IERROR) IF(MPIRoot) THEN TotalTime=TotalTimeMPI END IF diff --git a/src/readIMD/readIMD.f90 b/src/readIMD/readIMD.f90 index 8450ec681..5dc97a324 100644 --- a/src/readIMD/readIMD.f90 +++ b/src/readIMD/readIMD.f90 @@ -108,7 +108,7 @@ subroutine read_IMD_results() write(UNIT_errOut,'(A34,I8,6A)')'Error during MPI_File_open! Rank: ', myRank, '\n',& 'Error-Message: ', trim(errorString), ' "',trim(filenameIMDresults), '"',& 'The program will be terminated!!!' - call MPI_Abort(MPI_COMM_WORLD, mpiFileError, iError) + call MPI_Abort(MPI_COMM_PICLAS, mpiFileError, iError) end if call MPI_FILE_READ_AT(filehandle,3_8,disp_tmp,2,MPI_BYTE,ioStatus,iError) @@ -127,12 +127,12 @@ subroutine read_IMD_results() end if - call MPI_BCAST(Box_X, 3, MPI_DOUBLE_PRECISION, 0, MPI_COMM_WORLD, iError) - call MPI_BCAST(Box_Y, 3, MPI_DOUBLE_PRECISION, 0, MPI_COMM_WORLD, iError) - call MPI_BCAST(Box_Z, 3, MPI_DOUBLE_PRECISION, 0, MPI_COMM_WORLD, iError) - call MPI_BCAST(nGlobalAtoms, 8, MPI_BYTE, 0, MPI_COMM_WORLD, iError) - call MPI_BCAST(observables, 1, MPI_INTEGER, 0, MPI_COMM_WORLD, iError) - call MPI_BCAST(disp, 8, MPI_BYTE, 0, MPI_COMM_WORLD, iError) + call MPI_BCAST(Box_X, 3, MPI_DOUBLE_PRECISION, 0, MPI_COMM_PICLAS, iError) + call MPI_BCAST(Box_Y, 3, MPI_DOUBLE_PRECISION, 0, MPI_COMM_PICLAS, iError) + call MPI_BCAST(Box_Z, 3, MPI_DOUBLE_PRECISION, 0, MPI_COMM_PICLAS, iError) + call MPI_BCAST(nGlobalAtoms, 8, MPI_BYTE, 0, MPI_COMM_PICLAS, iError) + call MPI_BCAST(observables, 1, MPI_INTEGER, 0, MPI_COMM_PICLAS, iError) + call MPI_BCAST(disp, 8, MPI_BYTE, 0, MPI_COMM_PICLAS, iError) nAtoms = nGlobalAtoms/nProcessors SWRITE(UNIT_stdOut,*)'Number of atoms per proc: ',nAtoms @@ -170,7 +170,7 @@ subroutine read_IMD_results() StartT=MPI_WTIME() end if - call MPI_FILE_OPEN(MPI_COMM_WORLD, trim(filenameIMDresults), MPI_MODE_RDONLY,& + call MPI_FILE_OPEN(MPI_COMM_PICLAS, trim(filenameIMDresults), MPI_MODE_RDONLY,& mpiInfo, filehandle, mpiFileError) if( mpiFileError /= 0)then @@ -178,7 +178,7 @@ subroutine read_IMD_results() write(UNIT_errOut,'(A34,I8,6A)')'Error during MPI_File_open! Rank: ', myRank, '\n',& 'Error-Message: ', trim(errorString), ' "',trim(filenameIMDresults), '"',& 'The program will be terminated!!!' - call MPI_Abort(MPI_COMM_WORLD, mpiFileError, iError) + call MPI_Abort(MPI_COMM_PICLAS, mpiFileError, iError) end if call MPI_FILE_SET_VIEW(filehandle, myFileOffset, MPI_PACKED, MPI_PACKED, 'native', mpiInfo, iError) @@ -217,12 +217,12 @@ subroutine read_IMD_results() do iPart=1,PDM%ParticleVecLength call MPI_UNPACK(AtomsBuffer, atomBufferSize, atomsBufferPos, PartState(1:6,iPart),& - 6_4, MPI_DOUBLE_PRECISION, MPI_COMM_WORLD, iError) + 6_4, MPI_DOUBLE_PRECISION, MPI_COMM_PICLAS, iError) if ( iError .NE. 0 ) & IPWRITE(UNIT_stdOut,'(I0,A,I0)')'Error unpacking particle position to PartState(1:6,iPart) with iPart=',iPart call MPI_UNPACK(AtomsBuffer, atomBufferSize, atomsBufferPos, PartStateIntEn(1:2,iPart),& - int( observables-6_8, 4 ), MPI_DOUBLE_PRECISION, MPI_COMM_WORLD, iError) + int( observables-6_8, 4 ), MPI_DOUBLE_PRECISION, MPI_COMM_PICLAS, iError) if ( iError .NE. 0 ) & IPWRITE(UNIT_stdOut,'(I0,A,I0)')'Error unpacking particle charge and electron temperature to PartState(1:2,iPart) with iPart=',iPart end do @@ -238,7 +238,7 @@ subroutine read_IMD_results() PartState = PartState * 1e-10_8 PartState(4:6,:) = PartState(4:6,:) * 10.18e15_8 - ! Free an info object + ! Free an info object call MPI_Info_free(mpiInfo, iError) ! Get minimum and maximum extend of the complete particle distribution in the domain @@ -250,14 +250,14 @@ subroutine read_IMD_results() MaxY = MAXVAL(PartState(2,:)) MaxZ = MAXVAL(PartState(3,:)) - CALL MPI_REDUCE(MaxX , MaxX_glob , 1 , MPI_DOUBLE_PRECISION , MPI_MAX , 0 , MPI_COMM_WORLD , iError) - CALL MPI_REDUCE(MinX , MinX_glob , 1 , MPI_DOUBLE_PRECISION , MPI_MIN , 0 , MPI_COMM_WORLD , iError) + CALL MPI_REDUCE(MaxX , MaxX_glob , 1 , MPI_DOUBLE_PRECISION , MPI_MAX , 0 , MPI_COMM_PICLAS , iError) + CALL MPI_REDUCE(MinX , MinX_glob , 1 , MPI_DOUBLE_PRECISION , MPI_MIN , 0 , MPI_COMM_PICLAS , iError) - CALL MPI_REDUCE(MaxY , MaxY_glob , 1 , MPI_DOUBLE_PRECISION , MPI_MAX , 0 , MPI_COMM_WORLD , iError) - CALL MPI_REDUCE(MinY , MinY_glob , 1 , MPI_DOUBLE_PRECISION , MPI_MIN , 0 , MPI_COMM_WORLD , iError) + CALL MPI_REDUCE(MaxY , MaxY_glob , 1 , MPI_DOUBLE_PRECISION , MPI_MAX , 0 , MPI_COMM_PICLAS , iError) + CALL MPI_REDUCE(MinY , MinY_glob , 1 , MPI_DOUBLE_PRECISION , MPI_MIN , 0 , MPI_COMM_PICLAS , iError) - CALL MPI_REDUCE(MaxZ , MaxZ_glob , 1 , MPI_DOUBLE_PRECISION , MPI_MAX , 0 , MPI_COMM_WORLD , iError) - CALL MPI_REDUCE(MinZ , MinZ_glob , 1 , MPI_DOUBLE_PRECISION , MPI_MIN , 0 , MPI_COMM_WORLD , iError) + CALL MPI_REDUCE(MaxZ , MaxZ_glob , 1 , MPI_DOUBLE_PRECISION , MPI_MAX , 0 , MPI_COMM_PICLAS , iError) + CALL MPI_REDUCE(MinZ , MinZ_glob , 1 , MPI_DOUBLE_PRECISION , MPI_MIN , 0 , MPI_COMM_PICLAS , iError) if( mpiroot )then EndT=MPI_WTIME() @@ -281,7 +281,7 @@ subroutine read_IMD_results() NbrOfLostParticles=NbrOfLostParticles+1 end if end do - CALL MPI_REDUCE(NbrOfLostParticles , NbrOfLostParticlesGlobal , 1 , MPI_DOUBLE_PRECISION , MPI_MAX , 0 , MPI_COMM_WORLD , iError) + CALL MPI_REDUCE(NbrOfLostParticles , NbrOfLostParticlesGlobal , 1 , MPI_DOUBLE_PRECISION , MPI_MAX , 0 , MPI_COMM_PICLAS , iError) if( mpiroot )then EndT=MPI_WTIME() WRITE(UNIT_stdOut,'(A,F0.3,A)',ADVANCE='YES')'DONE [',EndT-StartT,'s]' diff --git a/src/readintools/readintools.f90 b/src/readintools/readintools.f90 index 500e204c5..6b19805fd 100644 --- a/src/readintools/readintools.f90 +++ b/src/readintools/readintools.f90 @@ -817,7 +817,7 @@ SUBROUTINE read_options(this, filename, furtherini) !broadcast number of lines, read and broadcast file content #if USE_MPI -CALL MPI_BCAST(nLines,1,MPI_INTEGER,0,MPI_COMM_WORLD,iError) +CALL MPI_BCAST(nLines,1,MPI_INTEGER,0,MPI_COMM_PICLAS,iError) #endif ALLOCATE(FileContent(nLines)) @@ -828,7 +828,7 @@ SUBROUTINE read_options(this, filename, furtherini) END IF IF (MPIROOT) CLOSE(iniUnit) #if USE_MPI -CALL MPI_BCAST(FileContent,LEN(FileContent)*nLines,MPI_CHARACTER,0,MPI_COMM_WORLD,iError) +CALL MPI_BCAST(FileContent,LEN(FileContent)*nLines,MPI_CHARACTER,0,MPI_COMM_PICLAS,iError) #endif ! infinte loop. Exit at EOF @@ -2140,7 +2140,7 @@ SUBROUTINE ExtractParameterFile(filename,prmfile,userblockFound) CLOSE(iniUnit) END IF #if USE_MPI -CALL MPI_BCAST(userblockFound,1,MPI_LOGICAL,0,MPI_COMM_WORLD,iError) +CALL MPI_BCAST(userblockFound,1,MPI_LOGICAL,0,MPI_COMM_PICLAS,iError) #endif /*USE_MPI*/ END SUBROUTINE ExtractParameterFile diff --git a/src/recordpoints/recordpoints.f90 b/src/recordpoints/recordpoints.f90 index 32284f86c..990eaa898 100644 --- a/src/recordpoints/recordpoints.f90 +++ b/src/recordpoints/recordpoints.f90 @@ -151,7 +151,7 @@ SUBROUTINE InitRPCommunicator() ! create new RP communicator for RP output color = MERGE(2,MPI_UNDEFINED,RP_onProc) -CALL MPI_COMM_SPLIT(MPI_COMM_WORLD,color,myRPrank,RP_COMM,iError) +CALL MPI_COMM_SPLIT(MPI_COMM_PICLAS,color,myRPrank,RP_COMM,iError) IF (RP_onProc) THEN CALL MPI_COMM_RANK (RP_COMM,myRPrank,iError) CALL MPI_COMM_SIZE(RP_COMM, nRP_Procs,iError) @@ -197,7 +197,7 @@ SUBROUTINE ReadRPList(FileString) SWRITE(UNIT_stdOut,'(A)',ADVANCE='NO')' Read recordpoint definitions from data file "'//TRIM(FileString)//'" ...' ! Open data file -CALL OpenDataFile(FileString,create=.FALSE.,single=.FALSE.,readOnly=.FALSE.,communicatorOpt=MPI_COMM_WORLD) +CALL OpenDataFile(FileString,create=.FALSE.,single=.FALSE.,readOnly=.FALSE.,communicatorOpt=MPI_COMM_PICLAS) ! compare mesh file names CALL ReadAttribute(File_ID,'MeshFile',1,StrScalar=MeshFile_RPList) diff --git a/src/restart/restart.f90 b/src/restart/restart.f90 index ee544f64b..b780721a6 100644 --- a/src/restart/restart.f90 +++ b/src/restart/restart.f90 @@ -149,7 +149,7 @@ SUBROUTINE InitRestart() IF (LEN_TRIM(RestartFile).GT.0) THEN ! Read in the state file we want to restart from DoRestart = .TRUE. - CALL OpenDataFile(RestartFile,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_WORLD) + CALL OpenDataFile(RestartFile,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_PICLAS) #ifdef PP_POIS #if (PP_nVar==8) !The following arrays are read from the file diff --git a/src/restart/restart_field.f90 b/src/restart/restart_field.f90 index c46f53310..e5c724ca8 100644 --- a/src/restart/restart_field.f90 +++ b/src/restart/restart_field.f90 @@ -184,9 +184,9 @@ SUBROUTINE FieldRestart() !IPWRITE(UNIT_StdOut,*) "firstSide:lastSide,Nbr,nSides =", firstSide,lastSide,lastSide-firstSide+1,nSides ALLOCATE(lambdaLBTmp(PP_nVar,nGP_face,firstSide:lastSide)) END ASSOCIATE - !CALL MPI_BARRIER(MPI_COMM_WORLD,iError) + !CALL MPI_BARRIER(MPI_COMM_PICLAS,iError) !IPWRITE(UNIT_StdOut,*) "MPInSideSend,MPIoffsetSideSend,MPInSideRecv,MPIoffsetSideRecv =", MPInSideSend,MPIoffsetSideSend,MPInSideRecv,MPIoffsetSideRecv - !CALL MPI_BARRIER(MPI_COMM_WORLD,iError) + !CALL MPI_BARRIER(MPI_COMM_PICLAS,iError) ASSOCIATE (& counts_send => (INT(MPInSideSend )) ,& @@ -199,7 +199,7 @@ SUBROUTINE FieldRestart() MPI_TYPE = MPI_DOUBLE_PRECISION CALL MPI_TYPE_CREATE_STRUCT(1,MPI_LENGTH,MPI_DISPLACEMENT,MPI_TYPE,MPI_STRUCT,iError) CALL MPI_TYPE_COMMIT(MPI_STRUCT,iError) - CALL MPI_ALLTOALLV(lambdaLB,counts_send,disp_send,MPI_STRUCT,lambdaLBTmp,counts_recv,disp_recv,MPI_STRUCT,MPI_COMM_WORLD,iError) + CALL MPI_ALLTOALLV(lambdaLB,counts_send,disp_send,MPI_STRUCT,lambdaLBTmp,counts_recv,disp_recv,MPI_STRUCT,MPI_COMM_PICLAS,iError) END ASSOCIATE DEALLOCATE(lambdaLB) @@ -287,7 +287,7 @@ SUBROUTINE FieldRestart() MPI_TYPE = MPI_DOUBLE_PRECISION CALL MPI_TYPE_CREATE_STRUCT(1,MPI_LENGTH,MPI_DISPLACEMENT,MPI_TYPE,MPI_STRUCT,iError) CALL MPI_TYPE_COMMIT(MPI_STRUCT,iError) - CALL MPI_ALLTOALLV(U,counts_send,disp_send,MPI_STRUCT,UTmp,counts_recv,disp_recv,MPI_STRUCT,MPI_COMM_WORLD,iError) + CALL MPI_ALLTOALLV(U,counts_send,disp_send,MPI_STRUCT,UTmp,counts_recv,disp_recv,MPI_STRUCT,MPI_COMM_PICLAS,iError) END ASSOCIATE CALL MOVE_ALLOC(UTmp,U) END IF ! ALLOCATED(U) @@ -310,10 +310,10 @@ SUBROUTINE FieldRestart() ! =========================================================================== IF(RestartNullifySolution)THEN ! Open the restart file and neglect the DG solution (only read particles if present) SWRITE(UNIT_stdOut,*)'Restarting from File: ',TRIM(RestartFile),' (but without reading the DG solution)' - CALL OpenDataFile(RestartFile,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_WORLD) + CALL OpenDataFile(RestartFile,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_PICLAS) ELSE ! Use the solution in the restart file SWRITE(UNIT_stdOut,*)'Restarting from File: ',TRIM(RestartFile) - CALL OpenDataFile(RestartFile,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_WORLD) + CALL OpenDataFile(RestartFile,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_PICLAS) ! Read in time from restart file !CALL ReadAttribute(File_ID,'Time',1,RealScalar=RestartTime) ! Read in state diff --git a/src/timedisc/timedisc.f90 b/src/timedisc/timedisc.f90 index 734a97a2e..de308d2d9 100644 --- a/src/timedisc/timedisc.f90 +++ b/src/timedisc/timedisc.f90 @@ -233,7 +233,7 @@ SUBROUTINE TimeDisc() tTracking=0 tLocalization=0 END IF -IF(CalcEMFieldOutput) CALL WriteElectroMagneticPICFieldToHDF5() ! Write magnetic field to file +IF(CalcEMFieldOutput) CALL WriteElectroMagneticPICFieldToHDF5() ! Write magnetic field to file #endif /*PARTICLES*/ ! No computation needed if tEnd=tStart! @@ -539,7 +539,7 @@ SUBROUTINE WriteInfoStdOut() #if USE_MPI NbrOfLostParticlesTotal_old_tmp = NbrOfLostParticlesTotal ! keep old value ! Allreduce is required because of the particle output to .h5 in which all processors must take place - CALL MPI_ALLREDUCE(NbrOfLostParticles , NbrOfLostParticlesTotal , 1 , MPI_INTEGER , MPI_SUM , MPI_COMM_WORLD , IERROR) + CALL MPI_ALLREDUCE(NbrOfLostParticles , NbrOfLostParticlesTotal , 1 , MPI_INTEGER , MPI_SUM , MPI_COMM_PICLAS , IERROR) NbrOfLostParticlesTotal = NbrOfLostParticlesTotal + NbrOfLostParticlesTotal_old_tmp ! add old value #else NbrOfLostParticlesTotal = NbrOfLostParticlesTotal + NbrOfLostParticles diff --git a/src/timedisc/timedisc_TimeStepByImplicitRK.f90 b/src/timedisc/timedisc_TimeStepByImplicitRK.f90 index 66e7db5a2..c94101fa2 100644 --- a/src/timedisc/timedisc_TimeStepByImplicitRK.f90 +++ b/src/timedisc/timedisc_TimeStepByImplicitRK.f90 @@ -93,7 +93,6 @@ SUBROUTINE TimeStepByImplicitRK() #if USE_MPI USE MOD_Particle_MPI ,ONLY: IRecvNbOfParticles, MPIParticleSend,MPIParticleRecv,SendNbOfparticles USE MOD_Particle_MPI_Vars ,ONLY: PartMPIExchange -USE MOD_Particle_MPI_Vars ,ONLY: PartMPI #endif /*USE_MPI*/ USE MOD_PIC_Analyze ,ONLY: CalcDepositedCharge USE MOD_part_tools ,ONLY: UpdateNextFreePosition @@ -307,10 +306,10 @@ SUBROUTINE TimeStepByImplicitRK() #endif /*USE_LOADBALANCE*/ IF(DoPrintConvInfo)THEN #if USE_MPI - IF(PartMPI%MPIRoot)THEN - CALL MPI_REDUCE(MPI_IN_PLACE,nParts,1,MPI_INTEGER,MPI_SUM,0,PartMPI%COMM, IERROR) + IF(MPIRoot)THEN + CALL MPI_REDUCE(MPI_IN_PLACE,nParts,1,MPI_INTEGER,MPI_SUM,0,MPI_COMM_PICLAS, IERROR) ELSE - CALL MPI_REDUCE(nParts ,iPart,1,MPI_INTEGER,MPI_SUM,0,PartMPI%COMM, IERROR) + CALL MPI_REDUCE(nParts ,iPart,1,MPI_INTEGER,MPI_SUM,0,MPI_COMM_PICLAS, IERROR) END IF #endif /*USE_MPI*/ SWRITE(UNIT_StdOut,'(A,I10)') ' SurfaceFlux-Particles: ',nParts diff --git a/src/timedisc/timedisc_TimeStepByRosenbrock.f90 b/src/timedisc/timedisc_TimeStepByRosenbrock.f90 index 0507f14c3..365202bf1 100644 --- a/src/timedisc/timedisc_TimeStepByRosenbrock.f90 +++ b/src/timedisc/timedisc_TimeStepByRosenbrock.f90 @@ -80,7 +80,6 @@ SUBROUTINE TimeStepByRosenbrock() #if USE_MPI USE MOD_Particle_MPI ,ONLY: IRecvNbOfParticles, MPIParticleSend,MPIParticleRecv,SendNbOfparticles USE MOD_Particle_MPI_Vars ,ONLY: PartMPIExchange -USE MOD_Particle_MPI_Vars ,ONLY: PartMPI #endif /*USE_MPI*/ USE MOD_PIC_Analyze ,ONLY: CalcDepositedCharge USE MOD_part_tools ,ONLY: UpdateNextFreePosition @@ -232,10 +231,10 @@ SUBROUTINE TimeStepByRosenbrock() #endif /*USE_LOADBALANCE*/ IF(DoPrintConvInfo)THEN #if USE_MPI - IF(PartMPI%MPIRoot)THEN - CALL MPI_REDUCE(MPI_IN_PLACE,nParts,1,MPI_INTEGER,MPI_SUM,0,PartMPI%COMM, IERROR) + IF(MPIRoot)THEN + CALL MPI_REDUCE(MPI_IN_PLACE,nParts,1,MPI_INTEGER,MPI_SUM,0,MPI_COMM_PICLAS, IERROR) ELSE - CALL MPI_REDUCE(nParts ,iPart,1,MPI_INTEGER,MPI_SUM,0,PartMPI%COMM, IERROR) + CALL MPI_REDUCE(nParts ,iPart,1,MPI_INTEGER,MPI_SUM,0,MPI_COMM_PICLAS, IERROR) END IF #endif /*USE_MPI*/ SWRITE(UNIT_StdOut,'(A,I10)') ' SurfaceFlux-Particles: ',nParts From 9b262604bf5d5dacc5e43a78ee1fc6ae13bdbed8 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Tue, 5 Sep 2023 16:18:42 +0200 Subject: [PATCH 183/495] Run nightly poisson h-convergence test with PARTICLES=OFF to avoid setting dummy particle parameters in the ini file --- .../excludeBuild.ini | 5 ++++- regressioncheck/NIG_convtest_poisson/builds.ini | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/regressioncheck/NIG_convtest_poisson/Dielectric_sphere_in_sphere_curved_mortar/excludeBuild.ini b/regressioncheck/NIG_convtest_poisson/Dielectric_sphere_in_sphere_curved_mortar/excludeBuild.ini index 4a99af81d..67ed5c0ba 100644 --- a/regressioncheck/NIG_convtest_poisson/Dielectric_sphere_in_sphere_curved_mortar/excludeBuild.ini +++ b/regressioncheck/NIG_convtest_poisson/Dielectric_sphere_in_sphere_curved_mortar/excludeBuild.ini @@ -1,4 +1,7 @@ ! Deactivate reggie for now ! Fix by implementing dielectric <-> vacuum mortar interfaces correctly -! Delete this file afterwards +! Delete the following line afterwards PICLAS_EQNSYSNAME = poisson + +! run only with particles +PICLAS_PARTICLES=OFF diff --git a/regressioncheck/NIG_convtest_poisson/builds.ini b/regressioncheck/NIG_convtest_poisson/builds.ini index ca6975ed5..ebf13abd5 100644 --- a/regressioncheck/NIG_convtest_poisson/builds.ini +++ b/regressioncheck/NIG_convtest_poisson/builds.ini @@ -9,3 +9,4 @@ PICLAS_EQNSYSNAME = poisson PICLAS_TIMEDISCMETHOD = RK3 LIBS_USE_MPI = ON PICLAS_NODETYPE = GAUSS +PICLAS_PARTICLES = OFF ! activate also PICLAS_PARTICLES=ON as soon as the mortar dielectric reggie is fixed From 4438ffe347d2e28122fbcd6ca5c3785fad814ab7 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Tue, 5 Sep 2023 16:32:57 +0200 Subject: [PATCH 184/495] Fixed Plasma_Ball_cell_volweight_mean_save_CVWM reggie, which uses multiples meshes with different boundaries (inner BCs on/off): Always supply the correct number of (part-) BCs in the ini file. --- .../Plasma_Ball_cell_volweight_mean_save_CVWM/parameter.ini | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/regressioncheck/NIG_PIC_Deposition/Plasma_Ball_cell_volweight_mean_save_CVWM/parameter.ini b/regressioncheck/NIG_PIC_Deposition/Plasma_Ball_cell_volweight_mean_save_CVWM/parameter.ini index d9da970f1..3b6811dc2 100644 --- a/regressioncheck/NIG_PIC_Deposition/Plasma_Ball_cell_volweight_mean_save_CVWM/parameter.ini +++ b/regressioncheck/NIG_PIC_Deposition/Plasma_Ball_cell_volweight_mean_save_CVWM/parameter.ini @@ -22,7 +22,7 @@ NAnalyze = 12 ! Number of analyze points ! =============================================================================== ! NVisu=1 VisuParticles=T -MeshFile = Box_mesh.h5,Box_deformed_mesh.h5,Box_deformed_mesh.h5 +MeshFile = Box_mesh.h5, Box_deformed_mesh.h5, Box_deformed_mesh.h5 useCurveds = F ! =============================================================================== ! @@ -76,7 +76,7 @@ c_corr = 0. Part-maxParticleNumber = 100500 Part-nSpecies = 2 PIC-Depo-Periodic = T -Part-nBounds = 7 +Part-nBounds = 6,7,7 Part-Boundary1-SourceName = BC_x+ Part-Boundary1-Condition = reflective Part-Boundary2-SourceName = BC_x- @@ -173,4 +173,4 @@ xyzDielectricMinMax = (/0.0, 1.0, -1.0, 1.0, -1.0, 1.0/) ! define bounding bo !xyzDielectricMinMax = (/-1.0, 0.4, -1.0, 1.0, -1.0, 1.0/) ! define bounding box of dielectric region -nocrosscombination:MeshFile,Part-Species1-Init1-VeloIC,DoDielectric,tend +nocrosscombination:MeshFile,Part-Species1-Init1-VeloIC,DoDielectric,tend,Part-nBounds From 4c5063b75bcb28947564d748fb667dd276cc3e65 Mon Sep 17 00:00:00 2001 From: Felix Garmirian Date: Tue, 5 Sep 2023 17:11:35 +0200 Subject: [PATCH 185/495] forgot one variable --- src/particles/analyze/particle_analyze_code.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/particles/analyze/particle_analyze_code.f90 b/src/particles/analyze/particle_analyze_code.f90 index 0a68ed0fd..761abe2e4 100644 --- a/src/particles/analyze/particle_analyze_code.f90 +++ b/src/particles/analyze/particle_analyze_code.f90 @@ -568,7 +568,7 @@ END SUBROUTINE CalcErrorParticle SUBROUTINE AnalyticParticleMovement(time,iter) ! MODULES USE MOD_Preproc -USE MOD_Globals ,ONLY: UNIT_StdOut +USE MOD_Globals ,ONLY: UNIT_StdOut,MPIRoot USE MOD_Analyze_Vars ,ONLY: OutputErrorNorms USE MOD_Particle_Analyze_Vars ,ONLY: TrackParticlePosition USE MOD_PICInterpolation_Vars ,ONLY: L_2_Error_Part,AnalyticPartDim From c08e29a6f96f5a5982959bcd12498bef2f29f46e Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Tue, 5 Sep 2023 18:14:21 +0200 Subject: [PATCH 186/495] Cleanup of ray tracing tools: created separate subroutine for finding the nearest DOF to a sampled particle path coordinate --- .../tracking/radtrans_tracking_tools.f90 | 115 ++++++++++-------- 1 file changed, 67 insertions(+), 48 deletions(-) diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 index efd68b6dc..9515fa6bc 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 @@ -648,10 +648,9 @@ END SUBROUTINE PhotonIntersectionWithSide !> !=================================================================================================================================== SUBROUTINE CalcAbsorptionRayTrace(IntersectionPos,GlobalElemID,PhotonDir) -USE MOD_globals -USE MOD_RayTracing_Vars ,ONLY: RayElemPassedEnergy,Ray,U_N_Ray,N_DG_Ray,N_Inter_Ray +USE MOD_Globals ,ONLY: VECNORM +USE MOD_RayTracing_Vars ,ONLY: RayElemPassedEnergy,Ray,U_N_Ray,N_DG_Ray USE MOD_Photon_TrackingVars ,ONLY: PhotonProps -USE MOD_Eval_xyz ,ONLY: GetPositionInRefElem !--------------------------------------------------------------------------------------------------! IMPLICIT NONE !--------------------------------------------------------------------------------------------------! @@ -660,9 +659,9 @@ SUBROUTINE CalcAbsorptionRayTrace(IntersectionPos,GlobalElemID,PhotonDir) REAL, INTENT(IN) :: PhotonDir(3) REAL, INTENT(IN) :: IntersectionPos(3) ! Local variable declaration -INTEGER :: a,b,ii,k,l,m,Nloc,NbrOfSamples,iIntersec,idx +INTEGER :: a,b,k,l,m,Nloc,NbrOfSamples,iIntersec,idx INTEGER :: kOld,lOld,mOld -REAL :: IntersectionPosRef(3),scaleFac,SamplePos(3),weight +REAL :: SamplePos(3) REAL :: direction(3),subdirection(3),length,sublength LOGICAL :: arr(0:Ray%NMax,0:Ray%NMax,0:Ray%NMax) REAL :: realcounter @@ -709,49 +708,8 @@ SUBROUTINE CalcAbsorptionRayTrace(IntersectionPos,GlobalElemID,PhotonDir) DO iIntersec = 1, NbrOfSamples SamplePos = PhotonProps%PhotonStartPos(1:3) + direction(1:3)*REAL(iIntersec-1)/REAL(NbrOfSamples-1) - ! ! Get position in reference element - ! CALL GetPositionInRefElem(SamplePos(1:3),IntersectionPosRef(1:3),GlobalElemID) - - ! k = a - ! DO ii = 0,b-1 - ! IF(ABS(IntersectionPosRef(1)).GE.N_Inter_Ray(Nloc)%GaussBorder(Nloc-ii))THEN - ! k = Nloc-ii - ! EXIT - ! END IF - ! END DO - ! k = NINT((Nloc+SIGN(2.0*k-Nloc,IntersectionPosRef(1)))/2) - ! !! y-direction - ! l = a - ! DO ii = 0,b-1 - ! IF(ABS(IntersectionPosRef(2)).GE.N_Inter_Ray(Nloc)%GaussBorder(Nloc-ii))THEN - ! l = Nloc-ii - ! EXIT - ! END IF - ! END DO - ! l = NINT((Nloc+SIGN(2.0*l-Nloc,IntersectionPosRef(2)))/2) - ! !! z-direction - ! m = a - ! DO ii = 0,b-1 - ! IF(ABS(IntersectionPosRef(3)).GE.N_Inter_Ray(Nloc)%GaussBorder(Nloc-ii))THEN - ! m = Nloc-ii - ! EXIT - ! END IF - ! END DO - ! m = NINT((Nloc+SIGN(2.0*m-Nloc,IntersectionPosRef(3)))/2) - - CALL GetPositionInRefElem(SamplePos(1:3),IntersectionPosRef(1:3),GlobalElemID) - k = MINLOC(ABS(N_Inter_Ray(Nloc)%xGP(:) - IntersectionPosRef(1)),DIM=1) - 1 - l = MINLOC(ABS(N_Inter_Ray(Nloc)%xGP(:) - IntersectionPosRef(2)),DIM=1) - 1 - m = MINLOC(ABS(N_Inter_Ray(Nloc)%xGP(:) - IntersectionPosRef(3)),DIM=1) - 1 - - ! Scaling factor to ensure that rays that are counted multiple times in high-order elements do not increase the total energy - ! deposited in the corresponding element - weight = 1.0 - !IF((k.eq.0.or.k.eq.Nloc).OR.& - !(l.eq.0.or.l.eq.Nloc).OR.& - !(m.eq.0.or.m.eq.Nloc)) weight = weight * 0.5 - !weight = N_Inter_Ray(Nloc)%wGP(k)*N_Inter_Ray(Nloc)%wGP(l)*N_Inter_Ray(Nloc)%wGP(m) - !U_N_Ray(GlobalElemID)%U(idx,k,l,m) = U_N_Ray(GlobalElemID)%U(idx,k,l,m) + PhotonProps%PhotonEnergy * scaleFac * length + ! Get k,l,m of nearest DOF + CALL GetNestestDOFInRefElem(Nloc,SamplePos(1:3),GlobalElemID,k,l,m) ! Switch sub-element IF((iIntersec.GT.1).AND.(.NOT.arr(k,l,m)))THEN @@ -791,9 +749,70 @@ SUBROUTINE CalcAbsorptionRayTrace(IntersectionPos,GlobalElemID,PhotonDir) lOld = l mOld = m END DO ! iIntersec = 1, Nloc+3 + END SUBROUTINE CalcAbsorptionRayTrace +!=================================================================================================================================== +!> Find the nearest DOF of a particle position (or sampled particle path coordinate) and return k,l,m +!=================================================================================================================================== +SUBROUTINE GetNestestDOFInRefElem(Nloc,SamplePos,GlobalElemID,k,l,m) +! MODULES +USE MOD_Eval_xyz ,ONLY: GetPositionInRefElem +USE MOD_RayTracing_Vars ,ONLY: N_Inter_Ray +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------! +! INPUT / OUTPUT VARIABLES +REAL,INTENT(IN) :: SamplePos(1:3) +INTEGER,INTENT(IN) :: Nloc +INTEGER,INTENT(IN) :: GlobalElemID +INTEGER,INTENT(OUT) :: k,l,m +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +REAL :: IntersectionPosRef(3) +!=================================================================================================================================== + +! OLD METHOD FROM NEAREST GAUSS POINT +! ! Get position in reference element +! CALL GetPositionInRefElem(SamplePos(1:3),IntersectionPosRef(1:3),GlobalElemID) + +! k = a +! DO ii = 0,b-1 +! IF(ABS(IntersectionPosRef(1)).GE.N_Inter_Ray(Nloc)%GaussBorder(Nloc-ii))THEN +! k = Nloc-ii +! EXIT +! END IF +! END DO +! k = NINT((Nloc+SIGN(2.0*k-Nloc,IntersectionPosRef(1)))/2) +! !! y-direction +! l = a +! DO ii = 0,b-1 +! IF(ABS(IntersectionPosRef(2)).GE.N_Inter_Ray(Nloc)%GaussBorder(Nloc-ii))THEN +! l = Nloc-ii +! EXIT +! END IF +! END DO +! l = NINT((Nloc+SIGN(2.0*l-Nloc,IntersectionPosRef(2)))/2) +! !! z-direction +! m = a +! DO ii = 0,b-1 +! IF(ABS(IntersectionPosRef(3)).GE.N_Inter_Ray(Nloc)%GaussBorder(Nloc-ii))THEN +! m = Nloc-ii +! EXIT +! END IF +! END DO +! m = NINT((Nloc+SIGN(2.0*m-Nloc,IntersectionPosRef(3)))/2) + +! Get reference position +CALL GetPositionInRefElem(SamplePos(1:3),IntersectionPosRef(1:3),GlobalElemID) + +k = MINLOC(ABS(N_Inter_Ray(Nloc)%xGP(:) - IntersectionPosRef(1)),DIM=1) - 1 +l = MINLOC(ABS(N_Inter_Ray(Nloc)%xGP(:) - IntersectionPosRef(2)),DIM=1) - 1 +m = MINLOC(ABS(N_Inter_Ray(Nloc)%xGP(:) - IntersectionPosRef(3)),DIM=1) - 1 + +END SUBROUTINE GetNestestDOFInRefElem + + !=================================================================================================================================== !> !=================================================================================================================================== From c6d2686358f34058c8ed928237fb49b27d1f204b Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Tue, 5 Sep 2023 18:33:39 +0200 Subject: [PATCH 187/495] Fix of Gmsh configuration file in the 2D 70deg blunted cone DSMC test case --- .../userguide/tutorials/dsmc-cone-2D/dsmc-cone-2D.md | 8 ++++++-- tutorials/dsmc-cone-2D/70degCone_2DSurf.geo | 5 ++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/docs/documentation/userguide/tutorials/dsmc-cone-2D/dsmc-cone-2D.md b/docs/documentation/userguide/tutorials/dsmc-cone-2D/dsmc-cone-2D.md index cc98a20f0..4b54a4d83 100644 --- a/docs/documentation/userguide/tutorials/dsmc-cone-2D/dsmc-cone-2D.md +++ b/docs/documentation/userguide/tutorials/dsmc-cone-2D/dsmc-cone-2D.md @@ -98,8 +98,8 @@ Different meshing algorithms for creating the 2D and 3D meshes can be chosen wit Next, the 2D mesh is created and all cells are recombined to quads with the following commands: - Mesh 2; Mesh.RecombineAll = 1; + Mesh 2; The following commands are required to save all elements even if they are not part of a physical group and to use the ASCII format, before saving the mesh as `70degCone_2D.msh`: @@ -108,7 +108,11 @@ The following commands are required to save all elements even if they are not pa Mesh.MshFileVersion = 4.1; Save "70degCone_2D.msh"; -The mesh file in the file format `.h5` used by **piclas** has to be converted using HOPR by supplying an input file `hopr.ini` using the corresponding mode: +The mesh can be created by simplying executing Gmsh from the terminal: + + gmsh 70degCone_2DSurf.geo + +The resulting mesh shall consist of quad elements and not triangles. Finally, it has to be converted to the file format used by **piclas** using HOPR by supplying an input file `hopr.ini` using the corresponding mode: Mode = 5 diff --git a/tutorials/dsmc-cone-2D/70degCone_2DSurf.geo b/tutorials/dsmc-cone-2D/70degCone_2DSurf.geo index ff3659a3c..756555070 100644 --- a/tutorials/dsmc-cone-2D/70degCone_2DSurf.geo +++ b/tutorials/dsmc-cone-2D/70degCone_2DSurf.geo @@ -32,14 +32,13 @@ Mesh.Algorithm = 1; // Mesh.RecombinationAlgorithm = 2; // -Mesh 2; -// Mesh.RecombineAll = 1; // +Mesh 2; +// Mesh.SaveAll = 1; // Mesh.Binary = 0; Mesh.MshFileVersion = 4.1; // Save "70degCone_2D.msh"; - From 0235021b57429566be8768e6ba7e818b97afe449 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Tue, 5 Sep 2023 18:41:36 +0200 Subject: [PATCH 188/495] Fixes for ray tracing solver: - Introduced new parameter RayTracing-nSurfSample (and Radiation-nSurfSample) for photon-wall super-sampling because using the standard DSMC-nSurfSample can cause memory overflow - Introduced new parameter RayTracing RayTracing-NodeType: Node type for volume and surface ray tracing super sampling. Select between VISU, VISU_INNER or GAUSS. Default is VISU_INNER - Added two new volume outputs PhotonEnergyDensity1st and PhotonEnergyDensity2nd by calculating the photon density on Nloc and switching the polynomial degree afterwards. Previously, this was performed on the energy, which them yields an incorrect density as the sum of all DOF must be equal to the cell-constant value. Therefore, only the photon density can be adjusted via ChangeBasis and not the energy + volumes separately --- .../radiative_transfer/radtrans_init.f90 | 11 ++- .../tracking/radtrans_tracking_output.f90 | 82 ++++++++++++++----- src/radiation/ray_tracing/raytrace.f90 | 21 +++-- src/radiation/ray_tracing/raytrace_ini.f90 | 68 ++++++++------- src/radiation/ray_tracing/raytrace_vars.f90 | 4 +- 5 files changed, 121 insertions(+), 65 deletions(-) diff --git a/src/radiation/radiative_transfer/radtrans_init.f90 b/src/radiation/radiative_transfer/radtrans_init.f90 index 87358e358..27c020b2b 100644 --- a/src/radiation/radiative_transfer/radtrans_init.f90 +++ b/src/radiation/radiative_transfer/radtrans_init.f90 @@ -59,6 +59,7 @@ SUBROUTINE DefineParametersRadiationTrans() CALL prms%CreateLogicalOption('Radiation-ObservationCalcFullSpectra','.FALSE.') CALL prms%CreateLogicalOption('Radiation-ObservationDoConvolution','Consider instrumental broadening?','.FALSE.') CALL prms%CreateRealOption('Radiation-ShockTubeDiameter', 'Diameter of shock tube in m', '0.0') +CALL prms%CreateIntOption( 'Radiation-nSurfSample' , 'Define polynomial degree of radiation BC sampling. Default: nSurfSample (which itself defaults to NGeo)') END SUBROUTINE DefineParametersRadiationTrans @@ -75,7 +76,7 @@ SUBROUTINE InitRadiationTransport() USE MOD_Particle_Mesh_Vars, ONLY : ElemVolume_Shared,ElemMidPoint_Shared, GEO, nComputeNodeElems USE MOD_Globals_Vars, ONLY : BoltzmannConst, PlanckConst USE MOD_Particle_Boundary_Sampling, ONLY : InitParticleBoundarySampling -USE MOD_Particle_Boundary_Vars, ONLY : nComputeNodeSurfTotalSides!, SurfMesh +USE MOD_Particle_Boundary_Vars, ONLY : nComputeNodeSurfTotalSides,nSurfSample USE MOD_Radiation_Vars, ONLY : RadiationParameter, Radiation_Emission_spec, Radiation_Absorption_spec, RadiationSwitches USE MOD_RadiationTrans_Vars, ONLY : RadObservation_Emission USE MOD_Radiation, ONLY : radiation_main @@ -92,6 +93,7 @@ SUBROUTINE InitRadiationTransport() USE MOD_Radiation_Vars, ONLY : Radiation_Absorption_Spec_Shared, Radiation_Absorption_Spec_Shared_Win, RadiationInput USE MOD_Radiation_Vars, ONLY : Radiation_Emission_Spec_Shared_Win, Radiation_Emission_Spec_Shared, MacroRadInputParameters #endif +USE MOD_RayTracing_Vars ,ONLY: Ray ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -121,6 +123,7 @@ SUBROUTINE InitRadiationTransport() RadObservationPointMethod = GETINT('Radiation-RadObservationPointMethod') ObservationDoConvolution = GETLOGICAL('Radiation-ObservationDoConvolution') RadObservationPoint%ShockTubeDiameter = GETREAL('Radiation-ShockTubeDiameter') +Ray%nSurfSample = GETINT('Radiation-nSurfSample',nSurfSample) IF (RadObservationPointMethod.GT.0) THEN RadObservationPoint%AngularAperture = GETREAL('Radiation-ObservationAngularAperture') @@ -435,17 +438,17 @@ SUBROUTINE InitRadiationTransport() #if USE_MPI -ALLOCATE(PhotonSampWallProc(2,1:nSurfSample,1:nSurfSample,1:nComputeNodeSurfTotalSides)) +ALLOCATE(PhotonSampWallProc(2,1:Ray%nSurfSample,1:Ray%nSurfSample,1:nComputeNodeSurfTotalSides)) PhotonSampWallProc=0.0 !> Then shared arrays for boundary sampling -CALL Allocate_Shared((/2,1:nSurfSample,1:nSurfSample,nComputeNodeSurfTotalSides/),PhotonSampWall_Shared_Win,PhotonSampWall_Shared) +CALL Allocate_Shared((/2,1:Ray%nSurfSample,1:Ray%nSurfSample,nComputeNodeSurfTotalSides/),PhotonSampWall_Shared_Win,PhotonSampWall_Shared) CALL MPI_WIN_LOCK_ALL(0,PhotonSampWall_Shared_Win,IERROR) PhotonSampWall => PhotonSampWall_Shared IF (myComputeNodeRank.EQ.0) PhotonSampWall = 0. CALL BARRIER_AND_SYNC(PhotonSampWall_Shared_Win,MPI_COMM_SHARED) #else -ALLOCATE(PhotonSampWall(2,1:nSurfSample,1:nSurfSample,1:nComputeNodeSurfTotalSides)) +ALLOCATE(PhotonSampWall(2,1:Ray%nSurfSample,1:Ray%nSurfSample,1:nComputeNodeSurfTotalSides)) PhotonSampWall=0.0 #endif diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 index e4aa86340..cf1c29db0 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 @@ -76,8 +76,10 @@ SUBROUTINE WritePhotonVolSampleToHDF5() #endif /*USE_MPI*/ REAL :: J_N(1,0:PP_N,0:PP_N,0:PP_N) REAL :: J_Nmax(1:1,0:Ray%NMax,0:Ray%NMax,0:Ray%NMax) +REAL :: J_Nloc(1:1,0:Ray%NMax,0:Ray%NMax,0:Ray%NMax) REAL :: IntegrationWeight -REAL :: Vdm_GaussN_Nloc(0:PP_N,0:Ray%NMax) !< for interpolation to Analyze points (from NodeType nodes to Gauss-Lobatto nodes) +REAL :: Vdm_GaussN_NMax(0:PP_N,0:Ray%NMax) !< for interpolation to Analyze points (from NodeType nodes to Gauss-Lobatto nodes) +REAL, ALLOCATABLE :: Vdm_GaussN_Nloc(:,:) !< for interpolation to Analyze points (from NodeType nodes to Gauss-Lobatto nodes) !=================================================================================================================================== SWRITE(UNIT_stdOut,'(a)',ADVANCE='NO') ' WRITE Radiation TO HDF5 FILE...' @@ -107,6 +109,8 @@ SUBROUTINE WritePhotonVolSampleToHDF5() StrVarNames(1)='RayElemPassedEnergy1st' StrVarNames(2)='RayElemPassedEnergy2nd' StrVarNames(3)='ElemVolume' +StrVarNames(4)='PhotonEnergyDensity1st' +StrVarNames(5)='PhotonEnergyDensity2nd' ! Generate skeleton for the file with all relevant data on a single proc (MPIRoot) IF(MPIRoot) CALL GenerateFileSkeleton('RadiationVolState',nVarRay,StrVarNames,TRIM(MeshFile),0.,FileNameIn=RadiationVolState,NIn=Ray%NMax,NodeType_in=Ray%NodeType) @@ -118,7 +122,7 @@ SUBROUTINE WritePhotonVolSampleToHDF5() #endif /*USE_MPI*/ ! p-refinement: Interpolate lower degree to higher degree (other way around would require model=T) -CALL GetVandermonde(PP_N, NodeType, Ray%NMax, Ray%NodeType, Vdm_GaussN_Nloc, modal=.FALSE.) +CALL GetVandermonde(PP_N, NodeType, Ray%NMax, Ray%NodeType, Vdm_GaussN_NMax, modal=.FALSE.) #if USE_MPI ASSOCIATE( RayElemPassedEnergy => RayElemPassedEnergy_Shared ) @@ -165,6 +169,43 @@ SUBROUTINE WritePhotonVolSampleToHDF5() END ASSOCIATE END IF ! nProcessors.GT.1 #endif /*USE_MPI*/ + + ! Get the element volumes on Nloc + ! Apply integration weights and the Jacobian + ! Interpolate the Jacobian to the analyze grid: be careful we interpolate the inverse of the inverse of the Jacobian ;-) + J_N(1,0:PP_N,0:PP_N,0:PP_N)=1./sJ(:,:,:,iElem) + ! p-refinement: Interpolate lower degree to higher degree (other way around would require model=T) + J_Nloc = 0. + IF(PP_N.EQ.Nloc)THEN + J_Nloc(1,0:PP_N,0:PP_N,0:PP_N) = J_N(1,0:PP_N,0:PP_N,0:PP_N) + ELSE + ALLOCATE(Vdm_GaussN_Nloc(0:PP_N,0:Nloc)) + IF(Nloc.LT.PP_N)THEN + CALL GetVandermonde(PP_N, NodeType, Nloc, Ray%NodeType, Vdm_GaussN_Nloc, modal=.TRUE.) + ELSE + CALL GetVandermonde(PP_N, NodeType, Nloc, Ray%NodeType, Vdm_GaussN_Nloc, modal=.FALSE.) + END IF ! Nloc.LT.PP_N + CALL ChangeBasis3D(1,PP_N,Nloc,Vdm_GaussN_Nloc,J_N(1:1,0:PP_N,0:PP_N,0:PP_N),J_Nloc(1:1,0:Nloc,0:Nloc,0:Nloc)) + END IF ! PP_N.EQ.Nloc + + ! Calculate the sub-volumes + DO m=0,Nloc + DO l=0,Nloc + DO k=0,Nloc + IntegrationWeight = N_Inter_Ray(Nloc)%wGP(k)*& + N_Inter_Ray(Nloc)%wGP(l)*& + N_Inter_Ray(Nloc)%wGP(m)*J_Nloc(1,k,l,m) + !UNMax(1:2,k,l,m,iElem) = UNMax(1:2,k,l,m,iElem) / IntegrationWeight + U_N_Ray(iGlobalElem)%U(3,k,l,m) = IntegrationWeight + END DO ! k + END DO ! l + END DO ! m + IF(PP_N.NE.Nloc) DEALLOCATE(Vdm_GaussN_Nloc) + + ! Calculate the photon energy density on Nloc + U_N_Ray(iGlobalElem)%U(4,:,:,:) = U_N_Ray(iGlobalElem)%U(1,:,:,:)/U_N_Ray(iGlobalElem)%U(3,:,:,:) + U_N_Ray(iGlobalElem)%U(5,:,:,:) = U_N_Ray(iGlobalElem)%U(2,:,:,:)/U_N_Ray(iGlobalElem)%U(3,:,:,:) + IF(Nloc.EQ.Ray%Nmax)THEN UNMax(:,:,:,:,iElem) = U_N_Ray(iGlobalElem)%U(:,:,:,:) ELSE @@ -174,10 +215,11 @@ SUBROUTINE WritePhotonVolSampleToHDF5() ! Copy data from global array (later used for emission) U_N_Ray_loc(iElem)%U(:,:,:,:) = U_N_Ray(iGlobalElem)%U(:,:,:,:) + ! Apply integration weights and the Jacobian ! Interpolate the Jacobian to the analyze grid: be careful we interpolate the inverse of the inverse of the Jacobian ;-) J_N(1,0:PP_N,0:PP_N,0:PP_N)=1./sJ(:,:,:,iElem) - CALL ChangeBasis3D(1,PP_N,Ray%NMax,Vdm_GaussN_Nloc,J_N(1:1,0:PP_N,0:PP_N,0:PP_N),J_Nmax(1:1,:,:,:)) + CALL ChangeBasis3D(1,PP_N,Ray%NMax,Vdm_GaussN_NMax,J_N(1:1,0:PP_N,0:PP_N,0:PP_N),J_Nmax(1:1,:,:,:)) DO m=0,Ray%NMax DO l=0,Ray%NMax DO k=0,Ray%NMax @@ -246,8 +288,9 @@ SUBROUTINE WritePhotonSurfSampleToHDF5() USE MOD_Particle_Boundary_Vars ,ONLY: SurfSideArea #endif /*USE_MPI*/ USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall -USE MOD_Particle_Boundary_Vars ,ONLY: nSurfSample, PartBound +USE MOD_Particle_Boundary_Vars ,ONLY: PartBound USE MOD_Photon_TrackingVars ,ONLY: RadiationSurfState +USE MOD_RayTracing_Vars ,ONLY: Ray !----------------------------------------------------------------------------------------------------------------------------------! ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -258,8 +301,6 @@ SUBROUTINE WritePhotonSurfSampleToHDF5() ! LOCAL VARIABLES CHARACTER(LEN=255) :: Statedummy CHARACTER(LEN=255) :: H5_Name, H5_Name2 -CHARACTER(LEN=4),PARAMETER :: NodeTypeTemp = 'VISU' -!CHARACTER(LEN=4),PARAMETER :: NodeTypeTemp = 'VISU_INNER' CHARACTER(LEN=255),ALLOCATABLE :: Str2DVarNames(:) INTEGER :: GlobalSideID, iSurfSide, OutputCounter, SurfSideNb, p, q INTEGER,PARAMETER :: nVar2D=3 @@ -289,11 +330,11 @@ SUBROUTINE WritePhotonSurfSampleToHDF5() Statedummy = 'RadiationSurfState' ! Write file header CALL WriteHDF5Header(Statedummy,File_ID) - CALL WriteAttributeToHDF5(File_ID , 'DSMC_nSurfSample' , 1 , IntegerScalar = nSurfSample ) + CALL WriteAttributeToHDF5(File_ID , 'DSMC_nSurfSample' , 1 , IntegerScalar = Ray%nSurfSample ) CALL WriteAttributeToHDF5(File_ID , 'MeshFile' , 1 , StrScalar = (/TRIM(MeshFile)/) ) CALL WriteAttributeToHDF5(File_ID , 'BC_Surf' , nSurfBC , StrArray = SurfBCName ) - CALL WriteAttributeToHDF5(File_ID , 'N' , 1 , IntegerScalar = nSurfSample ) - CALL WriteAttributeToHDF5(File_ID , 'NodeType' , 1 , StrScalar = (/NodeTypeTemp/) ) + CALL WriteAttributeToHDF5(File_ID , 'N' , 1 , IntegerScalar = Ray%nSurfSample ) + CALL WriteAttributeToHDF5(File_ID , 'NodeType' , 1 , StrScalar = (/Ray%NodeType/) ) CALL WriteAttributeToHDF5(File_ID , 'Time' , 1 , RealScalar = 0. ) ALLOCATE(Str2DVarNames(1:nVar2D)) @@ -322,7 +363,7 @@ SUBROUTINE WritePhotonSurfSampleToHDF5() #endif ASSOCIATE (& - nSurfSample => INT(nSurfSample , IK) , & + nSurfSample => INT(Ray%nSurfSample , IK) , & nGlobalSides => INT(nOutputSides , IK) , & LocalnBCSides => INT(nComputeNodeSurfOutputSides , IK) , & offsetSurfSide => INT(offsetComputeNodeSurfOutputSide , IK) , & @@ -394,9 +435,10 @@ SUBROUTINE ExchangeRadiationSurfData() ! MODULES ! !----------------------------------------------------------------------------------------------------------------------------------! USE MOD_Globals -USE MOD_Particle_Boundary_Vars ,ONLY: SurfOnNode, SurfMapping, nComputeNodeSurfTotalSides, GlobalSide2SurfSide, nSurfSample +USE MOD_Particle_Boundary_Vars ,ONLY: SurfOnNode, SurfMapping, nComputeNodeSurfTotalSides, GlobalSide2SurfSide USE MOD_Particle_MPI_Vars ,ONLY: SurfSendBuf,SurfRecvBuf USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWallProc, PhotonSampWall_Shared, PhotonSampWall_Shared_Win +USE MOD_RayTracing_Vars ,ONLY: Ray USE MOD_MPI_Shared_Vars ,ONLY: MPI_COMM_LEADERS_SURF, MPI_COMM_SHARED, nSurfLeaders,myComputeNodeRank,mySurfRank USE MOD_MPI_Shared !----------------------------------------------------------------------------------------------------------------------------------! @@ -414,7 +456,7 @@ SUBROUTINE ExchangeRadiationSurfData() ! nodes without sampling surfaces do not take part in this routine IF (.NOT.SurfOnNode) RETURN -MessageSize = 2*nComputeNodeSurfTotalSides*(nSurfSample**2) +MessageSize = 2*nComputeNodeSurfTotalSides*(Ray%nSurfSample**2) IF (myComputeNodeRank.EQ.0) THEN CALL MPI_REDUCE(PhotonSampWallProc, PhotonSampWall_Shared, MessageSize, MPI_DOUBLE_PRECISION, MPI_SUM, 0, MPI_COMM_SHARED, IERROR) ELSE @@ -464,12 +506,12 @@ SUBROUTINE ExchangeRadiationSurfData() SideID = SurfMapping(iProc)%SendSurfGlobalID(iSurfSide) SurfSideID = GlobalSide2SurfSide(SURF_SIDEID,SideID) ! Assemble message - DO q = 1,nSurfSample - DO p = 1,nSurfSample + DO q = 1,Ray%nSurfSample + DO p = 1,Ray%nSurfSample SurfSendBuf(iProc)%content(iPos+1:iPos+2) = PhotonSampWall_Shared(:,p,q,SurfSideID) iPos = iPos + 2 - END DO ! p=0,nSurfSample - END DO ! q=0,nSurfSample + END DO ! p=0,Ray%nSurfSample + END DO ! q=0,Ray%nSurfSample PhotonSampWall_Shared(:,:,:,SurfSideID)=0. END DO ! iSurfSide = 1,SurfMapping(iProc)%nSendSurfSides END DO @@ -520,13 +562,13 @@ SUBROUTINE ExchangeRadiationSurfData() DO iSurfSide = 1,SurfMapping(iProc)%nRecvSurfSides SideID = SurfMapping(iProc)%RecvSurfGlobalID(iSurfSide) SurfSideID = GlobalSide2SurfSide(SURF_SIDEID,SideID) - DO q = 1,nSurfSample - DO p = 1,nSurfSample + DO q = 1,Ray%nSurfSample + DO p = 1,Ray%nSurfSample PhotonSampWall_Shared(:,p,q,SurfSideID) = PhotonSampWall_Shared(:,p,q,SurfSideID) & + SurfRecvBuf(iProc)%content(iPos+1:iPos+2) iPos = iPos + 2 - END DO ! p=0,nSurfSample - END DO ! q=0,nSurfSample + END DO ! p=0,Ray%nSurfSample + END DO ! q=0,Ray%nSurfSample END DO ! iSurfSide = 1,SurfMapping(iProc)%nRecvSurfSides ! Nullify buffer SurfRecvBuf(iProc)%content = 0. diff --git a/src/radiation/ray_tracing/raytrace.f90 b/src/radiation/ray_tracing/raytrace.f90 index 7c59fd67c..95f36a101 100644 --- a/src/radiation/ray_tracing/raytrace.f90 +++ b/src/radiation/ray_tracing/raytrace.f90 @@ -54,7 +54,7 @@ SUBROUTINE RayTracing() USE MOD_Particle_Boundary_Vars ,ONLY: nComputeNodeSurfTotalSides,PartBound,SurfSide2GlobalSide USE MOD_Particle_Mesh_Vars ,ONLY: SideInfo_Shared USE MOD_Particle_Boundary_Tools ,ONLY: StoreBoundaryParticleProperties -USE MOD_Particle_Boundary_Vars ,ONLY: PartStateBoundary,nVarPartStateBoundary,nSurfSample +USE MOD_Particle_Boundary_Vars ,ONLY: PartStateBoundary,nVarPartStateBoundary USE MOD_Photon_TrackingOutput ,ONLY: WritePhotonSurfSampleToHDF5,WritePhotonVolSampleToHDF5 #if USE_MPI USE MOD_MPI_Shared_Vars @@ -123,13 +123,13 @@ SUBROUTINE RayTracing() RayElemPassedEnergy=0.0 #if USE_MPI -ALLOCATE(PhotonSampWallProc(2,1:nSurfSample,1:nSurfSample,1:nComputeNodeSurfTotalSides)) +ALLOCATE(PhotonSampWallProc(2,1:Ray%nSurfSample,1:Ray%nSurfSample,1:nComputeNodeSurfTotalSides)) PhotonSampWallProc=0.0 !> Shared arrays for volume sampling CALL Allocate_Shared((/RayElemSize,nGlobalElems/),RayElemPassedEnergy_Shared_Win,RayElemPassedEnergy_Shared) CALL MPI_WIN_LOCK_ALL(0,RayElemPassedEnergy_Shared_Win,IERROR) !> Shared arrays for boundary sampling -CALL Allocate_Shared((/2,nSurfSample,nSurfSample,nComputeNodeSurfTotalSides/),PhotonSampWall_Shared_Win,PhotonSampWall_Shared) +CALL Allocate_Shared((/2,Ray%nSurfSample,Ray%nSurfSample,nComputeNodeSurfTotalSides/),PhotonSampWall_Shared_Win,PhotonSampWall_Shared) CALL MPI_WIN_LOCK_ALL(0,PhotonSampWall_Shared_Win,IERROR) PhotonSampWall => PhotonSampWall_Shared IF(myComputeNodeRank.EQ.0) RayElemPassedEnergy_Shared = 0. @@ -137,7 +137,7 @@ SUBROUTINE RayTracing() CALL BARRIER_AND_SYNC(RayElemPassedEnergy_Shared_Win,MPI_COMM_SHARED) CALL BARRIER_AND_SYNC(PhotonSampWall_Shared_Win,MPI_COMM_SHARED) #else -ALLOCATE(PhotonSampWall(2,1:nSurfSample,1:nSurfSample,1:nComputeNodeSurfTotalSides)) +ALLOCATE(PhotonSampWall(2,1:Ray%nSurfSample,1:Ray%nSurfSample,1:nComputeNodeSurfTotalSides)) PhotonSampWall=0.0 #endif @@ -267,7 +267,6 @@ SUBROUTINE ReadRayTracingDataFromH5(onlySurfData) USE MOD_ChangeBasis ,ONLY: ChangeBasis3D USE MOD_RayTracing_Vars ,ONLY: RaySecondaryVectorX,RaySecondaryVectorY,RaySecondaryVectorZ USE MOD_Mesh_Vars ,ONLY: nBCSides,offsetElem,SideToElem -USE MOD_Particle_Boundary_Vars ,ONLY: nSurfSample USE MOD_Particle_Mesh_Tools ,ONLY: GetGlobalNonUniqueSideID #if USE_MPI USE MOD_MPI_Shared @@ -308,12 +307,12 @@ SUBROUTINE ReadRayTracingDataFromH5(onlySurfData) ! Node leaders notify the processes on their node CALL MPI_BCAST(nSurfSidesHDF5,1,MPI_INTEGER,0,MPI_COMM_SHARED,iERROR) #else -ALLOCATE(PhotonSampWallHDF5(1:3,1:nSurfSample,1:nSurfSample,1:nSurfSidesHDF5)) +ALLOCATE(PhotonSampWallHDF5(1:3,1:Ray%nSurfSample,1:Ray%nSurfSample,1:nSurfSidesHDF5)) #endif #if USE_MPI -CALL Allocate_Shared((/3,nSurfSample,nSurfSample,nSurfSidesHDF5/),PhotonSampWallHDF5_Shared_Win,PhotonSampWallHDF5_Shared) +CALL Allocate_Shared((/3,Ray%nSurfSample,Ray%nSurfSample,nSurfSidesHDF5/),PhotonSampWallHDF5_Shared_Win,PhotonSampWallHDF5_Shared) CALL MPI_WIN_LOCK_ALL(0,PhotonSampWallHDF5_Shared_Win,IERROR) PhotonSampWallHDF5 => PhotonSampWallHDF5_Shared ! Only shared memory leaders load the data from .h5 @@ -321,7 +320,7 @@ SUBROUTINE ReadRayTracingDataFromH5(onlySurfData) #endif CALL DatasetExists(File_ID,'SurfaceData',ContainerExists) IF(.NOT.ContainerExists) CALL CollectiveStop(__STAMP__,'SurfaceData container not in '//TRIM(RadiationSurfState)) - CALL ReadArray('SurfaceData',4,(/3_IK,INT(nSurfSample,IK),INT(nSurfSample,IK),INT(nSurfSidesHDF5,IK)/),0_IK,1,RealArray=PhotonSampWallHDF5) + CALL ReadArray('SurfaceData',4,(/3_IK,INT(Ray%nSurfSample,IK),INT(Ray%nSurfSample,IK),INT(nSurfSidesHDF5,IK)/),0_IK,1,RealArray=PhotonSampWallHDF5) CALL CloseDataFile() ! Small hack: replace 3rd index with global ID DO iSurfSideHDF5 = 1, nSurfSidesHDF5 @@ -334,7 +333,7 @@ SUBROUTINE ReadRayTracingDataFromH5(onlySurfData) CALL BARRIER_AND_SYNC(PhotonSampWallHDF5_Shared_Win,MPI_COMM_SHARED) #endif /*USE_MPI*/ -ALLOCATE(PhotonSampWall_loc(1:nSurfSample,1:nSurfSample,1:nBCSides)) +ALLOCATE(PhotonSampWall_loc(1:Ray%nSurfSample,1:Ray%nSurfSample,1:nBCSides)) PhotonSampWall_loc = -1.0 ! Loop through large loop (TODO: can this be made cheaper?) DO iSurfSideHDF5 = 1, nSurfSidesHDF5 @@ -349,10 +348,10 @@ SUBROUTINE ReadRayTracingDataFromH5(onlySurfData) iLocSide = SideToElem(S2E_LOC_SIDE_ID,BCSideID) SideID = GetGlobalNonUniqueSideID(offsetElem+locElemID,iLocSide) IF(GlobalSideID.EQ.SideID)THEN - PhotonSampWall_loc(1:nSurfSample,1:nSurfSample,BCSideID) = PhotonSampWallHDF5(2,1:nSurfSample,1:nSurfSample,iSurfSideHDF5) + PhotonSampWall_loc(1:Ray%nSurfSample,1:Ray%nSurfSample,BCSideID) = PhotonSampWallHDF5(2,1:Ray%nSurfSample,1:Ray%nSurfSample,iSurfSideHDF5) ! Check if element fas already been flagged an emission element (either volume or surface emission) IF(.NOT.RayElemEmission(1,locElemID))THEN - IF(ANY(PhotonSampWall_loc(1:nSurfSample,1:nSurfSample,BCSideID).GT.0.0)) RayElemEmission(1,locElemID) = .TRUE. + IF(ANY(PhotonSampWall_loc(1:Ray%nSurfSample,1:Ray%nSurfSample,BCSideID).GT.0.0)) RayElemEmission(1,locElemID) = .TRUE. END IF ! .NOT.RayElemEmission(1,locElemID) END IF ! GlobalSideID.EQ. END DO ! BCSideID = 1,nBCSides diff --git a/src/radiation/ray_tracing/raytrace_ini.f90 b/src/radiation/ray_tracing/raytrace_ini.f90 index 68f027d0d..d31045437 100644 --- a/src/radiation/ray_tracing/raytrace_ini.f90 +++ b/src/radiation/ray_tracing/raytrace_ini.f90 @@ -35,25 +35,27 @@ SUBROUTINE DefineParametersRayTracing() IMPLICIT NONE !================================================================================================================================== CALL prms%SetSection("Ray Tracing") -CALL prms%CreateIntOption( 'RayTracing-NumRays' , 'Number of emitted rays from particle boundary with index [RayTracing-PartBound]') -CALL prms%CreateRealArrayOption( 'RayTracing-RayDirection' , 'Direction vector for ray emission. Will be normalized after read-in.' , no=3) -CALL prms%CreateIntOption( 'RayTracing-PartBound' , 'Particle boundary ID where rays are emitted from' , '0') -CALL prms%CreateRealOption( 'RayTracing-PulseDuration' , 'Pulse duration tau for a Gaussian-type pulse with I~exp(-(t/tau)^2) [s]' ) -CALL prms%CreateIntOption( 'RayTracing-NbrOfPulses' , 'Number of pulses [-]' , '1') -CALL prms%CreateRealOption( 'RayTracing-WaistRadius' , 'Beam waist radius (in focal spot) w_b for Gaussian-type pulse with I~exp(-(r/w_b)^2) [m]' , '0.0') -CALL prms%CreateRealOption( 'RayTracing-WaveLength' , 'Beam wavelength [m]' ) -CALL prms%CreateRealOption( 'RayTracing-RepetitionRate' , 'Pulse repetition rate (pulses per second) [Hz]' ) -CALL prms%CreateRealOption( 'RayTracing-PowerDensity' , 'Average pulse power density (power per area) [W/m2]') -CALL prms%CreateLogicalOption( 'RayTracing-ForceAbsorption' , 'Surface photon sampling is performed independent of the actual absorption/reflection outcome (default=T)', '.TRUE.') -CALL prms%CreateIntOption( 'RayTracing-NMax' , 'Maximum polynomial degree within refined volume elements for photon tracking (p-adaption)') -CALL prms%CreateIntOption( 'RayTracing-VolRefineMode' , 'High-order ray tracing volume sampling refinement method:\n'//& - ' 0: do nothing (default)\n'//& - ' 1: refine below user-defined z-coordinate with NMax\n'//& - ' 2: scale N according to the mesh element volume between NMin>=1 and NMax>=2\n'//& - ' 3: refine below user-defined z-coordinate and scale N according to the mesh element volume between NMin>=1 and NMax>=2\n'//& - ' (consider only elements below the user-defined z-coordinate for the scaling)'& - ,'0') -CALL prms%CreateRealOption( 'RayTracing-VolRefineModeZ' , 'Z-coordinate for switching between NMin (pos>z) and NMax (pos=1 and NMax>=2\n'//& + ' 3: refine below user-defined z-coordinate and scale N according to the mesh element volume between NMin>=1 and NMax>=2\n'//& + ' (consider only elements below the user-defined z-coordinate for the scaling)'& + , '0') +CALL prms%CreateRealOption( 'RayTracing-VolRefineModeZ' , 'Z-coordinate for switching between NMin (pos>z) and NMax (pos Date: Tue, 5 Sep 2023 23:22:26 +0200 Subject: [PATCH 189/495] Scaling of the particle weights in truncated running average to account for weighting factor change during macroscopic restart, added it to the regression test as post-external --- REGGIE.md | 61 ++++---- .../DSMC.ini | 11 -- .../PartAnalyze_ref.csv | 52 ------- .../analyze.ini | 4 - .../command_line.ini | 2 - .../cube_mesh.h5 | Bin 647858 -> 0 bytes .../PartAnalyze_ref.csv | 14 ++ .../analyze.ini | 6 + .../command_line.ini | 1 + .../externals.ini | 8 + .../hopr.ini | 0 .../parameter.ini | 141 +++++++++++++++++ .../parameter_macrorestart.ini | 145 ++++++++++++++++++ .../readme.md | 3 +- .../PartAnalyze_ref.csv | 14 ++ .../analyze.ini | 6 + .../command_line.ini | 1 + .../externals.ini | 8 + .../hopr.ini | 31 ++++ .../parameter.ini | 29 ++-- .../parameter_macrorestart.ini | 144 +++++++++++++++++ .../readme.md | 6 + .../PartAnalyze_ref.csv | 14 ++ .../analyze.ini | 6 + .../command_line.ini | 1 + .../externals.ini | 8 + .../hopr.ini | 31 ++++ .../parameter.ini | 141 +++++++++++++++++ .../parameter_macrorestart.ini | 145 ++++++++++++++++++ .../readme.md | 6 + src/io_hdf5/hdf5_output_particle.f90 | 5 +- .../sampling/particle_sampling_adaptive.f90 | 33 ++-- 32 files changed, 956 insertions(+), 121 deletions(-) delete mode 100644 regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure/DSMC.ini delete mode 100644 regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure/PartAnalyze_ref.csv delete mode 100644 regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure/analyze.ini delete mode 100644 regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure/command_line.ini delete mode 100644 regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure/cube_mesh.h5 create mode 100644 regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_FixedAverage/PartAnalyze_ref.csv create mode 100644 regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_FixedAverage/analyze.ini create mode 100644 regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_FixedAverage/command_line.ini create mode 100644 regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_FixedAverage/externals.ini rename regressioncheck/WEK_DSMC/{ChannelFlow_AdaptiveBoundary_ConstPressure => ChannelFlow_AdaptiveBoundary_ConstPressure_FixedAverage}/hopr.ini (100%) create mode 100644 regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_FixedAverage/parameter.ini create mode 100644 regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_FixedAverage/parameter_macrorestart.ini rename regressioncheck/WEK_DSMC/{ChannelFlow_AdaptiveBoundary_ConstPressure => ChannelFlow_AdaptiveBoundary_ConstPressure_FixedAverage}/readme.md (75%) create mode 100644 regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_Relaxation/PartAnalyze_ref.csv create mode 100644 regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_Relaxation/analyze.ini create mode 100644 regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_Relaxation/command_line.ini create mode 100644 regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_Relaxation/externals.ini create mode 100644 regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_Relaxation/hopr.ini rename regressioncheck/WEK_DSMC/{ChannelFlow_AdaptiveBoundary_ConstPressure => ChannelFlow_AdaptiveBoundary_ConstPressure_Relaxation}/parameter.ini (88%) create mode 100644 regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_Relaxation/parameter_macrorestart.ini create mode 100644 regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_Relaxation/readme.md create mode 100644 regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_TruncAverage/PartAnalyze_ref.csv create mode 100644 regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_TruncAverage/analyze.ini create mode 100644 regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_TruncAverage/command_line.ini create mode 100644 regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_TruncAverage/externals.ini create mode 100644 regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_TruncAverage/hopr.ini create mode 100644 regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_TruncAverage/parameter.ini create mode 100644 regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_TruncAverage/parameter_macrorestart.ini create mode 100644 regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_TruncAverage/readme.md diff --git a/REGGIE.md b/REGGIE.md index d62e19251..3f5e805f4 100644 --- a/REGGIE.md +++ b/REGGIE.md @@ -126,8 +126,8 @@ Compilation of the code the CODE_ANALYZE option, which includes many different t | 4 | periodic | | | nProcs= | | [Link](regressioncheck/NIG_code_analyze/periodic/readme.md) | | 5 | Semicircle | | | nProcs= | | [Link](regressioncheck/NIG_code_analyze/Semicircle/readme.md) | | 6 | vMPF_SplitAndMerge_Reservoir | DSMC only | Split and Mergin routines | nProcs=1 | Energy and momentum conservation, PartAnalyze: number density, energy and particle numbers | [Link](regressioncheck/NIG_code_analyze/vMPF_SplitAndMerge_Reservoir/readme.md) | -| 7 | Rotational_Reference_Frame | DSMC only | acceleration by fictitious forces | nProcs=1 | L2 | [Link](regressioncheck/NIG_code_analyze/Rotational_Reference_Frame/readme.md) | -| 8 | Rotational_Reference_Frame_Wall_Specular | DSMC only | acceleration by fictitious forces, specular reflection at wall | nProcs=1 | L2 | [Link](regressioncheck/NIG_code_analyze/Rotational_Reference_Frame_Wall_Specular/readme.md) | +| 7 | Rotational_Reference_Frame | DSMC only | acceleration by fictitious forces | nProcs=1 | L2 | [Link](regressioncheck/NIG_code_analyze/Rotational_Reference_Frame/readme.md) | +| 8 | Rotational_Reference_Frame_Wall_Specular | DSMC only | acceleration by fictitious forces, specular reflection at wall | nProcs=1 | L2 | [Link](regressioncheck/NIG_code_analyze/Rotational_Reference_Frame_Wall_Specular/readme.md) | @@ -416,30 +416,33 @@ Test all features of photoionization within the HDG solver (without interpolatio Overview of the test cases performed every week. -| **No.** | **Case** | **CMAKE-CONFIG** | **Feature** | **Execution** | **Comparing** | **Readme** | -| :-----: | :----------------------------------------: | :-------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------: | :---------------------------: | :-------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------: | -| 1 | plasma_wave | [PIC-Maxwell](regressioncheck/WEK_PIC_maxwell/builds.ini) | Maxwell-PIC,SF1D, FastPeriodic | nProcs=6, IMEX for ImplicitO4 | W_el LineIntegration (FieldAnalyze.csv) | [Link](regressioncheck/WEK_PIC_maxwell/plasma_wave/readme.md) | -| ** | 3D_periodic_shape_function | ** | Maxwell-PIC,shape function deposition over periodic sides 3D | nProcs= 1,2,6,10,20 | L2 error and PartAnalyze.csv | [Link](regressioncheck/WEK_PIC_maxwell/3D_periodic_shape_function/readme.md) | -| ** | 3D_periodic_CVWM | ** | Maxwell-PIC,CVWM over periodic sides 3D with 1000 elements | nProcs= 1,2,6,10,15,20,30 | L2 error and PartAnalyze.csv | [Link](regressioncheck/WEK_PIC_maxwell/3D_periodic_CVWM/readme.md) | -| ** | 3D_periodic_CVWM_split2hex | ** | Maxwell-PIC,CVWM over periodic sides 3D and split2hex grid with 768 hex elements | nProcs= 1,2,6,10,15,20,30 | L2 error and PartAnalyze.csv | [Link](regressioncheck/WEK_PIC_maxwell/3D_periodic_CVWM_split2hex/readme.md) | -| 2 | HEMPT-90deg-symmetry | [PIC-HDG](regressioncheck/WEK_PIC_poisson/builds.ini) | create mesh (hopr) and external magnetic field (superB) and use both in simulation | nProcs=1,10,20 | | [Link](regressioncheck/WEK_PIC_poisson/HEMPT-90deg-symmetry/readme.md) | -| 3 | CHEM_EQUI_diss_CH4 | [Reservoir](regressioncheck/WEK_Reservoir/builds.ini) | Relaxation into equilibrium with dissociation and recombination of CH4 | nProcs=2 | PartAnalyze_ref.csv | [Link](regressioncheck/WEK_Reservoir/CHEM_EQUI_diss_CH4/readme.md) | -| ** | CHEM_EQUI_exch_CH3-H | ** | Relaxation into equilibrium with exchange/radical reaction of CH3+H <-> CH2+H2 | nProcs=2 | PartAnalyze_ref.csv | [Link](regressioncheck/WEK_Reservoir/CHEM_EQUI_exch_CH3-H/readme.md) | -| ** | CHEM_EQUI_ionization_H | ** | Relaxation into equilibrium with ionization and recombination of H | nProcs=1 | PartAnalyze_ref.csv | [Link](regressioncheck/WEK_Reservoir/CHEM_EQUI_ionization_H/readme.md) | -| ** | CHEM_EQUI_diss_CH4_2DAxi_RadWeight | ** | Analogous to CHEM_EQUI_diss_CH4 with 2D axisymmetric mesh with radial weighting | nProcs=2 | PartAnalyze_ref.csv | [Link](regressioncheck/WEK_Reservoir/CHEM_EQUI_diss_CH4_2DAxi_RadWeight/readme.md) | -| ** | CHEM_EQUI_Titan_Chemistry | ** | Reservoir simulation of conditions similar to Titan's atmosphere (18 species, 28 reactions) | nProcs=2 | PartAnalyze_ref.csv | [Link](regressioncheck/WEK_Reservoir/CHEM_EQUI_Titan_Chemistry/readme.md) | -| ** | MCC_MultiSpec_XSec | ** | Multi-species reservoir: Collision rates for neutral-electrons through cross-section data | nProcs=1 | | [Link](regressioncheck/WEK_Reservoir/MCC_MultiSpec_XSec/readme.md) | -| ** | MCC_MultiSpec_XSec_TCE_QK_Chem | ** | Multi-species reservoir: QK ionization and TCE dissociation | nProcs=2 | | [Link](regressioncheck/WEK_Reservoir/MCC_MultiSpec_XSec_Chem/readme.md) | -| ** | BGG_MultiSpec_XSec_Elec | ** | Background gas reservoir with VHS: Electronic excitation rates for neutral-electrons through cross-section data | nProcs=1 | | [Link](regressioncheck/WEK_Reservoir/BGG_MultiSpec_XSec_Elec/readme.md) | -| ** | MCC_N2_XSec_Elec | ** | Regular reservoir with MCC/VHS: Electronic excitation rates for neutral-electrons through cross-section data | nProcs=1 | | [Link](regressioncheck/WEK_Reservoir/MCC_N2_XSec_Elec/readme.md) | -| ** | 1D_Sod_Shocktube | ** | 1D test case shock tube | nProcs=1 | | [Link](regressioncheck/WEK_Reservoir/1D_Sod_Shocktube/readme.md) | -| 4 | ChannelFlow_AdaptiveBoundary_ConstPressure | [DSMC](regressioncheck/WEK_DSMC/builds.ini) | Pressure gradient driven channel flow with adaptive surface flux boundary conditions | nProcs=6 | PartAnalyze: Average pressure and mass flow rate at the adaptive surface flux BCs | [Link](regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure/readme.md) | -| ** | Flow_Argon_Cylinder_Curved | ** | Hypersonic Argon flow around a cylinder (pseudo 2D) with DSMC on a curved mesh | nProcs=2 | | [Link](regressioncheck/WEK_DSMC/Flow_Argon_Cylinder_Curved/readme.md) | -| ** | Flow_Argon_Cylinder_LinearMesh | ** | Hypersonic Argon flow around a cylinder (2D) with DSMC on a linear mesh | nProcs=4 | | [Link](regressioncheck/WEK_DSMC/Flow_Argon_Cylinder_LinearMesh/readme.md) | -| ** | Flow_N2_70degCone | ** | 2D axisymmetric 70 degree cone | nProcs=6 | Surface Sampling, includes CalcSurfaceImpact and adaptive wall temperature | [Link](regressioncheck/WEK_DSMC/Flow_N2_70degCone/readme.md) | -| ** | fully_periodic_3D | ** | Periodic boundary conditions in all three directions | nProcs=10,20,30 | Check whether particles end up outside of the domain | [Link](regressioncheck/WEK_DSMC/fully_periodic_3D/readme.md) | -| ** | Surface_Sticking_Coefficient | ** | Channel flow with a sticking coefficient model | nProcs=5 | Surface sampling | [Link](regressioncheck/WEK_DSMC/Surface_Sticking_Coefficient/readme.md) | -| 5 | Flow_N2_70degCone | [BGK](regressioncheck/WEK_BGKFlow/builds.ini) | 2D axisymmetric 70 degree cone | nProcs=6 | | [Link](regressioncheck/WEK_DSMC/Flow_N2_70degCone/readme.md) | -| ** | MultiSpec_Supersonic_Couette_Ar-He | ** | Supersonic Couette flow with an Ar-He mixture | nProcs=5 | Temperature | [Link](regressioncheck/WEK_DSMC/MultiSpec_Supersonic_Couette_Ar-He/readme.md) | -| ** | MultiSpec_Supersonic_Couette_CO2-N2 | ** | Supersonic Couette flow with a CO2-N2 mixture | nProcs=5 | Temperature | [Link](regressioncheck/WEK_DSMC/MultiSpec_Supersonic_Couette_CO2-N2/readme.md) | -| 6 | Flow_N2_70degCone | [FP](regressioncheck/WEK_FPFlow/builds.ini) | 2D axisymmetric 70 degree cone | nProcs=6 | Surface Sampling, includes CalcSurfaceImpact | [Link](regressioncheck/WEK_DSMC/Flow_N2_70degCone/readme.md) | +| **No.** | **Case** | **CMAKE-CONFIG** | **Feature** | **Execution** | **Comparing** | **Readme** | +| :-----: | :-----------------------------------------------------: | :-------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------- | :---------------------------: | :-------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------: | +| 1 | plasma_wave | [PIC-Maxwell](regressioncheck/WEK_PIC_maxwell/builds.ini) | Maxwell-PIC,SF1D, FastPeriodic | nProcs=6, IMEX for ImplicitO4 | W_el LineIntegration (FieldAnalyze.csv) | [Link](regressioncheck/WEK_PIC_maxwell/plasma_wave/readme.md) | +| ** | 3D_periodic_shape_function | ** | Maxwell-PIC,shape function deposition over periodic sides 3D | nProcs= 1,2,6,10,20 | L2 error and PartAnalyze.csv | [Link](regressioncheck/WEK_PIC_maxwell/3D_periodic_shape_function/readme.md) | +| ** | 3D_periodic_CVWM | ** | Maxwell-PIC,CVWM over periodic sides 3D with 1000 elements | nProcs= 1,2,6,10,15,20,30 | L2 error and PartAnalyze.csv | [Link](regressioncheck/WEK_PIC_maxwell/3D_periodic_CVWM/readme.md) | +| ** | 3D_periodic_CVWM_split2hex | ** | Maxwell-PIC,CVWM over periodic sides 3D and split2hex grid with 768 hex elements | nProcs= 1,2,6,10,15,20,30 | L2 error and PartAnalyze.csv | [Link](regressioncheck/WEK_PIC_maxwell/3D_periodic_CVWM_split2hex/readme.md) | +| 2 | HEMPT-90deg-symmetry | [PIC-HDG](regressioncheck/WEK_PIC_poisson/builds.ini) | create mesh (hopr) and external magnetic field (superB) and use both in simulation | nProcs=1,10,20 | | [Link](regressioncheck/WEK_PIC_poisson/HEMPT-90deg-symmetry/readme.md) | +| 3 | CHEM_EQUI_diss_CH4 | [Reservoir](regressioncheck/WEK_Reservoir/builds.ini) | Relaxation into equilibrium with dissociation and recombination of CH4 | nProcs=2 | PartAnalyze_ref.csv | [Link](regressioncheck/WEK_Reservoir/CHEM_EQUI_diss_CH4/readme.md) | +| ** | CHEM_EQUI_exch_CH3-H | ** | Relaxation into equilibrium with exchange/radical reaction of CH3+H <-> CH2+H2 | nProcs=2 | PartAnalyze_ref.csv | [Link](regressioncheck/WEK_Reservoir/CHEM_EQUI_exch_CH3-H/readme.md) | +| ** | CHEM_EQUI_ionization_H | ** | Relaxation into equilibrium with ionization and recombination of H | nProcs=1 | PartAnalyze_ref.csv | [Link](regressioncheck/WEK_Reservoir/CHEM_EQUI_ionization_H/readme.md) | +| ** | CHEM_EQUI_diss_CH4_2DAxi_RadWeight | ** | Analogous to CHEM_EQUI_diss_CH4 with 2D axisymmetric mesh with radial weighting | nProcs=2 | PartAnalyze_ref.csv | [Link](regressioncheck/WEK_Reservoir/CHEM_EQUI_diss_CH4_2DAxi_RadWeight/readme.md) | +| ** | CHEM_EQUI_Titan_Chemistry | ** | Reservoir simulation of conditions similar to Titan's atmosphere (18 species, 28 reactions) | nProcs=2 | PartAnalyze_ref.csv | [Link](regressioncheck/WEK_Reservoir/CHEM_EQUI_Titan_Chemistry/readme.md) | +| ** | MCC_MultiSpec_XSec | ** | Multi-species reservoir: Collision rates for neutral-electrons through cross-section data | nProcs=1 | | [Link](regressioncheck/WEK_Reservoir/MCC_MultiSpec_XSec/readme.md) | +| ** | MCC_MultiSpec_XSec_TCE_QK_Chem | ** | Multi-species reservoir: QK ionization and TCE dissociation | nProcs=2 | | [Link](regressioncheck/WEK_Reservoir/MCC_MultiSpec_XSec_Chem/readme.md) | +| ** | BGG_MultiSpec_XSec_Elec | ** | Background gas reservoir with VHS: Electronic excitation rates for neutral-electrons through cross-section data | nProcs=1 | | [Link](regressioncheck/WEK_Reservoir/BGG_MultiSpec_XSec_Elec/readme.md) | +| ** | MCC_N2_XSec_Elec | ** | Regular reservoir with MCC/VHS: Electronic excitation rates for neutral-electrons through cross-section data | nProcs=1 | | [Link](regressioncheck/WEK_Reservoir/MCC_N2_XSec_Elec/readme.md) | +| ** | 1D_Sod_Shocktube | [DSMC](regressioncheck/WEK_DSMC/builds.ini) | 1D test case shock tube | nProcs=6 | DSMCState | [Link](regressioncheck/WEK_Reservoir/1D_Sod_Shocktube/readme.md) | +| 4 | ChannelFlow_AdaptiveBoundary_ConstMassflow | ** | Constant massflow driven channel flow with adaptive surface flux | nProcs=6 | PartAnalyze: Average pressure and mass flow rate at the adaptive surface flux BCs | [Link](regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstMassflow/readme.md) | +| 4 | ChannelFlow_AdaptiveBoundary_ConstPressure_FixedAverage | ** | Pressure gradient driven channel flow with adaptive surface flux, using a fixed average for the sampling | nProcs=6 | PartAnalyze: Average pressure at the adaptive surface flux BCs | [Link](regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_FixedAverage/readme.md) | +| 4 | ChannelFlow_AdaptiveBoundary_ConstPressure_Relaxation | ** | Pressure gradient driven channel flow with adaptive surface flux, using a relaxation factor for the sampling | nProcs=6 | PartAnalyze: Average pressure at the adaptive surface flux BCs | [Link](regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_Relaxation/readme.md) | +| 4 | ChannelFlow_AdaptiveBoundary_ConstPressure_TruncAverage | ** | Pressure gradient driven channel flow with adaptive surface flux, using a truncated running average for the sampling | nProcs=6 | PartAnalyze: Average pressure at the adaptive surface flux BCs | [Link](regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_TruncAverage/readme.md) | +| ** | Flow_Argon_Cylinder_Curved | ** | Hypersonic Argon flow around a cylinder (pseudo 2D) with DSMC on a curved mesh | nProcs=2 | | [Link](regressioncheck/WEK_DSMC/Flow_Argon_Cylinder_Curved/readme.md) | +| ** | Flow_Argon_Cylinder_LinearMesh | ** | Hypersonic Argon flow around a cylinder (2D) with DSMC on a linear mesh | nProcs=4 | | [Link](regressioncheck/WEK_DSMC/Flow_Argon_Cylinder_LinearMesh/readme.md) | +| ** | Flow_N2_70degCone | ** | 2D axisymmetric 70 degree cone | nProcs=6 | Surface Sampling, includes CalcSurfaceImpact and adaptive wall temperature | [Link](regressioncheck/WEK_DSMC/Flow_N2_70degCone/readme.md) | +| ** | fully_periodic_3D | ** | Periodic boundary conditions in all three directions | nProcs=10,20,30 | Check whether particles end up outside of the domain | [Link](regressioncheck/WEK_DSMC/fully_periodic_3D/readme.md) | +| ** | Surface_Sticking_Coefficient | ** | Channel flow with a sticking coefficient model | nProcs=5 | Surface sampling | [Link](regressioncheck/WEK_DSMC/Surface_Sticking_Coefficient/readme.md) | +| 5 | Flow_N2_70degCone | [BGK](regressioncheck/WEK_BGKFlow/builds.ini) | 2D axisymmetric 70 degree cone | nProcs=6 | | [Link](regressioncheck/WEK_DSMC/Flow_N2_70degCone/readme.md) | +| ** | MultiSpec_Supersonic_Couette_Ar-He | ** | Supersonic Couette flow with an Ar-He mixture | nProcs=5 | Temperature | [Link](regressioncheck/WEK_DSMC/MultiSpec_Supersonic_Couette_Ar-He/readme.md) | +| ** | MultiSpec_Supersonic_Couette_CO2-N2 | ** | Supersonic Couette flow with a CO2-N2 mixture | nProcs=5 | Temperature | [Link](regressioncheck/WEK_DSMC/MultiSpec_Supersonic_Couette_CO2-N2/readme.md) | +| 6 | Flow_N2_70degCone | [FP](regressioncheck/WEK_FPFlow/builds.ini) | 2D axisymmetric 70 degree cone | nProcs=6 | Surface Sampling, includes CalcSurfaceImpact | [Link](regressioncheck/WEK_DSMC/Flow_N2_70degCone/readme.md) | diff --git a/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure/DSMC.ini b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure/DSMC.ini deleted file mode 100644 index 37bc4124e..000000000 --- a/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure/DSMC.ini +++ /dev/null @@ -1,11 +0,0 @@ -! =============================================================================== ! -! Species1, O2 -! =============================================================================== ! -Part-Species1-InteractionID = 2 -Part-Species1-Tref = 273 -Part-Species1-dref = 4.07E-10 -Part-Species1-omega=0.27 -Part-Species1-SymmetryFactor=2 -Part-Species1-CharaTempRot=2.1 -Part-Species1-CharaTempVib=2272.18 -Part-Species1-Ediss_eV=5.17 diff --git a/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure/PartAnalyze_ref.csv b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure/PartAnalyze_ref.csv deleted file mode 100644 index 371d2937f..000000000 --- a/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure/PartAnalyze_ref.csv +++ /dev/null @@ -1,52 +0,0 @@ -001-TIME,002-Massflow-Spec-001-SF-001,003-Pressure-Spec-001-SF-001,004-Massflow-Spec-001-SF-002,005-Pressure-Spec-001-SF-002 -0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000 -0.1000000000000000E-005,0.1407551448000000E-012,0.2490906382378177E+001,0.5366655199999914E-015,0.2432101393652234E+001 -0.2000000000000000E-005,0.7561138959999994E-013,0.2590032809060696E+001,-.1235659076000000E-013,0.2454502334258208E+001 -0.3000000000000000E-005,0.5843277944000005E-013,0.2733879858690370E+001,-.2770469328000001E-013,0.2475825509865952E+001 -0.4000000000000000E-005,0.5059799419999997E-013,0.2927629921620722E+001,-.3500546976000000E-013,0.2481023695772101E+001 -0.5000000000000000E-005,0.4765164736000001E-013,0.3125960280547306E+001,-.4000017856000001E-013,0.2486569671222123E+001 -0.6000000000000001E-005,0.4443696776000004E-013,0.3318983684942288E+001,-.4170050495999999E-013,0.2494265145572775E+001 -0.7000000000000002E-005,0.4381528591999997E-013,0.3510783739326978E+001,-.4369573172000002E-013,0.2507254002553679E+001 -0.8000000000000001E-005,0.4449275971999997E-013,0.3689320427924668E+001,-.4467341940000001E-013,0.2517701470270561E+001 -0.9000000000000002E-005,0.4367182087999999E-013,0.3849659542467866E+001,-.4423771075999998E-013,0.2522248198463247E+001 -0.1000000000000000E-004,0.4233281384000012E-013,0.4009700372013185E+001,-.4465747884000012E-013,0.2530756512894340E+001 -0.1100000000000000E-004,0.4313811931816325E-013,0.4142587645480774E+001, NaN,0.2534356564300231E+001 -0.1200000000000000E-004,0.4328393392000002E-013,0.4258700719275140E+001,-.4460700040000000E-013,0.2542594719009637E+001 -0.1300000000000000E-004,0.4454855168000001E-013,0.4370880745492689E+001,-.4433069735999999E-013,0.2527021615812964E+001 -0.1400000000000000E-004,0.4303685524000002E-013,0.4462654070534977E+001,-.4346990712000001E-013,0.2532323716149372E+001 -0.1500000000000000E-004,0.4423771076000000E-013,0.4558279688327426E+001,-.4450604352000000E-013,0.2530781622725552E+001 -0.1600000000000000E-004,0.4259051955999997E-013,0.4624844128004400E+001,-.4507459015999999E-013,0.2536891403647415E+001 -0.1700000000000000E-004,0.4470530052000000E-013,0.4678660029754859E+001,-.4437851904000000E-013,0.2536364846958991E+001 -0.1800000000000000E-004,0.4252410056000001E-013,0.4735917313072325E+001,-.4508256044000002E-013,0.2542062252583417E+001 -0.1899999999999999E-004,0.4480360063999998E-013,0.4778029276902938E+001,-.4551029879999999E-013,0.2545212537963385E+001 -0.2000000000000000E-004,0.4193695659999926E-013,0.4813073637422776E+001,-.4526322011999920E-013,0.2535682115332173E+001 -0.2100000000000000E-004,0.4427756215999996E-013,0.4834928721981281E+001,-.4502942523999999E-013,0.2537207740932983E+001 -0.2200000000000000E-004,0.4203259996000002E-013,0.4849129074786056E+001,-.4416863500000000E-013,0.2551604627248110E+001 -0.2299999999999999E-004,0.4501348467999997E-013,0.4874941902327376E+001,-.4476109248000000E-013,0.2546905731572128E+001 -0.2399999999999999E-004,0.4239657608000002E-013,0.4891913016104239E+001,-.4390561576000001E-013,0.2531829368679717E+001 -0.2499999999999999E-004,0.4396937799999999E-013,0.4904955448039130E+001,-.4414472416000000E-013,0.2535768737378268E+001 -0.2599999999999998E-004,0.4500285764000002E-013,0.4916501352048824E+001,-.4348319092000000E-013,0.2527287747757919E+001 -0.2699999999999998E-004,0.4678288683999997E-013,0.4931845557781502E+001,-.4483548176000001E-013,0.2532055330016479E+001 -0.2799999999999998E-004,0.4382325620000000E-013,0.4923289626756192E+001,-.4382325620000000E-013,0.2523135357397364E+001 -0.2899999999999998E-004,0.4339817459999999E-013,0.4929993872464354E+001,-.4342474220000002E-013,0.2517473351245646E+001 -0.3000000000000000E-004,0.4298106327999751E-013,0.4942654931517663E+001,-.4380997239999745E-013,0.2515154069471571E+001 -0.3100000000000000E-004,0.4664739208000001E-013,0.4949959321726838E+001,-.4487533316000001E-013,0.2508224049938256E+001 -0.3200000000000000E-004,0.4303685523999999E-013,0.4961971425609685E+001,-.4589552900000000E-013,0.2505386057988473E+001 -0.3300000000000000E-004,0.4530307151999995E-013,0.4982368490599124E+001,-.4564579356000001E-013,0.2502293858993603E+001 -0.3399999999999999E-004,0.4463622475999998E-013,0.4986772237012213E+001,-.4440508664000000E-013,0.2504270993077120E+001 -0.3499999999999999E-004,0.4403314024000002E-013,0.4992578026636430E+001,-.4574409368000001E-013,0.2506529154978744E+001 -0.3599999999999999E-004,0.4768618523999996E-013,0.5007250674490085E+001,-.4349381796000000E-013,0.2502542158220145E+001 -0.3699999999999998E-004,0.4686524639999998E-013,0.4989217662064908E+001,-.4462559772000001E-013,0.2500423292097051E+001 -0.3799999999999998E-004,0.4297840652000000E-013,0.4989744980083459E+001,-.4483016824000000E-013,0.2499974138029126E+001 -0.3899999999999998E-004,0.4538277432000000E-013,0.4994232858795607E+001,-.4472655460000001E-013,0.2507952475041070E+001 -0.4000000000000000E-004,0.4342474219999772E-013,0.5008074900601144E+001,-.4366119383999775E-013,0.2514882427519038E+001 -0.4100000000000000E-004,0.4658628659999996E-013,0.5000693168248506E+001,-.4476109248000001E-013,0.2510032105507848E+001 -0.4200000000000000E-004,0.4587693167999997E-013,0.5012942943000840E+001,-.4368776144000000E-013,0.2505637955488610E+001 -0.4299999999999999E-004,0.4359477484000000E-013,0.4995621797199504E+001,-.4404642404000001E-013,0.2517036749184847E+001 -0.4399999999999999E-004,0.4369838847999999E-013,0.4995678022796347E+001,-.4477437628000002E-013,0.2513648991944137E+001 -0.4499999999999999E-004,0.4410487276000000E-013,0.5014420127032785E+001,-.4473186812000001E-013,0.2508885093847573E+001 -0.4599999999999999E-004,0.4566704764000000E-013,0.5020934185067342E+001,-.4454855168000000E-013,0.2517454085507660E+001 -0.4699999999999998E-004,0.4576003423999999E-013,0.5012401073775985E+001,-.4440508664000000E-013,0.2531486755600524E+001 -0.4799999999999998E-004,0.4621434019999998E-013,0.5001739494532067E+001,-.4580254240000000E-013,0.2537031559843018E+001 -0.4899999999999998E-004,0.4671381108000000E-013,0.5001713760738435E+001,-.4656768928000001E-013,0.2542998346733964E+001 -0.5000000000000000E-004,0.4503208199999768E-013,0.5010815383033106E+001,-.4590349927999764E-013,0.2538281782822818E+001 diff --git a/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure/analyze.ini b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure/analyze.ini deleted file mode 100644 index 94c18c8a9..000000000 --- a/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure/analyze.ini +++ /dev/null @@ -1,4 +0,0 @@ -compare_data_file_name = PartAnalyze.csv -compare_data_file_reference = PartAnalyze_ref.csv -compare_data_file_tolerance = 0.15 -compare_data_file_tolerance_type = relative \ No newline at end of file diff --git a/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure/command_line.ini b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure/command_line.ini deleted file mode 100644 index 9f0daafaf..000000000 --- a/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure/command_line.ini +++ /dev/null @@ -1,2 +0,0 @@ -MPI = 6 -cmd_suffix = DSMC.ini \ No newline at end of file diff --git a/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure/cube_mesh.h5 b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure/cube_mesh.h5 deleted file mode 100644 index 977eebcdb9eeb8c10fae7ff413163b5fb97b44cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 647858 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 F{||*!blLy_ diff --git a/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_FixedAverage/PartAnalyze_ref.csv b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_FixedAverage/PartAnalyze_ref.csv new file mode 100644 index 000000000..8cd9b6036 --- /dev/null +++ b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_FixedAverage/PartAnalyze_ref.csv @@ -0,0 +1,14 @@ +001-TIME,002-Massflow-Spec-001-SF-001,003-Pressure-Spec-001-SF-001,004-Massflow-Spec-001-SF-002,005-Pressure-Spec-001-SF-002 +0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000 +0.5000000000000000E-005,0.7275484124799999E-013,0.2304994726639544E+001,-.2191720729600000E-013,0.2656966335989959E+001 +0.1000000000000000E-004,0.4544334844800011E-013,0.4949660829542395E+001,-.4267181641600012E-013,0.2734585668114748E+001 +0.1500000000000000E-004,0.4325842902400000E-013,0.5148645716100196E+001,-.4456555494399999E-013,0.2702634896367288E+001 +0.2000000000000000E-004,0.4392368172799927E-013,0.5045000015180033E+001,-.4503527011199922E-013,0.2452395415772349E+001 +0.2499999999999999E-004,0.4248265510400000E-013,0.5031663993922057E+001,-.4447628780800000E-013,0.2608604989997243E+001 +0.3000000000000000E-004,0.4464419503999741E-013,0.4895827472057147E+001,-.4511391020799738E-013,0.2493630742367481E+001 +0.3499999999999999E-004,0.4645716806400000E-013,0.5025552778694175E+001,-.4495450460800000E-013,0.2463565311175626E+001 +0.4000000000000000E-004,0.4284184905599780E-013,0.5007078491993546E+001,-.4566864169599765E-013,0.2462903245527397E+001 +0.4499999999999999E-004,0.4644866643200002E-013,0.5094983506369541E+001,-.4395343744000000E-013,0.2428584439763453E+001 +0.5000000000000000E-004,0.4505652419199768E-013,0.5038708206558857E+001,-.4561125567999765E-013,0.2584083888908722E+001 +0.5499999999999999E-004,0.4365375491199999E-013,0.5038708206558857E+001,-.4349009849599999E-013,0.2584083888908722E+001 +0.6000000000000000E-004,0.4149434038399786E-013,0.4976432903989231E+001,-.4296618542399780E-013,0.2629462215338533E+001 diff --git a/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_FixedAverage/analyze.ini b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_FixedAverage/analyze.ini new file mode 100644 index 000000000..131d751de --- /dev/null +++ b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_FixedAverage/analyze.ini @@ -0,0 +1,6 @@ +! compare columns in a data file +compare_column_file = PartAnalyze.csv ! data file name +compare_column_reference_file = PartAnalyze_ref.csv ! reference data file name +compare_column_index = 2,4 ! Comparison of pressure values at BCs +compare_column_tolerance_value = 15e-2 ! tolerance +compare_column_tolerance_type = relative ! absolute or relative comparison diff --git a/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_FixedAverage/command_line.ini b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_FixedAverage/command_line.ini new file mode 100644 index 000000000..c2fd94b17 --- /dev/null +++ b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_FixedAverage/command_line.ini @@ -0,0 +1 @@ +MPI = 6 \ No newline at end of file diff --git a/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_FixedAverage/externals.ini b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_FixedAverage/externals.ini new file mode 100644 index 000000000..a1777069f --- /dev/null +++ b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_FixedAverage/externals.ini @@ -0,0 +1,8 @@ +! --- Externals Tool Reggie +MPI = 1 , 6 +externalbinary = ./hopr/build/bin/hopr , ./bin/piclas +externaldirectory = hopr.ini , parameter_macrorestart.ini +externalruntime = pre , post +cmd_suffix = , ConstPressure_State_000.00005000000000000.h5 + +nocrosscombination:MPI,externalbinary,externaldirectory,externalruntime,cmd_suffix diff --git a/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure/hopr.ini b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_FixedAverage/hopr.ini similarity index 100% rename from regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure/hopr.ini rename to regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_FixedAverage/hopr.ini diff --git a/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_FixedAverage/parameter.ini b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_FixedAverage/parameter.ini new file mode 100644 index 000000000..973f4a414 --- /dev/null +++ b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_FixedAverage/parameter.ini @@ -0,0 +1,141 @@ +! =============================================================================== ! +! EQUATION (linearscalaradvection) +! =============================================================================== ! +IniExactFunc = 0 + +! =============================================================================== ! +! DISCRETIZATION +! =============================================================================== ! +N = 1 ! Polynomial degree +NAnalyze = 1 ! Number of analyze points +NVisu = 1 +! =============================================================================== ! +! MESH +! =============================================================================== ! +MeshFile = cube_mesh.h5 +useCurveds = F +! if boundaries have to be changed (else they are used from Mesh directly): +TrackingMethod = triatracking +! =============================================================================== ! +! OUTPUT / VISUALIZATION +! =============================================================================== ! +ProjectName = ConstPressure +IterDisplayStep = 10 +Part-AnalyzeStep = 10 +CalcSurfFluxInfo = TRUE +! =============================================================================== ! +! CALCULATION +! =============================================================================== ! +tend = 5.0E-5 +Analyze_dt = 1.0E-5 +ManualTimeStep = 5.0E-7 +CFLscale = 0.2 ! Scaling of theoretical CFL number +! Load balancing +DoLoadBalance = T +PartWeightLoadBalance = T +Load-DeviationThreshold = 0.01 +LoadBalanceMaxSteps = 2 +UseH5IOLoadBalance = T +! =============================================================================== ! +! PARTICLES +! =============================================================================== ! +Part-maxParticleNumber=200000 +Part-nSpecies=1 +Part-nBounds=6 +Part-Boundary1-SourceName=BC_Xplus +Part-Boundary1-Condition=open +Part-Boundary2-SourceName=BC_Xminus +Part-Boundary2-Condition=open +Part-Boundary3-SourceName=BC_Yplus +Part-Boundary3-Condition=reflective +Part-Boundary3-MomentumACC=1. +Part-Boundary3-WallTemp=300. +Part-Boundary3-TransACC=1. +Part-Boundary3-VibACC=1. +Part-Boundary3-RotACC=1. +Part-Boundary4-SourceName=BC_Yminus +Part-Boundary4-Condition=reflective +Part-Boundary4-MomentumACC=1. +Part-Boundary4-WallTemp=300. +Part-Boundary4-TransACC=1. +Part-Boundary4-VibACC=1. +Part-Boundary4-RotACC=1. +Part-Boundary5-SourceName=BC_Zplus +Part-Boundary5-Condition=reflective +Part-Boundary5-MomentumACC=1. +Part-Boundary5-WallTemp=300. +Part-Boundary5-TransACC=1. +Part-Boundary5-VibACC=1. +Part-Boundary5-RotACC=1. +Part-Boundary6-SourceName=BC_Zminus +Part-Boundary6-Condition=reflective +Part-FIBGMdeltas=(/2.5e-6,1e-5,1e-5/) +! =============================================================================== ! +! Species1 - O2 +! =============================================================================== ! +Part-Species1-MassIC=5.31352E-26 +Part-Species1-MacroParticleFactor=1E3 + +Part-Species1-nInits=1 +Part-Species1-Init1-SpaceIC=cell_local +Part-Species1-Init1-velocityDistribution=maxwell_lpn +Part-Species1-Init1-PartDensity=6E+20 +Part-Species1-Init1-VeloIC=0 +Part-Species1-Init1-VeloVecIC=(/1.,0.,0./) +Part-Species1-Init1-MWTemperatureIC=300 +Part-Species1-Init1-TempVib=300 +Part-Species1-Init1-TempRot=300 + +Part-Species1-nSurfaceFluxBCs=2 +! Inlet: Constant pressure, Type 1 +Part-Species1-Surfaceflux1-BC=1 +Part-Species1-Surfaceflux1-velocityDistribution=maxwell_lpn +Part-Species1-Surfaceflux1-VeloIC=5 +Part-Species1-Surfaceflux1-VeloVecIC=(/-1.0,0.0,0.0/) +Part-Species1-Surfaceflux1-MWTemperatureIC=300. +Part-Species1-Surfaceflux1-TempVib=300. +Part-Species1-Surfaceflux1-TempRot=300. +Part-Species1-Surfaceflux1-Adaptive=TRUE +Part-Species1-Surfaceflux1-Adaptive-Type=1 +Part-Species1-Surfaceflux1-Adaptive-Pressure=5.0 + +! Outlet: Constant pressure, Type 2 +Part-Species1-Surfaceflux2-BC=2 +Part-Species1-Surfaceflux2-velocityDistribution=maxwell_lpn +Part-Species1-Surfaceflux2-VeloIC=5 +Part-Species1-Surfaceflux2-VeloVecIC=(/1.0,0.0,0.0/) +Part-Species1-Surfaceflux2-MWTemperatureIC=300. +Part-Species1-Surfaceflux2-TempVib=300. +Part-Species1-Surfaceflux2-TempRot=300. +Part-Species1-Surfaceflux2-Adaptive=TRUE +Part-Species1-Surfaceflux2-Adaptive-Type=2 +Part-Species1-Surfaceflux2-Adaptive-Pressure=2.5 + +AdaptiveBC-SamplingIteration = 10 +AdaptiveBC-TruncateRunningAverage = F +! =============================================================================== ! +! DSMC +! =============================================================================== ! +Particles-HaloEpsVelo=2.0E+03 +Particles-NumberForDSMCOutputs=1 +Part-TimeFracForSampling=0.1 +Particles-DSMC-CalcSurfaceVal=true +UseDSMC=true +Particles-DSMC-CollisMode=2 !(1:elast coll, 2: elast + rela, 3:chem) +Part-NumberOfRandomSeeds=2 +Particles-RandomSeed1=3 +Particles-RandomSeed2=4 +Particles-DSMC-UseOctree = T +Particles-DSMC-UseNearestNeighbour = T +Particles-DSMC-CalcQualityFactors= F + +! =============================================================================== ! +! Species1, O2 +! =============================================================================== ! +Part-Species1-InteractionID = 2 +Part-Species1-Tref = 273 +Part-Species1-dref = 4.07E-10 +Part-Species1-omega=0.27 +Part-Species1-CharaTempRot=2.1 +Part-Species1-CharaTempVib=2272.18 +Part-Species1-Ediss_eV=5.17 diff --git a/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_FixedAverage/parameter_macrorestart.ini b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_FixedAverage/parameter_macrorestart.ini new file mode 100644 index 000000000..853d565fc --- /dev/null +++ b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_FixedAverage/parameter_macrorestart.ini @@ -0,0 +1,145 @@ +! =============================================================================== ! +! EQUATION (linearscalaradvection) +! =============================================================================== ! +IniExactFunc = 0 + +! =============================================================================== ! +! DISCRETIZATION +! =============================================================================== ! +N = 1 ! Polynomial degree +NAnalyze = 1 ! Number of analyze points +NVisu = 1 +! =============================================================================== ! +! MESH +! =============================================================================== ! +MeshFile = cube_mesh.h5 +useCurveds = F +! if boundaries have to be changed (else they are used from Mesh directly): +TrackingMethod = triatracking +! =============================================================================== ! +! OUTPUT / VISUALIZATION +! =============================================================================== ! +ProjectName = ConstPressure +IterDisplayStep = 10 +Part-AnalyzeStep = 10 +CalcSurfFluxInfo = TRUE +! =============================================================================== ! +! CALCULATION +! =============================================================================== ! +tend = 6.0E-5 +Analyze_dt = 1.0E-5 +CFLscale = 0.2 ! Scaling of theoretical CFL number +! Load balancing +DoLoadBalance = T +PartWeightLoadBalance = T +Load-DeviationThreshold = 0.01 +LoadBalanceMaxSteps = 2 +UseH5IOLoadBalance = T +! =============================================================================== ! +! PARTICLES +! =============================================================================== ! +Part-maxParticleNumber=200000 +Part-nSpecies=1 +Part-nBounds=6 +Part-Boundary1-SourceName=BC_Xplus +Part-Boundary1-Condition=open +Part-Boundary2-SourceName=BC_Xminus +Part-Boundary2-Condition=open +Part-Boundary3-SourceName=BC_Yplus +Part-Boundary3-Condition=reflective +Part-Boundary3-MomentumACC=1. +Part-Boundary3-WallTemp=300. +Part-Boundary3-TransACC=1. +Part-Boundary3-VibACC=1. +Part-Boundary3-RotACC=1. +Part-Boundary4-SourceName=BC_Yminus +Part-Boundary4-Condition=reflective +Part-Boundary4-MomentumACC=1. +Part-Boundary4-WallTemp=300. +Part-Boundary4-TransACC=1. +Part-Boundary4-VibACC=1. +Part-Boundary4-RotACC=1. +Part-Boundary5-SourceName=BC_Zplus +Part-Boundary5-Condition=reflective +Part-Boundary5-MomentumACC=1. +Part-Boundary5-WallTemp=300. +Part-Boundary5-TransACC=1. +Part-Boundary5-VibACC=1. +Part-Boundary5-RotACC=1. +Part-Boundary6-SourceName=BC_Zminus +Part-Boundary6-Condition=reflective +Part-FIBGMdeltas=(/2.5e-6,1e-5,1e-5/) +! =============================================================================== ! +! Species1 - O2 +! =============================================================================== ! +Part-Species1-MassIC=5.31352E-26 +Part-Species1-MacroParticleFactor=5E2 + +Part-Species1-nInits=1 +Part-Species1-Init1-SpaceIC=cell_local +Part-Species1-Init1-velocityDistribution=maxwell_lpn +Part-Species1-Init1-PartDensity=6E+20 +Part-Species1-Init1-VeloIC=0 +Part-Species1-Init1-VeloVecIC=(/1.,0.,0./) +Part-Species1-Init1-MWTemperatureIC=300 +Part-Species1-Init1-TempVib=300 +Part-Species1-Init1-TempRot=300 + +Part-Species1-nSurfaceFluxBCs=2 +! Inlet: Constant pressure, Type 1 +Part-Species1-Surfaceflux1-BC=1 +Part-Species1-Surfaceflux1-velocityDistribution=maxwell_lpn +Part-Species1-Surfaceflux1-VeloIC=5 +Part-Species1-Surfaceflux1-VeloVecIC=(/-1.0,0.0,0.0/) +Part-Species1-Surfaceflux1-MWTemperatureIC=300. +Part-Species1-Surfaceflux1-TempVib=300. +Part-Species1-Surfaceflux1-TempRot=300. +Part-Species1-Surfaceflux1-Adaptive=TRUE +Part-Species1-Surfaceflux1-Adaptive-Type=1 +Part-Species1-Surfaceflux1-Adaptive-Pressure=5.0 + +! Outlet: Constant pressure, Type 2 +Part-Species1-Surfaceflux2-BC=2 +Part-Species1-Surfaceflux2-velocityDistribution=maxwell_lpn +Part-Species1-Surfaceflux2-VeloIC=5 +Part-Species1-Surfaceflux2-VeloVecIC=(/1.0,0.0,0.0/) +Part-Species1-Surfaceflux2-MWTemperatureIC=300. +Part-Species1-Surfaceflux2-TempVib=300. +Part-Species1-Surfaceflux2-TempRot=300. +Part-Species1-Surfaceflux2-Adaptive=TRUE +Part-Species1-Surfaceflux2-Adaptive-Type=2 +Part-Species1-Surfaceflux2-Adaptive-Pressure=2.5 + +AdaptiveBC-SamplingIteration = 10 +AdaptiveBC-TruncateRunningAverage = F +! =============================================================================== ! +! DSMC +! =============================================================================== ! +ManualTimeStep=5.0000E-7 +Particles-HaloEpsVelo=2.0E+03 +Particles-NumberForDSMCOutputs=1 +Part-TimeFracForSampling=0.25 +Particles-DSMC-CalcSurfaceVal=true +UseDSMC=true +Particles-DSMC-CollisMode=2 !(1:elast coll, 2: elast + rela, 3:chem) +Part-NumberOfRandomSeeds=2 +Particles-RandomSeed1=2 +Particles-RandomSeed2=1 +Particles-DSMC-UseOctree = T +Particles-DSMC-UseNearestNeighbour = T +Particles-DSMC-CalcQualityFactors= F +! =============================================================================== ! +! Macroscopic Restart +! =============================================================================== ! +Particles-MacroscopicRestart = T +Particles-MacroscopicRestart-Filename = ConstPressure_DSMCState_000.00005000000000000.h5 +! =============================================================================== ! +! Species1, O2 +! =============================================================================== ! +Part-Species1-InteractionID = 2 +Part-Species1-Tref = 273 +Part-Species1-dref = 4.07E-10 +Part-Species1-omega=0.27 +Part-Species1-CharaTempRot=2.1 +Part-Species1-CharaTempVib=2272.18 +Part-Species1-Ediss_eV=5.17 \ No newline at end of file diff --git a/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure/readme.md b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_FixedAverage/readme.md similarity index 75% rename from regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure/readme.md rename to regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_FixedAverage/readme.md index 012a99941..ba6ab29b0 100644 --- a/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure/readme.md +++ b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_FixedAverage/readme.md @@ -2,4 +2,5 @@ * Simulation of a subsonic channel flow with O2 * Testing the adaptive surface flux boundary conditions (Type=1: Inflow, constant pressure and temperature and Type=2: Outflow with constant pressure) * Inlet: 5 Pa, 300K, Outlet: 2.5 Pa, 300K -* Temporal evolution of the channel is sensitive to the chosen sampling method for the adaptive BC \ No newline at end of file +* Temporal evolution of the channel is sensitive to the chosen sampling method for the adaptive BC +* Testing macroscopic restart with weighting factor change with post external \ No newline at end of file diff --git a/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_Relaxation/PartAnalyze_ref.csv b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_Relaxation/PartAnalyze_ref.csv new file mode 100644 index 000000000..0ab345dcd --- /dev/null +++ b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_Relaxation/PartAnalyze_ref.csv @@ -0,0 +1,14 @@ +001-TIME,002-Massflow-Spec-001-SF-001,003-Pressure-Spec-001-SF-001,004-Massflow-Spec-001-SF-002,005-Pressure-Spec-001-SF-002 +0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000 +0.5000000000000000E-005,0.7308853030400000E-013,0.3047418308502871E+001,-.2355377145600001E-013,0.2608331042460211E+001 +0.1000000000000000E-004,0.4280571712000012E-013,0.3939825955010785E+001,-.4172813526400011E-013,0.2596176961367860E+001 +0.1500000000000000E-004,0.4268669427200002E-013,0.4478825364269253E+001,-.4307564393600000E-013,0.2584401102818590E+001 +0.2000000000000000E-004,0.4551348691199922E-013,0.4795084294395991E+001,-.4337532646399924E-013,0.2590852966040118E+001 +0.2499999999999999E-004,0.4275683273600000E-013,0.5009594385883915E+001,-.4467607616000000E-013,0.2569893185825930E+001 +0.3000000000000000E-004,0.4051877811199767E-013,0.4963360726123262E+001,-.4434663791999743E-013,0.2535185590191635E+001 +0.3499999999999999E-004,0.4307776934400001E-013,0.4942743606514933E+001,-.4202569238399999E-013,0.2557125395080740E+001 +0.4000000000000000E-004,0.4397681692799774E-013,0.4846822113599464E+001,-.4245502479999781E-013,0.2541189057320661E+001 +0.4499999999999999E-004,0.4598957830400003E-013,0.4884181334636695E+001,-.4553474099200000E-013,0.2510860761072681E+001 +0.5000000000000000E-004,0.4325205279999779E-013,0.4967581926418702E+001,-.4645504265599761E-013,0.2500421596090820E+001 +0.5499999999999999E-004,0.4394812391999997E-013,0.4975527200561242E+001,-.4454217545600000E-013,0.2499362406502649E+001 +0.6000000000000000E-004,0.4587161815999762E-013,0.4973044248261038E+001,-.4489924399999769E-013,0.2520570904190151E+001 diff --git a/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_Relaxation/analyze.ini b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_Relaxation/analyze.ini new file mode 100644 index 000000000..131d751de --- /dev/null +++ b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_Relaxation/analyze.ini @@ -0,0 +1,6 @@ +! compare columns in a data file +compare_column_file = PartAnalyze.csv ! data file name +compare_column_reference_file = PartAnalyze_ref.csv ! reference data file name +compare_column_index = 2,4 ! Comparison of pressure values at BCs +compare_column_tolerance_value = 15e-2 ! tolerance +compare_column_tolerance_type = relative ! absolute or relative comparison diff --git a/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_Relaxation/command_line.ini b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_Relaxation/command_line.ini new file mode 100644 index 000000000..c2fd94b17 --- /dev/null +++ b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_Relaxation/command_line.ini @@ -0,0 +1 @@ +MPI = 6 \ No newline at end of file diff --git a/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_Relaxation/externals.ini b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_Relaxation/externals.ini new file mode 100644 index 000000000..a1777069f --- /dev/null +++ b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_Relaxation/externals.ini @@ -0,0 +1,8 @@ +! --- Externals Tool Reggie +MPI = 1 , 6 +externalbinary = ./hopr/build/bin/hopr , ./bin/piclas +externaldirectory = hopr.ini , parameter_macrorestart.ini +externalruntime = pre , post +cmd_suffix = , ConstPressure_State_000.00005000000000000.h5 + +nocrosscombination:MPI,externalbinary,externaldirectory,externalruntime,cmd_suffix diff --git a/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_Relaxation/hopr.ini b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_Relaxation/hopr.ini new file mode 100644 index 000000000..a9a5d3e98 --- /dev/null +++ b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_Relaxation/hopr.ini @@ -0,0 +1,31 @@ +ProjectName = cube +Debugvisu = T +DebugVisuLevel=2 +NVisu =1 +Mode =1 + +Corner =(/0.0,0.0,0.0 ,, 15.0,0.0,0.0 ,, 15.0,1.0,0.0 ,, 0.0,1.0,0.0 ,, 0.0,0.0,1.0 ,, 15.0,0.0,1.0 ,, 15.0,1.0,1.0 ,, 0.0,1.0,1.0 /) +nElems =(/100,4,4/) +elemtype =108 + +BCIndex =(/6 ,4 ,1 ,3 ,2 ,5/) +! =(/z-,y-,x+,y+,x-,z+/) + +nZones = 1 +nUserDefinedBoundaries=6 +BoundaryName=BC_Xplus +BoundaryType=(/4,0,0,0/) +BoundaryName=BC_Xminus +BoundaryType=(/4,0,0,0/) +BoundaryName=BC_Yplus +BoundaryType=(/4,0,0,0/) +BoundaryName=BC_Yminus +BoundaryType=(/4,0,0,0/) +BoundaryName=BC_Zplus +BoundaryType=(/4,0,0,0/) +BoundaryName=BC_Zminus +BoundaryType=(/4,0,0,0/) + +postscalemesh=true +meshscale=1e-5 +jacobiantolerance=1e-27 diff --git a/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure/parameter.ini b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_Relaxation/parameter.ini similarity index 88% rename from regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure/parameter.ini rename to regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_Relaxation/parameter.ini index 49da29b43..a1b3f17d2 100644 --- a/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure/parameter.ini +++ b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_Relaxation/parameter.ini @@ -8,6 +8,7 @@ IniExactFunc = 0 ! =============================================================================== ! N = 1 ! Polynomial degree NAnalyze = 1 ! Number of analyze points +NVisu = 1 ! =============================================================================== ! ! MESH ! =============================================================================== ! @@ -25,8 +26,9 @@ CalcSurfFluxInfo = TRUE ! =============================================================================== ! ! CALCULATION ! =============================================================================== ! -tend = 5.0E-5 -Analyze_dt = 1.0E-5 +tend = 5.0E-5 +Analyze_dt = 1.0E-5 +ManualTimeStep = 5.0E-7 CFLscale = 0.2 ! Scaling of theoretical CFL number ! Load balancing DoLoadBalance = T @@ -72,7 +74,7 @@ Part-FIBGMdeltas=(/2.5e-6,1e-5,1e-5/) ! Species1 - O2 ! =============================================================================== ! Part-Species1-MassIC=5.31352E-26 -Part-Species1-MacroParticleFactor=2E2 +Part-Species1-MacroParticleFactor=2E3 Part-Species1-nInits=1 Part-Species1-Init1-SpaceIC=cell_local @@ -110,24 +112,29 @@ Part-Species1-Surfaceflux2-Adaptive-Type=2 Part-Species1-Surfaceflux2-Adaptive-Pressure=2.5 AdaptiveBC-RelaxationFactor = 0.1 -! If SamplingIteration is 0, then the RelaxationFactor is used -AdaptiveBC-SamplingIteration = 0,10,10 -AdaptiveBC-TruncateRunningAverage = F,F,T ! =============================================================================== ! ! DSMC ! =============================================================================== ! -ManualTimeStep=5.0000E-7 Particles-HaloEpsVelo=2.0E+03 Particles-NumberForDSMCOutputs=1 -Part-TimeFracForSampling=0.25 +Part-TimeFracForSampling=0.1 Particles-DSMC-CalcSurfaceVal=true UseDSMC=true Particles-DSMC-CollisMode=2 !(1:elast coll, 2: elast + rela, 3:chem) Part-NumberOfRandomSeeds=2 -Particles-RandomSeed1=2 -Particles-RandomSeed2=1 +Particles-RandomSeed1=3 +Particles-RandomSeed2=4 Particles-DSMC-UseOctree = T Particles-DSMC-UseNearestNeighbour = T Particles-DSMC-CalcQualityFactors= F -nocrosscombination:AdaptiveBC-SamplingIteration,AdaptiveBC-TruncateRunningAverage \ No newline at end of file +! =============================================================================== ! +! Species1, O2 +! =============================================================================== ! +Part-Species1-InteractionID = 2 +Part-Species1-Tref = 273 +Part-Species1-dref = 4.07E-10 +Part-Species1-omega=0.27 +Part-Species1-CharaTempRot=2.1 +Part-Species1-CharaTempVib=2272.18 +Part-Species1-Ediss_eV=5.17 \ No newline at end of file diff --git a/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_Relaxation/parameter_macrorestart.ini b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_Relaxation/parameter_macrorestart.ini new file mode 100644 index 000000000..fa62fdd2c --- /dev/null +++ b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_Relaxation/parameter_macrorestart.ini @@ -0,0 +1,144 @@ +! =============================================================================== ! +! EQUATION (linearscalaradvection) +! =============================================================================== ! +IniExactFunc = 0 + +! =============================================================================== ! +! DISCRETIZATION +! =============================================================================== ! +N = 1 ! Polynomial degree +NAnalyze = 1 ! Number of analyze points +NVisu = 1 +! =============================================================================== ! +! MESH +! =============================================================================== ! +MeshFile = cube_mesh.h5 +useCurveds = F +! if boundaries have to be changed (else they are used from Mesh directly): +TrackingMethod = triatracking +! =============================================================================== ! +! OUTPUT / VISUALIZATION +! =============================================================================== ! +ProjectName = ConstPressure +IterDisplayStep = 10 +Part-AnalyzeStep = 10 +CalcSurfFluxInfo = TRUE +! =============================================================================== ! +! CALCULATION +! =============================================================================== ! +tend = 6.0E-5 +Analyze_dt = 1.0E-5 +CFLscale = 0.2 ! Scaling of theoretical CFL number +! Load balancing +DoLoadBalance = T +PartWeightLoadBalance = T +Load-DeviationThreshold = 0.01 +LoadBalanceMaxSteps = 2 +UseH5IOLoadBalance = T +! =============================================================================== ! +! PARTICLES +! =============================================================================== ! +Part-maxParticleNumber=200000 +Part-nSpecies=1 +Part-nBounds=6 +Part-Boundary1-SourceName=BC_Xplus +Part-Boundary1-Condition=open +Part-Boundary2-SourceName=BC_Xminus +Part-Boundary2-Condition=open +Part-Boundary3-SourceName=BC_Yplus +Part-Boundary3-Condition=reflective +Part-Boundary3-MomentumACC=1. +Part-Boundary3-WallTemp=300. +Part-Boundary3-TransACC=1. +Part-Boundary3-VibACC=1. +Part-Boundary3-RotACC=1. +Part-Boundary4-SourceName=BC_Yminus +Part-Boundary4-Condition=reflective +Part-Boundary4-MomentumACC=1. +Part-Boundary4-WallTemp=300. +Part-Boundary4-TransACC=1. +Part-Boundary4-VibACC=1. +Part-Boundary4-RotACC=1. +Part-Boundary5-SourceName=BC_Zplus +Part-Boundary5-Condition=reflective +Part-Boundary5-MomentumACC=1. +Part-Boundary5-WallTemp=300. +Part-Boundary5-TransACC=1. +Part-Boundary5-VibACC=1. +Part-Boundary5-RotACC=1. +Part-Boundary6-SourceName=BC_Zminus +Part-Boundary6-Condition=reflective +Part-FIBGMdeltas=(/2.5e-6,1e-5,1e-5/) +! =============================================================================== ! +! Species1 - O2 +! =============================================================================== ! +Part-Species1-MassIC=5.31352E-26 +Part-Species1-MacroParticleFactor=5E2 + +Part-Species1-nInits=1 +Part-Species1-Init1-SpaceIC=cell_local +Part-Species1-Init1-velocityDistribution=maxwell_lpn +Part-Species1-Init1-PartDensity=6E+20 +Part-Species1-Init1-VeloIC=0 +Part-Species1-Init1-VeloVecIC=(/1.,0.,0./) +Part-Species1-Init1-MWTemperatureIC=300 +Part-Species1-Init1-TempVib=300 +Part-Species1-Init1-TempRot=300 + +Part-Species1-nSurfaceFluxBCs=2 +! Inlet: Constant pressure, Type 1 +Part-Species1-Surfaceflux1-BC=1 +Part-Species1-Surfaceflux1-velocityDistribution=maxwell_lpn +Part-Species1-Surfaceflux1-VeloIC=5 +Part-Species1-Surfaceflux1-VeloVecIC=(/-1.0,0.0,0.0/) +Part-Species1-Surfaceflux1-MWTemperatureIC=300. +Part-Species1-Surfaceflux1-TempVib=300. +Part-Species1-Surfaceflux1-TempRot=300. +Part-Species1-Surfaceflux1-Adaptive=TRUE +Part-Species1-Surfaceflux1-Adaptive-Type=1 +Part-Species1-Surfaceflux1-Adaptive-Pressure=5.0 + +! Outlet: Constant pressure, Type 2 +Part-Species1-Surfaceflux2-BC=2 +Part-Species1-Surfaceflux2-velocityDistribution=maxwell_lpn +Part-Species1-Surfaceflux2-VeloIC=5 +Part-Species1-Surfaceflux2-VeloVecIC=(/1.0,0.0,0.0/) +Part-Species1-Surfaceflux2-MWTemperatureIC=300. +Part-Species1-Surfaceflux2-TempVib=300. +Part-Species1-Surfaceflux2-TempRot=300. +Part-Species1-Surfaceflux2-Adaptive=TRUE +Part-Species1-Surfaceflux2-Adaptive-Type=2 +Part-Species1-Surfaceflux2-Adaptive-Pressure=2.5 + +AdaptiveBC-RelaxationFactor = 0.1 +! =============================================================================== ! +! DSMC +! =============================================================================== ! +ManualTimeStep=5.0000E-7 +Particles-HaloEpsVelo=2.0E+03 +Particles-NumberForDSMCOutputs=1 +Part-TimeFracForSampling=0.25 +Particles-DSMC-CalcSurfaceVal=true +UseDSMC=true +Particles-DSMC-CollisMode=2 !(1:elast coll, 2: elast + rela, 3:chem) +Part-NumberOfRandomSeeds=2 +Particles-RandomSeed1=2 +Particles-RandomSeed2=1 +Particles-DSMC-UseOctree = T +Particles-DSMC-UseNearestNeighbour = T +Particles-DSMC-CalcQualityFactors= F +! =============================================================================== ! +! Macroscopic Restart +! =============================================================================== ! +Particles-MacroscopicRestart = T +Particles-MacroscopicRestart-Filename = ConstPressure_DSMCState_000.00005000000000000.h5 +! =============================================================================== ! +! Species1, O2 +! =============================================================================== ! +Part-Species1-InteractionID = 2 +Part-Species1-Tref = 273 +Part-Species1-dref = 4.07E-10 +Part-Species1-omega=0.27 +Part-Species1-CharaTempRot=2.1 +Part-Species1-CharaTempVib=2272.18 +Part-Species1-Ediss_eV=5.17 \ No newline at end of file diff --git a/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_Relaxation/readme.md b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_Relaxation/readme.md new file mode 100644 index 000000000..ba6ab29b0 --- /dev/null +++ b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_Relaxation/readme.md @@ -0,0 +1,6 @@ +# DSMC - Pressure driven channel flow +* Simulation of a subsonic channel flow with O2 +* Testing the adaptive surface flux boundary conditions (Type=1: Inflow, constant pressure and temperature and Type=2: Outflow with constant pressure) +* Inlet: 5 Pa, 300K, Outlet: 2.5 Pa, 300K +* Temporal evolution of the channel is sensitive to the chosen sampling method for the adaptive BC +* Testing macroscopic restart with weighting factor change with post external \ No newline at end of file diff --git a/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_TruncAverage/PartAnalyze_ref.csv b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_TruncAverage/PartAnalyze_ref.csv new file mode 100644 index 000000000..1565529a6 --- /dev/null +++ b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_TruncAverage/PartAnalyze_ref.csv @@ -0,0 +1,14 @@ +001-TIME,002-Massflow-Spec-001-SF-001,003-Pressure-Spec-001-SF-001,004-Massflow-Spec-001-SF-002,005-Pressure-Spec-001-SF-002 +0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000,0.0000000000000000E+000 +0.5000000000000000E-005,0.7477610425600000E-013,0.4970754893976260E+001,-.2129233734400001E-013,0.2639399569399952E+001 +0.1000000000000000E-004,0.4376852694400013E-013,0.5084035356444570E+001,-.4482272931200012E-013,0.2571263038986332E+001 +0.1500000000000000E-004,0.4241039123200002E-013,0.4983504135967654E+001,-.4523080764800000E-013,0.2570549579978157E+001 +0.2000000000000000E-004,0.4772816204799920E-013,0.5068431425865561E+001,-.4528394284799921E-013,0.2516304401222617E+001 +0.2499999999999999E-004,0.4166649843200003E-013,0.4954759460553283E+001,-.4417235446400001E-013,0.2549925327988054E+001 +0.3000000000000000E-004,0.4515854377599739E-013,0.4996929639801362E+001,-.4203206860799756E-013,0.2625198721544424E+001 +0.3499999999999999E-004,0.4462294096000000E-013,0.5183803175400553E+001,-.4410009059200000E-013,0.2606628090571610E+001 +0.4000000000000000E-004,0.4630201327999762E-013,0.5119660533071672E+001,-.4692050700799757E-013,0.2497502087941249E+001 +0.4499999999999999E-004,0.4172175904000002E-013,0.5121548728360188E+001,-.4647842214400000E-013,0.2479939091815085E+001 +0.5000000000000000E-004,0.4507777827199764E-013,0.4981995448560597E+001,-.4525631254399767E-013,0.2484813283601566E+001 +0.5499999999999999E-004,0.4344865303999995E-013,0.4750148158262571E+001,-.4280359171200001E-013,0.2451795009881932E+001 +0.6000000000000000E-004,0.4066011774399788E-013,0.4949469650593784E+001,-.4341039569599777E-013,0.2568297889540754E+001 diff --git a/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_TruncAverage/analyze.ini b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_TruncAverage/analyze.ini new file mode 100644 index 000000000..131d751de --- /dev/null +++ b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_TruncAverage/analyze.ini @@ -0,0 +1,6 @@ +! compare columns in a data file +compare_column_file = PartAnalyze.csv ! data file name +compare_column_reference_file = PartAnalyze_ref.csv ! reference data file name +compare_column_index = 2,4 ! Comparison of pressure values at BCs +compare_column_tolerance_value = 15e-2 ! tolerance +compare_column_tolerance_type = relative ! absolute or relative comparison diff --git a/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_TruncAverage/command_line.ini b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_TruncAverage/command_line.ini new file mode 100644 index 000000000..c2fd94b17 --- /dev/null +++ b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_TruncAverage/command_line.ini @@ -0,0 +1 @@ +MPI = 6 \ No newline at end of file diff --git a/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_TruncAverage/externals.ini b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_TruncAverage/externals.ini new file mode 100644 index 000000000..a1777069f --- /dev/null +++ b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_TruncAverage/externals.ini @@ -0,0 +1,8 @@ +! --- Externals Tool Reggie +MPI = 1 , 6 +externalbinary = ./hopr/build/bin/hopr , ./bin/piclas +externaldirectory = hopr.ini , parameter_macrorestart.ini +externalruntime = pre , post +cmd_suffix = , ConstPressure_State_000.00005000000000000.h5 + +nocrosscombination:MPI,externalbinary,externaldirectory,externalruntime,cmd_suffix diff --git a/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_TruncAverage/hopr.ini b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_TruncAverage/hopr.ini new file mode 100644 index 000000000..a9a5d3e98 --- /dev/null +++ b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_TruncAverage/hopr.ini @@ -0,0 +1,31 @@ +ProjectName = cube +Debugvisu = T +DebugVisuLevel=2 +NVisu =1 +Mode =1 + +Corner =(/0.0,0.0,0.0 ,, 15.0,0.0,0.0 ,, 15.0,1.0,0.0 ,, 0.0,1.0,0.0 ,, 0.0,0.0,1.0 ,, 15.0,0.0,1.0 ,, 15.0,1.0,1.0 ,, 0.0,1.0,1.0 /) +nElems =(/100,4,4/) +elemtype =108 + +BCIndex =(/6 ,4 ,1 ,3 ,2 ,5/) +! =(/z-,y-,x+,y+,x-,z+/) + +nZones = 1 +nUserDefinedBoundaries=6 +BoundaryName=BC_Xplus +BoundaryType=(/4,0,0,0/) +BoundaryName=BC_Xminus +BoundaryType=(/4,0,0,0/) +BoundaryName=BC_Yplus +BoundaryType=(/4,0,0,0/) +BoundaryName=BC_Yminus +BoundaryType=(/4,0,0,0/) +BoundaryName=BC_Zplus +BoundaryType=(/4,0,0,0/) +BoundaryName=BC_Zminus +BoundaryType=(/4,0,0,0/) + +postscalemesh=true +meshscale=1e-5 +jacobiantolerance=1e-27 diff --git a/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_TruncAverage/parameter.ini b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_TruncAverage/parameter.ini new file mode 100644 index 000000000..6aabb6569 --- /dev/null +++ b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_TruncAverage/parameter.ini @@ -0,0 +1,141 @@ +! =============================================================================== ! +! EQUATION (linearscalaradvection) +! =============================================================================== ! +IniExactFunc = 0 + +! =============================================================================== ! +! DISCRETIZATION +! =============================================================================== ! +N = 1 ! Polynomial degree +NAnalyze = 1 ! Number of analyze points +NVisu = 1 +! =============================================================================== ! +! MESH +! =============================================================================== ! +MeshFile = cube_mesh.h5 +useCurveds = F +! if boundaries have to be changed (else they are used from Mesh directly): +TrackingMethod = triatracking +! =============================================================================== ! +! OUTPUT / VISUALIZATION +! =============================================================================== ! +ProjectName = ConstPressure +IterDisplayStep = 10 +Part-AnalyzeStep = 10 +CalcSurfFluxInfo = TRUE +! =============================================================================== ! +! CALCULATION +! =============================================================================== ! +tend = 5.0E-5 +Analyze_dt = 1.0E-5 +ManualTimeStep = 5.0E-7 +CFLscale = 0.2 ! Scaling of theoretical CFL number +! Load balancing +DoLoadBalance = T +PartWeightLoadBalance = T +Load-DeviationThreshold = 0.01 +LoadBalanceMaxSteps = 2 +UseH5IOLoadBalance = T +! =============================================================================== ! +! PARTICLES +! =============================================================================== ! +Part-maxParticleNumber=200000 +Part-nSpecies=1 +Part-nBounds=6 +Part-Boundary1-SourceName=BC_Xplus +Part-Boundary1-Condition=open +Part-Boundary2-SourceName=BC_Xminus +Part-Boundary2-Condition=open +Part-Boundary3-SourceName=BC_Yplus +Part-Boundary3-Condition=reflective +Part-Boundary3-MomentumACC=1. +Part-Boundary3-WallTemp=300. +Part-Boundary3-TransACC=1. +Part-Boundary3-VibACC=1. +Part-Boundary3-RotACC=1. +Part-Boundary4-SourceName=BC_Yminus +Part-Boundary4-Condition=reflective +Part-Boundary4-MomentumACC=1. +Part-Boundary4-WallTemp=300. +Part-Boundary4-TransACC=1. +Part-Boundary4-VibACC=1. +Part-Boundary4-RotACC=1. +Part-Boundary5-SourceName=BC_Zplus +Part-Boundary5-Condition=reflective +Part-Boundary5-MomentumACC=1. +Part-Boundary5-WallTemp=300. +Part-Boundary5-TransACC=1. +Part-Boundary5-VibACC=1. +Part-Boundary5-RotACC=1. +Part-Boundary6-SourceName=BC_Zminus +Part-Boundary6-Condition=reflective +Part-FIBGMdeltas=(/2.5e-6,1e-5,1e-5/) +! =============================================================================== ! +! Species1 - O2 +! =============================================================================== ! +Part-Species1-MassIC=5.31352E-26 +Part-Species1-MacroParticleFactor=2E3 + +Part-Species1-nInits=1 +Part-Species1-Init1-SpaceIC=cell_local +Part-Species1-Init1-velocityDistribution=maxwell_lpn +Part-Species1-Init1-PartDensity=6E+20 +Part-Species1-Init1-VeloIC=0 +Part-Species1-Init1-VeloVecIC=(/1.,0.,0./) +Part-Species1-Init1-MWTemperatureIC=300 +Part-Species1-Init1-TempVib=300 +Part-Species1-Init1-TempRot=300 + +Part-Species1-nSurfaceFluxBCs=2 +! Inlet: Constant pressure, Type 1 +Part-Species1-Surfaceflux1-BC=1 +Part-Species1-Surfaceflux1-velocityDistribution=maxwell_lpn +Part-Species1-Surfaceflux1-VeloIC=5 +Part-Species1-Surfaceflux1-VeloVecIC=(/-1.0,0.0,0.0/) +Part-Species1-Surfaceflux1-MWTemperatureIC=300. +Part-Species1-Surfaceflux1-TempVib=300. +Part-Species1-Surfaceflux1-TempRot=300. +Part-Species1-Surfaceflux1-Adaptive=TRUE +Part-Species1-Surfaceflux1-Adaptive-Type=1 +Part-Species1-Surfaceflux1-Adaptive-Pressure=5.0 + +! Outlet: Constant pressure, Type 2 +Part-Species1-Surfaceflux2-BC=2 +Part-Species1-Surfaceflux2-velocityDistribution=maxwell_lpn +Part-Species1-Surfaceflux2-VeloIC=5 +Part-Species1-Surfaceflux2-VeloVecIC=(/1.0,0.0,0.0/) +Part-Species1-Surfaceflux2-MWTemperatureIC=300. +Part-Species1-Surfaceflux2-TempVib=300. +Part-Species1-Surfaceflux2-TempRot=300. +Part-Species1-Surfaceflux2-Adaptive=TRUE +Part-Species1-Surfaceflux2-Adaptive-Type=2 +Part-Species1-Surfaceflux2-Adaptive-Pressure=2.5 + +AdaptiveBC-SamplingIteration = 10 +AdaptiveBC-TruncateRunningAverage = T +! =============================================================================== ! +! DSMC +! =============================================================================== ! +Particles-HaloEpsVelo=2.0E+03 +Particles-NumberForDSMCOutputs=1 +Part-TimeFracForSampling=0.1 +Particles-DSMC-CalcSurfaceVal=true +UseDSMC=true +Particles-DSMC-CollisMode=2 !(1:elast coll, 2: elast + rela, 3:chem) +Part-NumberOfRandomSeeds=2 +Particles-RandomSeed1=2 +Particles-RandomSeed2=1 +Particles-DSMC-UseOctree = T +Particles-DSMC-UseNearestNeighbour = T +Particles-DSMC-CalcQualityFactors= F + +! =============================================================================== ! +! Species1, O2 +! =============================================================================== ! +Part-Species1-InteractionID = 2 +Part-Species1-Tref = 273 +Part-Species1-dref = 4.07E-10 +Part-Species1-omega=0.27 +Part-Species1-CharaTempRot=2.1 +Part-Species1-CharaTempVib=2272.18 +Part-Species1-Ediss_eV=5.17 \ No newline at end of file diff --git a/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_TruncAverage/parameter_macrorestart.ini b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_TruncAverage/parameter_macrorestart.ini new file mode 100644 index 000000000..eefeb3658 --- /dev/null +++ b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_TruncAverage/parameter_macrorestart.ini @@ -0,0 +1,145 @@ +! =============================================================================== ! +! EQUATION (linearscalaradvection) +! =============================================================================== ! +IniExactFunc = 0 + +! =============================================================================== ! +! DISCRETIZATION +! =============================================================================== ! +N = 1 ! Polynomial degree +NAnalyze = 1 ! Number of analyze points +NVisu = 1 +! =============================================================================== ! +! MESH +! =============================================================================== ! +MeshFile = cube_mesh.h5 +useCurveds = F +! if boundaries have to be changed (else they are used from Mesh directly): +TrackingMethod = triatracking +! =============================================================================== ! +! OUTPUT / VISUALIZATION +! =============================================================================== ! +ProjectName = ConstPressure +IterDisplayStep = 10 +Part-AnalyzeStep = 10 +CalcSurfFluxInfo = TRUE +! =============================================================================== ! +! CALCULATION +! =============================================================================== ! +tend = 6.0E-5 +Analyze_dt = 1.0E-5 +CFLscale = 0.2 ! Scaling of theoretical CFL number +! Load balancing +DoLoadBalance = T +PartWeightLoadBalance = T +Load-DeviationThreshold = 0.01 +LoadBalanceMaxSteps = 2 +UseH5IOLoadBalance = T +! =============================================================================== ! +! PARTICLES +! =============================================================================== ! +Part-maxParticleNumber=200000 +Part-nSpecies=1 +Part-nBounds=6 +Part-Boundary1-SourceName=BC_Xplus +Part-Boundary1-Condition=open +Part-Boundary2-SourceName=BC_Xminus +Part-Boundary2-Condition=open +Part-Boundary3-SourceName=BC_Yplus +Part-Boundary3-Condition=reflective +Part-Boundary3-MomentumACC=1. +Part-Boundary3-WallTemp=300. +Part-Boundary3-TransACC=1. +Part-Boundary3-VibACC=1. +Part-Boundary3-RotACC=1. +Part-Boundary4-SourceName=BC_Yminus +Part-Boundary4-Condition=reflective +Part-Boundary4-MomentumACC=1. +Part-Boundary4-WallTemp=300. +Part-Boundary4-TransACC=1. +Part-Boundary4-VibACC=1. +Part-Boundary4-RotACC=1. +Part-Boundary5-SourceName=BC_Zplus +Part-Boundary5-Condition=reflective +Part-Boundary5-MomentumACC=1. +Part-Boundary5-WallTemp=300. +Part-Boundary5-TransACC=1. +Part-Boundary5-VibACC=1. +Part-Boundary5-RotACC=1. +Part-Boundary6-SourceName=BC_Zminus +Part-Boundary6-Condition=reflective +Part-FIBGMdeltas=(/2.5e-6,1e-5,1e-5/) +! =============================================================================== ! +! Species1 - O2 +! =============================================================================== ! +Part-Species1-MassIC=5.31352E-26 +Part-Species1-MacroParticleFactor=5E2 + +Part-Species1-nInits=1 +Part-Species1-Init1-SpaceIC=cell_local +Part-Species1-Init1-velocityDistribution=maxwell_lpn +Part-Species1-Init1-PartDensity=6E+20 +Part-Species1-Init1-VeloIC=0 +Part-Species1-Init1-VeloVecIC=(/1.,0.,0./) +Part-Species1-Init1-MWTemperatureIC=300 +Part-Species1-Init1-TempVib=300 +Part-Species1-Init1-TempRot=300 + +Part-Species1-nSurfaceFluxBCs=2 +! Inlet: Constant pressure, Type 1 +Part-Species1-Surfaceflux1-BC=1 +Part-Species1-Surfaceflux1-velocityDistribution=maxwell_lpn +Part-Species1-Surfaceflux1-VeloIC=5 +Part-Species1-Surfaceflux1-VeloVecIC=(/-1.0,0.0,0.0/) +Part-Species1-Surfaceflux1-MWTemperatureIC=300. +Part-Species1-Surfaceflux1-TempVib=300. +Part-Species1-Surfaceflux1-TempRot=300. +Part-Species1-Surfaceflux1-Adaptive=TRUE +Part-Species1-Surfaceflux1-Adaptive-Type=1 +Part-Species1-Surfaceflux1-Adaptive-Pressure=5.0 + +! Outlet: Constant pressure, Type 2 +Part-Species1-Surfaceflux2-BC=2 +Part-Species1-Surfaceflux2-velocityDistribution=maxwell_lpn +Part-Species1-Surfaceflux2-VeloIC=5 +Part-Species1-Surfaceflux2-VeloVecIC=(/1.0,0.0,0.0/) +Part-Species1-Surfaceflux2-MWTemperatureIC=300. +Part-Species1-Surfaceflux2-TempVib=300. +Part-Species1-Surfaceflux2-TempRot=300. +Part-Species1-Surfaceflux2-Adaptive=TRUE +Part-Species1-Surfaceflux2-Adaptive-Type=2 +Part-Species1-Surfaceflux2-Adaptive-Pressure=2.5 + +AdaptiveBC-SamplingIteration = 10 +AdaptiveBC-TruncateRunningAverage = T +! =============================================================================== ! +! DSMC +! =============================================================================== ! +ManualTimeStep=5.0000E-7 +Particles-HaloEpsVelo=2.0E+03 +Particles-NumberForDSMCOutputs=1 +Part-TimeFracForSampling=0.25 +Particles-DSMC-CalcSurfaceVal=true +UseDSMC=true +Particles-DSMC-CollisMode=2 !(1:elast coll, 2: elast + rela, 3:chem) +Part-NumberOfRandomSeeds=2 +Particles-RandomSeed1=2 +Particles-RandomSeed2=1 +Particles-DSMC-UseOctree = T +Particles-DSMC-UseNearestNeighbour = T +Particles-DSMC-CalcQualityFactors= F +! =============================================================================== ! +! Macroscopic Restart +! =============================================================================== ! +Particles-MacroscopicRestart = T +Particles-MacroscopicRestart-Filename = ConstPressure_DSMCState_000.00005000000000000.h5 +! =============================================================================== ! +! Species1, O2 +! =============================================================================== ! +Part-Species1-InteractionID = 2 +Part-Species1-Tref = 273 +Part-Species1-dref = 4.07E-10 +Part-Species1-omega=0.27 +Part-Species1-CharaTempRot=2.1 +Part-Species1-CharaTempVib=2272.18 +Part-Species1-Ediss_eV=5.17 \ No newline at end of file diff --git a/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_TruncAverage/readme.md b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_TruncAverage/readme.md new file mode 100644 index 000000000..ba6ab29b0 --- /dev/null +++ b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_TruncAverage/readme.md @@ -0,0 +1,6 @@ +# DSMC - Pressure driven channel flow +* Simulation of a subsonic channel flow with O2 +* Testing the adaptive surface flux boundary conditions (Type=1: Inflow, constant pressure and temperature and Type=2: Outflow with constant pressure) +* Inlet: 5 Pa, 300K, Outlet: 2.5 Pa, 300K +* Temporal evolution of the channel is sensitive to the chosen sampling method for the adaptive BC +* Testing macroscopic restart with weighting factor change with post external \ No newline at end of file diff --git a/src/io_hdf5/hdf5_output_particle.f90 b/src/io_hdf5/hdf5_output_particle.f90 index 106243fbc..fe033043c 100644 --- a/src/io_hdf5/hdf5_output_particle.f90 +++ b/src/io_hdf5/hdf5_output_particle.f90 @@ -1047,7 +1047,7 @@ SUBROUTINE WriteAdaptiveRunningAverageToHDF5(FileName) USE MOD_Timedisc_Vars ,ONLY: iter USE MOD_Restart_Vars ,ONLY: DoRestart USE MOD_Mesh_Vars ,ONLY: offsetElem -USE MOD_Particle_Vars ,ONLY: nSpecies +USE MOD_Particle_Vars ,ONLY: nSpecies, Species USE MOD_Particle_Sampling_Vars ,ONLY: AdaptBCAverage, AdaptBCSampleElemNum, AdaptBCMapSampleToElem, AdaptBCSampIter USE MOD_Particle_Sampling_Vars ,ONLY: AdaptBCSampleElemNumGlobal, offSetElemAdaptBCSample, AdaptBCSampIterReadIn ! IMPLICIT VARIABLE HANDLING @@ -1073,9 +1073,10 @@ SUBROUTINE WriteAdaptiveRunningAverageToHDF5(FileName) AdaptBCAverageIndex(SampleElemID) = ElemID + offsetElem END DO -! Store the position in the array for early restarts +! Store the position in the array for early restarts and the used weighting factor IF(MPIRoot)THEN CALL OpenDataFile(FileName,create=.FALSE.,single=.TRUE.,readOnly=.FALSE.) + CALL WriteAttributeToHDF5(File_ID,'AdaptBCWeightingFactor',nSpecies,RealArray=Species(1:nSpecies)%MacroParticleFactor) IF(INT(iter,4)+AdaptBCSampIterReadIn.LT.AdaptBCSampIter) THEN CALL WriteAttributeToHDF5(File_ID,'AdaptBCSampIter',1,IntegerScalar=INT(iter,4)+AdaptBCSampIterReadIn) ELSE diff --git a/src/particles/sampling/particle_sampling_adaptive.f90 b/src/particles/sampling/particle_sampling_adaptive.f90 index 157ebc19d..8ce04dff2 100644 --- a/src/particles/sampling/particle_sampling_adaptive.f90 +++ b/src/particles/sampling/particle_sampling_adaptive.f90 @@ -93,11 +93,11 @@ SUBROUTINE InitAdaptiveBCSampling() !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES LOGICAL :: AdaptiveDataExists, RunningAverageExists, UseAdaptiveType4, AdaptBCPartNumOutExists -REAL :: TimeStepOverWeight, v_thermal, dtVar +REAL :: TimeStepOverWeight, v_thermal, dtVar, WeightingFactor(1:nSpecies) REAL,ALLOCATABLE :: ElemData_HDF5(:,:), ElemData2_HDF5(:,:,:,:) INTEGER :: iElem, iSpec, iSF, iSide, ElemID, SampleElemID, nVar, GlobalSideID, GlobalElemID, currentBC INTEGER :: jSample, iSample, BCSideID, nElemReadin, nVarTotal, iVar, nVarArrayStart, nVarArrayEnd -INTEGER :: SampIterArrayEnd, nSurfacefluxBCs +INTEGER :: SampIterEnd, nSurfacefluxBCs INTEGER,ALLOCATABLE :: GlobalElemIndex(:) #if USE_MPI INTEGER :: offSetElemAdaptBCSampleMPI(0:nProcessors-1) @@ -341,19 +341,19 @@ SUBROUTINE InitAdaptiveBCSampling() IF(AdaptBCSampIter.EQ.nVar) THEN nVarArrayStart = 1 nVarArrayEnd = nVar - SampIterArrayEnd = AdaptBCSampIter + SampIterEnd = AdaptBCSampIter IF(AdaptBCSampIterReadIn.LT.nVar.AND..NOT.PerformLoadBalance) THEN LBWRITE(*,*) '| TruncateRunningAverage: Array not filled in previous simulation run. Continuing at: ', AdaptBCSampIterReadIn + 1 END IF ELSE IF(AdaptBCSampIter.GT.nVar) THEN nVarArrayStart = 1 nVarArrayEnd = nVar - SampIterArrayEnd = nVar + SampIterEnd = nVar LBWRITE(*,*) '| TruncateRunningAverage: Smaller number of sampling iterations in restart file. Continuing at: ', AdaptBCSampIterReadIn + 1 ELSE nVarArrayStart = nVar - AdaptBCSampIter + 1 nVarArrayEnd = nVar - SampIterArrayEnd = AdaptBCSampIter + SampIterEnd = AdaptBCSampIter AdaptBCSampIterReadIn = AdaptBCSampIter LBWRITE(*,*) '| TruncateRunningAverage: Greater number of sampling iterations in restart file. Using the last ', AdaptBCSampIterReadIn, ' sample iterations.' END IF @@ -375,14 +375,29 @@ SUBROUTINE InitAdaptiveBCSampling() IF((GlobalElemID.LT.1+offsetElem).OR.(GlobalElemID.GT.nElems+offsetElem)) CYCLE ! Get the sample element ID SampleElemID = AdaptBCMapElemToSample(GlobalElemID-offsetElem) - IF(SampleElemID.GT.0) AdaptBCAverage(1:8,1:SampIterArrayEnd,SampleElemID,1:nSpecies) = ElemData2_HDF5(1:8,nVarArrayStart:nVarArrayEnd,iElem,1:nSpecies) + IF(SampleElemID.GT.0) AdaptBCAverage(1:8,1:SampIterEnd,SampleElemID,1:nSpecies) = ElemData2_HDF5(1:8,nVarArrayStart:nVarArrayEnd,iElem,1:nSpecies) END DO + ! Scaling of the weighted particle number in case of a macroscopic restart with a particle weighting change + IF(DoMacroscopicRestart.AND..NOT.PerformLoadBalance) THEN + CALL ReadAttribute(File_ID,'AdaptBCWeightingFactor',nSpecies,RealArray=WeightingFactor) + DO iSpec = 1, nSpecies + IF(WeightingFactor(iSpec).NE.Species(iSpec)%MacroParticleFactor) THEN + AdaptBCAverage(7:8,1:SampIterEnd,:,iSpec) = AdaptBCAverage(7:8,1:SampIterEnd,:,iSpec) * WeightingFactor(iSpec) & + / Species(iSpec)%MacroParticleFactor + END IF + END DO + LBWRITE(*,*) '| TruncateRunningAverage: Sample successfully initiliazed from restart file and scaled due to MacroscopicRestart.' + ELSE + LBWRITE(*,*) '| TruncateRunningAverage: Sample successfully initiliazed from restart file.' + END IF + END IF + IF(.NOT.AdaptiveDataExists) THEN + ! Calculate the macro values initially from the sample for the first iteration + CALL AdaptiveBCSampling(initTruncAverage_opt=.TRUE.) + LBWRITE(*,*) '| TruncateRunningAverage: AdaptiveInfo not found in state file. Macroscopic values calculated from sample.' END IF - ! Calculate the macro values intially from the sample for the first iteration - CALL AdaptiveBCSampling(initTruncAverage_opt=.TRUE.) SDEALLOCATE(ElemData2_HDF5) SDEALLOCATE(GlobalElemIndex) - LBWRITE(*,*) '| TruncateRunningAverage: Sample successfully initiliazed from restart file.' ELSE LBWRITE(*,*) '| TruncateRunningAverage: No running average values found. Values initiliazed with zeros.' END IF From 18f22061f38efb3425b94a019d830cbe3702810b Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Tue, 5 Sep 2023 23:25:10 +0200 Subject: [PATCH 190/495] Speed-up of 1D Sod Shocktube test case by using 6 processors and load balance during the simulation --- .../WEK_DSMC/1D_Sod_Shocktube/command_line.ini | 2 +- .../WEK_DSMC/1D_Sod_Shocktube/parameter.ini | 11 +++++++++-- src/particles/particle_mesh/particle_mesh.f90 | 1 + 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/regressioncheck/WEK_DSMC/1D_Sod_Shocktube/command_line.ini b/regressioncheck/WEK_DSMC/1D_Sod_Shocktube/command_line.ini index 2df6de114..11fbc4524 100644 --- a/regressioncheck/WEK_DSMC/1D_Sod_Shocktube/command_line.ini +++ b/regressioncheck/WEK_DSMC/1D_Sod_Shocktube/command_line.ini @@ -1,2 +1,2 @@ -MPI=1 +MPI=6 cmd_suffix=DSMC.ini diff --git a/regressioncheck/WEK_DSMC/1D_Sod_Shocktube/parameter.ini b/regressioncheck/WEK_DSMC/1D_Sod_Shocktube/parameter.ini index bc7e81ec5..35c1431c8 100644 --- a/regressioncheck/WEK_DSMC/1D_Sod_Shocktube/parameter.ini +++ b/regressioncheck/WEK_DSMC/1D_Sod_Shocktube/parameter.ini @@ -2,7 +2,7 @@ ! =============================================================================== ! ! DISCRETIZATION ! =============================================================================== ! -N = 2 ! Polynomial degree +N = 1 ! Polynomial degree NAnalyze = 1 ! Number of analyze points IniExactFunc = 0 CFLscale = 0.2 ! Scaling of theoretical CFL number @@ -22,8 +22,15 @@ IterDisplayStep = 500 ! CALCULATION ! =============================================================================== ! tend = 2.25E-5 -Analyze_dt = 2.25E-5 +Analyze_dt = 7.5E-6 Particles-Symmetry-Order=1 +! Load balancing +DoLoadBalance = T +PartWeightLoadBalance = T +DoInitialAutoRestart = T +InitialAutoRestart-PartWeightLoadBalance = T +Load-DeviationThreshold = 0.01 +LoadBalanceMaxSteps = 3 ! =============================================================================== ! ! PARTICLES ! =============================================================================== ! diff --git a/src/particles/particle_mesh/particle_mesh.f90 b/src/particles/particle_mesh/particle_mesh.f90 index a5a21aacd..605be2fa5 100644 --- a/src/particles/particle_mesh/particle_mesh.f90 +++ b/src/particles/particle_mesh/particle_mesh.f90 @@ -830,6 +830,7 @@ SUBROUTINE FinalizeParticleMesh() SDEALLOCATE(GEO%PeriodicVectors) SDEALLOCATE(GEO%FIBGM) SDEALLOCATE(GEO%TFIBGM) +SDEALLOCATE(GEO%XMinMax) #if USE_MPI SDEALLOCATE(IsExchangeElem) #endif /*USE_MPI*/ From dd004978c9da51b8f7b7d974bc304a0672244446 Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Tue, 5 Sep 2023 23:41:55 +0200 Subject: [PATCH 191/495] Updated developer guide with respect to the new MPI_COMM_PICLAS communicator --- docs/documentation/developerguide/mpi.md | 33 ++++++++++++------------ 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/docs/documentation/developerguide/mpi.md b/docs/documentation/developerguide/mpi.md index ba3ba0a48..40044a8f9 100644 --- a/docs/documentation/developerguide/mpi.md +++ b/docs/documentation/developerguide/mpi.md @@ -135,9 +135,9 @@ color = MERGE(1337, MPI_UNDEFINED, nSurfSidesProc.GT.0) ``` Here, every processor with the same `color` will be part of the same communicator. The condition `nSurfSidesProc.GT.0` in this case includes every processor with a surface side. Every other processor will be set to `MPI_UNDEFINED` and consequently be part of `MPI_COMM_NULL`. Now, the communicator itself can be created: ``` -CALL MPI_COMM_SPLIT(MPI_COMM_WORLD, color, MPI_INFO_NULL, SurfCOMM%UNICATOR, iError) +CALL MPI_COMM_SPLIT(MPI_COMM_PICLAS, color, MPI_INFO_NULL, SurfCOMM%UNICATOR, iError) ``` -`MPI_COMM_WORLD` denotes the original communicator containing every processor (but can also be a previously created subset) and the `MPI_INFO_NULL` entry denotes the rank assignment within the new communicator (default: numbering from 0 to nProcs - 1). Additional information can be stored within the created variable: +`MPI_COMM_PICLAS` denotes the global PICLas communicator containing every processor (but can also be a previously created subset) and the `MPI_INFO_NULL` entry denotes the rank assignment within the new communicator (default: numbering from 0 to nProcs - 1). Additional information can be stored within the created variable: ``` IF(SurfCOMM%UNICATOR.NE.MPI_COMM_NULL) THEN ! Stores the rank within the given communicator as MyRank @@ -159,21 +159,22 @@ that either a communicator exists and/or every (other) processor has been set to | Handle | Description | Derived from | | ----------------------- | --------------------------------------------- | ----------------------- | | MPI_COMM_WORLD | Default global communicator | - | -| MPI_COMM_NODE | Processors on a node | MPI_COMM_WORLD | -| MPI_COMM_LEADERS | Group of node leaders | MPI_COMM_WORLD | -| MPI_COMM_WORKERS | All remaining processors, who are not leaders | MPI_COMM_WORLD | -| MPI_COMM_SHARED | Processors on a node | MPI_COMM_WORLD | -| MPI_COMM_LEADERS_SHARED | Group of node leaders (myComputeNodeRank = 0) | MPI_COMM_WORLD | +| MPI_COMM_PICLAS | Duplicate of MPI_COMM_WORLD | MPI_COMM_PICLAS | +| MPI_COMM_NODE | Processors on a node | MPI_COMM_PICLAS | +| MPI_COMM_LEADERS | Group of node leaders | MPI_COMM_PICLAS | +| MPI_COMM_WORKERS | All remaining processors, who are not leaders | MPI_COMM_PICLAS | +| MPI_COMM_SHARED | Processors on a node | MPI_COMM_PICLAS | +| MPI_COMM_LEADERS_SHARED | Group of node leaders (myComputeNodeRank = 0) | MPI_COMM_PICLAS | | MPI_COMM_LEADERS_SURF | Node leaders with surface sides | MPI_COMM_LEADERS_SHARED | #### Feature-specific -| Handle | Description | Derived from | -| ------------------------------------ | ---------------------------------------------------------------------- | -------------- | -| PartMPIInitGroup(nInitRegions)%COMM | Emission groups | MPI_COMM_PICLAS| -| SurfCOMM%UNICATOR | Processors with a surface side (e.g. reflective), including halo sides | MPI_COMM_WORLD | -| CPPCOMM%UNICATOR | Coupled power potential | MPI_COMM_WORLD | -| EDC%COMM(iEDCBC)%UNICATOR | Electric displacement current (per BC) | MPI_COMM_WORLD | -| FPC%COMM(iUniqueFPCBC)%UNICATOR | Floating potential (per BC) | MPI_COMM_WORLD | -| EPC%COMM(iUniqueEPCBC)%UNICATOR | Electric potential (per BC) | MPI_COMM_WORLD | -| BiasVoltage%COMM%UNICATOR | Bias voltage | MPI_COMM_WORLD | \ No newline at end of file +| Handle | Description | Derived from | +| ----------------------------------- | ---------------------------------------------------------------------- | --------------- | +| PartMPIInitGroup(nInitRegions)%COMM | Emission groups | MPI_COMM_PICLAS | +| SurfCOMM%UNICATOR | Processors with a surface side (e.g. reflective), including halo sides | MPI_COMM_PICLAS | +| CPPCOMM%UNICATOR | Coupled power potential | MPI_COMM_PICLAS | +| EDC%COMM(iEDCBC)%UNICATOR | Electric displacement current (per BC) | MPI_COMM_PICLAS | +| FPC%COMM(iUniqueFPCBC)%UNICATOR | Floating potential (per BC) | MPI_COMM_PICLAS | +| EPC%COMM(iUniqueEPCBC)%UNICATOR | Electric potential (per BC) | MPI_COMM_PICLAS | +| BiasVoltage%COMM%UNICATOR | Bias voltage | MPI_COMM_PICLAS | \ No newline at end of file From 1adf95794c527df44a579cca83fdc477c1890708 Mon Sep 17 00:00:00 2001 From: Felix Garmirian Date: Wed, 6 Sep 2023 11:53:44 +0200 Subject: [PATCH 192/495] (almost) no more MPI_COMM_WORLD --- src/globals/globals.f90 | 2 +- src/loadbalance/loadbalance_tools.f90 | 16 +++++----- src/loadbalance/loaddistribution.f90 | 14 ++++----- src/mesh/mesh.f90 | 12 ++++---- src/mesh/mesh_readin.f90 | 6 ++-- src/mesh/mesh_tools.f90 | 4 +-- src/mesh/metrics.f90 | 4 +-- src/mesh/prepare_mesh.f90 | 30 +++++++++---------- src/mpi/mpi.f90 | 4 --- src/mpi/mpi_shared.f90 | 4 +++ .../particle_mesh/particle_mesh_tools.f90 | 18 +++++------ 11 files changed, 57 insertions(+), 57 deletions(-) diff --git a/src/globals/globals.f90 b/src/globals/globals.f90 index 4a62619c8..474ae952f 100644 --- a/src/globals/globals.f90 +++ b/src/globals/globals.f90 @@ -805,7 +805,7 @@ FUNCTION PICLASTIME() IF(PRESENT(Comm))THEN CALL MPI_BARRIER(Comm,iError) ELSE - CALL MPI_BARRIER(MPI_COMM_WORLD,iError) + CALL MPI_BARRIER(MPI_COMM_PICLAS,iError) END IF PiclasTime=MPI_WTIME() #else diff --git a/src/loadbalance/loadbalance_tools.f90 b/src/loadbalance/loadbalance_tools.f90 index 1efe20742..066ba9805 100644 --- a/src/loadbalance/loadbalance_tools.f90 +++ b/src/loadbalance/loadbalance_tools.f90 @@ -146,7 +146,7 @@ SUBROUTINE DomainDecomposition() END IF ! 2) Distribute logical information ElemTimeExists - CALL MPI_BCAST(ElemTimeExists,1,MPI_LOGICAL,0,MPI_COMM_WORLD,iError) + CALL MPI_BCAST(ElemTimeExists,1,MPI_LOGICAL,0,MPI_COMM_PICLAS,iError) ! Distribute the elements according to the selected distribution method CALL ApplyWeightDistributionMethod(ElemTimeExists) @@ -155,7 +155,7 @@ SUBROUTINE DomainDecomposition() CALL WeightDistribution_Equal(nProcessors,nGlobalElems,offsetElemMPI) ! Send the load distribution to all other procs - CALL MPI_BCAST(offsetElemMPI,nProcessors+1,MPI_INTEGER,0,MPI_COMM_WORLD,iERROR) + CALL MPI_BCAST(offsetElemMPI,nProcessors+1,MPI_INTEGER,0,MPI_COMM_PICLAS,iERROR) END IF ! IF(DoRestart.OR.PerformLoadBalance) @@ -325,7 +325,7 @@ SUBROUTINE ReadElemTime(single) DO iProc = 0,nProcessors-1 ElemPerProc(iProc) = offsetElemMPIOld(iProc+1) - offsetElemMPIOld(iProc) END DO - CALL MPI_GATHERV(ElemTime,nElems,MPI_DOUBLE_PRECISION,ElemGlobalTime,ElemPerProc,offsetElemMPIOld(0:nProcessors-1),MPI_DOUBLE_PRECISION,0,MPI_COMM_WORLD,iError) + CALL MPI_GATHERV(ElemTime,nElems,MPI_DOUBLE_PRECISION,ElemGlobalTime,ElemPerProc,offsetElemMPIOld(0:nProcessors-1),MPI_DOUBLE_PRECISION,0,MPI_COMM_PICLAS,iError) ELSE ALLOCATE(ElemTimeTmp(1:nElems)) @@ -335,7 +335,7 @@ SUBROUTINE ReadElemTime(single) counts_recv => INT(MPInElemRecv ) ,& disp_recv => INT(MPIoffsetElemRecv)) ! Communicate PartInt over MPI - CALL MPI_ALLTOALLV(ElemTime,counts_send,disp_send,MPI_DOUBLE_PRECISION,ElemTimeTmp,counts_recv,disp_recv,MPI_DOUBLE_PRECISION,MPI_COMM_WORLD,iError) + CALL MPI_ALLTOALLV(ElemTime,counts_send,disp_send,MPI_DOUBLE_PRECISION,ElemTimeTmp,counts_recv,disp_recv,MPI_DOUBLE_PRECISION,MPI_COMM_PICLAS,iError) END ASSOCIATE DEALLOCATE(ElemTime) @@ -367,7 +367,7 @@ SUBROUTINE ReadElemTime(single) ! When this happens, the root process and its processors that are on the same node always return ElemTimeExists=T ! This points to a corrupt state file (accompanied by SpecID=0 particles within the file) ! If the load balance step is performed without h5 I/O in the future, this check can be removed - CALL OpenDataFile(RestartFile,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_WORLD) + CALL OpenDataFile(RestartFile,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_PICLAS) CALL DatasetExists(File_ID,'ElemTime',ElemTimeExists) IF(.NOT.ElemTimeExists) CALL abort(__STAMP__,'ElemTime does not exit for some processors in .h5 which indicates a corrupt state file') CALL CloseDataFile() @@ -392,8 +392,8 @@ SUBROUTINE ReadElemTime(single) END IF ! MPIRoot ! Send from root to all other processes - CALL MPI_SCATTERV(ElemGlobalTime, ElemProc, offsetElemMPI, MPI_DOUBLE_PRECISION, ElemTime_tmp, nElems, MPI_DOUBLE_PRECISION, 0, MPI_COMM_WORLD, IERROR) - + CALL MPI_SCATTERV(ElemGlobalTime, ElemProc, offsetElemMPI, MPI_DOUBLE_PRECISION, ElemTime_tmp, nElems, MPI_DOUBLE_PRECISION, 0, MPI_COMM_PICLAS, IERROR) + ! Deallocate temporary array IF(MPIRoot) DEALLOCATE(ElemProc) END IF ! FlushInitialState @@ -403,7 +403,7 @@ SUBROUTINE ReadElemTime(single) SDEALLOCATE(ElemTime_tmp) ALLOCATE(ElemTime_tmp(1:nElems)) ElemTime_tmp = 0. - CALL OpenDataFile(RestartFile,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_WORLD) + CALL OpenDataFile(RestartFile,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_PICLAS) CALL ReadArray('ElemTime',2,(/1_IK,INT(nElems,IK)/),INT(offsetElem,IK),2,RealArray=ElemTime_tmp) CALL CloseDataFile() diff --git a/src/loadbalance/loaddistribution.f90 b/src/loadbalance/loaddistribution.f90 index 1004d2831..c2acdd359 100644 --- a/src/loadbalance/loaddistribution.f90 +++ b/src/loadbalance/loaddistribution.f90 @@ -91,7 +91,7 @@ SUBROUTINE SingleStepOptimalPartition(nProcs,OldElems,NewElems,ElemTime) LoadSend = PreSum(OldElems) -CALL MPI_EXSCAN(LoadSend,LowerBoundary,1,MPI_DOUBLE_PRECISION,MPI_SUM,MPI_COMM_WORLD,iERROR) +CALL MPI_EXSCAN(LoadSend,LowerBoundary,1,MPI_DOUBLE_PRECISION,MPI_SUM,MPI_COMM_PICLAS,iERROR) IF(MPIRoot) LowerBoundary = 0. UpperBoundary = LowerBoundary + PreSum(OldElems) @@ -143,7 +143,7 @@ SUBROUTINE SingleStepOptimalPartition(nProcs,OldElems,NewElems,ElemTime) END IF END DO ! iRank=minRank,maxRank -CALL MPI_ALLTOALL(send_count,1,MPI_INTEGER,recv_count,1, MPI_INTEGER,MPI_COMM_WORLD,iERROR) +CALL MPI_ALLTOALL(send_count,1,MPI_INTEGER,recv_count,1, MPI_INTEGER,MPI_COMM_PICLAS,iERROR) NewElems = SUM(recv_count) DEALLOCATE(PreSum,send_count,recv_count,split) @@ -213,7 +213,7 @@ SUBROUTINE ApplyWeightDistributionMethod(ElemTimeExists) END DO ! Sanity check IF(.NOT.ALLOCATED(PartInt)) CALL abort(__STAMP__,'PartInt is not allocated') ! Missing call to FillParticleData() - CALL MPI_GATHERV(PartInt,nElemsOld,MPI_DOUBLE_PRECISION,PartIntGlob,ElemPerProc,offsetElemMPIOld(0:nProcessors-1),MPI_DOUBLE_PRECISION,0,MPI_COMM_WORLD,iError) + CALL MPI_GATHERV(PartInt,nElemsOld,MPI_DOUBLE_PRECISION,PartIntGlob,ElemPerProc,offsetElemMPIOld(0:nProcessors-1),MPI_DOUBLE_PRECISION,0,MPI_COMM_PICLAS,iError) PartIntExists = .TRUE. ELSE ! Readin of PartInt: Read in only by MPIRoot in single mode because the root performs the distribution of elements (domain decomposition) @@ -285,7 +285,7 @@ SUBROUTINE ApplyWeightDistributionMethod(ElemTimeExists) #endif /*PARTICLES*/ ! Distribute PartsInElem to all procs (Every proc needs to get the information to arrive at the same timedisc) -CALL MPI_BCAST(PartsInElem,nGlobalElems,MPI_INTEGER,0,MPI_COMM_WORLD,iError) +CALL MPI_BCAST(PartsInElem,nGlobalElems,MPI_INTEGER,0,MPI_COMM_PICLAS,iError) ! Every proc needs to get the information to arrive at the same timedisc ! No historical data and no particles in restart file @@ -332,7 +332,7 @@ SUBROUTINE ApplyWeightDistributionMethod(ElemTimeExists) END SELECT ! WeightDistributionMethod_loc ! Send the load distribution to all other procs -CALL MPI_BCAST(offsetElemMPI,nProcs+1,MPI_INTEGER,0,MPI_COMM_WORLD,iERROR) +CALL MPI_BCAST(offsetElemMPI,nProcs+1,MPI_INTEGER,0,MPI_COMM_PICLAS,iERROR) #ifdef PARTICLES ! Set PartDistri for every processor @@ -600,7 +600,7 @@ SUBROUTINE WeightDistribution_SingleStepOptimal(nProcs,nGlobalElems,ElemGlobalTi REAL :: LoadDiff( 0:nProcs-1) !=================================================================================================================================== ! Distribute ElemGlobalTime to all procs -CALL MPI_BCAST(ElemGlobalTime,nGlobalElems,MPI_DOUBLE_PRECISION,0,MPI_COMM_WORLD,iError) +CALL MPI_BCAST(ElemGlobalTime,nGlobalElems,MPI_DOUBLE_PRECISION,0,MPI_COMM_PICLAS,iError) ! Do Rebalance WeightSum = 0. @@ -698,7 +698,7 @@ SUBROUTINE WeightDistribution_SingleStepOptimal(nProcs,nGlobalElems,ElemGlobalTi ErrorCode = 0 IF(NewElems.LE.0) ErrorCode = ErrorCode+100 - CALL MPI_ALLGATHER(NewElems,1,MPI_INTEGER,ElemDistri(:),1,MPI_INTEGER,MPI_COMM_WORLD,iERROR) + CALL MPI_ALLGATHER(NewElems,1,MPI_INTEGER,ElemDistri(:),1,MPI_INTEGER,MPI_COMM_PICLAS,iERROR) ! calculate proc offset offsetElemMPI(0) = 0 diff --git a/src/mesh/mesh.f90 b/src/mesh/mesh.f90 index a6ea69782..6aeffd41d 100644 --- a/src/mesh/mesh.f90 +++ b/src/mesh/mesh.f90 @@ -199,7 +199,7 @@ SUBROUTINE InitMesh(meshMode,MeshFile_IN) END IF IF (.NOT.(PerformLoadBalance.AND.(.NOT.UseH5IOLoadBalance))) THEN #endif /*USE_LOADBALANCE*/ - CALL OpenDataFile(MeshFile,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_WORLD) + CALL OpenDataFile(MeshFile,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_PICLAS) CALL ReadAttribute(File_ID,'Ngeo',1,IntScalar=NGeo) CALL PrintOption('NGeo','INFO',IntOpt=NGeo) CALL CloseDataFile() @@ -719,9 +719,9 @@ SUBROUTINE GetMeshMinMaxBoundaries() xmax_loc(3) = xyzMinMax(6) ! Find global min - CALL MPI_ALLREDUCE(xmin_loc(1:3),xmin(1:3), 3, MPI_DOUBLE_PRECISION, MPI_MIN, MPI_COMM_WORLD, IERROR) + CALL MPI_ALLREDUCE(xmin_loc(1:3),xmin(1:3), 3, MPI_DOUBLE_PRECISION, MPI_MIN, MPI_COMM_PICLAS, IERROR) ! Find global max - CALL MPI_ALLREDUCE(xmax_loc(1:3),xmax(1:3), 3, MPI_DOUBLE_PRECISION, MPI_MAX, MPI_COMM_WORLD, IERROR) + CALL MPI_ALLREDUCE(xmax_loc(1:3),xmax(1:3), 3, MPI_DOUBLE_PRECISION, MPI_MAX, MPI_COMM_PICLAS, IERROR) ! Map global min/max values to xyzMinMax(1:6) xyzMinMax(1) = xmin(1) @@ -891,7 +891,7 @@ SUBROUTINE InitElemVolumes() CALL MPI_BCAST(MeshVolume,1, MPI_DOUBLE_PRECISION,0,MPI_COMM_SHARED,iERROR) #else ! In this case, no shared array is created and all arrays are processor-local -CALL MPI_ALLREDUCE(LocalVolume,MeshVolume,1,MPI_DOUBLE_PRECISION,MPI_SUM,MPI_COMM_WORLD,IERROR) +CALL MPI_ALLREDUCE(LocalVolume,MeshVolume,1,MPI_DOUBLE_PRECISION,MPI_SUM,MPI_COMM_PICLAS,IERROR) #endif /*PARTICLES*/ #else MeshVolume = LocalVolume @@ -920,7 +920,7 @@ SUBROUTINE setSideRanges() ! !----------------------------------------------------------------------------------------------------------------------------------! ! MODULES ! -USE MOD_Globals ,ONLY: abort +USE MOD_Globals ,ONLY: abort,MPI_COMM_PICLAS USE MOD_Mesh_Vars ,ONLY: firstBCSide,firstMortarInnerSide,firstInnerSide,firstMPISide_MINE,firstMPISide_YOUR USE MOD_Mesh_Vars ,ONLY: nMPISides_MINE,nMPISides_YOUR,nInnerSides,nMortarInnerSides,nBCSides USE MOD_Mesh_Vars ,ONLY: lastBCSide,lastMortarInnerSide,lastInnerSide,lastMPISide_MINE,lastMPISide_YOUR,lastMortarMPISide @@ -973,7 +973,7 @@ SUBROUTINE setSideRanges() #if USE_HDG nUniqueSides = lastMPISide_MINE + nMortarMPISides !big mortars are at the end of the side list! #if USE_MPI -CALL MPI_ALLREDUCE(nUniqueSides,nGlobalUniqueSides,1,MPI_INTEGER,MPI_SUM,MPI_COMM_WORLD,iError) +CALL MPI_ALLREDUCE(nUniqueSides,nGlobalUniqueSides,1,MPI_INTEGER,MPI_SUM,MPI_COMM_PICLAS,iError) #else nGlobalUniqueSides=nSides #endif /*USE_MPI*/ diff --git a/src/mesh/mesh_readin.f90 b/src/mesh/mesh_readin.f90 index 4ff69cd50..70b7ce553 100644 --- a/src/mesh/mesh_readin.f90 +++ b/src/mesh/mesh_readin.f90 @@ -383,7 +383,7 @@ SUBROUTINE ReadMesh(FileString,ReadNodes) #if defined(PARTICLES) && USE_LOADBALANCE IF (.NOT.PerformLoadBalance) THEN #endif /*defined(PARTICLES) && USE_LOADBALANCE*/ - CALL OpenDataFile(FileString,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_WORLD) + CALL OpenDataFile(FileString,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_PICLAS) CALL ReadBCs() #if defined(PARTICLES) && USE_LOADBALANCE END IF @@ -633,7 +633,7 @@ SUBROUTINE ReadMesh(FileString,ReadNodes) #if defined(PARTICLES) && USE_LOADBALANCE IF (.NOT.PerformLoadBalance) & #endif /*defined(PARTICLES) && USE_LOADBALANCE*/ - CALL OpenDataFile(FileString,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_WORLD) + CALL OpenDataFile(FileString,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_PICLAS) ! Backup required if useCurveds=F NGeoOld = NGeo @@ -799,7 +799,7 @@ SUBROUTINE ReadMesh(FileString,ReadNodes) #endif #if USE_MPI -CALL MPI_ALLREDUCE(MPI_IN_PLACE,ReduceData,11,MPI_INTEGER,MPI_SUM,MPI_COMM_WORLD,iError) +CALL MPI_ALLREDUCE(MPI_IN_PLACE,ReduceData,11,MPI_INTEGER,MPI_SUM,MPI_COMM_PICLAS,iError) #endif /*USE_MPI*/ nGlobalMortarSides=ReduceData(9) diff --git a/src/mesh/mesh_tools.f90 b/src/mesh/mesh_tools.f90 index 5cfda3979..612c1dc9d 100644 --- a/src/mesh/mesh_tools.f90 +++ b/src/mesh/mesh_tools.f90 @@ -547,7 +547,7 @@ END SUBROUTINE LambdaSideToMaster SUBROUTINE BuildSideToNonUniqueGlobalSide() ! MODULES #if USE_DEBUG -USE MOD_Globals ,ONLY: myrank,UNIT_StdOut,MPI_COMM_WORLD +USE MOD_Globals ,ONLY: myrank,UNIT_StdOut,MPI_COMM_PICLAS #endif /*USE_DEBUG*/ USE MOD_Globals ,ONLY: iError USE MOD_Mesh_Vars ,ONLY: MortarType,ElemInfo,SideToNonUniqueGlobalSide,nSides,nElems,ElemToSide,offsetElem,MortarInfo @@ -625,7 +625,7 @@ SUBROUTINE BuildSideToNonUniqueGlobalSide() END DO END DO ! iElem #if USE_DEBUG -IF(myrank.eq.0.AND.checkRank.GT.-1) read*; CALL MPI_BARRIER(MPI_COMM_WORLD,iError) +IF(myrank.eq.0.AND.checkRank.GT.-1) read*; CALL MPI_BARRIER(MPI_COMM_PICLAS,iError) #endif /*USE_DEBUG*/ END SUBROUTINE BuildSideToNonUniqueGlobalSide #endif /*USE_LOADBALANCE*/ diff --git a/src/mesh/metrics.f90 b/src/mesh/metrics.f90 index e9372a682..39ae37390 100644 --- a/src/mesh/metrics.f90 +++ b/src/mesh/metrics.f90 @@ -409,9 +409,9 @@ SUBROUTINE CalcMetrics(XCL_NGeo_Out,dXCL_NGeo_out) ! Communicate smallest ref. Jacobian and display #if USE_MPI IF(MPIroot)THEN - CALL MPI_REDUCE(MPI_IN_PLACE , SmallestscaledJacRef , 1 , MPI_DOUBLE_PRECISION , MPI_MIN , 0 , MPI_COMM_WORLD , iError) + CALL MPI_REDUCE(MPI_IN_PLACE , SmallestscaledJacRef , 1 , MPI_DOUBLE_PRECISION , MPI_MIN , 0 , MPI_COMM_PICLAS , iError) ELSE - CALL MPI_REDUCE(SmallestscaledJacRef , 0 , 1 , MPI_DOUBLE_PRECISION , MPI_MIN , 0 , MPI_COMM_WORLD , iError) + CALL MPI_REDUCE(SmallestscaledJacRef , 0 , 1 , MPI_DOUBLE_PRECISION , MPI_MIN , 0 , MPI_COMM_PICLAS , iError) END IF #endif /*USE_MPI*/ LBWRITE (*,'(A,ES18.10E3,A,I0,A,ES13.5E3)') " Smallest scaled Jacobian in reference system: ",SmallestscaledJacRef,& diff --git a/src/mesh/prepare_mesh.f90 b/src/mesh/prepare_mesh.f90 index a02668ab6..7209f6129 100644 --- a/src/mesh/prepare_mesh.f90 +++ b/src/mesh/prepare_mesh.f90 @@ -623,7 +623,7 @@ SUBROUTINE setLocalSideIDs() ! CAUTION: MY-MORTAR-MPI-Sides are missing IF(ALLOCATED(offsetSideMPI))DEALLOCATE(offsetSideMPI) ALLOCATE(offsetSideMPI(nProcessors)) -CALL MPI_ALLGATHER(nSides-nMPISides_YOUR,1,MPI_INTEGER,offsetSideMPI,1,MPI_INTEGER,MPI_COMM_WORLD,IERROR) +CALL MPI_ALLGATHER(nSides-nMPISides_YOUR,1,MPI_INTEGER,offsetSideMPI,1,MPI_INTEGER,MPI_COMM_PICLAS,IERROR) offsetSide=0 ! set default for restart!!! DO iProc=1, myrank offsetSide = offsetSide + offsetSideMPI(iProc) @@ -659,8 +659,8 @@ SUBROUTINE setLocalSideIDs() ALLOCATE(nNBProcs_glob(1)) ! dummy for debug ALLOCATE(ProcInfo_glob(1,1)) ! dummy for debug END IF !MPIroot -CALL MPI_GATHER(nNBProcs,1,MPI_INTEGER,nNBProcs_glob,1,MPI_INTEGER,0,MPI_COMM_WORLD,iError) -CALL MPI_GATHER(ProcInfo,9,MPI_INTEGER,ProcInfo_glob,9,MPI_INTEGER,0,MPI_COMM_WORLD,iError) +CALL MPI_GATHER(nNBProcs,1,MPI_INTEGER,nNBProcs_glob,1,MPI_INTEGER,0,MPI_COMM_PICLAS,iError) +CALL MPI_GATHER(ProcInfo,9,MPI_INTEGER,ProcInfo_glob,9,MPI_INTEGER,0,MPI_COMM_PICLAS,iError) IF(MPIroot)THEN nNBmax=MAXVAL(nNBProcs_glob) ! count, total number of columns in table ALLOCATE(NBinfo_glob(6,nNBmax,0:nProcessors)) @@ -668,7 +668,7 @@ SUBROUTINE setLocalSideIDs() ELSE ALLOCATE(NBinfo_glob(1,1,1)) ! dummy for debug END IF -CALL MPI_BCAST(nNBmax,1,MPI_INTEGER,0,MPI_COMM_WORLD,iError) +CALL MPI_BCAST(nNBmax,1,MPI_INTEGER,0,MPI_COMM_PICLAS,iError) ALLOCATE(NBinfo(6,nNbmax)) NBinfo=0 NBinfo(1,1:nNBProcs)=NBProc @@ -677,7 +677,7 @@ SUBROUTINE setLocalSideIDs() NBinfo(4,1:nNBProcs)=nMPISides_YOUR_Proc NBinfo(5,1:nNBProcs)=offsetMPISides_MINE(0:nNBProcs-1) NBinfo(6,1:nNBProcs)=offsetMPISides_YOUR(0:nNBProcs-1) -CALL MPI_GATHER(NBinfo,6*nNBmax,MPI_INTEGER,NBinfo_glob,6*nNBmax,MPI_INTEGER,0,MPI_COMM_WORLD,iError) +CALL MPI_GATHER(NBinfo,6*nNBmax,MPI_INTEGER,NBinfo_glob,6*nNBmax,MPI_INTEGER,0,MPI_COMM_PICLAS,iError) DEALLOCATE(NBinfo) IF(MPIroot)THEN OPEN(NEWUNIT=ioUnit,FILE=filename,STATUS='REPLACE') @@ -932,11 +932,11 @@ SUBROUTINE fillMeshInfo() #if USE_MPI IF(MPIroot)THEN - CALL MPI_REDUCE(MPI_IN_PLACE,nSides_flip,5,MPI_INTEGER,MPI_SUM,0,MPI_COMM_WORLD,iError) - CALL MPI_REDUCE(MPI_IN_PLACE ,nSides_MortarType,3,MPI_INTEGER,MPI_SUM,0,MPI_COMM_WORLD,iError) + CALL MPI_REDUCE(MPI_IN_PLACE,nSides_flip,5,MPI_INTEGER,MPI_SUM,0,MPI_COMM_PICLAS,iError) + CALL MPI_REDUCE(MPI_IN_PLACE ,nSides_MortarType,3,MPI_INTEGER,MPI_SUM,0,MPI_COMM_PICLAS,iError) ELSE - CALL MPI_REDUCE(nSides_flip,dummy,5,MPI_INTEGER,MPI_SUM,0,MPI_COMM_WORLD,iError) - CALL MPI_REDUCE(nSides_MortarType,nSides_MortarType,3,MPI_INTEGER,MPI_SUM,0,MPI_COMM_WORLD,iError) + CALL MPI_REDUCE(nSides_flip,dummy,5,MPI_INTEGER,MPI_SUM,0,MPI_COMM_PICLAS,iError) + CALL MPI_REDUCE(nSides_MortarType,nSides_MortarType,3,MPI_INTEGER,MPI_SUM,0,MPI_COMM_PICLAS,iError) END IF #endif /*USE_MPI*/ LBWRITE(UNIT_StdOut,'(132("."))') @@ -1192,7 +1192,7 @@ SUBROUTINE exchangeFlip() SideID_start=OffsetMPISides_MINE(iNbProc-1)+1 SideID_end =OffsetMPISides_MINE(iNbProc) CALL MPI_ISEND(Flip_MINE(SideID_start:SideID_end),nSendVal,MPI_INTEGER, & - nbProc(iNbProc),0,MPI_COMM_WORLD,SendRequest(iNbProc),iError) + nbProc(iNbProc),0,MPI_COMM_PICLAS,SendRequest(iNbProc),iError) END IF ! Start receive flip to YOUR IF(nMPISides_YOUR_Proc(iNbProc).GT.0)THEN @@ -1200,7 +1200,7 @@ SUBROUTINE exchangeFlip() SideID_start=OffsetMPISides_YOUR(iNbProc-1)+1 SideID_end =OffsetMPISides_YOUR(iNbProc) CALL MPI_IRECV(Flip_YOUR(SideID_start:SideID_end),nRecVal,MPI_INTEGER, & - nbProc(iNbProc),0,MPI_COMM_WORLD,RecRequest(iNbProc),iError) + nbProc(iNbProc),0,MPI_COMM_PICLAS,RecRequest(iNbProc),iError) END IF END DO !iProc=1,nNBProcs DO iNbProc=1,nNbProcs @@ -1287,7 +1287,7 @@ SUBROUTINE exchangeElemID() SideID_end =OffsetMPISides_send(iNbProc,2) IF(nSendVal.GT.0)THEN CALL MPI_ISEND(ElemID_MINE(SideID_start:SideID_end),nSendVal,MPI_INTEGER, & - nbProc(iNbProc),0,MPI_COMM_WORLD,SendRequest(iNbProc),iError) + nbProc(iNbProc),0,MPI_COMM_PICLAS,SendRequest(iNbProc),iError) END IF ! Start receive flip to YOUR nRecVal =nMPISides_rec(iNbProc,2) @@ -1295,7 +1295,7 @@ SUBROUTINE exchangeElemID() SideID_end =OffsetMPISides_rec(iNbProc,2) IF(nRecVal.GT.0)THEN CALL MPI_IRECV(ElemID_YOUR(SideID_start:SideID_end),nRecVal,MPI_INTEGER, & - nbProc(iNbProc),0,MPI_COMM_WORLD,RecRequest(iNbProc),iError) + nbProc(iNbProc),0,MPI_COMM_PICLAS,RecRequest(iNbProc),iError) END IF END DO !iProc=1,nNBProcs DO iNbProc=1,nNbProcs @@ -1315,7 +1315,7 @@ SUBROUTINE exchangeElemID() SideID_end =OffsetMPISides_send(iNbProc,1) IF(nSendVal.GT.0)THEN CALL MPI_ISEND(ElemID_MINE(SideID_start:SideID_end),nSendVal,MPI_INTEGER, & - nbProc(iNbProc),0,MPI_COMM_WORLD,SendRequest(iNbProc),iError) + nbProc(iNbProc),0,MPI_COMM_PICLAS,SendRequest(iNbProc),iError) END IF ! Start receive flip to YOUR nRecVal =nMPISides_rec(iNbProc,1) @@ -1323,7 +1323,7 @@ SUBROUTINE exchangeElemID() SideID_end =OffsetMPISides_rec(iNbProc,1) IF(nRecVal.GT.0)THEN CALL MPI_IRECV(ElemID_YOUR(SideID_start:SideID_end),nRecVal,MPI_INTEGER, & - nbProc(iNbProc),0,MPI_COMM_WORLD,RecRequest(iNbProc),iError) + nbProc(iNbProc),0,MPI_COMM_PICLAS,RecRequest(iNbProc),iError) END IF END DO !iProc=1,nNBProcs DO iNbProc=1,nNbProcs diff --git a/src/mpi/mpi.f90 b/src/mpi/mpi.f90 index 1266098d3..bb2eef7d3 100644 --- a/src/mpi/mpi.f90 +++ b/src/mpi/mpi.f90 @@ -194,9 +194,6 @@ SUBROUTINE InitMPIvars() RecRequest_Geo = MPI_REQUEST_NULL DataSizeSide =(PP_N+1)*(PP_N+1) -! General communicator -CALL MPI_COMM_DUP (MPI_COMM_WORLD,MPI_COMM_PICLAS,iError) - ! split communicator into smaller groups (e.g. for local nodes) GroupSize=GETINT('GroupSize','0') IF(GroupSize.LT.1)THEN ! group procs by node @@ -509,7 +506,6 @@ SUBROUTINE FinalizeMPI() ! Free the communicators IF(MPI_COMM_NODE .NE.MPI_COMM_NULL) CALL MPI_COMM_FREE(MPI_COMM_NODE ,IERROR) IF(MPI_COMM_LEADERS.NE.MPI_COMM_NULL) CALL MPI_COMM_FREE(MPI_COMM_LEADERS,IERROR) -IF(MPI_COMM_PICLAS .NE.MPI_COMM_NULL) CALL MPI_COMM_FREE(MPI_COMM_PICLAS ,IERROR) #if USE_LOADBALANCE IF (.NOT.(PerformLoadBalance.AND.(.NOT.UseH5IOLoadBalance))) THEN diff --git a/src/mpi/mpi_shared.f90 b/src/mpi/mpi_shared.f90 index 34b142f32..d818da02e 100644 --- a/src/mpi/mpi_shared.f90 +++ b/src/mpi/mpi_shared.f90 @@ -129,6 +129,9 @@ SUBROUTINE InitMPIShared() SWRITE(UNIT_StdOut,'(132("-"))') SWRITE(UNIT_stdOut,'(A)') ' INIT MPI SHARED COMMUNICATION ...' +! General communicator +CALL MPI_COMM_DUP (MPI_COMM_WORLD,MPI_COMM_PICLAS,iError) + ! Save the global number of procs nProcessors_Global = nProcessors @@ -1138,6 +1141,7 @@ SUBROUTINE FinalizeMPIShared() ! Free the shared communicator IF(MPI_COMM_SHARED .NE.MPI_COMM_NULL) CALL MPI_COMM_FREE(MPI_COMM_SHARED ,IERROR) IF(MPI_COMM_LEADERS_SHARED.NE.MPI_COMM_NULL) CALL MPI_COMM_FREE(MPI_COMM_LEADERS_SHARED,IERROR) +IF(MPI_COMM_PICLAS .NE.MPI_COMM_NULL) CALL MPI_COMM_FREE(MPI_COMM_PICLAS ,IERROR) MPISharedInitIsDone=.FALSE. END SUBROUTINE FinalizeMPIShared diff --git a/src/particles/particle_mesh/particle_mesh_tools.f90 b/src/particles/particle_mesh/particle_mesh_tools.f90 index 808e2db3e..c22a726c9 100644 --- a/src/particles/particle_mesh/particle_mesh_tools.f90 +++ b/src/particles/particle_mesh/particle_mesh_tools.f90 @@ -1050,13 +1050,13 @@ SUBROUTINE IdentifyElemAndSideType() END DO #if USE_MPI -CALL MPI_REDUCE(nPlanarRectangular ,nPlanarRectangularTot ,1,MPI_INTEGER,MPI_SUM,0,MPI_COMM_WORLD,IERROR) -CALL MPI_REDUCE(nPlanarNonRectangular,nPlanarNonRectangularTot,1,MPI_INTEGER,MPI_SUM,0,MPI_COMM_WORLD,IERROR) -CALL MPI_REDUCE(nBilinear ,nBilinearTot ,1,MPI_INTEGER,MPI_SUM,0,MPI_COMM_WORLD,IERROR) -CALL MPI_REDUCE(nPlanarCurved ,nPlanarCurvedTot ,1,MPI_INTEGER,MPI_SUM,0,MPI_COMM_WORLD,IERROR) -CALL MPI_REDUCE(nCurved ,nCurvedTot ,1,MPI_INTEGER,MPI_SUM,0,MPI_COMM_WORLD,IERROR) -CALL MPI_REDUCE(nLinearElems ,nLinearElemsTot ,1,MPI_INTEGER,MPI_SUM,0,MPI_COMM_WORLD,IERROR) -CALL MPI_REDUCE(nCurvedElems ,nCurvedElemsTot ,1,MPI_INTEGER,MPI_SUM,0,MPI_COMM_WORLD,IERROR) +CALL MPI_REDUCE(nPlanarRectangular ,nPlanarRectangularTot ,1,MPI_INTEGER,MPI_SUM,0,MPI_COMM_PICLAS,IERROR) +CALL MPI_REDUCE(nPlanarNonRectangular,nPlanarNonRectangularTot,1,MPI_INTEGER,MPI_SUM,0,MPI_COMM_PICLAS,IERROR) +CALL MPI_REDUCE(nBilinear ,nBilinearTot ,1,MPI_INTEGER,MPI_SUM,0,MPI_COMM_PICLAS,IERROR) +CALL MPI_REDUCE(nPlanarCurved ,nPlanarCurvedTot ,1,MPI_INTEGER,MPI_SUM,0,MPI_COMM_PICLAS,IERROR) +CALL MPI_REDUCE(nCurved ,nCurvedTot ,1,MPI_INTEGER,MPI_SUM,0,MPI_COMM_PICLAS,IERROR) +CALL MPI_REDUCE(nLinearElems ,nLinearElemsTot ,1,MPI_INTEGER,MPI_SUM,0,MPI_COMM_PICLAS,IERROR) +CALL MPI_REDUCE(nCurvedElems ,nCurvedElemsTot ,1,MPI_INTEGER,MPI_SUM,0,MPI_COMM_PICLAS,IERROR) #else nPlanarRectangularTot = nPlanarRectangular nPlanarNonRectangularTot = nPlanarNonRectangular @@ -1868,11 +1868,11 @@ SUBROUTINE ComputePeriodicVec() ! https://stackoverflow.com/questions/56307320/mpi-allreduce-not-synchronizing-properly !CALL MPI_ALLREDUCE(MPI_IN_PLACE,sendbuf,GEO%nPeriodicVectors,MPI_2DOUBLE_PRECISION,MPI_MINLOC,MPI_COMM_SHARED,iERROR) - CALL MPI_ALLGATHER(sendbuf,1,MPI_DOUBLE_PRECISION,recvbuf(:),1,MPI_DOUBLE_PRECISION,MPI_COMM_WORLD,iERROR) + CALL MPI_ALLGATHER(sendbuf,1,MPI_DOUBLE_PRECISION,recvbuf(:),1,MPI_DOUBLE_PRECISION,MPI_COMM_PICLAS,iERROR) IF (ALL(recvbuf(:).EQ.HUGE(1.))) CALL CollectiveStop(__STAMP__,'No periodic vector for BC_ALPHA found!',IntInfo=iVec) ! MINLOC does not follow array bounds, so root rank = 1 - CALL MPI_BCAST(GEO%PeriodicVectors(:,iVec),3,MPI_DOUBLE_PRECISION,MINLOC(recvbuf(:),1)-1,MPI_COMM_WORLD,iError) + CALL MPI_BCAST(GEO%PeriodicVectors(:,iVec),3,MPI_DOUBLE_PRECISION,MINLOC(recvbuf(:),1)-1,MPI_COMM_PICLAS,iError) END DO #endif /*USE_MPI*/ From eac02828805592fc69b67972efd4e1d752eb7a05 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Wed, 6 Sep 2023 12:05:07 +0200 Subject: [PATCH 193/495] Fixed sanity checks for PhotonEnACC values --- src/particles/boundary/particle_boundary_init.f90 | 2 +- src/radiation/ray_tracing/raytrace.f90 | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/particles/boundary/particle_boundary_init.f90 b/src/particles/boundary/particle_boundary_init.f90 index e262e1d3d..ef1703a55 100644 --- a/src/particles/boundary/particle_boundary_init.f90 +++ b/src/particles/boundary/particle_boundary_init.f90 @@ -259,7 +259,7 @@ SUBROUTINE InitializeVariablesPartBoundary() ALLOCATE(PartBound%PhotonSpecularReflection(1:nPartBound)) PartBound%PhotonSpecularReflection = .FALSE. ALLOCATE(PartBound%PhotonEnACC( 1:nPartBound)) -PartBound%PhotonEnACC = -1. +PartBound%PhotonEnACC = 0.0 ! Photon SEE ALLOCATE(PartBound%PhotonSEEYield( 1:nPartBound)) PartBound%PhotonSEEYield = 0. diff --git a/src/radiation/ray_tracing/raytrace.f90 b/src/radiation/ray_tracing/raytrace.f90 index 95f36a101..1912e679e 100644 --- a/src/radiation/ray_tracing/raytrace.f90 +++ b/src/radiation/ray_tracing/raytrace.f90 @@ -108,9 +108,13 @@ SUBROUTINE RayTracing() ! Sanity check: Not all boundaries are allowed to perfectly reflect rays. Otherwise, the simulation will never end! SumPhotonEnACC = 0. DO iPartBound = 1,nPartBound + IF(PartBound%PhotonEnACC(iPartBound).LT.0.0) CALL CollectiveStop(__STAMP__,'Part-Boundary[$]-PhotonEnACC is smaller than zero!',& + RealInfo=PartBound%PhotonEnACC(iPartBound)) + IF(PartBound%PhotonEnACC(iPartBound).GT.1.0) CALL CollectiveStop(__STAMP__,'Part-Boundary[$]-PhotonEnACC is larger than unity!',& + RealInfo=PartBound%PhotonEnACC(iPartBound)) SumPhotonEnACC = SumPhotonEnACC + PartBound%PhotonEnACC(iPartBound) END DO -IF(SumPhotonEnACC.LE.0.0) CALL abort(__STAMP__,'The sum of all Part-Boundary[$]-PhotonEnACC is zero, which is not allowed!') +IF(SumPhotonEnACC.LE.0.0) CALL CollectiveStop(__STAMP__,'The sum of all Part-Boundary[$]-PhotonEnACC is zero, which is not allowed!') GETTIME(StartT) SWRITE(UNIT_stdOut,'(A)') ' Start Ray Tracing Calculation ...' From 9d77a50101afdc3c67c8e43d14b20a41b4547919 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Wed, 6 Sep 2023 12:28:33 +0200 Subject: [PATCH 194/495] Fixes for piclas2vtk conversion when using HDG+LB --- src/mesh/mesh.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mesh/mesh.f90 b/src/mesh/mesh.f90 index 9126d3510..6bbc1799f 100644 --- a/src/mesh/mesh.f90 +++ b/src/mesh/mesh.f90 @@ -294,7 +294,7 @@ SUBROUTINE InitMesh(meshMode,MeshFile_IN) LBWRITE(UNIT_stdOut,'(A)') "NOW CALLING fillMeshInfo..." #if USE_HDG && USE_LOADBALANCE ! Call with meshMode to check whether, e.g., HDG load balance info need to be determined or not - CALL fillMeshInfo(ABS(meshMode)) + CALL fillMeshInfo(meshMode) #else CALL fillMeshInfo() #endif /*USE_HDG && USE_LOADBALANCE*/ From 499f823c960d40684ba948031a3acb12a9ff7d4c Mon Sep 17 00:00:00 2001 From: Felix Garmirian Date: Wed, 6 Sep 2023 13:55:43 +0200 Subject: [PATCH 195/495] forgot one variable part 2 --- src/mesh/mesh.f90 | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/mesh/mesh.f90 b/src/mesh/mesh.f90 index 6aeffd41d..ba982a68a 100644 --- a/src/mesh/mesh.f90 +++ b/src/mesh/mesh.f90 @@ -805,6 +805,8 @@ SUBROUTINE InitElemVolumes() USE MOD_Particle_Mesh_Vars ,ONLY: nComputeNodeElems,offsetComputeNodeElem USE MOD_MPI_Shared_Vars ,ONLY: MPI_COMM_SHARED,myComputeNodeRank,MPI_COMM_LEADERS_SHARED USE MOD_Particle_Mesh_Vars ,ONLY: ElemVolume_Shared_Win,ElemCharLength_Shared_Win +#else +USE MOD_Globals ,ONLY: MPI_COMM_PICLAS #endif /*PARTICLES*/ #endif /*USE_MPI*/ #if USE_LOADBALANCE @@ -920,7 +922,7 @@ SUBROUTINE setSideRanges() ! !----------------------------------------------------------------------------------------------------------------------------------! ! MODULES ! -USE MOD_Globals ,ONLY: abort,MPI_COMM_PICLAS +USE MOD_Globals ,ONLY: abort USE MOD_Mesh_Vars ,ONLY: firstBCSide,firstMortarInnerSide,firstInnerSide,firstMPISide_MINE,firstMPISide_YOUR USE MOD_Mesh_Vars ,ONLY: nMPISides_MINE,nMPISides_YOUR,nInnerSides,nMortarInnerSides,nBCSides USE MOD_Mesh_Vars ,ONLY: lastBCSide,lastMortarInnerSide,lastInnerSide,lastMPISide_MINE,lastMPISide_YOUR,lastMortarMPISide @@ -929,8 +931,7 @@ SUBROUTINE setSideRanges() USE MOD_Globals ,ONLY: UNIT_StdOut USE MOD_Mesh_Vars ,ONLY: nGlobalUniqueSidesFromMesh,nGlobalUniqueSides,nMortarMPISides,nUniqueSides #if USE_MPI -USE MOD_Globals ,ONLY: myrank -USE MOD_Globals ,ONLY: iError +USE MOD_Globals ,ONLY: myrank,MPI_COMM_PICLAS,iError USE mpi #endif /*USE_MPI*/ #endif /*USE_HDG*/ From 7442b6573090c7cb9ae89a67deddfe9256063a56 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Wed, 6 Sep 2023 15:45:42 +0200 Subject: [PATCH 196/495] Adjusted ray tracing reggie --- .../surface_emission_rectangle_ray_trace/parameter.ini | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/parameter.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/parameter.ini index 68d1bb2de..b4ca18b11 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/parameter.ini +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/parameter.ini @@ -111,7 +111,8 @@ Part-FactorFIBGM = (/ 5 , 5 , 5 /) ! =============================================================================== ! ! Ray Tracing ! =============================================================================== ! -Particles-DSMC-CalcSurfaceVal = T ! activate InitParticleBoundarySampling +UseRayTracing = T +!Particles-DSMC-CalcSurfaceVal = T ! activate InitParticleBoundarySampling RayTracing-PartBound = 6 ! -> iBC=6 RayTracing-NumRays = 200000 RayTracing-VolRefineMode = 0 ! 0: do nothing (default) @@ -130,6 +131,7 @@ RayTracing-RayDirection = (/ 0. , 0.5 , -1.0 /) ! SEE parameters RayTracing-WorkFunctionSEE = 10.0 RayTracing-YieldSEE = 0.1 +Part-Boundary$-PhotonEnACC = 1.0 ! =============================================================================== ! ! Weighting Factor ! =============================================================================== ! From 60c88bc1529d0dea8656f3c71ff9d8c29a50d825 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Wed, 6 Sep 2023 21:20:06 +0200 Subject: [PATCH 197/495] WIP: Moved photon surface sampling containers to separate routine as RayTracing-nSurfSample is now a separate variable --- .../externals.ini | 11 +- .../parameter.ini | 10 +- .../externals.ini | 10 +- .../parameter.ini | 4 +- .../pre-piclas/parameter.ini | 2 +- .../boundary/particle_boundary_sampling.f90 | 15 +- .../boundary/particle_boundary_vars.f90 | 4 - .../radiative_transfer/radtrans_init.f90 | 4 + .../tracking/radtrans_tracking.f90 | 217 +++++++++++++++++- .../tracking/radtrans_tracking_output.f90 | 9 +- .../tracking/radtrans_tracking_tools.f90 | 8 +- .../tracking/radtrans_tracking_vars.f90 | 10 + src/radiation/ray_tracing/raytrace.f90 | 5 + src/radiation/ray_tracing/raytrace_ini.f90 | 7 +- 14 files changed, 272 insertions(+), 44 deletions(-) diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/externals.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/externals.ini index de70d12fd..89b10c5ef 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/externals.ini +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/externals.ini @@ -1,5 +1,8 @@ ! --- Externals Tool Reggie -MPI = 1 -externalbinary = ./hopr/build/bin/hopr -externaldirectory = pre-hopr -externalruntime = pre +MPI = 1 , 1 , 1 , 1 +externalbinary = ./hopr/build/bin/hopr , ./bin/piclas2vtk , ./bin/piclas2vtk , ./bin/piclas2vtk +externaldirectory = pre-hopr , ./parameter.ini , ./parameter.ini , ./parameter.ini +externalruntime = pre , post , post , post +cmd_suffix = , photoionization_RadiationVolState.h5 , photoionization_RadiationSurfState.h5 , photoionization_PartStateBoundary_000.00000000500000000.h5 + +nocrosscombination:MPI,externalbinary,externaldirectory,externalruntime,cmd_suffix diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/parameter.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/parameter.ini index b4ca18b11..740e09ed9 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/parameter.ini +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/parameter.ini @@ -114,13 +114,19 @@ Part-FactorFIBGM = (/ 5 , 5 , 5 /) UseRayTracing = T !Particles-DSMC-CalcSurfaceVal = T ! activate InitParticleBoundarySampling RayTracing-PartBound = 6 ! -> iBC=6 -RayTracing-NumRays = 200000 +RayTracing-NumRays = 20000 RayTracing-VolRefineMode = 0 ! 0: do nothing (default) ! ! 1: refine below user-defined z-coordinate with NMax ! ! 2: scale N according to the mesh element volume between NMin>=1 and NMax>=2 ! ! 3: refine below user-defined z-coordinate and scale N according to the mesh element volume between NMin>=1 and NMax>=2 ! ! (consider only elements below the user-defined z-coordinate for the scaling) -PhotonModeBPO = 1 +PhotonModeBPO = 1 ! [INT] Output mode to store position, direction, host element etc. of +! ! rays/photons in PartStateBoundary.h5 (only radiation transport or ray tracing +! ! solver): +! ! '0: Output nothing to PartStateBoundary.h5 +! ! '1: Output the initial position of the rays and their direction vector +! ! '2: Output initial position and all calculated intersection points calculated in +! ! radtrans tracking RayTracing-PulseDuration = 15e-9 RayTracing-WaveLength = 10e-9 diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/externals.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/externals.ini index 84cc50efb..49066b4cf 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/externals.ini +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/externals.ini @@ -1,8 +1,8 @@ ! --- Externals Tool Reggie -MPI = 1 , 6 -externalbinary = ./hopr/build/bin/hopr , bin/piclas -externaldirectory = pre-hopr , pre-piclas -externalruntime = pre , pre -cmd_suffix = , ../DSMC.ini +MPI = 1 , 6 , 1 , 1 , 1 +externalbinary = ./hopr/build/bin/hopr, bin/piclas , ./bin/piclas2vtk , ./bin/piclas2vtk , ./bin/piclas2vtk +externaldirectory = pre-hopr , pre-piclas , ./parameter.ini , ./parameter.ini , ./parameter.ini +externalruntime = pre , pre , post , post , post +cmd_suffix = , ../DSMC.ini , photoionization_RadiationVolState.h5 , photoionization_RadiationSurfState.h5 , photoionization_PartStateBoundary_000.00000000500000000.h5 nocrosscombination:MPI,externalbinary,externaldirectory,externalruntime,cmd_suffix diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini index ec6664ada..c17b9ab6c 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini @@ -1,7 +1,7 @@ NVisu = 1 N = 1 RayTracing-NMax = 2 -DSMC-nSurfSample= 2,5 +RayTracing-nSurfSample= 2,5 !NodeTypeVisu = GAUSS NodeTypeVisu = VISU RayTracing-NumRays = 10000, 20000 @@ -109,7 +109,7 @@ Part-Boundary5-PhotonSEE-ElectronSpecies= 3 ! Change MPF of SEE particles Part-vMPF = T -Part-Boundary5-PhotonSEE-MacroParticleFactor = 1E7,1E8 +Part-Boundary5-PhotonSEE-MacroParticleFactor = 1E8,1E9 Part-Boundary6-SourceName = BC_TOP Part-Boundary6-Condition = reflective diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/pre-piclas/parameter.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/pre-piclas/parameter.ini index 46bc9a8e5..b6df1f4dd 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/pre-piclas/parameter.ini +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/pre-piclas/parameter.ini @@ -1,7 +1,7 @@ NVisu = 1 N = 1 RayTracing-NMax = 2 -DSMC-nSurfSample= 1 +RayTracing-nSurfSample= 1 !NodeTypeVisu = GAUSS NodeTypeVisu = VISU RayTracing-NumRays = 10000 diff --git a/src/particles/boundary/particle_boundary_sampling.f90 b/src/particles/boundary/particle_boundary_sampling.f90 index b09670fe6..e205d7604 100644 --- a/src/particles/boundary/particle_boundary_sampling.f90 +++ b/src/particles/boundary/particle_boundary_sampling.f90 @@ -84,7 +84,7 @@ SUBROUTINE InitParticleBoundarySampling() USE MOD_Particle_Boundary_Vars ,ONLY: GlobalSide2SurfSide,SurfSide2GlobalSide USE MOD_SurfaceModel_Vars ,ONLY: nPorousBC USE MOD_Particle_Boundary_Vars ,ONLY: CalcSurfaceImpact -USE MOD_Particle_Boundary_Vars ,ONLY: SurfSideArea,SurfSideSamplingMidPoints,SurfSampSize,SurfOutputSize,SurfSpecOutputSize +USE MOD_Particle_Boundary_Vars ,ONLY: SurfSideArea,SurfSampSize,SurfOutputSize,SurfSpecOutputSize USE MOD_Particle_Boundary_Vars ,ONLY: SampWallState, SWIVarTimeStep, SWIStickingCoefficient USE MOD_Particle_Boundary_Vars ,ONLY: SampWallPumpCapacity USE MOD_Particle_Boundary_Vars ,ONLY: SampWallImpactEnergy @@ -113,7 +113,6 @@ SUBROUTINE InitParticleBoundarySampling() USE MOD_Particle_Boundary_Vars ,ONLY: GlobalSide2SurfSide_Shared,GlobalSide2SurfSide_Shared_Win USE MOD_Particle_Boundary_Vars ,ONLY: SurfSide2GlobalSide_Shared,SurfSide2GlobalSide_Shared_Win USE MOD_Particle_Boundary_Vars ,ONLY: SurfSideArea_Shared,SurfSideArea_Shared_Win -USE MOD_Particle_Boundary_Vars ,ONLY: SurfSideSamplingMidPoints_Shared,SurfSideSamplingMidPoints_Shared_Win USE MOD_Particle_Boundary_Vars ,ONLY: SampWallState_Shared,SampWallState_Shared_Win USE MOD_Particle_Boundary_Vars ,ONLY: SampWallPumpCapacity_Shared,SampWallPumpCapacity_Shared_Win USE MOD_Particle_Boundary_Vars ,ONLY: SampWallImpactEnergy_Shared,SampWallImpactEnergy_Shared_Win @@ -571,16 +570,12 @@ SUBROUTINE InitParticleBoundarySampling() #if USE_MPI CALL Allocate_Shared((/nSurfSample,nSurfSample,nComputeNodeSurfTotalSides/),SurfSideArea_Shared_Win,SurfSideArea_Shared) CALL MPI_WIN_LOCK_ALL(0,SurfSideArea_Shared_Win,IERROR) -CALL Allocate_Shared((/3,nSurfSample,nSurfSample,nComputeNodeSurfTotalSides/),SurfSideSamplingMidPoints_Shared_Win,SurfSideSamplingMidPoints_Shared) -CALL MPI_WIN_LOCK_ALL(0,SurfSideSamplingMidPoints_Shared_Win,IERROR) SurfSideArea => SurfSideArea_Shared -SurfSideSamplingMidPoints => SurfSideSamplingMidPoints_Shared firstSide = INT(REAL( myComputeNodeRank )*REAL(nComputeNodeSurfTotalSides)/REAL(nComputeNodeProcessors))+1 lastSide = INT(REAL((myComputeNodeRank+1))*REAL(nComputeNodeSurfTotalSides)/REAL(nComputeNodeProcessors)) #else ALLOCATE(SurfSideArea(1:nSurfSample,1:nSurfSample,1:nComputeNodeSurfTotalSides)) -ALLOCATE(SurfSideSamplingMidPoints(1:3,1:nSurfSample,1:nSurfSample,1:nComputeNodeSurfTotalSides)) firstSide = 1 lastSide = nSurfTotalSides @@ -590,7 +585,6 @@ SUBROUTINE InitParticleBoundarySampling() IF (myComputeNodeRank.EQ.0) THEN #endif /*USE_MPI*/ SurfSideArea=0. - SurfSideSamplingMidPoints=0. #if USE_MPI END IF CALL BARRIER_AND_SYNC(SurfSideArea_Shared_Win,MPI_COMM_SHARED) @@ -663,10 +657,6 @@ SUBROUTINE InitParticleBoundarySampling() area=0. tmpI2=(XiEQ_SurfSample(iSample-1)+XiEQ_SurfSample(iSample))/2. ! (a+b)/2 tmpJ2=(XiEQ_SurfSample(jSample-1)+XiEQ_SurfSample(jSample))/2. ! (a+b)/2 - ASSOCIATE( xi => 0.5*(xIP_VISU(iSample)+xIP_VISU(iSample-1)), eta => 0.5*(xIP_VISU(jSample)+xIP_VISU(jSample-1)) ) - CALL EvaluateBezierPolynomialAndGradient((/xi,eta/),NGeo,3,BezierControlPoints3D(1:3,0:NGeo,0:NGeo,SideID) & - ,Point=SurfSideSamplingMidPoints(1:3,iSample,jSample,iSide)) - END ASSOCIATE DO q=0,NGeo DO p=0,NGeo XiOut(1)=tmp1*Xi_NGeo(p)+tmpI2 @@ -1238,7 +1228,6 @@ SUBROUTINE FinalizeParticleBoundarySampling() CALL UNLOCK_AND_FREE(SampWallState_Shared_Win) CALL UNLOCK_AND_FREE(SurfSideArea_Shared_Win) -CALL UNLOCK_AND_FREE(SurfSideSamplingMidPoints_Shared_Win) IF(nPorousBC.GT.0) CALL UNLOCK_AND_FREE(SampWallPumpCapacity_Shared_Win) IF (CalcSurfaceImpact) THEN CALL UNLOCK_AND_FREE(SampWallImpactEnergy_Shared_Win) @@ -1263,7 +1252,6 @@ SUBROUTINE FinalizeParticleBoundarySampling() ADEALLOCATE(SampWallImpactAngle_Shared) ADEALLOCATE(SampWallImpactNumber_Shared) ADEALLOCATE(SurfSideArea_Shared) -ADEALLOCATE(SurfSideSamplingMidPoints_Shared) #endif /*USE_MPI*/ ! Then, free the pointers or arrays @@ -1276,7 +1264,6 @@ SUBROUTINE FinalizeParticleBoundarySampling() SDEALLOCATE(SampWallImpactAngle) SDEALLOCATE(SampWallImpactNumber) ADEALLOCATE(SurfSideArea) -ADEALLOCATE(SurfSideSamplingMidPoints) ADEALLOCATE(GlobalSide2SurfSide) ADEALLOCATE(SurfSide2GlobalSide) SDEALLOCATE(MacroSurfaceVal) diff --git a/src/particles/boundary/particle_boundary_vars.f90 b/src/particles/boundary/particle_boundary_vars.f90 index 645f431ed..1e9060ed3 100644 --- a/src/particles/boundary/particle_boundary_vars.f90 +++ b/src/particles/boundary/particle_boundary_vars.f90 @@ -29,7 +29,6 @@ MODULE MOD_Particle_Boundary_Vars INTEGER :: SurfOutputSize !> Energy + Force + nSpecies INTEGER :: SurfSpecOutputSize !> Energy + Force + nSpecies REAL,ALLOCPOINT,DIMENSION(:,:,:) :: SurfSideArea !> Area of supersampled surface side -REAL,ALLOCPOINT,DIMENSION(:,:,:,:) :: SurfSideSamplingMidPoints !> Mid point of supersampled surface side REAL,ALLOCPOINT,DIMENSION(:,:,:) :: BoundaryWallTemp !> Wall Temperature for Adaptive Case ! ==================================================================== ! Mesh info @@ -84,9 +83,6 @@ MODULE MOD_Particle_Boundary_Vars REAL,POINTER,DIMENSION(:,:,:) :: SurfSideArea_Shared !> Area of supersampled surface side INTEGER :: SurfSideArea_Shared_Win -REAL,POINTER,DIMENSION(:,:,:,:) :: SurfSideSamplingMidPoints_Shared !> Physical coordinate of the center of supersampled surface side -INTEGER :: SurfSideSamplingMidPoints_Shared_Win - INTEGER,ALLOCATABLE,DIMENSION(:,:) :: GlobalSide2SurfHaloSide ! Mapping Global Side ID to Surf Halo Side ID (exists only on leader procs) !> 1st dim: leader rank !> 2nd dim: Surf SideID diff --git a/src/radiation/radiative_transfer/radtrans_init.f90 b/src/radiation/radiative_transfer/radtrans_init.f90 index 27c020b2b..c6f59459c 100644 --- a/src/radiation/radiative_transfer/radtrans_init.f90 +++ b/src/radiation/radiative_transfer/radtrans_init.f90 @@ -94,6 +94,7 @@ SUBROUTINE InitRadiationTransport() USE MOD_Radiation_Vars, ONLY : Radiation_Emission_Spec_Shared_Win, Radiation_Emission_Spec_Shared, MacroRadInputParameters #endif USE MOD_RayTracing_Vars ,ONLY: Ray +USE MOD_Photon_Tracking ,ONLY: InitPhotonSurfSample ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -125,6 +126,9 @@ SUBROUTINE InitRadiationTransport() RadObservationPoint%ShockTubeDiameter = GETREAL('Radiation-ShockTubeDiameter') Ray%nSurfSample = GETINT('Radiation-nSurfSample',nSurfSample) +! Build surface containers +CALL InitPhotonSurfSample() + IF (RadObservationPointMethod.GT.0) THEN RadObservationPoint%AngularAperture = GETREAL('Radiation-ObservationAngularAperture') RadObservationPoint%Diameter = GETREAL('Radiation-ObservationDiameter') diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 index 8b04a65eb..ba712391f 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 @@ -25,13 +25,228 @@ MODULE MOD_Photon_Tracking MODULE PROCEDURE PhotonTriaTracking END INTERFACE -PUBLIC::PhotonTriaTracking, Photon2DSymTracking +PUBLIC :: PhotonTriaTracking, Photon2DSymTracking +PUBLIC :: InitPhotonSurfSample !----------------------------------------------------------------------------------------------------------------------------------- !----------------------------------------------------------------------------------------------------------------------------------- !=================================================================================================================================== CONTAINS + +!=================================================================================================================================== +!> Allocate photon surface sampling containers +!=================================================================================================================================== +SUBROUTINE InitPhotonSurfSample() +! MODULES +USE MOD_Globals +USE MOD_Photon_TrackingVars ,ONLY: PhotonSurfSideArea,PhotonSurfSideSamplingMidPoints +USE MOD_Particle_Boundary_Vars ,ONLY: nComputeNodeSurfTotalSides +USE MOD_Particle_Boundary_Vars ,ONLY: SurfSide2GlobalSide +#if USE_MPI +USE MOD_MPI_Shared +USE MOD_MPI_Shared_Vars ,ONLY: MPI_COMM_SHARED +USE MOD_MPI_Shared_Vars ,ONLY: myComputeNodeRank,nComputeNodeProcessors +USE MOD_Photon_TrackingVars ,ONLY: PhotonSurfSideSamplingMidPoints_Shared,PhotonSurfSideSamplingMidPoints_Shared_Win +USE MOD_Photon_TrackingVars ,ONLY: PhotonSurfSideArea_Shared,PhotonSurfSideArea_Shared_Win +#endif /*USE_MPI*/ +USE MOD_Particle_Vars ,ONLY: Symmetry +USE MOD_Basis ,ONLY: LegendreGaussNodesAndWeights +USE MOD_DSMC_Symmetry ,ONLY: DSMC_2D_CalcSymmetryArea, DSMC_1D_CalcSymmetryArea +USE MOD_Mesh_Vars ,ONLY: NGeo +USE MOD_Mesh_Tools ,ONLY: GetCNElemID +USE MOD_Particle_Mesh_Vars ,ONLY: SideInfo_Shared,NodeCoords_Shared +USE MOD_Particle_Mesh_Vars ,ONLY: ElemSideNodeID_Shared +USE MOD_Particle_Tracking_Vars ,ONLY: TrackingMethod +USE MOD_Particle_Surfaces_Vars ,ONLY: BezierControlPoints3D +USE MOD_Particle_Surfaces ,ONLY: EvaluateBezierPolynomialAndGradient +USE MOD_RayTracing_Vars ,ONLY: Ray +USE MOD_Interpolation ,ONLY: GetNodesAndWeights +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------! +! INPUT / OUTPUT VARIABLES +! Space-separated list of input and output types. Use: (int|real|logical|...)_(in|out|inout)_dim(n) +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +INTEGER :: iSide,firstSide,lastSide +! surface area +INTEGER :: SideID,ElemID,CNElemID,LocSideID +INTEGER :: p,q,iSample,jSample +INTEGER :: TriNum, Node1, Node2 +REAL :: area,nVal +REAL,DIMENSION(2,3) :: gradXiEta3D +REAL,DIMENSION(:),ALLOCATABLE :: Xi_NGeo,wGP_NGeo +REAL :: XiOut(1:2),E,F,G,D,tmp1,tmpI2,tmpJ2 +REAL :: xNod(3), Vector1(3), Vector2(3), nx, ny, nz +LOGICAL :: UseBezierControlPointsForArea +REAL,ALLOCATABLE :: xIP_VISU(:),wIP_VISU(:) +REAL,ALLOCATABLE :: RayXiEQ_SurfSample(:) ! position of RayXiEQ_SurfSample +REAL :: dRayXiEQ_SurfSample ! deltaXi in [-1,1] +!=================================================================================================================================== + +#if USE_MPI +CALL Allocate_Shared((/Ray%nSurfSample,Ray%nSurfSample,nComputeNodeSurfTotalSides/),PhotonSurfSideArea_Shared_Win,PhotonSurfSideArea_Shared) +CALL MPI_WIN_LOCK_ALL(0,PhotonSurfSideArea_Shared_Win,IERROR) +CALL Allocate_Shared((/3,Ray%nSurfSample,Ray%nSurfSample,nComputeNodeSurfTotalSides/),PhotonSurfSideSamplingMidPoints_Shared_Win,PhotonSurfSideSamplingMidPoints_Shared) +CALL MPI_WIN_LOCK_ALL(0,PhotonSurfSideSamplingMidPoints_Shared_Win,IERROR) +PhotonSurfSideArea => PhotonSurfSideArea_Shared +PhotonSurfSideSamplingMidPoints => PhotonSurfSideSamplingMidPoints_Shared + +firstSide = INT(REAL( myComputeNodeRank )*REAL(nComputeNodeSurfTotalSides)/REAL(nComputeNodeProcessors))+1 +lastSide = INT(REAL((myComputeNodeRank+1))*REAL(nComputeNodeSurfTotalSides)/REAL(nComputeNodeProcessors)) +#else +ALLOCATE(PhotonSurfSideArea(1:Ray%nSurfSample,1:Ray%nSurfSample,1:nComputeNodeSurfTotalSides)) +ALLOCATE(PhotonSurfSideSamplingMidPoints(1:3,1:Ray%nSurfSample,1:Ray%nSurfSample,1:nComputeNodeSurfTotalSides)) + +firstSide = 1 +lastSide = nSurfTotalSides +#endif /*USE_MPI*/ + +#if USE_MPI +IF (myComputeNodeRank.EQ.0) THEN +#endif /*USE_MPI*/ + PhotonSurfSideArea=0. + PhotonSurfSideSamplingMidPoints=0. +#if USE_MPI +END IF +CALL BARRIER_AND_SYNC(PhotonSurfSideArea_Shared_Win,MPI_COMM_SHARED) +CALL BARRIER_AND_SYNC(PhotonSurfSideSamplingMidPoints_Shared_Win,MPI_COMM_SHARED) +#endif /*USE_MPI*/ + +! Calculate equidistant surface points +ALLOCATE(RayXiEQ_SurfSample(0:Ray%nSurfSample)) +dRayXiEQ_SurfSample =2./REAL(Ray%nSurfSample) +DO q=0,Ray%nSurfSample + RayXiEQ_SurfSample(q) = dRayXiEQ_SurfSample * REAL(q) - 1. +END DO + +! get interpolation points and weights +ALLOCATE( Xi_NGeo( 0:NGeo) & + , wGP_NGeo(0:NGeo) ) +CALL LegendreGaussNodesAndWeights(NGeo,Xi_NGeo,wGP_NGeo) + +! compute area of sub-faces +tmp1=dRayXiEQ_SurfSample/2.0 !(b-a)/2 + +ALLOCATE(xIP_VISU(0:Ray%nSurfSample),wIP_VISU(0:Ray%nSurfSample)) +CALL GetNodesAndWeights(Ray%nSurfSample, Ray%NodeType, xIP_VISU, wIP=wIP_VISU) + +DO iSide = firstSide,LastSide + ! get global SideID. This contains only nonUniqueSide, no special mortar treatment required + SideID = SurfSide2GlobalSide(SURF_SIDEID,iSide) + + UseBezierControlPointsForArea = .FALSE. + + IF (TrackingMethod.EQ.TRIATRACKING) THEN + ElemID = SideInfo_Shared(SIDE_ELEMID ,SideID) + CNElemID = GetCNElemID(ElemID) + LocSideID = SideInfo_Shared(SIDE_LOCALID,SideID) + IF((Symmetry%Order.NE.3).AND.Ray%nSurfSample.GT.1) CALL abort(__STAMP__,'Ray%nSurfSample>1 not implemented for this symmetry!') + + IF(Symmetry%Order.EQ.3) THEN + ! Check if triangles are used for the calculation of the surface area or not + IF(Ray%nSurfSample.GT.1)THEN + ! Do not use triangles + UseBezierControlPointsForArea = .TRUE. + ELSE + xNod(1:3) = NodeCoords_Shared(1:3,ElemSideNodeID_Shared(1,LocSideID,CNElemID)+1) + area = 0. + DO TriNum = 1,2 + Node1 = TriNum+1 ! normal = cross product of 1-2 and 1-3 for first triangle + Node2 = TriNum+2 ! and 1-3 and 1-4 for second triangle + Vector1(1:3) = NodeCoords_Shared(1:3,ElemSideNodeID_Shared(Node1,LocSideID,CNElemID)+1) - xNod(1:3) + Vector2(1:3) = NodeCoords_Shared(1:3,ElemSideNodeID_Shared(Node2,LocSideID,CNElemID)+1) - xNod(1:3) + nx = - Vector1(2) * Vector2(3) + Vector1(3) * Vector2(2) !NV (inwards) + ny = - Vector1(3) * Vector2(1) + Vector1(1) * Vector2(3) + nz = - Vector1(1) * Vector2(2) + Vector1(2) * Vector2(1) + nVal = SQRT(nx*nx + ny*ny + nz*nz) + area = area + nVal/2. + END DO + PhotonSurfSideArea(1,1,iSide) = area + END IF ! Ray%nSurfSample.GT.1 + ELSE IF(Symmetry%Order.EQ.2) THEN + PhotonSurfSideArea(1,1,iSide) = DSMC_2D_CalcSymmetryArea(LocSideID, CNElemID) + ELSE IF(Symmetry%Order.EQ.1) THEN + PhotonSurfSideArea(1,1,iSide) = DSMC_1D_CalcSymmetryArea(LocSideID, CNElemID) + END IF + ELSE ! TrackingMethod.NE.TRIATRACKING + UseBezierControlPointsForArea = .TRUE. + END IF ! TrackingMethod.EQ.TRIATRACKIN + + ! Instead of triangles use Bezier control points (curved or triangle tracking with Ray%nSurfSample>1) + IF(UseBezierControlPointsForArea)THEN + DO jSample=1,Ray%nSurfSample + DO iSample=1,Ray%nSurfSample + area=0. + tmpI2=(RayXiEQ_SurfSample(iSample-1)+RayXiEQ_SurfSample(iSample))/2. ! (a+b)/2 + tmpJ2=(RayXiEQ_SurfSample(jSample-1)+RayXiEQ_SurfSample(jSample))/2. ! (a+b)/2 + ASSOCIATE( xi => 0.5*(xIP_VISU(iSample)+xIP_VISU(iSample-1)), eta => 0.5*(xIP_VISU(jSample)+xIP_VISU(jSample-1)) ) + CALL EvaluateBezierPolynomialAndGradient((/xi,eta/),NGeo,3,BezierControlPoints3D(1:3,0:NGeo,0:NGeo,SideID) & + ,Point=PhotonSurfSideSamplingMidPoints(1:3,iSample,jSample,iSide)) + END ASSOCIATE + DO q=0,NGeo + DO p=0,NGeo + XiOut(1)=tmp1*Xi_NGeo(p)+tmpI2 + XiOut(2)=tmp1*Xi_NGeo(q)+tmpJ2 + CALL EvaluateBezierPolynomialAndGradient(XiOut,NGeo,3,BezierControlPoints3D(1:3,0:NGeo,0:NGeo,SideID) & + ,Gradient=gradXiEta3D) + ! calculate first fundamental form + E=DOT_PRODUCT(gradXiEta3D(1,1:3),gradXiEta3D(1,1:3)) + F=DOT_PRODUCT(gradXiEta3D(1,1:3),gradXiEta3D(2,1:3)) + G=DOT_PRODUCT(gradXiEta3D(2,1:3),gradXiEta3D(2,1:3)) + D=SQRT(E*G-F*F) + area = area+tmp1*tmp1*D*wGP_NGeo(p)*wGP_NGeo(q) + END DO + END DO + PhotonSurfSideArea(iSample,jSample,iSide) = area + END DO ! iSample=1,Ray%nSurfSample + END DO ! jSample=1,Ray%nSurfSample + END IF ! UseBezierControlPointsForArea + +END DO ! iSide = firstSide,lastSide + +#if USE_MPI +CALL BARRIER_AND_SYNC(PhotonSurfSideArea_Shared_Win,MPI_COMM_SHARED) +CALL BARRIER_AND_SYNC(PhotonSurfSideSamplingMidPoints_Shared_Win,MPI_COMM_SHARED) +#endif /*USE_MPI*/ + +END SUBROUTINE InitPhotonSurfSample + + +!=================================================================================================================================== +!> Deallocate photon surface sampling containers +!=================================================================================================================================== +SUBROUTINE FinalizePhotonSurfSample() +! MODULES +USE MOD_Globals +USE MOD_Photon_TrackingVars ,ONLY: PhotonSurfSideArea,PhotonSurfSideSamplingMidPoints +#if USE_MPI +USE MOD_MPI_Shared_Vars ,ONLY: MPI_COMM_SHARED +USE MOD_Photon_TrackingVars ,ONLY: PhotonSurfSideSamplingMidPoints_Shared,PhotonSurfSideSamplingMidPoints_Shared_Win +USE MOD_Photon_TrackingVars ,ONLY: PhotonSurfSideArea_Shared,PhotonSurfSideArea_Shared_Win +USE MOD_MPI_Shared +#endif /*USE_MPI*/ +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------! +! INPUT / OUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +!=================================================================================================================================== +#if USE_MPI +CALL UNLOCK_AND_FREE(PhotonSurfSideSamplingMidPoints_Shared_Win) +CALL UNLOCK_AND_FREE(PhotonSurfSideArea_Shared_Win) +ADEALLOCATE(PhotonSurfSideSamplingMidPoints_Shared) +ADEALLOCATE(PhotonSurfSideArea_Shared) +CALL MPI_BARRIER(MPI_COMM_SHARED,iERROR) +#endif /*USE_MPI*/ + +ADEALLOCATE(PhotonSurfSideSamplingMidPoints) +ADEALLOCATE(PhotonSurfSideArea) +END SUBROUTINE FinalizePhotonSurfSample + + + + SUBROUTINE PhotonTriaTracking() !=================================================================================================================================== ! Routine for tracking of moving particles and boundary interaction using triangulated sides. diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 index cf1c29db0..4db924944 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 @@ -283,9 +283,10 @@ SUBROUTINE WritePhotonSurfSampleToHDF5() USE MOD_MPI_Shared_Vars ,ONLY: mySurfRank #if USE_MPI USE MOD_MPI_Shared_Vars ,ONLY: MPI_COMM_LEADERS_SURF -USE MOD_Particle_Boundary_Vars ,ONLY: SurfSideArea_Shared,nSurfTotalSides +USE MOD_Particle_Boundary_Vars ,ONLY: nSurfTotalSides +USE MOD_Photon_TrackingVars ,ONLY: PhotonSurfSideArea_Shared #else -USE MOD_Particle_Boundary_Vars ,ONLY: SurfSideArea +USE MOD_Photon_TrackingVars ,ONLY: PhotonSurfSideArea #endif /*USE_MPI*/ USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall USE MOD_Particle_Boundary_Vars ,ONLY: PartBound @@ -359,7 +360,7 @@ SUBROUTINE WritePhotonSurfSampleToHDF5() WRITE(H5_Name,'(A)') 'SurfaceData' WRITE(H5_Name2,'(A)') 'SurfaceDataGlobalSideIndex' #if USE_MPI -ASSOCIATE(SurfSideArea => SurfSideArea_Shared) +ASSOCIATE(PhotonSurfSideArea => PhotonSurfSideArea_Shared) #endif ASSOCIATE (& @@ -389,7 +390,7 @@ SUBROUTINE WritePhotonSurfSampleToHDF5() ! SurfaceArea should be changed to 1:SurfMesh%nSides if inner sampling sides exist... DO p = 1, nSurfSample DO q = 1, nSurfSample - helpArray(2,p,q,OutputCounter) = PhotonSampWall(2,p,q,iSurfSide)/SurfSideArea(p,q,iSurfSide) + helpArray(2,p,q,OutputCounter) = PhotonSampWall(2,p,q,iSurfSide)/PhotonSurfSideArea(p,q,iSurfSide) helpArray(3,p,q,OutputCounter) = PartBound%MapToPartBC(SideInfo_Shared(SIDE_BCID,GlobalSideID)) END DO ! q = 1, nSurfSample END DO ! p = 1, nSurfSample diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 index 9515fa6bc..761975df5 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 @@ -1342,8 +1342,8 @@ END SUBROUTINE PeriodicPhotonBC !=================================================================================================================================== SUBROUTINE CalcWallAbsoprtion(IntersectionPos, GlobSideID, DONE, ForceWallSample) USE MOD_Globals ,ONLY: VECNORM -USE MOD_Photon_TrackingVars ,ONLY: PhotonProps -USE MOD_Particle_Boundary_Vars ,ONLY: PartBound, GlobalSide2SurfSide, nSurfSample, SurfSideSamplingMidPoints +USE MOD_Photon_TrackingVars ,ONLY: PhotonProps,PhotonSurfSideSamplingMidPoints +USE MOD_Particle_Boundary_Vars ,ONLY: PartBound, GlobalSide2SurfSide, nSurfSample USE MOD_Particle_Mesh_Vars ,ONLY: SideInfo_Shared #if USE_MPI USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWallProc @@ -1377,7 +1377,7 @@ SUBROUTINE CalcWallAbsoprtion(IntersectionPos, GlobSideID, DONE, ForceWallSample distanceMin = HUGE(1.) DO pp = 1, nSurfSample DO qq = 1, nSurfSample - distance = VECNORM(IntersectionPos(1:3) - SurfSideSamplingMidPoints(1:3,pp,qq,SurfSideID)) + distance = VECNORM(IntersectionPos(1:3) - PhotonSurfSideSamplingMidPoints(1:3,pp,qq,SurfSideID)) IF(distance.LT.distanceMin)THEN p = pp q = qq @@ -1407,7 +1407,7 @@ SUBROUTINE CalcWallAbsoprtion(IntersectionPos, GlobSideID, DONE, ForceWallSample distanceMin = HUGE(1.) DO pp = 1, nSurfSample DO qq = 1, nSurfSample - distance = VECNORM(IntersectionPos(1:3) - SurfSideSamplingMidPoints(1:3,pp,qq,SurfSideID)) + distance = VECNORM(IntersectionPos(1:3) - PhotonSurfSideSamplingMidPoints(1:3,pp,qq,SurfSideID)) IF(distance.LT.distanceMin)THEN p = pp q = qq diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_vars.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_vars.f90 index f7e19974c..e5635d295 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_vars.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_vars.f90 @@ -57,6 +57,16 @@ MODULE MOD_Photon_TrackingVars REAL,ALLOCATABLE :: PhotonSampWallProc(:,:,:,:) #endif /*USE_MPI*/ +REAL,ALLOCPOINT,DIMENSION(:,:,:,:) :: PhotonSurfSideSamplingMidPoints !> Mid point of supersampled surface side +REAL,ALLOCPOINT,DIMENSION(:,:,:) :: PhotonSurfSideArea !> Area of supersampled surface side + +#if USE_MPI +REAL,POINTER,DIMENSION(:,:,:,:) :: PhotonSurfSideSamplingMidPoints_Shared !> Physical coordinate of the center of supersampled surface side +INTEGER :: PhotonSurfSideSamplingMidPoints_Shared_Win +REAL,POINTER,DIMENSION(:,:,:) :: PhotonSurfSideArea_Shared !> Area of supersampled surface side +INTEGER :: PhotonSurfSideArea_Shared_Win +#endif /*USE_MPI*/ + CHARACTER(LEN=255) :: RadiationSurfState,RadiationVolState !> Output file names for surface and volume sampling !=================================================================================================================================== diff --git a/src/radiation/ray_tracing/raytrace.f90 b/src/radiation/ray_tracing/raytrace.f90 index 1912e679e..626a68055 100644 --- a/src/radiation/ray_tracing/raytrace.f90 +++ b/src/radiation/ray_tracing/raytrace.f90 @@ -69,6 +69,7 @@ SUBROUTINE RayTracing() USE MOD_RayTracing_Init ,ONLY: FinalizeRayTracing USE MOD_RayTracing_Vars ,ONLY: RaySecondaryVectorX,RaySecondaryVectorY,RaySecondaryVectorZ USE MOD_Particle_Boundary_Vars ,ONLY: nPartBound +USE MOD_Photon_Tracking ,ONLY: FinalizePhotonSurfSample ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -234,8 +235,12 @@ SUBROUTINE RayTracing() WRITE(UNIT_StdOut,'(A)') " " END IF +! Output to h5 CALL WritePhotonSurfSampleToHDF5() +! Deallocate surface variables +CALL FinalizePhotonSurfSample() + ! Load surface data to create local PhotonSampWall_loc array ! This currently requires .h5 access instead of internal mapping/distribution of info CALL ReadRayTracingDataFromH5(onlySurfData=.TRUE.) diff --git a/src/radiation/ray_tracing/raytrace_ini.f90 b/src/radiation/ray_tracing/raytrace_ini.f90 index d31045437..5fe02e16d 100644 --- a/src/radiation/ray_tracing/raytrace_ini.f90 +++ b/src/radiation/ray_tracing/raytrace_ini.f90 @@ -78,6 +78,7 @@ SUBROUTINE InitRayTracing() #if USE_LOADBALANCE USE MOD_LoadBalance_Vars ,ONLY: PerformLoadBalance #endif /*USE_LOADBALANCE*/ +USE MOD_Photon_Tracking ,ONLY: InitPhotonSurfSample ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -135,7 +136,8 @@ SUBROUTINE InitRayTracing() Ray%Nmax = GETINT('RayTracing-Nmax',hilf) IF(Ray%Nmax.LT.Ray%Nmax) CALL abort(__STAMP__,'RayTracing-Nmax cannot be smaller than Nmin=',IntInfoOpt=Ray%NMin) -! Build all mappings +! Build surface and volume containers +CALL InitPhotonSurfSample() CALL InitHighOrderRaySampling() ASSOCIATE( & @@ -556,10 +558,9 @@ SUBROUTINE FinalizeRayTracing() ! MODULES USE MOD_Globals USE MOD_RayTracing_Vars -!USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall #if USE_MPI -USE MOD_MPI_Shared_Vars ,ONLY: MPI_COMM_SHARED USE MOD_MPI_Shared +USE MOD_MPI_Shared_Vars ,ONLY: MPI_COMM_SHARED #endif /*USE_MPI*/ USE MOD_Photon_TrackingVars USE MOD_Mesh_Vars ,ONLY: nGlobalElems From cd161b5874d9e92268f96d000c4d60b2edd63c98 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Thu, 7 Sep 2023 12:53:18 +0200 Subject: [PATCH 198/495] Added sanity check to ISVALIDMESHFILE: First check if the file actually exists. --- src/io_hdf5/hdf5_input.f90 | 7 ++++++- src/posti/piclas2vtk/piclas2vtk.f90 | 4 +--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/io_hdf5/hdf5_input.f90 b/src/io_hdf5/hdf5_input.f90 index ce039326a..04e8d8287 100644 --- a/src/io_hdf5/hdf5_input.f90 +++ b/src/io_hdf5/hdf5_input.f90 @@ -102,6 +102,11 @@ FUNCTION ISVALIDHDF5FILE(FileName,FileVersionRealOpt,FileVersionIntOpt) CHARACTER(LEN=255) :: ProgramName LOGICAL :: help !=================================================================================================================================== +IF(.NOT.FILEEXISTS(FileName))THEN + SWRITE(UNIT_stdOut,'(A)')' ERROR: The file does not exit! FileName: '//TRIM(FileName) + isValidHDF5File=.FALSE. + RETURN +END IF ! .NOT.FILEEXISTS(FileName) isValidHDF5File=.TRUE. iError=0 FileVersionRealRef=-1.0 @@ -637,7 +642,7 @@ SUBROUTINE ReadAttribute(Loc_ID_in,AttribName,nVal,DatasetName,RealScalar,IntSca CALL H5AOPEN_F(Loc_ID, TRIM(AttribName), Attr_ID, iError) IF(iError.NE.0) CALL abort(__STAMP__,& - 'Attribute '//TRIM(AttribName)//' does not exist or h5 file already opened by a differen program') + 'Attribute ['//TRIM(AttribName)//'] does not exist or h5 file already opened by a differen program') IF(PRESENT(RealArray)) RealArray=0. IF(PRESENT(RealScalar)) RealScalar=0. diff --git a/src/posti/piclas2vtk/piclas2vtk.f90 b/src/posti/piclas2vtk/piclas2vtk.f90 index 9a17c51ce..6cc4d451b 100644 --- a/src/posti/piclas2vtk/piclas2vtk.f90 +++ b/src/posti/piclas2vtk/piclas2vtk.f90 @@ -230,9 +230,7 @@ PROGRAM piclas2vtk DO iArgs = iArgsStart,nArgs InputStateFile = Args(iArgs) ! Check if the argument is a valid .h5 file - IF(.NOT.ISVALIDHDF5FILE(InputStateFile)) THEN - CALL Abort(__STAMP__,'ERROR - Please supply only .h5 files after parameter file.') - END IF + IF(.NOT.ISVALIDHDF5FILE(InputStateFile)) CALL Abort(__STAMP__,'ERROR - Please supply only .h5 files after parameter file.') SWRITE(UNIT_stdOut,'(132("="))') SWRITE(UNIT_stdOut,'(A,I3,A,I3,A)') 'Processing state ',iArgs-iArgsStart+1,' of ',nArgs-iArgsStart+1,'...' From a4b03e4c16343d743eebedd5d1e95d09ee1b6f1a Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Thu, 7 Sep 2023 12:53:28 +0200 Subject: [PATCH 199/495] Added sanity check to ray tracing surface data reading from .h5 file: Check if the nSurfSample in the .h5 file matches the value in the parameter file. --- src/radiation/ray_tracing/raytrace.f90 | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/radiation/ray_tracing/raytrace.f90 b/src/radiation/ray_tracing/raytrace.f90 index 626a68055..c1b8ceacd 100644 --- a/src/radiation/ray_tracing/raytrace.f90 +++ b/src/radiation/ray_tracing/raytrace.f90 @@ -291,6 +291,7 @@ SUBROUTINE ReadRayTracingDataFromH5(onlySurfData) !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES INTEGER :: iElem,Nloc,iVar,k,l,m,iSurfSideHDF5,nSurfSidesHDF5,BCSideID,iLocSide,locElemID,GlobalSideID,SideID +INTEGER :: nSurfSampleHDF5 LOGICAL :: ContainerExists REAL :: N_DG_Ray_locREAL(1:nElems) REAL :: UNMax(nVarRay,0:Ray%NMax,0:Ray%NMax,0:Ray%NMax,PP_nElems) @@ -328,7 +329,17 @@ SUBROUTINE ReadRayTracingDataFromH5(onlySurfData) IF(myComputeNodeRank.EQ.0)THEN #endif CALL DatasetExists(File_ID,'SurfaceData',ContainerExists) - IF(.NOT.ContainerExists) CALL CollectiveStop(__STAMP__,'SurfaceData container not in '//TRIM(RadiationSurfState)) + IF(.NOT.ContainerExists) CALL CollectiveStop(__STAMP__,'[SurfaceData] container not in '//TRIM(RadiationSurfState)) + CALL GetDataSize(File_ID,'SurfaceData',nDims,HSize,attrib=.FALSE.) + ! Check if data hast the format [nVar x nSurfSample x nSurfSample x nSurfSidesHDF5] + IF(INT(HSize(2),4).NE.INT(HSize(3),4)) CALL abort(__STAMP__,'Wrong dimension of [SurfaceData] in '//TRIM(RadiationSurfState)) + nSurfSampleHDF5 = INT(HSize(2),4) + IF(nSurfSampleHDF5.NE.Ray%nSurfSample)THEN + SWRITE(UNIT_stdOut,'(A)') ' Number of nSurfSample in .h5 file differs from the ini file parameter "RayTracing-nSurfSample' + SWRITE(UNIT_stdOut,'(A,I0)') ' nSurfSampleHDF5: ', nSurfSampleHDF5 + SWRITE(UNIT_stdOut,'(A,I0)') ' RayTracing-nSurfSample: ', Ray%nSurfSample + CALL abort(__STAMP__,'Number of nSurfSample in .h5 file differs from the ini file parameter "RayTracing-nSurfSample"!') + END IF ! nSurfSampleHDF5.NE.Ray%nSurfSample CALL ReadArray('SurfaceData',4,(/3_IK,INT(Ray%nSurfSample,IK),INT(Ray%nSurfSample,IK),INT(nSurfSidesHDF5,IK)/),0_IK,1,RealArray=PhotonSampWallHDF5) CALL CloseDataFile() ! Small hack: replace 3rd index with global ID From c2a7b070c8796420fd3c005604816a633b205ef0 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Thu, 7 Sep 2023 13:09:34 +0200 Subject: [PATCH 200/495] Correctly allocate/deallocate ray tracing surface arrays --- src/radiation/ray_tracing/raytrace.f90 | 4 ---- src/radiation/ray_tracing/raytrace_ini.f90 | 9 +++++++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/radiation/ray_tracing/raytrace.f90 b/src/radiation/ray_tracing/raytrace.f90 index c1b8ceacd..a503bd4db 100644 --- a/src/radiation/ray_tracing/raytrace.f90 +++ b/src/radiation/ray_tracing/raytrace.f90 @@ -69,7 +69,6 @@ SUBROUTINE RayTracing() USE MOD_RayTracing_Init ,ONLY: FinalizeRayTracing USE MOD_RayTracing_Vars ,ONLY: RaySecondaryVectorX,RaySecondaryVectorY,RaySecondaryVectorZ USE MOD_Particle_Boundary_Vars ,ONLY: nPartBound -USE MOD_Photon_Tracking ,ONLY: FinalizePhotonSurfSample ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -238,9 +237,6 @@ SUBROUTINE RayTracing() ! Output to h5 CALL WritePhotonSurfSampleToHDF5() -! Deallocate surface variables -CALL FinalizePhotonSurfSample() - ! Load surface data to create local PhotonSampWall_loc array ! This currently requires .h5 access instead of internal mapping/distribution of info CALL ReadRayTracingDataFromH5(onlySurfData=.TRUE.) diff --git a/src/radiation/ray_tracing/raytrace_ini.f90 b/src/radiation/ray_tracing/raytrace_ini.f90 index 5fe02e16d..1b722f447 100644 --- a/src/radiation/ray_tracing/raytrace_ini.f90 +++ b/src/radiation/ray_tracing/raytrace_ini.f90 @@ -128,6 +128,8 @@ SUBROUTINE InitRayTracing() NumRays = GETINT('RayTracing-NumRays') RayForceAbsorption = GETLOGICAL('RayTracing-ForceAbsorption') Ray%VolRefineMode = GETINT('RayTracing-VolRefineMode') + ! Build surface containers + CALL InitPhotonSurfSample() END IF ! PerformRayTracing ! Output of high-order p-adaptive info @@ -136,8 +138,7 @@ SUBROUTINE InitRayTracing() Ray%Nmax = GETINT('RayTracing-Nmax',hilf) IF(Ray%Nmax.LT.Ray%Nmax) CALL abort(__STAMP__,'RayTracing-Nmax cannot be smaller than Nmin=',IntInfoOpt=Ray%NMin) -! Build surface and volume containers -CALL InitPhotonSurfSample() +! Build volume containers CALL InitHighOrderRaySampling() ASSOCIATE( & @@ -564,6 +565,7 @@ SUBROUTINE FinalizeRayTracing() #endif /*USE_MPI*/ USE MOD_Photon_TrackingVars USE MOD_Mesh_Vars ,ONLY: nGlobalElems +USE MOD_Photon_Tracking ,ONLY: FinalizePhotonSurfSample IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------! ! INPUT / OUTPUT VARIABLES @@ -577,6 +579,9 @@ SUBROUTINE FinalizeRayTracing() ! Check if actual ray tracing through the domain is performed IF(PerformRayTracing)THEN + ! Deallocate surface variables + CALL FinalizePhotonSurfSample() + ! 1: after ray tracing is performed SDEALLOCATE(RayElemPassedEnergy) DO iGlobalElem = 1, nGlobalElems From 089afe7ce77a4d3a655643bc4ad31688cc8dc383 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Thu, 7 Sep 2023 13:48:29 +0200 Subject: [PATCH 201/495] Fixed missing change nSurfSample -> Ray%nSurfSample --- .../tracking/radtrans_tracking_tools.f90 | 27 ++++++++++--------- .../tracking/radtrans_tracking_vars.f90 | 1 - 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 index 761975df5..4505bd3e9 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 @@ -1343,13 +1343,14 @@ END SUBROUTINE PeriodicPhotonBC SUBROUTINE CalcWallAbsoprtion(IntersectionPos, GlobSideID, DONE, ForceWallSample) USE MOD_Globals ,ONLY: VECNORM USE MOD_Photon_TrackingVars ,ONLY: PhotonProps,PhotonSurfSideSamplingMidPoints -USE MOD_Particle_Boundary_Vars ,ONLY: PartBound, GlobalSide2SurfSide, nSurfSample +USE MOD_Particle_Boundary_Vars ,ONLY: PartBound, GlobalSide2SurfSide USE MOD_Particle_Mesh_Vars ,ONLY: SideInfo_Shared #if USE_MPI USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWallProc #else USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall #endif /*USE_MPI*/ +USE MOD_RayTracing_Vars ,ONLY: Ray !--------------------------------------------------------------------------------------------------! IMPLICIT NONE !--------------------------------------------------------------------------------------------------! @@ -1373,24 +1374,24 @@ SUBROUTINE CalcWallAbsoprtion(IntersectionPos, GlobSideID, DONE, ForceWallSample ForceWallSampleLoc = ForceWallSample ! Sample impact IF(ForceWallSampleLoc)THEN - IF(nSurfSample.GT.1)THEN + IF(Ray%nSurfSample.GT.1)THEN distanceMin = HUGE(1.) - DO pp = 1, nSurfSample - DO qq = 1, nSurfSample + DO pp = 1, Ray%nSurfSample + DO qq = 1, Ray%nSurfSample distance = VECNORM(IntersectionPos(1:3) - PhotonSurfSideSamplingMidPoints(1:3,pp,qq,SurfSideID)) IF(distance.LT.distanceMin)THEN p = pp q = qq distanceMin = distance END IF ! distance.LT.distanceMin - END DO ! q = 1, nSurfSample - END DO ! p = 1, nSurfSample + END DO ! q = 1, Ray%nSurfSample + END DO ! p = 1, Ray%nSurfSample PhotonSampWall(1,p,q,SurfSideID) = PhotonSampWall(1,p,q,SurfSideID) + 1.0 PhotonSampWall(2,p,q,SurfSideID) = PhotonSampWall(2,p,q,SurfSideID) + PhotonProps%PhotonEnergy ELSE PhotonSampWall(1,1,1,SurfSideID) = PhotonSampWall(1,1,1,SurfSideID) + 1.0 PhotonSampWall(2,1,1,SurfSideID) = PhotonSampWall(2,1,1,SurfSideID) + PhotonProps%PhotonEnergy - END IF ! nSurfSample.GT.1 + END IF ! Ray%nSurfSample.GT.1 END IF ! ForceWallSampleLoc ELSE ForceWallSampleLoc = .FALSE. @@ -1403,23 +1404,23 @@ SUBROUTINE CalcWallAbsoprtion(IntersectionPos, GlobSideID, DONE, ForceWallSample DONE = .TRUE. ! Do not sample twice IF(.NOT.ForceWallSampleLoc)THEN - IF(nSurfSample.GT.1)THEN + IF(Ray%nSurfSample.GT.1)THEN distanceMin = HUGE(1.) - DO pp = 1, nSurfSample - DO qq = 1, nSurfSample + DO pp = 1, Ray%nSurfSample + DO qq = 1, Ray%nSurfSample distance = VECNORM(IntersectionPos(1:3) - PhotonSurfSideSamplingMidPoints(1:3,pp,qq,SurfSideID)) IF(distance.LT.distanceMin)THEN p = pp q = qq END IF ! distance.LT.distanceMin - END DO ! q = 1, nSurfSample - END DO ! p = 1, nSurfSample + END DO ! q = 1, Ray%nSurfSample + END DO ! p = 1, Ray%nSurfSample PhotonSampWall(1,p,q,SurfSideID) = PhotonSampWall(1,p,q,SurfSideID) + 1.0 PhotonSampWall(2,p,q,SurfSideID) = PhotonSampWall(2,p,q,SurfSideID) + PhotonProps%PhotonEnergy ELSE PhotonSampWall(1,1,1,SurfSideID) = PhotonSampWall(1,1,1,SurfSideID) + 1.0 PhotonSampWall(2,1,1,SurfSideID) = PhotonSampWall(2,1,1,SurfSideID) + PhotonProps%PhotonEnergy - END IF ! nSurfSample.GT.1 + END IF ! Ray%nSurfSample.GT.1 END IF ! .NOT.ForceWallSampleLoc END IF #if USE_MPI diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_vars.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_vars.f90 index e5635d295..aa169851b 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_vars.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_vars.f90 @@ -32,7 +32,6 @@ MODULE MOD_Photon_TrackingVars REAL :: PhotonEnergy !> INTEGER :: ElemID !> INTEGER :: WaveLength !> - !REAL :: nSurfSampleFac !> Scaling factor: nSurfSampleFac= 1.0/(nSurfSample**2) REAL :: PhotonStartPos(3) !> super sampled ray path END TYPE From 722dd45b8440b6bb739dc12bffbbae8649893338 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Thu, 7 Sep 2023 14:00:52 +0200 Subject: [PATCH 202/495] Adjusted ray tracing reggie ini files --- .../externals.ini | 10 +++++----- .../parameter.ini | 7 +++---- .../pre-piclas/parameter.ini | 10 ++++------ 3 files changed, 12 insertions(+), 15 deletions(-) diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/externals.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/externals.ini index 49066b4cf..6b4650057 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/externals.ini +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/externals.ini @@ -1,8 +1,8 @@ ! --- Externals Tool Reggie -MPI = 1 , 6 , 1 , 1 , 1 -externalbinary = ./hopr/build/bin/hopr, bin/piclas , ./bin/piclas2vtk , ./bin/piclas2vtk , ./bin/piclas2vtk -externaldirectory = pre-hopr , pre-piclas , ./parameter.ini , ./parameter.ini , ./parameter.ini -externalruntime = pre , pre , post , post , post -cmd_suffix = , ../DSMC.ini , photoionization_RadiationVolState.h5 , photoionization_RadiationSurfState.h5 , photoionization_PartStateBoundary_000.00000000500000000.h5 +MPI = 1 , 6 !, 1 , 1 , 1 +externalbinary = ./hopr/build/bin/hopr, bin/piclas !, ./bin/piclas2vtk , ./bin/piclas2vtk , ./bin/piclas2vtk +externaldirectory = pre-hopr , pre-piclas !, ./parameter.ini , ./parameter.ini , ./parameter.ini +externalruntime = pre , pre !, post , post , post +cmd_suffix = , ../DSMC.ini !, photoionization_RadiationVolState.h5 , photoionization_RadiationSurfState.h5 , photoionization_PartStateBoundary_000.00000010000000000.h5 nocrosscombination:MPI,externalbinary,externaldirectory,externalruntime,cmd_suffix diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini index c17b9ab6c..a37d7baaf 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini @@ -2,8 +2,7 @@ NVisu = 1 N = 1 RayTracing-NMax = 2 RayTracing-nSurfSample= 2,5 -!NodeTypeVisu = GAUSS -NodeTypeVisu = VISU +RayTracing-NodeType = VISU RayTracing-NumRays = 10000, 20000 ! =============================================================================== ! ! POSTI @@ -33,7 +32,7 @@ TrackingMethod = triatracking ! OUTPUT / VISUALIZATION ! =============================================================================== ! ProjectName = photoionization -IterDisplayStep = 1 +IterDisplayStep = 10 Part-AnalyzeStep = 1 CalcNumSpec = T @@ -109,7 +108,7 @@ Part-Boundary5-PhotonSEE-ElectronSpecies= 3 ! Change MPF of SEE particles Part-vMPF = T -Part-Boundary5-PhotonSEE-MacroParticleFactor = 1E8,1E9 +Part-Boundary5-PhotonSEE-MacroParticleFactor = 1E7,1E8 Part-Boundary6-SourceName = BC_TOP Part-Boundary6-Condition = reflective diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/pre-piclas/parameter.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/pre-piclas/parameter.ini index b6df1f4dd..4db2b736d 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/pre-piclas/parameter.ini +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/pre-piclas/parameter.ini @@ -2,8 +2,7 @@ NVisu = 1 N = 1 RayTracing-NMax = 2 RayTracing-nSurfSample= 1 -!NodeTypeVisu = GAUSS -NodeTypeVisu = VISU +RayTracing-NodeType = VISU RayTracing-NumRays = 10000 ! =============================================================================== ! ! POSTI @@ -124,11 +123,10 @@ Part-Boundary6-PhotonEnACC = 1.0 ! Ray Tracing ! =============================================================================== ! UseRayTracing = T -!PIC-DoInterpolation = T ! activate ElemCurved, XiEtaZetaBasis and slenXiEtaZetaBasis (requires XCL_NGeo_Shared) RayTracing-RayPosModel = 1 -!Particles-DSMC-CalcSurfaceVal = T ! activate InitParticleBoundarySampling RayTracing-PartBound = 6 ! -> iBC: 6 PhotonModeBPO = 1 ! Debugging output: vectors +DoBoundaryParticleOutputRay = T RayTracing-VolRefineMode = 3 ! Volumetric refinement !RayTracing-VolRefineModeZ = 0.5 @@ -136,8 +134,8 @@ RayTracing-PulseDuration = 15e-9 RayTracing-WaveLength = 10e-9 RayTracing-PowerDensity = 1.0 RayTracing-RepetitionRate = 1000 -!RayTracing-RayDirection = (/ 0. , 0.0 , -1.0 /) -RayTracing-RayDirection = (/ 0. , 0.5 , -1.0 /) +RayTracing-RayDirection = (/ 0. , 0.0 , -1.0 /) +!RayTracing-RayDirection = (/ 0. , 0.5 , -1.0 /) ! =============================================================================== ! ! Weighting Factor ! =============================================================================== ! From accce452389acb2ce0da1d68212d343d0e804b4f Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Thu, 7 Sep 2023 14:25:52 +0200 Subject: [PATCH 203/495] Activated additional post-processing steps for the ray tracing surface emission reggie --- .../externals.ini | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/externals.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/externals.ini index 6b4650057..a00855e0a 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/externals.ini +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/externals.ini @@ -1,8 +1,8 @@ ! --- Externals Tool Reggie -MPI = 1 , 6 !, 1 , 1 , 1 -externalbinary = ./hopr/build/bin/hopr, bin/piclas !, ./bin/piclas2vtk , ./bin/piclas2vtk , ./bin/piclas2vtk -externaldirectory = pre-hopr , pre-piclas !, ./parameter.ini , ./parameter.ini , ./parameter.ini -externalruntime = pre , pre !, post , post , post -cmd_suffix = , ../DSMC.ini !, photoionization_RadiationVolState.h5 , photoionization_RadiationSurfState.h5 , photoionization_PartStateBoundary_000.00000010000000000.h5 +MPI = 1 , 6 , 1 , 1 , 1 +externalbinary = ./hopr/build/bin/hopr, bin/piclas , ./bin/piclas2vtk , ./bin/piclas2vtk , ./bin/piclas2vtk +externaldirectory = pre-hopr , pre-piclas , ./parameter.ini , ./parameter.ini , ./parameter.ini +externalruntime = pre , pre , post , post , post +cmd_suffix = , ../DSMC.ini , photoionization_RadiationVolState.h5 , photoionization_RadiationSurfState.h5 , photoionization_PartStateBoundary_000.00000010000000000.h5 nocrosscombination:MPI,externalbinary,externaldirectory,externalruntime,cmd_suffix From 5b7a8fa7ee8eba4d5810d588798aec17171138b2 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Thu, 7 Sep 2023 15:26:33 +0200 Subject: [PATCH 204/495] More fixes: missing change nSurfSample -> Ray%nSurfSample --- .../emission/particle_photoionization.f90 | 24 +++++++++---------- src/radiation/ray_tracing/raytrace_ini.f90 | 6 ++--- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/particles/emission/particle_photoionization.f90 b/src/particles/emission/particle_photoionization.f90 index c84eb225e..f27b0f440 100644 --- a/src/particles/emission/particle_photoionization.f90 +++ b/src/particles/emission/particle_photoionization.f90 @@ -38,7 +38,7 @@ SUBROUTINE PhotoIonization_RayTracing_SEE() USE MOD_Globals USE MOD_Globals_Vars ,ONLY: PI USE MOD_Timedisc_Vars ,ONLY: dt,time -USE MOD_Particle_Boundary_Vars ,ONLY: nSurfSample,Partbound,DoBoundaryParticleOutputRay,SurfSideArea +USE MOD_Particle_Boundary_Vars ,ONLY: Partbound,DoBoundaryParticleOutputRay USE MOD_Particle_Vars ,ONLY: Species, PartState, usevMPF USE MOD_RayTracing_Vars ,ONLY: Ray,UseRayTracing,RayElemEmission USE MOD_part_emission_tools ,ONLY: CalcPhotonEnergy @@ -61,7 +61,7 @@ SUBROUTINE PhotoIonization_RayTracing_SEE() USE MOD_Particle_Boundary_Vars ,ONLY: nSurfTotalSides #endif /*USE_MPI*/ !USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall -USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall_loc +USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall_loc,PhotonSurfSideArea #if USE_HDG USE MOD_HDG_Vars ,ONLY: UseFPC,FPC,UseEPC,EPC USE MOD_Mesh_Vars ,ONLY: BoundaryType @@ -95,9 +95,9 @@ SUBROUTINE PhotoIonization_RayTracing_SEE() ! TODO: Copied here from InitParticleMesh, which is only build if not TriaSurfaceFlux IF(UseBezierControlPoints)THEN - IF(.NOT.ALLOCATED(BezierSampleXi)) ALLOCATE(BezierSampleXi(0:nSurfSample)) - DO iSample=0,nSurfSample - BezierSampleXi(iSample)=-1.+2.0/nSurfSample*iSample + IF(.NOT.ALLOCATED(BezierSampleXi)) ALLOCATE(BezierSampleXi(0:Ray%nSurfSample)) + DO iSample=0,Ray%nSurfSample + BezierSampleXi(iSample)=-1.+2.0/Ray%nSurfSample*iSample END DO END IF @@ -176,11 +176,11 @@ SUBROUTINE PhotoIonization_RayTracing_SEE() MPF = Species(SpecID)%MacroParticleFactor ! Use species MPF END IF ! usevMPF ! Loop over the subsides - DO p = 1, nSurfSample - DO q = 1, nSurfSample + DO p = 1, Ray%nSurfSample + DO q = 1, Ray%nSurfSample ! Calculate the number of SEEs per subside !E_Intensity = PhotonSampWall(2,p,q,iSurfSide) * TimeScalingFactor - E_Intensity = PhotonSampWall_loc(p,q,BCSideID) * SurfSideArea(p,q,iSurfSide) * TimeScalingFactor + E_Intensity = PhotonSampWall_loc(p,q,BCSideID) * PhotonSurfSideArea(p,q,iSurfSide) * TimeScalingFactor RealNbrOfSEE = E_Intensity / CalcPhotonEnergy(lambda) * PartBound%PhotonSEEYield(BCID) / MPF CALL RANDOM_NUMBER(RandVal) NbrOfSEE = INT(RealNbrOfSEE+RandVal) @@ -202,7 +202,7 @@ SUBROUTINE PhotoIonization_RayTracing_SEE() ELSE ! Sanity check CALL abort(__STAMP__,'Photoionization with ray tracing requires BezierControlPoints3D') - END IF ! nSurfSample.GT.1 + END IF ! UseBezierControlPoints ! Normal vector provided by the routine points outside of the domain nVec = -nVec ! Loop over number of particles to be inserted @@ -216,7 +216,7 @@ SUBROUTINE PhotoIonization_RayTracing_SEE() ELSE ! Sanity check CALL abort(__STAMP__,'Photoionization with ray tracing requires BezierControlPoints3D') - END IF ! nSurfSample.GT.1 + END IF ! UseBezierControlPoints ! Determine particle velocity CALL CalcVelocity_FromWorkFuncSEE(PartBound%PhotonSEEWorkFunction(BCID), Species(SpecID)%MassIC, tang1, nVec, Velo3D) ! Move particle slightly into the domain away from the surface because TriaTracking loses the particle during restart @@ -253,8 +253,8 @@ SUBROUTINE PhotoIonization_RayTracing_SEE() #endif /*USE_HDG*/ END DO ! iPart = 1, NbrOfSEE END IF ! NbrOfSEE.GT.0 - END DO ! q = 1, nSurfSample - END DO ! p = 1, nSurfSample + END DO ! q = 1, Ray%nSurfSample + END DO ! p = 1, Ray%nSurfSample END DO END ASSOCIATE diff --git a/src/radiation/ray_tracing/raytrace_ini.f90 b/src/radiation/ray_tracing/raytrace_ini.f90 index 1b722f447..dad2715c5 100644 --- a/src/radiation/ray_tracing/raytrace_ini.f90 +++ b/src/radiation/ray_tracing/raytrace_ini.f90 @@ -129,7 +129,6 @@ SUBROUTINE InitRayTracing() RayForceAbsorption = GETLOGICAL('RayTracing-ForceAbsorption') Ray%VolRefineMode = GETINT('RayTracing-VolRefineMode') ! Build surface containers - CALL InitPhotonSurfSample() END IF ! PerformRayTracing ! Output of high-order p-adaptive info @@ -139,6 +138,7 @@ SUBROUTINE InitRayTracing() IF(Ray%Nmax.LT.Ray%Nmax) CALL abort(__STAMP__,'RayTracing-Nmax cannot be smaller than Nmin=',IntInfoOpt=Ray%NMin) ! Build volume containers +CALL InitPhotonSurfSample() CALL InitHighOrderRaySampling() ASSOCIATE( & @@ -579,8 +579,6 @@ SUBROUTINE FinalizeRayTracing() ! Check if actual ray tracing through the domain is performed IF(PerformRayTracing)THEN - ! Deallocate surface variables - CALL FinalizePhotonSurfSample() ! 1: after ray tracing is performed SDEALLOCATE(RayElemPassedEnergy) @@ -634,6 +632,8 @@ SUBROUTINE FinalizeRayTracing() ADEALLOCATE(PhotonSampWallHDF5_Shared) ADEALLOCATE(PhotonSampWallHDF5) #endif /*USE_MPI*/ + ! Deallocate surface variables + CALL FinalizePhotonSurfSample() END IF ! PerformRayTracing END SUBROUTINE FinalizeRayTracing From 255534a4c55bfc98723d713e8fed4598fc49e07d Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Thu, 7 Sep 2023 15:26:55 +0200 Subject: [PATCH 205/495] Activated load balancing for ray tracing reggies --- .../parameter.ini | 4 ++-- .../pre-piclas/parameter.ini | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini index a37d7baaf..1c72c14ff 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini @@ -16,8 +16,8 @@ CFLscale = 0.2 IniExactFunc = 0 DoLoadBalance = T -Load-DeviationThreshold = 0.15 -LoadBalanceMaxSteps = 20 +Load-DeviationThreshold = 1e-3 +LoadBalanceMaxSteps = 10 DoInitialAutoRestart = T ! =============================================================================== ! ! MESH diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/pre-piclas/parameter.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/pre-piclas/parameter.ini index 4db2b736d..042b0f010 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/pre-piclas/parameter.ini +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/pre-piclas/parameter.ini @@ -16,7 +16,7 @@ CFLscale = 0.2 IniExactFunc = 0 DoLoadBalance = T -Load-DeviationThreshold = 0.15 +Load-DeviationThreshold = 1e-3 LoadBalanceMaxSteps = 20 DoInitialAutoRestart = T ! =============================================================================== ! @@ -46,7 +46,7 @@ CalcMeshInfo = T ! =============================================================================== ! ! CALCULATION ! =============================================================================== ! -ManualTimeStep = 5.0E-9 +ManualTimeStep = 2.5E-9 tend = 5e-9!100.0E-9 Analyze_dt = 100.0E-9 From f188cd9f10d925cc7ce8563b270f03387a10e93f Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Thu, 7 Sep 2023 15:36:50 +0200 Subject: [PATCH 206/495] Fixed USE when using MPI=OFF --- src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 index ba712391f..2137637e1 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 @@ -49,6 +49,8 @@ SUBROUTINE InitPhotonSurfSample() USE MOD_MPI_Shared_Vars ,ONLY: myComputeNodeRank,nComputeNodeProcessors USE MOD_Photon_TrackingVars ,ONLY: PhotonSurfSideSamplingMidPoints_Shared,PhotonSurfSideSamplingMidPoints_Shared_Win USE MOD_Photon_TrackingVars ,ONLY: PhotonSurfSideArea_Shared,PhotonSurfSideArea_Shared_Win +#else +USE MOD_Particle_Boundary_Vars ,ONLY: nSurfTotalSides #endif /*USE_MPI*/ USE MOD_Particle_Vars ,ONLY: Symmetry USE MOD_Basis ,ONLY: LegendreGaussNodesAndWeights From e5dfbe91cbd928b9d4cba7a5906f76d8ee2fd640 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Thu, 7 Sep 2023 19:44:16 +0200 Subject: [PATCH 207/495] Fixed periodic ray tracing: the intersection point must be moved periodically after tracking is completed because the intersection point is then used as new starting point, which is used to calculate the distance travelled to the subsequent intersection point. --- .../tracking/radtrans_tracking.f90 | 1 + .../tracking/radtrans_tracking_tools.f90 | 104 +++++++++++------- 2 files changed, 64 insertions(+), 41 deletions(-) diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 index 2137637e1..fa18493e5 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 @@ -598,6 +598,7 @@ SUBROUTINE PhotonTriaTracking() END IF ! PhotonLost END IF ! NrOfThroughSides.LT.2 CALL CalcAbsoprtion(IntersectionPos(1:3), ElemID, DONE) + ! Move photon across periodic BC CALL PeriodicPhotonBC(LocalSide,ElemID,TriNum,IntersectionPos,.TRUE.,SideID) CASE DEFAULT CALL abort(__STAMP__,' ERROR: PartBound not associated!. (unknown case)',BCType,999.) diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 index 4505bd3e9..69e58f1df 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 @@ -659,7 +659,7 @@ SUBROUTINE CalcAbsorptionRayTrace(IntersectionPos,GlobalElemID,PhotonDir) REAL, INTENT(IN) :: PhotonDir(3) REAL, INTENT(IN) :: IntersectionPos(3) ! Local variable declaration -INTEGER :: a,b,k,l,m,Nloc,NbrOfSamples,iIntersec,idx +INTEGER :: k,l,m,Nloc,NbrOfSamples,iIntersec,idx INTEGER :: kOld,lOld,mOld REAL :: SamplePos(3) REAL :: direction(3),subdirection(3),length,sublength @@ -670,8 +670,6 @@ SUBROUTINE CalcAbsorptionRayTrace(IntersectionPos,GlobalElemID,PhotonDir) direction(1:3) = IntersectionPos(1:3)-PhotonProps%PhotonStartPos(1:3) length = VECNORM(direction(1:3)) -! Check primary or secondary direction - ! Check primary or secondary direction IF(DOT_PRODUCT(PhotonDir,Ray%Direction).GT.0.0)THEN ! 1st energy direction @@ -686,13 +684,6 @@ SUBROUTINE CalcAbsorptionRayTrace(IntersectionPos,GlobalElemID,PhotonDir) ! High-order sampling: Use nearest Gauss point (NGP) from PIC deposition Nloc = N_DG_Ray(GlobalElemID) -IF(MOD(Nloc,2).EQ.0) THEN - a = Nloc/2 - b = a -ELSE - a = (Nloc+1)/2 - b = a-1 -END IF ! Loop over number of sub-samples NbrOfSamples = 20 ! Nloc+1 ! must be at least 3 for this sampling method (one point between the two intersections of the element)! @@ -758,6 +749,7 @@ END SUBROUTINE CalcAbsorptionRayTrace !=================================================================================================================================== SUBROUTINE GetNestestDOFInRefElem(Nloc,SamplePos,GlobalElemID,k,l,m) ! MODULES +USE MOD_globals USE MOD_Eval_xyz ,ONLY: GetPositionInRefElem USE MOD_RayTracing_Vars ,ONLY: N_Inter_Ray IMPLICIT NONE @@ -767,41 +759,55 @@ SUBROUTINE GetNestestDOFInRefElem(Nloc,SamplePos,GlobalElemID,k,l,m) INTEGER,INTENT(IN) :: Nloc INTEGER,INTENT(IN) :: GlobalElemID INTEGER,INTENT(OUT) :: k,l,m +!INTEGER :: kOld,lOld,mOld !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -REAL :: IntersectionPosRef(3) +REAL :: IntersectionPosRef(3) +!INTEGER :: ii,a,b !=================================================================================================================================== - ! OLD METHOD FROM NEAREST GAUSS POINT -! ! Get position in reference element -! CALL GetPositionInRefElem(SamplePos(1:3),IntersectionPosRef(1:3),GlobalElemID) - -! k = a -! DO ii = 0,b-1 -! IF(ABS(IntersectionPosRef(1)).GE.N_Inter_Ray(Nloc)%GaussBorder(Nloc-ii))THEN -! k = Nloc-ii -! EXIT -! END IF -! END DO -! k = NINT((Nloc+SIGN(2.0*k-Nloc,IntersectionPosRef(1)))/2) -! !! y-direction -! l = a -! DO ii = 0,b-1 -! IF(ABS(IntersectionPosRef(2)).GE.N_Inter_Ray(Nloc)%GaussBorder(Nloc-ii))THEN -! l = Nloc-ii -! EXIT -! END IF -! END DO -! l = NINT((Nloc+SIGN(2.0*l-Nloc,IntersectionPosRef(2)))/2) -! !! z-direction -! m = a -! DO ii = 0,b-1 -! IF(ABS(IntersectionPosRef(3)).GE.N_Inter_Ray(Nloc)%GaussBorder(Nloc-ii))THEN -! m = Nloc-ii -! EXIT -! END IF -! END DO -! m = NINT((Nloc+SIGN(2.0*m-Nloc,IntersectionPosRef(3)))/2) + +!IF(MOD(Nloc,2).EQ.0) THEN +! a = Nloc/2 +! b = a +!ELSE +! a = (Nloc+1)/2 +! b = a-1 +!END IF +! +!! Get position in reference element +!CALL GetPositionInRefElem(SamplePos(1:3),IntersectionPosRef(1:3),GlobalElemID) +! +!k = a +!DO ii = 0,b-1 +! IF(ABS(IntersectionPosRef(1)).GE.N_Inter_Ray(Nloc)%GaussBorder(Nloc-ii))THEN +! k = Nloc-ii +! EXIT +! END IF +!END DO +!k = NINT((Nloc+SIGN(2.0*k-Nloc,IntersectionPosRef(1)))/2) +!!! y-direction +!l = a +!DO ii = 0,b-1 +! IF(ABS(IntersectionPosRef(2)).GE.N_Inter_Ray(Nloc)%GaussBorder(Nloc-ii))THEN +! l = Nloc-ii +! EXIT +! END IF +!END DO +!l = NINT((Nloc+SIGN(2.0*l-Nloc,IntersectionPosRef(2)))/2) +!!! z-direction +!m = a +!DO ii = 0,b-1 +! IF(ABS(IntersectionPosRef(3)).GE.N_Inter_Ray(Nloc)%GaussBorder(Nloc-ii))THEN +! m = Nloc-ii +! EXIT +! END IF +!END DO +!m = NINT((Nloc+SIGN(2.0*m-Nloc,IntersectionPosRef(3)))/2) +! +!kOld = k +!lOld = l +!mOld = m ! Get reference position CALL GetPositionInRefElem(SamplePos(1:3),IntersectionPosRef(1:3),GlobalElemID) @@ -809,6 +815,19 @@ SUBROUTINE GetNestestDOFInRefElem(Nloc,SamplePos,GlobalElemID,k,l,m) k = MINLOC(ABS(N_Inter_Ray(Nloc)%xGP(:) - IntersectionPosRef(1)),DIM=1) - 1 l = MINLOC(ABS(N_Inter_Ray(Nloc)%xGP(:) - IntersectionPosRef(2)),DIM=1) - 1 m = MINLOC(ABS(N_Inter_Ray(Nloc)%xGP(:) - IntersectionPosRef(3)),DIM=1) - 1 +!IPWRITE(UNIT_StdOut,*) "Nloc =", Nloc +!IPWRITE(UNIT_StdOut,*) "N_Inter_Ray(Nloc)%xGP(:) =", N_Inter_Ray(Nloc)%xGP(:) +!IPWRITE(UNIT_StdOut,*) "IntersectionPosRef =", IntersectionPosRef +! +!IF(kOld.ne.k .or. lOld.ne.l .or. mOld.ne.m)THEN +! write(*,*) "" +! IPWRITE(UNIT_StdOut , *) "k , l , m =" , k , l , m +! IPWRITE(UNIT_StdOut , *) "kOld , lOld , mOld =" , kOld , lOld , mOld +! CALL abort(__STAMP__,'not equal!') +!END IF ! kOld.eq.k .or. lOld.ne.l .or. mOld.ne.m +! +! IPWRITE(UNIT_StdOut , *) "k , l , m =" , k , l , m +! !IF(myrank.eq.0) read*; CALL MPI_BARRIER(MPI_COMM_WORLD,iError) END SUBROUTINE GetNestestDOFInRefElem @@ -1331,6 +1350,9 @@ SUBROUTINE PeriodicPhotonBC(iLocSide, Element, TriNum, IntersectionPos, Intersec ! move particle from old element to new element Element = SideInfo_Shared(SIDE_NBELEMID,SideID) +! Move the intersection point as it will be considered the starting point in the next iteration +IntersectionPos = PhotonProps%PhotonLastPos + END SUBROUTINE PeriodicPhotonBC From a9483ca6e84acc51d7785153054b9a4656004d39 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Thu, 7 Sep 2023 23:17:12 +0200 Subject: [PATCH 208/495] Increased number of rays in volume emission ray tracing reggie for it to succeed --- .../parameter.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/parameter.ini b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/parameter.ini index 63a5a44c8..b8f8b9d5b 100644 --- a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/parameter.ini +++ b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/parameter.ini @@ -107,7 +107,7 @@ Part-Boundary$-PhotonEnACC = 1.0 ! Ray Tracing ! =============================================================================== ! UseRayTracing = T -RayTracing-NumRays = 10000 +RayTracing-NumRays = 20000 RayTracing-RayPosModel = 1 RayTracing-PartBound = 6 ! -> iBC: 6 PhotonModeBPO = 1 ! Debugging output: vectors From 667bae54529e824aa37b99e32548c6aa7a7ba6bf Mon Sep 17 00:00:00 2001 From: Patrick Kopper Date: Fri, 8 Sep 2023 08:12:52 +0200 Subject: [PATCH 209/495] Work around GCC13 parse_associate issue GCC13 introduced an issue with parse_associate. The fix is applied to versions after GCC13.2, see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109948. For GCC13.1/13.2, work around the issue by explicitly passing the associate array bounds to gfortran --- .../particle_mpi/particle_mpi_emission.f90 | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/particles/particle_mpi/particle_mpi_emission.f90 b/src/particles/particle_mpi/particle_mpi_emission.f90 index 805067cd8..d5736a67a 100644 --- a/src/particles/particle_mpi/particle_mpi_emission.f90 +++ b/src/particles/particle_mpi/particle_mpi_emission.f90 @@ -361,10 +361,10 @@ SUBROUTINE InitEmissionComm() lineVector = UNITVECTOR(normal) END IF ! VECNORM(lineVector).LE.0. - xCoords(1:3,1)=O - xCoords(1:3,2)=O+v2 - xCoords(1:3,3)=O+v3 - xCoords(1:3,4)=O+v2+v3 + xCoords(1:3,1)=O(1:3) + xCoords(1:3,2)=O(1:3)+v2(1:3) + xCoords(1:3,3)=O(1:3)+v3(1:3) + xCoords(1:3,4)=O(1:3)+v2(1:3)+v3(1:3) height= Species(iSpec)%Init(iInit)%CuboidHeightIC DO iNode=1,4 @@ -403,11 +403,11 @@ SUBROUTINE InitEmissionComm() ! 1. Check if inside outer radius radius = Species(iSpec)%Init(iInit)%RadiusIC ! here no radius, already included - xCoords(1:3,1)=Species(iSpec)%Init(iInit)%BasePointIC -v1 -v2 + xCoords(1:3,1)=Species(iSpec)%Init(iInit)%BasePointIC -v1(1:3) -v2(1:3) - xCoords(1:3,2)=xCoords(1:3,1)+2.0*v1 - xCoords(1:3,3)=xCoords(1:3,1)+2.0*v2 - xCoords(1:3,4)=xCoords(1:3,1)+2.0*v1+2.0*v2 + xCoords(1:3,2)=xCoords(1:3,1)+2.0*v1(1:3) + xCoords(1:3,3)=xCoords(1:3,1)+2.0*v2(1:3) + xCoords(1:3,4)=xCoords(1:3,1)+2.0*v1(1:3)+2.0*v2(1:3) height= Species(iSpec)%Init(iInit)%CylinderHeightIC DO iNode=1,4 From ddfa580b818bf6f962dc9b79e467df93a7be95a9 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Fri, 8 Sep 2023 14:59:37 +0200 Subject: [PATCH 210/495] Adjusted ray tracing sampling of the photon path in the element to consider increased resolution in large elements or deformed elements --- .../radiative_transfer/tracking/radtrans_tracking_tools.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 index 69e58f1df..bcb6d4b2d 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 @@ -686,7 +686,7 @@ SUBROUTINE CalcAbsorptionRayTrace(IntersectionPos,GlobalElemID,PhotonDir) Nloc = N_DG_Ray(GlobalElemID) ! Loop over number of sub-samples -NbrOfSamples = 20 ! Nloc+1 ! must be at least 3 for this sampling method (one point between the two intersections of the element)! +NbrOfSamples = MIN(20,(Nloc+1)**2) ! Nloc+1 ! must be at least 3 for this sampling method (one point between the two intersections of the element)! !scaleFac = 1./REAL(NbrOfSamples) subdirection(1:3) = direction(1:3)/REAL(NbrOfSamples-1) sublength = VECNORM(subdirection(1:3)) From ce5719d8a5205b983d185563d8f8631fdd94ca48 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Fri, 8 Sep 2023 21:06:12 +0200 Subject: [PATCH 211/495] Always use VISU nodes for surface sampling as it is hard-coded in piclas2vtk for surface output. Note that the weights are therefore not equal because side/corner nodes have a smaller associated weight (volume). --- src/posti/piclas2vtk/piclas2vtk.f90 | 9 ++++----- .../radiative_transfer/tracking/radtrans_tracking.f90 | 4 +++- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/posti/piclas2vtk/piclas2vtk.f90 b/src/posti/piclas2vtk/piclas2vtk.f90 index 6cc4d451b..bd2add9cd 100644 --- a/src/posti/piclas2vtk/piclas2vtk.f90 +++ b/src/posti/piclas2vtk/piclas2vtk.f90 @@ -1082,7 +1082,7 @@ SUBROUTINE ConvertSurfaceData(InputStateFile) USE MOD_piclas2vtk_Vars ,ONLY: SurfConnect USE MOD_Interpolation ,ONLY: GetVandermonde USE MOD_ChangeBasis ,ONLY: ChangeBasis2D -USE MOD_Interpolation_Vars ,ONLY: NodeTypeVisu +USE MOD_Interpolation_Vars ,ONLY: NodeTypeVISU USE MOD_Mesh_Vars ,ONLY: Face_xGP, Ngeo ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -1141,15 +1141,14 @@ SUBROUTINE ConvertSurfaceData(InputStateFile) IF(SurfConnect%nSurfaceBCSides.NE.nSurfaceSidesReadin)THEN WRITE (UNIT_stdOut,*) "SurfConnect%nSurfaceBCSides =", SurfConnect%nSurfaceBCSides WRITE (UNIT_stdOut,*) "nSurfaceSidesReadin =", nSurfaceSidesReadin - CALL abort(& - __STAMP__& - ,'Error: SurfConnect%nSurfaceBCSides.NE.nSurfaceSidesReadin') + CALL abort(__STAMP__,'Error: SurfConnect%nSurfaceBCSides.NE.nSurfaceSidesReadin') END IF ! SurfConnect%nSurfaceBCSides.NE.nSurfaceSidesReadin END IF IF(nSurfSample.GT.1) THEN ALLOCATE(Vdm_EQNgeo_NVisu(0:nSurfSample,0:NGeo)) - CALL GetVandermonde(NGeo,'GAUSS',nSurfSample,NodeTypeVisu,Vdm_EQNgeo_NVisu,modal=.FALSE.) + ! Use NodeTypeVISU, which is hard-coded to NodeTypeVISU='VISU' + CALL GetVandermonde(NGeo,'GAUSS',nSurfSample,NodeTypeVISU,Vdm_EQNgeo_NVisu,modal=.FALSE.) ALLOCATE(NodeCoords_visu(1:3,0:nSurfSample,0:nSurfSample,0:0,SurfConnect%nSurfaceBCSides)) NodeCoords_visu = 0. ! Interpolate mesh onto visu grid diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 index fa18493e5..c44c72ef4 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 @@ -131,7 +131,9 @@ SUBROUTINE InitPhotonSurfSample() tmp1=dRayXiEQ_SurfSample/2.0 !(b-a)/2 ALLOCATE(xIP_VISU(0:Ray%nSurfSample),wIP_VISU(0:Ray%nSurfSample)) -CALL GetNodesAndWeights(Ray%nSurfSample, Ray%NodeType, xIP_VISU, wIP=wIP_VISU) +! Build basis for surface sampling on VISU nodes, and not on Ray%NodeType, which default to VISU_INNER +! because VISU nodes are hard-coded in piclas2vtk +CALL GetNodesAndWeights(Ray%nSurfSample, 'VISU', xIP_VISU, wIP=wIP_VISU) DO iSide = firstSide,LastSide ! get global SideID. This contains only nonUniqueSide, no special mortar treatment required From fd89644f6a8786a7319ca3c30d106c5632c17ff3 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Sun, 10 Sep 2023 12:00:39 +0200 Subject: [PATCH 212/495] Slightly increased error tolerance in ray tracing surface emission reggie --- .../surface_emission_rectangle_ray_trace_high-order/analyze.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/analyze.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/analyze.ini index 517a786e8..5f94b6baf 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/analyze.ini +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/analyze.ini @@ -2,7 +2,7 @@ compare_column_file = PartAnalyze.csv ! data file name compare_column_reference_file = Electrons_ref.csv ! data file name compare_column_index = 9 ! column index for comparison -compare_column_tolerance_value = 10e9 ! tolerance (depends on machine accuracy and MPI) +compare_column_tolerance_value = 11e9 ! tolerance (depends on machine accuracy and MPI) compare_column_tolerance_type = absolute ! absolute or relative tolerance ! integrate columns x:y in a data file as integral(y(x), x, x(1), x(end)) From 6af965bc413f0c9df2f424fce71e6db10b269566 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Sun, 10 Sep 2023 14:16:23 +0200 Subject: [PATCH 213/495] Added sanity check until multi-node is implemented for ray tracing simulation. Some containers are only built for nComputeNodeElems and not nComputeNodeTotalElems (maybe more containers are similarly not fully built when running multi-node). --- src/radiation/ray_tracing/raytrace_ini.f90 | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/radiation/ray_tracing/raytrace_ini.f90 b/src/radiation/ray_tracing/raytrace_ini.f90 index dad2715c5..19f29c1ac 100644 --- a/src/radiation/ray_tracing/raytrace_ini.f90 +++ b/src/radiation/ray_tracing/raytrace_ini.f90 @@ -128,7 +128,11 @@ SUBROUTINE InitRayTracing() NumRays = GETINT('RayTracing-NumRays') RayForceAbsorption = GETLOGICAL('RayTracing-ForceAbsorption') Ray%VolRefineMode = GETINT('RayTracing-VolRefineMode') - ! Build surface containers +#if ! (CORE_SPLIT==0) + ! Sanity check: ElemVolume_Shared is only built for nComputeNodeElems and not nComputeNodeTotalElems. Maybe more containers are + ! similarly not fully built when running multi-node + CALL CollectiveStop(__STAMP__,'Ray tracing implemented for node-level splitting; all global elements must be on the compute-node') +#endif /*! (CORE_SPLIT==0)*/ END IF ! PerformRayTracing ! Output of high-order p-adaptive info @@ -137,7 +141,7 @@ SUBROUTINE InitRayTracing() Ray%Nmax = GETINT('RayTracing-Nmax',hilf) IF(Ray%Nmax.LT.Ray%Nmax) CALL abort(__STAMP__,'RayTracing-Nmax cannot be smaller than Nmin=',IntInfoOpt=Ray%NMin) -! Build volume containers +! Build surface and volume containers CALL InitPhotonSurfSample() CALL InitHighOrderRaySampling() From 26fd1f1f3a04b5433dc2e72b3c8e2d70090499c9 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Sun, 10 Sep 2023 17:26:05 +0200 Subject: [PATCH 214/495] Testing Leapfrog reggies for poisson and photoionization --- .gitlab-ci.yml | 118 +++++++++++++++++++++++++++++++++++-------------- 1 file changed, 86 insertions(+), 32 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 677f8802c..710213b07 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -118,14 +118,18 @@ stages: needs: [build_poisson] artifacts: paths: - - build_poisson_release - - build_poisson_debug + - build_poisson_release_RK3 + - build_poisson_release_Leapfrog + - build_poisson_debug_RK3 + - build_poisson_debug_Leapfrog cache: - *reggie_cache - key: "${CI_COMMIT_REF_SLUG}-POI" paths: - - build_poisson_release - - build_poisson_debug + - build_poisson_release_RK3 + - build_poisson_release_Leapfrog + - build_poisson_debug_RK3 + - build_poisson_debug_Leapfrog policy: pull .defaults_poisson_checkin: &defaults_poisson_checkin @@ -146,14 +150,18 @@ stages: needs: [build_poisson_petsc] artifacts: paths: - - build_poisson_petsc_release - - build_poisson_petsc_debug + - build_poisson_petsc_release_RK3 + - build_poisson_petsc_release_Leapfrog + - build_poisson_petsc_debug_RK3 + - build_poisson_petsc_debug_Leapfrog cache: - *reggie_cache - key: "${CI_COMMIT_REF_SLUG}-POI-PETSC" paths: - - build_poisson_petsc_release - - build_poisson_petsc_debug + - build_poisson_petsc_release_RK3 + - build_poisson_petsc_release_Leapfrog + - build_poisson_petsc_debug_RK3 + - build_poisson_petsc_debug_Leapfrog policy: pull .defaults_poisson_petsc_checkin: &defaults_poisson_petsc_checkin @@ -252,42 +260,64 @@ build_poisson: needs: [reggie_download] artifacts: paths: - - build_poisson_release - - build_poisson_debug + - build_poisson_release_RK3 + - build_poisson_release_Leapfrog + - build_poisson_debug_RK3 + - build_poisson_debug_Leapfrog cache: key: "${CI_COMMIT_REF_SLUG}-POI" paths: - - build_poisson_release - - build_poisson_debug + - build_poisson_release_RK3 + - build_poisson_release_Leapfrog + - build_poisson_debug_RK3 + - build_poisson_debug_Leapfrog policy: push stage: build script: - - mkdir -p build_poisson_release ; cd build_poisson_release + - mkdir -p build_poisson_release_RK3 ; cd build_poisson_release_RK3 - cmake .. -DCMAKE_BUILD_TYPE=Release -DPICLAS_EQNSYSNAME=poisson -DPICLAS_CODE_ANALYZE=ON -DPICLAS_TIMEDISCMETHOD=RK3 -DLIBS_BUILD_HDF5=OFF ; $GENERATOR -j $NCORES all - cd .. - - mkdir -p build_poisson_debug ; cd build_poisson_debug + - mkdir -p build_poisson_debug_RK3 ; cd build_poisson_debug_RK3 - cmake .. -DCMAKE_BUILD_TYPE=Debug -DPICLAS_EQNSYSNAME=poisson -DPICLAS_CODE_ANALYZE=ON -DPICLAS_TIMEDISCMETHOD=RK3 -DLIBS_BUILD_HDF5=OFF ; $GENERATOR -j $NCORES all + - cd .. + - mkdir -p build_poisson_release_Leapfrog ; cd build_poisson_release_Leapfrog + - cmake .. -DCMAKE_BUILD_TYPE=Release -DPICLAS_EQNSYSNAME=poisson -DPICLAS_CODE_ANALYZE=ON -DPICLAS_TIMEDISCMETHOD=Leapfrog -DLIBS_BUILD_HDF5=OFF ; $GENERATOR -j $NCORES all + - cd .. + - mkdir -p build_poisson_debug_Leapfrog ; cd build_poisson_debug_Leapfrog + - cmake .. -DCMAKE_BUILD_TYPE=Debug -DPICLAS_EQNSYSNAME=poisson -DPICLAS_CODE_ANALYZE=ON -DPICLAS_TIMEDISCMETHOD=Leapfrog -DLIBS_BUILD_HDF5=OFF ; $GENERATOR -j $NCORES all + - cd .. build_poisson_petsc: extends: .default_build_param needs: [reggie_download] artifacts: paths: - - build_poisson_petsc_release - - build_poisson_petsc_debug + - build_poisson_petsc_release_RK3 + - build_poisson_petsc_release_Leapfrog + - build_poisson_petsc_debug_RK3 + - build_poisson_petsc_debug_Leapfrog cache: key: "${CI_COMMIT_REF_SLUG}-POI-PETSC" paths: - - build_poisson_petsc_release - - build_poisson_petsc_debug + - build_poisson_petsc_release_RK3 + - build_poisson_petsc_release_Leapfrog + - build_poisson_petsc_debug_RK3 + - build_poisson_petsc_debug_Leapfrog policy: push stage: build script: - - mkdir -p build_poisson_petsc_release ; cd build_poisson_petsc_release + - mkdir -p build_poisson_petsc_release_RK3 ; cd build_poisson_petsc_release_RK3 - cmake .. -DCMAKE_BUILD_TYPE=Release -DPICLAS_EQNSYSNAME=poisson -DPICLAS_PETSC=ON -DPICLAS_CODE_ANALYZE=ON -DPICLAS_TIMEDISCMETHOD=RK3 -DLIBS_BUILD_HDF5=OFF ; $GENERATOR -j $NCORES all - cd .. - - mkdir -p build_poisson_petsc_debug ; cd build_poisson_petsc_debug + - mkdir -p build_poisson_petsc_debug_RK3 ; cd build_poisson_petsc_debug_RK3 - cmake .. -DCMAKE_BUILD_TYPE=Debug -DPICLAS_EQNSYSNAME=poisson -DPICLAS_PETSC=ON -DPICLAS_CODE_ANALYZE=ON -DPICLAS_TIMEDISCMETHOD=RK3 -DLIBS_BUILD_HDF5=OFF ; $GENERATOR -j $NCORES all + - cd .. + - mkdir -p build_poisson_petsc_release_Leapfrog ; cd build_poisson_petsc_release_Leapfrog + - cmake .. -DCMAKE_BUILD_TYPE=Release -DPICLAS_EQNSYSNAME=poisson -DPICLAS_PETSC=ON -DPICLAS_CODE_ANALYZE=ON -DPICLAS_TIMEDISCMETHOD=Leapfrog -DLIBS_BUILD_HDF5=OFF ; $GENERATOR -j $NCORES all + - cd .. + - mkdir -p build_poisson_petsc_debug_Leapfrog ; cd build_poisson_petsc_debug_Leapfrog + - cmake .. -DCMAKE_BUILD_TYPE=Debug -DPICLAS_EQNSYSNAME=poisson -DPICLAS_PETSC=ON -DPICLAS_CODE_ANALYZE=ON -DPICLAS_TIMEDISCMETHOD=Leapfrog -DLIBS_BUILD_HDF5=OFF ; $GENERATOR -j $NCORES all + - cd .. build_DSMC: extends: .default_build_param @@ -400,25 +430,25 @@ poisson_release: <<: *defaults_poisson_checkin stage: reggie_checkin script: - - cd build_poisson_release ; python ../reggie/reggie.py ../regressioncheck/CHE_poisson -e ./bin/piclas + - cd build_poisson_release_RK3 ; python ../reggie/reggie.py ../regressioncheck/CHE_poisson -e ./bin/piclas poisson_debug: <<: *defaults_poisson_checkin stage: reggie_checkin script: - - cd build_poisson_debug ; python ../reggie/reggie.py ../regressioncheck/CHE_poisson -e ./bin/piclas + - cd build_poisson_debug_RK3 ; python ../reggie/reggie.py ../regressioncheck/CHE_poisson -e ./bin/piclas poisson_petsc_release: <<: *defaults_poisson_petsc_checkin stage: reggie_checkin script: - - cd build_poisson_petsc_release ; python ../reggie/reggie.py ../regressioncheck/CHE_poisson -e ./bin/piclas + - cd build_poisson_petsc_release_RK3 ; python ../reggie/reggie.py ../regressioncheck/CHE_poisson -e ./bin/piclas poisson_petsc_debug: <<: *defaults_poisson_petsc_checkin stage: reggie_checkin script: - - cd build_poisson_petsc_debug ; python ../reggie/reggie.py ../regressioncheck/CHE_poisson -e ./bin/piclas + - cd build_poisson_petsc_debug_RK3 ; python ../reggie/reggie.py ../regressioncheck/CHE_poisson -e ./bin/piclas # ---------------------------------------------------------------------------------------------------------------------------------------------------- @@ -671,29 +701,53 @@ NIG_PIC_Deposition: # script: # - cd build ; python ../reggie/reggie.py ../regressioncheck/NIG_SurfaceModel/ -NIG_Photoionization_release: +NIG_Photoionization_release_RK3: + <<: *defaults_poisson_nightly + stage: reggie_nightly + script: + - cd build_poisson_release_RK3; python ../reggie/reggie.py ../regressioncheck/NIG_Photoionization -e ./bin/piclas + +NIG_Photoionization_debug_RK3: + <<: *defaults_poisson_nightly + stage: reggie_nightly + script: + - cd build_poisson_debug_RK3; python ../reggie/reggie.py ../regressioncheck/NIG_Photoionization -e ./bin/piclas + +NIG_Photoionization_petsc_release_RK3: + <<: *defaults_poisson_petsc_nightly + stage: reggie_nightly + script: + - cd build_poisson_petsc_release_RK3; python ../reggie/reggie.py ../regressioncheck/NIG_Photoionization -e ./bin/piclas + +NIG_Photoionization_petsc_debug_RK3: + <<: *defaults_poisson_petsc_nightly + stage: reggie_nightly + script: + - cd build_poisson_petsc_debug_RK3; python ../reggie/reggie.py ../regressioncheck/NIG_Photoionization -e ./bin/piclas + +NIG_Photoionization_release_Leapfrog: <<: *defaults_poisson_nightly stage: reggie_nightly script: - - cd build_poisson_release; python ../reggie/reggie.py ../regressioncheck/NIG_Photoionization -e ./bin/piclas + - cd build_poisson_release_Leapfrog; python ../reggie/reggie.py ../regressioncheck/NIG_Photoionization -e ./bin/piclas -NIG_Photoionization_debug: +NIG_Photoionization_debug_Leapfrog: <<: *defaults_poisson_nightly stage: reggie_nightly script: - - cd build_poisson_debug; python ../reggie/reggie.py ../regressioncheck/NIG_Photoionization -e ./bin/piclas + - cd build_poisson_debug_Leapfrog; python ../reggie/reggie.py ../regressioncheck/NIG_Photoionization -e ./bin/piclas -NIG_Photoionization_petsc_release: +NIG_Photoionization_petsc_release_Leapfrog: <<: *defaults_poisson_petsc_nightly stage: reggie_nightly script: - - cd build_poisson_petsc_release; python ../reggie/reggie.py ../regressioncheck/NIG_Photoionization -e ./bin/piclas + - cd build_poisson_petsc_release_Leapfrog; python ../reggie/reggie.py ../regressioncheck/NIG_Photoionization -e ./bin/piclas -NIG_Photoionization_petsc_debug: +NIG_Photoionization_petsc_debug_Leapfrog: <<: *defaults_poisson_petsc_nightly stage: reggie_nightly script: - - cd build_poisson_petsc_debug; python ../reggie/reggie.py ../regressioncheck/NIG_Photoionization -e ./bin/piclas + - cd build_poisson_petsc_debug_Leapfrog; python ../reggie/reggie.py ../regressioncheck/NIG_Photoionization -e ./bin/piclas # ---------------------------------------------------------------------------------------------------------------------------------------------------- # Stage "reggie_nightly_build_all": Build and run From 577b0100a3d0cbedb23212c1bcf7be5965ede523 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Sun, 10 Sep 2023 17:58:44 +0200 Subject: [PATCH 215/495] Added new subroutine WarningMemusage(Threshold) to output a warning if the global (across all compute nodes) memory surpasses a specific 0 < Threshold < 1 --- src/globals/globals.f90 | 92 +++++++++++++++++++ src/loadbalance/loaddistribution.f90 | 2 +- .../particle_mpi_boundary_sampling.f90 | 19 +++- 3 files changed, 108 insertions(+), 5 deletions(-) diff --git a/src/globals/globals.f90 b/src/globals/globals.f90 index ce1737da8..c2b52a3b9 100644 --- a/src/globals/globals.f90 +++ b/src/globals/globals.f90 @@ -187,6 +187,7 @@ END SUBROUTINE processmemusage PUBLIC :: setstacksizeunlimited PUBLIC :: processmemusage +PUBLIC :: WarningMemusage !=================================================================================================================================== CONTAINS @@ -1485,4 +1486,95 @@ END SUBROUTINE DisplayNumberOfParticles #endif /*defined(PARTICLES)*/ +!=================================================================================================================================== +!> Check the current memory usage and display a message if a certain threshold is reached +!=================================================================================================================================== +SUBROUTINE WarningMemusage(Threshold) +! MODULES +USE MOD_Globals_Vars ,ONLY: memory +#if USE_MPI +USE MOD_MPI_Shared_Vars ,ONLY: myComputeNodeRank,myLeaderGroupRank +USE MOD_MPI_Shared_Vars ,ONLY: MPI_COMM_LEADERS_SHARED,MPI_COMM_SHARED +#if ! (CORE_SPLIT==0) +USE MOD_MPI_Shared_Vars ,ONLY: NbrOfPhysicalNodes,nLeaderGroupProcs +#endif /*! (CORE_SPLIT==0)*/ +#endif /*USE_MPI*/ +USE MOD_StringTools ,ONLY: set_formatting,clear_formatting +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------! +! INPUT / OUTPUT VARIABLES +REAL,INTENT(IN) :: Threshold +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +CHARACTER(32) :: hilf,hilf2,hilf3 +#if USE_MPI +REAL :: ProcMemoryUsed ! Used memory on a single proc +REAL :: NodeMemoryUsed ! Sum of used memory across one compute node +#endif /*USE_MPI*/ +REAL :: MemUsagePercent +#if defined(MEASURE_MPI_WAIT) +INTEGER(KIND=8) :: CounterStart,CounterEnd +REAL(KIND=8) :: Rate +#endif /*defined(MEASURE_MPI_WAIT)*/ +!=================================================================================================================================== +CALL ProcessMemUsage(memory(1),memory(2),memory(3)) ! memUsed,memAvail,memTotal + +! Only CN roots communicate available and total memory info (count once per node) +#if USE_MPI +#if defined(MEASURE_MPI_WAIT) +CALL SYSTEM_CLOCK(count=CounterStart) +#endif /*defined(MEASURE_MPI_WAIT)*/ +IF(nProcessors.GT.1)THEN + ! Collect data on node roots + ProcMemoryUsed = memory(1) + IF (myComputeNodeRank.EQ.0) THEN + CALL MPI_REDUCE(ProcMemoryUsed , NodeMemoryUsed , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_SHARED , IERROR) + memory(1) = NodeMemoryUsed + ELSE + CALL MPI_REDUCE(ProcMemoryUsed , 0 , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_SHARED , IERROR) + END IF + + ! collect data from node roots on first root node + IF (myComputeNodeRank.EQ.0) THEN ! only leaders + IF (myLeaderGroupRank.EQ.0) THEN ! first node leader MUST be MPIRoot + CALL MPI_REDUCE(MPI_IN_PLACE , memory(1:3) , 3 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_LEADERS_SHARED , IERROR) + ELSE + CALL MPI_REDUCE(memory(1:3) , 0 , 3 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_LEADERS_SHARED , IERROR) + END IF ! myLeaderGroupRank.EQ.0 + END IF ! myComputeNodeRank.EQ.0 +END IF ! nProcessors.EQ.1 +#if defined(MEASURE_MPI_WAIT) +CALL SYSTEM_CLOCK(count=CounterEnd, count_rate=Rate) +MPIW8TimeMM = MPIW8TimeMM + REAL(CounterEnd-CounterStart,8)/Rate +MPIW8CountMM = MPIW8CountMM + 1_8 +#endif /*defined(MEASURE_MPI_WAIT)*/ +#endif /*USE_MPI*/ + +! -------------------------------------------------- +! Only MPI root outputs the data to file +! -------------------------------------------------- +IF(.NOT.MPIRoot)RETURN + +! Sanity checks +IF(ABS(memory(3)).LE.0.) CALL abort(__STAMP__,'Could not retrieve total available memory') +IF((Threshold.GT.1.0).OR.(Threshold.LE.0.0)) CALL abort(__STAMP__,'Threshold in WarningMemusage must be in the range 0 < X <= 1') +! Convert kB to GB +memory(1:3)=memory(1:3)/1048576. +! Check if X% of the total memory available is reached +MemUsagePercent = (memory(1)/memory(3))*100.0 +!MemUsagePercent = 99.32 +IF(MemUsagePercent.GT.Threshold)THEN + WRITE(UNIT=hilf ,FMT='(F16.1)') memory(1) + WRITE(UNIT=hilf2,FMT='(F16.1)') memory(3) + WRITE(UNIT=hilf3,FMT='(F5.1)') MemUsagePercent + CALL set_formatting("red") + !SWRITE(UNIT_stdOut,'(A,F5.2,A)') ' WARNING: Memory reaching maximum, RAM is at ',MemUsagePercent,'%' + WRITE(UNIT_stdOut,'(A)') "WARNING: Allocated memory ["//TRIM(ADJUSTL(hilf))//& + "] GB on at least one node is close to the global limit of ["& + //TRIM(ADJUSTL(hilf2))//"] GB, which is "//TRIM(ADJUSTL(hilf3))//"%. Watch out for the OOM killer!" + CALL clear_formatting() +END IF + +END SUBROUTINE WarningMemusage + END MODULE MOD_Globals diff --git a/src/loadbalance/loaddistribution.f90 b/src/loadbalance/loaddistribution.f90 index 1004d2831..4202aae7f 100644 --- a/src/loadbalance/loaddistribution.f90 +++ b/src/loadbalance/loaddistribution.f90 @@ -1317,7 +1317,7 @@ SUBROUTINE WriteElemTimeStatistics(WriteHeader,time_opt,iter_opt) ! Get process memory info CALL ProcessMemUsage(memory(1),memory(2),memory(3)) ! memUsed,memAvail,memTotal -! only CN roots communicate available and total memory info (count once per node) +! Only CN roots communicate available and total memory info (count once per node) #if USE_MPI #if defined(MEASURE_MPI_WAIT) CALL SYSTEM_CLOCK(count=CounterStart) diff --git a/src/particles/particle_mpi/particle_mpi_boundary_sampling.f90 b/src/particles/particle_mpi/particle_mpi_boundary_sampling.f90 index 151588f88..42cada38a 100644 --- a/src/particles/particle_mpi/particle_mpi_boundary_sampling.f90 +++ b/src/particles/particle_mpi/particle_mpi_boundary_sampling.f90 @@ -86,6 +86,7 @@ SUBROUTINE InitSurfCommunication() INTEGER :: NbGlobalElemID, GlobalSideID, NbGlobalSideID, NbElemRank, NbLeaderID, GlobalElemID, ElemRank INTEGER :: TestCounter(2),iCNinnerBC INTEGER :: SwitchGlobalSideID(1:3,1:SUM(nComputeNodeInnerBCs)),nSideTmp +INTEGER :: allocstat !=================================================================================================================================== nRecvSurfSidesTmp = 0 @@ -321,8 +322,10 @@ SUBROUTINE InitSurfCommunication() END DO ! iSide = 1, nComputeNodeInnerBCs !--- Allocate send and recv buffer for each surf leader -ALLOCATE(SurfSendBuf(0:nSurfLeaders-1)) -ALLOCATE(SurfRecvBuf(0:nSurfLeaders-1)) +ALLOCATE(SurfSendBuf(0:nSurfLeaders-1),STAT=allocstat) +IF(allocstat.ne.0) CALL abort(__STAMP__,'Could not allocate SurfSendBuf') +ALLOCATE(SurfRecvBuf(0:nSurfLeaders-1),STAT=allocstat) +IF(allocstat.ne.0) CALL abort(__STAMP__,'Could not allocate SurfRecvBuf') DO iProc = 0,nSurfLeaders-1 ! Get message size @@ -332,13 +335,15 @@ SUBROUTINE InitSurfCommunication() ! Only allocate send buffer if we are expecting sides from this leader node IF (SurfMapping(iProc)%nSendSurfSides.GT.0) THEN - ALLOCATE(SurfSendBuf(iProc)%content(SampSizeAllocate*(nSurfSample**2)*SurfMapping(iProc)%nSendSurfSides)) + ALLOCATE(SurfSendBuf(iProc)%content(SampSizeAllocate*(nSurfSample**2)*SurfMapping(iProc)%nSendSurfSides),STAT=allocstat) + IF(allocstat.ne.0) CALL abort(__STAMP__,'Could not allocate SurfSendBuf(iProc)%content') SurfSendBuf(iProc)%content = 0. END IF ! Only allocate recv buffer if we are expecting sides from this leader node IF (SurfMapping(iProc)%nRecvSurfSides.GT.0) THEN - ALLOCATE(SurfRecvBuf(iProc)%content(SampSizeAllocate*(nSurfSample**2)*SurfMapping(iProc)%nRecvSurfSides)) + ALLOCATE(SurfRecvBuf(iProc)%content(SampSizeAllocate*(nSurfSample**2)*SurfMapping(iProc)%nRecvSurfSides),STAT=allocstat) + IF(allocstat.ne.0) CALL abort(__STAMP__,'Could not allocate SurfRecvBuf(iProc)%content') SurfRecvBuf(iProc)%content = 0. END IF END DO ! iProc @@ -374,6 +379,12 @@ SUBROUTINE InitSurfCommunication() nSurfTotalSides = sendbuf END IF +IF (mySurfRank.EQ.0) THEN +#if USE_LOADBALANCE + IF(.NOT.PerformLoadBalance)& +#endif /*USE_LOADBALANCE*/ + WRITE(UNIT_stdOUt,'(A,I0,A)') ' Starting surface communication between ', nSurfLeaders, ' compute nodes... DONE!' +END IF END SUBROUTINE InitSurfCommunication From c8772cd3263b43b22cd516c651eaad79dc27d91f Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Sun, 10 Sep 2023 19:12:15 +0200 Subject: [PATCH 216/495] Fix circular definition --- src/globals/globals.f90 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/globals/globals.f90 b/src/globals/globals.f90 index c2b52a3b9..8634b9c19 100644 --- a/src/globals/globals.f90 +++ b/src/globals/globals.f90 @@ -1499,7 +1499,7 @@ SUBROUTINE WarningMemusage(Threshold) USE MOD_MPI_Shared_Vars ,ONLY: NbrOfPhysicalNodes,nLeaderGroupProcs #endif /*! (CORE_SPLIT==0)*/ #endif /*USE_MPI*/ -USE MOD_StringTools ,ONLY: set_formatting,clear_formatting +!USE MOD_StringTools ,ONLY: set_formatting,clear_formatting IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------! ! INPUT / OUTPUT VARIABLES @@ -1567,12 +1567,12 @@ SUBROUTINE WarningMemusage(Threshold) WRITE(UNIT=hilf ,FMT='(F16.1)') memory(1) WRITE(UNIT=hilf2,FMT='(F16.1)') memory(3) WRITE(UNIT=hilf3,FMT='(F5.1)') MemUsagePercent - CALL set_formatting("red") + !CALL set_formatting("red") !SWRITE(UNIT_stdOut,'(A,F5.2,A)') ' WARNING: Memory reaching maximum, RAM is at ',MemUsagePercent,'%' WRITE(UNIT_stdOut,'(A)') "WARNING: Allocated memory ["//TRIM(ADJUSTL(hilf))//& "] GB on at least one node is close to the global limit of ["& //TRIM(ADJUSTL(hilf2))//"] GB, which is "//TRIM(ADJUSTL(hilf3))//"%. Watch out for the OOM killer!" - CALL clear_formatting() + !CALL clear_formatting() END IF END SUBROUTINE WarningMemusage From eb2cadb9dcc8983529f767ec4174c9f868c72a49 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Sun, 10 Sep 2023 20:03:58 +0200 Subject: [PATCH 217/495] - Reduced max. particle number to 2mio in ray tracing reggie due to overflow of RAM on 25 processes on reggie server - Reduced size of array PartStateBoundary: Instead of using 11xPDM%maxParticleNumber, the array size is now limited to 11x1000 during initialization - Reduced size of array PartStateBoundary in ray tracing routine: Instead of using LocRayNum (which is the total number of rays divided by the number of processes), now use MIN(1000,LocRayNum) - Deallocate HSize when using twice in the same routine --- .../parameter.ini | 4 ++-- src/particles/boundary/particle_boundary_init.f90 | 3 ++- src/radiation/ray_tracing/raytrace.f90 | 4 +++- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini index 1c72c14ff..6e10e2b81 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini @@ -32,7 +32,7 @@ TrackingMethod = triatracking ! OUTPUT / VISUALIZATION ! =============================================================================== ! ProjectName = photoionization -IterDisplayStep = 10 +IterDisplayStep = 1 Part-AnalyzeStep = 1 CalcNumSpec = T @@ -78,7 +78,7 @@ Part-Species$-ElecRelaxProb = 1. ! PARTICLES ! =============================================================================== ! Part-nSpecies = 5 -Part-maxParticleNumber = 4000000 +Part-maxParticleNumber = 2000000 Part-nBounds = 6 Part-Boundary1-SourceName = BC_periodicx- diff --git a/src/particles/boundary/particle_boundary_init.f90 b/src/particles/boundary/particle_boundary_init.f90 index ef1703a55..b699490a0 100644 --- a/src/particles/boundary/particle_boundary_init.f90 +++ b/src/particles/boundary/particle_boundary_init.f90 @@ -985,8 +985,9 @@ SUBROUTINE InitPartStateBoundary() INTEGER :: ALLOCSTAT !=================================================================================================================================== ! This array is not de-allocated during load balance as it is only written to .h5 during WriteStateToHDF5() + IF(ALLOCATED(PartStateBoundary)) RETURN -ALLOCATE(PartStateBoundary(1:nVarPartStateBoundary,1:PDM%maxParticleNumber), STAT=ALLOCSTAT) +ALLOCATE(PartStateBoundary(1:nVarPartStateBoundary,1:MIN(1000,PDM%maxParticleNumber)), STAT=ALLOCSTAT) IF (ALLOCSTAT.NE.0) CALL abort(__STAMP__,'ERROR in particle_init.f90: Cannot allocate PartStateBoundary array!') PartStateBoundary=0. END SUBROUTINE InitPartStateBoundary diff --git a/src/radiation/ray_tracing/raytrace.f90 b/src/radiation/ray_tracing/raytrace.f90 index a503bd4db..0a4c19744 100644 --- a/src/radiation/ray_tracing/raytrace.f90 +++ b/src/radiation/ray_tracing/raytrace.f90 @@ -157,7 +157,7 @@ SUBROUTINE RayTracing() ! This array is not de-allocated during load balance as it is only written to .h5 during WriteStateToHDF5() IF(.NOT.ALLOCATED(PartStateBoundary))THEN - ALLOCATE(PartStateBoundary(1:nVarPartStateBoundary,1:LocRayNum), STAT=ALLOCSTAT) + ALLOCATE(PartStateBoundary(1:nVarPartStateBoundary,1:MIN(1000,LocRayNum)), STAT=ALLOCSTAT) IF (ALLOCSTAT.NE.0) CALL abort(__STAMP__,'ERROR in particle_init.f90: Cannot allocate PartStateBoundary array!') PartStateBoundary=0. END IF ! .NOT.ALLOCATED(PartStateBoundary) @@ -305,6 +305,7 @@ SUBROUTINE ReadRayTracingDataFromH5(onlySurfData) IF(.NOT.ContainerExists) CALL CollectiveStop(__STAMP__,'SurfaceDataGlobalSideIndex container not in '//TRIM(RadiationSurfState)) CALL GetDataSize(File_ID,'SurfaceDataGlobalSideIndex',nDims,HSize,attrib=.FALSE.) nSurfSidesHDF5 = INT(HSize(1),4) + DEALLOCATE(HSize) IF(nSurfSidesHDF5.LT.1) CALL abort(__STAMP__,'Number of surf sample sides .h5 file is less than 1') ALLOCATE(GlobalSideIndex(nSurfSidesHDF5)) CALL ReadArray('SurfaceDataGlobalSideIndex',1,(/INT(nSurfSidesHDF5,IK)/),0_IK,1,IntegerArray_i4=GlobalSideIndex) @@ -330,6 +331,7 @@ SUBROUTINE ReadRayTracingDataFromH5(onlySurfData) ! Check if data hast the format [nVar x nSurfSample x nSurfSample x nSurfSidesHDF5] IF(INT(HSize(2),4).NE.INT(HSize(3),4)) CALL abort(__STAMP__,'Wrong dimension of [SurfaceData] in '//TRIM(RadiationSurfState)) nSurfSampleHDF5 = INT(HSize(2),4) + DEALLOCATE(HSize) IF(nSurfSampleHDF5.NE.Ray%nSurfSample)THEN SWRITE(UNIT_stdOut,'(A)') ' Number of nSurfSample in .h5 file differs from the ini file parameter "RayTracing-nSurfSample' SWRITE(UNIT_stdOut,'(A,I0)') ' nSurfSampleHDF5: ', nSurfSampleHDF5 From ba60558a9e128ee1004fb178df24b9ec7fc3b7f6 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Mon, 11 Sep 2023 08:27:15 +0200 Subject: [PATCH 218/495] Fix output of memory usage when >95% --- src/loadbalance/loaddistribution.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/loadbalance/loaddistribution.f90 b/src/loadbalance/loaddistribution.f90 index 4202aae7f..bedb49209 100644 --- a/src/loadbalance/loaddistribution.f90 +++ b/src/loadbalance/loaddistribution.f90 @@ -1379,7 +1379,7 @@ SUBROUTINE WriteElemTimeStatistics(WriteHeader,time_opt,iter_opt) !MemUsagePercent = 99.32 IF((memory(1).GT.memory(4)).AND.(MemUsagePercent.GT.95.0))THEN CALL set_formatting("red") - SWRITE(UNIT_stdOut,'(A,F5.2,A)') ' WARNING: Memory reaching maximum, RAM is at ',MemUsagePercent,'%' + SWRITE(UNIT_stdOut,'(A,F6.2,A)') ' WARNING: Memory reaching maximum, RAM is at ',MemUsagePercent,'%' CALL clear_formatting() END IF END IF ! WriteHeader From 6e36fca6f6e6406401046b0a05d151da0ed293cc Mon Sep 17 00:00:00 2001 From: Patrick Kopper Date: Mon, 11 Sep 2023 11:11:28 +0200 Subject: [PATCH 219/495] Use the paths of the unaliased binaries for the pre-commit hook Some commands might be already aliased to something else and not do what is expected --- .githooks/pre-commit | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/.githooks/pre-commit b/.githooks/pre-commit index 1c1f56268..6d6721644 100755 --- a/.githooks/pre-commit +++ b/.githooks/pre-commit @@ -16,6 +16,11 @@ # Check the number and total size of files about to be commited #=================================================================================================================================== +# Executables, command -v is safe with sh +DU_EXE=$(command -v du) +GIT_EXE=$(command -v git) +LS_EXE=$(command -v ls) + # Check if override is requested if [ "$GIT_OVERRIDE_LIMITS" = "1" ]; then echo 'Detected "GIT_OVERRIDE_LIMITS=1", overriding pre-commit check ...' @@ -30,7 +35,7 @@ SIZETOTALLIMIT=1000000 SIZETOTALWARN=100000 # Number of existing files plus 100 -NUMBERLIMIT=$(git ls-tree --full-tree -r --name-only HEAD | wc -l) +NUMBERLIMIT=$($GIT_EXE ls-tree --full-tree -r --name-only HEAD | wc -l) NUMBERLIMIT=$(($NUMBERLIMIT + 100)) NUMBERWARN=100 @@ -44,7 +49,7 @@ EXEWARN=0 # Check if file is opened in a terminal if test -t 1; then # Check if terminal supports color - NbrOfColors=$(which tput > /dev/null && tput colors) + NbrOfColors=$(command -v tput > /dev/null && tput colors) if test -n "$NbrOfColors" && test "$NbrOfColors" -ge 8; then NC="$(tput sgr0)" RED="$(tput setaf 1)" @@ -54,13 +59,13 @@ if test -t 1; then fi # Get a list of all staged files -CHANGED=$(git diff --staged --name-only) +CHANGED=$($GIT_EXE diff --staged --name-only) # Check if any changes are present if [ -n "$CHANGED" ]; then # Sort found files by size (-S) in reverse ordering (-r) - SORTED=$(ls -Shsr "$CHANGED" 2> /dev/null) - NUMBER=$(git diff --staged --numstat | wc -l) + SORTED=$($LS_EXE -Shsr "$CHANGED" 2> /dev/null) + NUMBER=$($GIT_EXE diff --staged --numstat | wc -l) # Check the number of files if [ "$NUMBER" -ge "$NUMBERLIMIT" ]; then @@ -77,8 +82,8 @@ if [ -n "$CHANGED" ]; then # -f True if FILE exists and is a regular file. if [ -f "$file" ]; then # -b, --bytes equivalent to '--apparent-size --block-size=1' - LINE=$(du -h "$file") - FILESIZE=$(du -b "$file" | cut -d ' ' -f1) # this is a tab, not a white space + LINE=$($DU_EXE -h "$file") + FILESIZE=$($DU_EXE -b "$file" | cut -d ' ' -f1) # this is a tab, not a white space # Sum up the total file sizes FILESUM=$(($FILESUM + $FILESIZE)) @@ -121,7 +126,7 @@ if [ -n "$CHANGED" ]; then printf "${RED}The following file(s) are executable, which is not allowed. Remove the execute permission via 'chmod -x filename' and try again.${NC}\n" EXEWARN=1 fi - LINE=$(ls -alFhs "$file") + LINE=$($LS_EXE -alFhs "$file") printf "$LINE\n" ERROR=1 fi @@ -139,4 +144,4 @@ if [ -n "$CHANGED" ]; then else echo 'No staged changes. Exiting ...' exit 0 -fi +fi \ No newline at end of file From 7fc6b595416703bede3f8f1417ebfbc6e77627d5 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Mon, 11 Sep 2023 14:06:20 +0200 Subject: [PATCH 220/495] Make sure that the commit script that adds the current commit hash to the std.out stream is executed even though cmake is not explicitly executed after the commit is changed in git --- CMakeLists.txt | 2 ++ src/CMakeLists.txt | 2 ++ 2 files changed, 4 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 05f637108..dc803ee59 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -121,6 +121,8 @@ IF(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/.git) MESSAGE(STATUS "Current git commit ${GIT_COMMIT} will be written to ${commit}") EXECUTE_PROCESS(COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/tools/cmake/setCommitHash.sh ${commit}) ENDIF() +# Make sure that the script is executed even though cmake is not explicitly executed after the commit is changed in git +ADD_CUSTOM_TARGET(UpdatGitCommitHash COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/tools/cmake/setCommitHash.sh ${commit}) # ========================================================================= # Check IPO support: diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index eda3e74e0..94190d039 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -557,6 +557,8 @@ SET_TARGET_PROPERTIES(libpiclasshared PROPERTIES OUTPUT_NAME "libpiclas") ADD_DEPENDENCIES(libpiclasshared libpiclasstatic userblocklib stacksizelib memusagelib ${INTERNALLIBS}) ADD_EXEC(piclas ./src/piclas.f90) ADD_DEPENDENCIES(piclas libpiclasstatic userblocklib stacksizelib memusagelib ${INTERNALLIBS}) +# Make sure that the script is executed even though cmake is not explicitly executed after the commit is changed in git +ADD_DEPENDENCIES(piclas UpdatGitCommitHash) # special compiler flags to avoid warnings for empty functions of testcase.f90 and overwrite of intrinsic abort in globals.f90 IF (CMAKE_Fortran_COMPILER_ID MATCHES "GNU") From 25351eba8c6b5fec69cf4ddacf695b91261378a5 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Mon, 11 Sep 2023 22:12:54 +0200 Subject: [PATCH 221/495] Every time you make a typo, the errorists win. --- CMakeLists.txt | 2 +- src/CMakeLists.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index dc803ee59..795a8f866 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -122,7 +122,7 @@ IF(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/.git) EXECUTE_PROCESS(COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/tools/cmake/setCommitHash.sh ${commit}) ENDIF() # Make sure that the script is executed even though cmake is not explicitly executed after the commit is changed in git -ADD_CUSTOM_TARGET(UpdatGitCommitHash COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/tools/cmake/setCommitHash.sh ${commit}) +ADD_CUSTOM_TARGET(UpdateGitCommitHash COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/tools/cmake/setCommitHash.sh ${commit}) # ========================================================================= # Check IPO support: diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 94190d039..bee1ec4c8 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -558,7 +558,7 @@ ADD_DEPENDENCIES(libpiclasshared libpiclasstatic userblocklib stacksizelib memus ADD_EXEC(piclas ./src/piclas.f90) ADD_DEPENDENCIES(piclas libpiclasstatic userblocklib stacksizelib memusagelib ${INTERNALLIBS}) # Make sure that the script is executed even though cmake is not explicitly executed after the commit is changed in git -ADD_DEPENDENCIES(piclas UpdatGitCommitHash) +ADD_DEPENDENCIES(piclas UpdateGitCommitHash) # special compiler flags to avoid warnings for empty functions of testcase.f90 and overwrite of intrinsic abort in globals.f90 IF (CMAKE_Fortran_COMPILER_ID MATCHES "GNU") From bb963072056950c9938bfb8296e2b20d383cd1b4 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Mon, 11 Sep 2023 22:42:03 +0200 Subject: [PATCH 222/495] Added missing USE variables when compiling with PICLAS_MEASURE_MPI_WAIT=ON --- src/globals/globals.f90 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/globals/globals.f90 b/src/globals/globals.f90 index 8634b9c19..94c1ab605 100644 --- a/src/globals/globals.f90 +++ b/src/globals/globals.f90 @@ -1498,6 +1498,9 @@ SUBROUTINE WarningMemusage(Threshold) #if ! (CORE_SPLIT==0) USE MOD_MPI_Shared_Vars ,ONLY: NbrOfPhysicalNodes,nLeaderGroupProcs #endif /*! (CORE_SPLIT==0)*/ +#if defined(MEASURE_MPI_WAIT) +USE MOD_MPI_Vars ,ONLY: MPIW8TimeMM,MPIW8CountMM +#endif /*defined(MEASURE_MPI_WAIT)*/ #endif /*USE_MPI*/ !USE MOD_StringTools ,ONLY: set_formatting,clear_formatting IMPLICIT NONE From 8beeac91f0710bf54a8d5de0dcce6d2d60169960 Mon Sep 17 00:00:00 2001 From: Julian Beyer Date: Tue, 12 Sep 2023 13:56:25 +0200 Subject: [PATCH 223/495] meteor output --- src/output/output.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/output/output.f90 b/src/output/output.f90 index a6fceec18..e8a37d6f0 100644 --- a/src/output/output.f90 +++ b/src/output/output.f90 @@ -289,12 +289,12 @@ SUBROUTINE PrintStatusLineRadiation(t,tStart,tEnd,Phot,outputrank) IF (Phot) THEN WRITE(UNIT_stdOut,'(A,E10.4,A,E10.4,A,A,I6,A1,I0.2,A1,I0.2,A1,I0.2,A,A,A,A3,F6.2,A3,A1)',ADVANCE='NO') & ' Photon = ', t,' TotalPhotons = ', tEnd, ' ', ' eta = ',INT(days),':',INT(hours),':',INT(mins),':',INT(secs),' |',& - REPEAT('☢ ',CEILING(percent/4)),REPEAT(' ',INT((100-percent)/4)),'| [',percent,'%] ',& + REPEAT('☄ ',CEILING(percent/4)),REPEAT(' ',INT((100-percent)/4)),'| [',percent,'%] ',& ACHAR(13) ! ACHAR(13) is carriage return ELSE WRITE(UNIT_stdOut,'(A,E10.4,A,E10.4,A,A,I6,A1,I0.2,A1,I0.2,A1,I0.2,A,A,A,A3,F6.2,A3,A1)',ADVANCE='NO') & ' Elem = ', t,' TotalElems = ', tEnd, ' ', ' eta = ',INT(days),':',INT(hours),':',INT(mins),':',INT(secs),' |',& - REPEAT('🚀',CEILING(percent/4)),REPEAT(' ',INT((100-percent)/4)),'| [',percent,'%] ',& + REPEAT('☢ ',CEILING(percent/4)),REPEAT(' ',INT((100-percent)/4)),'| [',percent,'%] ',& ACHAR(13) ! ACHAR(13) is carriage return END IF #ifdef INTEL From 6f58f988c924d090a204225497837fa25242fb64 Mon Sep 17 00:00:00 2001 From: Julian Beyer Date: Tue, 12 Sep 2023 17:00:41 +0200 Subject: [PATCH 224/495] real meteor output --- src/output/output.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/output/output.f90 b/src/output/output.f90 index e8a37d6f0..61ca0ccd3 100644 --- a/src/output/output.f90 +++ b/src/output/output.f90 @@ -289,7 +289,7 @@ SUBROUTINE PrintStatusLineRadiation(t,tStart,tEnd,Phot,outputrank) IF (Phot) THEN WRITE(UNIT_stdOut,'(A,E10.4,A,E10.4,A,A,I6,A1,I0.2,A1,I0.2,A1,I0.2,A,A,A,A3,F6.2,A3,A1)',ADVANCE='NO') & ' Photon = ', t,' TotalPhotons = ', tEnd, ' ', ' eta = ',INT(days),':',INT(hours),':',INT(mins),':',INT(secs),' |',& - REPEAT('☄ ',CEILING(percent/4)),REPEAT(' ',INT((100-percent)/4)),'| [',percent,'%] ',& + REPEAT('☄️ ',CEILING(percent/4)),REPEAT(' ',INT((100-percent)/4)),'| [',percent,'%] ',& ACHAR(13) ! ACHAR(13) is carriage return ELSE WRITE(UNIT_stdOut,'(A,E10.4,A,E10.4,A,A,I6,A1,I0.2,A1,I0.2,A1,I0.2,A,A,A,A3,F6.2,A3,A1)',ADVANCE='NO') & From f08867fae09df76e168b28963079a87dffaf798d Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Fri, 15 Sep 2023 09:25:28 +0200 Subject: [PATCH 225/495] Increased tolerance for ray tracing volume emission reggie --- .../volume_emission_rectangle_ray_trace_high-order/analyze.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/analyze.ini b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/analyze.ini index 72eb022e6..9be4b6f9c 100644 --- a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/analyze.ini +++ b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/analyze.ini @@ -4,5 +4,5 @@ compare_column_file = PartAnalyze.csv ! data file name compare_column_reference_file = Electrons_ref.csv ! data file name compare_column_index = 9 ! column index for comparison -compare_column_tolerance_value = 1e9 ! tolerance (depends on machine accuracy and MPI) +compare_column_tolerance_value = 2e9 ! tolerance (depends on machine accuracy and MPI) compare_column_tolerance_type = absolute ! absolute or relative tolerance From 04d83cb7556934d71cb3b43c414b5fc1f600ba6f Mon Sep 17 00:00:00 2001 From: Tobias Ott Date: Fri, 15 Sep 2023 14:55:10 +0200 Subject: [PATCH 226/495] Manually set Smat to set the zero potential DOF --- src/hdg/elem_mat.f90 | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/hdg/elem_mat.f90 b/src/hdg/elem_mat.f90 index 5227edc79..894bef4ed 100644 --- a/src/hdg/elem_mat.f90 +++ b/src/hdg/elem_mat.f90 @@ -369,6 +369,11 @@ SUBROUTINE Elem_Mat(td_iter) jSideID=ElemToSide(E2S_SIDE_ID,jLocSide,iElem) jPETScGlobal=PETScGlobal(jSideID) IF (iPETScGlobal.GT.jPETScGlobal) CYCLE + IF(SetZeroPotentialDOF.AND.(iPETScGlobal.EQ.0)) THEN + ! The first DOF is set to constant 0 -> lambda_{1,1} = 0 + Smat(:,1,jLocSide,iLocSide,iElem) = 0 + IF(jPETScGlobal.EQ.iPETScGlobal) Smat(1,1,jLocSide,iLocSide,iElem) = 1 + END IF PetscCallA(MatSetValuesBlocked(Smat_petsc,1,iPETScGlobal,1,jPETScGlobal,Smat(:,:,jLocSide,iLocSide,iElem),ADD_VALUES,ierr)) END DO END DO @@ -403,8 +408,6 @@ SUBROUTINE Elem_Mat(td_iter) END DO PetscCallA(MatAssemblyBegin(Smat_petsc,MAT_FINAL_ASSEMBLY,ierr)) PetscCallA(MatAssemblyEnd(Smat_petsc,MAT_FINAL_ASSEMBLY,ierr)) - -IF(SetZeroPotentialDOF) PetscCallA(MatZeroRowsColumns(Smat_petsc,1,(/0/),1.,PETSC_NULL_VEC,PETSC_NULL_VEC,ierr)) #endif From 43c6837392afe35f6d289b199bc454fa299a0408 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Fri, 22 Sep 2023 15:34:43 +0200 Subject: [PATCH 227/495] Increased tolerance for ray tracing surface emission reggie --- .../surface_emission_rectangle_ray_trace_high-order/analyze.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/analyze.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/analyze.ini index 5f94b6baf..686881249 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/analyze.ini +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/analyze.ini @@ -2,7 +2,7 @@ compare_column_file = PartAnalyze.csv ! data file name compare_column_reference_file = Electrons_ref.csv ! data file name compare_column_index = 9 ! column index for comparison -compare_column_tolerance_value = 11e9 ! tolerance (depends on machine accuracy and MPI) +compare_column_tolerance_value = 17e9 ! tolerance (depends on machine accuracy and MPI) compare_column_tolerance_type = absolute ! absolute or relative tolerance ! integrate columns x:y in a data file as integral(y(x), x, x(1), x(end)) From 7a4f06db95538502d6ec5eb2bac8930a30f18b6b Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Mon, 25 Sep 2023 21:19:10 +0200 Subject: [PATCH 228/495] Only write photoionization volume electrons when DoBoundaryParticleOutputRay=T --- src/particles/emission/particle_photoionization.f90 | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/particles/emission/particle_photoionization.f90 b/src/particles/emission/particle_photoionization.f90 index f27b0f440..cc0b236b6 100644 --- a/src/particles/emission/particle_photoionization.f90 +++ b/src/particles/emission/particle_photoionization.f90 @@ -486,7 +486,7 @@ SUBROUTINE PhotoIonization_RayTracing_Volume() PartMPF(PartID) = MPF PartMPF(newPartID) = MPF END IF - ! 1. Store the particle information in PartStateBoundary.h5 + ! Store the ion particle information in PartStateBoundary.h5 IF(DoBoundaryParticleOutputRay) THEN CALL StoreBoundaryParticleProperties(PartID,SpecID,PartState(1:3,PartID),& UNITVECTOR(PartState(4:6,PartID)),(/0.,0.,1./),iPartBound=0,mode=2,MPF_optIN=MPF) @@ -499,7 +499,13 @@ SUBROUTINE PhotoIonization_RayTracing_Volume() PartStateIntEn(1:2,newPartID) = 0. IF(DSMC%ElectronicModel.GT.0) PartStateIntEn(3,newPartID) = 0. ! Insert the products and distribute the reaction energy (Requires: Pair indices, Coll_pData(iPair)%iPart_p1/2) - CALL PhotoIonization_InsertProducts(iPair, iReac, RayBaseVector1IC, RayBaseVector2IC, RayDirection, PartBCIndex=0) + IF(DoBoundaryParticleOutputRay) THEN + ! Store the electron particle information in PartStateBoundary.h5 + CALL PhotoIonization_InsertProducts(iPair, iReac, RayBaseVector1IC, RayBaseVector2IC, RayDirection, PartBCIndex=0) + ELSE + ! DO NOT store the electron particle information in PartStateBoundary.h5 + CALL PhotoIonization_InsertProducts(iPair, iReac, RayBaseVector1IC, RayBaseVector2IC, RayDirection, PartBCIndex=-1) + END IF ! Advance particle vector length and the current next free position with newly created particles PDM%ParticleVecLength = PDM%ParticleVecLength + DSMCSumOfFormedParticles PDM%CurrentNextFreePosition = PDM%CurrentNextFreePosition + DSMCSumOfFormedParticles From a38381460b5c05c8f9d87b254dd91234803bfa46 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Mon, 25 Sep 2023 21:21:14 +0200 Subject: [PATCH 229/495] Increased tolerances for ray tracing photoionization reggies --- .../surface_emission_rectangle_ray_trace_high-order/analyze.ini | 2 +- .../volume_emission_rectangle_ray_trace_high-order/analyze.ini | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/analyze.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/analyze.ini index 686881249..c49f44dd5 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/analyze.ini +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/analyze.ini @@ -2,7 +2,7 @@ compare_column_file = PartAnalyze.csv ! data file name compare_column_reference_file = Electrons_ref.csv ! data file name compare_column_index = 9 ! column index for comparison -compare_column_tolerance_value = 17e9 ! tolerance (depends on machine accuracy and MPI) +compare_column_tolerance_value = 20e9 ! tolerance (depends on machine accuracy and MPI) compare_column_tolerance_type = absolute ! absolute or relative tolerance ! integrate columns x:y in a data file as integral(y(x), x, x(1), x(end)) diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/analyze.ini b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/analyze.ini index 9be4b6f9c..11d8a4255 100644 --- a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/analyze.ini +++ b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/analyze.ini @@ -4,5 +4,5 @@ compare_column_file = PartAnalyze.csv ! data file name compare_column_reference_file = Electrons_ref.csv ! data file name compare_column_index = 9 ! column index for comparison -compare_column_tolerance_value = 2e9 ! tolerance (depends on machine accuracy and MPI) +compare_column_tolerance_value = 2.5e9 ! tolerance (depends on machine accuracy and MPI) compare_column_tolerance_type = absolute ! absolute or relative tolerance From 5e7372833d6c154de84114b8b437e2814549e65e Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Mon, 25 Sep 2023 23:21:41 +0200 Subject: [PATCH 230/495] - Introduced logical read-in parameter UsePhotonTriaTracking (can only be set when actual ray tracing is performed), which, when false uses bilinear tracing instead of tria tracking for ray tracing (but not for actual particles) - Clean-up of particle mesh initialization InitParticleMesh() and outsourced parts to CALL BuildSideSlabAndBoundingBox(), which builds SideSlabNormals_Shared, SideSlabIntervals_Shared, BoundingBoxIsEmpty_Shared --- src/particles/particle_mesh/particle_mesh.f90 | 167 +++---- .../particle_mesh/particle_mesh_build.f90 | 147 +++++- .../tracking/particle_intersection.f90 | 11 +- .../tracking/radtrans_tracking.f90 | 471 +++++++++++++++++- .../tracking/radtrans_tracking_vars.f90 | 1 + src/radiation/ray_tracing/raytrace.f90 | 5 +- 6 files changed, 676 insertions(+), 126 deletions(-) diff --git a/src/particles/particle_mesh/particle_mesh.f90 b/src/particles/particle_mesh/particle_mesh.f90 index 8e8bf4275..cb9e053b8 100644 --- a/src/particles/particle_mesh/particle_mesh.f90 +++ b/src/particles/particle_mesh/particle_mesh.f90 @@ -86,6 +86,7 @@ SUBROUTINE DefineParametersParticleMesh() '1: Output the initial position of the rays and their direction vector\n'& '2: Output initial position and all calculated intersection points calculated in radtrans tracking\n'& ,'0') + CALL prms%CreateLogicalOption( 'UsePhotonTriaTracking', 'Activates usage of TriaTracking methods for photon tracking or Bilinear methods (default is True). Can only be selected when ray tracing is actually performed.','.TRUE.') CALL prms%CreateLogicalOption( 'DoBoundaryParticleOutputRay', 'Activates output of emission particles by ray tracing SEE and ray tracing volume ionization to PartStateBoundary.h5 (with negative species IDs to indicate creation)','.FALSE.') CALL prms%CreateIntOption( 'PartOut'& , 'If compiled with CODE_ANALYZE flag: For This particle number every tracking information is written as STDOUT.','0') @@ -161,11 +162,8 @@ SUBROUTINE InitParticleMesh() USE MOD_Particle_Mesh_Tools ,ONLY: InitPEM_LocalElemID,InitPEM_CNElemID,GetMeshMinMax,IdentifyElemAndSideType USE MOD_Particle_Mesh_Tools ,ONLY: CalcParticleMeshMetrics,InitParticleGeometry,CalcBezierControlPoints USE MOD_Particle_Mesh_Tools ,ONLY: CalcXCL_NGeo -USE MOD_Particle_Surfaces ,ONLY: GetSideSlabNormalsAndIntervals USE MOD_Particle_Surfaces_Vars ,ONLY: BezierSampleN,BezierSampleXi,SurfFluxSideSize,TriaSurfaceFlux USE MOD_Particle_Surfaces_Vars ,ONLY: BezierElevation -USE MOD_Particle_Surfaces_Vars ,ONLY: BezierControlPoints3D,BezierControlPoints3DElevated,SideSlabNormals,SideSlabIntervals -USE MOD_Particle_Surfaces_Vars ,ONLY: BoundingBoxIsEmpty USE MOD_Particle_Tracking_Vars ,ONLY: MeasureTrackTime,FastPeriodic,CountNbrOfLostParts,CartesianPeriodic USE MOD_Particle_Tracking_Vars ,ONLY: NbrOfLostParticles,NbrOfLostParticlesTotal,NbrOfLostParticlesTotal_old USE MOD_Particle_Tracking_Vars ,ONLY: PartStateLostVecLength,PartStateLost,PartLostDataSize @@ -191,15 +189,16 @@ SUBROUTINE InitParticleMesh() #endif /* USE_MPI */ USE MOD_Particle_Mesh_Build ,ONLY: BuildElementRadiusTria,BuildElemTypeAndBasisTria,BuildEpsOneCell,BuildBCElemDistance USE MOD_Particle_Mesh_Build ,ONLY: BuildNodeNeighbourhood,BuildElementOriginShared,BuildElementBasisAndRadius -USE MOD_Particle_Mesh_Build ,ONLY: BuildSideOriginAndRadius,BuildLinearSideBaseVectors +USE MOD_Particle_Mesh_Build ,ONLY: BuildSideOriginAndRadius,BuildLinearSideBaseVectors,BuildSideSlabAndBoundingBox #if USE_LOADBALANCE USE MOD_LoadBalance_Vars ,ONLY: PerformLoadBalance #endif /*USE_LOADBALANCE*/ USE MOD_PICDepo_Shapefunction_Tools, ONLY:InitShapeFunctionDimensionalty USE MOD_Particle_Boundary_Init ,ONLY: InitPartStateBoundary USE MOD_Particle_Boundary_Vars ,ONLY: DoBoundaryParticleOutputHDF5,nSurfSample,DoBoundaryParticleOutputRay -USE MOD_Photon_TrackingVars ,ONLY: PhotonModeBPO +USE MOD_Photon_TrackingVars ,ONLY: PhotonModeBPO,UsePhotonTriaTracking USE MOD_RayTracing_Vars ,ONLY: UseRayTracing +USE MOD_RayTracing_Vars ,ONLY: PerformRayTracing !USE MOD_DSMC_Vars ,ONLY: DSMC ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -211,7 +210,6 @@ SUBROUTINE InitParticleMesh() ! LOCAL VARIABLES INTEGER :: RefMappingGuessProposal INTEGER :: iSample -INTEGER :: firstSide,lastSide,iSide,SideID CHARACTER(LEN=2) :: tmpStr #if !USE_MPI INTEGER :: ALLOCSTAT @@ -315,6 +313,12 @@ SUBROUTINE InitParticleMesh() ! Ray tracing information to .h5 for debugging when using the radiation transport model or pure ray tracing PhotonModeBPO = GETINT('PhotonModeBPO') +! Use TriaTracking methods for photon tracking or Bilinear methods (default is UsePhotonTriaTracking=T) +IF(PerformRayTracing)THEN + UsePhotonTriaTracking = GETLOGICAL('UsePhotonTriaTracking') +ELSE + UsePhotonTriaTracking = .TRUE. +END IF ! PerformRayTracing ! Activate output of emission particles by ray tracing SEE and ray tracing volume ionization to PartStateBoundary.h5 (with negative species IDs to indicate creation DoBoundaryParticleOutputRay = GETLOGICAL('DoBoundaryParticleOutputRay') ! Check if DoBoundaryParticleOutputHDF5 is already activated and PartStateBoundary therefore already allocated @@ -356,9 +360,7 @@ SUBROUTINE InitParticleMesh() epsInCell = SQRT(3.0*RefMappingEps) IF((RefMappingGuess.LT.1).OR.(RefMappingGuess.GT.4))THEN - CALL abort(& -__STAMP__ & -,'Wrong guessing method for mapping from physical space in reference space.',RefMappingGuess,999.) + CALL abort(__STAMP__,'Wrong guessing method for mapping from physical space in reference space.',RefMappingGuess,999.) END IF WRITE(tmpStr,'(L1)') (TrackingMethod.EQ.TRIATRACKING) @@ -388,7 +390,7 @@ SUBROUTINE InitParticleMesh() CALL InitParticleGeometry() CALL InitElemNodeIDs() ! Compute convex element radius^2 - CALL BuildElementRadiusTria() + CALL BuildElementRadiusTria() ! Required for ElemBaryNGeo_Shared, ElemRadius2NGEO_Shared, ElemRadiusNGEO_Shared (only for shape function) ! Interpolation needs coordinates in reference system !IF (DoInterpolation.OR.DSMC%UseOctree) THEN ! use this in future if possible @@ -398,105 +400,41 @@ SUBROUTINE InitParticleMesh() CALL CalcParticleMeshMetrics() ! Required for Elem_xGP_Shared and dXCL_NGeo_Shared CALL CalcXCL_NGeo() ! Required for XCL_NGeo_Shared END IF ! .NOT.UseBezierControlPoints - CALL BuildElemTypeAndBasisTria() ! Required for ElemCurved, XiEtaZetaBasis and slenXiEtaZetaBasis. Needs XCL_NGeo_Shared + CALL BuildElemTypeAndBasisTria() ! Required for ElemCurved_Shared, XiEtaZetaBasis_Shared, slenXiEtaZetaBasis_Shared. Needs XCL_NGeo_Shared END IF ! DoInterpolation.OR.DSMC%UseOctree IF (DoDeposition) CALL BuildEpsOneCell() + IF(.NOT.UsePhotonTriaTracking)THEN + ! Build stuff required for bilinear tracing algorithms + CALL BuildSideSlabAndBoundingBox() ! Required for SideSlabNormals_Shared, SideSlabIntervals_Shared, BoundingBoxIsEmpty_Shared + + ! Check the side type (planar, bilinear, curved) + CALL IdentifyElemAndSideType() ! Builds ElemCurved_Shared, SideType_Shared, SideDistance_Shared, SideNormVec_Shared + + ! Get basevectors for (bi-)linear sides + CALL BuildLinearSideBaseVectors() ! Required for BaseVectors0_Shared, BaseVectors1_Shared, BaseVectors2_Shared, BaseVectors3_Shared, BaseVectorsScale_Shared + END IF ! UsePhotonTriaTracking + CASE(TRACING,REFMAPPING) + ! Build stuff required for tracing algorithms + CALL BuildSideSlabAndBoundingBox() ! Required for SideSlabNormals_Shared, SideSlabIntervals_Shared, BoundingBoxIsEmpty_Shared ! ElemMidPoint_Shared required IF(TriaSurfaceFlux.OR.TRIM(DepositionType).EQ.'shape_function_adaptive') CALL InitParticleGeometry() ! ElemNodeID_Shared required IF(FindNeighbourElems) CALL InitElemNodeIDs() -#if USE_MPI - CALL Allocate_Shared((/3,3,nComputeNodeTotalSides/),SideSlabNormals_Shared_Win,SideSlabNormals_Shared) - CALL MPI_WIN_LOCK_ALL(0,SideSlabNormals_Shared_Win,IERROR) - CALL Allocate_Shared((/6,nComputeNodeTotalSides/),SideSlabIntervals_Shared_Win,SideSlabIntervals_Shared) - CALL MPI_WIN_LOCK_ALL(0,SideSlabIntervals_Shared_Win,IERROR) - CALL Allocate_Shared((/nComputeNodeTotalSides/),BoundingBoxIsEmpty_Shared_Win,BoundingBoxIsEmpty_Shared) - CALL MPI_WIN_LOCK_ALL(0,BoundingBoxIsEmpty_Shared_Win,IERROR) - firstSide = INT(REAL (myComputeNodeRank )*REAL(nComputeNodeTotalSides)/REAL(nComputeNodeProcessors))+1 - lastSide = INT(REAL((myComputeNodeRank+1))*REAL(nComputeNodeTotalSides)/REAL(nComputeNodeProcessors)) - SideSlabNormals => SideSlabNormals_Shared - SideSlabIntervals => SideSlabIntervals_Shared - BoundingBoxIsEmpty => BoundingBoxIsEmpty_Shared - CALL MPI_BARRIER(MPI_COMM_SHARED,iError) -#else - ALLOCATE(SideSlabNormals(1:3,1:3,1:nNonUniqueGlobalSides) & - ,SideSlabIntervals( 1:6,1:nNonUniqueGlobalSides) & - ,BoundingBoxIsEmpty( 1:nNonUniqueGlobalSides) & - ,STAT=ALLOCSTAT) - IF (ALLOCSTAT.NE.0) CALL ABORT(__STAMP__,' Cannot allocate SideMetrics arrays!') - firstSide = 1 - lastSide = nNonUniqueGlobalSides -#endif /* USE_MPI */ -! TODO: bounding box volumes must be calculated for all unique sides. -!#ifdef CODE_ANALYZE -! ALLOCATE(SideBoundingBoxVolume(nSides)) -!#endif /*CODE_ANALYZE*/ - - IF (BezierElevation.GT.0) THEN - DO iSide = firstSide,LastSide - ! ignore sides that are not on the compute node - ! IF (GetCNElemID(SideInfo_Shared(SIDE_ELEMID,iSide)).EQ.-1) CYCLE - - SideID = GetGlobalSideID(iSide) - - ! Ignore small mortar sides attached to big mortar sides - IF (SideInfo_Shared(SIDE_LOCALID,SideID).LT.1 .OR. SideInfo_Shared(SIDE_LOCALID,SideID).GT.6) CYCLE - - ! BezierControlPoints are always on nonUniqueGlobalSide - CALL GetSideSlabNormalsAndIntervals(BezierControlPoints3DElevated(1:3,0:NGeoElevated,0:NGeoElevated,SideID) & - ,SideSlabNormals( 1:3,1:3,iSide) & - ,SideSlabInterVals( 1:6 ,iSide) & - ,BoundingBoxIsEmpty(iSide)) - END DO - ELSE - DO iSide=firstSide,LastSide - ! ignore sides that are not on the compute node - ! IF (GetCNElemID(SideInfo_Shared(SIDE_ELEMID,iSide)).EQ.-1) CYCLE - - SideID = GetGlobalSideID(iSide) - - ! Ignore small mortar sides attached to big mortar sides - IF (SideInfo_Shared(SIDE_LOCALID,SideID).LT.1 .OR. SideInfo_Shared(SIDE_LOCALID,SideID).GT.6) CYCLE - - ! BezierControlPoints are always on nonUniqueGlobalSide - CALL GetSideSlabNormalsAndIntervals(BezierControlPoints3D(1:3,0:NGeo,0:NGeo,SideID) & - ,SideSlabNormals( 1:3,1:3,iSide) & - ,SideSlabInterVals( 1:6 ,iSide) & - ,BoundingBoxIsEmpty(iSide)) - END DO - END IF -#if USE_MPI - CALL BARRIER_AND_SYNC(SideSlabNormals_Shared_Win ,MPI_COMM_SHARED) - CALL BARRIER_AND_SYNC(SideSlabIntervals_Shared_Win ,MPI_COMM_SHARED) - CALL BARRIER_AND_SYNC(BoundingBoxIsEmpty_Shared_Win,MPI_COMM_SHARED) -#endif /* USE_MPI */ - !#ifdef CODE_ANALYZE - ! TODO: bounding box volumes must be calculated for all unique sides. - ! offsetSideID = ElemInfo_Shared(SideIf - ! DO iSide=offsetMPISides_YOUR,LastSide - ! dx=ABS(SideSlabIntervals(2)-SideSlabIntervals(1)) - ! dy=ABS(SideSlabIntervals(4)-SideSlabIntervals(3)) - ! dz=ABS(SideSlabIntervals(6)-SideSlabIntervals(5)) - ! SideID = SideInfo - ! SideBoundingBoxVolume(SideID)=dx*dy*dz - ! END DO - !#endif /*CODE_ANALYZE*/ - ! Compute element bary and element radius for node elements (with halo region) CALL BuildElementOriginShared() ! Check the side type (planar, bilinear, curved) - CALL IdentifyElemAndSideType() + CALL IdentifyElemAndSideType() ! Required for ElemCurved_Shared, SideType_Shared, SideDistance_Shared, SideNormVec_Shared ! Compute the element XiEtaZetaBasis and the radius of the convex hull - CALL BuildElementBasisAndRadius() + CALL BuildElementBasisAndRadius() ! Required for ElemRadiusNGeo_Shared, ElemRadius2NGeo_Shared, XiEtaZetaBasis_Shared, slenXiEtaZetaBasis_Shared ! Get basevectors for (bi-)linear sides - CALL BuildLinearSideBaseVectors() + CALL BuildLinearSideBaseVectors() ! Required for BaseVectors0_Shared, BaseVectors1_Shared, BaseVectors2_Shared, BaseVectors3_Shared, BaseVectorsScale_Shared IF (TrackingMethod.EQ.REFMAPPING) THEN ! Identify BCSides and build side origin and radius @@ -569,6 +507,7 @@ SUBROUTINE FinalizeParticleMesh() USE MOD_LoadBalance_Vars ,ONLY: ElemTime #endif /*USE_LOADBALANCE*/ #endif /*USE_MPI*/ +USE MOD_Photon_TrackingVars ,ONLY: UsePhotonTriaTracking ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -588,8 +527,10 @@ SUBROUTINE FinalizeParticleMesh() SELECT CASE (TrackingMethod) + ! ============================================================================= ! RefMapping, Tracing CASE(REFMAPPING,TRACING) + ! ============================================================================= ! First, free every shared memory window. This requires MPI_BARRIER as per MPI3.1 specification #if USE_MPI CALL MPI_BARRIER(MPI_COMM_SHARED,iERROR) @@ -623,7 +564,7 @@ SUBROUTINE FinalizeParticleMesh() END IF !PerformLoadBalance #endif /*USE_LOADBALANCE*/ - ! GetSideSlabNormalsAndIntervals() (allocated in particle_mesh.f90) + ! BuildSideSlabAndBoundingBox() builds SideSlabNormals_Shared, SideSlabIntervals_Shared, BoundingBoxIsEmpty_Shared CALL UNLOCK_AND_FREE(SideSlabNormals_Shared_Win) CALL UNLOCK_AND_FREE(SideSlabIntervals_Shared_Win) CALL UNLOCK_AND_FREE(BoundingBoxIsEmpty_Shared_Win) @@ -692,7 +633,7 @@ SUBROUTINE FinalizeParticleMesh() END IF !PerformLoadBalance #endif /*USE_LOADBALANCE*/ - ! GetSideSlabNormalsAndIntervals() (allocated in particle_mesh.f90) + ! BuildSideSlabAndBoundingBox() builds SideSlabNormals_Shared, SideSlabIntervals_Shared, BoundingBoxIsEmpty_Shared ADEALLOCATE(SideSlabNormals_Shared) ADEALLOCATE(SideSlabIntervals_Shared) ADEALLOCATE(BoundingBoxIsEmpty_Shared) @@ -733,8 +674,10 @@ SUBROUTINE FinalizeParticleMesh() ! ! Tracing ! CASE(TRACING) + ! ============================================================================= ! TriaTracking CASE(TRIATRACKING) + ! ============================================================================= ! First, free every shared memory window. This requires MPI_BARRIER as per MPI3.1 specification #if USE_MPI CALL MPI_BARRIER(MPI_COMM_SHARED,iERROR) @@ -744,6 +687,25 @@ SUBROUTINE FinalizeParticleMesh() CALL UNLOCK_AND_FREE(ElemSideNodeID_Shared_Win) CALL UNLOCK_AND_FREE(ElemMidPoint_Shared_Win) + IF(.NOT.UsePhotonTriaTracking)THEN + ! GetSideSlabNormalsAndIntervals() + CALL UNLOCK_AND_FREE(SideSlabNormals_Shared_Win) + CALL UNLOCK_AND_FREE(SideSlabIntervals_Shared_Win) + CALL UNLOCK_AND_FREE(BoundingBoxIsEmpty_Shared_Win) + + ! IdentifyElemAndSideType() + CALL UNLOCK_AND_FREE(SideType_Shared_Win) + CALL UNLOCK_AND_FREE(SideDistance_Shared_Win) + CALL UNLOCK_AND_FREE(SideNormVec_Shared_Win) + + ! BuildLinearSideBaseVectors() + CALL UNLOCK_AND_FREE(BaseVectors0_Shared_Win) + CALL UNLOCK_AND_FREE(BaseVectors1_Shared_Win) + CALL UNLOCK_AND_FREE(BaseVectors2_Shared_Win) + CALL UNLOCK_AND_FREE(BaseVectors3_Shared_Win) + CALL UNLOCK_AND_FREE(BaseVectorsScale_Shared_Win) + END IF ! .NOT.UsePhotonTriaTracking + ! BuildElementRadiusTria() CALL UNLOCK_AND_FREE(ElemBaryNGeo_Shared_Win) CALL UNLOCK_AND_FREE(ElemRadius2NGeo_Shared_Win) @@ -817,6 +779,25 @@ SUBROUTINE FinalizeParticleMesh() END IF !PerformLoadBalance #endif /*USE_LOADBALANCE*/ + IF(.NOT.UsePhotonTriaTracking)THEN + ! GetSideSlabNormalsAndIntervals() + ADEALLOCATE(SideSlabNormals_Shared) + ADEALLOCATE(SideSlabIntervals_Shared) + ADEALLOCATE(BoundingBoxIsEmpty_Shared) + + ! IdentifyElemAndSideType() + ADEALLOCATE(SideType_Shared) + ADEALLOCATE(SideDistance_Shared) + ADEALLOCATE(SideNormVec_Shared) + + ! BuildLinearSideBaseVectors() + ADEALLOCATE(BaseVectors0_Shared) + ADEALLOCATE(BaseVectors1_Shared) + ADEALLOCATE(BaseVectors2_Shared) + ADEALLOCATE(BaseVectors3_Shared) + ADEALLOCATE(BaseVectorsScale_Shared) + END IF ! .NOT.UsePhotonTriaTracking + ! BuildElementRadiusTria ADEALLOCATE(ElemBaryNGeo_Shared) ADEALLOCATE(ElemRadius2NGEO_Shared) diff --git a/src/particles/particle_mesh/particle_mesh_build.f90 b/src/particles/particle_mesh/particle_mesh_build.f90 index 190c28f36..e49103c4c 100644 --- a/src/particles/particle_mesh/particle_mesh_build.f90 +++ b/src/particles/particle_mesh/particle_mesh_build.f90 @@ -28,6 +28,7 @@ MODULE MOD_Particle_Mesh_Build PUBLIC:: BuildElementRadiusTria,BuildElemTypeAndBasisTria,BuildEpsOneCell,BuildBCElemDistance PUBLIC:: BuildNodeNeighbourhood,BuildElementOriginShared,BuildElementBasisAndRadius PUBLIC:: BuildSideOriginAndRadius,BuildLinearSideBaseVectors, BuildMesh2DInfo +PUBLIC:: BuildSideSlabAndBoundingBox !=================================================================================================================================== CONTAINS @@ -262,6 +263,7 @@ SUBROUTINE BuildElemTypeAndBasisTria() #if USE_LOADBALANCE USE MOD_LoadBalance_Vars ,ONLY: PerformLoadBalance #endif /*USE_LOADBALANCE*/ +USE MOD_Photon_TrackingVars ,ONLY: UsePhotonTriaTracking ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------! @@ -282,32 +284,40 @@ SUBROUTINE BuildElemTypeAndBasisTria() ! elements #if USE_MPI -CALL Allocate_Shared((/nComputeNodeTotalElems/),ElemCurved_Shared_Win,ElemCurved_Shared) -CALL MPI_WIN_LOCK_ALL(0,ElemCurved_Shared_Win,IERROR) +IF(UsePhotonTriaTracking)THEN + CALL Allocate_Shared((/nComputeNodeTotalElems/),ElemCurved_Shared_Win,ElemCurved_Shared) + CALL MPI_WIN_LOCK_ALL(0,ElemCurved_Shared_Win,IERROR) +END IF ! UsePhotonTriaTracking CALL Allocate_Shared((/3,6,nComputeNodeTotalElems/),XiEtaZetaBasis_Shared_Win,XiEtaZetaBasis_Shared) CALL MPI_WIN_LOCK_ALL(0,XiEtaZetaBasis_Shared_Win,IERROR) CALL Allocate_Shared((/6,nComputeNodeTotalElems/),slenXiEtaZetaBasis_Shared_Win,slenXiEtaZetaBasis_Shared) CALL MPI_WIN_LOCK_ALL(0,slenXiEtaZetaBasis_Shared_Win,IERROR) -ElemCurved => ElemCurved_Shared +IF(UsePhotonTriaTracking)THEN + ElemCurved => ElemCurved_Shared +END IF ! UsePhotonTriaTracking XiEtaZetaBasis => XiEtaZetaBasis_Shared slenXiEtaZetaBasis => slenXiEtaZetaBasis_Shared ASSOCIATE(XCL_NGeo => XCL_NGeo_Shared) #else -ALLOCATE(ElemCurved( 1:nElems) & - ,XiEtaZetaBasis(1:3,1:6,1:nElems) & - ,slenXiEtaZetaBasis(1:6,1:nElems)) +IF(UsePhotonTriaTracking)THEN + ALLOCATE(ElemCurved( 1:nElems)) +END IF ! UsePhotonTriaTracking +ALLOCATE(XiEtaZetaBasis(1:3,1:6,1:nElems)) +ALLOCATE(slenXiEtaZetaBasis(1:6,1:nElems)) #endif /*USE_MPI*/ -! only CN root nullifies +IF(UsePhotonTriaTracking)THEN + ! only CN root nullifies #if USE_MPI -IF (myComputeNodeRank.EQ.0) THEN + IF (myComputeNodeRank.EQ.0) THEN #endif /*USE_MPI*/ - ElemCurved = .FALSE. + ElemCurved = .FALSE. #if USE_MPI -END IF + END IF #endif /*USE_MPI*/ +END IF ! UsePhotonTriaTracking #if USE_MPI firstElem = INT(REAL( myComputeNodeRank )*REAL(nComputeNodeTotalElems)/REAL(nComputeNodeProcessors))+1 @@ -347,7 +357,9 @@ SUBROUTINE BuildElemTypeAndBasisTria() #if USE_MPI END ASSOCIATE -CALL BARRIER_AND_SYNC(ElemCurved_Shared_Win ,MPI_COMM_SHARED) +IF(UsePhotonTriaTracking)THEN + CALL BARRIER_AND_SYNC(ElemCurved_Shared_Win ,MPI_COMM_SHARED) +END IF ! UsePhotonTriaTracking CALL BARRIER_AND_SYNC(XiEtaZetaBasis_Shared_Win ,MPI_COMM_SHARED) CALL BARRIER_AND_SYNC(slenXiEtaZetaBasis_Shared_Win,MPI_COMM_SHARED) #endif /*USE_MPI*/ @@ -1760,4 +1772,117 @@ SUBROUTINE BuildLinearSideBaseVectors() END SUBROUTINE BuildLinearSideBaseVectors +!=================================================================================================================================== +!> Builds SideSlabNormals_Shared, SideSlabIntervals_Shared and BoundingBoxIsEmpty_Shared from Bezier control points +!=================================================================================================================================== +SUBROUTINE BuildSideSlabAndBoundingBox() +! MODULES +USE MOD_Globals +USE MOD_Preproc +USE MOD_Particle_Mesh_Vars +USE MOD_Particle_Surfaces_Vars ,ONLY: BezierControlPoints3D,BezierControlPoints3DElevated,SideSlabNormals,SideSlabIntervals +USE MOD_Particle_Surfaces_Vars ,ONLY: BoundingBoxIsEmpty,BezierElevation +USE MOD_Mesh_Tools ,ONLY: GetCNElemID,GetGlobalSideID +USE MOD_Mesh_Vars ,ONLY: NGeo,NGeoElevated +USE MOD_Particle_Surfaces ,ONLY: GetSideSlabNormalsAndIntervals +#if USE_MPI +USE MOD_MPI_Shared +USE MOD_MPI_Shared_Vars +#endif /* USE_MPI */ +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------! +! INPUT / OUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +INTEGER :: firstSide,lastSide,iSide,SideID +#if !USE_MPI +INTEGER :: ALLOCSTAT +#endif +#ifdef CODE_ANALYZE +! TODO +! REAL :: dx,dy,dz +#endif /*CODE_ANALYZE*/ +!=================================================================================================================================== + +#if USE_MPI +CALL Allocate_Shared((/3,3,nComputeNodeTotalSides/),SideSlabNormals_Shared_Win,SideSlabNormals_Shared) +CALL MPI_WIN_LOCK_ALL(0,SideSlabNormals_Shared_Win,IERROR) +CALL Allocate_Shared((/6,nComputeNodeTotalSides/),SideSlabIntervals_Shared_Win,SideSlabIntervals_Shared) +CALL MPI_WIN_LOCK_ALL(0,SideSlabIntervals_Shared_Win,IERROR) +CALL Allocate_Shared((/nComputeNodeTotalSides/),BoundingBoxIsEmpty_Shared_Win,BoundingBoxIsEmpty_Shared) +CALL MPI_WIN_LOCK_ALL(0,BoundingBoxIsEmpty_Shared_Win,IERROR) +firstSide = INT(REAL (myComputeNodeRank )*REAL(nComputeNodeTotalSides)/REAL(nComputeNodeProcessors))+1 +lastSide = INT(REAL((myComputeNodeRank+1))*REAL(nComputeNodeTotalSides)/REAL(nComputeNodeProcessors)) +SideSlabNormals => SideSlabNormals_Shared +SideSlabIntervals => SideSlabIntervals_Shared +BoundingBoxIsEmpty => BoundingBoxIsEmpty_Shared +CALL MPI_BARRIER(MPI_COMM_SHARED,iError) +#else +ALLOCATE(SideSlabNormals(1:3,1:3,1:nNonUniqueGlobalSides) & + ,SideSlabIntervals( 1:6,1:nNonUniqueGlobalSides) & + ,BoundingBoxIsEmpty( 1:nNonUniqueGlobalSides) & + ,STAT=ALLOCSTAT) +IF (ALLOCSTAT.NE.0) CALL ABORT(__STAMP__,' Cannot allocate SideMetrics arrays!') +firstSide = 1 +lastSide = nNonUniqueGlobalSides +#endif /* USE_MPI */ +! TODO: bounding box volumes must be calculated for all unique sides. +!#ifdef CODE_ANALYZE +! ALLOCATE(SideBoundingBoxVolume(nSides)) +!#endif /*CODE_ANALYZE*/ + +IF (BezierElevation.GT.0) THEN + DO iSide = firstSide,LastSide + ! ignore sides that are not on the compute node + ! IF (GetCNElemID(SideInfo_Shared(SIDE_ELEMID,iSide)).EQ.-1) CYCLE + + SideID = GetGlobalSideID(iSide) + + ! Ignore small mortar sides attached to big mortar sides + IF (SideInfo_Shared(SIDE_LOCALID,SideID).LT.1 .OR. SideInfo_Shared(SIDE_LOCALID,SideID).GT.6) CYCLE + + ! BezierControlPoints are always on nonUniqueGlobalSide + CALL GetSideSlabNormalsAndIntervals(BezierControlPoints3DElevated(1:3,0:NGeoElevated,0:NGeoElevated,SideID) & + ,SideSlabNormals( 1:3,1:3,iSide) & + ,SideSlabInterVals( 1:6 ,iSide) & + ,BoundingBoxIsEmpty(iSide)) + END DO +ELSE + DO iSide=firstSide,LastSide + ! ignore sides that are not on the compute node + ! IF (GetCNElemID(SideInfo_Shared(SIDE_ELEMID,iSide)).EQ.-1) CYCLE + + SideID = GetGlobalSideID(iSide) + + ! Ignore small mortar sides attached to big mortar sides + IF (SideInfo_Shared(SIDE_LOCALID,SideID).LT.1 .OR. SideInfo_Shared(SIDE_LOCALID,SideID).GT.6) CYCLE + + ! BezierControlPoints are always on nonUniqueGlobalSide + CALL GetSideSlabNormalsAndIntervals(BezierControlPoints3D(1:3,0:NGeo,0:NGeo,SideID) & + ,SideSlabNormals( 1:3,1:3,iSide) & + ,SideSlabInterVals( 1:6 ,iSide) & + ,BoundingBoxIsEmpty(iSide)) + END DO +END IF +#if USE_MPI +CALL BARRIER_AND_SYNC(SideSlabNormals_Shared_Win ,MPI_COMM_SHARED) +CALL BARRIER_AND_SYNC(SideSlabIntervals_Shared_Win ,MPI_COMM_SHARED) +CALL BARRIER_AND_SYNC(BoundingBoxIsEmpty_Shared_Win,MPI_COMM_SHARED) +#endif /* USE_MPI */ +!#ifdef CODE_ANALYZE +! TODO: bounding box volumes must be calculated for all unique sides. +! offsetSideID = ElemInfo_Shared(SideIf +! DO iSide=offsetMPISides_YOUR,LastSide +! dx=ABS(SideSlabIntervals(2)-SideSlabIntervals(1)) +! dy=ABS(SideSlabIntervals(4)-SideSlabIntervals(3)) +! dz=ABS(SideSlabIntervals(6)-SideSlabIntervals(5)) +! SideID = SideInfo +! SideBoundingBoxVolume(SideID)=dx*dy*dz +! END DO +!#endif /*CODE_ANALYZE*/ + + +END SUBROUTINE BuildSideSlabAndBoundingBox + + END MODULE MOD_Particle_Mesh_Build diff --git a/src/particles/tracking/particle_intersection.f90 b/src/particles/tracking/particle_intersection.f90 index db8b14e12..ef06ae9bd 100644 --- a/src/particles/tracking/particle_intersection.f90 +++ b/src/particles/tracking/particle_intersection.f90 @@ -54,6 +54,7 @@ MODULE MOD_Particle_InterSection #ifdef CODE_ANALYZE PUBLIC :: OutputTrajectory #endif /*CODE_ANALYZE*/ +PUBLIC :: ComputeXi,ComputeSurfaceDistance2 !----------------------------------------------------------------------------------------------------------------------------------- !----------------------------------------------------------------------------------------------------------------------------------- !=================================================================================================================================== @@ -769,9 +770,9 @@ SUBROUTINE ComputeBiLinearIntersection(isHit,PartTrajectory,lengthPartTrajectory NormalCoeff(:,4) = BiLinearCoeff(:,4) - SUM(BiLinearCoeff(:,4)*PartTrajectory(:))*PartTrajectory ! A1 is X_xz = X_z - X_x -a1(:) = NormalCoeff(3,:) - NormalCoeff(1,:) +A1(:) = NormalCoeff(3,:) - NormalCoeff(1,:) ! A2 is X_yz = X_z - X_y -a2(:) = NormalCoeff(3,:) - NormalCoeff(2,:) +A2(:) = NormalCoeff(3,:) - NormalCoeff(2,:) ! Bring into quadratic form A = a1(1)*a2(3) - a2(1)*a1(3) @@ -799,11 +800,11 @@ SUBROUTINE ComputeBiLinearIntersection(isHit,PartTrajectory,lengthPartTrajectory ! nRoot equals the number of possible intersections with the bilinear surface. However, only values between [-1,1] are valid SELECT CASE(nRoot) ! No intersection - CASE(0) + CASE(0) ! nRoot = 0 RETURN ! One possible intersection - CASE(1) + CASE(1) ! nRoot = 1 #ifdef CODE_ANALYZE IF(PARTOUT.GT.0 .AND. MPIRANKOUT.EQ.MyRank)THEN IF(PartID.EQ.PARTOUT)THEN @@ -870,7 +871,7 @@ SUBROUTINE ComputeBiLinearIntersection(isHit,PartTrajectory,lengthPartTrajectory RETURN END IF ! ABS(eta(1)).LE.1.0 - CASE(2) + CASE(2) ! nRoot = 2 #ifdef CODE_ANALYZE IF(PARTOUT.GT.0 .AND. MPIRANKOUT.EQ.MyRank)THEN IF(PartID.EQ.PARTOUT)THEN diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 index c44c72ef4..1ecfdd6fe 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 @@ -270,7 +270,7 @@ SUBROUTINE PhotonTriaTracking() USE MOD_Globals USE MOD_Particle_Mesh_Vars USE MOD_Particle_Boundary_Vars ,ONLY: PartBound -USE MOD_Photon_TrackingVars ,ONLY: PhotonProps,PhotonModeBPO +USE MOD_Photon_TrackingVars ,ONLY: PhotonProps,PhotonModeBPO,UsePhotonTriaTracking USE MOD_RadiationTrans_Vars ,ONLY: RadObservation_Emission, RadObservationPointMethod, RadObservation_EmissionPart USE MOD_Photon_TrackingTools ,ONLY: PhotonThroughSideCheck3DFast, PhotonIntersectionWithSide,CalcAbsoprtion,PhotonOnLineOfSight USE MOD_Photon_TrackingTools ,ONLY: PerfectPhotonReflection, DiffusePhotonReflection, CalcWallAbsoprtion, PointInObsCone @@ -281,6 +281,8 @@ SUBROUTINE PhotonTriaTracking() USE MOD_Particle_Tracking_Vars ,ONLY: NbrOfLostParticles,DisplayLostParticles USE MOD_RadiationTrans_Vars ,ONLY: RadiationAbsorptionModel USE MOD_RayTracing_Vars ,ONLY: RayForceAbsorption +USE MOD_Particle_Mesh_Tools ,ONLY: GetGlobalNonUniqueSideID +USE MOD_Mesh_Vars ,ONLY: SideToElem IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES @@ -299,8 +301,10 @@ SUBROUTINE PhotonTriaTracking() LOGICAL :: ThroughSide, Done LOGICAL :: oldElemIsMortar, isMortarSideTemp(1:6), doCheckSide REAL :: minRatio, intersecDist, intersecDistVec(3) -REAL :: IntersectionPos(1:3), IntersectionPosTemp(1:3) +REAL :: IntersectionPos(1:3), IntersectionPosTemp(1:3), PartTrajectory(1:3),lengthPartTrajectory LOGICAL :: PhotonLost +LOGICAL :: foundHit +REAL :: alpha,xi,eta !=================================================================================================================================== Done = .FALSE. ElemID = PhotonProps%ElemID @@ -318,7 +322,7 @@ SUBROUTINE PhotonTriaTracking() GlobSideTemp = 0 isMortarSideTemp = .FALSE. nlocSides = ElemInfo_Shared(ELEM_LASTSIDEIND,ElemID) - ElemInfo_Shared(ELEM_FIRSTSIDEIND,ElemID) - DO iLocSide=1,nlocSides + LocSideLoop: DO iLocSide=1,nlocSides TempSideID = ElemInfo_Shared(ELEM_FIRSTSIDEIND,ElemID) + iLocSide localSideID = SideInfo_Shared(SIDE_LOCALID,TempSideID) ! Side is not one of the 6 local sides @@ -352,20 +356,57 @@ SUBROUTINE PhotonTriaTracking() END DO END DO ELSE ! Regular side - DO TriNum = 1,2 - ThroughSide = .FALSE. - CALL PhotonThroughSideCheck3DFast(localSideID,ElemID,ThroughSide,TriNum) - IF (ThroughSide) THEN + IF(UsePhotonTriaTracking)THEN + DO TriNum = 1,2 + ThroughSide = .FALSE. + CALL PhotonThroughSideCheck3DFast(localSideID,ElemID,ThroughSide,TriNum) + IF (ThroughSide) THEN + NrOfThroughSides = NrOfThroughSides + 1 + LocSidesTemp(NrOfThroughSides) = localSideID + TriNumTemp(NrOfThroughSides) = TriNum + GlobSideTemp(NrOfThroughSides) = TempSideID + SideID = TempSideID + LocalSide = localSideID + END IF + END DO + ELSE ! Use bilinear tracing algorithm for intersection calculation + PartTrajectory = PhotonProps%PhotonDirection + PhotonProps%PhotonPos = PhotonProps%PhotonStartPos + PhotonProps%PhotonDirection + !PartTrajectory = PhotonProps%PhotonStartPos - PhotonProps%PhotonLastPos + lengthPartTrajectory=SQRT(DOT_PRODUCT(PartTrajectory,PartTrajectory)) + PartTrajectory = PartTrajectory/lengthPartTrajectory + SideID = GetGlobalNonUniqueSideID(ElemID,localSideID) + ! INPUT VARIABLES + ! PartTrajectory + ! lengthPartTrajectory + ! PartID,SideID + ! ElemCheck_Opt + ! alpha2 + !----------------------------------------------------------------------------------------------------------------------------------- + ! OUTPUT VARIABLES + !alpha,xitild,etatild + !isHit + !CALL ComputeBiLinearIntersection(foundHit,PartTrajectory,lengthPartTrajectory,locAlpha,xi,eta,iPart,SideID,alpha2=currentIntersect%alpha) + CALL PhotonComputeBiLinearIntersection(foundHit,PartTrajectory,lengthPartTrajectory,alpha,xi,eta,-1,SideID,LastPartPos_IN=PhotonProps%PhotonStartPos) + IF(foundHit)THEN + IntersectionPos = PhotonProps%PhotonStartPos + alpha * PartTrajectory + IF(VECNORM(IntersectionPos-PhotonProps%PhotonStartPos).LE.1e-16)THEN + foundHit=.FALSE. + CYCLE LocSideLoop + END IF ! VECNORM(IntersectionPos-PhotonProps%PhotonStartPos).LE.1e-16 NrOfThroughSides = NrOfThroughSides + 1 - LocSidesTemp(NrOfThroughSides) = localSideID - TriNumTemp(NrOfThroughSides) = TriNum - GlobSideTemp(NrOfThroughSides) = TempSideID - SideID = TempSideID + PhotonProps%PhotonLastPos = IntersectionPos + PhotonLost = .FALSE. LocalSide = localSideID - END IF - END DO + TriNum=1 + EXIT LocSideLoop + ELSE + PhotonLost = .TRUE. + END IF ! foundHit + END IF ! UsePhotonTriaTracking END IF ! Mortar or regular side - END DO ! iLocSide=1,6 + END DO LocSideLoop ! iLocSide=1,6 + TriNum = TriNumTemp(1) ! ---------------------------------------------------------------------------- ! Additional treatment if particle did not cross any sides or it crossed multiple sides @@ -559,6 +600,7 @@ SUBROUTINE PhotonTriaTracking() ELSE ! Diffuse reflection IF (NrOfThroughSides.LT.2) THEN + IF(.NOT.UsePhotonTriaTracking) TriNum=1 CALL DiffusePhotonReflection(LocalSide,ElemID,TriNum, IntersectionPos, .FALSE.) ELSE CALL DiffusePhotonReflection(LocalSide,ElemID,TriNum, IntersectionPos, .TRUE.) @@ -629,9 +671,10 @@ SUBROUTINE PhotonTriaTracking() IF (oldElemIsMortar) THEN ElemID = SideInfo_Shared(SIDE_ELEMID,SideID) - CALL PhotonIntersectionWithSide(LocalSide,ElemID,TriNum, IntersectionPos, PhotonLost,.TRUE.) + CALL PhotonIntersectionWithSide(LocalSide,ElemID,TriNum, IntersectionPos, PhotonLost, IsMortar=.TRUE.) ELSE - CALL PhotonIntersectionWithSide(LocalSide,ElemID,TriNum, IntersectionPos, PhotonLost) + ! For bilinear tracing, the intersection point is already calculated by the tracking algorithm itself + IF(UsePhotonTriaTracking) CALL PhotonIntersectionWithSide(LocalSide,ElemID,TriNum, IntersectionPos, PhotonLost) END IF ! Check if lost during intersection @@ -871,4 +914,400 @@ SUBROUTINE Photon2DSymTracking() END DO ! .NOT.PartisDone END SUBROUTINE Photon2DSymTracking +SUBROUTINE PhotonComputeBiLinearIntersection(isHit,PartTrajectory,lengthPartTrajectory,alpha,xitild,etatild & + ,PartID,SideID,ElemCheck_Opt,alpha2,LastPartPos_IN) +!=================================================================================================================================== +! Compute the Intersection with planar surface, improved version by +! Haselbacher, A.; Najjar, F. M. & Ferry, J. P., An efficient and robust particle-localization algorithm for unstructured grids +! Journal of Computational Physics, Elsevier BV, 2007, 225, 2198-2213 +!=================================================================================================================================== +! MODULES +USE MOD_Globals +USE MOD_Utils ,ONLY: QuadraticSolver +USE MOD_Mesh_Tools ,ONLY: GetCNSideID +USE MOD_Particle_Mesh_Vars ,ONLY: SideInfo_Shared +USE MOD_Particle_Surfaces_Vars ,ONLY: BaseVectors0,BaseVectors1,BaseVectors2,BaseVectors3,SideNormVec,epsilonTol!,BaseVectorsScale +USE MOD_Particle_Surfaces ,ONLY: CalcNormAndTangBilinear +USE MOD_Particle_Tracking_Vars ,ONLY: TrackingMethod +USE MOD_Particle_Vars ,ONLY: PartState,LastPartPos!,PEM +#ifdef CODE_ANALYZE +USE MOD_Particle_Surfaces_Vars ,ONLY: BezierControlPoints3D +USE MOD_Particle_Tracking_Vars ,ONLY: PartOut,MPIRankOut +USE MOD_Mesh_Vars ,ONLY: NGeo +#endif /*CODE_ANALYZE*/ +#if USE_MPI +!USE MOD_Mesh_Vars ,ONLY: BC +#endif /*USE_MPI*/ +USE MOD_Particle_Intersection ,ONLY: ComputeXi,ComputeSurfaceDistance2 +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES +REAL,INTENT(IN),DIMENSION(1:3) :: PartTrajectory +REAL,INTENT(IN) :: lengthPartTrajectory +INTEGER,INTENT(IN) :: PartID,SideID +LOGICAL,INTENT(IN),OPTIONAL :: ElemCheck_Opt +REAL,INTENT(IN),OPTIONAL :: alpha2 +REAL,INTENT(IN),OPTIONAL :: LastPartPos_IN(1:3) +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +REAL,INTENT(OUT) :: alpha,xitild,etatild +LOGICAL,INTENT(OUT) :: isHit +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +REAL,DIMENSION(4) :: a1,a2 +REAL,DIMENSION(1:3,1:4) :: BiLinearCoeff,NormalCoeff +REAL :: A,B,C,alphaNorm +REAL :: xi(2),eta(2),t(2),scaleFac +INTEGER :: CNSideID,InterType,nRoot +LOGICAL :: ElemCheck +!=================================================================================================================================== + +! set alpha to minus one // no intersection +alpha = -1.0 +xitild = -2.0 +etatild = -2.0 +isHit = .FALSE. +CNSideID = GetCNSideID(SideID) + +! compute initial vectors +BiLinearCoeff(:,1) = 0.25*BaseVectors3(:,SideID) +BiLinearCoeff(:,2) = 0.25*BaseVectors1(:,SideID) +BiLinearCoeff(:,3) = 0.25*BaseVectors2(:,SideID) +BiLinearCoeff(:,4) = 0.25*BaseVectors0(:,SideID) + +#ifdef CODE_ANALYZE + IF(PARTOUT.GT.0 .AND. MPIRANKOUT.EQ.MyRank)THEN + IF(PartID.EQ.PARTOUT)THEN + WRITE(UNIT_stdout,'(110("-"))') + WRITE(UNIT_stdout,'(A)') ' | Output of bilinear intersection equation constants: ' + WRITE(UNIT_stdout,'(A,3(1X,G0))') ' | SideNormVec : ',SideNormVec(1:3,CNSideID) + WRITE(UNIT_stdout,'(A,4(1X,G0))') ' | BilinearCoeff: ',BilinearCoeff(1,1:4) + WRITE(UNIT_stdout,'(A,4(1X,G0))') ' | BilinearCoeff: ',BilinearCoeff(2,1:4) + WRITE(UNIT_stdout,'(A,4(1X,G0))') ' | BilinearCoeff: ',BilinearCoeff(3,1:4) + WRITE(UNIT_stdout,'(A,3(1X,G0))') ' | Beziercontrolpoint1: ',BezierControlPoints3D(:,0,0,SideID) + WRITE(UNIT_stdout,'(A,3(1X,G0))') ' | Beziercontrolpoint2: ',BezierControlPoints3D(:,NGeo,0,SideID) + WRITE(UNIT_stdout,'(A,3(1X,G0))') ' | Beziercontrolpoint3: ',BezierControlPoints3D(:,0,NGeo,SideID) + WRITE(UNIT_stdout,'(A,3(1X,G0))') ' | Beziercontrolpoint4: ',BezierControlPoints3D(:,NGeo,NGeo,SideID) + END IF + END IF +#endif /*CODE_ANALYZE*/ + +! Check if the site can be encountered. Both vectors are already normalized +scaleFac = DOT_PRODUCT(PartTrajectory,SideNormVec(1:3,CNSideID)) +IF (ABS(scaleFac).LT.epsilontol) RETURN + +! Haselbacher et al. define d = d - r_p +IF(PRESENT(LastPartPos_IN))THEN + BiLinearCoeff(:,4) = BiLinearCoeff(:,4) - LastPartPos_IN(1:3) +ELSE + BiLinearCoeff(:,4) = BiLinearCoeff(:,4) - LastPartPos(:,PartID) +END IF ! PRESENT(LastPartPos_IN) + +! Calculate component normal to ray +NormalCoeff(:,1) = BiLinearCoeff(:,1) - SUM(BiLinearCoeff(:,1)*PartTrajectory(:))*PartTrajectory +NormalCoeff(:,2) = BiLinearCoeff(:,2) - SUM(BiLinearCoeff(:,2)*PartTrajectory(:))*PartTrajectory +NormalCoeff(:,3) = BiLinearCoeff(:,3) - SUM(BiLinearCoeff(:,3)*PartTrajectory(:))*PartTrajectory +NormalCoeff(:,4) = BiLinearCoeff(:,4) - SUM(BiLinearCoeff(:,4)*PartTrajectory(:))*PartTrajectory + +! A1 is X_xz = X_z - X_x +A1(:) = NormalCoeff(3,:) - NormalCoeff(1,:) +! A2 is X_yz = X_z - X_y +A2(:) = NormalCoeff(3,:) - NormalCoeff(2,:) + +! Bring into quadratic form +A = a1(1)*a2(3) - a2(1)*a1(3) +B = a1(1)*a2(4) - a2(1)*a1(4) + a1(2)*a2(3) - a2(2)*a1(3) +C = a1(2)*a2(4) - a2(2)*a1(4) + +! Scale with ^2 and cell-scale (~area) for getting coefficients at least approx. in the order of 1 +!scaleFac = scaleFac**2 * BaseVectorsScale(SideID) !<...>^2 * cell-scale +!scaleFac = 1./scaleFac +!A = A * scaleFac +!B = B * scaleFac +!C = C * scaleFac + +CALL QuadraticSolver(A,B,C,nRoot,Eta(1),Eta(2)) + +#ifdef CODE_ANALYZE + IF(PARTOUT.GT.0 .AND. MPIRANKOUT.EQ.MyRank)THEN + IF(PartID.EQ.PARTOUT)THEN + WRITE(UNIT_stdout,'(A)') ' | Output after QuadraticSolver: ' + WRITE(UNIT_stdout,'(A,I0,A,2(1X,G0))') ' | number of root: ',nRoot,' | Eta: ',Eta(1:2) + END IF + END IF +#endif /*CODE_ANALYZE*/ + +! nRoot equals the number of possible intersections with the bilinear surface. However, only values between [-1,1] are valid +SELECT CASE(nRoot) + ! No intersection + CASE(0) ! nRoot = 0 + RETURN + + ! One possible intersection + CASE(1) ! nRoot = 1 +#ifdef CODE_ANALYZE + IF(PARTOUT.GT.0 .AND. MPIRANKOUT.EQ.MyRank)THEN + IF(PartID.EQ.PARTOUT)THEN + WRITE(UNIT_stdout,'(A)') ' | nRoot = 1 ' + END IF + END IF +#endif /*CODE_ANALYZE*/ + ! Check if eta is valid + IF (ABS(eta(1)).LE.1.0) THEN + ! check for Xi only, if eta is possible + xi(1) = ComputeXi(eta(1),A1=A1,A2=A2) + + IF (Xi(1).EQ.HUGE(1.)) THEN + return + IPWRITE(UNIT_stdOut,'(I0,A,I0)') ' Both denominators zero when calculating Xi in bilinear intersection' + IPWRITE(UNIT_stdOut,'(I0,A,I0)') ' PartID: ', PartID + IPWRITE(UNIT_stdOut,'(I0,A,I0)') ' global SideID: ', SideID + IPWRITE(UNIT_stdOut,'(I0,A,I0)') ' global ElemID: ', SideInfo_Shared(SIDE_ELEMID,SideID) + IPWRITE(UNIT_stdOut,'(I0,A,3(1X,ES25.17E3))') ' LastPartPos: ', LastPartPos(1:3,PartID) + IPWRITE(UNIT_stdOut,'(I0,A,3(1X,ES25.17E3))') ' PartPos: ', PartState (1:3,PartID) + CALL ABORT(__STAMP__,'Invalid intersection with bilinear side!',SideID) + END IF + + IF( ABS(xi(1)).LE.1.0) THEN + ! compute alpha only with valid xi and eta + t(1) = ComputeSurfaceDistance2(BiLinearCoeff,xi(1),eta(1),PartTrajectory) + + IF (PRESENT(alpha2)) THEN + IF (alpha2.GT.-1.0 .AND. ALMOSTEQUAL(t(1),alpha2)) THEN + t(1) = -1.0 +#ifdef CODE_ANALYZE + IF(PARTOUT.GT.0 .AND. MPIRANKOUT.EQ.MyRank)THEN + IF(PartID.EQ.PARTOUT)THEN + WRITE(UNIT_stdout,'(A)') 'changed t1' + END IF + END IF +#endif /*CODE_ANALYZE*/ + END IF + END IF + + ! Normalize alpha to unitLength + alphaNorm = t(1)/lengthPartTrajectory + + IF ((alphaNorm.LE.1.0) .AND.(alphaNorm.GE.0.)) THEN + alpha = t(1) + xitild = xi(1) + etatild = eta(1) + isHit = .TRUE. +#ifdef CODE_ANALYZE + IF(PARTOUT.GT.0 .AND. MPIRANKOUT.EQ.MyRank)THEN + IF(PartID.EQ.PARTOUT)THEN + WRITE(UNIT_stdout,'(A,G0,A,G0)') ' | alphanorm: ',alphaNorm,' | epsilonTolerance: ',epsilontol + END IF + END IF +#endif /*CODE_ANALYZE*/ + ! This is the only possible intersection, so we are done + RETURN + ELSE ! t is not in range + RETURN + END IF + ELSE ! xi not in range + RETURN + END IF ! ABS(xi(1)).LE.1.0 + ELSE ! eta not in range + RETURN + END IF ! ABS(eta(1)).LE.1.0 + + CASE(2) ! nRoot = 2 +#ifdef CODE_ANALYZE + IF(PARTOUT.GT.0 .AND. MPIRANKOUT.EQ.MyRank)THEN + IF(PartID.EQ.PARTOUT)THEN + WRITE(UNIT_stdout,'(A)') ' | nRoot = 2 ' + END IF + END IF +#endif /*CODE_ANALYZE*/ + InterType = 0 + t(:) =-1. + + ! Check if eta(1)) is valid + IF (ABS(eta(1)).LE.1.0) THEN + ! check for Xi only, if eta is possible + xi(1) = ComputeXi(eta(1),A1=A1,A2=A2) + + IF (Xi(1).EQ.HUGE(1.)) THEN + return + IPWRITE(UNIT_stdOut,'(I0,A,I0)') ' Both denominators zero when calculating Xi in bilinear intersection' + IPWRITE(UNIT_stdOut,'(I0,A,I0)') ' PartID: ', PartID + IPWRITE(UNIT_stdOut,'(I0,A,I0)') ' global SideID: ', SideID + IPWRITE(UNIT_stdOut,'(I0,A,I0)') ' global ElemID: ', SideInfo_Shared(SIDE_ELEMID,SideID) + IPWRITE(UNIT_stdOut,'(I0,A,3(1X,ES25.17E3))') ' LastPartPos: ', LastPartPos(1:3,PartID) + IPWRITE(UNIT_stdOut,'(I0,A,3(1X,ES25.17E3))') ' PartPos: ', PartState (1:3,PartID) + CALL ABORT(__STAMP__,'Invalid intersection with bilinear side!',SideID) + END IF + + IF( ABS(xi(1)).LE.1.0) THEN + ! compute alpha only with valid xi and eta + t(1) = ComputeSurfaceDistance2(BiLinearCoeff,xi(1),eta(1),PartTrajectory) + + IF (PRESENT(alpha2)) THEN + IF (alpha2.GT.-1.0 .AND. ALMOSTEQUAL(t(1),alpha2)) THEN +#ifdef CODE_ANALYZE + IF(PARTOUT.GT.0 .AND. MPIRANKOUT.EQ.MyRank)THEN + IF(PartID.EQ.PARTOUT)THEN + WRITE(UNIT_stdout,'(A)') 'changed t1' + END IF + END IF +#endif /*CODE_ANALYZE*/ + t(1) = -1.0 + END IF + END IF + + ! Normalize alpha to unitLength + alphaNorm = t(1)/lengthPartTrajectory + +#ifdef CODE_ANALYZE + IF(PARTOUT.GT.0 .AND. MPIRANKOUT.EQ.MyRank)THEN + IF(PartID.EQ.PARTOUT)THEN + WRITE(UNIT_stdout,'(A,G0,A,G0,A,G0)') ' | xi: ',xi(1),' | t: ',t(1),' | alphaNorm: ',alphaNorm + END IF + END IF +#endif /*CODE_ANALYZE*/ + + IF ((alphaNorm.LE.1.0) .AND.(alphaNorm.GE.0.)) THEN + InterType = InterType+1 + isHit = .TRUE. +#ifdef CODE_ANALYZE + IF(PARTOUT.GT.0 .AND. MPIRANKOUT.EQ.MyRank)THEN + IF(PartID.EQ.PARTOUT)THEN + WRITE(UNIT_stdout,'(A,E15.8,A,E15.8)') ' | alphanorm1: ',alphaNorm,' | epsilonTolerance: ',epsilontol + END IF + END IF +#endif /*CODE_ANALYZE*/ + END IF + END IF ! ABS(xi(1)).LE.1.0 + END IF ! ABS(eta(1)).LE.1.0 + + ! Check if eta(2) is valid + IF (ABS(eta(2)).LE.1.0) THEN + ! check for Xi only, if eta is possible + xi(2) = ComputeXi(eta(2),A1=A1,A2=A2) + + IF (Xi(2).EQ.HUGE(1.)) THEN + return + IPWRITE(UNIT_stdOut,'(I0,A,I0)') ' Both denominators zero when calculating Xi in bilinear intersection' + IPWRITE(UNIT_stdOut,'(I0,A,I0)') ' PartID: ', PartID + IPWRITE(UNIT_stdOut,'(I0,A,I0)') ' global SideID: ', SideID + IPWRITE(UNIT_stdOut,'(I0,A,I0)') ' global ElemID: ', SideInfo_Shared(SIDE_ELEMID,SideID) + IPWRITE(UNIT_stdOut,'(I0,A,3(1X,ES25.17E3))') ' LastPartPos: ', LastPartPos(1:3,PartID) + IPWRITE(UNIT_stdOut,'(I0,A,3(1X,ES25.17E3))') ' PartPos: ', PartState (1:3,PartID) + CALL ABORT(__STAMP__,'Invalid intersection with bilinear side!',SideID) + END IF + + IF( ABS(xi(2)).LE.1.0) THEN + ! compute alpha only with valid xi and eta + t(2) = ComputeSurfaceDistance2(BiLinearCoeff,xi(2),eta(2),PartTrajectory) + + IF (PRESENT(alpha2)) THEN + IF (alpha2.GT.-1.0 .AND. ALMOSTEQUAL(t(2),alpha2)) THEN + t(2) = -1.0 +#ifdef CODE_ANALYZE + IF(PARTOUT.GT.0 .AND. MPIRANKOUT.EQ.MyRank)THEN + IF(PartID.EQ.PARTOUT)THEN + WRITE(UNIT_stdout,'(A)') 'changed t2' + END IF + END IF +#endif /*CODE_ANALYZE*/ + END IF + END IF + + ! Normalize alpha to unitLength + alphaNorm = t(2)/lengthPartTrajectory + +#ifdef CODE_ANALYZE + IF(PARTOUT.GT.0 .AND. MPIRANKOUT.EQ.MyRank)THEN + IF(PartID.EQ.PARTOUT)THEN + WRITE(UNIT_stdout,'(A,G0,A,G0,A,G0)') ' | xi: ',xi(2),' | t: ',t(2),' | alphaNorm: ',alphaNorm + END IF + END IF +#endif /*CODE_ANALYZE*/ + + IF ((alphaNorm.LE.1.0) .AND.(alphaNorm.GE.0.)) THEN + InterType = InterType+2 + isHit = .TRUE. +#ifdef CODE_ANALYZE + IF(PARTOUT.GT.0 .AND. MPIRANKOUT.EQ.MyRank)THEN + IF(PartID.EQ.PARTOUT)THEN + WRITE(UNIT_stdout,'(A,E15.8,A,E15.8)') ' | alphanorm2: ',alphaNorm,' | epsilonTolerance: ',epsilontol + END IF + END IF +#endif /*CODE_ANALYZE*/ + END IF + END IF ! ABS(xi(2)).LE.1.0 + END IF ! ABS(eta(2)).LE.1.0 + + SELECT CASE(InterType) + ! No intersection found, return + CASE(0) + RETURN + + ! First intersection is only hit + CASE(1) + alpha =t (1) + xitild =xi (1) + etatild=eta(1) + + ! Second intersection is only hit + CASE(2) + alpha =t (2) + xitild =xi (2) + etatild=eta(2) + + ! Two intersections found, decide on the correct one + CASE(3) + ! If side is a BC side, take only the intersection encountered first + IF (SideInfo_Shared(SIDE_BCID,SideID).GT.0) THEN + SELECT CASE(TrackingMethod) + ! Take the one encountered first + CASE(REFMAPPING) + IF(t(1).LT.t(2))THEN + alpha =t (1) + xitild =xi (1) + etatild=eta(1) + ELSE + alpha =t (2) + xitild =xi (2) + etatild=eta(2) + END IF + + CASE(TRACING) + ! Check if the element is supposed to be checked + ElemCheck = .FALSE. + IF(PRESENT(ElemCheck_Opt))THEN + ElemCheck = ElemCheck_Opt + END IF + + IF(ElemCheck)THEN + alpha =-1 + xitild =-2 + etatild=-2 + ELSE + ! Apparently we don't care about the direction of the PartTrajectory + IF(ABS(t(1)).LT.ABS(t(2)))THEN + alpha =t (1) + xitild =xi (1) + etatild=eta(1) + ELSE + alpha =t (2) + xitild =xi (2) + etatild=eta(2) + END IF + END IF + END SELECT ! TrackingMethod + ! Inner side with double intersection, particle leaves and enters element + ELSE + alpha =-1 + xitild = 0. + etatild= 0. + isHit = .FALSE. + END IF + END SELECT ! InterType +END SELECT ! nRoot + +END SUBROUTINE PhotonComputeBiLinearIntersection + END MODULE MOD_Photon_Tracking diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_vars.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_vars.f90 index aa169851b..6c726524e 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_vars.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_vars.f90 @@ -49,6 +49,7 @@ MODULE MOD_Photon_TrackingVars INTEGER :: PhotonModeBPO !> 0: Output nothing to PartStateBoundary.h5 !> 1: Output the initial position of the rays and their direction vector !> 2: Output initial position and all calculated intersection points calculated in radtrans_tracking.f90 +LOGICAL :: UsePhotonTriaTracking !> True/False: Use TriaTracking methods for photon tracking or Bilinear methods (default is True) #if USE_MPI INTEGER :: PhotonSampWall_Shared_Win diff --git a/src/radiation/ray_tracing/raytrace.f90 b/src/radiation/ray_tracing/raytrace.f90 index 0a4c19744..8eddee8a1 100644 --- a/src/radiation/ray_tracing/raytrace.f90 +++ b/src/radiation/ray_tracing/raytrace.f90 @@ -62,7 +62,7 @@ SUBROUTINE RayTracing() USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall_Shared, PhotonSampWall_Shared_Win,PhotonSampWallProc USE MOD_RayTracing_Vars ,ONLY: RayElemPassedEnergy_Shared,RayElemPassedEnergy_Shared_Win #endif /*USE_MPI*/ -USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall,PhotonModeBPO +USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall,PhotonModeBPO,UsePhotonTriaTracking USE MOD_Mesh_Vars ,ONLY: nGlobalElems,nElems USE MOD_RayTracing_Vars ,ONLY: UseRayTracing,PerformRayTracing,RayElemEmission USE MOD_DSMC_Vars ,ONLY: DSMC @@ -162,6 +162,9 @@ SUBROUTINE RayTracing() PartStateBoundary=0. END IF ! .NOT.ALLOCATED(PartStateBoundary) +! Bilinear tracking requires shorter movement vectors for the rays, otherwise it hangs +IF(.NOT.UsePhotonTriaTracking) Ray%Direction = Ray%Direction*0.01 + DO iRay = 1, LocRayNum IF(MPIroot.AND.(MOD(RayVisCount,RayDisp).EQ.0)) CALL PrintStatusLineRadiation(REAL(RayVisCount),0.0,REAL(LocRayNum),.TRUE.) RayVisCount = RayVisCount + 1 From 56b7c8926ae3a38f3d0c9b71036bf687077fc73a Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Mon, 25 Sep 2023 23:35:12 +0200 Subject: [PATCH 231/495] Fixed artifacts in volume ray tracing for Nloc>1 by randomly choosing multiple intersection points between the element entering and exit intersection point. Scale the number of sampling intersection points with the polynomial degree (Nloc+1)**2, but use a minimum of 30 as default. --- .../tracking/radtrans_tracking_tools.f90 | 76 +++++-------------- 1 file changed, 20 insertions(+), 56 deletions(-) diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 index bcb6d4b2d..206661c7a 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 @@ -138,7 +138,7 @@ SUBROUTINE PhotonThroughSideCheck3DFast(iLocSide,Element,ThroughSide,TriNum, IsM ! Changed tolerance from -epsMach to -0.1*epsMach because this check finds intersections, but when PhotonIntersectionWithSide() is ! called, the photon vector and the side normal vector are perfectly parallel, e.g., v = (/0,0,-1/) and n=(/0,-1,0./), hence, the -! scalar product is exactly zero and the routine breakes. +! scalar product is exactly zero and the routine breaks. tolerance = -0.1*epsMach ! Comparison of the determinants with eps, where a x_photon_startro is stored (due to machine precision) IF(det(1).LT.tolerance) RETURN @@ -660,11 +660,9 @@ SUBROUTINE CalcAbsorptionRayTrace(IntersectionPos,GlobalElemID,PhotonDir) REAL, INTENT(IN) :: IntersectionPos(3) ! Local variable declaration INTEGER :: k,l,m,Nloc,NbrOfSamples,iIntersec,idx -INTEGER :: kOld,lOld,mOld REAL :: SamplePos(3) REAL :: direction(3),subdirection(3),length,sublength -LOGICAL :: arr(0:Ray%NMax,0:Ray%NMax,0:Ray%NMax) -REAL :: realcounter +REAL :: RandVal(3) !--------------------------------------------------------------------------------------------------! ! Calculate the direction and length of the path of the ray through the element direction(1:3) = IntersectionPos(1:3)-PhotonProps%PhotonStartPos(1:3) @@ -686,60 +684,26 @@ SUBROUTINE CalcAbsorptionRayTrace(IntersectionPos,GlobalElemID,PhotonDir) Nloc = N_DG_Ray(GlobalElemID) ! Loop over number of sub-samples -NbrOfSamples = MIN(20,(Nloc+1)**2) ! Nloc+1 ! must be at least 3 for this sampling method (one point between the two intersections of the element)! -!scaleFac = 1./REAL(NbrOfSamples) +NbrOfSamples = MAX(30,(Nloc+1)**2) ! Nloc+1 ! must be at least 3 for this sampling method (one point between the two intersections of the element)! subdirection(1:3) = direction(1:3)/REAL(NbrOfSamples-1) sublength = VECNORM(subdirection(1:3)) -!scaleFac = 1. -arr = .FALSE. -! Set initial starting position (is moved when the sub-element is switched) -!StartPos(1:3) = PhotonProps%PhotonStartPos(1:3) -realcounter = 0.0 - -DO iIntersec = 1, NbrOfSamples - SamplePos = PhotonProps%PhotonStartPos(1:3) + direction(1:3)*REAL(iIntersec-1)/REAL(NbrOfSamples-1) - - ! Get k,l,m of nearest DOF - CALL GetNestestDOFInRefElem(Nloc,SamplePos(1:3),GlobalElemID,k,l,m) - - ! Switch sub-element - IF((iIntersec.GT.1).AND.(.NOT.arr(k,l,m)))THEN - ! Set old sub-element false - arr(kOld,lOld,mOld) = .FALSE. - - ! half step back - U_N_Ray(GlobalElemID)%U(idx,kOld,lOld,mOld) = U_N_Ray(GlobalElemID)%U(idx,kOld,lOld,mOld) & - + (realcounter - 0.5) * sublength * PhotonProps%PhotonEnergy - ! Check if last intersection is reached - IF(iIntersec.EQ.NbrOfSamples)THEN - ! Set counter to half step as the loop ends here - realcounter = 0.5 - U_N_Ray(GlobalElemID)%U(idx,k,l,m) = U_N_Ray(GlobalElemID)%U(idx,k,l,m) & - + realcounter * sublength * PhotonProps%PhotonEnergy - ! Exit loop and subroutine here - RETURN - ELSE - ! Initialize counter with half step and add 1, which gives 1.5 - realcounter = 1.5 - END IF ! iIntersec.EQ.NbrOfSamples - - ELSE - ! Check if last intersection is reached - IF(iIntersec.EQ.NbrOfSamples)THEN - U_N_Ray(GlobalElemID)%U(idx,k,l,m) = U_N_Ray(GlobalElemID)%U(idx,k,l,m) & - + realcounter * sublength * PhotonProps%PhotonEnergy - ! Exit loop and subroutine here - RETURN - END IF ! iIntersec.EQ.NbrOfSamples - ! 1st or still in old sub-element - realcounter = realcounter + 1.0 - END IF ! .NOT.arr(k,l,m) - - arr(k,l,m)=.TRUE. - kOld = k - lOld = l - mOld = m -END DO ! iIntersec = 1, Nloc+3 +! Loop over the number of sub lengths and assign them to the nearest DOF. Choose the intersection points at random to prevent artifacts +IF(ABS(direction(3)).GT.1e6*(ABS(direction(1))+ABS(direction(2))))THEN + ! only in z-dir + DO iIntersec = 1, NbrOfSamples-1 + CALL RANDOM_NUMBER(RandVal(1)) + SamplePos(1:3) = PhotonProps%PhotonStartPos(1:3) + (/1.0 , 1.0 , RandVal(1)/) * direction(1:3) + CALL GetNestestDOFInRefElem(Nloc,SamplePos(1:3),GlobalElemID,k,l,m) + U_N_Ray(GlobalElemID)%U(idx,k,l,m) = U_N_Ray(GlobalElemID)%U(idx,k,l,m) + sublength*PhotonProps%PhotonEnergy + END DO +ELSE + DO iIntersec = 1, NbrOfSamples-1 + CALL RANDOM_NUMBER(RandVal(1:3)) + SamplePos(1:3) = PhotonProps%PhotonStartPos(1:3) + RandVal(1:3) * direction(1:3) + CALL GetNestestDOFInRefElem(Nloc,SamplePos(1:3),GlobalElemID,k,l,m) + U_N_Ray(GlobalElemID)%U(idx,k,l,m) = U_N_Ray(GlobalElemID)%U(idx,k,l,m) + sublength*PhotonProps%PhotonEnergy + END DO +END IF ! ABS(direction(3).GT.1e6*(ABS(direction(1))+ABS(direction(2)))) END SUBROUTINE CalcAbsorptionRayTrace From 5507873e34961e3ab52901ddafeb1a0cd464d853 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Tue, 26 Sep 2023 13:32:57 +0200 Subject: [PATCH 232/495] output DSMC file info during write out to .h5 --- src/particles/dsmc/dsmc_analyze.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/particles/dsmc/dsmc_analyze.f90 b/src/particles/dsmc/dsmc_analyze.f90 index b8972d88f..db4a37d47 100644 --- a/src/particles/dsmc/dsmc_analyze.f90 +++ b/src/particles/dsmc/dsmc_analyze.f90 @@ -864,7 +864,8 @@ SUBROUTINE WriteDSMCToHDF5(MeshFileName,OutputTime) REAL,ALLOCATABLE :: DSMC_MacroVal(:,:), MacroElecExcitation(:,:) REAL :: StartT,EndT !=================================================================================================================================== -SWRITE(UNIT_stdOut,'(A)',ADVANCE='NO')' WRITE DSMC TO HDF5 FILE...' +FileName=TRIM(TIMESTAMP(TRIM(ProjectName)//'_DSMCState',OutputTime))//'.h5' +SWRITE(UNIT_stdOut,'(A)',ADVANCE='NO')' WRITE DSMC TO HDF5 FILE ['//TRIM(FileName)//'] ...' GETTIME(StartT) IF(nSpecies.EQ.1) THEN @@ -1015,7 +1016,6 @@ SUBROUTINE WriteDSMCToHDF5(MeshFileName,OutputTime) END IF ! Generate skeleton for the file with all relevant data on a single proc (MPIRoot) -FileName=TRIM(TIMESTAMP(TRIM(ProjectName)//'_DSMCState',OutputTime))//'.h5' IF(MPIRoot) THEN CALL OpenDataFile(TRIM(FileName),create=.TRUE.,single=.TRUE.,readOnly=.FALSE.) CALL WriteHDF5Header(TRIM('DSMCState'),File_ID) From d2c45d7096e53d8281e7c741222a1e5818677b92 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Tue, 10 Oct 2023 16:29:13 +0200 Subject: [PATCH 233/495] Output total area of all sides used for BoundaryParticleOutput (BPO), which calculates the particle flux over time and outputs it to SurfaceAnalyze.csv. Can now be used to calculate the specific flux per area. --- .../surfacemodel/surfacemodel_analyze.f90 | 53 ++++++++++++++++--- .../tracking/radtrans_tracking.f90 | 1 - 2 files changed, 46 insertions(+), 8 deletions(-) diff --git a/src/particles/surfacemodel/surfacemodel_analyze.f90 b/src/particles/surfacemodel/surfacemodel_analyze.f90 index 7870167fc..c6e20fd31 100644 --- a/src/particles/surfacemodel/surfacemodel_analyze.f90 +++ b/src/particles/surfacemodel/surfacemodel_analyze.f90 @@ -756,7 +756,7 @@ END SUBROUTINE SyncElectronSEE !=================================================================================================================================== SUBROUTINE InitBoundaryParticleOutput() ! MODULES -USE MOD_Globals ,ONLY: CollectiveStop,UNIT_stdOut +USE MOD_Globals USE MOD_SurfaceModel_Analyze_Vars ,ONLY: BPO USE MOD_Particle_Boundary_Vars ,ONLY: nPartBound,PartBound USE MOD_ReadInTools ,ONLY: GETLOGICAL,GETINT,GETINTARRAY @@ -773,14 +773,20 @@ SUBROUTINE InitBoundaryParticleOutput() USE MOD_LoadBalance_Vars ,ONLY: PerformLoadBalance #endif /*USE_LOADBALANCE*/ #endif /*USE_HDG*/ -USE MOD_Mesh_Vars ,ONLY: nBCs +USE MOD_Mesh_Vars ,ONLY: nBCs,BC,nBCSides,BoundaryName +USE MOD_TimeDisc_Vars ,ONLY: iter +USE MOD_Mesh_Vars ,ONLY: SurfElem +USE MOD_Interpolation_Vars ,ONLY: wGPSurf ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------! ! INPUT / OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -INTEGER :: iPartBound,iSpec,iBPO,iBC +INTEGER :: iPartBound,iSpec,iBPO,iBC,BCSideID +REAL,ALLOCATABLE :: TotalSurfArea(:) +CHARACTER(LEN=32) :: hilf +!REAL :: area !=================================================================================================================================== DoSurfModelAnalyze = .TRUE. BPO%NPartBoundaries = GETINT('BPO-NPartBoundaries') @@ -856,8 +862,7 @@ SUBROUTINE InitBoundaryParticleOutput() ' RotPeriodicBC = 6 \n'//& ' SymmetryBC = 10 \n'//& ' SymmetryAxis = 11 ' - CALL CollectiveStop(__STAMP__& - ,'PartBound%TargetBoundCond(iPartBound) is not implemented for CalcBoundaryParticleOutput',& + CALL CollectiveStop(__STAMP__,'PartBound%TargetBoundCond(iPartBound) is not implemented for CalcBoundaryParticleOutput',& IntInfo=PartBound%TargetBoundCond(iPartBound)) END IF ! PartBound%NbrOfSpeciesSwaps(iPartBound).GT.0 END IF ! .NOT.ANY(PartBound%TargetBoundCond(iPartBound).EQ. ... @@ -873,14 +878,48 @@ SUBROUTINE InitBoundaryParticleOutput() CASE(SEE_MODELS_ID) ! all secondary electron models CASE DEFAULT - CALL CollectiveStop(__STAMP__,'CalcBoundaryParticleOutput not implemented for this '//& - 'PartBound%SurfaceModel(iPartBound). Either select different surface model or activate NbrOfSpeciesSwaps',& + WRITE(UNIT=hilf,FMT='(I0)') iPartBound + CALL CollectiveStop(__STAMP__,'CalcBoundaryParticleOutput not implemented for '//& + 'PartBound%SurfaceModel(iPartBound='//TRIM(hilf)//'). Either select different surface model or activate NbrOfSpeciesSwaps',& IntInfo=PartBound%SurfaceModel(iPartBound)) END SELECT END IF ! PartBound%NbrOfSpeciesSwaps(iPartBound).GT.0 END IF ! PartBound%TargetBoundCond(BPO%PartBoundaries(iPartBound).EQ.2) END DO ! iPartBound = 1, BPO%NPartBoundaries +! Display the total area of the all BPO%NPartBoundaries. MPI requires all-reduce to root process +IF(iter.EQ.0)THEN ! First iteration: Only output this information once + ALLOCATE(TotalSurfArea(1:BPO%NPartBoundaries)) + TotalSurfArea = 0. + ! Loop over all BC sides and get surface area + DO BCSideID = 1,nBCSides + ! Get particle boundary ID + iPartBound = PartBound%MapToPartBC(BC(BCSideID)) + ! get BPO boundary ID + iBPO = BPO%BCIDToBPOBCID(iPartBound) + ! Check if this boundary is tracked + IF(iBPO.GT.0)THEN + TotalSurfArea(iBPO) = TotalSurfArea(iBPO) + SUM(SurfElem(:,:,BCSideID)*wGPSurf(:,:)) + END IF ! iBPO.GT.0 + END DO ! BCSideID = 1,nBCSides +#if USE_MPI + IF(MPIroot)THEN + CALL MPI_REDUCE(MPI_IN_PLACE , TotalSurfArea , BPO%NPartBoundaries , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_WORLD , iError) + WRITE(UNIT_stdOut,'(A)') "Total area used for BoundaryParticleOutput (BPO):" + DO iBPO = 1, BPO%NPartBoundaries + IF(iBPO.GT.9)THEN + WRITE(UNIT_stdOut,'(A,I0,A,ES15.7,A)') "BPO-",iBPO,": ",TotalSurfArea(iBPO)," "//TRIM(BoundaryName(BPO%FieldBoundaries(iBPO))) + ELSE + WRITE(UNIT_stdOut,'(A,I0,A,ES16.7,A)') "BPO-",iBPO,": ",TotalSurfArea(iBPO)," "//TRIM(BoundaryName(BPO%FieldBoundaries(iBPO))) + END IF ! iBPO.GT.9 + END DO ! iBPO = 1, BPO%NPartBoundaries + ELSE + CALL MPI_REDUCE(TotalSurfArea , 0 , BPO%NPartBoundaries , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_WORLD , iError) + END IF +#endif /*USE_MPI*/ + DEALLOCATE(TotalSurfArea) +END IF ! iter.EQ.0 + END SUBROUTINE InitBoundaryParticleOutput diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 index 1ecfdd6fe..b4797ca18 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 @@ -282,7 +282,6 @@ SUBROUTINE PhotonTriaTracking() USE MOD_RadiationTrans_Vars ,ONLY: RadiationAbsorptionModel USE MOD_RayTracing_Vars ,ONLY: RayForceAbsorption USE MOD_Particle_Mesh_Tools ,ONLY: GetGlobalNonUniqueSideID -USE MOD_Mesh_Vars ,ONLY: SideToElem IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES From 4f84e6cc5e51237439f679897bb749e8554e9516 Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Tue, 10 Oct 2023 19:16:12 +0200 Subject: [PATCH 234/495] Disable sampling of electronic excitation if it has not been enabled for any species pair --- src/particles/mcc/mcc_init.f90 | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/particles/mcc/mcc_init.f90 b/src/particles/mcc/mcc_init.f90 index c78140d86..ac48218ab 100644 --- a/src/particles/mcc/mcc_init.f90 +++ b/src/particles/mcc/mcc_init.f90 @@ -146,6 +146,11 @@ SUBROUTINE InitMCC() IF(.NOT.UseMCC.AND.VarTimeStep%UseSpeciesSpecific) CALL abort(__STAMP__,& 'ERROR: Only MCC is implemented with a species-specific time step!') +! Disable SampleElecExcitation if electronic excitation has not been enabled for at least one species +IF(SampleElecExcitation.AND.(.NOT.ANY(SpecDSMC(:)%UseElecXSec))) THEN + SampleElecExcitation = .FALSE. + LBWRITE(*,*) '| WARNING: Part-SampElectronicExcitation has been disabled as no electronic excitation has been enabled through -UseElecXSec = T!' +END IF ! Leave the routine IF(.NOT.UseMCC) RETURN From 3302eb0ca1c50951ac09a4f6fa1db7af7dae6395 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Thu, 12 Oct 2023 16:16:04 +0200 Subject: [PATCH 235/495] Fixed merge conflict errors due to renaming of radtrans_tracking_tools.f90 --- .../tracking/radtrans_tracking_tools.f90 | 83 ++++++++++++------- 1 file changed, 54 insertions(+), 29 deletions(-) diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 index b99c6f358..c4b966f0c 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 @@ -802,27 +802,38 @@ END SUBROUTINE GetNestestDOFInRefElem SUBROUTINE CalcAbsoprtionMC(IntersectionPos,Element, DONE) USE MOD_Photon_TrackingVars ,ONLY: PhotonProps USE MOD_RadiationTrans_Vars ,ONLY: RadiationElemAbsEnergy -USE MOD_Radiation_Vars ,ONLY: Radiation_Absorption_spec +USE MOD_Radiation_Vars ,ONLY: Radiation_Absorption_spec,Radiation_Absorption_SpecPercent +USE MOD_RadiationTrans_Vars ,ONLY: RadiationElemAbsEnergySpec !--------------------------------------------------------------------------------------------------! IMPLICIT NONE !--------------------------------------------------------------------------------------------------! -! argument list declaration +! INPUT / OUTPUT VARIABLES INTEGER, INTENT(IN) :: Element REAL, INTENT(IN) :: IntersectionPos(3) LOGICAL, INTENT(OUT) :: DONE -! Local variable declaration +! LOCAL VARIABLES !--------------------------------------------------------------------------------------------------! -REAL :: iRan, DistanceVec(3), Distance +REAL :: iRan, DistanceVec(3), Distance, opticalPath !--------------------------------------------------------------------------------------------------! -DistanceVec(1:3) = PhotonProps%PhotonPos(1:3) - IntersectionPos(1:3) -Distance = SQRT(DistanceVec(1)*DistanceVec(1) + DistanceVec(2)*DistanceVec(2) + DistanceVec(3)*DistanceVec(3)) -CALL RANDOM_NUMBER(iRan) -IF (-LOG(iRan).LT.(Distance*Radiation_Absorption_Spec(PhotonProps%WaveLength,Element))) THEN - RadiationElemAbsEnergy(Element) = RadiationElemAbsEnergy(Element) + PhotonProps%PhotonEnergy - DONE = .TRUE. +IF ((Radiation_Absorption_Spec(PhotonProps%WaveLength,Element).GT.0.0)& + .AND.(SUM(Radiation_Absorption_SpecPercent(PhotonProps%WaveLength,:,Element)).GT.0.0)) THEN + DistanceVec(1:3) = PhotonProps%PhotonPos(1:3) - IntersectionPos(1:3) + Distance = SQRT(DistanceVec(1)*DistanceVec(1) + DistanceVec(2)*DistanceVec(2) + DistanceVec(3)*DistanceVec(3)) + CALL RANDOM_NUMBER(iRan) + opticalPath = Distance*Radiation_Absorption_Spec(PhotonProps%WaveLength,Element) + IF (-LOG(iRan).LT.opticalPath) THEN + RadiationElemAbsEnergySpec(:,Element) = RadiationElemAbsEnergySpec(:,Element) & + + PhotonProps%PhotonEnergy*(REAL(Radiation_Absorption_SpecPercent(PhotonProps%WaveLength,:,Element))& + /SUM(REAL(Radiation_Absorption_SpecPercent(PhotonProps%WaveLength,:,Element)))) + DONE = .TRUE. + ELSE + PhotonProps%PhotonPos(1:3) = IntersectionPos(1:3) + END IF ELSE PhotonProps%PhotonPos(1:3) = IntersectionPos(1:3) END IF +RadiationElemAbsEnergy(1,Element) = RadiationElemAbsEnergy(1,Element) + opticalPath +RadiationElemAbsEnergy(2,Element) = RadiationElemAbsEnergy(2,Element) + 1.0 END SUBROUTINE CalcAbsoprtionMC @@ -830,39 +841,52 @@ END SUBROUTINE CalcAbsoprtionMC !=================================================================================================================================== !> Calculates absorbed energy of photons along their paths analytically !=================================================================================================================================== -SUBROUTINE CalcAbsoprtionAnalytic(IntersectionPos,Element)!, DONE) -!DEC$ ATTRIBUTES FORCEINLINE :: ParticleThroughSideLastPosCheck +SUBROUTINE CalcAbsoprtionAnalytic(IntersectionPos,Element, DONE) USE MOD_Globals USE MOD_Photon_TrackingVars ,ONLY: PhotonProps -USE MOD_RadiationTrans_Vars ,ONLY: RadiationElemAbsEnergy -USE MOD_Radiation_Vars ,ONLY: Radiation_Absorption_spec +USE MOD_RadiationTrans_Vars ,ONLY: RadiationElemAbsEnergy, RadiationElemAbsEnergySpec +USE MOD_Radiation_Vars ,ONLY: Radiation_Absorption_spec, Radiation_Absorption_SpecPercent !--------------------------------------------------------------------------------------------------! -IMPLICIT NONE +! INPUT / OUTPUT VARIABLES !--------------------------------------------------------------------------------------------------! ! argument list declaration INTEGER, INTENT(IN) :: Element REAL, INTENT(IN) :: IntersectionPos(3) -!LOGICAL, INTENT(OUT) :: DONE -! Local variable declaration +LOGICAL, INTENT(INOUT) :: DONE +! LOCAL VARIABLES !--------------------------------------------------------------------------------------------------! -REAL :: DistanceVec(3), Distance, LostEnergy, maz_photon_startxp, opticalPath +REAL :: DistanceVec(3), Distance, LostEnergy, opticalPath !--------------------------------------------------------------------------------------------------! -maz_photon_startxp = LOG(HUGE(maz_photon_startxp)) -DistanceVec(1:3) = PhotonProps%PhotonPos(1:3) - IntersectionPos(1:3) -Distance = SQRT(DistanceVec(1)*DistanceVec(1) + DistanceVec(2)*DistanceVec(2) + DistanceVec(3)*DistanceVec(3)) -opticalPath = Distance*Radiation_Absorption_Spec(PhotonProps%WaveLength,Element) -IF (opticalPath.GT.maz_photon_startxp) THEN - LostEnergy = PhotonProps%PhotonEnergy +IF ((Radiation_Absorption_Spec(PhotonProps%WaveLength,Element).GT.0.0)& + .AND.(SUM(Radiation_Absorption_SpecPercent(PhotonProps%WaveLength,:,Element)).GT.0)) THEN + DistanceVec(1:3) = PhotonProps%PhotonPos(1:3) - IntersectionPos(1:3) + Distance = SQRT(DistanceVec(1)*DistanceVec(1) + DistanceVec(2)*DistanceVec(2) + DistanceVec(3)*DistanceVec(3)) + opticalPath = Distance*Radiation_Absorption_Spec(PhotonProps%WaveLength,Element) + IF (CHECKEXP(opticalPath)) THEN + LostEnergy = PhotonProps%PhotonEnergy*(1.-EXP(-opticalPath)) + ELSE + LostEnergy = PhotonProps%PhotonEnergy + DONE = .TRUE. + END IF + IF (SUM(REAL(Radiation_Absorption_SpecPercent(PhotonProps%WaveLength,:,Element))).EQ.0.0) THEN + print*,'arg',Element,PhotonProps%WaveLength, Radiation_Absorption_Spec(PhotonProps%WaveLength,Element) + print*, 'percent', Radiation_Absorption_SpecPercent(PhotonProps%WaveLength,:,Element) + END IF + PhotonProps%PhotonEnergy = PhotonProps%PhotonEnergy - LostEnergy + RadiationElemAbsEnergySpec(:,Element) = RadiationElemAbsEnergySpec(:,Element) & + + LostEnergy*(REAL(Radiation_Absorption_SpecPercent(PhotonProps%WaveLength,:,Element))& + /SUM(REAL(Radiation_Absorption_SpecPercent(PhotonProps%WaveLength,:,Element)))) ELSE - LostEnergy = PhotonProps%PhotonEnergy *(1.-EXP(-opticalPath)) + opticalPath = 0.0 END IF -PhotonProps%PhotonEnergy = PhotonProps%PhotonEnergy - LostEnergy -RadiationElemAbsEnergy(Element) = RadiationElemAbsEnergy(Element) + LostEnergy ! IF (PhotonProps%PhotonEnergy.LE.(RadTrans%GlobalRadiationPower/(1000.*RadTrans%GlobalPhotonNum))) THEN ! DONE = .TRUE. ! ELSE -PhotonProps%PhotonPos(1:3) = IntersectionPos(1:3) + ! END IF +PhotonProps%PhotonPos(1:3) = IntersectionPos(1:3) +RadiationElemAbsEnergy(1,Element) = RadiationElemAbsEnergy(1,Element) + opticalPath +RadiationElemAbsEnergy(2,Element) = RadiationElemAbsEnergy(2,Element) + 1.0 END SUBROUTINE CalcAbsoprtionAnalytic @@ -906,12 +930,13 @@ SUBROUTINE CalcAbsoprtion(IntersectionPos, Element, DONE, before) CALL CalcAbsorptionRayTrace(IntersectionPos, Element,PhotonProps%PhotonDirection) END IF ! PRESENT(before) ELSEIF (RadiationAbsorptionModel.EQ.1) THEN - CALL CalcAbsoprtionAnalytic(IntersectionPos,Element)!, DONE) + CALL CalcAbsoprtionAnalytic(IntersectionPos,Element, DONE) ELSEIF (RadiationAbsorptionModel.EQ.2) THEN CALL CalcAbsoprtionMC(IntersectionPos,Element, DONE) ELSE CALL Abort(__STAMP__,'AbsorptionModel must be 1 or 2!') END IF + END SUBROUTINE CalcAbsoprtion From ad367b913d76d7c27fdcc2f3613ef8c4a8903ddc Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Thu, 12 Oct 2023 19:46:40 +0200 Subject: [PATCH 236/495] Made .gitlab-ci.yml more fail-safe, e.g., when using gitlab-ci-local --- .gitlab-ci.yml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 710213b07..1c0cf385b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -3,7 +3,11 @@ # Load modules on new boltzplatz reggie before_script: - ulimit -s unlimited - - module list + - if [ -n "$(command -v module)" ]; then + module list; + else + echo " Error. Command [module] not found."; + fi - python3 -V || true - python2 -V || true - if [ -n "${DO_CORE_SPLIT}" ]; then @@ -224,7 +228,9 @@ reggie_download: policy: push stage: build script: - - git clone git@piclas.boltzplatz.eu:reggie2.0/reggie2.0.git reggie + - if [ ! -d "reggie" ]; then + git clone git@piclas.boltzplatz.eu:reggie2.0/reggie2.0.git reggie; + fi build: extends: .default_build_param From 8f86f7189699bd86da74d0867f8faa6ef72836c8 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Thu, 12 Oct 2023 19:47:08 +0200 Subject: [PATCH 237/495] Added info to integer kind parameter IK --- src/globals/globals.f90 | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/globals/globals.f90 b/src/globals/globals.f90 index 94c1ab605..9c1a3aa1e 100644 --- a/src/globals/globals.f90 +++ b/src/globals/globals.f90 @@ -50,10 +50,12 @@ MODULE MOD_Globals INTEGER :: doPrintHelp ! 0: no help, 1: help, 2: markdown-help +! SELECTED_INT_KIND(R) return the kind value of the smallest integer type that can represent all values ranging from -10^R (exclusive) +! to 10^R (exclusive). If there is no integer kind that accommodates this range, SELECTED_INT_KIND returns -1. #ifdef INTKIND8 -INTEGER, PARAMETER :: IK = SELECTED_INT_KIND(18) +INTEGER, PARAMETER :: IK = SELECTED_INT_KIND(18) ! Value of selected_int_kind(18) is 8 #else -INTEGER, PARAMETER :: IK = SELECTED_INT_KIND(8) +INTEGER, PARAMETER :: IK = SELECTED_INT_KIND(8) ! Value of selected_int_kind(8) is 4 #endif #if defined(PARTICLES) From 0d06dc18e0a703e3a243a5069eccd6a911f57b30 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Thu, 12 Oct 2023 20:36:54 +0200 Subject: [PATCH 238/495] fixed ray tracing stuff in radiation part --- .../radiation_solver/radiation_readin.f90 | 2 +- .../radiative_transfer/radtrans_init.f90 | 17 ++++++++++++----- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/radiation/radiation_solver/radiation_readin.f90 b/src/radiation/radiation_solver/radiation_readin.f90 index d678cb71d..5a14194b7 100644 --- a/src/radiation/radiation_solver/radiation_readin.f90 +++ b/src/radiation/radiation_solver/radiation_readin.f90 @@ -169,7 +169,7 @@ SUBROUTINE Radiation_readin_molecules(iSpec) ALLOCATE(SpeciesRadiation(iSpec)%EnergyLevelName(length)) DO iLoop=1, length READ(304,*,IOSTAT = errtemp) hilf - DO WHILE (hilf(1:1).EQ.'c ') + DO WHILE (hilf(1:1).EQ.'c') READ(304,*,IOSTAT = errtemp) hilf END DO SpeciesRadiation(iSpec)%EnergyLevelName(iLoop) = TRIM(hilf) diff --git a/src/radiation/radiative_transfer/radtrans_init.f90 b/src/radiation/radiative_transfer/radtrans_init.f90 index 7a13ce8d3..056413c2e 100644 --- a/src/radiation/radiative_transfer/radtrans_init.f90 +++ b/src/radiation/radiative_transfer/radtrans_init.f90 @@ -96,6 +96,11 @@ SUBROUTINE InitRadiationTransport() #endif USE MOD_RayTracing_Vars ,ONLY: Ray USE MOD_Photon_Tracking ,ONLY: InitPhotonSurfSample +#if USE_MPI +USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWallProc +USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall_Shared, PhotonSampWall_Shared_Win,PhotonSampWallProc +#endif /*USE_MPI*/ +USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -105,10 +110,11 @@ SUBROUTINE InitRadiationTransport() !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES INTEGER :: iWave, iElem, firstElem, lastElem, ElemDisp, DisplRank, iSpec, currentRank -REAL :: LocTemp, ObsLengt, MaxSumTemp(2), GlobalMaxTemp(2), hilf +REAL :: LocTemp, ObsLengt, MaxSumTemp(2), GlobalMaxTemp(2), tmp LOGICAL :: ElemInCone REAL,ALLOCATABLE :: Radiation_ShockTube_Spec(:,:) INTEGER :: w, io_error +CHARACTER(LEN=3) :: hilf !=================================================================================================================================== SWRITE(UNIT_StdOut,'(132("-"))') SWRITE(UNIT_stdOut,'(A)') ' INIT RADIATION TRANSPORT SOLVER ...' @@ -127,7 +133,8 @@ SUBROUTINE InitRadiationTransport() RadObservationPointMethod = GETINT('Radiation-RadObservationPointMethod') ObservationDoConvolution = GETLOGICAL('Radiation-ObservationDoConvolution') RadObservationPoint%ShockTubeDiameter = GETREAL('Radiation-ShockTubeDiameter') -Ray%nSurfSample = GETINT('Radiation-nSurfSample',nSurfSample) +WRITE(UNIT=hilf,FMT='(I0)') nSurfSample +Ray%nSurfSample = GETINT('Radiation-nSurfSample',hilf) ! Build surface containers CALL InitPhotonSurfSample() @@ -142,9 +149,9 @@ SUBROUTINE InitRadiationTransport() END IF RadObservationPoint%SlitFunction = GETREALARRAY('Radiation-ObservationSlitFunction',2) IF(RadObservationPoint%SlitFunction(1).GT.RadObservationPoint%SlitFunction(2)) THEN - hilf = RadObservationPoint%SlitFunction(1) + tmp = RadObservationPoint%SlitFunction(1) RadObservationPoint%SlitFunction(1) = RadObservationPoint%SlitFunction(2) - RadObservationPoint%SlitFunction(2) = hilf + RadObservationPoint%SlitFunction(2) = tmp END IF RadObservationPoint%OrthoNormBasis(1:3,1) = RadObservationPoint%ViewDirection(1:3) CALL FindLinIndependentVectors(RadObservationPoint%OrthoNormBasis(1:3,1), RadObservationPoint%OrthoNormBasis(1:3,2), RadObservationPoint%OrthoNormBasis(1:3,3)) @@ -470,7 +477,7 @@ SUBROUTINE InitRadiationTransport() ALLOCATE(PhotonSampWallProc(2,1:Ray%nSurfSample,1:Ray%nSurfSample,1:nComputeNodeSurfTotalSides)) PhotonSampWallProc=0.0 !> Then shared arrays for boundary sampling -CALL Allocate_Shared((/2,1:Ray%nSurfSample,1:Ray%nSurfSample,nComputeNodeSurfTotalSides/),PhotonSampWall_Shared_Win,PhotonSampWall_Shared) +CALL Allocate_Shared((/2,Ray%nSurfSample,Ray%nSurfSample,nComputeNodeSurfTotalSides/),PhotonSampWall_Shared_Win,PhotonSampWall_Shared) CALL MPI_WIN_LOCK_ALL(0,PhotonSampWall_Shared_Win,IERROR) PhotonSampWall => PhotonSampWall_Shared From e65afadd97c2082d46aaebf32cf0b1eccf6d61ae Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Thu, 12 Oct 2023 20:38:03 +0200 Subject: [PATCH 239/495] Cleanup of INTERFACE Allocate_Shared overloading for different integer KIND declarations --- src/mpi/mpi_shared.f90 | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/mpi/mpi_shared.f90 b/src/mpi/mpi_shared.f90 index 733b41966..64cc1efd5 100644 --- a/src/mpi/mpi_shared.f90 +++ b/src/mpi/mpi_shared.f90 @@ -45,19 +45,19 @@ MODULE MOD_MPI_Shared MODULE PROCEDURE Allocate_Shared_Logical_1 MODULE PROCEDURE Allocate_Shared_Logical_2 MODULE PROCEDURE Allocate_Shared_Int_1 + MODULE PROCEDURE Allocate_Shared_Int_1_nValINT8 + MODULE PROCEDURE Allocate_Shared_Int_1_nValKIND_DataPointKIND2 MODULE PROCEDURE Allocate_Shared_Int_2 MODULE PROCEDURE Allocate_Shared_Int_3 MODULE PROCEDURE Allocate_Shared_Int_4 ! MODULE PROCEDURE Allocate_Shared_Int_1_Kind_IK MODULE PROCEDURE Allocate_Shared_Real_1 + MODULE PROCEDURE Allocate_Shared_Real_1_nValINT8 MODULE PROCEDURE Allocate_Shared_Real_2 MODULE PROCEDURE Allocate_Shared_Real_3 MODULE PROCEDURE Allocate_Shared_Real_4 MODULE PROCEDURE Allocate_Shared_Real_5 MODULE PROCEDURE Allocate_Shared_Real_6 - MODULE PROCEDURE Allocate_Shared_REAL_nValKIND - MODULE PROCEDURE Allocate_Shared_INTEGER_nValKIND - MODULE PROCEDURE Allocate_Shared_INTEGER_nValKIND_DataPointKIND2 END INTERFACE PUBLIC::DefineParametersMPIShared @@ -717,7 +717,7 @@ SUBROUTINE Allocate_Shared_Real_1(nVal,SM_WIN,DataPointer& END SUBROUTINE ALLOCATE_SHARED_REAL_1 -SUBROUTINE Allocate_Shared_REAL_nValKIND(nVal,SM_WIN,DataPointer& +SUBROUTINE Allocate_Shared_Real_1_nValINT8(nVal,SM_WIN,DataPointer& #ifdef DEBUG_MEMORY ,SM_WIN_NAME& #endif /*DEBUG_MEMORY*/ @@ -730,11 +730,11 @@ SUBROUTINE Allocate_Shared_REAL_nValKIND(nVal,SM_WIN,DataPointer& IMPLICIT NONE !---------------------------------------------------------------------------------------------------------------------------------- ! INPUT/OUTPUT VARIABLES -INTEGER(KIND=IK),INTENT(IN) :: nVal(1) !> Local number of variables in each rank -INTEGER,INTENT(OUT) :: SM_WIN !> Shared memory window +INTEGER(KIND=SELECTED_INT_KIND(18)),INTENT(IN) :: nVal(1) !> Local number of variables in each rank +INTEGER,INTENT(OUT) :: SM_WIN !> Shared memory window REAL ,INTENT(OUT),POINTER :: DataPointer(:) !> Pointer to the RMA window #ifdef DEBUG_MEMORY -CHARACTER(LEN=*),INTENT(IN) :: SM_WIN_NAME !> Shared memory window name +CHARACTER(LEN=*),INTENT(IN) :: SM_WIN_NAME !> Shared memory window name #endif /*DEBUG_MEMORY*/ !---------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES @@ -766,10 +766,10 @@ SUBROUTINE Allocate_Shared_REAL_nValKIND(nVal,SM_WIN,DataPointer& ! SM_PTR can now be associated with a Fortran pointer and thus used to access the shared data CALL C_F_POINTER(SM_PTR, DataPointer,nVal) -END SUBROUTINE Allocate_Shared_REAL_nValKIND +END SUBROUTINE Allocate_Shared_Real_1_nValINT8 -SUBROUTINE Allocate_Shared_INTEGER_nValKIND(nVal,SM_WIN,DataPointer& +SUBROUTINE Allocate_Shared_Int_1_nValINT8(nVal,SM_WIN,DataPointer& #ifdef DEBUG_MEMORY ,SM_WIN_NAME& #endif /*DEBUG_MEMORY*/ @@ -782,11 +782,11 @@ SUBROUTINE Allocate_Shared_INTEGER_nValKIND(nVal,SM_WIN,DataPointer& IMPLICIT NONE !---------------------------------------------------------------------------------------------------------------------------------- ! INPUT/OUTPUT VARIABLES -INTEGER(KIND=IK),INTENT(IN) :: nVal(1) !> Local number of variables in each rank -INTEGER,INTENT(OUT) :: SM_WIN !> Shared memory window -INTEGER ,INTENT(OUT),POINTER :: DataPointer(:) !> Pointer to the RMA window +INTEGER(KIND=SELECTED_INT_KIND(18)),INTENT(IN) :: nVal(1) !> Local number of variables in each rank +INTEGER,INTENT(OUT) :: SM_WIN !> Shared memory window +INTEGER ,INTENT(OUT),POINTER :: DataPointer(:) !> Pointer to the RMA window #ifdef DEBUG_MEMORY -CHARACTER(LEN=*),INTENT(IN) :: SM_WIN_NAME !> Shared memory window name +CHARACTER(LEN=*),INTENT(IN) :: SM_WIN_NAME !> Shared memory window name #endif /*DEBUG_MEMORY*/ !---------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES @@ -818,9 +818,9 @@ SUBROUTINE Allocate_Shared_INTEGER_nValKIND(nVal,SM_WIN,DataPointer& ! SM_PTR can now be associated with a Fortran pointer and thus used to access the shared data CALL C_F_POINTER(SM_PTR, DataPointer,nVal) -END SUBROUTINE Allocate_Shared_INTEGER_nValKIND +END SUBROUTINE Allocate_Shared_Int_1_nValINT8 -SUBROUTINE Allocate_Shared_INTEGER_nValKIND_DataPointKIND2(nVal,SM_WIN,DataPointer& +SUBROUTINE Allocate_Shared_Int_1_nValKIND_DataPointKIND2(nVal,SM_WIN,DataPointer& #ifdef DEBUG_MEMORY ,SM_WIN_NAME& #endif /*DEBUG_MEMORY*/ @@ -833,9 +833,9 @@ SUBROUTINE Allocate_Shared_INTEGER_nValKIND_DataPointKIND2(nVal,SM_WIN,DataPoint IMPLICIT NONE !---------------------------------------------------------------------------------------------------------------------------------- ! INPUT/OUTPUT VARIABLES -INTEGER(KIND=IK),INTENT(IN) :: nVal(1) !> Local number of variables in each rank +INTEGER(KIND=IK),INTENT(IN) :: nVal(1) !> Local number of variables in each rank INTEGER,INTENT(OUT) :: SM_WIN !> Shared memory window -INTEGER(KIND=2),INTENT(OUT),POINTER :: DataPointer(:) !> Pointer to the RMA window +INTEGER(KIND=2),INTENT(OUT),POINTER :: DataPointer(:) !> Pointer to the RMA window #ifdef DEBUG_MEMORY CHARACTER(LEN=*),INTENT(IN) :: SM_WIN_NAME !> Shared memory window name #endif /*DEBUG_MEMORY*/ @@ -869,7 +869,7 @@ SUBROUTINE Allocate_Shared_INTEGER_nValKIND_DataPointKIND2(nVal,SM_WIN,DataPoint ! SM_PTR can now be associated with a Fortran pointer and thus used to access the shared data CALL C_F_POINTER(SM_PTR, DataPointer,nVal) -END SUBROUTINE Allocate_Shared_INTEGER_nValKIND_DataPointKIND2 +END SUBROUTINE Allocate_Shared_Int_1_nValKIND_DataPointKIND2 !================================================================================================================================== !> Allocate data with MPI-3 shared memory option From 133fb33b82875d833e011ebe59cec2756c21f7c1 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Thu, 12 Oct 2023 20:38:03 +0200 Subject: [PATCH 240/495] Cleanup of INTERFACE Allocate_Shared overloading for different integer KIND declarations --- src/mpi/mpi_shared.f90 | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/mpi/mpi_shared.f90 b/src/mpi/mpi_shared.f90 index 83c95c326..1a9a88b0c 100644 --- a/src/mpi/mpi_shared.f90 +++ b/src/mpi/mpi_shared.f90 @@ -45,19 +45,19 @@ MODULE MOD_MPI_Shared MODULE PROCEDURE Allocate_Shared_Logical_1 MODULE PROCEDURE Allocate_Shared_Logical_2 MODULE PROCEDURE Allocate_Shared_Int_1 + MODULE PROCEDURE Allocate_Shared_Int_1_nValINT8 + MODULE PROCEDURE Allocate_Shared_Int_1_nValKIND_DataPointKIND2 MODULE PROCEDURE Allocate_Shared_Int_2 MODULE PROCEDURE Allocate_Shared_Int_3 MODULE PROCEDURE Allocate_Shared_Int_4 ! MODULE PROCEDURE Allocate_Shared_Int_1_Kind_IK MODULE PROCEDURE Allocate_Shared_Real_1 + MODULE PROCEDURE Allocate_Shared_Real_1_nValINT8 MODULE PROCEDURE Allocate_Shared_Real_2 MODULE PROCEDURE Allocate_Shared_Real_3 MODULE PROCEDURE Allocate_Shared_Real_4 MODULE PROCEDURE Allocate_Shared_Real_5 MODULE PROCEDURE Allocate_Shared_Real_6 - MODULE PROCEDURE Allocate_Shared_REAL_nValKIND - MODULE PROCEDURE Allocate_Shared_INTEGER_nValKIND - MODULE PROCEDURE Allocate_Shared_INTEGER_nValKIND_DataPointKIND2 END INTERFACE PUBLIC::DefineParametersMPIShared @@ -647,7 +647,7 @@ SUBROUTINE Allocate_Shared_Real_1(nVal,SM_WIN,DataPointer& END SUBROUTINE ALLOCATE_SHARED_REAL_1 -SUBROUTINE Allocate_Shared_REAL_nValKIND(nVal,SM_WIN,DataPointer& +SUBROUTINE Allocate_Shared_Real_1_nValINT8(nVal,SM_WIN,DataPointer& #ifdef DEBUG_MEMORY ,SM_WIN_NAME& #endif /*DEBUG_MEMORY*/ @@ -660,11 +660,11 @@ SUBROUTINE Allocate_Shared_REAL_nValKIND(nVal,SM_WIN,DataPointer& IMPLICIT NONE !---------------------------------------------------------------------------------------------------------------------------------- ! INPUT/OUTPUT VARIABLES -INTEGER(KIND=IK),INTENT(IN) :: nVal(1) !> Local number of variables in each rank -INTEGER,INTENT(OUT) :: SM_WIN !> Shared memory window +INTEGER(KIND=SELECTED_INT_KIND(18)),INTENT(IN) :: nVal(1) !> Local number of variables in each rank +INTEGER,INTENT(OUT) :: SM_WIN !> Shared memory window REAL ,INTENT(OUT),POINTER :: DataPointer(:) !> Pointer to the RMA window #ifdef DEBUG_MEMORY -CHARACTER(LEN=*),INTENT(IN) :: SM_WIN_NAME !> Shared memory window name +CHARACTER(LEN=*),INTENT(IN) :: SM_WIN_NAME !> Shared memory window name #endif /*DEBUG_MEMORY*/ !---------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES @@ -696,10 +696,10 @@ SUBROUTINE Allocate_Shared_REAL_nValKIND(nVal,SM_WIN,DataPointer& ! SM_PTR can now be associated with a Fortran pointer and thus used to access the shared data CALL C_F_POINTER(SM_PTR, DataPointer,nVal) -END SUBROUTINE Allocate_Shared_REAL_nValKIND +END SUBROUTINE Allocate_Shared_Real_1_nValINT8 -SUBROUTINE Allocate_Shared_INTEGER_nValKIND(nVal,SM_WIN,DataPointer& +SUBROUTINE Allocate_Shared_Int_1_nValINT8(nVal,SM_WIN,DataPointer& #ifdef DEBUG_MEMORY ,SM_WIN_NAME& #endif /*DEBUG_MEMORY*/ @@ -712,11 +712,11 @@ SUBROUTINE Allocate_Shared_INTEGER_nValKIND(nVal,SM_WIN,DataPointer& IMPLICIT NONE !---------------------------------------------------------------------------------------------------------------------------------- ! INPUT/OUTPUT VARIABLES -INTEGER(KIND=IK),INTENT(IN) :: nVal(1) !> Local number of variables in each rank -INTEGER,INTENT(OUT) :: SM_WIN !> Shared memory window -INTEGER ,INTENT(OUT),POINTER :: DataPointer(:) !> Pointer to the RMA window +INTEGER(KIND=SELECTED_INT_KIND(18)),INTENT(IN) :: nVal(1) !> Local number of variables in each rank +INTEGER,INTENT(OUT) :: SM_WIN !> Shared memory window +INTEGER ,INTENT(OUT),POINTER :: DataPointer(:) !> Pointer to the RMA window #ifdef DEBUG_MEMORY -CHARACTER(LEN=*),INTENT(IN) :: SM_WIN_NAME !> Shared memory window name +CHARACTER(LEN=*),INTENT(IN) :: SM_WIN_NAME !> Shared memory window name #endif /*DEBUG_MEMORY*/ !---------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES @@ -748,9 +748,9 @@ SUBROUTINE Allocate_Shared_INTEGER_nValKIND(nVal,SM_WIN,DataPointer& ! SM_PTR can now be associated with a Fortran pointer and thus used to access the shared data CALL C_F_POINTER(SM_PTR, DataPointer,nVal) -END SUBROUTINE Allocate_Shared_INTEGER_nValKIND +END SUBROUTINE Allocate_Shared_Int_1_nValINT8 -SUBROUTINE Allocate_Shared_INTEGER_nValKIND_DataPointKIND2(nVal,SM_WIN,DataPointer& +SUBROUTINE Allocate_Shared_Int_1_nValKIND_DataPointKIND2(nVal,SM_WIN,DataPointer& #ifdef DEBUG_MEMORY ,SM_WIN_NAME& #endif /*DEBUG_MEMORY*/ @@ -763,9 +763,9 @@ SUBROUTINE Allocate_Shared_INTEGER_nValKIND_DataPointKIND2(nVal,SM_WIN,DataPoint IMPLICIT NONE !---------------------------------------------------------------------------------------------------------------------------------- ! INPUT/OUTPUT VARIABLES -INTEGER(KIND=IK),INTENT(IN) :: nVal(1) !> Local number of variables in each rank +INTEGER(KIND=IK),INTENT(IN) :: nVal(1) !> Local number of variables in each rank INTEGER,INTENT(OUT) :: SM_WIN !> Shared memory window -INTEGER(KIND=2),INTENT(OUT),POINTER :: DataPointer(:) !> Pointer to the RMA window +INTEGER(KIND=2),INTENT(OUT),POINTER :: DataPointer(:) !> Pointer to the RMA window #ifdef DEBUG_MEMORY CHARACTER(LEN=*),INTENT(IN) :: SM_WIN_NAME !> Shared memory window name #endif /*DEBUG_MEMORY*/ @@ -799,7 +799,7 @@ SUBROUTINE Allocate_Shared_INTEGER_nValKIND_DataPointKIND2(nVal,SM_WIN,DataPoint ! SM_PTR can now be associated with a Fortran pointer and thus used to access the shared data CALL C_F_POINTER(SM_PTR, DataPointer,nVal) -END SUBROUTINE Allocate_Shared_INTEGER_nValKIND_DataPointKIND2 +END SUBROUTINE Allocate_Shared_Int_1_nValKIND_DataPointKIND2 !================================================================================================================================== !> Allocate data with MPI-3 shared memory option From f1ff79938fab560a3292fea937525cb3a6eee583 Mon Sep 17 00:00:00 2001 From: Julian Beyer Date: Sat, 14 Oct 2023 12:45:04 +0200 Subject: [PATCH 241/495] removed warnings and cylinder absorption bug --- src/radiation/radiation_solver/radiation_init.f90 | 2 +- src/radiation/radiation_solver/radiation_readin.f90 | 5 +++-- src/radiation/radiative_transfer/radtrans_init.f90 | 3 ++- src/radiation/radiative_transfer/radtrans_output.f90 | 4 ++-- src/radiation/radiative_transfer/tracking/radtrans_tools.f90 | 2 +- 5 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/radiation/radiation_solver/radiation_init.f90 b/src/radiation/radiation_solver/radiation_init.f90 index f6bbb3672..f61a09113 100644 --- a/src/radiation/radiation_solver/radiation_init.f90 +++ b/src/radiation/radiation_solver/radiation_init.f90 @@ -212,7 +212,7 @@ SUBROUTINE InitRadiation() IF (RadiationParameter%WaveLenReductionFactor.NE.1) THEN RadiationParameter%WaveLenIncrCoarse = (RadiationParameter%MaxWaveLen - RadiationParameter%MinWaveLen) & / (RadiationParameter%WaveLenDiscr*RadiationParameter%WaveLenReductionFactor-1) - DO iWaveLen = 1, RadiationParameter%WaveLenIncrCoarse + DO iWaveLen = 1, NINT(RadiationParameter%WaveLenIncrCoarse) RadiationParameter%WaveLenCoarse(iWaveLen) = RadiationParameter%MinWaveLen + (iWaveLen-1) * RadiationParameter%WaveLenIncrCoarse END DO END IF diff --git a/src/radiation/radiation_solver/radiation_readin.f90 b/src/radiation/radiation_solver/radiation_readin.f90 index d678cb71d..0a2fb20cb 100644 --- a/src/radiation/radiation_solver/radiation_readin.f90 +++ b/src/radiation/radiation_solver/radiation_readin.f90 @@ -181,8 +181,9 @@ SUBROUTINE Radiation_readin_molecules(iSpec) READ(304,*,IOSTAT = errtemp) hilf END DO charlen = LEN_TRIM(hilf) - hilf = TRIM(hilf(1:charlen-1)) - hilf = TRIM(hilf(7:charlen-1)) + hilf(1:charlen-7) = hilf(7:charlen-1) + hilf(charlen-6:charlen) = ' ' + hilf=TRIM(hilf) SpeciesRadiation(iSpec)%BandName(iLoop) = hilf READ(304,*,IOSTAT = errtemp) hilf diff --git a/src/radiation/radiative_transfer/radtrans_init.f90 b/src/radiation/radiative_transfer/radtrans_init.f90 index b7cefc4a8..8693b4e8b 100644 --- a/src/radiation/radiative_transfer/radtrans_init.f90 +++ b/src/radiation/radiative_transfer/radtrans_init.f90 @@ -76,7 +76,7 @@ SUBROUTINE InitRadiationTransport() USE MOD_Globals_Vars, ONLY : BoltzmannConst, PlanckConst USE MOD_Particle_Boundary_Sampling, ONLY : InitParticleBoundarySampling USE MOD_Particle_Boundary_Vars, ONLY : nComputeNodeSurfTotalSides!, SurfMesh -USE MOD_Radiation_Vars, ONLY : RadiationParameter, Radiation_Emission_spec, Radiation_Absorption_spec, RadiationSwitches +USE MOD_Radiation_Vars, ONLY : RadiationParameter, Radiation_Emission_spec, Radiation_Absorption_spec, RadiationSwitches, Radiation_Absorption_SpecPercent USE MOD_RadiationTrans_Vars, ONLY : RadObservation_Emission USE MOD_Radiation, ONLY : radiation_main USE MOD_DSMC_Vars, ONLY: RadialWeighting @@ -347,6 +347,7 @@ SUBROUTINE InitRadiationTransport() DO iElem = firstElem, lastElem DO iWave = 1, RadiationParameter%WaveLenDiscr Radiation_Absorption_Spec(iWave, GetGlobalElemID(iElem)) = 1. + Radiation_Absorption_SpecPercent(iWave,:,GetGlobalElemID(iElem)) = 10000 END DO END DO CASE(3) !only radiation diff --git a/src/radiation/radiative_transfer/radtrans_output.f90 b/src/radiation/radiative_transfer/radtrans_output.f90 index 53fb09928..7626a96f8 100644 --- a/src/radiation/radiative_transfer/radtrans_output.f90 +++ b/src/radiation/radiative_transfer/radtrans_output.f90 @@ -151,8 +151,8 @@ SUBROUTINE WriteRadiationToHDF5() DO iElem=1, PP_nElems CNElemID = GetCNElemID(iElem+offSetElem) TempOutput(1, iElem) = Radiation_Emission_Spec_Total(CNElemID) - TempOutput(2, iElem) = RadiationElemAbsEnergy_Shared(1,iElem+offSetElem)/ElemVolume_Shared(CNElemID) - TempOutput(3, iElem) = Radiation_Emission_Spec_Total(CNElemID)- RadiationElemAbsEnergy_Shared(1,iElem+offSetElem)/ElemVolume_Shared(CNElemID) + TempOutput(2, iElem) = RadiationElemAbsEnergySpec_Shared(1,iElem+offSetElem)/ElemVolume_Shared(CNElemID) + TempOutput(3, iElem) = Radiation_Emission_Spec_Total(CNElemID)- RadiationElemAbsEnergySpec_Shared(1,iElem+offSetElem)/ElemVolume_Shared(CNElemID) TempOutput(4, iElem) = RadTransPhotPerCell(CNElemID) END DO ELSE IF (RadiationSwitches%RadType.EQ.3) THEN diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tools.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tools.f90 index 45afa924f..3b33617bb 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tools.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tools.f90 @@ -655,7 +655,7 @@ SUBROUTINE CalcAbsoprtionAnalytic(IntersectionPos,Element, DONE) USE MOD_Globals USE MOD_RadiationTrans_Vars, ONLY:PhotonProps, RadTrans USE MOD_RadiationTrans_Vars, ONLY:RadiationElemAbsEnergy, RadiationElemAbsEnergySpec - USE MOD_Radiation_Vars, ONLY:Radiation_Absorption_spec, Radiation_Absorption_SpecPercent + USE MOD_Radiation_Vars, ONLY:Radiation_Absorption_spec, Radiation_Absorption_SpecPercent, RadiationSwitches !--------------------------------------------------------------------------------------------------! IMPLICIT NONE ! !--------------------------------------------------------------------------------------------------! From bf8a7f6ce437309998a5615d6c3742b8b52b598c Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Sun, 15 Oct 2023 16:21:14 +0200 Subject: [PATCH 242/495] slightly increased tolerance of ray tracing reggie due to fluctuations --- .../volume_emission_rectangle_ray_trace_high-order/analyze.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/analyze.ini b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/analyze.ini index 11d8a4255..847a8b187 100644 --- a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/analyze.ini +++ b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/analyze.ini @@ -4,5 +4,5 @@ compare_column_file = PartAnalyze.csv ! data file name compare_column_reference_file = Electrons_ref.csv ! data file name compare_column_index = 9 ! column index for comparison -compare_column_tolerance_value = 2.5e9 ! tolerance (depends on machine accuracy and MPI) +compare_column_tolerance_value = 3e9 ! tolerance (depends on machine accuracy and MPI) compare_column_tolerance_type = absolute ! absolute or relative tolerance From 24d086a24176f7c3b8db1d519edb63f5ae5f0760 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Mon, 16 Oct 2023 11:42:33 +0200 Subject: [PATCH 243/495] Added best practices section to developer guide to collect best practice guidelines for bug prevention and improved computational performance. --- .../developerguide/bestpractices.md | 113 ++++++++++++++++++ docs/documentation/developerguide/index.md | 1 + docs/documentation/developerguide/mpi.md | 2 +- .../developerguide/troubleshooting.md | 5 +- 4 files changed, 118 insertions(+), 3 deletions(-) create mode 100644 docs/documentation/developerguide/bestpractices.md diff --git a/docs/documentation/developerguide/bestpractices.md b/docs/documentation/developerguide/bestpractices.md new file mode 100644 index 000000000..6e54cc2c4 --- /dev/null +++ b/docs/documentation/developerguide/bestpractices.md @@ -0,0 +1,113 @@ +# Best Practices + +The following collection of best practice guidelines are intended to prevent bugs and improve the computational performance. + +## MPI + +The general rules can be summarized as follows: + +> The first rule of MPI is: You do not send subsets of arrays, only complete continuous data ranges. +> The second rule of MPI is: You do not send subsets of arrays, only complete continuous data ranges. +> Third rule of MPI: Someone sends non-continuous data, the simulation is over. +> Fourth rule: Only two procs to a single send-receive message. +> Fifth rule: Only one proc access (read or write) toa shared memory region. + +## Shared Memory Windows + +The following principals should always be considered when using shared memory windows + +- Only the node root process initializes the shared memory array + + ! Allocate the shared memory window + CALL Allocate_Shared((/nUniqueGlobalNodes/), NodeVolume_Shared_Win, NodeVolume_Shared) + + ! Lock the window + CALL MPI_WIN_LOCK_ALL(0, NodeVolume_Shared_Win, IERROR) + + ! Set pointer + NodeVolume => NodeVolume_Shared + + ! Only CN root nullifies + IF (myComputeNodeRank.EQ.0) NodeVolume = 0.0 + + ! This sync/barrier is required as it cannot be guaranteed that the zeros have been + ! written to memory by the time the MPI_REDUCE is executed (see MPI specification). + ! Until the Sync is complete, the status is undefined, i.e., old or new value or utter + ! nonsense. + CALL BARRIER_AND_SYNC(NodeVolume_Shared_Win, MPI_COMM_SHARED) + +- When all processes on a node write to their separate region in the shared memory array, e.g., designated elements IDs which are + assigned to a single process only + + ! Get offset + ! J_N is only built for local DG elements. Therefore, array is only filled for elements on the same compute node + offsetElemCNProc = offsetElem - offsetComputeNodeElem + + ! Allocate shared array + CALL Allocate_Shared((/nComputeNodeElems/),ElemVolume_Shared_Win,ElemVolume_Shared) + ... + + ! Calculate element volumes + DO iElem = 1,nElems + CNElemID=iElem+offsetElemCNProc + !--- Calculate and save volume of element iElem + J_N(1,0:PP_N,0:PP_N,0:PP_N)=1./sJ(:,:,:,iElem) + DO k=0,PP_N; DO j=0,PP_N; DO i=0,PP_N + ElemVolume_Shared(CNElemID) = ElemVolume_Shared(CNElemID) + wGP(i)*wGP(j)*wGP(k)*J_N(1,i,j,k) + END DO; END DO; END DO + END DO + +- When all processes on a node write to all regions in the shared memory array, an additional local array is required + + CALL Allocate_Shared((/nSpecies,4,nSurfSample,nSurfSample,nComputeNodeSurfTotalSides/),SampWallImpactEnergy_Shared_Win,SampWallImpactEnergy_Shared) + CALL MPI_WIN_LOCK_ALL(0,SampWallImpactEnergy_Shared_Win,IERROR) + IF (myComputeNodeRank.EQ.0) SampWallImpactEnergy_Shared = 0. + CALL BARRIER_AND_SYNC(SampWallImpactEnergy_Shared_Win,MPI_COMM_SHARED) + ALLOCATE(SampWallImpactEnergy(1:nSpecies,1:4,1:nSurfSample,1:nSurfSample,1:nComputeNodeSurfTotalSides)) + SampWallImpactEnergy = 0. + SampWallImpactEnergy(SpecID,1,SubP,SubQ,SurfSideID) = SampWallImpactEnergy(SpecID,1,SubP,SubQ,SurfSideID) + ETrans * MPF + CALL MPI_REDUCE(SampWallImpactEnergy,SampWallImpactEnergy_Shared,MessageSize,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_SHARED,IERROR) + CALL BARRIER_AND_SYNC(SampWallImpactEnergy_Shared_Win,MPI_COMM_SHARED) + +- When possible, never read from the shared memory array in a round robin manner, as shown in this [commit [eaff78c]](https://github.com/piclas-framework/piclas/commit/eaff78c158884e0bab05c555bf72b4ff6198e42f). + Split the work and then use `MPI_REDUCE` or `MPI_ALLREDUCE`. + Instead of + + CNVolume = SUM(ElemVolume_Shared(:)) + + where all processes traverse over the same memory addresses, which slows down the computation, use + + offsetElemCNProc = offsetElem - offsetComputeNodeElem + CNVolume = SUM(ElemVolume_Shared(offsetElemCNProc+1:offsetElemCNProc+nElems)) + CALL MPI_ALLREDUCE(MPI_IN_PLACE,CNVolume,1,MPI_DOUBLE_PRECISION,MPI_SUM,MPI_COMM_SHARED,iError) + + to split the operations and use MPI to distribute the information among the processes. + +- [Use atomic MPI operations to read/write from contested shared memory [772c371]](https://github.com/piclas-framework/piclas/commit/772c3711bbb0c935659b2d08fccd18c80e6b72dc) + +## Hawk + +Before running a simulation, check out the HLRS Wiki pages [Batch System PBSPro (Hawk)](https://kb.hlrs.de/platforms/index.php/Batch_System_PBSPro_(Hawk)). + +### Striping +Always use user-defined striping in the simulation case folders that are on the work spaces as the default stiping setting (dynamic +striping) has caused massive problems in the past. Add the following code to your submit script + + # Set fixed striping to avoid problems with the progressive Lustre file layout + # - Region 1 [0, 1GiB): Stripe-Size=1 MiB, Stripe-Count=1 + #lfs setstripe -c 1 -S 1M $PBS_O_WORKDIR + # - Region 2 [1GiB, 4GiB): Stripe-Size=1 MiB, Stripe-Count=4 + #lfs setstripe -c 4 -S 1M $PBS_O_WORKDIR + # - Region 3 [4 GiB, EOF): Stripe-Size=4 MiB, Stripe-Count=8 + lfs setstripe -c 8 -S 4M $PBS_O_WORKDIR + +Note that the correct line should be commented in and the other lines should be commented out, all depending on the size of your +output files. +Also consider the stripe settings for large mesh files just to be sure. + +### Species-zero bug +It has repeatedly occurred that particles with species index zero have been produced on hawk. +This might be due to the output to .h5, which could reflect the previous section regarding the striping settings, but could also lie +deeper the Lustre file system itself. +If this problem occurs, the corrupted particles must be removed from the .h5 file by hand if a restart from such a corrupted file is +performed in order to prevent piclas from crashing. diff --git a/docs/documentation/developerguide/index.md b/docs/documentation/developerguide/index.md index 234ef9778..ffa8101b6 100644 --- a/docs/documentation/developerguide/index.md +++ b/docs/documentation/developerguide/index.md @@ -12,6 +12,7 @@ numbered: git_workflow.md building_guide.md styleguide.md +bestpractices.md troubleshooting.md code_extension.md functions_and_subroutines.md diff --git a/docs/documentation/developerguide/mpi.md b/docs/documentation/developerguide/mpi.md index bd8143130..86e97852b 100644 --- a/docs/documentation/developerguide/mpi.md +++ b/docs/documentation/developerguide/mpi.md @@ -1,7 +1,7 @@ # MPI Implementation This chapter describes how PICLas subroutines and functions are parallelized. - +Please also read the general rules for using {ref}`developerguide/bestpractices:MPI`. ## General Remarks: Things to consider In case any new communicator (e.g. SurfCOMM%COMM) is built during init or anywhere else with diff --git a/docs/documentation/developerguide/troubleshooting.md b/docs/documentation/developerguide/troubleshooting.md index 198ca6325..3f4b12a7e 100644 --- a/docs/documentation/developerguide/troubleshooting.md +++ b/docs/documentation/developerguide/troubleshooting.md @@ -23,8 +23,9 @@ at best using the multi-node feature `PICLAS_SHARED_MEMORY=OMPI_COMM_TYPE_CORE` - `CALL WriteArrayToHDF5()` with collective=.FALSE. when it is not 100% certain that all processes enter this routine **Explanation** -- Setting collective=.TRUE. triggers the usage of `H5FD_MPIO_COLLECTIVE_F` and `collective=.FALSE.` uses `H5FD_MPIO_INDEPENDENT_F` in - `H5PSET_DXPL_MPIO_F(PList_ID, H5FD_MPIO_INDEPENDENT_F, iError)`, which configures the "transfer mode" in the hdf5 output +- Setting `collective=.TRUE.` triggers the usage of `H5FD_MPIO_COLLECTIVE_F` (`collective=.FALSE.` uses `H5FD_MPIO_INDEPENDENT_F`) in + `H5PSET_DXPL_MPIO_F(PList_ID, H5FD_MPIO_INDEPENDENT_F, iError)`, which configures the "transfer mode" in the hdf5 output. + Collective MPI output requires that all processes take part in the operation! **git hashes** - One of these bugs was specifically fixed in From eb3d47dc61e96507d50c0fbabf9259a111a35ec8 Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Tue, 17 Oct 2023 16:56:12 +0200 Subject: [PATCH 244/495] Moved the duplication of MPI_COMM_PICLAS to InitMPI and OutputMPIW8Time into FinalizePiclas, where the last remaining communicator is freed aftewards --- src/globals/globals.f90 | 14 +++++++------- src/init/piclas_init.f90 | 9 +++++++++ src/mpi/mpi.f90 | 13 +++++-------- src/mpi/mpi_shared.f90 | 4 ---- src/mpi/mpi_vars.f90 | 1 - src/piclas.f90 | 5 ----- 6 files changed, 21 insertions(+), 25 deletions(-) diff --git a/src/globals/globals.f90 b/src/globals/globals.f90 index 474ae952f..7a3e901a0 100644 --- a/src/globals/globals.f90 +++ b/src/globals/globals.f90 @@ -36,16 +36,16 @@ MODULE MOD_Globals INTEGER :: myRank,myLocalRank,myLeaderRank,myWorkerRank INTEGER :: nProcessors,nLocalProcs,nLeaderProcs,nWorkerProcs LOGICAL :: GlobalNbrOfParticlesUpdated ! When FALSE, then global number of particles needs to be determined -INTEGER :: MPI_COMM_NODE ! local node subgroup -INTEGER :: MPI_COMM_LEADERS ! all node masters -INTEGER :: MPI_COMM_WORKERS ! all non-master nodes -INTEGER :: MPI_COMM_PICLAS ! all nodes LOGICAL :: MPIRoot,MPILocalRoot #if USE_MPI !#include "mpif.h" INTEGER :: MPIStatus(MPI_STATUS_SIZE) +INTEGER :: MPI_COMM_NODE ! local node subgroup +INTEGER :: MPI_COMM_LEADERS ! all node masters +INTEGER :: MPI_COMM_WORKERS ! all non-master nodes +INTEGER :: MPI_COMM_PICLAS ! all nodes #else -INTEGER,PARAMETER :: MPI_COMM_WORLD=-1 ! DUMMY when compiling single (MPI=OFF) +INTEGER,PARAMETER :: MPI_COMM_PICLAS=-1 ! DUMMY when compiling single (MPI=OFF) #endif LOGICAL :: MemoryMonitor !> Flag for turning RAM monitoring ON/OFF. Used for the detection of RAM overflows (e.g. due to memory leaks) @@ -388,7 +388,7 @@ SUBROUTINE AbortProg(SourceFile,SourceLine,CompDate,CompTime,ErrorMessage,IntInf #if USE_MPI signalout=2 ! MPI_ABORT requires an output error-code /=0 errOut = 1 -CALL MPI_ABORT(MPI_COMM_WORLD,signalout,errOut) +CALL MPI_ABORT(MPI_COMM_PICLAS,signalout,errOut) #endif STOP 2 END SUBROUTINE AbortProg @@ -461,7 +461,7 @@ SUBROUTINE CollectiveStop(SourceFile,SourceLine,CompDate,CompTime,ErrorMessage,I CALL FLUSH(UNIT_stdOut) #if USE_MPI -CALL MPI_BARRIER(MPI_COMM_WORLD,iError) +CALL MPI_BARRIER(MPI_COMM_PICLAS,iError) CALL MPI_FINALIZE(iError) #endif ERROR STOP 1 diff --git a/src/init/piclas_init.f90 b/src/init/piclas_init.f90 index 1727796d6..621bd1447 100644 --- a/src/init/piclas_init.f90 +++ b/src/init/piclas_init.f90 @@ -287,6 +287,9 @@ SUBROUTINE FinalizePiclas(IsLoadBalance) #if USE_MPI USE MOD_Particle_MPI ,ONLY: FinalizeParticleMPI USE MOD_Particle_MPI_Vars ,ONLY: ParticleMPIInitisdone +#if defined(MEASURE_MPI_WAIT) +USE MOD_MPI ,ONLY: OutputMPIW8Time +#endif /*defined(MEASURE_MPI_WAIT)*/ #endif /*USE_MPI*/ #endif /*PARTICLES*/ USE MOD_IO_HDF5 ,ONLY: FinalizeElemData,ElementOut @@ -380,6 +383,12 @@ SUBROUTINE FinalizePiclas(IsLoadBalance) #if USE_MPI ! Free the communicators! CALL FinalizeMPIShared() +#if defined(MEASURE_MPI_WAIT) + ! Collect the MPI_WAIT() over all procs and output + IF(nProcessors.GT.1) CALL OutputMPIW8Time() +#endif /*defined(MEASURE_MPI_WAIT)*/ + ! Free the last communicator after OutputMPIW8Time + IF(MPI_COMM_PICLAS.NE.MPI_COMM_NULL) CALL MPI_COMM_FREE(MPI_COMM_PICLAS,IERROR) #endif /*USE_MPI*/ ELSE CALL DisplaySimulationTime(Time, StartTime, 'RUNNING') diff --git a/src/mpi/mpi.f90 b/src/mpi/mpi.f90 index bb2eef7d3..39f8447ed 100644 --- a/src/mpi/mpi.f90 +++ b/src/mpi/mpi.f90 @@ -110,17 +110,15 @@ SUBROUTINE InitMPI() CALL MPI_INIT(iError) CALL MPI_INITIALIZED(initDone,iError) IF(.NOT.initDone) CALL MPI_INIT(iError) - IF(iError .NE. 0) & - CALL Abort(__STAMP__,'Error in MPI_INIT',iError) - MPI_COMM_LOC = MPI_COMM_WORLD + IF(iError .NE. 0) CALL Abort(__STAMP__,'Error in MPI_INIT',iError) + ! General communicator + CALL MPI_COMM_DUP (MPI_COMM_WORLD,MPI_COMM_PICLAS,iError) + MPI_COMM_LOC = MPI_COMM_PICLAS END IF CALL MPI_COMM_RANK(MPI_COMM_LOC, myRank , iError) CALL MPI_COMM_SIZE(MPI_COMM_LOC, nProcessors, iError) -IF(iError .NE. 0) & - CALL Abort(& - __STAMP__& - ,'Could not get rank and number of processors',iError) +IF(iError .NE. 0) CALL Abort(__STAMP__,'Could not get rank and number of processors',iError) MPIRoot=(myRank .EQ. 0) #else /*USE_MPI*/ myRank = 0 @@ -130,7 +128,6 @@ SUBROUTINE InitMPI() MPILocalRoot=.TRUE. #endif /*USE_MPI*/ -! At this point the initialization is not completed. We first have to create a new MPI communicator. MPIInitIsDone will be set END SUBROUTINE InitMPI diff --git a/src/mpi/mpi_shared.f90 b/src/mpi/mpi_shared.f90 index d818da02e..34b142f32 100644 --- a/src/mpi/mpi_shared.f90 +++ b/src/mpi/mpi_shared.f90 @@ -129,9 +129,6 @@ SUBROUTINE InitMPIShared() SWRITE(UNIT_StdOut,'(132("-"))') SWRITE(UNIT_stdOut,'(A)') ' INIT MPI SHARED COMMUNICATION ...' -! General communicator -CALL MPI_COMM_DUP (MPI_COMM_WORLD,MPI_COMM_PICLAS,iError) - ! Save the global number of procs nProcessors_Global = nProcessors @@ -1141,7 +1138,6 @@ SUBROUTINE FinalizeMPIShared() ! Free the shared communicator IF(MPI_COMM_SHARED .NE.MPI_COMM_NULL) CALL MPI_COMM_FREE(MPI_COMM_SHARED ,IERROR) IF(MPI_COMM_LEADERS_SHARED.NE.MPI_COMM_NULL) CALL MPI_COMM_FREE(MPI_COMM_LEADERS_SHARED,IERROR) -IF(MPI_COMM_PICLAS .NE.MPI_COMM_NULL) CALL MPI_COMM_FREE(MPI_COMM_PICLAS ,IERROR) MPISharedInitIsDone=.FALSE. END SUBROUTINE FinalizeMPIShared diff --git a/src/mpi/mpi_vars.f90 b/src/mpi/mpi_vars.f90 index 038ec10be..211700866 100644 --- a/src/mpi/mpi_vars.f90 +++ b/src/mpi/mpi_vars.f90 @@ -32,7 +32,6 @@ MODULE MOD_MPI_Vars INTEGER :: iNbProc INTEGER :: nSendVal,nRecVal,DataSizeSide INTEGER :: SideID_start,SideID_end -LOGICAL :: MPIInitIsDone=.FALSE. #if USE_MPI INTEGER :: nNbProcs ! number of neighbor procs INTEGER,ALLOCATABLE :: NbProc(:) ! iProc list of neighbor procs; allocated from 1:nNbProcs diff --git a/src/piclas.f90 b/src/piclas.f90 index 4f21d4847..cd7043962 100644 --- a/src/piclas.f90 +++ b/src/piclas.f90 @@ -58,11 +58,6 @@ PROGRAM Piclas ! Finalize CALL FinalizePiclas(IsLoadBalance=.FALSE.) -#if defined(MEASURE_MPI_WAIT) -! Collect the MPI_WAIT() over all procs and output -IF(nProcessors.GT.1) CALL OutputMPIW8Time() -#endif /*defined(MEASURE_MPI_WAIT)*/ - ! MPI #if USE_MPI ! We also have to finalize MPI itself here From 150ce04967f9e6fbf5304c2a65b7267995677ef5 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Tue, 17 Oct 2023 18:43:39 +0200 Subject: [PATCH 245/495] Added best practices section to developer guide to collect best practice guidelines for bug prevention and improved computational performance. --- .../developerguide/bestpractices.md | 116 ++++++++++++++++++ docs/documentation/developerguide/index.md | 1 + docs/documentation/developerguide/mpi.md | 2 +- .../developerguide/troubleshooting.md | 5 +- 4 files changed, 121 insertions(+), 3 deletions(-) create mode 100644 docs/documentation/developerguide/bestpractices.md diff --git a/docs/documentation/developerguide/bestpractices.md b/docs/documentation/developerguide/bestpractices.md new file mode 100644 index 000000000..77b032fa0 --- /dev/null +++ b/docs/documentation/developerguide/bestpractices.md @@ -0,0 +1,116 @@ +# Best Practices + +The following collection of best practice guidelines are intended to prevent bugs and improve the computational performance. + +## MPI + +The general rules can be summarized as follows: + +> The first rule of MPI is: You do not send subsets of arrays, only complete continuous data ranges. +> The second rule of MPI is: You do not send subsets of arrays, only complete continuous data ranges. +> Third rule of MPI: Someone sends non-continuous data, the simulation is over. +> Fourth rule: Only two procs to a single send-receive message. +> Fifth rule: Only one proc access (read or write) toa shared memory region. + +Please also read the general implementation information and, e.g., mappings used for elements, sides and nodes in the chapter +{ref}`developerguide/mpi:MPI Implementation`. + +## Shared Memory Windows + +The following principals should always be considered when using shared memory windows + +- Only the node root process initializes the shared memory array + + ! Allocate the shared memory window + CALL Allocate_Shared((/nUniqueGlobalNodes/), NodeVolume_Shared_Win, NodeVolume_Shared) + + ! Lock the window + CALL MPI_WIN_LOCK_ALL(0, NodeVolume_Shared_Win, IERROR) + + ! Set pointer + NodeVolume => NodeVolume_Shared + + ! Only CN root nullifies + IF (myComputeNodeRank.EQ.0) NodeVolume = 0.0 + + ! This sync/barrier is required as it cannot be guaranteed that the zeros have been + ! written to memory by the time the MPI_REDUCE is executed (see MPI specification). + ! Until the Sync is complete, the status is undefined, i.e., old or new value or utter + ! nonsense. + CALL BARRIER_AND_SYNC(NodeVolume_Shared_Win, MPI_COMM_SHARED) + +- When all processes on a node write to their separate region in the shared memory array, e.g., designated elements IDs which are + assigned to a single process only + + ! Get offset + ! J_N is only built for local DG elements. Therefore, array is only filled for elements on the same compute node + offsetElemCNProc = offsetElem - offsetComputeNodeElem + + ! Allocate shared array + CALL Allocate_Shared((/nComputeNodeElems/),ElemVolume_Shared_Win,ElemVolume_Shared) + ... + + ! Calculate element volumes + DO iElem = 1,nElems + CNElemID=iElem+offsetElemCNProc + !--- Calculate and save volume of element iElem + J_N(1,0:PP_N,0:PP_N,0:PP_N)=1./sJ(:,:,:,iElem) + DO k=0,PP_N; DO j=0,PP_N; DO i=0,PP_N + ElemVolume_Shared(CNElemID) = ElemVolume_Shared(CNElemID) + wGP(i)*wGP(j)*wGP(k)*J_N(1,i,j,k) + END DO; END DO; END DO + END DO + +- When all processes on a node write to all regions in the shared memory array, an additional local array is required + + CALL Allocate_Shared((/nSpecies,4,nSurfSample,nSurfSample,nComputeNodeSurfTotalSides/),SampWallImpactEnergy_Shared_Win,SampWallImpactEnergy_Shared) + CALL MPI_WIN_LOCK_ALL(0,SampWallImpactEnergy_Shared_Win,IERROR) + IF (myComputeNodeRank.EQ.0) SampWallImpactEnergy_Shared = 0. + CALL BARRIER_AND_SYNC(SampWallImpactEnergy_Shared_Win,MPI_COMM_SHARED) + ALLOCATE(SampWallImpactEnergy(1:nSpecies,1:4,1:nSurfSample,1:nSurfSample,1:nComputeNodeSurfTotalSides)) + SampWallImpactEnergy = 0. + SampWallImpactEnergy(SpecID,1,SubP,SubQ,SurfSideID) = SampWallImpactEnergy(SpecID,1,SubP,SubQ,SurfSideID) + ETrans * MPF + CALL MPI_REDUCE(SampWallImpactEnergy,SampWallImpactEnergy_Shared,MessageSize,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_SHARED,IERROR) + CALL BARRIER_AND_SYNC(SampWallImpactEnergy_Shared_Win,MPI_COMM_SHARED) + +- When possible, never read from the shared memory array in a round robin manner, as shown in this [commit [eaff78c]](https://github.com/piclas-framework/piclas/commit/eaff78c158884e0bab05c555bf72b4ff6198e42f). + Split the work and then use `MPI_REDUCE` or `MPI_ALLREDUCE`. + Instead of + + CNVolume = SUM(ElemVolume_Shared(:)) + + where all processes traverse over the same memory addresses, which slows down the computation, use + + offsetElemCNProc = offsetElem - offsetComputeNodeElem + CNVolume = SUM(ElemVolume_Shared(offsetElemCNProc+1:offsetElemCNProc+nElems)) + CALL MPI_ALLREDUCE(MPI_IN_PLACE,CNVolume,1,MPI_DOUBLE_PRECISION,MPI_SUM,MPI_COMM_SHARED,iError) + + to split the operations and use MPI to distribute the information among the processes. + +- [Use atomic MPI operations to read/write from contested shared memory [772c371]](https://github.com/piclas-framework/piclas/commit/772c3711bbb0c935659b2d08fccd18c80e6b72dc) + +## Hawk + +Before running a simulation, check out the HLRS Wiki pages [Batch System PBSPro (Hawk)](https://kb.hlrs.de/platforms/index.php/Batch_System_PBSPro_(Hawk)). + +### Striping +Always use user-defined striping in the simulation case folders that are on the work spaces as the default stiping setting (dynamic +striping) has caused massive problems in the past. Add the following code to your submit script + + # Set fixed striping to avoid problems with the progressive Lustre file layout + # - Region 1 [0, 1GiB): Stripe-Size=1 MiB, Stripe-Count=1 + #lfs setstripe -c 1 -S 1M $PBS_O_WORKDIR + # - Region 2 [1GiB, 4GiB): Stripe-Size=1 MiB, Stripe-Count=4 + #lfs setstripe -c 4 -S 1M $PBS_O_WORKDIR + # - Region 3 [4 GiB, EOF): Stripe-Size=4 MiB, Stripe-Count=8 + lfs setstripe -c 8 -S 4M $PBS_O_WORKDIR + +Note that the correct line should be commented in and the other lines should be commented out, all depending on the size of your +output files. +Also consider the stripe settings for large mesh files just to be sure. + +### Species-zero bug +It has repeatedly occurred that particles with species index zero have been produced on hawk. +This might be due to the output to .h5, which could reflect the previous section regarding the striping settings, but could also lie +deeper the Lustre file system itself. +If this problem occurs, the corrupted particles must be removed from the .h5 file by hand if a restart from such a corrupted file is +performed in order to prevent piclas from crashing. diff --git a/docs/documentation/developerguide/index.md b/docs/documentation/developerguide/index.md index 234ef9778..ffa8101b6 100644 --- a/docs/documentation/developerguide/index.md +++ b/docs/documentation/developerguide/index.md @@ -12,6 +12,7 @@ numbered: git_workflow.md building_guide.md styleguide.md +bestpractices.md troubleshooting.md code_extension.md functions_and_subroutines.md diff --git a/docs/documentation/developerguide/mpi.md b/docs/documentation/developerguide/mpi.md index bd8143130..86e97852b 100644 --- a/docs/documentation/developerguide/mpi.md +++ b/docs/documentation/developerguide/mpi.md @@ -1,7 +1,7 @@ # MPI Implementation This chapter describes how PICLas subroutines and functions are parallelized. - +Please also read the general rules for using {ref}`developerguide/bestpractices:MPI`. ## General Remarks: Things to consider In case any new communicator (e.g. SurfCOMM%COMM) is built during init or anywhere else with diff --git a/docs/documentation/developerguide/troubleshooting.md b/docs/documentation/developerguide/troubleshooting.md index 198ca6325..3f4b12a7e 100644 --- a/docs/documentation/developerguide/troubleshooting.md +++ b/docs/documentation/developerguide/troubleshooting.md @@ -23,8 +23,9 @@ at best using the multi-node feature `PICLAS_SHARED_MEMORY=OMPI_COMM_TYPE_CORE` - `CALL WriteArrayToHDF5()` with collective=.FALSE. when it is not 100% certain that all processes enter this routine **Explanation** -- Setting collective=.TRUE. triggers the usage of `H5FD_MPIO_COLLECTIVE_F` and `collective=.FALSE.` uses `H5FD_MPIO_INDEPENDENT_F` in - `H5PSET_DXPL_MPIO_F(PList_ID, H5FD_MPIO_INDEPENDENT_F, iError)`, which configures the "transfer mode" in the hdf5 output +- Setting `collective=.TRUE.` triggers the usage of `H5FD_MPIO_COLLECTIVE_F` (`collective=.FALSE.` uses `H5FD_MPIO_INDEPENDENT_F`) in + `H5PSET_DXPL_MPIO_F(PList_ID, H5FD_MPIO_INDEPENDENT_F, iError)`, which configures the "transfer mode" in the hdf5 output. + Collective MPI output requires that all processes take part in the operation! **git hashes** - One of these bugs was specifically fixed in From 81d7df3f80baa824dc0f58ea37e2e8cf45926b1b Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Tue, 17 Oct 2023 19:32:03 +0200 Subject: [PATCH 246/495] git ignore gitlab-ci-local temp files and folders --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index 647adb275..5930d3be9 100644 --- a/.gitignore +++ b/.gitignore @@ -80,3 +80,7 @@ doxygen/ # unit test unitTests/bin/ + +# gitlab-ci-local temp files and folders +.gitlab-ci-local/ +reggie/ From 2d324e9749a23d1d08fb5a23e71aea10eebdf24f Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Tue, 17 Oct 2023 21:32:49 +0200 Subject: [PATCH 247/495] Added sanity checks for ray tracing output: 1st energy, 2nd energy and element volume. Abort if the cell-local values do not match the sum of the nodal points on Nloc and NMax. Fixed relative tolerance at 1e-6 for now. --- .../tracking/radtrans_tracking_output.f90 | 79 +++++++++++++++++-- 1 file changed, 73 insertions(+), 6 deletions(-) diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 index 4db924944..cf975df7d 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 @@ -80,6 +80,7 @@ SUBROUTINE WritePhotonVolSampleToHDF5() REAL :: IntegrationWeight REAL :: Vdm_GaussN_NMax(0:PP_N,0:Ray%NMax) !< for interpolation to Analyze points (from NodeType nodes to Gauss-Lobatto nodes) REAL, ALLOCATABLE :: Vdm_GaussN_Nloc(:,:) !< for interpolation to Analyze points (from NodeType nodes to Gauss-Lobatto nodes) +REAL, PARAMETER :: tolerance=1e-6 !=================================================================================================================================== SWRITE(UNIT_stdOut,'(a)',ADVANCE='NO') ' WRITE Radiation TO HDF5 FILE...' @@ -112,11 +113,6 @@ SUBROUTINE WritePhotonVolSampleToHDF5() StrVarNames(4)='PhotonEnergyDensity1st' StrVarNames(5)='PhotonEnergyDensity2nd' -! Generate skeleton for the file with all relevant data on a single proc (MPIRoot) -IF(MPIRoot) CALL GenerateFileSkeleton('RadiationVolState',nVarRay,StrVarNames,TRIM(MeshFile),0.,FileNameIn=RadiationVolState,NIn=Ray%NMax,NodeType_in=Ray%NodeType) -#if USE_MPI - CALL MPI_BARRIER(MPI_COMM_WORLD,iError) -#endif #if USE_MPI CALL ExchangeRayVolInfo() #endif /*USE_MPI*/ @@ -202,10 +198,44 @@ SUBROUTINE WritePhotonVolSampleToHDF5() END DO ! m IF(PP_N.NE.Nloc) DEALLOCATE(Vdm_GaussN_Nloc) + ! Sanity checks: Low order + ! 1.) compare sum of sub-volumes with cell-const value and abort + ! 2.) compare sum of sub-cell energies with cell-const value and abort (1st and 2nd energies) + ! 1st energy + IF(RayElemPassedEnergyLoc1st(iElem).GT.0.0)THEN + IF(.NOT.ALMOSTEQUALRELATIVE(RayElemPassedEnergyLoc1st(iElem), SUM(U_N_Ray(iGlobalElem)%U(1,:,:,:)), tolerance))THEN + IPWRITE(UNIT_StdOut,*) "iElem,iGlobalElem = ", iElem,iGlobalElem + IPWRITE(UNIT_StdOut,*) "RayElemPassedEnergyLoc1st(iElem) = ", RayElemPassedEnergyLoc1st(iElem) + IPWRITE(UNIT_StdOut,*) "SUM(U_N_Ray(iGlobalElem)%U(1,:,:,:)) = ", SUM(U_N_Ray(iGlobalElem)%U(1,:,:,:)) + CALL abort(__STAMP__,'Before: RayElemPassedEnergyLoc1st does not match U_N_Ray%U(1) for tolerance = ',RealInfoOpt=tolerance) + END IF + END IF + ! 2nd energy + IF(RayElemPassedEnergyLoc2nd(iElem).GT.0.0)THEN + IPWRITE(UNIT_StdOut,*) "iElem,iGlobalElem = ", iElem,iGlobalElem + IPWRITE(UNIT_StdOut,*) "RayElemPassedEnergyLoc2nd(iElem) = ", RayElemPassedEnergyLoc2nd(iElem) + IPWRITE(UNIT_StdOut,*) "SUM(U_N_Ray(iGlobalElem)%U(2,:,:,:)) = ", SUM(U_N_Ray(iGlobalElem)%U(2,:,:,:)) + IF(.NOT.ALMOSTEQUALRELATIVE(RayElemPassedEnergyLoc2nd(iElem), SUM(U_N_Ray(iGlobalElem)%U(2,:,:,:)), tolerance))THEN + + CALL abort(__STAMP__,'Before: RayElemPassedEnergyLoc1st does not match U_N_Ray%U(2) for tolerance = ',RealInfoOpt=tolerance) + END IF + END IF + ! volume + IF(ElemVolume(iElem).GT.0.0)THEN + IF(.NOT.ALMOSTEQUALRELATIVE(ElemVolume(iElem), SUM(U_N_Ray(iGlobalElem)%U(3,:,:,:)), tolerance))THEN + IPWRITE(UNIT_StdOut,*) "iElem,iGlobalElem = ", iElem,iGlobalElem + IPWRITE(UNIT_StdOut,*) "ElemVolume(iElem) = ", ElemVolume(iElem) + IPWRITE(UNIT_StdOut,*) "SUM(U_N_Ray(iGlobalElem)%U(3,:,:,:)) = ", SUM(U_N_Ray(iGlobalElem)%U(3,:,:,:)) + CALL abort(__STAMP__,'Before: ElemVolume(iElem) does not match U_N_Ray%U(3) for tolerance = ',RealInfoOpt=tolerance) + END IF + END IF + ! Calculate the photon energy density on Nloc U_N_Ray(iGlobalElem)%U(4,:,:,:) = U_N_Ray(iGlobalElem)%U(1,:,:,:)/U_N_Ray(iGlobalElem)%U(3,:,:,:) U_N_Ray(iGlobalElem)%U(5,:,:,:) = U_N_Ray(iGlobalElem)%U(2,:,:,:)/U_N_Ray(iGlobalElem)%U(3,:,:,:) + ! Map from Nloc to NMax for output to .h5 on the highest polynomial degree NMax + ! The higher order element volume UNMax(3,:,:,:,:) is over-written later on IF(Nloc.EQ.Ray%Nmax)THEN UNMax(:,:,:,:,iElem) = U_N_Ray(iGlobalElem)%U(:,:,:,:) ELSE @@ -215,7 +245,6 @@ SUBROUTINE WritePhotonVolSampleToHDF5() ! Copy data from global array (later used for emission) U_N_Ray_loc(iElem)%U(:,:,:,:) = U_N_Ray(iGlobalElem)%U(:,:,:,:) - ! Apply integration weights and the Jacobian ! Interpolate the Jacobian to the analyze grid: be careful we interpolate the inverse of the inverse of the Jacobian ;-) J_N(1,0:PP_N,0:PP_N,0:PP_N)=1./sJ(:,:,:,iElem) @@ -232,8 +261,46 @@ SUBROUTINE WritePhotonVolSampleToHDF5() END DO ! l END DO ! m + ! Sanity checks: High order + ! 1.) compare sum of sub-volumes with cell-const value and abort + ! 2.) compare sum of sub-cell energies with cell-const value and abort (1st and 2nd energies) + ! 1st energy + IF(RayElemPassedEnergyLoc1st(iElem).GT.0.0)THEN + IF(.NOT.ALMOSTEQUALRELATIVE(RayElemPassedEnergyLoc1st(iElem), SUM(UNMax(1,:,:,:,iElem)), tolerance))THEN + IPWRITE(UNIT_StdOut,*) "iElem,iGlobalElem = ", iElem,iGlobalElem + IPWRITE(UNIT_StdOut,*) "RayElemPassedEnergyLoc1st(iElem) = ", RayElemPassedEnergyLoc1st(iElem) + IPWRITE(UNIT_StdOut,*) "SUM(UNMax(1,:,:,:,iElem)) = ", SUM(UNMax(1,:,:,:,iElem)) + CALL abort(__STAMP__,'After: RayElemPassedEnergyLoc1st does not match UNMax(1) for tolerance = ',RealInfoOpt=tolerance) + END IF + END IF + ! 2nd energy + IF(RayElemPassedEnergyLoc2nd(iElem).GT.0.0)THEN + IF(.NOT.ALMOSTEQUALRELATIVE(RayElemPassedEnergyLoc2nd(iElem), SUM(UNMax(2,:,:,:,iElem)), tolerance))THEN + IPWRITE(UNIT_StdOut,*) "iElem,iGlobalElem = ", iElem,iGlobalElem + IPWRITE(UNIT_StdOut,*) "RayElemPassedEnergyLoc2nd(iElem) = ", RayElemPassedEnergyLoc2nd(iElem) + IPWRITE(UNIT_StdOut,*) "SUM(UNMax(2,:,:,:,iElem)) = ", SUM(UNMax(2,:,:,:,iElem)) + CALL abort(__STAMP__,'After: RayElemPassedEnergyLoc1st does not match UNMax(2) for tolerance = ',RealInfoOpt=tolerance) + END IF + END IF + ! volume + IF(ElemVolume(iElem).GT.0.0)THEN + IF(.NOT.ALMOSTEQUALRELATIVE(ElemVolume(iElem), SUM(UNMax(3,:,:,:,iElem)), tolerance))THEN + IPWRITE(UNIT_StdOut,*) "iElem,iGlobalElem = ", iElem,iGlobalElem + IPWRITE(UNIT_StdOut,*) "ElemVolume(iElem) = ", ElemVolume(iElem) + IPWRITE(UNIT_StdOut,*) "SUM(UNMax(3,:,:,:,iElem)) = ", SUM(UNMax(3,:,:,:,iElem)) + CALL abort(__STAMP__,'After: ElemVolume(iElem) does not match UNMax(3) for tolerance = ',RealInfoOpt=tolerance) + END IF + END IF + END DO ! iElem=1,PP_nElems + ! Generate skeleton for the file with all relevant data on a single proc (MPIRoot) + ! Write file after last abort to prevent a corrupt output file (which might be used when restarting the simulation) + IF(MPIRoot) CALL GenerateFileSkeleton('RadiationVolState',nVarRay,StrVarNames,TRIM(MeshFile),0.,FileNameIn=RadiationVolState,NIn=Ray%NMax,NodeType_in=Ray%NodeType) +#if USE_MPI + CALL MPI_BARRIER(MPI_COMM_WORLD,iError) +#endif + ! Associate construct for integer KIND=8 possibility ASSOCIATE (& nVarRay => INT(nVarRay,IK) ,& From 4e37deed6ff812fe02c16c4b7851460264113a81 Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Tue, 17 Oct 2023 22:17:58 +0200 Subject: [PATCH 248/495] Minor corrections and additions to the best practices --- .../developerguide/bestpractices.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/documentation/developerguide/bestpractices.md b/docs/documentation/developerguide/bestpractices.md index 77b032fa0..0f3007f24 100644 --- a/docs/documentation/developerguide/bestpractices.md +++ b/docs/documentation/developerguide/bestpractices.md @@ -6,18 +6,18 @@ The following collection of best practice guidelines are intended to prevent bug The general rules can be summarized as follows: -> The first rule of MPI is: You do not send subsets of arrays, only complete continuous data ranges. -> The second rule of MPI is: You do not send subsets of arrays, only complete continuous data ranges. -> Third rule of MPI: Someone sends non-continuous data, the simulation is over. -> Fourth rule: Only two procs to a single send-receive message. -> Fifth rule: Only one proc access (read or write) toa shared memory region. +1. The first rule of MPI is: You do not send subsets of arrays, only complete continuous data ranges. +2. The second rule of MPI is: You do not send subsets of arrays, only complete continuous data ranges. +3. Third rule of MPI: Someone sends non-continuous data, the simulation is over. +4. Fourth rule: Only two processors to a single send-receive message. +5. Fifth rule: Only one processor access (read or write) to a shared memory region. Please also read the general implementation information and, e.g., mappings used for elements, sides and nodes in the chapter {ref}`developerguide/mpi:MPI Implementation`. ## Shared Memory Windows -The following principals should always be considered when using shared memory windows +The following principles should always be considered when using shared memory windows - Only the node root process initializes the shared memory array @@ -39,7 +39,7 @@ The following principals should always be considered when using shared memory wi ! nonsense. CALL BARRIER_AND_SYNC(NodeVolume_Shared_Win, MPI_COMM_SHARED) -- When all processes on a node write to their separate region in the shared memory array, e.g., designated elements IDs which are +- When all processes on a node write exclusively to their separate region in the shared memory array, using designated elements IDs which are assigned to a single process only ! Get offset @@ -60,7 +60,7 @@ The following principals should always be considered when using shared memory wi END DO; END DO; END DO END DO -- When all processes on a node write to all regions in the shared memory array, an additional local array is required +- When all processes on a node write to all regions in the shared memory array, an additional local array is required, which has to be reduced to the shared array at the end CALL Allocate_Shared((/nSpecies,4,nSurfSample,nSurfSample,nComputeNodeSurfTotalSides/),SampWallImpactEnergy_Shared_Win,SampWallImpactEnergy_Shared) CALL MPI_WIN_LOCK_ALL(0,SampWallImpactEnergy_Shared_Win,IERROR) From ca6eb165e799d55fb101455fd7e9e31de2e5eb95 Mon Sep 17 00:00:00 2001 From: Julian Beyer Date: Tue, 17 Oct 2023 23:06:21 +0200 Subject: [PATCH 249/495] output spectrum as csv --- src/radiation/radiation_solver/radiation_main.f90 | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/radiation/radiation_solver/radiation_main.f90 b/src/radiation/radiation_solver/radiation_main.f90 index 8945a864e..b0b48cd81 100644 --- a/src/radiation/radiation_solver/radiation_main.f90 +++ b/src/radiation/radiation_solver/radiation_main.f90 @@ -123,9 +123,10 @@ SUBROUTINE radiation_main(iElem) END DO IF((RadiationSwitches%RadType.EQ.3) .AND. (nGlobalElems.EQ.1)) THEN - OPEN(unit=20,file='Radiation_Emission_Absorption.dat',status='replace',action='write', iostat=io_error) + OPEN(unit=20,file='Radiation_Emission_Absorption.csv',status='replace',action='write', iostat=io_error) + WRITE(20,*) 'wavelength,emission_coefficient,absorption_coefficient' DO w=1, RadiationParameter%WaveLenDiscr - WRITE(20,*) RadiationParameter%WaveLen(w)*1.E9, Radiation_Emission_spec(w,1), Radiation_Absorption_spec(w,1) + WRITE(20,*) RadiationParameter%WaveLen(w)*1.E9,',',Radiation_Emission_spec(w,1),',',Radiation_Absorption_spec(w,1) END DO CLOSE(unit=20) END IF From 5b6707034dc917da82b75d754e714320bdc61a0d Mon Sep 17 00:00:00 2001 From: Julian Beyer Date: Wed, 18 Oct 2023 13:47:43 +0200 Subject: [PATCH 250/495] Reggies for radiation - emission in single cell for different species, 2D and 3D rad energy transfer in isothermal blackbody cylinder --- ...ns_Cylinder_2D_reference_RadiationState.h5 | Bin 0 -> 11432 bytes .../RadTrans_Cylinder_2D/analyze.ini | 7 + .../RadTrans_Cylinder_2D/command_line.ini | 1 + .../RadTrans_Cylinder_2D/externals.ini | 6 + .../RadTrans_Cylinder_2D/hopr.ini | 66 + .../RadTrans_Cylinder_2D/parameter.ini | 110 ++ .../RadTrans_Cylinder_2D/readme.md | 4 + ...ns_Cylinder_3D_reference_RadiationState.h5 | Bin 0 -> 112000 bytes .../RadTrans_Cylinder_3D/analyze.ini | 7 + .../RadTrans_Cylinder_3D/command_line.ini | 1 + .../RadTrans_Cylinder_3D/externals.ini | 6 + .../RadTrans_Cylinder_3D/hopr.ini | 102 ++ .../RadTrans_Cylinder_3D/parameter.ini | 101 ++ .../RadTrans_Cylinder_3D/readme.md | 4 + .../Rad_Emission_SingleCell_N/Ni_NIST.dat | 1466 +++++++++++++++++ ...adiation_Emission_Absorption_reference.csv | 1001 +++++++++++ .../Rad_Emission_SingleCell_N/analyze.ini | 5 + .../command_line.ini | 1 + .../Rad_Emission_SingleCell_N/cube_mesh.h5 | Bin 0 -> 6872 bytes .../Rad_Emission_SingleCell_N/parameter.ini | 101 ++ .../Rad_Emission_SingleCell_N/readme.md | 3 + .../Rad_Emission_SingleCell_O/Oi_NIST.dat | 1430 ++++++++++++++++ ...adiation_Emission_Absorption_reference.csv | 501 ++++++ .../Rad_Emission_SingleCell_O/analyze.ini | 5 + .../command_line.ini | 1 + .../Rad_Emission_SingleCell_O/cube_mesh.h5 | Bin 0 -> 6872 bytes .../Rad_Emission_SingleCell_O/parameter.ini | 97 ++ .../Rad_Emission_SingleCell_O/readme.md | 3 + regressioncheck/NIG_Radiation/builds.ini | 17 + 29 files changed, 5046 insertions(+) create mode 100644 regressioncheck/NIG_Radiation/RadTrans_Cylinder_2D/RadTrans_Cylinder_2D_reference_RadiationState.h5 create mode 100644 regressioncheck/NIG_Radiation/RadTrans_Cylinder_2D/analyze.ini create mode 100644 regressioncheck/NIG_Radiation/RadTrans_Cylinder_2D/command_line.ini create mode 100644 regressioncheck/NIG_Radiation/RadTrans_Cylinder_2D/externals.ini create mode 100755 regressioncheck/NIG_Radiation/RadTrans_Cylinder_2D/hopr.ini create mode 100755 regressioncheck/NIG_Radiation/RadTrans_Cylinder_2D/parameter.ini create mode 100644 regressioncheck/NIG_Radiation/RadTrans_Cylinder_2D/readme.md create mode 100644 regressioncheck/NIG_Radiation/RadTrans_Cylinder_3D/RadTrans_Cylinder_3D_reference_RadiationState.h5 create mode 100644 regressioncheck/NIG_Radiation/RadTrans_Cylinder_3D/analyze.ini create mode 100644 regressioncheck/NIG_Radiation/RadTrans_Cylinder_3D/command_line.ini create mode 100644 regressioncheck/NIG_Radiation/RadTrans_Cylinder_3D/externals.ini create mode 100755 regressioncheck/NIG_Radiation/RadTrans_Cylinder_3D/hopr.ini create mode 100755 regressioncheck/NIG_Radiation/RadTrans_Cylinder_3D/parameter.ini create mode 100644 regressioncheck/NIG_Radiation/RadTrans_Cylinder_3D/readme.md create mode 100755 regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_N/Ni_NIST.dat create mode 100644 regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_N/Radiation_Emission_Absorption_reference.csv create mode 100644 regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_N/analyze.ini create mode 100644 regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_N/command_line.ini create mode 100755 regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_N/cube_mesh.h5 create mode 100755 regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_N/parameter.ini create mode 100644 regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_N/readme.md create mode 100755 regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_O/Oi_NIST.dat create mode 100644 regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_O/Radiation_Emission_Absorption_reference.csv create mode 100644 regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_O/analyze.ini create mode 100644 regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_O/command_line.ini create mode 100755 regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_O/cube_mesh.h5 create mode 100755 regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_O/parameter.ini create mode 100644 regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_O/readme.md create mode 100644 regressioncheck/NIG_Radiation/builds.ini diff --git a/regressioncheck/NIG_Radiation/RadTrans_Cylinder_2D/RadTrans_Cylinder_2D_reference_RadiationState.h5 b/regressioncheck/NIG_Radiation/RadTrans_Cylinder_2D/RadTrans_Cylinder_2D_reference_RadiationState.h5 new file mode 100644 index 0000000000000000000000000000000000000000..f3a73a610e3ab505011fb82a7312ab06490deb6a GIT binary patch literal 11432 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 rp?fvd(fK>frj|{n)dF{glKb3iD1Q}~`&lKi7E2 transitions in each direction +* Testing methods to overcome the disadvantages of a Monte Carlo ray tracer +* Comparing the divergence of the radiative heatflux in an infinite cylinder filled with a gas emitting blackbody radiation diff --git a/regressioncheck/NIG_Radiation/RadTrans_Cylinder_3D/RadTrans_Cylinder_3D_reference_RadiationState.h5 b/regressioncheck/NIG_Radiation/RadTrans_Cylinder_3D/RadTrans_Cylinder_3D_reference_RadiationState.h5 new file mode 100644 index 0000000000000000000000000000000000000000..5302215d00db94f8bd8f91eefd47f2c36760da1e GIT binary patch literal 112000 zcmeFac|6t6`|yvfCCN@D390N{Ak_s{*u{rU8MJl>^e*EKWOYvy{*TyxF5;`Fq2mM;}rO85I0 zD=Qr%9p}Oy7ytJQ`xWtke&Mece_rHH*dP8-I=a)?&-o00{y?r;p6HS;HaqmA7n*n zzXdk}-!#kVc;L8Q=zo@O0fDef{qBM*Mbx2PfB({;Q(8u+^b31W{ZHe0;h)m6YEb(1 zia*cAW51VkpyOZ7|EK4oC?h8$_aF2i{%I=JbK!!2hW_+_v!A|C&>ut7al(hgxbSC@ zh5!Fg&qXfyj{tlw3;&!RYW?k}Eu8~?50yaR>bmd`{(UZgbT5`cM`!LECs>8L%1S@;@al`X%_Al4S zYyF!u(Em~R+Xw#sc?o?4?}8#ax+_>o3qNwffB*Z}@4w@}BMaN2Yk~h-;QxjNIwmJW5B0tSguOWH>{~d1tBKKP z_HF|UWeX%}EOMLgXHJx_ZUC%fVh@if;s0=xGk^IlGsQ`ELL=w~rpJt}TmSHs#J@cC z#! zfA8K|ZdCpgBbn>?uSTHpDSVhu3$34;)6Eex_}oJhv{_EVey}ipsrt|Sw+6>YMlGQ1 z`E&gAEtWe%MZDS>6-VFN2&*tR& zpu9BdK6k_J7Qk?DTOZ32w0udk)iv!t%^)$eNpaQ;m6v-E|3wM5o7KC9Qv=#zp?$U2 z|Mu^oQjhv)hOHnXfYD5180E=)I-L?mtzdVdfuh}Kl-rOz=3j8)L761u=o;6CKl*E~ z{ncOMz>ux9tPQXV;qPkrzQOp_zkL3)&5XucJn;IperAI%DxbZtkhOCN4`f76b$q>p z%CA`Ufl*==9_-Ft)@Q#5l{Yx$G`D6?D`;)z`{w--t-qP)8lL*TdI6N5V^W5$=hH}@$(zGJj zZ?9AZ)R@42yzqRe?AJXeE~#0K2St+!7sZ+C5&K=Ga}^Lj+6KgkD=Hk%;r{UI+`sl! zi?(yz^{WjG*9%LpjeY%xS6%tbZ{%CF2u2ZraEz3G$cef?{P^X+yvZ*tcda7<;3hlr z54}Qpp3LN2PzC|44*l}=sU^y{CqLF?7AAnHa+d?y`e^x0fgje1uZQ|am*zXFqddSe z{itP78;II;YkKYy+CCn^-g7C5Z9wA&Z|!L>l(S#VFqVgY&m=eBSQq-i1^ZIjhbOe@ zTh2i!|6ZBVs|@A$2VRfVyFkCguFb(&jdJJ0EnA+{wt>7zuamNKX#GX5cUR|qYXg$W zLWk^fP~I=vdO1IU0Ir->EV90W+HXS;zMScM8xR_m3(d(ul9XJUcT{ zdG(&h%Q~R`Apw`R$;&8zP@b}7_8S4ryOl-U%YOC8K1Z_uKL0PV2^zn~2_WfJ^`Tpr zQGS&vGQfB(5s1~}nV0LL`~Y)e(dU&!a0&M`wbdEr{m!gmcpoCT!u@KLA^+u{@`En^ zEk9Cnf1BeTB5;jasWtQg<(wHV_o~hifnEVuwA3MtAHVQdK7jDTcJdGrL`fNLeR>Dw z2jlGnykYrSHLF>gXq0c3Xj{&5mk4UAM2}^yN9A+bZs;5=B?5`sGY)S>P#&2-C-|GY z#&kcV#m^r&`Rzdz5vVOCFsdELSGPtKl3|GBFy`1NHb5ilRP!M56bQJ(UA z4xC$kc_n;4mr8PO$1FadAPUd$3jEsIP6RvV$5cmw`uv~?5ok|-+uzZ@*gnemWqRp_e{zWk91P~QWeidMs}y)Uf@6q4A@KILsv{^L z<|=UYFzpK9?H!cRmK}*37}?&6AOC?>R-?K#Mdiu!v6K6 z##Gx4_22oN8kroj1RzjmRgt&><+62;U$Fba{;%uelyVc*?_a{5ZG4RYVnRypva6#! zV%;yMEnnJzds=&s`YlvHcUkKp{R3@4(^G+u{}K9r8`5#}PYG`WY5L3A;$l$Fq$iQ& zZ`}qQbQ79hwxOK$>#|ZEr#4_c`80O*3zU~^yj0~e3g?GWmwkwNX#Lc1s;)w(2w+&# zVSR8o+P-xLHk#5W2|xmfAKY^a<=rbqS%V)FK+(N(Z=Z6a{5WajtlJU-@RN+1>dO*5*t+bIed7sK|GIPGSI*u5h)2>C0AQ?oR0Z_u%k}1Zjg-kTw6d&3F`@Kg;-+e=Ov|1NO-S ztIh3D{fD$B`fb0!`kRcdnddLHh!KuUu4r z<~!}Ej<a6D7HD( zsTu4$>?*G5g08RZxQr~L4O)P8d(P!Ohtc)f`KX|4nR+c??ZLyQs-Y&-Mfn{~rr?J!>Ve&E50x25RDa65_JY*`IN&uqf8}KyT0hxkTe{*LaA5U;y(}p- z#&5N3*K;piJ!mugc`nBu)i2XG>3rA%2eN;RX$xke`j0vgwi7z)!4Xw@n?n|;e2V`t z`P6hH7%mNFJEw!TZ{Lf~mtn6P0dw4mR9**^3toP3xWcL#Tr}JoCg_RwuQ;+~Imh;9 zu$lY$&X;j0r+;W7T4mD$?kQcw^Le2CKWG)*keEda&}ja=ti&7Td)w1ZUz;?8{ahB; zmIa{t_uC8v?cdW3_NFqQ^bbV&hV@Pz?J#b4rY>RCtUk)Qr}mUNks3ka*z+tg8vggd z7pbn`kVZfsY{8Nhi`vIR_G(4Mr+TooO(>Jc7`1<5^$BiV4i5M%lOFaBM4ul^K=uR< z&Pz%ZvXA+~dCI^3TW3~l$2(FzSUK{V+;53;q4(A4r(oP=LukULb1)9GAWyab(cYC+ z5iN%Ub;pGTQVUVO(|mcsEwKiW4&2s-%c1&xa?i4F-+==^g|7LQ-$3OrH7Ihs!1(nC zM$_T-G~(Ae-1|k}(l>zt=f|!e0cyXkOv|^}b2R}$54U}J+fm+WmNK*1rvbctwtl9H z#{LIW*umu5SR5#oQZ613L+kfC<1S0#)&|hLmU}#$hW|QPn83F~5eFjp@`kn*pz`HL zB7|GKO@LgxZ`rSHX#F^s?NjYJ(gdUqR9U$(qr74?`!I7-Gnkn*3TsqC``_w@K@;&} z_mg34{QY-g<@}CNZrQ7y zPxhmHMk#_(&94PilzDzlH%0Xqm3$u)b87{hA%kpA73lmk`801?qb`h3zbp!8pF;WY zgA9==K|DzD%rAVh7o9(Pmp*r>e1-=}0VXo?4CwsY_^zGWgJC?V4-)oOFGA;+`5_t} z+8lTwFk~sX&I8rIIsq@Q1>?JN&*V<8cSJd>dE6aiX1G3*eUZq16xE-MS31Ap4O}0{ z`8=~7MLEvPsH$?l6}0_S^_4q~>K9E@30_)@2V!@e=+FN|i-Tg9nwGXxbz_R@whb&q_&eN5GgbtK%@#-!y zlW7I>^Fr|q8`1gq$0G_pLEZI0<4$W;mKo|F7`JLYd2k+%Ka<`3KWOYPwFerQlr}Vi zI{B9kv-{BTkzZ>0gY|nOa7wK{Vgmcog8!o0e|4Jc*Rs9R2%@}a@HYccK6Wk5N4T>d zR9?ufdSQ;%FJyjJEq6Z-93A$yWIT(G?<0GJ=k*eCVETDyNC}PoIffaNk1S8>fugS# z!(LZZe_!(&yDJ$uptYpy6(f!I->KvtDu?>*miI**p`l-Bi`M1dRnUL$-7V37AFbc~ ztt5-U-3{Quc`<{FYtZr;;-956Gd6*H5($MZ8mN7qes3QxTGasBM#IAAY3zR&ZC4xI zu?5br8tYGP%SX$9^nTq^`l~oVp6T#w^GA7V+w1#!%Nu|vee6X!RkVI>AvdLhM;hVy z$#l$u>)3yvuj3o`)KTLmz!)00 z!M_vbd82*j4D6Z##~iCm+yRuoWtDr9?c5C7`zn;TIitKwYHL#1mKH#&dT`M44C)_^ zmXGW@1@#~7{&{CF4gDJ>G>b0mY6b}}3iMTI%+FKTwVgDC`+A={=pV?yeZGI~6FYvE zr+r-m@EgDCIVg|Xm-Ulaq7>}ka);aRsL|-(@iuuHf^c7Dv?|l04(_x3J3n~Tpp|r6 z0IrW1aWY|BQT?k%s>;Z*O&~8QF>7!hvk%qyByf5!bB}8RyZ3Jy6QRK`UDP{kd<4!9 zvUP9YW=8c(n7$@*coYuUivA#R1u5>jF?mMd#Jv6g~>&ONDRO`P~!Um2~rBW2D%`wee$m0;dM@oA8+u@U7%e(T;l!Tsm7$u#l7dDQ>6 z(l@`oxVsh9;z9vaH+d~!e4rW#cox!# z4-DO0Pvqrp0#ErnmhPr8f8|f|9qfJk8sv-Jr|)k=`!~z8o!d`|Gyu6}MmFaZ(Eh7+ z(EY|SB^=-?-?l!3hJUV$dYyBgy8)PNjFnir9hJ|#dSm<>Twl8jU6`|_vA*`q+w%Mx ze7}bY?BzK{eDw-r1ulkCWzqY{=FIERPo)<_tvjJB>-!jnv~o{#5k7`p+mgIOb1p zOpgbx?m-f&<#2hK{X4imuT$8PIl+zgKi=lq z)rz_;;PR?5a_%v-|3%X|1oXmrq3q`~r@p~{zRRiE;O2QT?u& zBTo_`H!=IUO^*hj*w`Oxv}9^^K^WJ42(kbg8~3in|a%BS+*3<1a6 z>L1|1z0%tWBQ*TeVTI$BB~}gKNbBv4IU4h;WBI2{eBi!h2!CNiHr%IN&`%YA%2nQc zx$s9laNT2>7rqPiZyC`~$FpEw&!A-D@z~#aKEHoa$uHlm%6>q-0mu*=M%U4Z-`^`e z{>~q+A8k`_Gp(kveoXv%w>J~!-Hi-$MYGb#Kh$kb{Q4C7-;`70KZ9ua-=`&_k)Rp9`-e+eG>Thwq6zz5d} z4RLpre`1SQOg1Bc^ykl`61vg-)2DChH+;*7`9{s)5zz_gcv?QIsy zXUC;+W?=*n@b#D#LmbK*v;F z4bvq{+Q!>J<3Mmf{S}no%&U{%qE7%q@j9o~zoGWsG|M6%`nnD9^uCIFFpkRW^E|Fz z1?P>#;{AsLx=?<-B&km~hyX-F9!m&iqx!e`^(Mr@xWkVrp0;!thgcY2RQY$8p5Y%? z!n|HNbGZ;XnCJU1|KcZ7eA&1SBu%C#9~wk?MJQW)nhybt_ttKY$Vbap;4+g5t!o2} z_vDiwOrZ6z+C-fEX$A8OPHv_vCZO{73)2*nW(j~UvN-BY5}N;UW25Af{rxb1GAef9 zeI?2-J!Fc$`i=nP-0OQ?Yf;V{r*_nAhyc`H*v>HAMLEyLJ)3T^5P?SY_6)NSln;tp zUEQ?`=69XlcvE-}%Ht-cUb1Krf#t|2`>bDRe$2t|-;5(HVgB3Ts8InK<;SGL-3&Zo zeol=2uj{Yt^~FS1CkLeEF_~kSoUhDEUWc%2*%7 z!TcxVLoZLJtD#)ujLluGd?FaE6pItxvZ$XTul4J0=z0T~|3eO(av5FZl>8&5Lvy_n z0YpHzq-TR&F3LA|@)_KILP0G;()>}04YkpMAXy>~TK#)b~ew)W= z|JP~B6WXiN20E4E%UD)m^EayTJ7l%>qlamk)M1~Jp0xv=>HTFv(o}-5-f2r|I){>ZEg(hKM#+J$ymbtz8~+Cl7F(I{TI*u z>e%62nE!f5f8wzw*8i#U1N)b3kzDxz=I=InUyNOaa_Qa#kDzcO;NYzmcowrbekkKJ zDZw$t8RoYdRtvoOKqJ4k^|r~$&Cg-}>9MV!On+hdk5uLBKk@R>hyH~8R-0M?c>ydtLN*%^`xtnOOBxP&n~I%OYz!GK!e|iEslLH~tz|L}Ps~Z*hlPy9nkN0G{DeFI4^qV;*UW zr2%aFBoN>r$9Qn~18(FCU4jU~keQ2SV$9*~NI`-XNG zqF)=peZ+#dLJ9hWS;s zt}FS=Y2;UNvuENjsx^b$9y8JHQE2%cLFd#aAnypVe)#Sb%DHtU#RcK{6itKJ+`}}^ zr$|r!;!c9+0y(~ro}Xz$*OxK(`!(u*v;sRHjzfYe==xTzjjLoV8xMwMN)zhz(e<&M z_=~JOxWCAH#;DA01YMuE%nHeO{%Qp;dvfEx(pW#+0-rKlZ9KSdJ{vYMx2T_T{->h* z>{6=^c>YE3K5@1g)$diuX;}mJ7gKb~)WvD+FM6@X<1So-y!N?eh}xol%K0JlT|1`t z-ok@w!~L^NvM3kv{jfxJBOXZ3EbW(9MC~Iqt#7Ca_a~J;YMF_@MeW{?wyyMOU@AHiOykYGx^k=<_#AX1ph{vl%$sebg+D zMmgzw-fmx*KiKt6`<5Gx{K1&>Zyj1STVVg@%wUK>*Z01admr3``HQ<`vozMx$X|Rs zR{5hD#vgwCkeOZLjh4?XGOX9%1@lwh2DkK?q2n)={Y&*6%%AXd3qEg2BmO+C``A3? zQzIyUmGp+)7?odY$@c3sTo>HYI2e*bV}DYkj*ahtMgvG=`8bp-iuyNoM=KL)9~|IO ztv0Gkpy7Y!%yu}A*Mn_eo>||}N97C2)9eLs{qGp=>l;C1{jayN|7b4kH=LvyWk%SK z{`Ifi$2pI_Sl0v!Z|~neE|0b^(qDAl^3q1|t<=`7(F5h|qNhXW>~NsC<7T;K8e0Ee z$LaZ-aD87};X4&UV|~vw%4)T#0-mo7I*3!JaX!*yDX)^s!3L0cpm*Q46=?kn-{)Ux zfc~}TXomO*KUzPl(!eg+@FsAYOMzwQ5|l45-n+H$X#*(cdEW89593ttpRE_<&)359 z(SmEuZjIA;Ke&%SdEEi?CnLt$&wiwlKPmfpgl|Zv0jv%Q8ghi^1pl@Fg{Yv2?^AGp zq2TTo8(q|XEj1)Ll4b)iTpD5Tu@05L>JmH33-f;W?~t6=rxBm;pC)atf?RX-SI^`Y zwEfuun;xEl=STUEK2y`BaelNWy5q{hLibVPZr z7}M|%`xY?v@&j83%)?x0KUMs0rpn$u4aTP{q>|2P(1=gh4zO+h3G;u)nEG%e=qLVt zKQfkXlsEBh0VUgOYNO0h{hHk~@y~r*LBCKxK{OBbe?R$x48!bNfltAx>Fs)ycco6% zbHKdD;=4n86MIq4!c(X2C4dLEcXYj4%u)ZW8vWI4@&X==)laN^x)=5Dc8=Xm>#Fde zL|~QS0XCFZSF^R#!MNR^MeX){7{^;^Kh^n47RKU&~He7Ed-2YrQqLX*;Mw8LBL%^{wrQ2Zoz)EJ{zC9(=ddJm7{89-9Zl>+ z?O%80`P?!1ei+^@Ib%)Z{jlo=@6FpVzra_5XuN?&et~hY`_Du0eDr~kQ_~(a&PNXz zhI1Z+`y)*`UIR8X_D5t_j7+8NXa>=pKj+m?qy1CYPRa6>VKeYfet3C#2+Cbfcz;~- zvk@$j-ojv}jgHSr>GwS;>zlx1^B>XdH2m{s$=e1+5;%}!#oHWq2lXFMgil15eysC+jjnkV}e5(g@L|-Q(8uD)V+s}3G-~a;yZ<;)f z`S*8)GLJx*|D)W>30Bd_|Jn7%AT?vK5pXfTl!~MAel?&^(pFyE1UNol$1Bs=Kkkt@ zGEIQ@Luixl%y@X9^)K^_9G`^wO*Z!m=WJ-?H(m30#V>>LDbWdzU8#rB^;2uGm9=y? z0n~n$RN3RqO_D><9BUI1JQf@s&-jR*Z#=QI?|R2Z zBJiofe3JH zo4ff<(fVZtKeqb`&p#>+yC~dwh3X%+;`iJ|CV-R;1-xqsX!}hzO3g@*5I|j2_>55j z%Dp-^?*0tp8!4huR(KlmjShuQ<9=}hxbMH#xOY1mACL*C@%X%n0NB5o3gBf??#t!+ zRSw=O5nsB3P45C4pE-Q)sCYi?m!T#7S8U)qalt=Q#edcu={Nff&wt5$n}N9U$%X#G-N?W$r)AOJl*L*Fc4G`_*GsaBx?c}+&S*MNCSY8rgL>@shn?9loz z3nsJMy=?=gUnE+;Hlp$aaBy7Dn4ozL)lJ1shcRAD;Q_gB>?3VE9ehW72= z)n~BoCdLQT|LWhS=+fBYEs}&=c8~nofAm#q9dp954Vtq#f45z))GGAc4nR5SEQlST7 zpo;_yBN;*WYmC>X{?)%yxB4viED7l7Th&D-V_f;%U!HmBrN#6F2`DodXgs=z@hcR5 zS$)dec?lV8vi`i{V;IKslmE)w#D{NhhVo@KNm$$d8F0F>;m#udoZA`*= zCWVir?5028O9F`xG(UycV4N=Pul&j78)LaIlE8t==&r~;SpP7m@WI(%f74|RTaC&_KjMq`*mCd-Nq9n;+TJG+-TqTT0 zP~;2B!S$@yB*1sT{94dB#xGIq$3X9Zw<;h3SHh}YKNK+gk}3RgHEWa34D{a?FO628 z!{mb~_WP!s`bzQ>2}HWxv$MX3@q7w@ZJl0NLm~m9_^os?BF5V&e3OufC|d&w@LbEd zneiFptQ7xHmv_0*=P3!0<1&rwnX&rGQMl@(be83#BrxV$*qMA2lh>p0(4#v~Z~Q_6 zLH%}bEpK6bf>OTX#>fwnE8+8v#tU2TUo4+8ei|H^Swq&7K_ma0w@=hC&O_lwW`w&r zeZSwo(x<(uF>X#Ne`~>vi?9+I%tiH!d#}OxH0Alk*{)AoB2EUDqGy|~s$jg1!pHW% zFZ7fqgVQTkrnhdwxFp3tNULOB)CXk1;e72r-x7=qPAkvjcq18@>guOGR>1U=DfK%$t;w|u%IkdC`)ch| zOrEOzx)yaW*JETrR zaOv(S^>W2{1jW8lGTTzhOrie?^?0ND4%5#{@gLv#Jh!Mo`$ZPepHxi7IF*0-8T|Os z5*;$|`RsD!>I}wBD9^{4;b_M;H!{d;9oV{~0^`jT|5z!L+}Dyv24hDbNiZv8e2l^! zKNhg1hmk=cYZUp!X;j|%Zd&q%2T*@daeaso#!D#j!>jotLo>)ACA;9`eM^i7Q8=+~ z;)h)heE;qmnH<%_cp8Ntm(<)bn?weFF=mJF9mKdYg&!H{Cn%pGgCp!58p@s+7ohMh z!?Qy-0%8A|@8NaG!FUO!|6H#QxF`#szli1d{oM~SK23SP;koMUd!YY6lxB@zHh{_x zsKs2CvL}Nan>R%!Z!oSzDc{RE%Jf|kY(Gzv&Zo^7r)vMzJvWYepC8SL9-xs{NtACQ3tK`9b6_(UmxiQ`t}JLB^dS6*B1a%1>-tj`csP z@pmBkdXsDr8C)t)GTfbw$y1F#?e-H4Ts~y*POS4obOFYx#-Hazl@~d@h7Uxe?31>PI#H^gTlJL*V!#GQQ8M zZBd@BER{7MD88{~fJPOUvPi|wO~zgJ;r_8)N~gO2t} zu}8HSry74rvqRgh&B(y;9sQA+?nV8S@o7s+*4PH;H}@sW52-B9uc*eKj_ORt3miWmJP$GSFZ$02ihT~AF}oB4=f7E%a`!GVFSegz zf9ddpciddz^KWN8(_M+_XQlY(QW-x6Eja!dL%)Amzc~KL6nS}-{B7@cL;vj@d;HTV zCZA6!KM>dHX{HAKr=~E^5;m-Ss`g*3W#X}&CIJQG`sb5r7^kX#nUmGsw{U(n$Gb6Z zToL0`?H?_fvSWt+JwA9yKHClBRQ8*A|HI-w93K%Y`qaVV_|Txt|I^;?-l(iW1{xxo z7q&BD@??trpKt_7D9Mq*$fIvLKpf*#@>a8I-x6W@kKfrar7XT*u0;KvpL!^m#Hd2~ z^nh(Wa*Og*>ysw7pH1I(k^$~{mqE>HB=YtM_C`;>5*qTD+Ax30ztj8k{G9&Kd)IzuHsov1~Sh#_(XVOoNE59acbB- zH=Yazo96`&`eDzP>izfRMB<$(RcN2LRf(0$FnOx^wb++qKiZc<|NgUQYSI_uRO=IW z^WrHv=$|rWj?L>X`ln2a|6bopx)%-WC#onJm2(J_r&>Q)D&|%TE`#qczw?Je7WGrD zKTNLqJsXGXm%5ZG_gW)#{lXL<{(-HQ1RS1|h0}jx`l;4GhQ&G3L2&-w9GaE#Y;pch zwLbeiwzM__&W}?kpY0D_oF7xI?}qzI&bU^SK+4LH=68%(`Bdvevi@0M|DFWOwH~;S zR$=8+tv|OHFnn7H=l4@ltxPeC^LwiGr}fvdk(5=?KTJ$6KW&W3Q>_n4iuYa=d?bO# zzWz>@Wf-TLzw%|AKYHs038)qnO`HC}IF*zrCXEZ*bumsgf98DYXP&wl z_CJFu&1e~nQ_Y{VgW4ZnH;4UeMC`azC)R(c)J_D z3zweD4siWm#U)rYjKet9`m33PSH3C__Mb<$hlml^664lc!pL@jVM2t%LDFRf|4$fyMYB)%qwV<}KHB4++@eL|#66 zfyuK{)>p5Z@pdN6@cq0+PJ!(x#;Mj{?iOc9Jd5G_U+Muzt0Y!Gs`zBIMWyeHQaHY( z9NE{3V4NyGX@0={R(~uBR4-*Y|1KEgRPo6oYd5iy^CZA2vHY68Eyk(hlj+aW2q$jA z_L&!J6w6?oDn5DVo&XP@3JEOr%X@xe1s0#8iXT=izf+tlM*`y&N0Xw&FisVJ{I1b> zb`=i^gj%T71=wSpD!!NkC*XLwgdVcR|!A6)H}PS=Rlk1GBd zr8TsV55_;8OqM8}Sc1t@#fMoz^qbvJiNM;T!JLN$i(ga4hZ}q@3kb8p_3upPWA8vr zo+>_lMr}*!v?&P~+j_^A_h98y#iug@N`;=CB7q&_0c9J)FisU8Ochh-oX8*n?IfEw z&nz%b6<@?ZTJb#x_P?6_P<=rJ zE?~W|+$?4vs`&48YW#ZH3L-dix8}OR3e3J#@!#<|O}X-Mc)x7d-h}N}FnOx@rfaBj zl_!i3U+FvG+qxJZriyQtZV15zJht-cNzM9K18+``GrzIZu_9Q*V^i#!G zKW=K-FS-Q!uajHE+`=(V)xPlebyeFYh~N;Xj?a#4jOSD0tIX*~HVW*7nm-H)9)PjQ3OGQ{tUWlRVc+KzMCE zeZ)?TJ5jhq;IDqpZ20`XlGmL!z_=YHKC`iWF2Eod#>WnJGjU(UxHcvJnR|7ExorXo zNTix zeFNoJbLijZUX)Ly;!H{67+bpS7#@t1_&70Sdpw z#nUDF0iG`?y(91X2;+tnz9*q^Fhm^A@2YnQRqnv}JBs~ZzLL>MUP}Uje?cRCj0jjKt{*ya z9nMf2#VaWGWS>!Tvv<=aU?< z*#D{OcTdbtHA?};*OS%;28%4Vk5a$>jbr(IEO30C`hMZ~VT@DRhmMm;P(6SI+#fbP z+MJ8EuY~gcYWk`ap>_q@_nY@;sa+_a5c|e(#g7Cc&U_v4xQ=nE{`Zb=Uz0NIKlugg zjFcDm@2L9Ufo<`Z*ks`TiTm@?^o>~ksGk4Y&M~|1aC~lBJ0)Ln5#v-9FwQ&pC?C!JZI!#e11BY_u)E>Q}u6~?|sSp z`iP)xaAo~?HO8s>?=`C*m$l*knW*IZTOy15XH@E&18`$zfCt7ebI_YakS z`BpilzzX-zBJGEwFD&k#QTZ38&H|aRauT3h82c z4etN;XedSIV7xB+@A}e3`Q6SXaQ=Gz0Keb0Hz=10Rh{4SiUio-JB+e@$2e8}NRwpO z+ktKQnl_Y%H^14c15K_|M=#ZbFMX3e=7Z=7voZw z4#WG)b8BCw-A3~xUQJ!yBHv2@9iPrd=srhztis2s*HGRzfNh?)2<2YI13$YXh#)1D zeeCloG(X{@^p%2{RCs^(@r=weN0bZgE|xDSf&N$P*l8;}JkClGfFGU2^ zQ~m;dQfT{M9yoDfs~NNpTUWVi4_f|UPHiH+Ak=@sxHZoVeg1v&9f~Ul2;h3)`l#3n zls7DWLG+Lyg2rb?YD8s}bNkngjluiRH79kJ)>)w3ZYJOHauNZQ^hZm1x}*6+CymzS z-^(R{1FGjQYHFhV`y-v?dyE7Sx_@_r=5aJXNqU^_bQiq8o8ued?FfzUi_G@4N&sPa z{*7NDX9JDzgG?NFy15sg&x>HQN&9#L)t{I0%BzB5pQ=2z+P^rao&3(x-* zbJvvgp*-T6PIfKKZ*x!CeOH7=e%p;THHIPyZ9w>vnW={_DxbMKr+VZfJU^~^@ld@H z%Fp@ZiKX!TrRId3nl_E|mr{1_E38%$0OwkkhFKT1eHq{9I=bQg<~s(vwhW&{?eDaV z-G%2O0pwRd-EeXb%5U?QuRL)F+P~;v-5m*(n+|Wy)Y}R3Gv_@j1eT%YuP(diI}7hO zm-F;vzjqmJ-<`E87gJy3!O~3U2T?TcA93D&KQ#VlE6CIIol1*G^Ov1cbEFl@;Qb(_ zSt+{&(fsYih=A|(P`?RreD20KH2?Z+;yNo~nAfjUmA2Dc3)OGERfO&!JXcnJDC6^6 zcu(Cz{vy@=D$PQ%4|`$WY+df_;~!|8ztaD>LSXD@3-Dy@?CRG;^W#P1J4gLs{(Y+R z3T9Ut`S&)hsmCo-;Qir(Hb=u0(ER0IqO()po)&=Ti9atBi0a?%Thr0Qcc+b~D`%@_M2fB^t!R7Wwpk%eq zg2@u)c6jT9ot_PVIa0mm13P+tqGc|KgE<}t488A;w46ZmhjqEGc#FY%!BYBGJ=KJH z_6y}xoexo%r|Tj|;lM>N&scXF=RXXeSWdLUynK!`)yF(($j8*PZ+Z>$F8!kioW{)2 z@`W2ORPw=beS`6G#%nmv7s{u)-{VSRO!irLzR~rD?2Wi=_QuNqf^WXXFwlWQycBAs%`}kjE zYQgWr?Q}ZFnv2?}@1b?Z4o234PvMbHtlO4+;VNsOF_MZ{EqtgPUSsYr#kE7$$ zIlPOW2cC;C^WvDOhUX*}`WMytobtLYg6Z&nxjE6YPBj|$%LOa2A2)>e%BerR){~>3>>3&}c#!Iqq!-tV`tP7*aYq$+z9phOQCgA4`4*dPF1tJG;P>U+xveH?`2XgF za5G7Gex~jzS=)xj`I!pIE26I};rY|(j68mJ^!=jHZ5Q-orWG)*5?=D)EL#8Bif+X< zP=A1^Kh4W2lR%DZK**;E0~=j7yF%21?nK4*6H?P_+&1HP{< zJqyo4|7-tPwV4TXTiE|@kJClCqy3A}++#e)4g0qc`%Q8&+CP$2-mA|mGz0Mx)-qx; z%DpbTU2{@v0eXfpra@7te)^6|(+eW-{`8fy*Ho^e+{^38xs~wzs9t!W%X1p%M-?i6 z?i)2}29dHO7Y6*%@}GJ6ZeI)UM>5}{WV4IL{YWoeE6>uqG=aU3mP@y-M92S{6~ZNs zJPkmizjMtEWz@gDAqg5x=|TVV%c0pO2lYS4#YAoheW?c_?fb6j8lv+24+fYVyl_Br z<;?gE8uy#4tz2cC2+#NM?(c5opmDw@p+92VXLv7=&(Y1cJ&|bnXMAsWUW4Z&M-LK1L?|v)=Ig8A)1B(`#tl zA8^KfoS6vkSM+%pF#bs&m3M2YIW4iQ2{4?BzYA#iU%bD{#|z{}fKxDLI89^zux*>m zzP3#bK%jX?-63hzzLCn?_UZWJK;RyeI{A3iJ~^%Usla^=z>OjDhY&9+U%u<&4X+dM zeqcS}Yr^oJriJlC^?px%rn)Nh8xDMqHyY&EN4dWsXPoPX1~AvX|E{Pks$Wr|Vs}O* z4rG}onZ&uG^5>SsDPFf|07D)dIvL*BV-ibi{NzpZukI=`xjRT@7}os zw1688x#d|WQT?x9JG|~vZv{jxA)65<)W4}0s()rTX$3=(*1RbL=={COze_+FOo3G&@9teGuW?%ULegAL>O9p>| z>l4F^vGh%GsQgA_1*etMc)+I;xHU1M-Y*GD@)t^08bu3twO z)4u1@_`cLml_!RK2HU`hlfCJ(2k81M?akGQ%ZK6pKpLq-htkpYTN57Ned_o9H?ndv zS5r{#bbLg#))}r3yMNqRSA+7Tp-txrpWA>TL*%ph+i3aPtB2|?K)?4cXNheH^n(lb zr8@uh__BOPB)oTgA|vR@^>mcqjJcAZ?DYHon)IyrT9n^`H*==IbKy(P!AoZ)6){L%Q#K|WRshU#}d)@^~$qxU4Zt<3w-hFFb(^BwhPPR zWFdgmHE+vKA4c^%Z%UGsoc{fN&x$OY^C-XgbCS2~H2gkT=jW%RfoS>6ooPzLU*P$- zwZ)MwG|u;_=9pa4X@%b}%-VWybuSv9*-0+aONQT19FYjKO(;jXOu#3xk4o_T(>KPe zZ&zWQ>U`DHt@hVW?Kl* z2;>bYuYO}Z&v+Q#&!xU&^fHa_Bd&dRC01oEj4xWGcPcD?AC#(o^^Nle$Iip^pW8dk z?%AUHv%)joB2UBkA30CtMi9zdRGx${4}#~r9PNjbvN2AjpO>#w;71|+zUHm9j~~b` za!UMAoTY6EC%oTC__b_*oEFMmd7I)GufzL|inf!l>_qv7&u-i=*TM5?^z1LzXrlH{ zwXTR}ae?1QlyH8R^=wg|a{tj@HBB*hHdudKvuo`E==0rr>0AdlydQ2Zr(|m+jr-xQ zWt8`AQHT38`3EG_7QfF(bw82e*ojY8&*1%9Q*Q-+FkthZ{Co+|pNichjjhT@ z%MapZz5tfO?>`p3c_iVF@=%6(oHIN>7}WaK;scHIgGX6n18Pm-{bhBpnb*BT+b?od z8=q`M1d;>ByW)pXK5TP9#n2qazt=AdUfG3myBa-FOL+fOiK))bpF$X?%CCq}R+V2} z4bOKSaE$Y3Liq>bQ?9DeewQw^h{`Y8kE;JDT@yXeJp=FmJDd6}@*LX!rtB)goY&C* zUbHRu9!L3-S*mfb#8BSORf-sY$= zDTLpjmd&KeMJuk-8LHchn^sPDQkiENBT(4onY=n+xPV0{#?H! z@cz()oCS4hsQx`lVJC*B+5pby?N}R)?;jhCdk>~S-a0-jbUG8&f1x+s^G7JWpOdGM z=K;Lu|KIn^)!dq&b@1H2Seoe=KRn0(FOT$WpI8wG&-c=aGsMGtu>a-X0~9xYv4!WO zzxrKhYC`$9J%#vt@ZQ$QZKt#~U!we0XPe}pQ5)bAmdR@Wgz{hh!`Y4S`;&*h&EH`U zMcb#OIMtBI1^cJ}=RGM-DED<6+xO9)0OHxdE53b=+LwR*H_ujE7+*g7m7A#<S^UoH3ZAvtrUz$~P{{uL` z(2#5pRiiP#FcDBWoctNC@AI60#uuaWuNQTOx_VuBcs^3iUhoadhkkBZn+d;vnfBK6 z_R%18e)mQBAiVY$e*edft*gHil~=pax>p8%UuXEbf}RnL`JskvpG*?GKWgv@chVUe z-?w@AwDfuB##ZpdD!_G29-aU0Q#J9cg7?alI&51eErfD^{msjAceVhntJOn_@H-<5 z{f{cXbdfZ0@*KR^T#$!32*7*J7dX}WVCHtY{2jQiuh^+rD-PHB|MKk4>rc+8w*dYX zy2`qzQ2oS+nBJ9&Fur`qjpsRy_(8&Uo_((3@c!shQkGvfsz263PV*^T|4XM=+~W;E zxg@h>W@Y69($25Q#QU~vIc#qk?+$8#LN#X$pQU@<=ZXVeS3S?}r}6#9lY#P|i{brV6Y^#eKP6H7=^cN~wjQqQ zQlwe@wP@(Syk+Okow^O6-^9pjD~D_oP%-a6s4mEIxP$yP9>?n5xSh;o&!8?xh`!uao@xV!1hX#7{?@txjYC@;DHh~$S0sQkMJw-Sx- z!2Lpl1L@AW#f-7{zAoSEmkw(VBj-il^1$@8nw@E^7( zpHBLpe&)+9PF8gKnKp+x7F0zvBP)--cif8P{5$$4Vk8gtCpi|!d15sC)A7G!@%xXq zAnDOx_I8Nee^lRJfADK#3ksa2CEFcB;y-WCK81ka^N!q**Et$~&kdDl&Q`cIql0Vh zUHRpf?=GO)!HiYynMvGxukz=-!A1)c;|LvmoS= z{*5oT|AaLcD>T~FA)jLldq2?d`~8VH#T)_m*0)w(^Ibs0PZxT{^Vl~n|`+g{g+7>!)_Y=SMeVureVMjd)bS#KAMIf7S*;r zO9B5D$1>~m92)tcy-L39N7H`a-HKUvfFJSa`sU?R zH2K@oeb2m0uY&%V^xwNvW90W+sjHQ13-_PPYxPsJXzo9gRts>PxKxMUb@qELqT&B~ z$?Y;H!V35s9XI$bpwX{bI=OGIdQ}|~n~0+%6;?%p22_PgWaG1uGO#7gZqi~r*z__Y3?T$-+P<6TNC&> z=YL;*c{yp{;3t{iZPb7o3%94ZEg|Pu^^<4ZbKv{7G5_6TLi2q;K3aG4C&U%1VP=9B z5NG^%{pZN9n#_f~sQos}pCOPZ{qOe;+u8GdP^%7&-}y7;NOS*QH892^+Fp;$4t&}B zz>+LqReeKn!Ocb#Z`gGEmmAr?PhsauwgK;-%BnPh9N+=`@AxT({$)K2{F@099(&o3 zlI=_Mzq@eVlX~PP!~Q|do~(cN8?onlpetL*@{m6=iuBI~tYh_sy3L5`^>1;}gXH%Y zAFyB2Ali%~=bq_dNhNW?ksr6nduId{69oTA|$Y7V<73J#C zc?0`B8?KY>?nI(<_pqg;Tj ze{W&_`hD>3L|a+4$^qV?{9Aum{C@I}`1xMYZCdxC+VMNQGx>*O@%vPg(*|3(pQ|uB zT@grgKiBoGfvH{PfBeu(CuW=?%a1sdSyQYJ@wvT@j7T6^zUJphNkNFu{ip1ol+wiK zZXbB^539oY{MYp}*=*$bvg0*h$%@-;sB%HpVMku_{2N$4;+O*aUZCR)2~W_;{MSG1 ze9M2qQ1@<88(M!|-A+n`w4Xb;J6vyO8#15E)Wt`m54KLoYupZajoB{!oHyo5mVY|e zlu7kB*au6$mWd$qJL?PQp zt}G8}Z@JTA_W$flIaj}>vlmMm_+A0)QZRMVloZYTpeOZSZee0@KdbgbAW@0@zVcEI zVv>+II#LnYbdBbHNTS%czG~n-U-Iw^?;;xgJ!5w5GmGF{@7#aQts2hx|DE5V%z~F$ zVBGzN`c`g(@9+=D_V0Y9YZTFWr9eyba;_cBxK5o>%X_bflse`tNUpfC=) zAzYKfz0VJl_Gw(+d5QcD==F|bA=dSzeV>fLEK@PiuW#-5zd`f9!SMBhs6gOv=lJnD zFM)=?okwnKwq{H-N-0e;h?60|-<2@mw>P)9Ag-N3oXb2(|D(^%9%QZq@7Fr}gAWCh z_N$M^RzyI4BVv!$hRrnouiH(?A`^IppNBT2NCD6AzwyWXW3qMmi%p=DtxpS(#&+sB_A|LRLu zN~IxwYg>9LQI#hC`qA`|OXooyx;=aDsLT%1{?X(i&)>jL-r^&vVNPSO$f_vwvjg6b z>@v3Nf_HlVoqrxu9O_5;n$VxNH|B9P?@wKPf(=J5*P+mxxmz84$@=Zmu79gu3Heb0 z-UFX$<_E9wvI7|~|E_8Gmd>K#=l{ia@Ob)2JzDRQCpUWwIscm8+V-x4_p|kZYGHS2 z-p_WX9kmNkfc&!Fo&@_d2_wd6_Wo=0QQ@5kgLIysq zKjAPuBcZUe4Q0>jEZ1Qrareh-g(l&<#_9#THcU1*t4+T2{_{d4N3qF^2WD<8|B9eTNSZWpxAgGcGvPZqL$ zbH}>OcXvYm=;tc+u5Pk@XZ_+wgfrWa{&@D{Ju0L<+u7tTmPQky1w(QQ!_HH(Td&VNaDq!1075M_iny+uE=fBVgF~3ozK!g-CL1r z*^Cx`muOL-(T`rBXrp}w@=uw?(M7s6`KO)}2P=7icfZHQN3rqd=}arZx56*4;VeCbHR7|s2URjJID?q7|-uV>oiM#JxZ z#H&>H&7LOYUwrnt6V3g@T|S?6;ZhCA{Kd`w1#3wEbaB^2n#S!qG^pseLV-qq^t?0N zPJ{mDo;x=;4BM0aZ%@{%9EWpVUDD(D=c~x_T~7Y~^I5hDg^GKAwT64Zf8&RpZyXQ) zzO^0BT}0g<+*y)nPuB0Ts_^_txL?q#QFb(X#QVw{zl?)2gn}}bHm>oXzZ8EOX%K!eI>oc+~hCK`N8d* z%!p77yek+tIkE}fLHuh!wtl^QXS@}M{A@^(`!P+L{GXZgf+k(aPlRu9<|w4ePuMmU zJg9{4ZYiiD%LDV^U-{ViY*<}~ix=`fbvc;>cOeh-56AqgVpY|=)a}hEL{f4@f#&_V zwt(!c2$g2Ex8=^~&8Nun5Bt8lb@XHlQV5!-X{t(=pTp;I=(|NTVr@ITzn5nI9{T=G zLY$)sO^$iLyr)8b-?ViaKW9Szd#9PYf_{&CqH^HOuyXyf%~Ee^W+oR&0Q{MskLa z?|O)H{@G*ai%oM)Z)Ai1SAUJnc{3XQFGu%YrfP*;K>2I3eNExFSj6G|McsXm z=T?0rUQl{&d$cC#lerdXo@OH3f9lrV<_NeKu=cRkk5wk|@~#HG_mAQJZ!mm3`=H9FQY_4H zt{>G1>`T5v;tTn@R?h@|0iCO>6Rz5k?{nna!lUEl;r)$d};Ib``KABCNcUIOo5^&fSI8IktYZ_cJ{^yxrv*h}+7 zGD-VwSMG1}$ZSWC;>;Xdl*#^;#NJbOh5sG?Dl`x1ga0A^`##wFKvdy(?7bMQWRs%U?@J%wZZ08%e% z7WKw-qIvvAk3R1parHaepKCzBVbs}pjz|<){$Zyh_uIIDe`ryc+bnzXedIRB&ev5^ z@cxx&%?b%I5-+-9d*&)1=rhC#wOE^xxJm9l_XAO&4;nnW_?8=4|Le`>$;CmPC{24! zp=K9$Y;VetypK}M#q{I8^(1WbaPK@`{ z*!YFBR)%wXbRx4yHl2rZ$@>2o>^wOS_zOHV7QTp^c=-S4FJ_;c;;UP~5cE?oezINY zME1Ww@JNeL54^v8+o|W#LgLK)tP@ecVf|%3o*NlX;zyQKp+Oq`<)kWaW`hpk zKeC+a=jtW*dEc2=K{_rUx5 zycH9#zT73t?+LMS`2_Eai+e?uJ)A?fFZAo0w zh4=1U-+ioQ^z#uo>pdEGZ(~NN%BmMKS=1}QA^LFI4zBT+~7l{{|n7!qNyfw3|)UpGR z$NumBW`43$D+2VNE9xX%&(Y{VuL|4VCJ*n+1s+Ro(xiD`K77kLe<$o;aqb*v259!L zl@(&KxKhNdld~I0YY-~^4MH%bcfBOFy zfevR3q^f{lkMFLT0fWB~!*vdBl@0`cmFF*&BJR-et9VGSG=2g4V9^0*3`X8k{sXg@ z)GbU>f%VV1d0&w%&H6X|sI=p1AN)UJ%4M}p9l3sn2P~A=PQdsq6yLu!oy2W8f>R6q zx=>NsiyWO4iXRB$7h9^nE8GP5#n#!(?P8+g7gO((%G2iueHOvMvx`ls_GA2O)%ybS zgPFU~n~~wjf+0xa{F))c9ca?=s$Z+ja-=7q0&hJYLP)qQC_Fo-CT<>LFD5 zSpOS_(Zwu2;J2JxOA8T&^%8FZ5`!N2r7ljrviQBtSwx9TufF26R_}7;9*(-bl{<(Ea z1&)@dQaHxnwlHnxy}%aOf6leLmkv<%WBg~n_p*K;cme#9=HcTvA5l2QzxE=_a8<6jGmlRf^&3i!41d|&6ZQ1%#q+JQB* zn;t^{{ExJ35n}WY<6krCd^PscsSDLhEan(u@ZVwlYW)hUe}9Jck>h@1;(jt!KE{t{ z)$pr>?I7sSsP=0_pQUh&U#~p4w1}?__yPM|PX@jq`MIX9@F!2zK>N>S6qf!Z@w(Tt z&+~wvt$l&7oFN}oKE~g5s4>`n9`K8LDEF^B&r9NgJO*oLK>Gr-QOtEl`!IgE2C??- zn}NTy@wAjC?=H$7<1cf*T9LdaAI3k-zQAM^g=73>Y_lv=mUIF?W!tKJUxq#o#=rK$ z!}Eh=6MWy_zc`Htss3U7Ykz`V9|U$o`(MvY^|LA0G7YdHdwom#(wtuHh#fwcnT_{b&K~jjp&xW=CYV`2~ztg*rKuP1*JO+O# zHvX=)6FT-Oz^|zD#qNV1IsX0mM*CF3|K{vho+-odzu5dt%TKy(as>3z0#kySPEhvP z{QhX=$6x3P`evdNrMlS^j;)UfnR|VOD?mTX-$GhPm0F+J{Jy4*mS=LFsDt#c@Q%s+KbC7O!@|7*qDboHGK{#VSuZ47f)8x!b4FCWd= z+pv|g$NZy)fK~<<=z9&PnWl%Hp>WJUMZ|n)>d}SqDgI^fWs+(i=AX`Noneu(2Ka}S zy3{<^QTCXBy0mM`^}>AM|7RUsdeDo)G5>gp<>~2j;NN9yQFrJb3ZI(hPwkU=6%@M_ z_!0fMr;fj)>SvwCm;Klsas>RB*z4I7*X~g`#?PC-?#)v6C9r-DEGRh3=s(8q%l;{; zb|&y=8+}f;&RR*?WBkaqXETjzL4U3LcBB!17=_DE^T+m#EMuRv0RGv(=US>dC_HW& zFL|EJ+Or4r0hb2%Oy*NK#-DtJ|4;9OKxltPuiWxD3di`7w+GAEn*#rIWxv1F>|APm zF#h73A2c--w18jr*LF{hnG~KdJwB3ZAu%&VVgI%3tG%W{j{od)!@M7Rfj_x$R>ji> z3di`9=fqbF%=+7j>~ENqWS*jMj30XgM`^_7$DQbF*{*h;ZxoLGf3u*QC%uhjTp{N8VQFL~a)3Hp6k zuW)KJ_&qUx@YS_zs;=At{$brCp00~1dyHTFNRy|}nsdN^s`P7~sRM;${N$%nj%NP= z|7Cr#J-(RXzc7Atqy5kLCxBnFerQGMV++cDXqsPlGfVR^PT*hetW|sy#@OF6er}^z z8cYYdz<#mi>znq}_+b3rxi^j{efR74+51nsJqpRZ6j#&7>a^}|v1ayZ}E{T`HDK=mKv$G_jRYgSBI z7kamhb?_8}9~L{m!ujucNc6w+pIn|ZWsmXm8=M&At$hRhruD29{1sIF7{5Qu+blgH z*q^Q0!>v6T`!l8wkXWy{h!gnp*Q>idKE0YMpLP0toEMXulXDl&r^Ugs#`7o~(yAh{6 zAD7`i3di(AcJ9uT$o&cD1Ez!VTN(Ndn0`ok$X&BQ;CKDhYpZpqm9oe5Nn#&(`qshu zYNPQlX6|kZ$Mj8Rzpu}1g!7}*9QDg=zbG8jFKi5JWJ>`4`uc~;tw9X_dim+`8Tj7f zE(CbSYq`aq41I;6X?|Jf;v*)k191NH>eNZRPnD19mvG5w7b}3h*1m1W)EV}e{>grg zxf_1o0DS?=he0>jQr~yRG=DmC-M;c-`2M!qqyCzV?~mz^h#&qM*x%TN_?``aA7z{$ zm8SX8XE6s@Fv0oE`RR!2l}W07m_EpS>DyyQFn>(;@8)1*%pXi&B>$8!n`JNTkF^PH z-y11=OrKZLarf+ilj(5ScDL5bPoC^PXj; z9nJ27Jcd3ErqAQ~^puG|=r=`a*6Q5Pqx4BIeV^jz`4)W`a_>LoP7F;p|3K{Kh5*bkEH_aRp*aC zmtp8fVfsyet7M+rTYx@O*gm<@PRbtBZ~7_IbN(mjPQko^8-8)d~7W zPH0)=Z&9lKtke2YukY%c90PrqG#f45bRM#QR{g^h`Ji7|A~1_ppP_$<_3t#_-n+er zL7y>e(&y6&vVUHOo7d0U2l{{A>knmKqHt{f=y!yQv>J4ycFET4Ib#&gIz2w~7Kq+1 z2mfStCniMJpK2fGpK^_3A69_=5XbtPj?xVMA>(QPr@j_}m2dAaW_9RBLhNSMiH|83ZCt!;O9f(*QUoWr)crWR?rvX^v&a*Cq?0yK3mdHy>0}! z^vg{uVhkJ`U&TDFu=k*U_~U>{Z|8QZf0#aEx9P$QsmDM+N$S?!J%=b9(`U@HX;bNl z?nZ1PGX8&eQaGm1$n`BTAib;`X}wSXHsmPJ@Y|Z-nU!O0HeW-*W`|A9Ci-g-|&(L z`VhOM*Xz%TL?uT~rHL5B=*-v;C{;LgAP`5p$wIJSP2o#htm`*))+9D5&dGxQs= z`QPq)c-JY=|GPKQEqJM&vd7l9-Yu^P5zq(i_W056#?S}F)^|@^wh=Gre-=xH8XY`M z*<EI`lM^c7hC63IHrF(zPHiZ7nV@iXXW(| zzfd^l-&_)|TI~e=$&{=xrPtRO*jRB{j(bH;sezB#QbZ|>g%yO|7-uT z6ORNL?Z?(X?>ieYA<(~5o-dN>$=IK<_V<`}#c6|nXtC7l>gB0a{n+{+&0F!M5%#C( zps3kw4ExMJecGDeqV#sT4@znEqLDLGVPuEI2;|^t0+6p>Qm|Icsp% z{L^o!U-ORo!_yRw#W&XXlH1IFK>olyY2ysW`3Q?YOcx(a{|fO(b>6FtigL;xi*KID z^zK>m9^y;CWjub2^Ai@|Xw5Eh488*Q56$ipg<9146N{hh0tQ3Oq9DIA%sM_}HyM9$ zZQr%|yG8hgX`RZ;r(`k>9kCG*dS+9@@5ha|qRb zEPgWiGWO9J;>Vh?@AFw1@go*LDGlCGtcU#O6zh@Tg^c_r7T>6isSRm>zWCS=ndQ@4it{X2X_X=R{i1Z zMqgRNlXDsR-dKDgvfEL)5%SC8b9nc&GxSZc_=No`w?j`3I~e(CEdCoT zfBt&u7r4K25L)4t%;?|r{%H|;rXd#MyRym(`f$zGWUa zw|5$aWBJc&3(iYM{@_1W-M+=fxc|ZOpLh5DY?}f3=dqEO+SeHQXDmPa>QGzQDD96y!6!t%2R1=ebOAL>NDX(67sZ&EmxpLLZ^dG;OdHu>9%B*Z#9(kiU<8&tG59 z(C5PPuSW$+1V79K{irneqNbx%`?36?NWx;1ooui^ujc8#_MmVq|0vy(?()t6^m7!V zMfw=}P+0!*;=14GvUhhO`2&3q%!;V?WBEr#{yM|!kU#&Cp>1Np$e&~R(eZ#iwHVASrePvKa8Skd;_0goN@ zKU{WO<;Pme9vfc={p75Zc96f+N=`|tqj2o|j2Ey3#>>I@?yLP7EJS|aoku^e7MuHRm>c{5iYK6#a z>B{hZJgY7`aZ>eT^Sibyrl$z*r@L1buiwbHpT^cl1zM-bThocgO%H|~{7u&xZQ z5{H8@zf<%tue}*c;n?~#I&t#0_e3YEudfTPOQUdXeTQVZC3_md{u0hy*f>PBAM+2| zodQDhjbZ<7=AX6}Ts(7V3Fv19q&4RlQT1c~ z&HR?>S1V1pzw?m(JIT-|#QfvjT=SH@@P5NQL?ZtY^>00e^ z3di=B3yC7jP96k((Tw=($x#%J?N8M_hfGFbe}8kmSEr4!zhnEGh}O)Xb0NPfZrU+< zo{?Y0_DBCs&KIQyZIarMU!BsB zi4|q!SF!U6>n5c&XTaWa%dYch|4{bW`R0M%5B_zae>Sk`_3bUMC>%Q<33fHV+;X=I zNv~cn!7-m2U+jFf+S-TBs}$Ck=(pAehW;9MKHFMw*V1nlF5!m;@5^w3~q4$Kd8W>zC(#{9tUmmcsWFK&SKGjKh*dO;{)C~^&MEZT!s8;JKy7NHjMl!7N6Rj2zquO^s$TT-zbTxQ}$n``*$q5b&D{> zhfXE3#_o*x5Q~rfgieN>5Pc`D_qeR(b@qM26l=4-`->^-++h@bb-(dNH_w(WgKSO*Ke?MQanuW5*@(Xt9 z6_zJfcB8y#d*xJR3diyjX3ILujkAC>?WOFo{7@;&o9j=!VSPPbkie5g;aGm@!49XJ2hPI$;o>?` z>`JzOQ=j7Vxln(h;s${x$lRfTOes)hW~@I$4o{EYmO$aH>lW{0|zJB+XE zTI(}yWt2UZAN<5xYx*9_KmJg6V;3X8kL4F1=ZXou)P?x_VEFC#4F7`VCldqtKdgcA zTmLR&p~+RMd@R3tDZ5eg_(90uhAQv55=G%yepLSVue%=5{~3LK-p!XOoNqe*6#aE> zrZ#;4c!dSbnxZTqjKh<~Qp}gR8O~ls%T;y|dElz`oP4J|b3rtMsLC%s%Mq z-|L!}yHP+`_XY7y6fQqq|N6lJCZiMG=ojmv0rrCwj`-Rmh4xWtsI+ow>D(0x=gZy-vXPHf)9BE%M@yvc0@~h*YMb~xYQh331 z|8HHm7jzHuvwyCdPl?myXZ_#pzak6yr6co(u5H{wuKzuTN}WC6KjYMQX?$Vie{lct zE~ax#9Q?<;V)c4C${t()@$F8NTpDoyw{FqQP=MWZ=HH=>PWKWS{s&v% zt}1@|Au-)3$#KFw--)uv);Dib>Aub#kY7!8o$;HIzsJ^hQEl=0uaLiE(($@iv6YvJPv8Br@(-G5F)IvHQ`)%sZ^nGr@mEI`^Dr?9bT!am}-gUiLlR z=%r|sd{iOTf7a>yS$0mBXg0`?8{KAq8qK($#_op)y!47!fd9()u5--s8)biOx_wJF zd-Xkr`yts)Kcxj)DIBvu_S7Yf5B$56Cfn6OhJVNU_w&n^fna0EKYmbIRq%$g$NIOs z<4sX6FYK?994C#;ss3aA+w;SJ>)g$-J_bG*UieJeW8X?uNtq<=}VsiDTUVcTeB%S559#jE4N^@W||t(?X;@=Unm8oNe7m@8Kyf;{mFE z?0vziC=F8%IKK##TW&hTIKN=$V-@Xk{b9%telp%+-r-G^kDZV23J+h{zW~m^7iL$K zxl%aRzd>K+#fCp2KRMy_VBuLt`=;L)EXrbK{&)i7yNE|Go(56z0T!R!QEU9A1?R7? zHY%S)H7I*5KDgrj$*h14_TQ;bXtM`}WAVkDb5hs!es>}J!oWnn2nxsI6Ycvle}1$< z{9@++@n#=|WAV@Jo%V{dRgiyKuq0#?3)Ma>{)s^2yBxm2`xLWpOGc6?do2Dd+yBFF z70iz>g9Ec|EGQg{|6W)$-g*q{H+z-J5dp^eJ7L;C+cW)ClZE$7IgPKpH!V-{$va36CjzEPnB}_Fnf1)_?f&?@7T=WQg-4rzh5U0+b=|K73diCbwK)l~^6)-stp4gF&G!_J#UHB07ygVw{4nly zZLFz{!m;?{+*#R?@M5@MD)r@#W8}xN_$Ey`>`e%~4_e{$czIqiWsk*A@~WpfiXr}< z;qb5#jZrujKgH!vd}nzN`SIW{-x6<9I2L~#PPy4SRNaO4T=dcDX2kbcd=qu$lK^)K zyq}Ewbn7rfA0CTuI++BLdm`#Q$>V)4@s9&TahEs(#@&dq%_Os!um z|M*$>9+L#TPY%6cF|eKSJ{ij&j%2v$kHP!l*fY!)4JWAl7nWa6DRSQb&H?hLz8t@w zKcvdX@|Qa46;HODhx?0YdrJ-*3di!J1|we@9*0AIe#Y2V0Urv-@~=x)JZ~!pd)c$X z8)dC29Lq1iezD_r1>kACi$kOtIF{dK;TGE*0{2hWxe-?RjQb}nKRnnMwU!I=s~4A) zMIU4Qe+tWQt~}8kDX9(l(T4S{#($~$vHWJxg_Up2;C>|FTBPU<#{CGEKaDWIc=JB| zKiNbg{kRz8|H)YX^-SBVmGj?sA|vU=m(MZoPq6%G+)>S}0%4f{?dGX^I%Iy7&vJJ_ z-o`GZv}(>@!(UYUu>9tqzsiLgD)9f5t{tZ(82>-Q@}o8#r2@_?;Qw=yt|hM+|DV9} ztD6+UwQJ6Fp?;4C&dc^tSg=6{8WMRAADS2=|l(3ZFQ=G!F{O6G@X6YIsc>f(<7qLu_ z%+K0Cn9M&f0slWS9*sC8P2pI6c5l~{bK$aG=%o0@nm7>($MUlZ&$lWESoGFv_4`L)Fq{$=|A4ULx;X{2eu``XkZPZwqi$Nryk-Eh{|Pg0PdRB!wHU?qiP z|8MClD_`gc_kVdi9BbbfQ#jvr`)2kXE_nz4uXkPAedzf|3djCm9KCg2V{(sTja$iuG!mVKpZM<^%BIL)}jLv8K-=plur{kad`aitn;C}lZdd;rQ zxZfU{j(?_Z9Ts^A`+J~!ceXHNf5-mcWy*JM;P@?gUy@ZQc3FUGKlcANKJK?SLcm@r zmpv|zVUPX4jD5!!W|wBTzvuqg_k!_$AH#hN76@uQgZn4VJ2%%b_J6GX*AH~5?S}IU z&w#j37vubbwg2G9B&!0*|NBlQD{W@v|FQNz4IRC!0{*$R<&U?l0@;46u}`N=;QqYi z$3!oaABAJ%Kge!bQ=10!qkPp)K1~Y8#y`7!WP5OW7h3E%L$i=^zli<+aOXnVi?iVT zl2+_@J7XzjkKy}@3Z4Am{mmg?f3XLQ_cv_Q=hOG03l1v8!TGbLbW+`pvd8eN#SgE1 z*#`fg^D?}4?-hk(^V?-zM5TBT%>M)Ty)4gBI5xkRh0Z_mzway7cJI~yeP3*To;2ln z7!Lijl`h{A$LJq6zr|HG97>^md=6G?H!$v(u=VjK@$fZ4xSzb7-hI*M2~|JlpWJ_P zhNim0{rk&XgL_IT9P>}+rq-)c=EM0(S~S^{@&7Q)KOM?_T9d&A`%kc@lOyAP9`ld$ zADwm54utr@pj1rsJXJpCU+VArv5ElRY%|`on}K8gNyzD2?P9opm*jeHb!3pT$NXC$ zOTk3iB>caxMsR((;bKV3en zbZ6cnCb%Elza}atn8LCC*A}x{w!!|^?fFP$He-Lo`rpX+I(ddS>_3?c3$9(Iz907g z{qdmdc?EF48TR^klwKK$-~TJ1a=5z#z3aNN??yYx4=}{Fa{tOt9Vj9H%y0WEB;MR? zRksQF4QdruSO~49aE!mCG^KIWu%Hu7B`PoCT*=^9nErp3)qTx2UC@^-F*DyJK%*~N zwDEqgU@Y+G7;TsLVet3(PusUWlWBGWewS)de}gv+eisaPxH9sh4fGqc<7P2(K+8gN^>x039ihn%lY)%SK3?ep1wO)SZu5ob40ss9)B-vqh57M~(<(Kl?D zx9N4DF8c$ExTtUTq=meJX=k?=p3uFzYuxQo$td6d?IqX>SM07(O(i zm`;}eRm%LqZ1;8)ynl^L8t}~hxBvBmY^fojKiHgHm76zA;?k<}Pink65UYc?mB=-+ z{9;ZKneQKfSFq&5>D$-I_UYbt`?>v62kJ3np8Rb@+HWpM++Ys;BAo#lfxnB%`Sa6u z%Tc4T4&=L3?L8Zfey(23S}qkCIR6$0Ka>+C?XP=qBp=(;iFp2$6{ZzX>j#T37p~06 zJY@v_>CD;77l#<@Yg(T*f5$HEgmB>hSv=Pz$cMz2{bDwEN$x~qFP><;&?n1(DD^$G z8uVlP_rHC+LY2h3b4vTPd^=HTh^zDp8h)f#!=p_cpnsY*^N&F!jsB^X^M~>SnXvvj ze)|SHA;2&~|5Ak1ncVVve9?LB6M7Fw99QGWPJyw3zP4%IYU!d>lZM{S_lKejV<i$$}m6nE{OfXN!ermHzafE?%S7uUnMe$U&V;D=auu0OuF8Ql=psb^`YSh8)*1` zZQE(kS5|qG$m~bjbKF!=*k#&@4EK5*?d_*~m5ZI*~Eou^N3YvVB_f(^wz= z1pd5x=X!*r$o^kBb>D0`H_XpkGc6Yz5=UMUWtSFrqIW;;1^C*MxLN9anbZTF=w8CT z)9%q^`+_`MXK+D&A>fzn@G)Mpe;4xD3INSeqYRxw09d`tfJ2h z`~R%GecVB$ec95;PTJ2O z_KzJ{)`3iBk3D*WNc#;x&IOrE0zcwF{?so?5-+_w=Ywu!2b!{}Unt;7me2gC-#Hj~ zYi$h#mKR2o{m))_3F$$q%~s(&*}+zzclx@}CPg-O2VJ+c6Pa4Z1T< zizgqh03Dit^;b{x*Z)w>iHd~s{p}7nM$?r4(LN?9prj3j^WU1P;3N6n{c55jM^?0< zP@}TeR?uPlZ~0G>^N-a5e{AQaz&DF$ko{Zz*;zmybh&sY*l#1y>H6>Z>}5M)*af`0 zCo3CFer_Vmk0?}~(_aVQ&)@#lhmYj=eEi5=cwVCkReW|_I!~13@BOyl?F}pFT9@YE zKGsa5{}IoBr_jK+0ll|hurz-z$sc_?b~eWf(BHFMK0KyHqrZ1Qbi9w>9Q0wcKQq?? z&+fneVf@o|r<4}Wv2Q|6SDQRqxybeferY`S81yYvzX>|A)972o9{$dE0eJ0~dwhDX zMx(E>pKVWXl2S8LdvR1iDV*d-UcchJb{X(1A9`$FBtXNjELtmMpli^AVniFV&+I4p zlX-Yeqj`ZBKczjvmTMkT6AK41F9Sf^N6M4SLd$H6;s>?`hhIxoi@i$IF9rhREQw{?j;(zVO_|*gR6Sg5W(5E~nyhT2P#CNwabL)zO-#g~!UPzHM$Wlb;5az)#P~GS)On!!N%kc~QYbwFV@VJh1eWC^`S)Mt7QS2j1yDlN$^rU?2W( z|Ir;Mq2asrXz|&ycQ1C5_N$GprJWT)pW;Df-||&t``+{=ym<<`W7WZ_v%P8B-#N%U zmgrfBp6nm`!xBl>e|*J$=~FfJ$k(dCF2<3pzpvctl81E*>XM4Jc5@@=_rfc7?~MbS zQM!H<+i`tzewyTZm_2ZBMo#L7uPn46an?bhWpSXNo5R%5uDP2mzx=6#^a9W=`Ys&# z@FD0J{dfM)50G$l0A0fC`|h9L2ReoS#Vd-;t{c0ypedybhR1Em@|AQK=*xk=@08vh z3vC*G-z`JRC#A+gf0)_ng?=Wvzt##B=4=#dL*0q{Vnt~5my1?fgs*zuhL|E(cUd=( z_5us?YL39ZD1Yam(>2&9|Fs`KpS(R#d=&WE{pSyaW_=~?eO*7k{LtbF9^DH1AHE&l zb5GFde`Kk;sQw0hl^t8|SeVo3t2|5JQLyuMJ*wp|Un;tdTtA|>$CoSueTn7Kp9c-# zoc^zV%>TXf+I8M&aRWl~N;h(qNc*p?CCWVMb!bCqbob`HqD{?-Zgfpsz-vsS z@0y^iEVBaq!_Z@+zG@o(@Vcp_H67}&J{HY(jHZ5J1@4PI5Ld3)_UhUojXv;*fTY#{ z=t8OYceL-M(HEIlUhEeG`t?##3sobJlkNBBZJ$~p*o1z)I2u$fPx`k9T~~x`wl$*( zF8!{cz2x_kRj*nT&)tGTb0zE4bII?2?}%pN(?iYZ%bpvyb3rHjzu$jGbKave(2p!$ zq9!FkqaV54C-buw=oiHv)R`4aqhEBxVr5N;1GQnr8lO)aB~mHn#yS(i>owq|wjm-=}e!&9@Fclr}7E zq|p~_EV=S&6Zn-aoR@yd(3~Ik8dnr9>S{#657?6pX!O|{jenL7ENnnqw7n8vZy?+M zKp^|lvyeJu($6D4M5Ax|{H(ubumtG$r5AR@uO;mz`oA|eLfo7B%PY#0X8#rSEK zN6Ia7e!T8#>-%Nciqcj|OBalg{+TWDXhnU-i8s{r}+3u*<8gTG7P?kF%}Y$o_q(^OEHkZ$(k)$I1N)q<=qQ zII$!Y^iS>8CvRrb=%3DhQ8+q_1LAvr|3w+Q$^PvuikwjV0^{pj$*P=8;{DkP4pGql zoTFKiXK30ltE1!`F!zc#R<}Wg{KZYA8A7(zx8)Hb&>r)d;S}LJNPyIoT1w@ z!O#60e=Psu^6lGr*)GtR`tq4cz=oV(%J0weB!d4rFw6FZ3XT8SQ0ZgDrO<*7u0445 z{u!G2b)Hq#3H(ya_SbiOY2ugD*5Yl)K!0*g%!B3IX!IvTS^QFNz`iK^CeUIv?34f6 zkNLOrtzmD+8tT!W&{fC!Y{>QZ)cC7%^G?w3dEnDM8cq8D%QDF_rJ&#V#$;*V6perA z4SUKY5Bi8Yt4@9{QzX~tig`OemrT~9G*^}2@496D?}8gV-|EyMw04e$6OF!Au6Bj` z-jj8x|H&Eiq{C$UwDfw#s$kxq(>>%gN#lRj6yH8H;ch}a#@}PtD3R?;T76@g3&bby z%z0eWXyOw-bulBsJ)j?1-`)6#MxX2+(;5?I@c(AJJL_9$>My&uJoneGI%E-Ho!S{i zwqK0-c_sI<26Sa8gh!u7f6m}Sccl95M#ORXaK6GWvi$}>yr0e1YC=(Ca&z03k@zW& zK(Qpv2ITW5f8gYDa{QCl9z4ktTZi76WO1>M~im5D_|YUKK{{q>4V8sZYmk8=kyAWr%3{2ja$$$r$U z88vKm7&0{@?Z5W){g8sVr;?N7X9mPU|Ln2&yUp5vhO1r+dKJBY((3?O{>B$u3eT*D z{q@(zr5rTzt3;z&T@vUQrXIf^eUe7M@Y^DztwXv^NNHeW<4YlO{F~(YI$J^C)Uf46 zxI5%g|FsW0KUA@7udtlofZBK6zaXwgexJ{B3B`_)b*QW*^->0neyQAMxoW4~bx1(B zHBOXfeqFt)zhN`zGrqi_V_dArNWwT);}kJO@`i?qRR^C^o@t=l!W=^etUyq{Jj|6QnBFm4Rv7J5a zLLG8$`|ZbIgKi&NT|$njnDZriZf+9q^ks`?0$B=O!DK_P7!IG?8V zxynh9^(%dSD%ajphZ4r;JRi0q>mOk;Uc!YZ>TEhwC$WY@}Jg%VzR>NPzz3 zx#8B+*);l>nYOFgZiJ%{yyqKQ-9ohwXbo2i_FUVt3iW5QgTw=tJ{Lcica6zd5|nW zWx%U%E9ja^F8U!oZv%Ngv~qo65(asPl6m|(iI9i**FNn0s4udmv{d}ck?Oj0CqLr2x9 ztGC)vGmk@)wE!7E^f+jVY2~(|VqVkKm1{`6*D)mHWJfD1;_gdJ>LJUI5;YFnd8rK< zMl1FX7?Jkn&-=MJCtA^`r2;jl(@A?#sh=A}m$aefL9h1j+)Co}e}AY-2K{T3zMt-1 zU&!%Ms0(F_RBuIpv|3wZSjq8yWH(tHW7mwv&V1F>b|L+LVq-#CHRSh~EHzbGM3djQ zJ!QXDOa#s+&S$dn(#ZKy{b?Wf#zQUW)6~9~(HluTbCbHV5}a!mWaXA8(d1uq`oFx} z;SKtp?B6*2Ov(0{wj0PShx}3aOr1V$n*7l`zk)j&qm4+ah>QOg#Hs&XzhT=sTz5RJ zN8|V2Xsxg#{YO`7al@kHb*T2z!n037hwq;~mjAjc_APGXk_O~x>2pI?fwbSm`&P}- zwhk?F{N9-nN7~=~I->imvJP2~Pi}MDN#dFAL7Q2&HJ||nscqZf9{6AV*!_e??whO2 zO6t(!^WT@%(A=-Rvy5kTfb%!1y1X}&=KO8EEIv_Uuo1EKid@&&N{&xf#%;@;(oJXw zfAr>b2@+3J|G1y^Z6n%g_~nkVF^SLQc(%U*^ks{k|8DT2(U;xIX}7jKz5zw zjk3r3_d@On_#COc>%19sAN|?RXiL-N_i8-+<_yFAhKYjg=NB~h z8~d`XKV?0tLkAKngO56p<=^~TkYfn(fwj-M)I6H_py|?zJza%$s6P3b=KI~G{m8@$ z=|)+&-}HUf=ee5vevkZZ;@(31xlN{W%>YgOx$XU;@EFjSX4^j?9Z91v{pVw#3ukO2 zy5%SJpgxEk|32@Kz}=`Bbsh8yaX(6~pKI28I2;w45nIgBLH{!(-oPGLc@plW2m34( zjcD}OBl9ii@W{6yan*C8~nh(`HRIL>#vADo|J_9YyH}F zFV2(rq*$mxyk-lks@dJE9!i$~(Sf&09pZ*?-s_%{H199Y`<;s5_i9Dz+oOuvHVlpTf4;jciK?(e8D?ni%9>T z84!HD7UCwM;r;EMP__} zcMkz&m1&JP$oDZ~cMcRyzHdi@E(0ek3(5C6Zmn;m)!_YVf-Fb4)LHU<&aPdYcAPsp z&_&kUGN&JqcssYz@v6WMbnk}BYl%1#f3#uLECAk@KHvEl-KBY7y1?$n=<{FgNPp?k zMdLK@YeU&bI*W4Kk#ogN^^Fo#|0*y4-~05KoO1s7v+YRdkRv>?B>V3)+*~!a3H1GD zt@kMXPU4lnjz(&W!27Gdw$|mFsPV=03zP26N!kT|S=zk*W)Jx3f8QU&#WQ-28%nh! zzO%~*I9HMOZ?8+gT4)RJhmQrUKG{Ip=XJk)&{u*}Z}X$a^$z6t$2T68S_$uuRh8Q#9cbPk8<#gH9iM7PwT|nHF2|AO zb8o(oY`?Dqsc*VoFnW4&qE+T-(x?{Mzf5O&_GGViB*fv};(hJ^wRPR` zTz&svQG}ARvXV`*2^FqUk|ZlBGep^|vMVd26lH~`thB6TL{j!1Sxuu-5sFB^*T?U^ zzuiaYzW;qbUgw^3?z!jvI!4U=*Nbq ztG^)8k1R8e^OY=w_q(NdQICrgw5k8)6-wBy-$HxJtW*Y3sH}PZXTVF1SbdW9nc&N7>j3p9>Yq|X21)8q z-fG=mUDyu!xqD+<)!yL!Bdo8OUzWz_(Bt^&?SFA0(Ut5Ymr?wDBu9shNhhXPo2fn0hvH+h!o72F?n&~9-c|&8 zTK~4Myz}r!UwX*@)!n$E%pL7tq_K-26V&&ZN&dbOO;X=ec~{WRRU7h?{m%mF^H<(x|Evi0Nrz*zShvTc zIQ2Fey9THavbFIMSbq{7pSxZCW7)SISmYYblUmPE|BI(Wz(N?#Rg#C|WGr@}{^7$o zsp5;tkUvv&GBDf_^$$4;4j=9U|5C|~SMCqV`TpQNmDKVd5I;F-TPT@?w!c4|NyrZT z-`e_;>u({BzVvC_#fJWv^$Xj?4pS_O}@)(x-M~F||diQ)r z9NJ&IN|-8#r2Qu;j5lBJh5RXl*M>7B`3)EQL)M49Z^p(0H;=RIN6$YjJLSzxA%8CC zWm}yXN&Z~Wo$ldi9*7?%Qc*L>qvx|NbdrV#lsgnz;ot%!m_YQbF-iGR9 z2Oz&&`*p&`L=+F)JLTgo*M$Ah`d-ROay~EYqc(Sh_>cMG$CuYg;y*MlZKeEhzaXn{ zHc6A@eqmp5GVO$YJ;o@p@%sRrQsfL1zNBV zZAGhoNu%@gR5~g8I^-P~cWjiVfjoqN=T~)frd=J*-@Y_I_!CIZ-vPe-wnrepOv$G% z-h(8+42yVs^^aj2=4D5JunXdFOYIZBU(R8w3nw5hm$LG+g9QoB7o9Be3+@#YtPSh> zAdb9bPdNX_?^rx#snUvV%Kzf;8;RnNS~}e-;a+nYH+wiM+;jf>{3e}cfm9H8YS!+W z%z`-75>D9vco-dS=|S92vXbHETDV917Z>5(;B$Yz9pg;By=?b+bbs|J44u@!(SZdy zH`6hK3gwc0^^O1i|77xNDFmr^VB9JDPT!?L?WNY23EI8tz~~=X-FVxM{(oFrk>qg~ z{$I2j@6he5M)ARu+bg`kbYS_zmTpgTQ2fvNu_gzIYaM&M(qKRpeSX8`y#ljTa6Zf3 ze*5uR)Lx?4zp@YV4%Rxoah`@eg#RDk-}(~KN0ZF75ZC1Jn0}E8an65n%uT3nw{AN& zG8=P{Z4#Yd&F^2!k|DnT?)#jFFG+mApu?$#XD6&%X__OhbEy4KjgC(}TUsG@z`^i4 z0bL&q3|v3Y3qt#1x~Ni;|G!mS zc9}KeZCGw=#J;s8`I&1@f19I&`lp1UqwM4w+UurEb^ zwiz@3{Vc2Wzj^rYN7x^y+|oaeLw!N%Bkt2fB=@T(pSe>#sGBf)Ukg!g4BbD@yeSS$ z7OTg+=9#wAk=&2wX6(FPVbp{TrRv6h+%#d+_bYRXX*UgxWk+YdYHgvm%4n*ZwqOhH;wV zG@7V=UE)Ji(Pb@IYsRH|b*NMNcm8(HB(dM>Y{r;9Hhwx|hT;ZuL(M$PA-?Js0H+%i zcg=n0GZEj6{l5IGbl@b4Pk61jU_a4_mC4xd+8u%R?~_6quln~otgcc9%`TXmaj3O zz8M?y>%VZt0-c{bYhF$40>9JRF8H@J_@V#4A0BRwUH!7~eYAAs&yjqeyCXcULcu>g zZg=X60f~Q@sGTt1b-WGZ$vp6D(G>lEpb-k0W`_Lz`?bfHJtN8A=VTH;KL~ay164DN(OmX@|DI+D8>L1OHq9i@DPriT~ZD7Pp4orX8y|P~7bQ z4Bg*;iMU)g6@vWuh~G~aRM7qPrs|W`F|%<0XKvGaF#+AbCF42TSN!b27$0QrN>4=b zDb48AH*o)XW?xmo7<`9I<0HhcOY}9hmDhA)v&#EzwmPBq%cod!y`V16Zu0KsYG3qx z)c0*aR|muo3x3KKQj^3FncIxG(jh*xQ$f1Wg%Y13oZmjEd`&Tj`p|1O^M%vS==tx& z>Pa4vXs91Ao4I$$4aFI5FirUZzl33Y$%=w-^n6!MS0(Ul71U2ZH@PL?iQ;n$N_6bt zm-!Cb_xnR0+S2?G;=5=a!KdAoK2ds5E@qxkH@!(H>yo!ChaUhE;{Dg0}%vbHmg z8R~|ni=^&{N29prWZCdmsC#-hZNaBPa=w0H7WX7&4e%=n6?=O-qW#~eB)@eG&foP8 zZh^1dP+UaySLvsN5MMj=-lww-oxjmrO!+ws5Z{k2xnS&y+P91@loTF?_GyPssTQI3 z^m+>Q&*Hi;V>Oop{B|gAlEtj8_^Au42rsbN@c@m#Y^cfzz1q};DVij`bN__mDle#C zuBhz7rgd5mrPJc=6XHKy_M#qPFS{_=)e);QrcwKe#-fm?P#+(;nZWSzx)#u_k0J*;6G?o&Zy(hcTHt>u*xJLK z!i=sD8Fo?6@a5gu%IpZ*v=9_uT{S+nLJ|0pO%|!sH{kqg1pZ?hOVyvL+dv(FnH zH8@V-Ki%~WMXj9FP4?h8q5qTT)RZ2A zzH|69GkPDlS%94E|Q-a+0VS}EW^6-@n>B7)-te&u0q zd8QRApnsX>)|A1F;{<;1A$}pwFyPUiv^(q{QVI06Q&<(-C?{4{O}(7X>k;NRRaHet=M~m##5j#eU@35 z`4VnV(2wxWEaVLb{_~J1=lnDZ|9S7<=a0k(m+gKC{Ok96J=r$l_5^;|(hVzjG=u&0 z%?6Lv6ng@HJa>=k!WAFTKNK^c@=w9-3H~-`q{RhBd4gTetaTOE5*hVD_&* z1TEM7W=9Xu2fBVjzxM{-K0zO$;n)`TRVRC~_GN+PiI;JlppOtxqm@*3wHI^O*MB0c zhuWW7MKhKV3;GH*EnFeTaGaojz{JGxTo>kF_i>dC3uXQY`U#bW;R-Cdz+W!Y5OP`y zw!M!lQosTFF%Hyz%1il?VIc5lf3pjtiNTOmqze%)Z zKA$P`OBkP#SldM>JK(1dRe0H5hT9XyC)MDkVFUUh^w@;Ms4I>W#kqGCT`u<6n=if_u*4uCej)S`U$SWX{)^P_6h5^LuJZY3jRN; zZ6=xbQ1l%L>tEZRH!^82=&LZM_MiNO+Y`PY7B3Ei{jh(iPiF3+jmL4q`rl@o`7OW= z`03Y0Gv24@yAbxj?-#^{Ho^BDT72gEQHuTpVgK6x`cIE1=>JY|^lqz(#M>wAf6qNH ztTTo6J2Y8R`aI}Jh;1V0=FmZZ>#E#y=^@Y?@xQV7@Z?JKE4*S zg$pV0|Dh~Abp&k1iXbf6Df(Ch{%_fd&2M}7VE_6VEcQziw*;&_v z(dS=2$1{cFbbt9R4F@+d`3-@-Fn2;z;Y%DR@W)@>-bpq26Zq{dr9Qp5jN=6U`G<@f z!Y_h815L&4*Wm#;?){g4cX?YxAL|a#2UB>d7(~&he)*R_SI4=zsm}=XB^Ff-rU&u$ zCH?pR_4CkiVLteNE^VO7aH8n@5cu<5?a~%60snK%nzXNH4RHUMaK9eddcs~^2>5>$ z$N0py;W&XG-J~+$%2(ijtuPy^Xr%DJ68O^R{OR=^A`;4u@cwR}i{Dy^;{^V6=49*JA)sHm^ETV{EE4@n`RcWq z@xTvDWmJ@LhQbd^;7@ltTF+vT1N^phn$@dh@b(G(>9d@VCVWhKu#?w4=qvhgoWOtH z$hAMz8u;N`GZfyB)#5mTKYiJ&#x|Eg&^HxQ)oG5xaRUE(p5{>26X0K6YrvHvOW|K7 z@S{(c=Whz4>cK(|`DNV=#pj=ppEKMkTX}T68%y8f>C%^n;{<;5{^nEC%4>lCT=_%P zRwo=M=uf8hKA$>z3HaxQ^=SI6@%|C`Yx7QqPJRde*|j6hbTt%xNdmumNA9*x-uuAM z9Bi%WEQH$=_|rw@<*9pefuGmSZFqhQjuZIPv4RtgVP}CK+I7q@JqX7M{OOr3QyxEo z|C(EAg7!%RjuZIPzgDUKdI$C~M&>`?2jVz^KYe69>&&!95BQgNmp!HM+Y|WF?b6&^ z&%ye=cJ+tum3O#3fggRH|La|gpSv-ww;YG>QuG4|{OBCRx^H%ZzOK@0jm_M-`22GG zUEj9r=8kq-gMQ7!VXoiL@b8nLuW_&bZq33z@DDTsZ0`@_I6$ zqt##V@e$5te+jm;6Duh1pMcvenhGD6 z0e!wcv5XFW{P`1q|6h)r?Ax+o82H6U_~TAI!EpjVxlOxVZp3HM=a6;3oRW{@1b*{4 z5x>ngD?q;}@_oW6<$O=zcdwJr+*Jv9w@dWl%@mx#zdj`6Si74U&c9x?R%}P`_6hv! z6K@XY3IjiVB&*=%!&Nv=;6FD%UgA*%{OSc%N9lG@_|*yg<|j^So>&L^Dt;pdze6ed zDg@l?s^YWi7SMl4KV~mDg0}ymqNSgw3-*_TO7gD#I8GR!SO;|{C#+94nO042%K9YC zpFmUGE%)c3uf3z_#>-#0Jz@TKylBX5tO9)-9rg6J%klL~ct6>bA$v;T`(T^yGFGO1 zAB6dP+GKym?+>i+ZH%J@;duLm`HN+qYEoSR{P_iw`y~AF{f)qX9#s`olTHo#3&wr6 z&Ota%`2T3?z4S;{AM^=?9)@at#QR6!U)N!7x~63b{MiLNa`-6x>;(RGx}4qSGLM0O z`>fX1UF&gs0zdrA!au&^X<&c6_qXvL94GL@AD!`bFG~gf{P8dJG8Fx40zZ7?^Z7|e z3;6%u^M*E#^8Z5Mr?05D=qiE!k7L}J5=DQRz;CZ?EtFGb-h=&Mi%k@6#h*{$XCGQ< zk~yji`W%DXBKs$BoWSos>G9}^pdsjUOu2hoQ~W0aKRjD)81>|T{OWreKfJJ^{D1$| zpWqKUM|BPKGX#5TJ~>hJGYI+=bt~q(F2MWiZg{H}<%io7_~Cik8r7m9J}Qx`<{bZt z@_zsFpYtq+TXO+Fx@3QyxK|yH6Zp^jV%2Ue-wof-6SF(Frtt9*_|G}+X;)BzKD^Q? zJ+~}n+@9dSZ{8o|QhlKZTc^;!R>%RjC-9@|?ox{^y9WNB&cS|ZEfn`rZI%kw1N{Q? zZ85py=<|iQUcD|0{Po;U8ChB+{PlOHQvDx*z6a+-#`I2#z6XJS-g679fC6_978-E( zw%T5_|0f;=L}bDG_j4Z_Fr%!00zZ9F+?V;);2$^_ElkBy`~w2c*(s;jcMi@sQtn1G z9(ex=>sw8MW!@O{sXsa2oB1Pw_2ReV3 zN_Q)6PgvjVnUZ@9z<*MS_A^-(jN^p$eY3{o^)gtW{Q44GGAZkmu)b&blib`?VE!-O zVQir2rxVt;mu+h{u= zKlu83pVZelPS96TPiT0M*xZec<*P^fjo~<9eg7^gTG<% zn?B0^Oz`j13?@HKK7jMT;tXr;CfuHIK3KVH^*fiRp#QPET%?%>#|h_)HrFW?PS_u6 z=O%o7v~iqpKG@yX@p<74?0@poEcYqvn{YmGQ5b$bUJUwY&Z{L_S#f)U|Hr-EW!@0< z^`xzSPg7I$?FjzgYyQ=;lM^ui7t14F+{FJs3I5;ryw_@>;GcvBayVb7=+hAV*8@Ty zuS-CDqcmnkmccM?Pw-z?e4=t&0r3$_>h9GUJvdJAU-N6M9a?Js)8Ap+$gqIp1poWI zz%ARxLePhcyCBR=(a$0H?{6)&jxK}oWp3EVbB8iMg8%RMB&|ys;wMSgSJf4-I2HDmJUD~n zg!9Ykt==PL<1b=})v;C%byzyYfq94Gka=igwf+M$1XY{suvQ2Iyk&o$Up6#Bux`jBB{d3p1SCYpMfPO4XPDv|8Uzrf!s~UB2 zS_Sdh5!wZgM9T9C@u8+&zn%y{e6M-edoNpUe0+rXQVrXt$P*tx-z)oae`y(x6XH{a zL&EtwA3JQ|Cz%ia=gzl5=l4?lPeS}{*ColP$6@{TJ@h-?ehqJ* z5FcCN|JjnN8NQFVRFc^w`i>mRMT%FzzgMz99u!FN?+Nj_^~~j0CX(U&TWC@7azFn4 z6XJXN0c(Qq&Vhc*Q0W)_OZf8%@yRUbij3Ze5Z_od&zq&_YZ3gLi=s#0UZd^Bc80GK zbEN32PyaoCFBF@WGl71x`%!U^CmOHe%HjV%g!q_^QMpbh{6A(&TbM8N#BoA=ZF8{wII9f!kFOZl2MORf zAwJj6KM-fl1o7F68|%j$aGVf7)0o`mWB~r#hiR(~tAcTy5Px%aaAR9;3jcrfa}~E= z;r%DXH@mDsmJ8y46|Brp#9rVyA-;LgyxpyY2lT!8`zwp^<#rYicHG*_E6mMKa^B1BtdRsWnx-nxz z5k2oN6puI3Ji?pPjcG{l7jlt7^DBlLoaWcS`65q^W+wVJ`h12En{S8bLI1IbW%a~) z6u-Sak^W91=r34icONoEpT9F>gYy@iZfqdw*7}wy6u;>oWsHHo2mhOD4Ut$hKceFl z)Al#hU0C(|60eV`C~iA&tZ8x%^lNyR@2|ax;#%IWL1#gK;?37zUvH4;PspC{^3(_Y z6PhOyD_3tr=f^8M=`ep4=!=GC%G#6Ye{4$PnNo5EeT+L-S14tp<4Y7+XgC)J`W11n zjjs5i_`#bQBE68`QWTeTb*>Ga-`5xW&g#PXCg&0V2NufthOj=Ul{o#X-$MP;(VIU7 ztI_e-y)2?)g!;;E?PH%VcA>B={I1Or8+Wmz`CZi?9QbPLAU|$3eeS03xIH01kIC_bp$&v z@IK`4@paPt6h!mC!py5m#&33Emi#7utvgV>&y+nPpQj5e5X&Ca(?#1~_`IC)#K}&~ z{ZCuRlLRz>P9g9?NiFbxEe?45aRU$7zxj9RM;IUMhWtE;4N$2G`RoyS2X|C+4S?TSm5Q06JPct7I^xW-XEcUWA=93 zOzvVkb~3t%$}kdbKPm6}KKNpm6Qgj^cU!S_~I^${J?=ksYyDSaGG2y~%g;1X{ z66KPkN>ZQU{dLSFm#qT}`L#mb$P9hH72P!-Ii?OQr#6vF^C*f(8b^LMgZVR)e8DnX zfR{O0FA{H*KKTCs0Fb#JPK(EMoUQ0rx> z!26?fGc)Ho-C_f1zRw)hc@5RNb09-DqlLZ z0=94w8Gkbl28 z6{5Kt>NX2KHXGlEI?g4WP=8lX)0ZSuQ;+TY7$jC^joLrvjBXP<2mQAcUah`}_Aja= zt)S4V1#@FcYLs^|j@toLjI*T6KrY8PV|#@3F7q+Yb5x+RB$}1X0}FGb=n+pb3k3m?*nO z2CZLkY=!h)6AHw&!%`bKJxznxKDG!6OJs66INpkJx zgt{iF^47dksB>DfCw#xv&!~&;o&-Wx(@OK^hoFR|` zbrlDx^x9RR&f?$xHQKI>+y(s`iyU@|CF!62nVlM{M!-MpboDy_6@`yuB=tw0k0iF20zcvW#jc*8B=xE4 zANtk{FKfUOPAz`MG|=zQdu{hgRo*7d?|sPQLOFDOm7WgM9k()13h1}w@wzq%q2n*y@0R%z_U}H8f*bB6 z`?uv)hx;FZ-##p@B+ZtD-@fwDVBUEl;LqI=n6a8<{I^+V^0FiAf&ai`V@MD>zP^R% zNq=~MyS@nhW+Qoj%m>yxXFz?Ig!((R6(sdt*Yugg*YUMrc3STrHjwB8c*XoWK@I%0 znAK!p8wo#cO7f(RpKU9~Y4|J8+?wS3igYOdum1SbkuW8)`s3=G6OT^=@A&s!^V^Jo zhkWV%5%#Z<4RVdSP#@OZRw5=wQXh6irrawH_Pzb3l4rJ()OS{EV4CZJSNVHZ&ciAa zeVNGLizyz!FJ?CIs<3td^}h;UPi80m=a+CyC!Pd9WvPDz|JRhEOidT~ARwYQ}AWI-C=z|EZM2aaIF#2WHP?4hwEZ{ZDqY zzSpe{9hi!UfCSxF)IQ5=|CZpVP#-)Ye=(PaQa}8+KDxo_D>K8NcC4Lx{zZHQ+J3^S z;jjhZT~)7H{pP+Diu21GnNR_*x}cj3mJK=#|IQCnLATqcW zsB2{_Z-|OFLED#1FUgq(eH+G9hbvDT(D6Nr489P4s}oyZ+uL|`J9<9iknrAT;nImI z1%K1~mV@Hk*WB%13H!!GX`t#=lJjTS%I%Vw7@Uvmtu9zBN6&XK%8pWSQ`Wrj1=)>f1}anhdy6E zSoz#W(6^*|W%ueBiN0m7yOL+%sZMO&4+q+Nz>~i8ehBq*Sa4VSo|H~(q*r3+y8S4w z`b*{Olx!C^{?3M}dL#P$;|Z=T8c(~hOZmU5g;t>b5AJv|ZVURL$E0=EeK1DtInuu< zJWuSxlu{RhH!x@dhB)m+?>Eam8C83z8}TKMD&s+tw6u_oZ4f( z7ifH{Z<{J33&al#tPXXYro;~k@y(sv>EgJPA--q%qQTt=wf6XbKxv4WtyOGd^lg(lb@n*Ol)62;@1U7XkVr7$GHOZ z`OD9?(_Di3EW0+@cVQ&@yn0rVorf9V`5Z4aCS1|^iK*|>I`|X#pEM+Fe_laxr`r!C zw?q8#N{sh;nRpau84{O}&;b4^t~2rbm!ach7C55+J0J9;FEa1DCqkK@zxjn7SzN(; zApTe#cJ0eLO8k+)|COAQFVh>+jVa#ni<~=4vHx5D_kA$Eyw0Z^3*}02XG=lx-Tj7v zS3qC4n@@H!z>I?beg03|(hga`{g{tvX;Jid3GsFDg~^Tt;2&doJ*62!;U6R5*#|!H zM4Q9<5~aQ$-%4r!Z~yu(uMuA@59=$pH1Prnf7oxEP(Fz*aKFF4C1*bge^}3KysH<) zmrIB5t$8+$wm)ygJ*(aV`rlF+^CF|@`>}U6PalE$&h$n8djnG_&gE{T!1!PN=TGU= z7iUo1TqVBBwiDuuwhtUX44}9P?E}T%^-!Ps(kJNNHx!@JE#4MP58p55J*jFcVhaxwSu;S&ceU@|1kZl<72yk|FTMm z<<$&|Cs#IS_(FZOqM1rwSrm%`}Hxge;gq$(OF(L-UD%pfBPR+)Z+Wxyc4rLrnJc0isJ8bmvN`V z|KqLT&POgM(dW-Zao%nSh4^pPjqB?I(D}cAy*{b;IOs1YXq3+0MRC)hYMs=bU07M4 zp}E&AirabR2Wvw7`PzivIDagP@Ao`=Kyn?dkMFJ9_u8QSGje=ueh~OYt5>or{v_cS zwWw6ywhwey^Udsh7(j>h-}!MxC+7H8N??|RpLKKp zk;1y=;6H3ydzvi-^}o#Yf)4Nf-hq{<_RBI|NAaTY11=n!JFta1QRY)5{-X;O@4bhh zYjD0hHC9Uk^$&$w_poq7e3W;q`ZEub_-NVwz$Rhf^`DR%G&l@A|4ZX1_~!w|g14DK zx6Iw~{Pieh)W5v3O1k?dV<#q9b3)D58STGzf|69tR0lSc?-08w9mTh9mMP}b?!bP9 z_yju6Q~c|{{5;IEV{Od9OTE*JRwo=opKl|dz#3ZBfn~bhdwP92#s05<&fTTZ?(n1o zliuRIYhVqE@AjXcJ^|0~e)DEo=`RZY_xWt$Y}{tR`?b9x=h0j(IzPR0J1)dP{J-S= zp{6*J__RqMBmPwQ_S#vNGoRER(*4l zB>qGj%{4g>{PNPmmcLC&_~m~{xliW{w_uMu9{C4Kq38RLmFc`?R`uA^=&K_?E}`e| zcS^1`QBN8%&6a|ACX)DyqQmUxAc#*UmwXGpOcI~Wu`$l(t7ybtmtxmzNc35YqHcX` zeAtW~%-nF=)d}q%mC>1n*^kYbe09!=UeG~bdOw8t%_9v}elF0xG_P;8djUF_OE@9E zefYsFGu6g=Y-RknapOnm_|ALi3M4Z%VP78Zw4>XG+B04o{K0Xo9?Rzn^m|FdFC=a+ zmDp-rk8M;o&T&pc+Ygu){gn**mcAZ6v$Q1omQU4-XhS<1G2@1{-`5>PpMOJy*=UbQ z3-<~?&V3?5T5%-$&cX`UiXVVJ%%(Oj z&H$45RV!Vyz#`}$>W$KTFd@-D{KF?7JqEh>^8NeoTa(P6-%++r(mnOq&tmK0?FZ2L zS-+|C(lErw#QRT6*pkGD@;^t#?SXUkpikzOdnEjSubPsTzXN~OOPYzwzdBZ6e{{k+Vv9#KGEz zosQYBQFa&IKk{|jcICnS(8`;f`JyEELw=?QwBLZPuFB=7(c|X=WZ-p{g7n;n08|+j&g3rp8EHw>YAeM z4|*TvJe2_a{l207ha^$F@&2yv?Vt~!zy4)Z5s5y4C7nzDJJ4SaJ6f3j9&}p%{eJ0^ zc~teh>M`k!gWZxO@k5K6_&b+@S1x=NKYtX7euBwURvy>RdMt{;W;D$VU0;c-yc+IK zH)3NBvTK8M(C;fPx++8Q2^e=CYWay@YK7;LS zYHJw$5B|IVNOQYtZaQC&T^*D+uJK3vw_6iL?xPQ6JVQGQl=U6&>7C?W_{q3@- zZj$>WLs5Z*IQM!i`aoZ9OcZJ#YNLti?X1VXtLS#+lj!#;{FJ)i0{4rY6CFG*B=?I) zKBW)xYqwx$e7Peu`Ox{<_Wat;rahqFcP`cND>sT;?=k3kB?I@HwVL!}BTtWQJIlh z;591T+Ht0rgg?{bK&$qNSonWrv32^_Xm9LOPPjdfPWa-AY$k&7&++Hwj zB8#rCUpj^_R|eN(TVGUP+)twKYOs9ZrF#~<6l@3jXq9poK z&sqAqG?SY#!?%m{a=vK)b?ws1tzdsT7NM`?L$W_r8}Uumg8%Y8v0?cd4Rrr-{(cD3c87V!77@8iB2N5bFhsZn{_8umYpYzc2~lKoH8|Kz1+&sHql z-RsCo1N8ZVFIB9az%EYU!R6!7&eHoQ_zaa({O8`E89%e~N)u^*!&v4{qRD{dat~En3pp_kjMc?TAtm{bscuPQ`t|Yw5$%Rv897mrKtl z-2X}?4(LvRZcCUkQ|<>j6dzVzWHW;Mjg|*rhE9{*Z?Id)#;b?dW1{7Tc?Bf;qf?G@ z$2mosFqN%_Pj`{<7t6hF5;_6*N1O{ZM>de$A6+r4-9c^Cf;m;v9WdH}u75>`Gn@Ee z|4c3sAFd(UKZ{0l@3EBBW3PU)rq?^5`^)apt*qJOppq8MC}i_(K5!xv|x1dW8Y#H@cAS7$1@vGg>04r{?0@96x2xckK79V%HD(j zxe%An{@x7TA0FPidmsVwGY)NFt*0l+&+uKaJ2`03gq?DEtn2{yME~}`VEZb8r{2I{ zy!Yq_Z#c&<;e`Er{zGnX3gj&*&aoEJLLSq<_Faw+!CDEh{}(G2J%l{Gf9+FFzHOuf z{l}wH{uc~L_(?x)iP`20_lK38LcJSE?hkW@t@X;?TQT~T(b??4GrZJ3VSO?j)#&g9 z-r(%eY<^o3{ke_q8=4gLTCvOi?V{)X2N zevltjlT@3TNRl6v_5Jw0W!9h{_FaLua~(SWs^@>oyaNB_vf#vFM-u;K)n0=sDzKM+ zt{FgPk7)#znL>U{LVaFhHc5VrE02TWi$2iDzRIwRs}+quBHNCCTE#2NWONK|h(r3jE85o~<%7N85iBcIS}Np>`~*AyQts1&x20Pj0s9 z0{!!X>0q%xz@xs@Kf?c$_mIW?D2PvmaB@c{ki@6dPK31!!Ts!~vBsU2B=@r)7>4@8 z;r(2zrmBFv(_1K;^z6guU=>9-;Q;c;d#HHjp4}6v(@y|DLoUku7t;cRzNk2P5 z!q2`VQDm9fz9x)~&um7N3;jO6JKWCta-s#>rj)#CXeHWzO>f_iX^{Wqal(gjD@p!S z@rp9z0p&LA_psFU*+}&JZ&t11;DrCZkv#FiQWE{-gU??j3&a2VA>nn0^GW#AmvI{R zc|+d8qqamYYsf?RcmJ5x&3}3a_|40%?NHc4!f!sR@8r)0`%lx=Gkz5$`_H;Hg>lw@ znz3BFi+2Sz(ebAo{I213pamPP@HFOPM{#c8L>vCrh-GHco4nIS=hv&zJ0Jjb#r(n^ z6tj`||IAy`?AL&QEMda)tck=w{{BM!NdV{{Jc-zobcH0pNJ@X`)MzT4&uSKw-g=|! zC!Z#U>#0@~X7N#I%p3BIm*$V~|2#uK#eHyB3#Q`Wc~o>GI=+Yg$DZxwY{B~PDzfA& zpm?po_p>1ow{3g%{SgbqasO>!M9%s6I*)pcuU+Bk9+LCj(XiS)cgS1a>man-E)-oq z`g@$xslhLExOV118;O2>@hi>pMp$3JnX{DWNY)oqMR-XF=yTuRV!y+fM4x-vW1;#y zSbvXXYd4FMtUnvYt50mf|1&Dwr{YQC|E=G7lKO~c6X;_|dEZ=*j=$@9f1vP>daRyq zv8W2}ahB$X;6D`FB;e z#@@3lXr7bkXZ+%OI2;H5$JYLJXJbhGkBg5N8V2F~I)45O(+J7=b)18DOFEqIRbL-| z9Y%7#UtF%xbCa$KQ#iJt{wzs;>$vr|MPJz8RJVEiCX?)M`481vcDS@)7VGrZD3au- zW<|4J8HW7KH$rd4ZAtPoS%(wodLjQgW95M_3$Tv<-5;i@mkV*KrRNj;pRey8 zcLl4pVYPI!d?wJ(e{tHu_08whLEnB&ugIP=X#c-qtGs`#YQf5MN1wbR(Pvdk%Qmfo z^DzfcqV6=w`FP$%cl}q;Hz_LEIX*~oK7Y9*GIurbTDLZe@adEI|E%Q)bbd(HW8$ly zw!I?J@3so<3V#6laSRz-l|_&s==sQN*T68I*_<;ibI}iV>pKw)4(}I0&X?_X*%NFJAQEKoH*4T$} z-vFKNC7j?tT&sHGnG1fksIm1*BNG1c59c1}tfd0~;F-7ixiGYSuZ?>)c?|+TcoLTV ztRD3bWJ?`1J*h#z=m@?2^B~mzg6x$O@A@JC$}@N2LlcU7h6vpn%;R z_GF|T<6g$fE?0u~FL^hOF*WGEDr&W8-h6@HUmjfli>*Ss3oE++zI=-ydVl&x^zf%% zJ-9y)+sHoq8NGjfCBFYs{rgU==(NHMmI~C~<&~1>{FhGbyr2W^qihtPY-w9x2l|@f zTjgumN%S@Ky~=adpuVbc;&6hv8v6XBR*U5i;oO?S(eI`O=h&tBCFEyCO2_@Q zzU4HLr6|7rBhA2MHR#{bG|Scg!Ry}$`7O7GKd*TR{Ly@jRL$BBl>Cmr`6;m`g5QsC z?Z)&aF3`5K;rSDU{Gm5x=hF5&bz@l;HTPFOqS*h@}F!EyR|ZbKHe?fIo&7*ynO;r zpZ}n1{Vu2v_4igk^Aml(b*?^Jw>ZpCh)U&eDRll8-Xv@pAAIU1$BPj0sk}dBb@NWm~%!&W85`Dhb-IhCEkU#Y% zKSqb#-@u&ZW(E0GiiHu3pGDF6IcoT=E*SDNQe@{2 zW?w^CAfy zU;AVdr~Tz_tY+$V(Q9*j{SfMJKPsIbwSxS+EB0O7pF&am%>6&Zdk;hYp>OZTHBIRE zCv@e)quE1HKb>0=T0(;V`C}sN_6G7#dp2h@)S%xF?~Vu9;rCsbgoTgeWCe=Pz1Ndd zhWc4wCe^U5Liqd;_NNYQud;?=$j{j`>A9{HwO3}M=eViZjr}Nj_T&f$`u%Nx6iKgq zANFte+U~7F==d+ht*uZ2{ZiecA~$);{!W;`w)d*r%(J?&S|)R!8F|z`VCv4Xt)1PN z`$PoWwn2RVBiL7ea(>k=(~W&twx~qIkM?hIqQ|k?2>6+1L^y?p(D`>hxktC|PZt(9 zqJDrq93B4`-f7FeuU**r;s1fYRD8cc2Z~4c4zM`D|C6CGZ}lL_ z|5K^qqj7dY&^MLwSm(C`?Z5RLk9Ixe-)4PCwPBS;=Z7`omXRCiH>lQ~*J{u~arYli z#pFQ>sp^1J!7Bf#;6)tsQ z`Qui)sy68N=SUa$?(SOHA8QAN_3cpm@-Gre;f7t<*ZIIFSKpxaS3l3BHADWIG}ZV$ z#(Wg_&zosG4*Rob(D<%)lKolhNXIF682_8KGP5tQpySJz6lt=Wf&6^GbNfG~p#CX+ z#l?-c;a=MKP(hv*+*2>@e+2)zl;Qb4@mZ*^t=y|;av8P%NUc)Q4EGXOT8_9eg3jW< z_Uo;pKO~ew{qu$@{*bk(f0^pdMt#t<9h3c1bAv|*UhA6J%C^n9guKKCaE@o^su^~Fmh@o{^GbR~MItKIizZ+Sh`*)H{;5I^T& zaX-3nrXI_BD_3m_Ix|Z+;ruRj+Z>1b8yeL zWKTHX?+H}B;s*C}Ywk9R^T0jbzxbDkN0k=ijaY@qI<`y_{iwM+r&HxJ>ah~`&7#|& zj{V>M&0D-xP1T0;-*$gf+G{9YmZ>`6s@sH_CN)N+@u2nv^{xTYp^%eY{^Mp2>3#LJ( z@gbZO{vBUrnP9yZ=vTVOzKWA2(XVuL-WSLZ=h6@bt>R}S_dh(zXYG!CXvTy$<~+*) z9mjvy55uHRg?_ky_nqkNhB~f)`_~=%`~#I{3$|PA+*xCi z`=7m!6in~1HeqYlwdpQXLfhBumY(T{`ru0;M)M;i`2##TIz8**{U%~Jd8m|`gvulkxvd*^^GvKniRIP`upVQoDx%G`(F}W7USK+QG-aPZe@EFvU zH-7%8-DQoQzxihs=c(Y{RB+U3=FT~E|8%L~@1||;z|NarQcL-W?!Q5P1Bu%79hmbw z-ZEYf)IOl2 transitions in each direction +* Testing methods to overcome the disadvantages of a Monte Carlo ray tracer +* Comparing the divergence of the radiative heatflux in an infinite cylinder filled with a gas emitting blackbody radiation diff --git a/regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_N/Ni_NIST.dat b/regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_N/Ni_NIST.dat new file mode 100755 index 000000000..1551da276 --- /dev/null +++ b/regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_N/Ni_NIST.dat @@ -0,0 +1,1466 @@ +366 +4 0 1 2 0.0 +6 19224 2 2 0.0 +4 19233 3 2 0.0 +2 28839 4 2 0.0 +4 28839 5 2 0.0 +2 83284 6 3 0.0 +4 83318 7 3 0.0 +6 83365 8 3 0.0 +2 86137 9 3 0.0 +4 86221 10 3 0.0 +6 88107 11 2 0.0 +4 88151 12 2 0.0 +2 88171 13 2 0.0 +2 93582 14 3 0.0 +2 94771 15 3 0.0 +4 94793 16 3 0.0 +6 94831 17 3 0.0 +8 94882 18 3 0.0 +2 95475 19 3 0.0 +4 95494 20 3 0.0 +6 95532 21 3 0.0 +4 96751 22 3 0.0 +4 96788 23 3 0.0 +6 96864 24 3 0.0 +2 97770 25 3 0.0 +4 97806 26 3 0.0 +6 99663 27 3 0.0 +4 99664 28 3 0.0 +2 103620 29 4 0.0 +4 103670 30 4 0.0 +6 103740 31 4 0.0 +2 104140 32 4 0.0 +4 104220 33 4 0.0 +4 104620 34 3 0.0 +2 104650 35 3 0.0 +4 104660 36 3 0.0 +6 104680 37 3 0.0 +8 104720 38 3 0.0 +10 104770 39 3 0.0 +6 104810 40 3 0.0 +6 104830 41 3 0.0 +4 104860 42 3 0.0 +8 104880 43 3 0.0 +2 104890 44 3 0.0 +2 104980 45 3 0.0 +4 105000 46 3 0.0 +6 105010 47 3 0.0 +8 105020 48 3 0.0 +4 105120 49 3 0.0 +6 105140 50 3 0.0 +2 106480 51 4 0.0 +2 106760 52 4 0.0 +4 106780 53 4 0.0 +6 106810 54 4 0.0 +8 106870 55 4 0.0 +2 106980 56 4 0.0 +4 107000 57 4 0.0 +6 107040 58 4 0.0 +4 107180 59 4 0.0 +6 107250 60 4 0.0 +4 107450 61 4 0.0 +2 107590 62 4 0.0 +4 107630 63 4 0.0 +2 109810 64 5 0.0 +4 109860 65 5 0.0 +6 109930 66 5 0.0 +2 110040 67 5 0.0 +4 110100 68 5 0.0 +4 110190 69 4 0.0 +6 110210 70 4 0.0 +4 110220 71 4 0.0 +2 110250 72 4 0.0 +8 110250 73 4 0.0 +6 110290 74 4 0.0 +6 110300 75 4 0.0 +10 110300 76 4 0.0 +4 110320 77 4 0.0 +6 110350 78 4 0.0 +8 110350 79 4 0.0 +2 110350 80 4 0.0 +8 110360 81 4 0.0 +6 110390 82 4 0.0 +8 110390 83 4 0.0 +2 110390 84 4 0.0 +4 110400 85 4 0.0 +6 110400 86 4 0.0 +10 110400 87 4 0.0 +8 110400 88 4 0.0 +8 110400 89 4 0.0 +4 110400 90 4 0.0 +6 110400 91 4 0.0 +4 110450 92 4 0.0 +2 110460 93 4 0.0 +4 110460 94 4 0.0 +6 110470 95 4 0.0 +12 110470 96 4 0.0 +10 110470 97 4 0.0 +4 110490 98 4 0.0 +6 110490 99 4 0.0 +8 110500 100 4 0.0 +6 110500 101 4 0.0 +10 110500 102 4 0.0 +8 110500 103 4 0.0 +4 110520 104 3 0.0 +6 110540 105 3 0.0 +6 110710 106 3 0.0 +8 110720 107 3 0.0 +2 111060 108 5 0.0 +2 111140 109 5 0.0 +4 111170 110 5 0.0 +2 111200 111 5 0.0 +6 111200 112 5 0.0 +4 111210 113 5 0.0 +8 111260 114 5 0.0 +2 111270 115 5 0.0 +4 111290 116 5 0.0 +6 111330 117 5 0.0 +4 111500 118 5 0.0 +4 111850 119 5 0.0 +6 111910 120 5 0.0 +2 112290 121 3 0.0 +4 112320 122 3 0.0 +2 112570 123 6 0.0 +4 112610 124 6 0.0 +6 112680 125 6 0.0 +2 112690 126 6 0.0 +4 112740 127 6 0.0 +4 112760 128 5 0.0 +6 112760 129 5 0.0 +8 112800 130 5 0.0 +4 112800 131 5 0.0 +2 112810 132 5 0.0 +6 112810 133 5 0.0 +6 112820 134 5 0.0 +8 112830 135 5 0.0 +6 112830 136 5 0.0 +4 112840 137 5 0.0 +10 112860 138 5 0.0 +8 112870 139 5 0.0 +2 112870 140 5 0.0 +10 112880 141 5 0.0 +8 112880 142 5 0.0 +4 112880 143 5 0.0 +6 112880 144 5 0.0 +8 112890 145 5 0.0 +2 112900 146 5 0.0 +4 112910 147 5 0.0 +6 112910 148 5 0.0 +8 112910 149 5 0.0 +4 112930 150 5 0.0 +6 112950 151 5 0.0 +2 112950 152 5 0.0 +4 112950 153 5 0.0 +12 112950 154 5 0.0 +10 112950 155 5 0.0 +6 112960 156 5 0.0 +4 112960 157 5 0.0 +8 112970 158 5 0.0 +10 112970 159 5 0.0 +8 112970 160 5 0.0 +6 113310 161 6 0.0 +4 113350 162 6 0.0 +8 113370 163 6 0.0 +6 113400 164 6 0.0 +2 114030 165 7 0.0 +4 114070 166 7 0.0 +2 114110 167 7 0.0 +4 114120 168 6 0.0 +6 114130 169 6 0.0 +6 114150 170 7 0.0 +4 114170 171 6 0.0 +6 114170 172 6 0.0 +8 114170 173 6 0.0 +8 114180 174 6 0.0 +6 114180 175 6 0.0 +2 114180 176 6 0.0 +6 114190 177 6 0.0 +4 114200 178 6 0.0 +4 114210 179 7 0.0 +8 114220 180 6 0.0 +6 114220 181 6 0.0 +10 114220 182 6 0.0 +8 114220 183 6 0.0 +6 114220 184 6 0.0 +4 114220 185 6 0.0 +10 114250 186 6 0.0 +2 114250 187 6 0.0 +8 114260 188 6 0.0 +2 114270 189 6 0.0 +4 114270 190 6 0.0 +6 114270 191 6 0.0 +8 114270 192 6 0.0 +4 114280 193 6 0.0 +6 114290 194 6 0.0 +2 114300 195 6 0.0 +4 114300 196 6 0.0 +10 114300 197 6 0.0 +12 114300 198 6 0.0 +4 114300 199 6 0.0 +6 114300 200 6 0.0 +6 114310 201 6 0.0 +8 114310 202 6 0.0 +10 114310 203 6 0.0 +8 114310 204 6 0.0 +8 114550 205 7 0.0 +2 114890 206 8 0.0 +4 114940 207 8 0.0 +4 114950 208 7 0.0 +6 114960 209 7 0.0 +2 114960 210 8 0.0 +4 114990 211 7 0.0 +6 115000 212 7 0.0 +8 115000 213 7 0.0 +2 115010 214 7 0.0 +6 115010 215 7 0.0 +4 115020 216 7 0.0 +6 115020 217 8 0.0 +4 115030 218 8 0.0 +10 115080 219 7 0.0 +8 115090 220 7 0.0 +2 115090 221 7 0.0 +8 115090 222 7 0.0 +4 115090 223 7 0.0 +6 115090 224 7 0.0 +4 115100 225 7 0.0 +6 115110 226 7 0.0 +2 115450 227 9 0.0 +4 115480 228 9 0.0 +2 115480 229 9 0.0 +4 115500 230 9 0.0 +6 115500 231 8 0.0 +2 115530 232 8 0.0 +4 115540 233 8 0.0 +8 115540 234 8 0.0 +6 115540 235 8 0.0 +6 115580 236 9 0.0 +4 115600 237 8 0.0 +10 115610 238 8 0.0 +2 115620 239 8 0.0 +4 115620 240 8 0.0 +6 115620 241 8 0.0 +8 115620 242 8 0.0 +2 115620 243 8 0.0 +4 115630 244 8 0.0 +6 115630 245 8 0.0 +8 115630 246 8 0.0 +6 115630 247 8 0.0 +2 115830 248 10 0.0 +2 115840 249 10 0.0 +4 115840 250 10 0.0 +4 115880 251 10 0.0 +8 115890 252 9 0.0 +2 115890 253 9 0.0 +6 115890 254 9 0.0 +4 115890 255 9 0.0 +4 115890 256 9 0.0 +2 115890 257 9 0.0 +8 115900 258 9 0.0 +6 115900 259 9 0.0 +6 115960 260 10 0.0 +4 115970 261 9 0.0 +4 115990 262 9 0.0 +6 115990 263 9 0.0 +2 115990 264 9 0.0 +6 115990 265 9 0.0 +2 116110 266 11 0.0 +4 116110 267 11 0.0 +6 116120 268 11 0.0 +4 116120 269 11 0.0 +2 116120 270 11 0.0 +2 116160 271 10 0.0 +4 116160 272 10 0.0 +6 116160 273 10 0.0 +8 116160 274 10 0.0 +4 116160 275 10 0.0 +2 116160 276 10 0.0 +6 116160 277 10 0.0 +8 116160 278 10 0.0 +4 116240 279 10 0.0 +6 116240 280 10 0.0 +2 116260 281 10 0.0 +6 116260 282 10 0.0 +4 116260 283 10 0.0 +2 116280 284 3 0.0 +2 116300 285 12 0.0 +4 116300 286 12 0.0 +4 116310 287 12 0.0 +2 116310 288 12 0.0 +6 116310 289 12 0.0 +4 116350 290 11 0.0 +2 116350 291 11 0.0 +8 116360 292 11 0.0 +6 116360 293 11 0.0 +8 116370 294 11 0.0 +4 116370 295 11 0.0 +6 116370 296 11 0.0 +2 116370 297 11 0.0 +6 116440 298 11 0.0 +4 116440 299 11 0.0 +2 116440 300 11 0.0 +6 116440 301 11 0.0 +4 116440 302 11 0.0 +4 116470 303 13 0.0 +2 116470 304 13 0.0 +2 116500 305 12 0.0 +4 116500 306 12 0.0 +4 116580 307 12 0.0 +6 116580 308 12 0.0 +2 116580 309 12 0.0 +6 116620 310 12 0.0 +4 116620 311 12 0.0 +4 119210 312 4 0.0 +6 119210 313 4 0.0 +8 119810 314 3 0.0 +10 120150 315 3 0.0 +8 120150 316 3 0.0 +6 120150 317 3 0.0 +4 120160 318 3 0.0 +4 120310 319 3 0.0 +2 120310 320 3 0.0 +2 120570 321 3 0.0 +6 121200 322 2 0.0 +6 122250 323 4 0.0 +8 122250 324 4 0.0 +12 125690 325 4 0.0 +10 125690 326 4 0.0 +6 131000 327 3 0.0 +4 142080 328 3 0.0 +6 142080 329 3 0.0 +8 142080 330 3 0.0 +2 144360 331 3 0.0 +4 144360 332 3 0.0 +6 144360 333 3 0.0 +6 154440 334 4 0.0 +2 154440 335 4 0.0 +4 154440 336 4 0.0 +2 158320 337 5 0.0 +4 158320 338 5 0.0 +6 158320 339 5 0.0 +4 160240 340 6 0.0 +6 160240 341 6 0.0 +2 160240 342 6 0.0 +2 161330 343 7 0.0 +6 161330 344 7 0.0 +4 161330 345 7 0.0 +6 162000 346 8 0.0 +4 162000 347 8 0.0 +2 162000 348 8 0.0 +6 162440 349 9 0.0 +4 162440 350 9 0.0 +2 162440 351 9 0.0 +6 162770 352 10 0.0 +4 162770 353 10 0.0 +2 162770 354 10 0.0 +2 163000 355 11 0.0 +6 163000 356 11 0.0 +4 163000 357 11 0.0 +4 163160 358 12 0.0 +6 163160 359 12 0.0 +2 163160 360 12 0.0 +2 163300 361 13 0.0 +4 163300 362 13 0.0 +6 163300 363 13 0.0 +2 163400 364 14 0.0 +4 163400 365 14 0.0 +6 163400 366 14 0.0 + +1097 +865.23 1 236 4 6 3740000 0 0 +865.84 1 230 4 4 3740000 0 0 +866.18 1 227 4 2 3730000 0 0 +869.4 1 217 4 6 5560000 0 0 +870.03 1 207 4 4 5550000 0 0 +870.37 1 206 4 2 5540000 0 0 +875.28 1 187 4 2 34000000 0 0 +875.66 1 178 4 4 33900000 0 0 +875.72 1 177 4 6 33900000 0 0 +876.07 1 170 4 6 8810000 0 0 +876.65 1 166 4 4 8790000 0 0 +876.99 1 165 4 2 8780000 0 0 +885.97 1 140 4 2 55800000 0 0 +886.23 1 137 4 4 55800000 0 0 +886.33 1 134 4 6 55800000 0 0 +887.46 1 125 4 6 15100000 0 0 +888.02 1 124 4 4 15100000 0 0 +888.37 1 123 4 2 15100000 0 0 +906.21 1 80 4 2 99900000 0 0 +906.43 1 77 4 4 99900000 0 0 +906.62 1 75 4 6 99800000 0 0 +909.7 1 66 4 6 29300000 0 0 +910.28 1 65 4 4 29200000 0 0 +910.64 1 64 4 2 29200000 0 0 +952.3 1 47 4 6 9190000 0 0 +952.41 1 46 4 4 12500000 0 0 +952.52 1 45 4 2 8820000 0 0 +953.41 1 44 4 2 193000000 0 0 +953.65 1 42 4 4 183000000 0 0 +953.97 1 41 4 6 170000000 0 0 +954.1 1 40 4 6 33000000 0 0 +963.99 1 31 4 6 70700000 0 0 +964.63 1 30 4 4 67600000 0 0 +965.04 1 29 4 2 57600000 0 0 +980.62 2 322 6 6 333000000 0 0 +980.71 3 322 4 6 22900000 0 0 +989.26 2 319 6 4 99500000 0 0 +989.34 3 320 4 2 112000000 0 0 +989.35 3 319 4 4 10900000 0 0 +990.77 2 318 6 4 24900000 0 0 +990.83 2 317 6 6 235000000 0 0 +990.86 3 318 4 4 226000000 0 0 +990.91 3 317 4 6 16500000 0 0 +1000.1 2 313 6 6 37200000 0 0 +1000.1 2 312 6 4 3920000 0 0 +1000.2 3 312 4 4 36200000 0 0 +1000.2 3 313 4 6 2720000 0 0 +1067.6 2 145 6 8 35300000 0 0 +1068.5 2 133 6 6 2340000 0 0 +1068.6 3 133 4 6 32800000 0 0 +1082.7 5 322 4 6 126000000 0 0 +1090.2 4 321 2 2 65500000 0 0 +1090.2 5 321 4 2 131000000 0 0 +1093.2 4 320 2 2 78800000 0 0 +1093.2 5 320 4 2 38500000 0 0 +1093.2 4 319 2 4 19900000 0 0 +1093.3 5 319 4 4 99600000 0 0 +1095.1 4 318 2 4 1150000 0 0 +1095.2 5 317 4 6 1400000 0 0 +1097.2 2 81 6 8 63500000 0 0 +1098.2 2 74 6 6 4230000 0 0 +1098.3 3 74 4 6 59100000 0 0 +1100.4 2 68 6 4 36000000 0 0 +1100.5 3 68 4 4 4000000 0 0 +1101.3 3 67 4 2 39900000 0 0 +1106.5 4 312 2 4 3040000 0 0 +1106.6 5 313 4 6 3520000 0 0 +1106.6 5 312 4 4 739000 0 0 +1134.2 1 13 4 2 158000000 0 0 +1134.4 1 12 4 4 154000000 0 0 +1135 1 11 4 6 150000000 0 0 +1163.9 2 50 6 6 75200000 0 0 +1164 3 50 4 6 1270000 0 0 +1164.2 2 49 6 4 5170000 0 0 +1164.3 3 49 4 4 69400000 0 0 +1167.4 2 43 6 8 129000000 0 0 +1168.3 3 41 4 6 23600000 0 0 +1168.4 2 40 6 6 4240000 0 0 +1168.5 3 40 4 6 124000000 0 0 +1170.7 3 35 4 2 53100000 0 0 +1171.1 2 34 6 4 56000000 0 0 +1171.2 3 34 4 4 2840000 0 0 +1176.5 2 33 6 4 92200000 0 0 +1176.6 3 33 4 4 10200000 0 0 +1177.7 3 32 4 2 102000000 0 0 +1189 5 151 4 6 24800000 0 0 +1189.2 4 150 2 4 20700000 0 0 +1189.2 5 150 4 4 4130000 0 0 +1190.9 4 132 2 2 14600000 0 0 +1190.9 5 132 4 2 7300000 0 0 +1191 4 131 2 4 3650000 0 0 +1191 5 131 4 4 18200000 0 0 +1199.5 1 8 4 6 401000000 0 0 +1200.2 1 7 4 4 399000000 0 0 +1200.7 1 6 4 2 398000000 0 0 +1225 5 95 4 6 44100000 0 0 +1225.4 4 92 2 4 36700000 0 0 +1225.4 5 92 4 4 7340000 0 0 +1228.4 4 72 2 2 27000000 0 0 +1228.4 5 72 4 2 13500000 0 0 +1228.8 4 71 2 4 6760000 0 0 +1228.8 5 71 4 4 33800000 0 0 +1243.2 2 28 6 4 33400000 0 0 +1243.2 2 27 6 6 321000000 0 0 +1243.3 3 28 4 4 309000000 0 0 +1243.3 3 27 4 6 23500000 0 0 +1310.5 5 50 4 6 84200000 0 0 +1310.9 4 49 2 4 66800000 0 0 +1311 5 49 4 4 18900000 0 0 +1316 5 41 4 6 40400 0 0 +1316.3 5 40 4 6 1420000 0 0 +1319 4 35 2 2 56200000 0 0 +1319 5 35 4 2 27600000 0 0 +1319.7 4 34 2 4 20200000 0 0 +1319.7 5 34 4 4 63300000 0 0 +1326.6 4 33 2 4 1790000 0 0 +1326.6 5 33 4 4 8950000 0 0 +1327.9 4 32 2 2 7140000 0 0 +1327.9 5 32 4 2 3570000 0 0 +1411.9 4 28 2 4 42500000 0 0 +1411.9 5 28 4 4 9590000 0 0 +1411.9 5 27 4 6 51000000 0 0 +1492.6 2 10 6 4 313000000 0 0 +1492.8 3 10 4 4 35100000 0 0 +1494.7 3 9 4 2 372000000 0 0 +1742.7 4 10 2 4 23400000 0 0 +1742.7 5 10 4 4 116000000 0 0 +1745.2 4 9 2 2 92200000 0 0 +1745.3 5 9 4 2 44500000 0 0 +3467.5 1 5 4 4 0.00621 0 0 +3467.5 1 5 4 4 1.66E-07 0 0 +3467.5 1 4 4 2 0.00252 0 0 +3467.5 1 4 4 2 1.14E-08 0 0 +3819.4 9 122 2 4 895000 0 0 +3823.1 9 121 2 2 3700000 0 0 +3831.5 10 122 4 4 4670000 0 0 +3835.3 10 121 4 2 1890000 0 0 +3888.7 9 119 2 4 2090000 0 0 +3893.3 10 120 4 6 2500000 0 0 +3901.3 10 119 4 4 414000 0 0 +4012.3 9 108 2 2 575000 0 0 +4025.7 10 108 4 2 1140000 0 0 +4096.2 23 322 4 6 80500 0 0 +4101.1 9 104 2 4 3480000 0 0 +4109.1 24 322 6 6 1230000 0 0 +4111.1 10 105 4 6 3900000 0 0 +4115.1 10 104 4 4 662000 0 0 +4138.8 6 61 2 4 280000 0 0 +4144.6 7 61 4 4 609000 0 0 +4152.7 8 61 6 4 1010000 0 0 +4251.1 23 320 4 2 2590000 0 0 +4251.4 23 319 4 4 224000 0 0 +4265.2 24 319 6 4 2260000 0 0 +4274.5 26 322 4 6 828000 0 0 +4279.3 23 318 4 4 5010000 0 0 +4280.4 23 317 4 6 361000 0 0 +4293.4 24 318 6 4 557000 0 0 +4294.4 24 317 6 6 5210000 0 0 +4357.5 24 314 6 8 5100000 0 0 +4386.8 25 321 2 2 884000 0 0 +4393.6 26 321 4 2 1760000 0 0 +4436.4 25 320 2 2 2990000 0 0 +4436.7 25 319 2 4 751000 0 0 +4443.4 26 320 4 2 1410000 0 0 +4443.7 26 319 4 4 3810000 0 0 +4467.1 25 318 2 4 20400 0 0 +4475.4 26 317 4 6 27600 0 0 +4653.1 9 63 2 4 240000 0 0 +4661.8 9 62 2 2 672000 0 0 +4664.2 25 312 2 4 1510000 0 0 +4671.2 10 63 4 4 749000 0 0 +4672 26 313 4 6 1800000 0 0 +4672 26 312 4 4 302000 0 0 +4679.9 10 62 4 2 269000 0 0 +4916.3 9 51 2 2 808000 0 0 +4936.5 10 51 4 2 1760000 0 0 +5199.3 1 3 4 4 1.9E-05 0 0 +5199.3 1 3 4 4 3.6E-06 0 0 +5201.3 14 132 2 2 1870000 0 0 +5201.7 1 2 4 6 2.45E-07 0 0 +5201.7 1 2 4 6 5.52E-06 0 0 +5203.1 14 131 2 4 1870000 0 0 +5282.7 11 58 6 6 245000 0 0 +5311.9 22 236 4 6 94000 0 0 +5330.1 11 55 6 8 205000 0 0 +5334.9 22 230 4 4 92800 0 0 +5345.5 11 54 6 6 61000 0 0 +5348 22 227 4 2 92100 0 0 +5355.9 11 53 6 4 10100 0 0 +5358.1 12 54 4 6 141000 0 0 +5368.5 12 53 4 4 107000 0 0 +5374.1 13 53 2 4 83400 0 0 +5374.2 12 52 4 2 33300 0 0 +5379.8 13 52 2 2 166000 0 0 +5473.3 22 217 4 6 139000 0 0 +5498.1 22 207 4 4 137000 0 0 +5511.7 22 206 4 2 136000 0 0 +5513.2 15 147 2 4 129000 0 0 +5514.6 15 146 2 2 257000 0 0 +5519.6 16 148 4 6 120000 0 0 +5520.1 16 147 4 4 205000 0 0 +5521.5 16 146 4 2 256000 0 0 +5530.9 17 149 6 8 72600 0 0 +5531.1 17 148 6 6 292000 0 0 +5531.5 17 147 6 4 178000 0 0 +5546.5 18 149 8 8 433000 0 0 +5546.7 18 148 8 6 95900 0 0 +5558.9 15 128 2 4 994000 0 0 +5561.9 18 138 8 10 1420000 0 0 +5565.8 17 130 6 8 1210000 0 0 +5565.8 16 129 4 6 1060000 0 0 +5565.9 16 128 4 4 396000 0 0 +5577.4 17 129 6 6 342000 0 0 +5577.5 17 128 6 4 28100 0 0 +5581.6 18 130 8 8 200000 0 0 +5593.3 18 129 8 6 13500 0 0 +5714.7 22 187 4 2 89400 0 0 +5730.9 22 178 4 4 88700 0 0 +5733.7 22 177 4 6 88500 0 0 +5736 19 147 2 4 447000 0 0 +5737.5 19 146 2 2 894000 0 0 +5741.5 20 148 4 6 749000 0 0 +5742 20 147 4 4 571000 0 0 +5743.6 20 146 4 2 178000 0 0 +5748.6 22 170 4 6 221000 0 0 +5754.1 21 149 6 8 1060000 0 0 +5754.2 21 148 6 6 319000 0 0 +5754.8 21 147 6 4 53100 0 0 +5773.6 22 166 4 4 218000 0 0 +5788.4 22 165 4 2 216000 0 0 +6001.1 14 72 2 2 3640000 0 0 +6010.1 14 71 2 4 3580000 0 0 +6188.8 23 151 4 6 9020 0 0 +6196 23 150 4 4 121000 0 0 +6203.7 22 140 4 2 280000 0 0 +6216.1 22 137 4 4 278000 0 0 +6218.2 24 151 6 6 125000 0 0 +6221.4 22 134 4 6 277000 0 0 +6225.5 24 150 6 4 13300 0 0 +6239.4 24 145 6 8 281000 0 0 +6240.3 23 133 4 6 262000 0 0 +6270.2 24 133 6 6 18500 0 0 +6277.2 22 125 4 6 375000 0 0 +6305.7 22 124 4 4 370000 0 0 +6323.3 22 123 4 2 367000 0 0 +6400.2 15 85 2 4 395000 0 0 +6404.1 15 84 2 2 789000 0 0 +6407 16 86 4 6 368000 0 0 +6409.4 16 85 4 4 630000 0 0 +6413.4 16 84 4 2 786000 0 0 +6421.6 17 89 6 8 223000 0 0 +6422.4 17 86 6 6 897000 0 0 +6424.8 17 85 6 4 547000 0 0 +6442.7 18 89 8 8 1330000 0 0 +6443.5 18 86 8 6 294000 0 0 +6483.5 15 69 2 4 3430000 0 0 +6484.5 18 76 8 10 4900000 0 0 +6485.5 16 70 4 6 3670000 0 0 +6486.6 17 73 6 8 4200000 0 0 +6493 16 69 4 4 1370000 0 0 +6501.3 17 70 6 6 1180000 0 0 +6508.1 18 73 8 8 691000 0 0 +6508.8 17 69 6 4 97000 0 0 +6522.9 18 70 8 6 46600 0 0 +6597.7 25 150 2 4 90800 0 0 +6605 26 151 4 6 109000 0 0 +6608 16 66 4 6 88700 0 0 +6613.2 26 150 4 4 18000 0 0 +6624.4 17 66 6 6 793000 0 0 +6628.8 15 65 2 4 220000 0 0 +6638.8 16 65 4 4 1400000 0 0 +6646.8 18 66 8 6 3490000 0 0 +6648.3 15 64 2 2 2180000 0 0 +6650.1 25 132 2 2 137000 0 0 +6653 25 131 2 4 34200 0 0 +6655.3 17 65 6 4 2740000 0 0 +6658.3 16 64 4 2 2170000 0 0 +6665.9 26 132 4 2 67900 0 0 +6668.8 26 131 4 4 170000 0 0 +6702.3 19 85 2 4 1500000 0 0 +6706.7 19 84 2 2 2990000 0 0 +6708 20 86 4 6 2510000 0 0 +6710.6 20 85 4 4 1910000 0 0 +6715 20 84 4 2 596000 0 0 +6722.8 19 80 2 2 195000 0 0 +6724.5 21 89 6 8 3560000 0 0 +6725.3 21 86 6 6 1070000 0 0 +6728 21 85 6 4 178000 0 0 +6731.1 20 80 4 2 973000 0 0 +6735.2 19 77 2 4 485000 0 0 +6743.5 20 77 4 4 155000 0 0 +6753.9 20 75 4 6 347000 0 0 +6761.1 21 77 6 4 518000 0 0 +6771.5 21 75 6 6 802000 0 0 +6928.6 20 66 4 6 775000 0 0 +6947.1 21 66 6 6 1830000 0 0 +6953.5 19 65 2 4 1030000 0 0 +6962.4 20 65 4 4 467000 0 0 +6975 19 64 2 2 383000 0 0 +6981.1 21 65 6 4 983000 0 0 +6984 20 64 4 2 2040000 0 0 +7308.6 23 95 4 6 40300 0 0 +7321 23 92 4 4 541000 0 0 +7349.6 24 95 6 6 555000 0 0 +7353.4 22 80 4 2 1320000 0 0 +7362.2 24 92 6 4 59100 0 0 +7368.2 22 77 4 4 1310000 0 0 +7380.5 22 75 4 6 1300000 0 0 +7408.2 23 74 4 6 1520000 0 0 +7408.3 24 81 6 8 1630000 0 0 +7425.7 6 22 2 4 5950000 0 0 +7430.8 23 72 4 2 906000 0 0 +7444.3 7 22 4 4 12400000 0 0 +7444.7 23 71 4 4 90100 0 0 +7450.3 24 74 6 6 107000 0 0 +7470.4 8 22 6 4 19300000 0 0 +7487.2 24 71 6 4 797000 0 0 +7509.7 23 68 4 4 230000 0 0 +7548.3 23 67 4 2 2850000 0 0 +7553 24 68 6 4 1790000 0 0 +7589.7 22 66 4 6 701000 0 0 +7630.3 22 65 4 4 690000 0 0 +7656.2 22 64 4 2 683000 0 0 +7705.6 62 321 2 2 693000 0 0 +7729.3 63 321 4 2 1370000 0 0 +7888.4 25 92 2 4 686000 0 0 +7896.1 26 95 4 6 821000 0 0 +7901.2 27 122 6 4 28200000 0 0 +7901.5 28 122 4 4 3280000 0 0 +7910.6 26 92 4 4 136000 0 0 +7917.6 28 121 4 2 31300000 0 0 +8107.9 25 68 2 4 236000 0 0 +8131.4 26 68 4 4 1170000 0 0 +8152.9 25 67 2 2 929000 0 0 +8168.5 27 120 6 6 13200000 0 0 +8168.8 28 120 4 6 939000 0 0 +8176.7 26 67 4 2 460000 0 0 +8187.1 7 21 4 6 8580000 0 0 +8190.3 6 20 2 4 12700000 0 0 +8202.6 6 19 2 2 4950000 0 0 +8203.7 27 119 6 4 1390000 0 0 +8204 28 119 4 4 12500000 0 0 +8213 7 20 4 4 4840000 0 0 +8218.6 8 21 6 6 22300000 0 0 +8225.4 7 19 4 2 26400000 0 0 +8244.7 8 20 6 4 13600000 0 0 +8570.1 9 26 2 4 4920000 0 0 +8596.4 9 25 2 2 20900000 0 0 +8631.6 10 26 4 4 26600000 0 0 +8658.1 27 113 6 4 5460000 0 0 +8658.3 10 25 4 2 10500000 0 0 +8658.5 28 113 4 4 606000 0 0 +8669.3 28 111 4 2 6040000 0 0 +8682.7 8 18 6 8 24600000 0 0 +8685.8 7 17 4 6 18000000 0 0 +8688.5 6 16 2 4 10900000 0 0 +8705.6 6 15 2 2 21000000 0 0 +8714.1 7 16 4 4 12800000 0 0 +8721.2 8 17 6 6 6750000 0 0 +8731.3 7 15 4 2 3760000 0 0 +8749.8 8 16 6 4 1040000 0 0 +9031.4 14 35 2 2 30200000 0 0 +9048.4 27 107 6 8 28000000 0 0 +9052 27 106 6 6 1880000 0 0 +9052.4 28 106 4 6 26000000 0 0 +9063 14 34 2 4 29500000 0 0 +9190 27 105 6 6 24400000 0 0 +9190.4 28 105 4 6 1760000 0 0 +9210.1 27 104 6 4 2700000 0 0 +9210.5 28 104 4 4 23300000 0 0 +9363.8 104 322 4 6 951000 0 0 +9384.7 105 322 6 6 13600000 0 0 +9389.4 9 23 2 4 22400000 0 0 +9395.4 10 24 4 6 26300000 0 0 +9398.4 14 33 2 4 28200 0 0 +9463.3 10 23 4 4 3980000 0 0 +9466.8 14 32 2 2 436000 0 0 +9533.1 106 322 6 6 13100 0 0 +9537.1 107 322 8 6 289000 0 0 +9779.6 15 46 2 4 1180000 0 0 +9789.5 16 47 4 6 1130000 0 0 +9791 15 45 2 2 2990000 0 0 +9801.2 16 46 4 4 2750000 0 0 +9812.7 16 45 4 2 5300000 0 0 +9816.7 17 48 6 8 656000 0 0 +9825.4 17 47 6 6 4950000 0 0 +9837.3 17 46 6 4 4500000 0 0 +9866 18 48 8 8 9620000 0 0 +9874.9 18 47 8 6 2970000 0 0 +9886.1 15 44 2 2 2930000 0 0 +9908.2 16 44 4 2 311000 0 0 +9911.9 15 42 2 4 758000 0 0 +9934.2 16 42 4 4 3640000 0 0 +9949.8 17 43 6 8 1080000 0 0 +9968.5 16 41 4 6 760000 0 0 +9971.2 17 42 6 4 450000 0 0 +9983.2 16 40 4 6 810000 0 0 +10000 18 43 8 8 920000 0 0 +10006 17 41 6 6 2280000 0 0 +10021 17 40 6 6 2260000 0 0 +10057 18 41 8 6 1390000 0 0 +10108 15 36 2 4 27000000 0 0 +10112 16 37 4 6 29300000 0 0 +10115 17 38 6 8 33000000 0 0 +10117 18 39 8 10 38200000 0 0 +10131 16 36 4 4 9890000 0 0 +10150 17 37 6 6 7440000 0 0 +10168 18 38 8 8 3980000 0 0 +10170 17 36 6 4 495000 0 0 +10203 18 37 8 6 281000 0 0 +10214 104 320 4 2 9100000 0 0 +10216 104 319 4 4 848000 0 0 +10241 105 319 6 4 8000000 0 0 +10379 104 318 4 4 20100000 0 0 +10385 104 317 4 6 1470000 0 0 +10401 2 5 6 4 0.000978 0 0 +10401 2 5 6 4 0.0529 0 0 +10401 2 4 6 2 0.0303 0 0 +10405 105 318 6 4 2220000 0 0 +10410 3 5 4 4 0.00175 0 0 +10410 3 5 4 4 0.0226 0 0 +10410 3 4 4 2 0.00109 0 0 +10410 3 4 4 2 0.0452 0 0 +10411 105 317 6 6 20600000 0 0 +10503 19 46 2 4 6170000 0 0 +10510 20 47 4 6 12500000 0 0 +10516 19 45 2 2 18100000 0 0 +10523 20 46 4 4 15400000 0 0 +10537 20 45 4 2 7280000 0 0 +10542 21 48 6 8 23900000 0 0 +10553 21 47 6 6 11500000 0 0 +10566 21 46 6 4 3300000 0 0 +10588 106 318 6 4 2070000 0 0 +10594 106 317 6 6 104000 0 0 +10599 107 317 8 6 1980000 0 0 +10626 19 44 2 2 3390000 0 0 +10647 20 44 4 2 4010000 0 0 +10656 19 42 2 4 5550000 0 0 +10676 111 321 2 2 2260000 0 0 +10677 20 42 4 4 257000 0 0 +10692 113 321 4 2 4490000 0 0 +10716 20 41 4 6 4180000 0 0 +10721 21 42 6 4 2290000 0 0 +10733 20 40 4 6 1030000 0 0 +10761 21 41 6 6 2370000 0 0 +10790 105 314 6 8 21600000 0 0 +10986 106 314 6 8 371000 0 0 +10992 107 314 8 8 10200000 0 0 +11183 16 31 4 6 201000 0 0 +11230 17 31 6 6 2090000 0 0 +11241 15 30 2 4 600000 0 0 +11260 122 322 4 6 2920000 0 0 +11269 16 30 4 4 4130000 0 0 +11295 18 31 8 6 10800000 0 0 +11297 15 29 2 2 6920000 0 0 +11317 17 30 6 4 9020000 0 0 +11326 16 29 4 2 7360000 0 0 +11509 104 312 4 4 109000 0 0 +11509 104 313 4 6 13100 0 0 +11540 105 313 6 6 116000 0 0 +11540 105 312 6 4 13700 0 0 +11569 11 22 6 4 2080000 0 0 +11628 12 22 4 4 1320000 0 0 +11655 13 22 2 4 639000 0 0 +11766 106 312 6 4 11600000 0 0 +11766 106 313 6 6 552000 0 0 +11772 107 313 8 6 11000000 0 0 +11967 23 50 4 6 54900 0 0 +12002 23 49 4 4 5040000 0 0 +12078 24 50 6 6 6120000 0 0 +12089 121 321 2 2 5220000 0 0 +12113 24 49 6 4 753000 0 0 +12127 122 321 4 2 10300000 0 0 +12133 20 31 4 6 2950000 0 0 +12190 21 31 6 6 7110000 0 0 +12207 19 30 2 4 4080000 0 0 +12232 32 122 2 4 55400 0 0 +12235 20 30 4 4 1520000 0 0 +12271 32 121 2 2 219000 0 0 +12274 19 29 2 2 1430000 0 0 +12292 22 44 4 2 13800000 0 0 +12293 21 30 6 4 3760000 0 0 +12299 61 236 4 6 32800 0 0 +12302 20 29 4 2 7410000 0 0 +12332 22 42 4 4 12700000 0 0 +12348 33 122 4 4 290000 0 0 +12385 22 41 4 6 12800000 0 0 +12388 33 121 4 2 127000 0 0 +12423 61 230 4 4 31900 0 0 +12465 23 40 4 6 21600000 0 0 +12473 24 43 6 8 22800000 0 0 +12473 121 320 2 2 10700000 0 0 +12476 121 319 2 4 2670000 0 0 +12494 61 227 4 2 31300 0 0 +12513 122 320 4 2 5210000 0 0 +12516 122 319 4 4 13200000 0 0 +12555 27 63 6 4 164000 0 0 +12556 28 63 4 4 18200 0 0 +12584 24 40 6 6 929000 0 0 +12619 28 62 4 2 179000 0 0 +12692 29 118 2 4 82800 0 0 +12712 23 35 4 2 2450000 0 0 +12720 121 318 2 4 140000 0 0 +12762 122 318 4 4 20600 0 0 +12765 30 118 4 4 163000 0 0 +12771 122 317 4 6 169000 0 0 +12775 23 34 4 4 547000 0 0 +12877 31 118 6 4 238000 0 0 +12901 24 34 6 4 2590000 0 0 +12973 32 119 2 4 854000 0 0 +12980 34 122 4 4 35700 0 0 +13014 33 120 4 6 1020000 0 0 +13023 34 121 4 2 35300 0 0 +13045 35 122 2 4 14100 0 0 +13049 29 116 2 4 91700 0 0 +13055 30 117 4 6 65900 0 0 +13073 29 115 2 2 36500 0 0 +13089 35 121 2 2 47100 0 0 +13104 33 119 4 4 166000 0 0 +13126 30 116 4 4 28800 0 0 +13150 30 115 4 2 179000 0 0 +13173 31 117 6 6 150000 0 0 +13176 27 60 6 6 426000 0 0 +13177 28 60 4 6 30400 0 0 +13200 61 217 4 6 49200 0 0 +13245 31 116 6 4 94700 0 0 +13258 29 110 2 4 25400 0 0 +13268 30 112 4 6 42500 0 0 +13288 31 114 6 8 60500 0 0 +13296 29 109 2 2 50300 0 0 +13299 27 59 6 4 44400 0 0 +13300 28 59 4 4 399000 0 0 +13337 30 110 4 4 31900 0 0 +13345 61 207 4 4 47600 0 0 +13375 30 109 4 2 9880 0 0 +13390 31 112 6 6 17700 0 0 +13426 61 206 4 2 46700 0 0 +13433 9 14 2 2 3440000 0 0 +13452 23 33 4 4 491000 0 0 +13460 31 110 6 4 2910 0 0 +13468 11 21 6 6 536000 0 0 +13538 11 20 6 4 314000 0 0 +13548 12 21 4 6 199000 0 0 +13585 10 14 4 2 6390000 0 0 +13591 24 33 6 4 5360000 0 0 +13592 23 32 4 2 6630000 0 0 +13606 25 49 2 4 11200000 0 0 +13619 12 20 4 4 112000 0 0 +13628 26 50 4 6 13900000 0 0 +13653 12 19 4 2 587000 0 0 +13655 13 20 2 4 284000 0 0 +13672 26 49 4 4 3020000 0 0 +13690 13 19 2 2 108000 0 0 +13717 34 120 4 6 98400 0 0 +13817 34 119 4 4 16000 0 0 +13891 35 119 2 4 79000 0 0 +14094 40 120 6 6 20200 0 0 +14147 32 113 2 4 15300 0 0 +14176 32 111 2 2 61000 0 0 +14199 40 119 6 4 416000 0 0 +14236 43 120 8 6 393000 0 0 +14303 33 113 4 4 74200 0 0 +14317 22 31 4 6 1330000 0 0 +14332 33 111 4 2 29500 0 0 +14459 22 30 4 4 1180000 0 0 +14459 32 108 2 2 65000 0 0 +14459 121 312 2 4 5230000 0 0 +14513 122 313 4 6 6200000 0 0 +14513 122 312 4 4 1040000 0 0 +14527 25 35 2 2 2310000 0 0 +14553 22 29 4 2 1100000 0 0 +14602 26 35 4 2 1140000 0 0 +14609 25 34 2 4 706000 0 0 +14621 33 108 4 2 126000 0 0 +14685 26 34 4 4 1750000 0 0 +14698 61 187 4 2 180000 0 0 +14761 11 18 6 8 996000 0 0 +14805 61 178 4 4 176000 0 0 +14824 61 177 4 6 176000 0 0 +14873 11 17 6 6 280000 0 0 +14923 61 170 4 6 78300 0 0 +14956 11 16 6 4 44600 0 0 +14971 12 17 4 6 667000 0 0 +14978 41 118 6 4 182000 0 0 +15055 12 16 4 4 485000 0 0 +15057 42 118 4 4 119000 0 0 +15093 61 166 4 4 75700 0 0 +15099 13 16 2 4 387000 0 0 +15106 12 15 4 2 147000 0 0 +15117 44 118 2 4 59000 0 0 +15151 13 15 2 2 751000 0 0 +15157 34 113 4 4 41800 0 0 +15190 34 111 4 2 16600 0 0 +15195 61 165 4 2 74200 0 0 +15203 37 114 6 8 623 0 0 +15246 35 113 2 4 8210 0 0 +15279 35 111 2 2 32600 0 0 +15281 38 114 8 8 12100 0 0 +15291 36 112 4 6 1130 0 0 +15335 37 112 6 6 20400 0 0 +15381 41 117 6 6 43000 0 0 +15382 36 110 4 4 23200 0 0 +15396 39 114 10 8 103000 0 0 +15415 38 112 8 6 94200 0 0 +15427 37 110 6 4 92500 0 0 +15433 36 109 4 2 115000 0 0 +15463 42 117 4 6 18100 0 0 +15479 41 116 6 4 27100 0 0 +15500 25 33 2 4 1120000 0 0 +15562 42 116 4 4 7910 0 0 +15587 26 33 4 4 5050000 0 0 +15596 42 115 4 2 49100 0 0 +15626 44 116 2 4 24400 0 0 +15660 44 115 2 2 9700 0 0 +15683 32 104 2 4 86600 0 0 +15687 25 32 2 2 3590000 0 0 +15775 26 32 4 2 1680000 0 0 +15796 46 117 4 6 1940 0 0 +15798 51 132 2 2 1290000 0 0 +15815 51 131 2 4 1280000 0 0 +15815 33 105 4 6 91700 0 0 +15827 47 117 6 6 17300 0 0 +15850 48 117 8 6 76800 0 0 +15870 45 116 2 4 4780 0 0 +15874 33 104 4 4 13200 0 0 +15900 46 116 4 4 30400 0 0 +15905 45 115 2 2 47500 0 0 +15931 47 116 6 4 59500 0 0 +15935 46 115 4 2 47200 0 0 +16259 52 147 2 4 108000 0 0 +16271 52 146 2 2 215000 0 0 +16307 53 148 4 6 99600 0 0 +16311 53 147 4 4 171000 0 0 +16324 53 146 4 2 213000 0 0 +16362 52 140 2 2 76800 0 0 +16403 54 149 6 8 59800 0 0 +16404 54 148 6 6 240000 0 0 +16408 54 147 6 4 147000 0 0 +16411 49 113 4 4 10900 0 0 +16415 53 140 4 2 76000 0 0 +16449 52 137 2 4 7560 0 0 +16450 49 111 4 2 109000 0 0 +16476 50 113 6 4 97200 0 0 +16503 53 137 4 4 47900 0 0 +16540 53 134 4 6 2970 0 0 +16550 55 149 8 8 350000 0 0 +16551 55 148 8 6 77600 0 0 +16601 54 137 6 4 92600 0 0 +16639 54 134 6 6 26300 0 0 +16663 52 128 2 4 985000 0 0 +16687 55 138 8 10 1400000 0 0 +16713 54 130 6 8 1200000 0 0 +16717 53 129 4 6 1050000 0 0 +16718 53 128 4 4 390000 0 0 +16790 55 134 8 6 114000 0 0 +16818 54 129 6 6 333000 0 0 +16819 54 128 6 4 27400 0 0 +16865 34 105 4 6 41600 0 0 +16866 55 130 8 8 193000 0 0 +16867 56 147 2 4 444000 0 0 +16880 56 146 2 2 886000 0 0 +16907 57 148 4 6 741000 0 0 +16912 57 147 4 4 564000 0 0 +16925 57 146 4 2 176000 0 0 +16933 34 104 4 4 11300 0 0 +16973 55 129 8 6 12900 0 0 +16979 56 140 2 2 60100 0 0 +17023 57 140 4 2 298000 0 0 +17024 58 149 6 8 1040000 0 0 +17025 58 148 6 6 311000 0 0 +17030 58 147 6 4 51800 0 0 +17044 35 104 2 4 29300 0 0 +17072 56 137 2 4 148000 0 0 +17117 57 137 4 4 46900 0 0 +17157 57 134 4 6 105000 0 0 +17239 58 137 6 4 155000 0 0 +17279 58 134 6 6 239000 0 0 +17352 59 151 4 6 19100 0 0 +17409 59 150 4 4 255000 0 0 +17566 60 151 6 6 257000 0 0 +17624 60 150 6 4 27300 0 0 +17736 60 145 6 8 923000 0 0 +17763 59 133 4 6 858000 0 0 +17778 59 132 4 2 352000 0 0 +17799 59 131 4 4 35100 0 0 +17988 60 133 6 6 59000 0 0 +18025 60 131 6 4 304000 0 0 +18433 49 105 4 6 6220 0 0 +18434 61 140 4 2 504000 0 0 +18514 49 104 4 4 59400 0 0 +18515 50 105 6 6 69200 0 0 +18545 61 137 4 4 495000 0 0 +18591 61 134 4 6 491000 0 0 +18732 62 150 2 4 431000 0 0 +18806 63 151 4 6 511000 0 0 +18872 63 150 4 4 84200 0 0 +19099 61 125 4 6 137000 0 0 +19365 61 124 4 4 131000 0 0 +19532 61 123 4 2 128000 0 0 +19686 111 284 2 2 7610 0 0 +19742 113 284 4 2 15100 0 0 +24538 118 236 4 6 16600 0 0 +25037 118 230 4 4 15700 0 0 +25097 121 284 2 2 29900 0 0 +25260 122 284 4 2 58600 0 0 +25328 118 227 4 2 15100 0 0 +26157 29 61 2 4 729000 0 0 +26466 30 61 4 4 1410000 0 0 +26544 51 72 2 2 4120000 0 0 +26721 51 71 2 4 4040000 0 0 +26953 31 61 6 4 2000000 0 0 +27497 52 85 2 4 395000 0 0 +27571 52 84 2 2 783000 0 0 +27601 53 86 4 6 364000 0 0 +27646 53 85 4 4 622000 0 0 +27720 53 84 4 2 771000 0 0 +27845 52 80 2 2 234000 0 0 +27865 54 89 6 8 216000 0 0 +27879 54 86 6 6 869000 0 0 +27925 54 85 6 4 528000 0 0 +27998 53 80 4 2 230000 0 0 +28058 52 77 2 4 22900 0 0 +28214 53 77 4 4 144000 0 0 +28292 55 89 8 8 1240000 0 0 +28307 55 86 8 6 275000 0 0 +28396 53 75 4 6 8840 0 0 +28410 118 217 4 6 25400 0 0 +28504 54 77 6 4 275000 0 0 +28690 54 75 6 6 77100 0 0 +28707 32 63 2 4 769000 0 0 +29039 32 62 2 2 2970000 0 0 +29089 118 207 4 4 23700 0 0 +29104 52 69 2 4 3990000 0 0 +29115 55 76 8 10 5700000 0 0 +29120 53 70 4 6 4270000 0 0 +29130 54 73 6 8 4880000 0 0 +29143 55 75 8 6 327000 0 0 +29271 53 69 4 4 1570000 0 0 +29283 56 85 2 4 1810000 0 0 +29354 33 63 4 4 3600000 0 0 +29366 57 86 4 6 3010000 0 0 +29366 56 84 2 2 3580000 0 0 +29417 57 85 4 4 2280000 0 0 +29430 54 70 6 6 1340000 0 0 +29476 118 206 4 2 22800 0 0 +29501 57 84 4 2 707000 0 0 +29584 54 69 6 4 109000 0 0 +29598 55 73 8 8 773000 0 0 +29643 29 57 2 4 1720000 0 0 +29674 30 58 4 6 1240000 0 0 +29678 56 80 2 2 289000 0 0 +29701 33 62 4 2 1390000 0 0 +29708 58 89 6 8 4150000 0 0 +29724 58 86 6 6 1240000 0 0 +29776 58 85 6 4 206000 0 0 +29780 29 56 2 2 679000 0 0 +29815 57 80 4 2 1420000 0 0 +29906 55 70 8 6 50800 0 0 +29920 56 77 2 4 705000 0 0 +30040 30 57 4 4 529000 0 0 +30060 57 77 4 4 222000 0 0 +30181 30 56 4 2 3260000 0 0 +30267 57 75 4 6 490000 0 0 +30288 31 58 6 6 2710000 0 0 +30419 59 95 4 6 86800 0 0 +30435 58 77 6 4 723000 0 0 +30635 59 92 4 4 1150000 0 0 +30648 58 75 6 6 1100000 0 0 +30670 31 57 6 4 1680000 0 0 +31084 60 95 6 6 1140000 0 0 +31309 60 92 6 4 119000 0 0 +31687 29 53 2 4 1310000 0 0 +31763 53 66 4 6 58900 0 0 +31773 30 54 4 6 2180000 0 0 +31886 29 52 2 2 2570000 0 0 +31917 31 55 6 8 3070000 0 0 +32132 54 66 6 6 512000 0 0 +32142 30 53 4 4 1600000 0 0 +32161 60 81 6 8 4720000 0 0 +32222 59 74 4 6 4380000 0 0 +32281 52 65 2 4 140000 0 0 +32346 30 52 4 2 492000 0 0 +32478 31 54 6 6 874000 0 0 +32487 53 65 4 4 881000 0 0 +32654 59 72 4 2 1000000 0 0 +32701 55 66 8 6 2160000 0 0 +32749 52 64 2 2 1340000 0 0 +32864 31 53 6 4 141000 0 0 +32872 54 65 6 4 1670000 0 0 +32917 32 59 2 4 2120000 0 0 +32924 59 71 4 4 97900 0 0 +32961 53 64 4 2 1320000 0 0 +32968 60 74 6 6 292000 0 0 +32987 33 60 4 6 2530000 0 0 +33192 34 63 4 4 20200 0 0 +33622 35 63 2 4 3880 0 0 +33636 34 62 4 2 7750 0 0 +33704 60 71 6 4 821000 0 0 +33771 33 59 4 4 393000 0 0 +34078 35 62 2 2 14900 0 0 +34122 57 66 4 6 699000 0 0 +34234 59 68 4 4 203000 0 0 +34431 61 80 4 2 2640000 0 0 +34607 58 66 6 6 1560000 0 0 +34757 61 77 4 4 2560000 0 0 +34768 23 28 4 4 12200 0 0 +34770 56 65 2 4 917000 0 0 +34774 23 27 4 6 995 0 0 +34959 57 65 4 4 289000 0 0 +34983 62 92 2 4 2650000 0 0 +35034 61 75 4 6 2500000 0 0 +35052 59 67 4 2 1890000 0 0 +35079 60 68 6 4 1700000 0 0 +35187 63 95 4 6 3130000 0 0 +35314 56 64 2 2 350000 0 0 +35468 58 65 6 4 934000 0 0 +35477 63 92 4 4 509000 0 0 +35509 57 64 4 2 1720000 0 0 +35716 24 28 6 4 1360 0 0 +35722 24 27 6 6 11900 0 0 +36388 118 187 4 2 195000 0 0 +37056 118 178 4 4 184000 0 0 +37172 118 177 4 6 183000 0 0 +37640 62 72 2 2 273000 0 0 +37805 118 170 4 6 42600 0 0 +37913 34 60 4 6 257000 0 0 +37999 62 71 2 4 66500 0 0 +38160 41 61 6 4 949000 0 0 +38213 63 72 4 2 131000 0 0 +38583 63 71 4 4 317000 0 0 +38671 42 61 4 4 608000 0 0 +38914 118 166 4 4 39000 0 0 +38951 34 59 4 4 39500 0 0 +39070 44 61 2 4 295000 0 0 +39545 35 59 2 4 189000 0 0 +39599 118 165 4 2 37000 0 0 +39756 62 68 2 4 414000 0 0 +39866 49 63 4 4 97400 0 0 +40248 50 63 6 4 852000 0 0 +40306 61 66 4 6 302000 0 0 +40395 63 68 4 4 1970000 0 0 +40509 49 62 4 2 929000 0 0 +40862 62 67 2 2 1520000 0 0 +40938 40 60 6 6 46900 0 0 +41241 104 151 4 6 20500 0 0 +41478 61 65 4 4 277000 0 0 +41538 63 67 4 2 725000 0 0 +41563 104 150 4 4 271000 0 0 +41650 105 151 6 6 279000 0 0 +41978 105 150 6 4 29200 0 0 +42151 40 59 6 4 902000 0 0 +42163 43 60 8 6 858000 0 0 +42255 61 64 4 2 262000 0 0 +42619 105 145 6 8 1310000 0 0 +42864 32 51 2 2 268000 0 0 +43640 104 133 4 6 1140000 0 0 +43735 104 132 4 2 265000 0 0 +43781 67 122 2 4 63400 0 0 +43860 104 131 4 4 26200 0 0 +44098 105 133 6 6 79000 0 0 +44281 67 121 2 2 245000 0 0 +44323 105 131 6 4 229000 0 0 +44323 33 51 4 2 485000 0 0 +45127 68 122 4 4 290000 0 0 +45209 41 58 6 6 88500 0 0 +45658 68 121 4 2 112000 0 0 +45755 37 55 6 8 4210 0 0 +45928 42 58 4 6 36200 0 0 +46063 41 57 6 4 53800 0 0 +46475 38 55 8 8 79000 0 0 +46505 36 54 4 6 7370 0 0 +46810 42 57 4 4 15200 0 0 +46877 49 60 4 6 9200 0 0 +46918 37 54 6 6 131000 0 0 +47153 42 56 4 2 92800 0 0 +47299 36 53 4 4 147000 0 0 +47395 44 57 2 4 45700 0 0 +47407 50 60 6 6 125000 0 0 +47554 39 55 10 8 647000 0 0 +47626 71 122 4 4 3230 0 0 +47676 38 54 8 6 587000 0 0 +47726 37 53 6 4 576000 0 0 +47742 36 52 4 2 716000 0 0 +47747 44 56 2 2 17900 0 0 +48202 72 122 2 4 623 0 0 +48218 71 121 4 2 1240 0 0 +48475 49 59 4 4 112000 0 0 +48808 72 121 2 2 2400 0 0 +48935 41 55 6 8 48800 0 0 +49000 46 58 4 6 12500 0 0 +49042 50 59 6 4 12100 0 0 +49297 47 58 6 6 111000 0 0 +49518 48 58 8 6 485000 0 0 +49710 45 57 2 4 29900 0 0 +50006 46 57 4 4 188000 0 0 +50097 45 56 2 2 293000 0 0 +50268 41 54 6 6 13500 0 0 +50315 47 57 6 4 364000 0 0 +50398 46 56 4 2 287000 0 0 +51158 42 54 4 6 29900 0 0 +51197 41 53 6 4 2130 0 0 +52121 42 53 4 4 21600 0 0 +52659 42 52 4 2 6530 0 0 +52806 25 28 2 4 2340 0 0 +52848 44 53 2 4 16200 0 0 +53397 92 122 4 4 12400 0 0 +53401 44 52 2 2 31300 0 0 +53696 34 51 4 2 688000 0 0 +53761 47 55 6 8 14200 0 0 +53819 26 28 4 4 492 0 0 +53833 26 27 4 6 2570 0 0 +54024 48 55 8 8 84300 0 0 +54067 95 122 6 4 108000 0 0 +54143 92 121 4 2 119000 0 0 +54831 35 51 2 2 323000 0 0 +55000 46 54 4 6 21700 0 0 +55025 67 119 2 4 552000 0 0 +55374 47 54 6 6 52300 0 0 +55501 68 120 4 6 645000 0 0 +55653 48 54 8 6 17100 0 0 +55742 45 53 2 4 22400 0 0 +56115 46 53 4 4 35100 0 0 +56358 45 52 2 2 43300 0 0 +56504 47 53 6 4 30100 0 0 +56641 109 147 2 4 114000 0 0 +56739 46 52 4 2 42400 0 0 +56788 109 146 2 2 226000 0 0 +57168 68 119 4 4 98400 0 0 +57252 108 132 2 2 1090000 0 0 +57291 110 148 4 6 103000 0 0 +57342 110 147 4 4 176000 0 0 +57467 108 131 2 4 1070000 0 0 +57493 110 146 4 2 218000 0 0 +57719 113 151 4 6 1150000 0 0 +57863 111 150 2 4 951000 0 0 +57914 109 140 2 2 70900 0 0 +58350 113 150 4 4 186000 0 0 +58580 112 149 6 8 58800 0 0 +58596 112 148 6 6 236000 0 0 +58647 110 140 4 2 68300 0 0 +58649 112 147 6 4 144000 0 0 +59016 109 137 2 4 6700 0 0 +59202 64 118 2 4 164000 0 0 +59330 71 120 4 6 169000 0 0 +59778 110 137 4 4 41300 0 0 +60266 110 134 4 6 2520 0 0 +60598 114 149 8 8 319000 0 0 +60615 114 148 8 6 70700 0 0 +60796 65 118 4 4 302000 0 0 +61069 115 147 2 4 500000 0 0 +61199 112 137 6 4 75700 0 0 +61239 71 119 4 4 25600 0 0 +61241 115 146 2 2 993000 0 0 +61539 116 148 4 6 822000 0 0 +61598 116 147 4 4 624000 0 0 +61712 112 134 6 6 21100 0 0 +61755 74 120 6 6 21800 0 0 +61772 116 146 4 2 193000 0 0 +61866 109 128 2 4 1060000 0 0 +62161 111 132 2 2 78200 0 0 +62194 72 119 2 4 122000 0 0 +62415 111 131 2 4 19300 0 0 +62482 114 138 8 10 1470000 0 0 +62552 115 140 2 2 74200 0 0 +62689 110 129 4 6 1090000 0 0 +62704 110 128 4 4 408000 0 0 +62724 113 132 4 2 38100 0 0 +62747 112 130 6 8 1250000 0 0 +62982 113 131 4 4 94000 0 0 +63106 116 140 4 2 362000 0 0 +63120 117 149 6 8 1090000 0 0 +63138 117 148 6 6 326000 0 0 +63200 117 147 6 4 54200 0 0 +63504 66 118 6 4 398000 0 0 +63826 74 119 6 4 415000 0 0 +63840 115 137 2 4 175000 0 0 +63956 114 134 8 6 84200 0 0 +64255 112 129 6 6 329000 0 0 +64269 112 128 6 4 27000 0 0 +64417 116 137 4 4 54400 0 0 +64803 81 120 8 6 377000 0 0 +64985 116 134 4 6 119000 0 0 +65068 114 130 8 8 186000 0 0 +66172 117 137 6 4 169000 0 0 +66691 114 129 8 6 11700 0 0 +66771 117 134 6 6 256000 0 0 +67870 64 116 2 4 457000 0 0 +68014 65 117 4 6 327000 0 0 +68523 64 115 2 2 178000 0 0 +68560 92 120 4 6 4620 0 0 +69669 95 120 6 6 61700 0 0 +69973 65 116 4 4 134000 0 0 +70668 65 115 4 2 810000 0 0 +71122 92 119 4 4 55900 0 0 +71422 66 117 6 6 659000 0 0 +72316 95 119 6 4 5910 0 0 +73051 118 140 4 2 726000 0 0 +73584 66 116 6 4 387000 0 0 +73914 64 110 2 4 311000 0 0 +74212 65 112 4 6 516000 0 0 +74814 118 137 4 4 676000 0 0 +74951 66 114 6 8 715000 0 0 +75113 64 109 2 2 592000 0 0 +75581 118 134 4 6 656000 0 0 +76415 65 110 4 4 360000 0 0 +77697 65 109 4 2 107000 0 0 +78287 66 112 6 6 188000 0 0 +80743 66 110 6 4 28600 0 0 +83237 75 118 6 4 404000 0 0 +84744 118 125 4 6 99300 0 0 +84843 77 118 4 4 255000 0 0 +84922 67 113 2 4 88200 0 0 +85975 67 111 2 2 340000 0 0 +86854 80 118 2 4 119000 0 0 +90136 68 113 4 4 369000 0 0 +90233 118 124 4 4 82300 0 0 +91323 68 111 4 2 142000 0 0 +91512 119 151 4 6 10200 0 0 +93110 119 150 4 4 130000 0 0 +93976 118 123 4 2 72800 0 0 +95376 70 114 6 8 2040 0 0 +96135 120 151 6 6 123000 0 0 +97388 75 117 6 6 37200 0 0 +97543 67 108 2 2 35500 0 0 +97900 120 150 6 4 12500 0 0 +98660 73 114 8 8 36200 0 0 +99072 69 112 4 6 3340 0 0 +99594 77 117 4 6 14900 0 0 +100690 71 113 4 4 825 0 0 +100850 70 112 6 6 57900 0 0 +101450 75 116 6 4 21200 0 0 +101460 120 145 6 8 452000 0 0 +102170 71 111 4 2 316 0 0 +103040 69 110 4 4 62400 0 0 +103300 72 113 2 4 153 0 0 +103850 77 116 4 4 5850 0 0 +104070 75 114 6 8 22400 0 0 +104230 119 133 4 6 389000 0 0 +104420 76 114 10 8 268000 0 0 +104490 68 108 4 2 57700 0 0 +104520 73 112 8 6 244000 0 0 +104770 119 132 4 2 150000 0 0 +104860 72 111 2 2 585 0 0 +104960 70 110 6 4 237000 0 0 +105380 69 109 4 2 292000 0 0 +105390 77 115 4 2 35000 0 0 +105490 119 131 4 4 14700 0 0 +106880 80 116 2 4 16800 0 0 +107370 85 117 4 6 5130 0 0 +108060 86 117 6 6 45300 0 0 +108270 89 117 8 6 200000 0 0 +108510 80 115 2 2 6410 0 0 +110260 120 133 6 6 23500 0 0 +110610 75 112 6 6 5580 0 0 +111130 84 116 2 4 11600 0 0 +111680 120 131 6 4 111000 0 0 +112340 85 116 4 4 71700 0 0 +112890 84 115 2 2 110000 0 0 +113090 86 116 6 4 138000 0 0 +113470 77 112 4 6 12100 0 0 +114140 85 115 4 2 107000 0 0 +115580 75 110 6 4 816 0 0 +116340 86 114 6 8 6100 0 0 +116600 89 114 8 8 36500 0 0 +118700 77 110 4 4 8030 0 0 +118930 71 108 4 2 289000 0 0 +121830 77 109 4 2 2320 0 0 +122590 72 108 2 2 132000 0 0 +122680 80 110 2 4 5690 0 0 +123680 85 112 4 6 8320 0 0 +124590 86 112 6 6 20000 0 0 +124880 89 112 8 6 6580 0 0 +126020 80 109 2 2 10500 0 0 +128310 84 110 2 4 7980 0 0 +129920 85 110 4 4 12300 0 0 +130510 92 113 4 4 11800 0 0 +130920 86 110 6 4 10500 0 0 +131970 84 109 2 2 14700 0 0 +133010 92 111 4 2 111000 0 0 +133670 85 109 4 2 14100 0 0 +134580 95 113 6 4 96600 0 0 +157970 121 150 2 4 60600 0 0 +159740 122 151 4 6 70300 0 0 +164680 122 150 4 4 10700 0 0 +194720 121 132 2 2 899 0 0 +197230 121 131 2 4 216 0 0 +205020 122 132 4 2 385 0 0 +206040 67 104 2 4 13700 0 0 +207800 122 131 4 4 924 0 0 +226750 68 105 4 6 12400 0 0 +239680 68 104 4 4 1740 0 0 +307940 71 105 4 6 1660 0 0 +332290 71 104 4 4 221 0 0 +362490 72 104 2 4 850 0 0 +386780 74 105 6 6 180 0 0 +425990 74 104 6 4 2840 0 0 +548280 81 105 8 6 1270 0 0 diff --git a/regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_N/Radiation_Emission_Absorption_reference.csv b/regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_N/Radiation_Emission_Absorption_reference.csv new file mode 100644 index 000000000..565d6a110 --- /dev/null +++ b/regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_N/Radiation_Emission_Absorption_reference.csv @@ -0,0 +1,1001 @@ + wavelength,emission_coefficient,absorption_coefficient + 867.89999999999998 , 4.8645498496872497E-002 , 8.5534316040596166E-016 + 867.90130130130126 , 129590269736.57231 , 2.2786106484542898E-003 + 867.90260260260266 , 1158764814.3678493 , 2.0374784699808267E-005 + 867.90390390390382 , 1166589229.1594329 , 2.0512362890657529E-005 + 867.90520520520522 , 1174494239.7384326 , 2.0651358212745120E-005 + 867.90650650650650 , 1182663012.2188008 , 2.0794991311097365E-005 + 867.90780780780779 , 1190836187.9857080 , 2.0938701833284104E-005 + 867.90910910910907 , 1198995359.3300450 , 2.1082166113014070E-005 + 867.91041041041035 , 1207239842.2611079 , 2.1227130442789039E-005 + 867.91171171171175 , 1215570841.7234247 , 2.1373616009380502E-005 + 867.91301301301303 , 1223989584.5838926 , 2.1521644385025183E-005 + 867.91431431431431 , 1232638794.9293413 , 2.1673725114804681E-005 + 867.91561561561559 , 1241399280.1710782 , 2.1827762412497064E-005 + 867.91691691691688 , 1250094898.9891925 , 2.1980659151381334E-005 + 867.91821821821827 , 1258883516.3376815 , 2.2135191101319902E-005 + 867.91951951951944 , 1267766476.6122501 , 2.2291381901081126E-005 + 867.92082082082084 , 1276745149.2128241 , 2.2449255629087411E-005 + 867.92212212212212 , 1285915864.9313431 , 2.2610506088189336E-005 + 867.92342342342340 , 1295319147.7918477 , 2.2775845820099210E-005 + 867.92472472472468 , 1304600040.9248836 , 2.2939033549880852E-005 + 867.92602602602597 , 1313982517.4894030 , 2.3104007440684890E-005 + 867.92732732732736 , 1323468080.9252188 , 2.3270793927782836E-005 + 867.92862862862864 , 1333058263.2700782 , 2.3439419949289204E-005 + 867.92992992992981 , 1342796197.7659791 , 2.3610643925297706E-005 + 867.93123123123121 , 1352904436.9483182 , 2.3788379039861642E-005 + 867.93253253253249 , 1362825193.0096219 , 2.3962817602633025E-005 + 867.93383383383389 , 1372857144.8175697 , 2.4139211341613871E-005 + 867.93513513513517 , 1383001978.8526838 , 2.4317589910515704E-005 + 867.93643643643634 , 1393261413.8700683 , 2.4497983530540250E-005 + 867.93773773773773 , 1403637202.2222712 , 2.4680423013639532E-005 + 867.93903903903902 , 1414480986.5289767 , 2.4871091359658323E-005 + 867.94034034034041 , 1425122414.7474597 , 2.5058201639640663E-005 + 867.94164164164158 , 1435866218.0519524 , 2.5247112000459265E-005 + 867.94294294294286 , 1446733907.6830747 , 2.5438200678397117E-005 + 867.94424424424426 , 1457727417.4997840 , 2.5631501676868388E-005 + 867.94554554554554 , 1468848720.0853214 , 2.5827049680183763E-005 + 867.94684684684682 , 1480405574.0412068 , 2.6030256067052483E-005 + 867.94814814814811 , 1491887030.1180134 , 2.6232136718505348E-005 + 867.94944944944939 , 1503412844.5197766 , 2.6434797330921327E-005 + 867.95075075075079 , 1515074943.2698905 , 2.6639854257258102E-005 + 867.95205205205195 , 1526875509.4173491 , 2.6847345882486192E-005 + 867.95335335335335 , 1538816770.8359709 , 2.7057311379739638E-005 + 867.95465465465463 , 1551154842.5590823 , 2.7274254068930913E-005 + 867.95595595595603 , 1563564249.9803395 , 2.7492451067429055E-005 + 867.95725725725720 , 1575951228.0636706 , 2.7710253686562599E-005 + 867.95855855855848 , 1588488503.7269199 , 2.7930699016964011E-005 + 867.95985985985988 , 1601178548.7039106 , 2.8153830519604708E-005 + 867.96116116116116 , 1614023886.8032296 , 2.8379692571096708E-005 + 867.96246246246255 , 1627219963.0944467 , 2.8611721719705670E-005 + 867.96376376376372 , 1640657021.8344386 , 2.8847988109081126E-005 + 867.96506506506501 , 1653994748.5185766 , 2.9082507923805094E-005 + 867.96636636636640 , 1667498662.5825150 , 2.9319949843205755E-005 + 867.96766766766768 , 1681171572.9806118 , 2.9560363257668098E-005 + 867.96896896896897 , 1695016348.6266179 , 2.9803798611854624E-005 + 867.97027027027025 , 1709157236.0123367 , 3.0052440555738147E-005 + 867.97157157157153 , 1723735376.2621737 , 3.0308770800867380E-005 + 867.97287287287293 , 1738125584.2976644 , 3.0561796597709963E-005 + 867.97417417417410 , 1752700061.3282175 , 3.0818062431749652E-005 + 867.97547547547549 , 1767462010.6385546 , 3.1077624626958074E-005 + 867.97677677677677 , 1782414705.3238087 , 3.1340540734796771E-005 + 867.97807807807806 , 1941199483.9640951 , 3.4135196472539610E-005 + 867.97937937937934 , 2063260618.0415874 , 3.6283427088998192E-005 + 867.98068068068062 , 2079850889.0109417 , 3.6575156502027654E-005 + 867.98198198198202 , 2096652531.4632263 , 3.6870602622371652E-005 + 867.98328328328330 , 2113669265.7506196 , 3.7169830866720886E-005 + 867.98458458458458 , 2130917017.2943623 , 3.7473121484813473E-005 + 867.98588588588586 , 2148400348.1789966 , 3.7780554706385379E-005 + 867.98718718718715 , 2166610830.8927054 , 3.8100773242159387E-005 + 867.98848848848854 , 2184603191.9210854 , 3.8417156629546174E-005 + 867.98978978978971 , 2202769880.8254480 , 3.8736605385775421E-005 + 867.99109109109111 , 2221176229.1195188 , 3.9060268248515315E-005 + 867.99239239239239 , 2239831693.9059477 , 3.9388311601016463E-005 + 867.99369369369367 , 2258763931.5291419 , 3.9721222169129510E-005 + 867.99499499499507 , 2278374805.6189055 , 4.0066064844097450E-005 + 867.99629629629624 , 2297978179.7364149 , 4.0410775779538802E-005 + 867.99759759759763 , 2317667966.7186093 , 4.0757006264088602E-005 + 867.99889889889891 , 2337625687.9237018 , 4.1107948023878995E-005 + 868.00020020020020 , 2357856386.1153364 , 4.1463689727970165E-005 + 868.00150150150148 , 2378402636.7795935 , 4.1824980697167149E-005 + 868.00280280280276 , 2399575535.5359125 , 4.2197289630219164E-005 + 868.00410410410416 , 2420988073.3835812 , 4.2573812277106498E-005 + 868.00540540540544 , 2442383206.7883139 , 4.2950029040693333E-005 + 868.00670670670661 , 2464078963.5697503 , 4.3331531866570001E-005 + 868.00800800800801 , 2486081189.7212272 , 4.3718423547220439E-005 + 868.00930930930929 , 2508426625.3178029 , 4.4111350672541621E-005 + 868.01061061061068 , 2531350672.8407989 , 4.4514451421834003E-005 + 868.01191191191185 , 2554802307.9535298 , 4.4926828791199986E-005 + 868.01321321321313 , 2578113907.6094427 , 4.5336744040342576E-005 + 868.01451451451453 , 2601764103.0148449 , 4.5752613035188536E-005 + 868.01581581581581 , 2625759703.9388275 , 4.6174555514562982E-005 + 868.01711711711710 , 2650131197.3314342 , 4.6603107981655146E-005 + 868.01841841841838 , 2675019509.2371168 , 4.7040747860760641E-005 + 868.01971971971966 , 2700778349.7351093 , 4.7493694197865337E-005 + 868.02102102102106 , 2726252179.2465510 , 4.7941629290444326E-005 + 868.02232232232234 , 2752108938.8127127 , 4.8396297675774305E-005 + 868.02362362362362 , 2778356602.9038162 , 4.8857839571938566E-005 + 868.02492492492490 , 2805018978.4808402 , 4.9326673877784407E-005 + 868.02622622622619 , 2832119601.2804213 , 4.9803214401347469E-005 + 868.02752752752758 , 2860499881.7809591 , 5.0302255005937252E-005 + 868.02882882882875 , 2888423534.2321057 , 5.0793266799086926E-005 + 868.03013013013015 , 2916782160.5215917 , 5.1291926989876265E-005 + 868.03143143143143 , 2945585151.9291406 , 5.1798400708524834E-005 + 868.03273273273282 , 2974849205.1695848 , 5.2312981671202460E-005 + 868.03403403403399 , 3004610403.2158260 , 5.2836304827512706E-005 + 868.03533533533528 , 3035666486.0708222 , 5.3382395618995793E-005 + 868.03663663663667 , 3066536375.2168527 , 5.3925212707649423E-005 + 868.03793793793795 , 3097744701.0888205 , 5.4473980772995680E-005 + 868.03923923923924 , 3129460577.1712775 , 5.5031673371628282E-005 + 868.04054054054052 , 3161695452.3077211 , 5.5598491812440720E-005 + 868.04184184184180 , 3194508083.0314178 , 5.6175470111907590E-005 + 868.04314314314320 , 3228573810.1179934 , 5.6774481199073910E-005 + 868.04444444444437 , 3262844308.6374698 , 5.7377092965911055E-005 + 868.04574574574576 , 3297314532.1059880 , 5.7983216723962727E-005 + 868.04704704704704 , 3332367456.2203884 , 5.8599586410373750E-005 + 868.04834834834833 , 3368016748.8480477 , 5.9226442351684476E-005 + 868.04964964964961 , 3404315398.3327308 , 5.9864716988913914E-005 + 868.05095095095089 , 3441831211.5474730 , 6.0524392959013777E-005 + 868.05225225225229 , 3480025260.2562943 , 6.1195994437919597E-005 + 868.05355355355357 , 3518249037.6181445 , 6.1868118841612235E-005 + 868.05485485485485 , 3557145504.4516253 , 6.2552071475793268E-005 + 868.05615615615613 , 3596731093.3349328 , 6.3248141279579495E-005 + 868.05745745745742 , 3637052823.3823538 , 6.3957155569057729E-005 + 868.05875875875881 , 3678536257.4831471 , 6.4686596421054563E-005 + 868.06006006006010 , 3721282777.2082553 , 6.5438246117692598E-005 + 868.06136136136126 , 3763850653.9426250 , 6.6186754912408416E-005 + 868.06266266266266 , 3807199764.7364378 , 6.6949000510131297E-005 + 868.06396396396394 , 3851350016.8678832 , 6.7725332946443208E-005 + 868.06526526526534 , 3896342357.9081349 , 6.8516472597592807E-005 + 868.06656656656651 , 3942415953.3967957 , 6.9326624673388815E-005 + 868.06786786786790 , 3990476957.3594537 , 7.0171721287900598E-005 + 868.06916916916919 , 4038103616.2455769 , 7.1009180954432086E-005 + 868.07047047047047 , 4086643465.8397565 , 7.1862697656190791E-005 + 868.07177177177175 , 4136120822.6698670 , 7.2732698957606712E-005 + 868.07307307307303 , 4186570619.5559235 , 7.3619799276284062E-005 + 868.07437437437443 , 4238048626.4999919 , 7.4524979791343104E-005 + 868.07567567567571 , 4292235849.3757710 , 7.5477796291559040E-005 + 868.07697697697688 , 4345852729.9942245 , 7.6420584593121297E-005 + 868.07827827827828 , 4400485111.6682768 , 7.7381228886538313E-005 + 868.07957957957956 , 4456222435.9037514 , 7.8361301841434433E-005 + 868.08088088088095 , 4513095737.9588013 , 7.9361349159175356E-005 + 868.08218218218224 , 4571197116.2721100 , 8.0382991359150916E-005 + 868.08348348348341 , 4632059548.0906782 , 8.1453180864077412E-005 + 868.08478478478480 , 4693039589.3652134 , 8.2525438538229128E-005 + 868.08608608608608 , 4754876132.8363390 , 8.3612756511920286E-005 + 868.08738738738748 , 4818025120.6456671 , 8.4723151706172251E-005 + 868.08868868868865 , 4882525228.5179234 , 8.5857304166340404E-005 + 868.08998998998993 , 4948466641.0600796 , 8.7016800573793803E-005 + 868.09129129129133 , 5017241950.3551331 , 8.8226125547257071E-005 + 868.09259259259261 , 5087018232.8640985 , 8.9453050820897402E-005 + 868.09389389389389 , 5157442479.4153595 , 9.0691369644030882E-005 + 868.09519519519517 , 5229438925.8524265 , 9.1957333036162328E-005 + 868.09649649649646 , 5303056279.3075581 , 9.3251797427031260E-005 + 868.09779779779785 , 5378384290.8595066 , 9.4576341668884493E-005 + 868.09909909909902 , 5456605987.7884197 , 9.5951766239721605E-005 + 868.10040040040042 , 5536982111.5864601 , 9.7365072262751149E-005 + 868.10170170170170 , 5617734076.3070669 , 9.8784987059896066E-005 + 868.10300300300298 , 5700386973.5648117 , 1.0023832661353324E-004 + 868.10430430430426 , 5785002850.0909119 , 1.0172618190637672E-004 + 868.10560560560555 , 5871673375.0838194 , 1.0325016528949344E-004 + 868.10690690690694 , 5961277763.4476652 , 1.0482573599532458E-004 + 868.10820820820823 , 6054549123.6142521 , 1.0646578325272063E-004 + 868.10950950950951 , 6147842047.8891153 , 1.0810620998612187E-004 + 868.11081081081079 , 6243456893.5827980 , 1.0978746382407310E-004 + 868.11211211211207 , 6341473684.3143387 , 1.1151095184062720E-004 + 868.11341341341347 , 6441989657.6597471 , 1.1327838404511459E-004 + 868.11471471471475 , 6545450871.3989325 , 1.1509760420612750E-004 + 868.11601601601603 , 6654574417.6183386 , 1.1701638543417440E-004 + 868.11731731731732 , 6763258309.8457747 , 1.1892743647254944E-004 + 868.11861861861860 , 6874810241.3023787 , 1.2088891713122574E-004 + 868.11991991991999 , 6989334825.5947170 , 1.2290266685503081E-004 + 868.12122122122116 , 7106941509.9587440 , 1.2497061007947667E-004 + 868.12252252252256 , 7227822809.5909977 , 1.2709613331267710E-004 + 868.12382382382384 , 7355933673.0718670 , 1.2934877427722496E-004 + 868.12512512512512 , 7484090740.0019846 , 1.3160222798054384E-004 + 868.12642642642641 , 7615471457.5182171 , 1.3391236411013145E-004 + 868.12772772772769 , 7750577429.8529549 , 1.3628800247369961E-004 + 868.12902902902908 , 7889554212.0966177 , 1.3873170239843798E-004 + 868.13033033033037 , 8032620181.6640034 , 1.4124730490045604E-004 + 868.13163163163154 , 8183662289.0554790 , 1.4390315285338533E-004 + 868.13293293293293 , 8336808871.5742264 , 1.4659600424973937E-004 + 868.13423423423421 , 8493184711.2578068 , 1.4934563667900471E-004 + 868.13553553553561 , 8654293740.5077953 , 1.5217849407831322E-004 + 868.13683683683678 , 8820332701.2748337 , 1.5509803580362970E-004 + 868.13813813813806 , 8991560511.7561016 , 1.5810881544814600E-004 + 868.13943943943946 , 9171656201.7229099 , 1.6127552083583155E-004 + 868.14074074074074 , 9356795451.2279015 , 1.6453090784153507E-004 + 868.14204204204214 , 9545136120.8961563 , 1.6784258644414631E-004 + 868.14334334334330 , 9739582869.0344410 , 1.7126162981430788E-004 + 868.14464464464470 , 9940406390.7013092 , 1.7479279764011488E-004 + 868.14594594594598 , 10147928957.368538 , 1.7844175717834573E-004 + 868.14724724724726 , 10365403164.464495 , 1.8226569913202628E-004 + 868.14854854854855 , 10592147451.809065 , 1.8625263808547457E-004 + 868.14984984984983 , 10822022842.106003 , 1.9029463226464483E-004 + 868.15115115115123 , 11059909467.016899 , 1.9447748996873385E-004 + 868.15245245245251 , 11306187226.082180 , 1.9880789104969969E-004 + 868.15375375375368 , 11561277971.241098 , 2.0329325338431381E-004 + 868.15505505505507 , 11827665399.695511 , 2.0797724905257596E-004 + 868.15635635635635 , 12109465773.233229 , 2.1293225251321784E-004 + 868.15765765765775 , 12394277447.313728 , 2.1794020472341841E-004 + 868.15895895895892 , 12689800872.088272 , 2.2313650418555260E-004 + 868.16026026026020 , 12996581777.349176 , 2.2853074657730568E-004 + 868.16156156156160 , 13315201091.181387 , 2.3413314648229488E-004 + 868.16286286286288 , 13646833014.410032 , 2.3996435203446761E-004 + 868.16416416416416 , 14002937813.852873 , 2.4622586746896323E-004 + 868.16546546546545 , 14361891605.670141 , 2.5253747779304113E-004 + 868.16676676676673 , 14735485314.268839 , 2.5910650510554582E-004 + 868.16806806806812 , 15124526395.103144 , 2.6594714705739056E-004 + 868.16936936936929 , 15529878687.573475 , 2.7307459270936043E-004 + 868.17067067067069 , 15952555470.008923 , 2.8050666040033443E-004 + 868.17197197197197 , 16407116223.258421 , 2.8849934939066452E-004 + 868.17327327327325 , 16870644184.921734 , 2.9664971068562836E-004 + 868.17457457457465 , 17352626734.031113 , 3.0512456309720801E-004 + 868.17587587587582 , 17856400538.510803 , 3.1398257590646859E-004 + 868.17717717717721 , 18383303917.928955 , 3.2324728105092107E-004 + 868.17847847847850 , 18934851324.510918 , 3.3294530877448262E-004 + 868.17977977977978 , 19526920416.979698 , 3.4335583722935328E-004 + 868.18108108108106 , 20140526935.587467 , 3.5414506214113039E-004 + 868.18238238238234 , 20777694755.405384 , 3.6534857054412625E-004 + 868.18368368368374 , 21446689646.577656 , 3.7711170107289149E-004 + 868.18498498498502 , 22149682908.231594 , 3.8947263210551786E-004 + 868.18628628628630 , 22889084909.869221 , 4.0247374659689702E-004 + 868.18758758758759 , 23682002752.885967 , 4.1641584148107292E-004 + 868.18888888888887 , 24518071749.748730 , 4.3111667070313626E-004 + 868.19019019019026 , 25385999392.213482 , 4.4637767726775791E-004 + 868.19149149149143 , 26302346474.087330 , 4.6249005280746416E-004 + 868.19279279279283 , 27270773160.094509 , 4.7951815471142755E-004 + 868.19409409409411 , 28295302956.411873 , 4.9753272960393171E-004 + 868.19539539539539 , 29393808742.113071 , 5.1684804064527272E-004 + 868.19669669669668 , 30573504930.224186 , 5.3759093694612714E-004 + 868.19799799799796 , 31799039144.549229 , 5.5913981278211218E-004 + 868.19929929929935 , 33101233075.298870 , 5.8203661187217529E-004 + 868.20060060060064 , 34486360295.358788 , 6.0639164366496482E-004 + 868.20190190190181 , 35961276100.967354 , 6.3232544621674356E-004 + 868.20320320320320 , 37543033345.713776 , 6.6013786560664841E-004 + 868.20450450450448 , 39273926425.973320 , 6.9057256731529845E-004 + 868.20580580580588 , 41074021526.149353 , 7.2222406221508881E-004 + 868.20710710710716 , 42999225354.998596 , 7.5607536873391063E-004 + 868.20840840840833 , 45060329175.051155 , 7.9231623172774262E-004 + 868.20970970970973 , 47269165057.902275 , 8.3115469679881197E-004 + 868.21101101101101 , 49638872746.125717 , 8.7282180487913445E-004 + 868.21231231231241 , 52277272657.473488 , 9.1921337907309821E-004 + 868.21361361361357 , 55028038452.854050 , 9.6758070456577942E-004 + 868.21491491491486 , 57988981791.043839 , 1.0196436230719647E-003 + 868.21621621621625 , 61182846865.581825 , 1.0758020501346959E-003 + 868.21751751751754 , 64635435830.036255 , 1.1365096699968284E-003 + 868.21881881881882 , 68378964685.097885 , 1.2023329446731220E-003 + 868.22012012012010 , 72580730810.799667 , 1.2762134936270108E-003 + 868.22142142142138 , 77102644223.052536 , 1.3557232537243699E-003 + 868.22272272272278 , 82077055983.357697 , 1.4431893802551289E-003 + 868.22402402402395 , 87653145796.026535 , 1.5412349286782030E-003 + 868.22532532532534 , 94012973293.782333 , 1.6530610885607455E-003 + 868.22662662662663 , 101429829986.40456 , 1.7834731984832897E-003 + 868.22792792792802 , 110554823367.04135 , 1.9439198059168314E-003 + 868.22922922922919 , 121811951385.85553 , 2.1418561461514080E-003 + 868.23053053053047 , 136052522269.35255 , 2.3922509373406134E-003 + 868.23183183183187 , 154770310971.87143 , 2.7213695119522540E-003 + 868.23313313313315 , 179945434748.79477 , 3.1640286527153294E-003 + 868.23443443443455 , 214367509950.91281 , 3.7692787215085617E-003 + 868.23573573573572 , 262941585557.57898 , 4.6233661394262408E-003 + 868.23703703703700 , 331205373573.91876 , 5.8236615578312724E-003 + 868.23833833833839 , 424580457153.28436 , 7.4654937191053553E-003 + 868.23963963963968 , 553195047806.95874 , 9.7269489151314888E-003 + 868.24094094094096 , 728677731338.13538 , 1.2812494807668688E-002 + 868.24224224224224 , 965310000051.99304 , 1.6973245624106879E-002 + 868.24354354354352 , 1284243264833.9548 , 2.2581110695249939E-002 + 868.24484484484492 , 1712297971688.8855 , 3.0107679077166907E-002 + 868.24614614614609 , 2254489887362.2983 , 3.9641143965135892E-002 + 868.24744744744748 , 2942557059087.4121 , 5.1739562272057907E-002 + 868.24874874874877 , 3800580302643.6265 , 6.6826352857548177E-002 + 868.25005005005005 , 4851179545196.6123 , 8.5299241619178151E-002 + 868.25135135135133 , 6119646526597.8271 , 0.10760294075958823 + 868.25265265265261 , 7663225335963.2539 , 0.13474398410702867 + 868.25395395395401 , 9398951434261.5449 , 0.16526359020928391 + 868.25525525525529 , 11360706174596.414 , 0.19975750141798829 + 868.25655655655657 , 13529866138125.645 , 0.23789825857633529 + 868.25785785785786 , 15873602715927.711 , 0.27910862993682006 + 868.25915915915914 , 18344281891026.195 , 0.32255105741596773 + 868.26046046046054 , 20962357127403.156 , 0.36858517820301279 + 868.26176176176170 , 23488229692924.602 , 0.41299808168697089 + 868.26306306306310 , 25905418768229.238 , 0.45549998245089396 + 868.26436436436438 , 28128666565120.941 , 0.49459177640000468 + 868.26566566566567 , 30066464156178.992 , 0.52866444445540095 + 868.26696696696706 , 31632646588823.570 , 0.55620293167811319 + 868.26826826826823 , 32769365768746.203 , 0.57619008389348036 + 868.26956956956963 , 33361531023725.359 , 0.58660223966339697 + 868.27087087087091 , 33472368260392.738 , 0.58855111227179291 + 868.27217217217219 , 33211619086144.391 , 0.58396630951837758 + 868.27347347347347 , 32442513368136.715 , 0.57044297584016967 + 868.27477477477476 , 31184732241222.770 , 0.54832716841957108 + 868.27607607607615 , 29458468417750.320 , 0.51797393960456306 + 868.27737737737743 , 27381756134883.445 , 0.48145870809375979 + 868.27867867867860 , 25077777361861.051 , 0.44094740615743833 + 868.27997997998000 , 22613692332422.090 , 0.39762092510890817 + 868.28128128128128 , 20079020292382.922 , 0.35305329907263799 + 868.28258258258268 , 17556150910472.078 , 0.30869320144756635 + 868.28388388388385 , 15083964294398.660 , 0.26522426865332149 + 868.28518518518513 , 12747488647606.896 , 0.22414156794296416 + 868.28648648648652 , 10649690371846.846 , 0.18725557737539483 + 868.28778778778781 , 8767766295385.6133 , 0.15416534439445584 + 868.28908908908909 , 7115345239653.8271 , 0.12511050718998670 + 868.29039039039037 , 5694025754742.9697 , 0.10011917337587502 + 868.29169169169165 , 4487557297041.5303 , 7.8905606521849456E-002 + 868.29299299299305 , 3477526660243.4014 , 6.1146043669829363E-002 + 868.29429429429433 , 2683571623957.2622 , 4.7185779680204702E-002 + 868.29559559559561 , 2050727376960.6768 , 3.6058357701574999E-002 + 868.29689689689690 , 1554900045201.0735 , 2.7340130510664522E-002 + 868.29819819819818 , 1172795343613.3818 , 2.0621510210945476E-002 + 868.29949949949957 , 882496154056.97998 , 1.5517123901038829E-002 + 868.30080080080074 , 660750527048.31201 , 1.1618128073301745E-002 + 868.30210210210214 , 503758359791.88531 , 8.8577047889310916E-003 + 868.30340340340342 , 389045230839.99982 , 6.8406819725775822E-003 + 868.30470470470470 , 305920299303.71100 , 5.3790805122396253E-003 + 868.30600600600599 , 245982348809.53830 , 4.3251802039147458E-003 + 868.30730730730727 , 202786233976.51596 , 3.5656548193969758E-003 + 868.30860860860867 , 170791871937.21213 , 3.0030920131948117E-003 + 868.30990990990995 , 148130258177.46329 , 2.6046287156206499E-003 + 868.31121121121123 , 131235777015.67082 , 2.3075700225764838E-003 + 868.31251251251251 , 118251089251.07657 , 2.0792579821493945E-003 + 868.31381381381379 , 107975288209.69641 , 1.8985768212697225E-003 + 868.31511511511519 , 99588702190.050201 , 1.7511140967262600E-003 + 868.31641641641636 , 92388892136.535965 , 1.6245186890808103E-003 + 868.31771771771776 , 86285289560.593338 , 1.5171981069573247E-003 + 868.31901901901904 , 80960337282.413498 , 1.4235686856166453E-003 + 868.32032032032032 , 76186498448.071472 , 1.3396296012880993E-003 + 868.32162162162160 , 71857979358.624435 , 1.2635206631500071E-003 + 868.32292292292288 , 67901688466.965187 , 1.1939566891075006E-003 + 868.32422422422428 , 64203332326.563126 , 1.1289280420398251E-003 + 868.32552552552556 , 60805898295.863617 , 1.0691905630587999E-003 + 868.32682682682685 , 57716296740.605003 , 1.0148657652051406E-003 + 868.32812812812813 , 54851413143.952370 , 9.6449223000964030E-004 + 868.32942942942941 , 52190965966.124023 , 9.1771334357059419E-004 + 868.33073073073081 , 49717328205.869560 , 8.7421916701204956E-004 + 868.33203203203209 , 47388467336.205841 , 8.3327064225901951E-004 + 868.33333333333326 , 45201328954.452011 , 7.9481404924956994E-004 + 868.33463463463465 , 43209152130.472069 , 7.5978550599882044E-004 + 868.33593593593594 , 41348956536.162056 , 7.2707761798307597E-004 + 868.33723723723733 , 39610329303.654060 , 6.9650729424555540E-004 + 868.33853853853850 , 37983739034.702637 , 6.6790694246944191E-004 + 868.33983983983990 , 36451695303.503426 , 6.4096903192576121E-004 + 868.34114114114118 , 34986223057.646156 , 6.1520166220288205E-004 + 868.34244244244246 , 33651607641.382732 , 5.9173517536362859E-004 + 868.34374374374374 , 32397748351.347942 , 5.6968864330766012E-004 + 868.34504504504503 , 31218600300.895111 , 5.4895577833863796E-004 + 868.34634634634642 , 30108613844.237675 , 5.2943900007617695E-004 + 868.34764764764770 , 29062764128.236855 , 5.1104996092320241E-004 + 868.34894894894887 , 28043724529.143333 , 4.9313233521129792E-004 + 868.35025025025027 , 27115801684.103230 , 4.7681683360814906E-004 + 868.35155155155155 , 26238804324.283524 , 4.6139676937724408E-004 + 868.35285285285295 , 25409221573.062492 , 4.4681041103485032E-004 + 868.35415415415423 , 24623813783.858490 , 4.3300079538175011E-004 + 868.35545545545540 , 23879792430.468990 , 4.1991889479967552E-004 + 868.35675675675679 , 23154562926.011982 , 4.0716742647696800E-004 + 868.35805805805808 , 22482788286.263458 , 3.9535586376780030E-004 + 868.35935935935947 , 21848733381.720005 , 3.8420754032153986E-004 + 868.36066066066064 , 21246056008.598476 , 3.7361094042764870E-004 + 868.36196196196192 , 20672830233.264866 , 3.6353220035668845E-004 + 868.36326326326332 , 20127337997.088394 , 3.5394111249686374E-004 + 868.36456456456460 , 19596663991.776299 , 3.4461059480971783E-004 + 868.36586586586589 , 19096713346.548923 , 3.3582028756254270E-004 + 868.36716716716717 , 18626207921.064945 , 3.2754772854879294E-004 + 868.36846846846845 , 18177381567.749489 , 3.1965636403175963E-004 + 868.36976976976985 , 17749047893.603958 , 3.1212533400551325E-004 + 868.37107107107101 , 17340094488.175587 , 3.0493507893660068E-004 + 868.37237237237241 , 16943557566.634747 , 2.9796316708786068E-004 + 868.37367367367369 , 16564041784.459965 , 2.9129053846455597E-004 + 868.37497497497498 , 16208332882.682001 , 2.8503651804834929E-004 + 868.37627627627626 , 15868184278.997677 , 2.7905610556201341E-004 + 868.37757757757754 , 15542838918.874939 , 2.7333599040678662E-004 + 868.37887887887894 , 15231572434.162628 , 2.6786343611366365E-004 + 868.38018018018022 , 14931021887.835054 , 2.6257932369387306E-004 + 868.38148148148150 , 14639178100.837133 , 2.5744830767087762E-004 + 868.38278278278278 , 14367032773.821314 , 2.5266365910539123E-004 + 868.38408408408407 , 14106430966.006083 , 2.4808199193968793E-004 + 868.38538538538546 , 13856879799.841480 , 2.4369464094870625E-004 + 868.38668668668674 , 13617892952.501638 , 2.3949305531380374E-004 + 868.38798798798803 , 13388396456.834740 , 2.3545836122811772E-004 + 868.38928928928931 , 13162498836.931080 , 2.3148695902027762E-004 + 868.39059059059059 , 12953182947.238325 , 2.2780711985613821E-004 + 868.39189189189199 , 12752705848.374327 , 2.2428270616759447E-004 + 868.39319319319316 , 12560738003.147646 , 2.2090792478675318E-004 + 868.39449449449455 , 12376949649.679235 , 2.1767697788669128E-004 + 868.39579579579583 , 12201380183.387053 , 2.1459056517956685E-004 + 868.39709709709712 , 12027343197.482536 , 2.1153112136501376E-004 + 868.39839839839840 , 11866455017.201445 , 2.0870287532270666E-004 + 868.39969969969968 , 11712889380.481262 , 2.0600339704317659E-004 + 868.40100100100108 , 11566087178.431055 , 2.0342285615444061E-004 + 868.40230230230236 , 11425830509.765257 , 2.0095742203217386E-004 + 868.40360360360353 , 11292045359.101583 , 1.9860579635521701E-004 + 868.40490490490492 , 11161073262.317142 , 1.9630366999164755E-004 + 868.40620620620621 , 11038332778.160990 , 1.9414627704090909E-004 + 868.40750750750760 , 10922627883.354660 , 1.9211260967443922E-004 + 868.40880880880877 , 10812492340.543875 , 1.9017688665966387E-004 + 868.41011011011005 , 10707790530.517971 , 1.8833672454441621E-004 + 868.41141141141145 , 10608379196.146957 , 1.8658960500133844E-004 + 868.41271271271273 , 10512698277.590231 , 1.8490812472867903E-004 + 868.41401401401413 , 10422028349.306231 , 1.8331475145772025E-004 + 868.41531531531530 , 10338062327.142229 , 1.8183927328680618E-004 + 868.41661661661658 , 10258870982.988323 , 1.8044777010046062E-004 + 868.41791791791798 , 10184383227.234268 , 1.7913899354181611E-004 + 868.41921921921926 , 10114509230.061272 , 1.7791136487335947E-004 + 868.42052052052054 , 10048753565.442646 , 1.7675619819676870E-004 + 868.42182182182182 , 9986333763.2088680 , 1.7565969844993975E-004 + 868.42312312312322 , 9930155420.6251945 , 1.7467296082074519E-004 + 868.42442442442450 , 9878264476.4715786 , 1.7376163485662705E-004 + 868.42572572572567 , 9830644527.6089802 , 1.7292543431041263E-004 + 868.42702702702707 , 9787249435.2171154 , 1.7216354889910078E-004 + 868.42832832832835 , 9748276195.9265499 , 1.7147946422726496E-004 + 868.42962962962974 , 9711897064.2624626 , 1.7084102337577882E-004 + 868.43093093093091 , 9681266392.8613110 , 1.7030367290567683E-004 + 868.43223223223220 , 9654713390.9642105 , 1.6983805317584674E-004 + 868.43353353353359 , 9632244836.2989693 , 1.6944428526865124E-004 + 868.43483483483487 , 9613860935.6255646 , 1.6912237434994984E-004 + 868.43613613613616 , 9600135335.9940319 , 1.6888242348589804E-004 + 868.43743743743744 , 9589108796.6876965 , 1.6868998824605844E-004 + 868.43873873873872 , 9583297497.2146130 , 1.6858926300194677E-004 + 868.44004004004012 , 9581601591.5736217 , 1.6856094094001045E-004 + 868.44134134134129 , 9584040311.6141262 , 1.6860536162442808E-004 + 868.44264264264268 , 9590663755.8490124 , 1.6872340824846364E-004 + 868.44394394394396 , 9601878764.3099041 , 1.6892224310779023E-004 + 868.44524524524525 , 9617502295.4834042 , 1.6919868765325513E-004 + 868.44654654654664 , 9637007646.7834892 , 1.6954339008662928E-004 + 868.44784784784781 , 9661165720.0731449 , 1.6996995579396327E-004 + 868.44914914914921 , 9689763519.7814312 , 1.7047464060877921E-004 + 868.45045045045049 , 9722907867.0605373 , 1.7105932608716605E-004 + 868.45175175175177 , 9760686456.1451092 , 1.7172555666982676E-004 + 868.45305305305305 , 9805090877.4487782 , 1.7250841912460339E-004 + 868.45435435435434 , 9852435870.4892826 , 1.7334299621384343E-004 + 868.45565565565573 , 9905105967.8926086 , 1.7427127050962735E-004 + 868.45695695695701 , 9962826060.1113930 , 1.7528841056344428E-004 + 868.45825825825830 , 10025773159.733355 , 1.7639753344941757E-004 + 868.45955955955958 , 10094095796.532419 , 1.7760125427055854E-004 + 868.46086086086086 , 10170260115.578871 , 1.7894300287194789E-004 + 868.46216216216226 , 10250549551.709660 , 1.8035733584793515E-004 + 868.46346346346343 , 10336460564.296040 , 1.8187058377021884E-004 + 868.46476476476482 , 10428439962.285957 , 1.8349062700698138E-004 + 868.46606606606611 , 10526749627.533466 , 1.8522207644701012E-004 + 868.46736736736739 , 10631624919.755014 , 1.8706907548283528E-004 + 868.46866866866867 , 10745739493.624514 , 1.8907869854858887E-004 + 868.46996996996995 , 10866519318.759100 , 1.9120563288044392E-004 + 868.47127127127135 , 10993211114.522808 , 1.9343659301593910E-004 + 868.47257257257263 , 11127590274.574551 , 1.9580284930420736E-004 + 868.47387387387380 , 11270003137.621727 , 1.9831049865241904E-004 + 868.47517517517520 , 11420823352.868267 , 2.0096611871488857E-004 + 868.47647647647648 , 11582582443.480780 , 2.0381427571558797E-004 + 868.47777777777787 , 11755477649.287495 , 2.0685845250811838E-004 + 868.47907907907916 , 11934643140.961451 , 2.1001296187340366E-004 + 868.48038038038032 , 12123986676.905029 , 2.1334661144914671E-004 + 868.48168168168172 , 12324002407.302721 , 2.1686809929361673E-004 + 868.48298298298300 , 12535278462.355549 , 2.2058777849644638E-004 + 868.48428428428440 , 12759694926.364538 , 2.2453874347353364E-004 + 868.48558558558557 , 13002691285.155579 , 2.2881676374682727E-004 + 868.48688688688685 , 13252494621.693956 , 2.3321456342630467E-004 + 868.48818818818825 , 13516379754.632492 , 2.3786021998084309E-004 + 868.48948948948953 , 13795109822.120687 , 2.4276716552373698E-004 + 868.49079079079081 , 14089628993.487852 , 2.4795202033949269E-004 + 868.49209209209209 , 14400914658.629326 , 2.5343198881510351E-004 + 868.49339339339338 , 14741438141.132135 , 2.5942661154162365E-004 + 868.49469469469477 , 15091398623.876163 , 2.6558731784078095E-004 + 868.49599599599594 , 15461221834.383112 , 2.7209763624889407E-004 + 868.49729729729734 , 15852724525.564999 , 2.7898954731959128E-004 + 868.49859859859862 , 16267470898.860014 , 2.8629058539940747E-004 + 868.49989989990002 , 16707101000.467464 , 2.9402961895801810E-004 + 868.50120120120118 , 17186220196.141808 , 3.0246374671363260E-004 + 868.50250250250247 , 17687170370.931126 , 3.1128212805223463E-004 + 868.50380380380386 , 18215109642.450542 , 3.2057555871994647E-004 + 868.50510510510514 , 18776323883.627708 , 3.3045468834086867E-004 + 868.50640640640654 , 19373428614.856117 , 3.4096555635238689E-004 + 868.50770770770771 , 20009245484.005718 , 3.5215782997450869E-004 + 868.50900900900899 , 20700616347.672756 , 3.6432797028385902E-004 + 868.51031031031039 , 21437057312.368702 , 3.7729142955362707E-004 + 868.51161161161167 , 22212138005.257984 , 3.9093501194257846E-004 + 868.51291291291295 , 23040419341.191532 , 4.0551502824876710E-004 + 868.51421421421423 , 23926320583.407509 , 4.2110926680701059E-004 + 868.51551551551552 , 24874702511.178104 , 4.3780328801889927E-004 + 868.51681681681691 , 25904168386.434910 , 4.5592455358141695E-004 + 868.51811811811808 , 27021825276.699299 , 4.7559816292717114E-004 + 868.51941941941948 , 28197110633.677826 , 4.9628613544472702E-004 + 868.52072072072076 , 29459951506.003860 , 5.1851526066081963E-004 + 868.52202202202204 , 30818074300.357784 , 5.4242153869210965E-004 + 868.52332332332332 , 32280208998.277225 , 5.6815863621897228E-004 + 868.52462462462461 , 33865350925.723213 , 5.9606091292498250E-004 + 868.52592592592600 , 35621565608.795120 , 6.2697443032678493E-004 + 868.52722722722729 , 37471365266.809616 , 6.5953521925162916E-004 + 868.52852852852845 , 39478235894.186905 , 6.9486077899732091E-004 + 868.52982982982985 , 41664032408.121841 , 7.3333579993186651E-004 + 868.53113113113113 , 44058503865.591095 , 7.7548392851795002E-004 + 868.53243243243253 , 46703361731.763359 , 8.2203937347411936E-004 + 868.53373373373370 , 49770045101.301498 , 8.7601983307151814E-004 + 868.53503503503509 , 53164255984.588753 , 9.3576543995049831E-004 + 868.53633633633638 , 57106350927.952972 , 1.0051549424167909E-003 + 868.53763763763766 , 61812294394.283936 , 1.0879897621294916E-003 + 868.53893893893905 , 67599181561.108078 , 1.1898514355929268E-003 + 868.54024024024022 , 74936618925.303162 , 1.3190060145549299E-003 + 868.54154154154162 , 84846044351.477142 , 1.4934329412313856E-003 + 868.54284284284290 , 98010612748.311432 , 1.7251571460213120E-003 + 868.54414414414418 , 115890131728.26323 , 2.0398742874111410E-003 + 868.54544544544547 , 140584455605.21893 , 2.4745461719101022E-003 + 868.54674674674675 , 174839821958.87415 , 3.0775122966107508E-003 + 868.54804804804814 , 222309271539.98563 , 3.9130737813966995E-003 + 868.54934934934943 , 289487790207.25946 , 5.0955559011797305E-003 + 868.55065065065060 , 381843520374.71796 , 6.7212093318533466E-003 + 868.55195195195199 , 505453270651.45001 , 8.8969985509331617E-003 + 868.55325325325327 , 670476477986.12390 , 1.1801750794602658E-002 + 868.55455455455467 , 887568185380.54468 , 1.5623016993111472E-002 + 868.55585585585584 , 1168703922989.2139 , 2.0571591399904113E-002 + 868.55715715715712 , 1532562355299.9893 , 2.6976257386419740E-002 + 868.55845845845852 , 1995395323262.6040 , 3.5123081170812989E-002 + 868.55975975975980 , 2554536227252.5371 , 4.4965125044190132E-002 + 868.56106106106108 , 3229106192800.8286 , 5.6838960614293089E-002 + 868.56236236236236 , 4027402600021.4683 , 7.0890639036867653E-002 + 868.56366366366365 , 4953522160787.0859 , 8.7192270967662147E-002 + 868.56496496496504 , 6013041564411.7734 , 0.10584201774684313 + 868.56626626626633 , 7221422770979.5039 , 0.12711204205099641 + 868.56756756756761 , 8499577529823.2324 , 0.14961022606902541 + 868.56886886886889 , 9853180553595.4688 , 0.17343645656162937 + 868.57017017017017 , 11249299786657.572 , 0.19801106081255654 + 868.57147147147157 , 12647776152413.596 , 0.22262715550162979 + 868.57277277277274 , 14002658219983.793 , 0.24647589981819029 + 868.57407407407413 , 15302393782871.334 , 0.26935395089330288 + 868.57537537537542 , 16408588020043.592 , 0.28882527185211948 + 868.57667667667670 , 17316715245563.521 , 0.30481020121415792 + 868.57797797797798 , 17985387773602.250 , 0.31658022957463483 + 868.57927927927926 , 18381570720932.637 , 0.32355387424238741 + 868.58058058058066 , 18499416190103.863 , 0.32562820005266885 + 868.58188188188194 , 18410000690068.395 , 0.32405430148597197 + 868.58318318318322 , 18039893234753.824 , 0.31753964035757370 + 868.58448448448451 , 17395411515841.236 , 0.30619542119685339 + 868.58578578578579 , 16508124530890.725 , 0.29057732405646958 + 868.58708708708718 , 15419840312406.975 , 0.27142125731409250 + 868.58838838838835 , 14178526820154.961 , 0.24957155688704766 + 868.58968968968975 , 12806537676733.404 , 0.22542169305837290 + 868.59099099099103 , 11389984662929.834 , 0.20048741236485568 + 868.59229229229231 , 9991609981791.9082 , 0.17587310815430157 + 868.59359359359360 , 8632501455974.2285 , 0.15194996999173496 + 868.59489489489488 , 7346229960585.7930 , 0.12930891514091711 + 868.59619619619627 , 6158394571460.2266 , 0.10840054061138378 + 868.59749749749756 , 5073759182035.7764 , 8.9308700845831410E-002 + 868.59879879879884 , 4112888955116.2183 , 7.2395385501918152E-002 + 868.60010010010012 , 3302709318226.5347 , 5.8134538136583126E-002 + 868.60140140140140 , 2616819968229.5000 , 4.6061458477673158E-002 + 868.60270270270280 , 2047219397224.2849 , 3.6035303330984876E-002 + 868.60400400400408 , 1582945863506.2729 , 2.7863123232492137E-002 + 868.60530530530525 , 1209425889743.6470 , 2.1288394655463134E-002 + 868.60660660660665 , 911550840381.54358 , 1.6045174170684455E-002 + 868.60790790790793 , 689054706379.76770 , 1.2128779460234137E-002 + 868.60920920920933 , 519627500651.90900 , 9.1465083297434489E-003 + 868.61051051051049 , 392494664147.93488 , 6.9087061115344628E-003 + 868.61181181181189 , 298370126872.21667 , 5.2519186517128984E-003 + 868.61311311311317 , 229494051302.30505 , 4.0395566625764882E-003 + 868.61441441441445 , 178317243270.31735 , 3.1387386184609863E-003 + 868.61571571571574 , 142995101219.71564 , 2.5169956849239060E-003 + 868.61701701701702 , 117524830992.21370 , 2.0686662003424638E-003 + 868.61831831831842 , 99079027557.263794 , 1.7439819473821408E-003 + 868.61961961961970 , 85583329046.351349 , 1.5064298417439589E-003 + 868.62092092092087 , 75539482955.497803 , 1.3296375223629934E-003 + 868.62222222222226 , 67720091637.219742 , 1.1920002414163766E-003 + 868.62352352352355 , 61743365734.559547 , 1.0867977008077031E-003 + 868.62482482482494 , 56934339156.967781 , 1.0021491006889979E-003 + 868.62612612612622 , 52912027443.924385 , 9.3134831889335912E-004 + 868.62742742742739 , 49457189992.008690 , 8.7053626371481278E-004 + 868.62872872872879 , 46424048685.184486 , 8.1714693852589734E-004 + 868.63003003003007 , 43664265880.606575 , 7.6856929694474145E-004 + 868.63133133133147 , 41191955796.631752 , 7.2505176973907792E-004 + 868.63263263263264 , 38968782803.601395 , 6.8591957515692285E-004 + 868.63393393393392 , 36926785545.342789 , 6.4997645224349268E-004 + 868.63523523523531 , 35043216190.247269 , 6.1682198815631300E-004 + 868.63653653653660 , 33300897410.297066 , 5.8615382884817451E-004 + 868.63783783783788 , 31664708682.950771 , 5.5735378368454533E-004 + 868.63913913913916 , 30138840190.910122 , 5.3049560301411582E-004 + 868.64044044044044 , 28751123845.457237 , 5.0606918773857051E-004 + 868.64174174174184 , 27459530863.946217 , 4.8333474806624293E-004 + 868.64304304304301 , 26255716465.388397 , 4.6214539133139460E-004 + 868.64434434434440 , 25132841408.315216 , 4.4238073664885262E-004 + 868.64564564564569 , 24077305983.629406 , 4.2380140343765477E-004 + 868.64694694694697 , 23072789835.459808 , 4.0612011678057679E-004 + 868.64824824824825 , 22159960288.283333 , 3.9005270424276084E-004 + 868.64954954954953 , 21305347747.157692 , 3.7501003880172009E-004 + 868.65085085085093 , 20503842696.779350 , 3.6090217283187844E-004 + 868.65215215215221 , 19751646344.221607 , 3.4766224400465252E-004 + 868.65345345345349 , 19044747677.210426 , 3.3521965214994374E-004 + 868.65475475475478 , 18358459859.397236 , 3.2313985745889741E-004 + 868.65605605605606 , 17735404068.331505 , 3.1217307710583041E-004 + 868.65735735735745 , 17148574081.413509 , 3.0184395287875544E-004 + 868.65865865865874 , 16594908631.868586 , 2.9209859333976666E-004 + 868.65995995996002 , 16072086206.170465 , 2.8289613596664271E-004 + 868.66126126126130 , 15578004029.409946 , 2.7419957006112556E-004 + 868.66256256256258 , 15097883675.027781 , 2.6574876674022828E-004 + 868.66386386386398 , 14654017151.036865 , 2.5793610548855437E-004 + 868.66516516516515 , 14236604225.331039 , 2.5058908902475887E-004 + 868.66646646646655 , 13840826508.922312 , 2.4362290050415134E-004 + 868.66776776776783 , 13465050600.682327 , 2.3700878527239581E-004 + 868.66906906906911 , 13108222050.046261 , 2.3072818632114049E-004 + 868.67037037037039 , 12761869199.744610 , 2.2463198898990572E-004 + 868.67167167167167 , 12435882573.061468 , 2.1889427919717281E-004 + 868.67297297297307 , 12130268572.001438 , 2.1351517605521048E-004 + 868.67427427427435 , 11839584799.185034 , 2.0839888360335972E-004 + 868.67557557557552 , 11562371906.663958 , 2.0351970530431895E-004 + 868.67687687687692 , 11298223768.173828 , 1.9887049820421852E-004 + 868.67817817817820 , 11042597682.957968 , 1.9437130460434404E-004 + 868.67947947947960 , 10797857739.748018 , 1.9006373198839524E-004 + 868.68078078078076 , 10569474868.926456 , 1.8604408270481685E-004 + 868.68208208208205 , 10352069347.060986 , 1.8221767081940256E-004 + 868.68338338338344 , 10144007085.423149 , 1.7855571679386697E-004 + 868.68468468468473 , 9945354771.3355961 , 1.7505940298603897E-004 + 868.68598598598601 , 9754023444.3330421 , 1.7169196188270339E-004 + 868.68728728728729 , 9567815306.2378292 , 1.6841470450587728E-004 + 868.68858858858857 , 9395234213.2355652 , 1.6537731646408448E-004 + 868.68988988988997 , 9230990639.5691757 , 1.6248670178357634E-004 + 868.69119119119125 , 9073651041.4541054 , 1.5971761120439013E-004 + 868.69249249249253 , 8923262033.0316639 , 1.5707087096337828E-004 + 868.69379379379382 , 8779408602.3322983 , 1.5453917947036257E-004 + 868.69509509509521 , 8637122789.7298412 , 1.5203508917861099E-004 + 868.69639639639649 , 8506539317.6666059 , 1.4973699061957490E-004 + 868.69769769769766 , 8382443288.3298120 , 1.4755310083433703E-004 + 868.69899899899906 , 8263888052.0928631 , 1.4546674646299983E-004 + 868.70030030030034 , 8150543914.2939444 , 1.4347212278287248E-004 + 868.70160160160174 , 8042471839.4904184 , 1.4157030877627502E-004 + 868.70290290290291 , 7935997691.9305553 , 1.3969663275347985E-004 + 868.70420420420419 , 7837610579.6229153 , 1.3796531334083316E-004 + 868.70550550550558 , 7745170569.5841131 , 1.3633869212364175E-004 + 868.70680680680687 , 7657596881.9139738 , 1.3479774264706470E-004 + 868.70810810810815 , 7573966573.3510303 , 1.3332620795966453E-004 + 868.70940940940943 , 7494712232.9910536 , 1.3193171193189306E-004 + 868.71071071071071 , 7417445588.3080950 , 1.3057221846549509E-004 + 868.71201201201211 , 7345572221.4593315 , 1.2930766841647511E-004 + 868.71331331331328 , 7279298471.0211678 , 1.2814170050455057E-004 + 868.71461461461467 , 7217784306.8934002 , 1.2705953713897455E-004 + 868.71591591591596 , 7159239151.6739197 , 1.2602963564372098E-004 + 868.71721721721724 , 7104534312.2608376 , 1.2506734746055086E-004 + 868.71851851851864 , 7052222542.9021320 , 1.2414720147408120E-004 + 868.71981981981980 , 7003520646.2373352 , 1.2329061137105642E-004 + 868.72112112112120 , 6960150983.5687695 , 1.2252789750598445E-004 + 868.72242242242248 , 6921870467.6276426 , 1.2185480362584138E-004 + 868.72372372372377 , 6885866368.2676916 , 1.2122177940064268E-004 + 868.72502502502505 , 6853412316.8668995 , 1.2065126354860245E-004 + 868.72632632632633 , 6823845144.4343214 , 1.2013158652497989E-004 + 868.72762762762773 , 6796749508.1181183 , 1.1965543484810736E-004 + 868.72892892892901 , 6775112110.7924356 , 1.1927538264813372E-004 + 868.73023023023029 , 6758424516.3638077 , 1.1898250274776007E-004 + 868.73153153153157 , 6744482058.0930223 , 1.1873795669290302E-004 + 868.73283283283286 , 6733717967.6867676 , 1.1854937763536492E-004 + 868.73413413413425 , 6726426095.7208223 , 1.1842194726518099E-004 + 868.73543543543542 , 6721036160.8543282 , 1.1832802475132539E-004 + 868.73673673673682 , 6721417701.5885105 , 1.1833572299925210E-004 + 868.73803803803810 , 6726808027.8924141 , 1.1843163801463039E-004 + 868.73933933933938 , 6735994148.6543951 , 1.1859440137968465E-004 + 868.74064064064066 , 6748096167.3606853 , 1.1880851274630873E-004 + 868.74194194194195 , 6764162223.9821167 , 1.1909243965357975E-004 + 868.74324324324334 , 6782886106.1847401 , 1.1942319149204630E-004 + 868.74454454454462 , 6807157435.5555048 , 1.1985163200312212E-004 + 868.74584584584579 , 6836962415.6540384 , 1.2037753593643133E-004 + 868.74714714714719 , 6872427583.7346191 , 1.2100313703929498E-004 + 868.74844844844847 , 6910633884.7030325 , 1.2167701110448785E-004 + 868.74974974974987 , 6953606102.2469511 , 1.2243483014451225E-004 + 868.75105105105115 , 7000534102.1541462 , 1.2326233788128527E-004 + 868.75235235235232 , 7053215804.7432146 , 1.2419118181102400E-004 + 868.75365365365371 , 7112181676.6220999 , 1.2523071034822376E-004 + 868.75495495495500 , 7179910140.6351900 , 1.2642459393614211E-004 + 868.75625625625639 , 7250298941.1622391 , 1.2766533005362362E-004 + 868.75755755755756 , 7326844813.2852774 , 1.2901452109649538E-004 + 868.75885885885884 , 7409177366.7000952 , 1.3046565412784251E-004 + 868.76016016016024 , 7498339787.6654749 , 1.3203709263724466E-004 + 868.76146146146152 , 7595376197.3188229 , 1.3374722319715215E-004 + 868.76276276276280 , 7704562560.2456141 , 1.3567138610327215E-004 + 868.76406406406409 , 7818211394.5560837 , 1.3767415193761240E-004 + 868.76536536536537 , 7939788876.4974623 , 1.3981658438935168E-004 + 868.76666666666677 , 8070003604.6981850 , 1.4211117477963027E-004 + 868.76796796796793 , 8209383619.2316036 , 1.4456722285030580E-004 + 868.76926926926933 , 8359841280.5660381 , 1.4721840112565484E-004 + 868.77057057057061 , 8525949509.3558340 , 1.5014528372229619E-004 + 868.77187187187189 , 8701966695.9781265 , 1.5324672143269728E-004 + 868.77317317317318 , 8888250030.6094933 , 1.5652900711701426E-004 + 868.77447447447446 , 9087833864.0143108 , 1.6004560044521681E-004 + 868.77577577577586 , 9301037150.5008469 , 1.6380212818755722E-004 + 868.77707707707714 , 9530719957.1951160 , 1.6784895005592557E-004 + 868.77837837837853 , 9781641757.1814041 , 1.7226992866020645E-004 + 868.77967967967970 , 10052490894.088661 , 1.7704195687885462E-004 + 868.78098098098098 , 10337548073.756195 , 1.8206427857401413E-004 + 868.78228228228238 , 10643635181.208721 , 1.8745707645937559E-004 + 868.78358358358366 , 10971780673.919960 , 1.9323847781722278E-004 + 868.78488488488495 , 11325285740.292189 , 1.9946661759025010E-004 + 868.78618618618623 , 11709070375.865238 , 2.0622818069703663E-004 + 868.78748748748751 , 12131200174.368704 , 2.1366526003813836E-004 + 868.78878878878891 , 12574005796.072344 , 2.2146657642177481E-004 + 868.79009009009008 , 13051100268.322227 , 2.2987195087711607E-004 + 868.79139139139147 , 13564973918.243523 , 2.3892526271835618E-004 + 868.79269269269275 , 14119828178.104216 , 2.4870051368650791E-004 + 868.79399399399404 , 14719567377.889990 , 2.5926648860988445E-004 + 868.79529529529532 , 15392496297.646204 , 2.7112183460112924E-004 + 868.79659659659660 , 16098038619.519726 , 2.8355172200238951E-004 + 868.79789789789800 , 16863870658.655895 , 2.9704372303665565E-004 + 868.79919919919928 , 17697447684.926788 , 3.1172918290058417E-004 + 868.80050050050045 , 18609547611.162022 , 3.2779796637493906E-004 + 868.80180180180184 , 19614766502.973877 , 3.4550720807012162E-004 + 868.80310310310313 , 20768220890.751755 , 3.6582789721303086E-004 + 868.80440440440452 , 22049624459.418674 , 3.8840265150705993E-004 + 868.80570570570569 , 23516419405.524845 , 4.1424342578368789E-004 + 868.80700700700709 , 25247176145.951576 , 4.4473439445026641E-004 + 868.80830830830837 , 27347938390.679066 , 4.8174371681033708E-004 + 868.80960960960965 , 29977120914.522297 , 5.2806216589124067E-004 + 868.81091091091105 , 33455397066.629768 , 5.8933902580925570E-004 + 868.81221221221222 , 38086863422.005577 , 6.7093154215429687E-004 + 868.81351351351361 , 44303291224.089684 , 7.8044619512313452E-004 + 868.81481481481489 , 52856573725.900230 , 9.3112903230767406E-004 + 868.81611611611618 , 64709204537.866272 , 1.1399362299677287E-003 + 868.81741741741746 , 81156308164.248856 , 1.4296838817575326E-003 + 868.81871871871874 , 104283208372.92609 , 1.8371089811283561E-003 + 868.82002002002014 , 136691708453.90149 , 2.4080472924524112E-003 + 868.82132132132142 , 180096248602.30951 , 3.1727019741267983E-003 + 868.82262262262259 , 238426102426.78851 , 4.2002947327615600E-003 + 868.82392392392399 , 315712789833.37335 , 5.5618485418155207E-003 + 868.82522522522527 , 416567277223.70380 , 7.3385944220705039E-003 + 868.82652652652666 , 546853217337.46600 , 9.6338318894369588E-003 + 868.82782782782783 , 716714680216.51941 , 1.2626268230381552E-002 + 868.82912912912911 , 922473805406.94519 , 1.6251110866120150E-002 + 868.83043043043051 , 1172966960538.4043 , 2.0664029392801628E-002 + 868.83173173173179 , 1472186060696.0461 , 2.5935349068469504E-002 + 868.83303303303308 , 1822687961330.4597 , 3.2110113806244338E-002 + 868.83433433433436 , 2225043302678.1445 , 3.9198376532289372E-002 + 868.83563563563564 , 2693135718621.4727 , 4.7444724136900845E-002 + 868.83693693693704 , 3194162099762.0166 , 5.6271266817339897E-002 + 868.83823823823832 , 3729834932705.5474 , 6.5708173316559454E-002 + 868.83953953953960 , 4289620236689.4780 , 7.5569867325714510E-002 + 868.84084084084088 , 4858602817990.8779 , 8.5593589042391852E-002 + 868.84214214214217 , 5419203356387.7842 , 9.5469644961039518E-002 + 868.84344344344356 , 5963704583879.3818 , 0.10506208058046128 + 868.84474474474473 , 6449212884222.9434 , 0.11361524243106971 + 868.84604604604613 , 6858660719768.0762 , 0.12082845304249752 + 868.84734734734741 , 7178994746268.1963 , 0.12647175267713751 + 868.84864864864869 , 7394784250795.4854 , 0.13027329967360618 + 868.84994994994997 , 7495113791011.4189 , 0.13204079753709214 + 868.85125125125126 , 7499168109429.3506 , 0.13211222237431605 + 868.85255255255265 , 7406760037508.8486 , 0.13048427685184275 + 868.85385385385393 , 7198349082893.7090 , 0.12681271765006141 + 868.85515515515522 , 6884547705184.6406 , 0.12128450363935736 + 868.85645645645650 , 6480556575644.7441 , 0.11416742385111564 + 868.85775775775778 , 6004783689033.1074 , 0.10578577047700939 + 868.85905905905918 , 5472262400826.3359 , 9.6404384965052686E-002 + 868.86036036036035 , 4899139632130.6943 , 8.6307726356671652E-002 + 868.86166166166174 , 4330015744946.0444 , 7.6281515727548627E-002 + 868.86296296296302 , 3769063158984.0718 , 6.6399258269994321E-002 + 868.86426426426431 , 3231371338503.5234 , 5.6926783892263605E-002 + 868.86556556556559 , 2728931246000.7124 , 4.8075336432013713E-002 + 868.86686686686687 , 2269769327498.5806 , 3.9986317162536276E-002 + 868.86816816816827 , 1848929284591.4126 , 3.2572411364481121E-002 + 868.86946946946955 , 1494922724729.8589 , 2.6335905787808825E-002 + 868.87077077077083 , 1192307381063.1196 , 2.1004755231209097E-002 + 868.87207207207211 , 938573525382.12463 , 1.6534747853468305E-002 + 868.87337337337340 , 729512216322.02783 , 1.2851744763648287E-002 + 868.87467467467479 , 561007582135.38562 , 9.8832119765930627E-003 + 868.87597597597608 , 424345537900.75598 , 7.4756475950814799E-003 + 868.87727727727724 , 320965515806.37341 , 5.6544099829867909E-003 + 868.87857857857864 , 242241252355.58423 , 4.2675309335890770E-003 + 868.87987987987992 , 182747066035.96585 , 3.2194266437240611E-003 + 868.88118118118132 , 138415146201.16830 , 2.4384348105116914E-003 + 868.88248248248249 , 105795367197.86797 , 1.8637748392974444E-003 + 868.88378378378377 , 81685331345.569397 , 1.4390303436228700E-003 + 868.88508508508517 , 64551085922.719849 , 1.1371777988515241E-003 + 868.88638638638645 , 52414774714.536652 , 9.2337346735842964E-004 + 868.88768768768773 , 43648049215.091812 , 7.6893086252929443E-004 + 868.88898898898901 , 37270502181.775635 , 6.5657822721124190E-004 + 868.89029029029041 , 32567197661.849514 , 5.7372058687332381E-004 + 868.89159159159169 , 28989720448.424763 , 5.1069655651402512E-004 + 868.89289289289286 , 26220565778.732979 , 4.6191267967692507E-004 + 868.89419419419426 , 24063196741.504208 , 4.2390658104746095E-004 + 868.89549549549554 , 22283767791.099964 , 3.9255862240989738E-004 + 868.89679679679693 , 20773614368.848904 , 3.6595447106635182E-004 + 868.89809809809822 , 19460754576.118862 , 3.4282602179674010E-004 + 868.89939939939939 , 18290600173.130226 , 3.2221160100757382E-004 + 868.90070070070078 , 17217389460.090408 , 3.0330502844503352E-004 + 868.90200200200206 , 16270399021.941988 , 2.8662206742562785E-004 + 868.90330330330346 , 15402327991.865490 , 2.7132942231014026E-004 + 868.90460460460463 , 14602441310.504469 , 2.5723797733489379E-004 + 868.90590590590591 , 13863166962.448469 , 2.4421433129316822E-004 + 868.90720720720731 , 13178071509.700962 , 2.3214514925773731E-004 + 868.90850850850859 , 12522573898.899708 , 2.2059738903742082E-004 + 868.90980980980987 , 11932801358.636585 , 2.1020750119795498E-004 + 868.91111111111115 , 11384491766.936155 , 2.0054806185716581E-004 + 868.91241241241244 , 10873177948.596256 , 1.9154037529018895E-004 + 868.91371371371383 , 10396072286.991344 , 1.8313532880963790E-004 + 868.91501501501500 , 9950400649.2694416 , 1.7528405124348414E-004 + 868.91631631631640 , 9523780723.2697926 , 1.6776840523759844E-004 + 868.91761761761768 , 9131465859.9301224 , 1.6085710789215391E-004 + 868.91891891891896 , 8767217110.4335384 , 1.5444024814970526E-004 + 868.92022022022024 , 8425320612.0683756 , 1.4841716680012330E-004 + 868.92152152152153 , 8104154531.3068495 , 1.4275929054060832E-004 + 868.92282282282292 , 7802215350.6363926 , 1.3744013084228138E-004 + 868.92412412412421 , 7513240859.1445303 , 1.3234936818895573E-004 + 868.92542542542549 , 7241714161.4481993 , 1.2756598109542100E-004 + 868.92672672672677 , 6989854812.5375872 , 1.2312907130016790E-004 + 868.92802802802805 , 6751876928.2176352 , 1.1893671018984504E-004 + 868.92932932932945 , 6526768960.1540012 , 1.1497107745113159E-004 + 868.93063063063073 , 6313786516.6481361 , 1.1121905654388690E-004 + 868.93193193193201 , 6110021776.3166742 , 1.0762942239740493E-004 + 868.93323323323330 , 5914474890.5750971 , 1.0418456076904397E-004 + 868.93453453453458 , 5733286766.4490309 , 1.0099265554690453E-004 + 868.93583583583597 , 5561044448.4137278 , 9.7958347438863974E-005 + 868.93713713713714 , 5397054900.4624186 , 9.5069428778540377E-005 + 868.93843843843854 , 5241038812.7667007 , 9.2320975054226904E-005 + 868.93973973973982 , 5091958055.3351135 , 8.9694699772496404E-005 + 868.94104104104110 , 4946004598.9915037 , 8.7123517192521150E-005 + 868.94234234234239 , 4811010499.4015312 , 8.4745404034053422E-005 + 868.94364364364367 , 4682030893.3875542 , 8.2473247040556070E-005 + 868.94494494494506 , 4558564104.4713621 , 8.0298210335213421E-005 + 868.94624624624635 , 4440553751.0869341 , 7.8219296556885986E-005 + 868.94754754754752 , 4327568038.1208963 , 7.6228900647786632E-005 + 868.94884884884891 , 4216327995.8414211 , 7.4269257424438865E-005 + 868.95015015015019 , 4112316960.8873487 , 7.2436966406890801E-005 + 868.95145145145159 , 4012987806.7890592 , 7.0687155076945191E-005 + 868.95275275275276 , 3917519621.7394915 , 6.9005363067454364E-005 + 868.95405405405404 , 3825874461.4233398 , 6.7390919331922238E-005 + 868.95535535535544 , 3737822973.9438453 , 6.5839783862107877E-005 + 868.95665665665672 , 3651406880.0329709 , 6.4317458387147861E-005 + 868.95795795795800 , 3569130910.3950968 , 6.2868068559306122E-005 + 868.95925925925928 , 3490860587.4665976 , 6.1489245305857516E-005 + 868.96056056056057 , 3415386166.7043357 , 6.0159677736758842E-005 + 868.96186186186196 , 3342650255.9418483 , 5.8878353533182161E-005 + 868.96316316316324 , 3272570868.3531861 , 5.7643827587190120E-005 + 868.96446446446453 , 3204048789.7910833 , 5.6436736074064703E-005 + 868.96576576576581 , 3137671871.4683127 , 5.5267435129770782E-005 + 868.96706706706721 , 3074785759.8298759 , 5.4159630909267505E-005 + 868.96836836836849 , 3013982580.3926649 , 5.3088521648497785E-005 + 868.96966966966966 , 2955168747.5306144 , 5.2052458601451298E-005 + 868.97097097097105 , 2898375867.6769075 , 5.1051996744896394E-005 + 868.97227227227233 , 2843072137.6401205 , 5.0077768608451789E-005 + 868.97357357357373 , 2788602775.6202974 , 4.9118238959163945E-005 + 868.97487487487490 , 2737217185.7800646 , 4.8213035380059404E-005 + 868.97617617617618 , 2687423566.8548026 , 4.7335877187959110E-005 + 868.97747747747758 , 2639085612.5855255 , 4.6484364088991599E-005 + 868.97877877877886 , 2592326006.0148568 , 4.5660654594366118E-005 + 868.98008008008014 , 2546978905.9083524 , 4.4861828638569223E-005 + 868.98138138138142 , 2501632585.1192541 , 4.4063015941278084E-005 + 868.98268268268271 , 2459003775.1271567 , 4.3312076953570694E-005 + 868.98398398398410 , 2417627517.6927662 , 4.2583203626966270E-005 + 868.98528528528527 , 2377335180.2953405 , 4.1873426762535796E-005 + 868.98658658658667 , 2338288333.0206809 , 4.1185589631381270E-005 + 868.98788788788795 , 2300345372.2651186 , 4.0517199051577093E-005 + 868.98918918918923 , 2262580697.9332609 , 3.9851948893544572E-005 + 868.99049049049063 , 2226504100.3813143 , 3.9216437020804390E-005 + 868.99179179179180 , 2191663998.3934255 , 3.8602707967802893E-005 + 868.99309309309319 , 2157679284.7294965 , 3.8004048988441996E-005 + 868.99439439439448 , 2124649647.3013024 , 3.7422214282700330E-005 + 868.99569569569576 , 2092513591.1692894 , 3.6856120921246419E-005 + 868.99699699699704 , 2060683637.5967262 , 3.6295419739763391E-005 + 868.99829829829832 , 2029800661.4841387 , 3.5751400985928222E-005 + 868.99959959959972 , 2000126200.6324167 , 3.5228672155450828E-005 + 869.00090090090100 , 1971141522.4146168 , 3.4718095609092937E-005 + 869.00220220220228 , 1942888260.4269106 , 3.4220403799269149E-005 + 869.00350350350357 , 1915374465.8477762 , 3.3735738075218267E-005 + 869.00480480480485 , 1888258340.4205952 , 3.3258077681186217E-005 + 869.00610610610624 , 1861550974.6801455 , 3.2787618002697109E-005 + 869.00740740740741 , 1836017036.2976401 , 3.2337830134457010E-005 + 869.00870870870881 , 1811051325.3789222 , 3.1898052827869437E-005 + 869.01001001001009 , 1786641674.3831284 , 3.1468071615739710E-005 + 869.01131131131137 , 1762856984.5652585 , 3.1049099022858368E-005 + 869.01261261261266 , 1739534852.1061828 , 3.0638274916518052E-005 + 869.01391391391394 , 1716228156.5524683 , 3.0227722414854514E-005 + 869.01521521521533 , 1694055835.6445513 , 2.9837153760190797E-005 + 869.01651651651662 , 1672361492.8105509 , 2.9455005485388563E-005 + 869.01781781781779 , 1651083502.5767217 , 2.9080192627833565E-005 + 869.01911911911918 , 1630344309.3376946 , 2.8714870246799918E-005 + 869.02042042042046 , 1610052963.7350860 , 2.8357437236119977E-005 + 869.02172172172186 , 1589668033.3766227 , 2.7998355227563712E-005 + 869.02302302302314 , 1570197084.7515013 , 2.7655374444527500E-005 + 869.02432432432431 , 1551193122.6289167 , 2.7320620210734044E-005 + 869.02562562562571 , 1532501930.7949848 , 2.6991376935738396E-005 + 869.02692692692699 , 1514274603.9841247 , 2.6670304031585735E-005 + 869.02822822822839 , 1496422501.0635350 , 2.6355841066646302E-005 + 869.02952952952955 , 1478583356.3827102 , 2.6041606084936210E-005 + 869.03083083083084 , 1461298480.8674073 , 2.5737135321889539E-005 + 869.03213213213223 , 1444519488.2423079 , 2.5441576363606045E-005 + 869.03343343343352 , 1428008628.4482510 , 2.5150741713078978E-005 + 869.03473473473480 , 1411863352.0430999 , 2.4866346568578288E-005 + 869.03603603603608 , 1396049269.0247660 , 2.4587785465055008E-005 + 869.03733733733736 , 1380330964.5690064 , 2.4310911403621406E-005 + 869.03863863863876 , 1364888097.8844173 , 2.4038889429532042E-005 + 869.03993993993993 , 1349976843.6572723 , 2.3776232555165511E-005 + 869.04124124124132 , 1335300348.9300053 , 2.3517711801987258E-005 + 869.04254254254261 , 1320907035.8118656 , 2.3264179392390733E-005 + 869.04384384384389 , 1306811287.2854970 , 2.3015888393059220E-005 + 869.04514514514517 , 1292875708.6958482 , 2.2770418831737627E-005 + 869.04644644644645 , 1278998498.8109894 , 2.2525977286945433E-005 + 869.04774774774785 , 1265668778.8276043 , 2.2291180571198165E-005 + 869.04904904904913 , 1252548795.0445850 , 2.2060078914805651E-005 + 869.05035035035053 , 1239642221.1567280 , 2.1832736895581630E-005 + 869.05165165165170 , 1227007352.0605118 , 2.1610180541062462E-005 + 869.05295295295298 , 1214582624.4634321 , 2.1391325986328442E-005 + 869.05425425425437 , 1202046803.9503009 , 2.1170514072514096E-005 + 869.05555555555566 , 1190066952.4186287 , 2.0959496379271237E-005 + 869.05685685685694 , 1178278051.9750631 , 2.0751842601946720E-005 + 869.05815815815822 , 1166642973.5760362 , 2.0546899121283770E-005 + 869.05945945945950 , 1155259590.0423419 , 2.0346388634050503E-005 + 869.06076076076090 , 1144065201.7953153 , 2.0149207430807275E-005 + 869.06206206206207 , 1132806550.7990067 , 1.9950893887027651E-005 + 869.06336336336346 , 1121927501.2153528 , 1.9759267525175906E-005 + 869.06466466466475 , 1111283776.5750077 , 1.9571786640364819E-005 + 869.06596596596603 , 1100746473.7056139 , 1.9386181323391496E-005 + 869.06726726726731 , 1090441420.1234086 , 1.9204666343952188E-005 + 869.06856856856859 , 1080301330.6654305 , 1.9026057288435115E-005 + 869.06986986986999 , 1070158341.1376517 , 1.8847396927885994E-005 + 869.07117117117127 , 1060228858.0228726 , 1.8672497680516556E-005 + 869.07247247247244 , 1050566603.0455549 , 1.8502305959894979E-005 + 869.07377377377384 , 1041003820.7623644 , 1.8333867170603176E-005 + 869.07507507507512 , 1031623646.0634152 , 1.8168644612882667E-005 + 869.07637637637652 , 1022399859.6898015 , 1.8006176727755748E-005 + 869.07767767767768 , 1013223133.6982608 , 1.7844537699891394E-005 + 869.07897897897908 , 1004124945.4547608 , 1.7684282065603718E-005 + 869.08028028028036 , 995318272.61524093 , 1.7529161837540735E-005 + 869.08158158158164 , 986606501.32783926 , 1.7375713814327327E-005 + 869.08288288288304 , 978033648.27711177 , 1.7224712742076489E-005 + 869.08418418418421 , 969610902.14002609 , 1.7076355526758960E-005 + 869.08548548548561 , 961275910.51008606 , 1.6929544085881970E-005 + 869.08678678678689 , 952909550.97618032 , 1.6782179851160789E-005 + 869.08808808808817 , 944852921.63001227 , 1.6640271922750460E-005 + 869.08938938938945 , 936888399.03374398 , 1.6499986782912878E-005 + 869.09069069069074 , 929024162.29974377 , 1.6361468368129167E-005 + 869.09199199199213 , 921305487.47538507 , 1.6225513599030579E-005 + 869.09329329329341 , 913694675.86078227 , 1.6091458868896851E-005 + 869.09459459459458 , 906001944.22954881 , 1.5955960783270135E-005 + 869.09589589589598 , 898593249.31795871 , 1.5825466374961956E-005 + 869.09719719719726 , 891288205.33891666 , 1.5696797962856124E-005 + 869.09849849849866 , 884049145.14738786 , 1.5569292305788813E-005 + 869.09979979979983 , 876952417.29002130 , 1.5444293269936557E-005 + 869.10110110110111 , 869951236.64246464 , 1.5320977313332617E-005 + 869.10240240240250 , 862912764.58427262 , 1.5197004230044175E-005 + 869.10370370370379 , 856050094.82147837 , 1.5076128076759421E-005 + 869.10500500500507 , 849329679.65572405 , 1.4957757847884934E-005 + 869.10630630630635 , 842645080.87042880 , 1.4840019210251215E-005 + 869.10760760760763 , 836100181.59263551 , 1.4724740699965586E-005 + 869.10890890890903 , 829640429.09943426 , 1.4610962053047328E-005 + 869.11021021021031 , 823180850.12365341 , 1.4497186305578966E-005 + 869.11151151151159 , 816806407.04916072 , 1.4384910234691013E-005 + 869.11281281281288 , 810596795.28350532 , 1.4275537829585688E-005 + 869.11411411411416 , 804425603.88099229 , 1.4166842719170659E-005 + 869.11541541541555 , 798362702.92466402 , 1.4060054742512206E-005 + 869.11671671671672 , 792385864.22968781 , 1.3954782617984255E-005 + 869.11801801801812 , 786440676.79332566 , 1.3850067942578106E-005 + 869.11931931931940 , 780504555.33944356 , 1.3745512834633718E-005 + 869.12062062062068 , 774751475.95759439 , 1.3644182218632117E-005 + 869.12192192192197 , 769039781.35701084 , 1.3543580963891792E-005 + 869.12322322322325 , 763408006.26265883 , 1.3444387344720353E-005 + 869.12452452452465 , 757863608.82501638 , 1.3346732623445390E-005 + 869.12582582582593 , 752377317.00085807 , 1.3250101403749449E-005 + 869.12712712712721 , 746836202.85201406 , 1.3152504244300945E-005 + 869.12842842842849 , 741492723.75873625 , 1.3058388668214782E-005 + 869.12972972972977 , 736193815.37425554 , 1.2965058434568989E-005 + 869.13103103103117 , 730949142.38902080 , 1.2872683647284973E-005 + 869.13233233233234 , 725793431.83302379 , 1.2781875559957625E-005 + 869.13363363363374 , 720698018.26600349 , 1.2692129587111617E-005 + 869.13493493493502 , 715554198.86850333 , 1.2601530720909955E-005 + 869.13623623623630 , 710559503.96278894 , 1.2513558838715069E-005 + 869.13753753753758 , 705632715.25732636 , 1.2426783264727755E-005 + 869.13883883883886 , 700736865.45467019 , 1.2340552987500743E-005 + 869.14014014014026 , 695931731.89633870 , 1.2255920200124863E-005 + 869.14144144144154 , 691181088.91609859 , 1.2172247243243914E-005 + 869.14274274274283 , 686410313.08835268 , 1.2088219482947432E-005 + 869.14404404404411 , 681724376.22582448 , 1.2005686200524121E-005 + 869.14534534534539 , 677134143.11944962 , 1.1924838810326597E-005 + 869.14664664664679 , 672553683.02379620 , 1.1844164081052892E-005 + 869.14794794794807 , 668065785.87182415 , 1.1765119276888385E-005 + 869.14924924924924 , 663627287.01084793 , 1.1686944599424260E-005 + 869.15055055055063 , 659192945.57124257 , 1.1608843044859154E-005 + 869.15185185185192 , 654788297.13627541 , 1.1531264472590433E-005 + 869.15315315315331 , 650495901.82085872 , 1.1455663338703525E-005 + 869.15445445445448 , 646216474.08650434 , 1.1380291033805788E-005 + 869.15575575575576 , 642009040.24459767 , 1.1306186534241924E-005 + 869.15705705705716 , 637854004.12789476 , 1.1233004897310790E-005 + 869.15835835835844 , 633724004.53400457 , 1.1160264214893496E-005 + 869.15965965965972 , 629576351.53344679 , 1.1087212422821507E-005 + 869.16096096096101 , 625554266.29565597 , 1.1016372638151927E-005 + 869.16226226226240 , 621550022.83055186 , 1.0945847423083678E-005 + 869.16356356356368 , 617597232.75608468 , 1.0876228403619564E-005 + 869.16486486486485 , 613700348.39642107 , 1.0807593941682081E-005 + 869.16616616616625 , 609843808.83698833 , 1.0739670124711718E-005 + 869.16746746746753 , 605936867.43383706 , 1.0670858277112932E-005 + 869.16876876876893 , 602158655.33558071 , 1.0604314139163462E-005 + 869.17007007007021 , 598405616.45960832 , 1.0538213610059640E-005 + 869.17137137137138 , 594685180.44147038 , 1.0472687420237540E-005 + 869.17267267267277 , 591024029.25244308 , 1.0408205220637060E-005 + 869.17397397397406 , 587399774.21485078 , 1.0344372916799702E-005 + 869.17527527527545 , 583746799.66782856 , 1.0280034563622667E-005 + 869.17657657657662 , 580175113.39999449 , 1.0217128160527076E-005 + 869.17787787787790 , 576651965.38155162 , 1.0155076876408585E-005 + 869.17917917917930 , 573144104.25836599 , 1.0093295092409340E-005 + 869.18048048048058 , 569698760.13011622 , 1.0032614150121006E-005 + 869.18178178178186 , 566287241.54873013 , 9.9725290140239103E-006 + 869.18308308308315 , 313975672.84824210 , 5.5312847773914038E-006 + 869.18438438438443 , 311613761.91486454 , 5.4896751779188344E-006 + 869.18568568568583 , 309315780.08371937 , 5.4491918124210277E-006 + 869.18698698698699 , 307043507.39478648 , 5.4091613628630724E-006 + 869.18828828828839 , 304796557.68025976 , 5.3695770261570472E-006 + 869.18958958958967 , 302574551.95398736 , 5.3304321257336705E-006 + 869.19089089089096 , 300353251.43195951 , 5.2912996488381027E-006 + 869.19219219219224 , 298129651.75463533 , 5.2521266679041928E-006 + 869.19349349349352 , 295981795.10330653 , 5.2142880459124306E-006 + 869.19479479479492 , 293857404.78068084 , 5.1768628283910190E-006 + 869.19609609609620 , 291756136.80262101 , 5.1398449553984189E-006 + 869.19739739739748 , 289677653.11840415 , 5.1032284715215870E-006 + 869.19869869869876 , 287614657.85132444 , 5.0668848458734177E-006 + 869.20000000000005 , 285518072.24340981 , 5.0299494618280396E-006 diff --git a/regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_N/analyze.ini b/regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_N/analyze.ini new file mode 100644 index 000000000..87ca3c7ce --- /dev/null +++ b/regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_N/analyze.ini @@ -0,0 +1,5 @@ +compare_data_file_name = Radiation_Emission_Absorption.csv +compare_data_file_reference = Radiation_Emission_Absorption_reference.csv +compare_data_file_tolerance = 1E-5 +compare_data_file_tolerance_type = relative + diff --git a/regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_N/command_line.ini b/regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_N/command_line.ini new file mode 100644 index 000000000..0100a3584 --- /dev/null +++ b/regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_N/command_line.ini @@ -0,0 +1 @@ +MPI=1 diff --git a/regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_N/cube_mesh.h5 b/regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_N/cube_mesh.h5 new file mode 100755 index 0000000000000000000000000000000000000000..5a856e34960bcfa98ab26b8a4b4d22cc1e8a5197 GIT binary patch literal 6872 zcmeHLKT}gd5Z{*shy-R5z<*RJsjMih3?@XACNhFb;~0boi4*cL{2Az&vB8dyKxxS* zaQp!NVaCSJuRv!RZ*O-K?wv0ojD#q;;_dD3y?wjC+q>I$?{l+{Mu#Vd0b4W*5s2%q zJnGzjOp-)+(HFVnFg;-UAw(SqVt~3kERVDOWS9g~JZ|A>HVY5}u`iTggT+DWMOkoo zmpWos#`Wp{i9jyPM&9-9LLFrw@g)?5$yxH1;O4kYz6$d1@++8NSz zs@aOWzWEpI%$HZ(4(#x9RX)s+-@yJ9ypHS;mZ0ni-lG)PvugS6w##0fKfb14f3(Nm zo!_4L=fI%e=jeg+I7M-XXl7)7a|7B$A5okFoE>rL#@8}{??WB&V5=|RfYki@SSUTC}b{NsXnkq1$X3o*j@5f_XZ zV?<2xh)QQ()!fyJyS!E2ag*1solOgc1`v$*Qhtg$P{(eGI`ElknWU48i`mDhlh02G9Qqyq7#k0By~NlDxfk&Bov)WVxJ&kA|P40aocdyV(znKf6P)D0zy^Y1||%##ZWc^6yuiapA!5AUS9)M literal 0 HcmV?d00001 diff --git a/regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_N/parameter.ini b/regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_N/parameter.ini new file mode 100755 index 000000000..8ef903887 --- /dev/null +++ b/regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_N/parameter.ini @@ -0,0 +1,101 @@ +! =============================================================================== ! +! EQUATION (linearscalaradvection) +! =============================================================================== ! +IniExactFunc = 0 + +! =============================================================================== ! +! DISCRETIZATION +! =============================================================================== ! +N = 1 ! Polynomial degree +NAnalyze = 1 ! Number of analyze points + +! =============================================================================== ! +! MESH +! =============================================================================== ! +MeshFile = cube_mesh.h5 +useCurveds = F +! if boundaries have to be changed (else they are used from Mesh directly): + +! =============================================================================== ! +! OUTPUT / VISUALIZATION +! =============================================================================== ! +ProjectName = RadLas = T +CalcKineticEnergy = TRUE +CalcTemp = TRUE +CalcNumSpec = TRUE +CalcInternalEnergy = TRUE +CalcReacRates=FALSE ! Compile with TimeDisc=42 +Logging = F +! =============================================================================== ! +! CALCULATION +! =============================================================================== ! +tend = 5E-5 ! End time +Analyze_dt = 5E-5 ! Timestep of analyze outputs +CFLscale = 0.2 ! Scaling of theoretical CFL number +! =============================================================================== ! +! PARTICLES +! =============================================================================== ! +Part-maxParticleNumber=10 +Part-nSpecies=1 +Part-nBounds=1 +Part-Boundary1-SourceName=BC_reflective +Part-Boundary1-Condition=reflective +Part-FIBGMdeltas=(/4.64E-4,4.64E-4,4.64E-4/) +! =============================================================================== ! +! Species1 - N +! =============================================================================== ! +Part-Species1-initialParticleNumber=0 +Part-Species1-MassIC=2.32600E-26 ! N Molecular Mass +Part-Species1-MacroParticleFactor=4E10 +Part-Species1-MWTemperatureIC=195 +Part-Species1-TempElec=195 + +Part-Species1-SpeciesName=N +Part-Species1-InteractionID = 1 +Part-Species1-Tref =273 ! K +Part-Species1-dref = 3.0E-10 ! m +Part-Species1-omega=0.24 + +Part-Species1-RadiationTtrans=20000.0 +Part-Species1-RadiationTelec=10000.0 +Part-Species1-RadiationNumDens=1.0E+21 +Part-Species1-RadiationIonizationEn = 117345 +Part-Species1-RadiationMass_u = 14.0067 +Part-Species1-RadiationRadius_A = 0.7 +Part-Species1-Starkex = 0.33 +Part-Species1-NuclCharge = 1 +Radiation-Species1-SpectraFileName = Ni_NIST.dat +! =============================================================================== ! +! Electrons +! =============================================================================== ! +Radiation-NumDensElectrons=1.0E+21 +Radiation-TElectrons =10000.0 + +! =============================================================================== ! +! DSMC +! =============================================================================== ! +UseDSMC=true +Particles-DSMCReservoirSim=true +Particles-DSMC-CollisMode=2 !(1:elast coll, 2: elast + rela, 3:chem) +Part-NumberOfRandomSeeds =2 +Particles-RandomSeed1= 1 +Particles-RandomSeed2= 2 +Particles-DSMC-CalcQualityFactors=TRUE + +Particles-ManualTimeStep=5E-5 + +! =============================================================================== ! +! Radiation +! =============================================================================== ! +Radiation-RadType = 3 ! 1:particle radiation, 2:black body radiation, 3:rad solver + +Radiation-bb-atoms = t ! atomic line radiation (t,f) +Radiation-bb-molecules = f ! molecular band radiation (t,f) +Radiation-bf = f ! bound-free radiation +Radiation-ff = f ! free-free radiation + +Radiation-MinWaveLen =867.9 ! minimum wavelength [nm] +Radiation-MaxWaveLen =869.2 ! maximum Wavelength [nm] +Radiation-WaveLenDiscr =1000 ! number of discretization points + + diff --git a/regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_N/readme.md b/regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_N/readme.md new file mode 100644 index 000000000..66dec5b20 --- /dev/null +++ b/regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_N/readme.md @@ -0,0 +1,3 @@ +# Radiation - Emission and absorption +* Testing cell local emission and absorption coefficient of radiation solver +* Comparison: emission and absorption coefficient of atomic bound-bound transitions of atomic nitrogen (868 nm triplet) diff --git a/regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_O/Oi_NIST.dat b/regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_O/Oi_NIST.dat new file mode 100755 index 000000000..d224df991 --- /dev/null +++ b/regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_O/Oi_NIST.dat @@ -0,0 +1,1430 @@ +580 +5 0 1 2 0.0 +3 158.26 2 2 0.0 +1 226.98 3 2 0.0 +5 15868 4 2 0.0 +1 33793 5 2 0.0 +5 73768 6 3 0.0 +3 76795 7 3 0.0 +3 86626 8 3 0.0 +5 86628 9 3 0.0 +7 86631 10 3 0.0 +3 88631 11 3 0.0 +5 88631 12 3 0.0 +1 88631 13 3 0.0 +5 95477 14 4 0.0 +3 96225 15 4 0.0 +9 97421 16 3 0.0 +7 97421 17 3 0.0 +5 97421 18 3 0.0 +3 97421 19 3 0.0 +1 97421 20 3 0.0 +3 97488 21 3 0.0 +5 97488 22 3 0.0 +7 97489 23 3 0.0 +3 99093 24 4 0.0 +5 99094 25 4 0.0 +7 99095 26 4 0.0 +3 99681 27 4 0.0 +5 99681 28 4 0.0 +1 99681 29 4 0.0 +7 101140 30 3 0.0 +5 101150 31 3 0.0 +3 101160 32 3 0.0 +5 102120 33 5 0.0 +3 102410 34 5 0.0 +5 102660 35 3 0.0 +9 102870 36 4 0.0 +7 102870 37 4 0.0 +5 102870 38 4 0.0 +3 102870 39 4 0.0 +1 102870 40 4 0.0 +7 102910 41 4 0.0 +5 102910 42 4 0.0 +3 102910 43 4 0.0 +11 102970 44 4 0.0 +9 102970 45 4 0.0 +7 102970 46 4 0.0 +5 102970 47 4 0.0 +3 102970 48 4 0.0 +7 102970 49 4 0.0 +5 102970 50 4 0.0 +9 102970 51 4 0.0 +3 103630 52 5 0.0 +5 103630 53 5 0.0 +7 103630 54 5 0.0 +5 103870 55 5 0.0 +3 103870 56 5 0.0 +1 103870 57 5 0.0 +5 105020 58 6 0.0 +3 105170 59 6 0.0 +9 105390 60 5 0.0 +7 105390 61 5 0.0 +5 105390 62 5 0.0 +3 105390 63 5 0.0 +1 105390 64 5 0.0 +5 105410 65 5 0.0 +7 105410 66 5 0.0 +3 105410 67 5 0.0 +5 105440 68 5 0.0 +9 105440 69 5 0.0 +3 105440 70 5 0.0 +7 105440 71 5 0.0 +11 105440 72 5 0.0 +9 105440 73 5 0.0 +5 105440 74 5 0.0 +7 105440 75 5 0.0 +3 105790 76 6 0.0 +5 105790 77 6 0.0 +7 105790 78 6 0.0 +1 105910 79 6 0.0 +5 105910 80 6 0.0 +3 105910 81 6 0.0 +5 106550 82 7 0.0 +3 106630 83 7 0.0 +9 106750 84 6 0.0 +7 106750 85 6 0.0 +5 106750 86 6 0.0 +3 106750 87 6 0.0 +1 106750 88 6 0.0 +3 106770 89 6 0.0 +5 106770 90 6 0.0 +7 106770 91 6 0.0 +9 106790 92 6 0.0 +7 106790 93 6 0.0 +5 106790 94 6 0.0 +3 106790 95 6 0.0 +11 106790 96 6 0.0 +7 106790 97 6 0.0 +5 106790 98 6 0.0 +9 106790 99 6 0.0 +13 106790 100 2 0.0 +7 106790 101 2 0.0 +11 106790 102 2 0.0 +9 106790 103 2 0.0 +7 106790 104 2 0.0 +9 106790 105 2 0.0 +11 106790 106 2 0.0 +5 106790 107 2 0.0 +5 107450 108 8 0.0 +3 107500 109 8 0.0 +9 107570 110 7 0.0 +7 107570 111 7 0.0 +5 107570 112 7 0.0 +3 107570 113 7 0.0 +1 107570 114 7 0.0 +5 107580 115 7 0.0 +3 107580 116 7 0.0 +7 107580 117 7 0.0 +11 107600 118 7 0.0 +3 107600 119 7 0.0 +7 107600 120 7 0.0 +5 107600 121 7 0.0 +9 107600 122 7 0.0 +9 107600 123 7 0.0 +7 107600 124 7 0.0 +5 107600 125 7 0.0 +5 108020 126 9 0.0 +3 108060 127 9 0.0 +9 108110 128 8 0.0 +7 108110 129 8 0.0 +5 108110 130 8 0.0 +3 108110 131 8 0.0 +1 108110 132 8 0.0 +5 108110 133 8 0.0 +3 108110 134 8 0.0 +7 108110 135 8 0.0 +5 108410 136 10 0.0 +3 108440 137 10 0.0 +7 108470 138 9 0.0 +1 108470 139 9 0.0 +9 108470 140 9 0.0 +5 108470 141 9 0.0 +3 108470 142 9 0.0 +3 108480 143 9 0.0 +5 108480 144 9 0.0 +7 108480 145 9 0.0 +3 108710 146 11 0.0 +1 108730 147 10 0.0 +3 108730 148 10 0.0 +5 108730 149 10 0.0 +7 108730 150 10 0.0 +9 108730 151 10 0.0 +7 108740 152 10 0.0 +5 108740 153 10 0.0 +3 108740 154 10 0.0 +3 108910 155 12 0.0 +5 108930 156 11 0.0 +3 108930 157 11 0.0 +7 108930 158 11 0.0 +3 109060 159 13 0.0 +7 109070 160 12 0.0 +3 109070 161 12 0.0 +5 109070 162 12 0.0 +3 109170 163 14 0.0 +7 109190 164 13 0.0 +3 109190 165 13 0.0 +5 109190 166 13 0.0 +3 109270 167 15 0.0 +5 109280 168 14 0.0 +7 109280 169 14 0.0 +3 109280 170 14 0.0 +3 109340 171 16 0.0 +3 109350 172 15 0.0 +5 109350 173 15 0.0 +7 109350 174 15 0.0 +3 109400 175 17 0.0 +7 109410 176 16 0.0 +5 109410 177 16 0.0 +3 109410 178 16 0.0 +3 109450 179 18 0.0 +3 109460 180 17 0.0 +7 109460 181 17 0.0 +5 109460 182 17 0.0 +3 109490 183 18 0.0 +5 109500 184 18 0.0 +3 109500 185 19 0.0 +7 109500 186 18 0.0 +3 109530 187 19 0.0 +5 109530 188 19 0.0 +7 109530 189 19 0.0 +3 109530 190 10 0.0 +3 109560 191 10 0.0 +7 109560 192 10 0.0 +5 109560 193 10 0.0 +3 109560 194 11 0.0 +3 109590 195 12 0.0 +7 109590 196 11 0.0 +5 109590 197 11 0.0 +3 109590 198 11 0.0 +3 109610 199 13 0.0 +3 109610 200 12 0.0 +5 109610 201 12 0.0 +7 109610 202 12 0.0 +5 109630 203 13 0.0 +3 109630 204 13 0.0 +3 109630 205 14 0.0 +7 109630 206 13 0.0 +7 109650 207 14 0.0 +3 109650 208 14 0.0 +5 109650 209 14 0.0 +3 109650 210 15 0.0 +3 109660 211 15 0.0 +7 109660 212 15 0.0 +3 109660 213 16 0.0 +5 109660 214 15 0.0 +7 109670 215 16 0.0 +3 109670 216 16 0.0 +3 109670 217 17 0.0 +5 109670 218 16 0.0 +7 109690 219 17 0.0 +3 109690 220 18 0.0 +5 109690 221 17 0.0 +3 109690 222 17 0.0 +7 109700 223 18 0.0 +3 109700 224 19 0.0 +5 109700 225 18 0.0 +3 109700 226 18 0.0 +7 109710 227 19 0.0 +3 109710 228 19 0.0 +3 109710 229 10 0.0 +5 109710 230 19 0.0 +5 109710 231 10 0.0 +3 109710 232 11 0.0 +7 109710 233 10 0.0 +3 109710 234 10 0.0 +3 113200 235 3 0.0 +7 113290 236 3 0.0 +5 113290 237 3 0.0 +3 113300 238 3 0.0 +9 113710 239 3 0.0 +7 113720 240 3 0.0 +5 113730 241 3 0.0 +5 113910 242 3 0.0 +3 113920 243 3 0.0 +1 113930 244 3 0.0 +7 114000 245 3 0.0 +3 115920 246 3 0.0 +5 116630 247 3 0.0 +7 122420 248 4 0.0 +5 122430 249 4 0.0 +3 122440 250 4 0.0 +5 122800 251 4 0.0 +5 123300 252 3 0.0 +3 123360 253 3 0.0 +1 123390 254 3 0.0 +9 124210 255 3 0.0 +7 124220 256 3 0.0 +5 124220 257 3 0.0 +9 124240 258 3 0.0 +11 124240 259 3 0.0 +1 124240 260 3 0.0 +7 124250 261 3 0.0 +7 124250 262 3 0.0 +5 124260 263 3 0.0 +9 124260 264 3 0.0 +3 124260 265 3 0.0 +3 124270 266 3 0.0 +5 124320 267 3 0.0 +7 124330 268 3 0.0 +3 124340 269 3 0.0 +7 125780 270 4 0.0 +3 125780 271 4 0.0 +5 125780 272 4 0.0 +5 126270 273 2 0.0 +3 126340 274 2 0.0 +1 126380 275 2 0.0 +7 127280 276 3 0.0 +5 127290 277 3 0.0 +3 127290 278 3 0.0 +3 127670 279 3 0.0 +5 128590 280 3 0.0 +7 128980 281 5 0.0 +5 128990 282 5 0.0 +3 129000 283 5 0.0 +5 129130 284 5 0.0 +9 129670 285 4 0.0 +9 129680 286 4 0.0 +11 129680 287 4 0.0 +1 129680 288 4 0.0 +3 129680 289 4 0.0 +7 129690 290 4 0.0 +7 129690 291 4 0.0 +5 129700 292 4 0.0 +9 129700 293 4 0.0 +3 129700 294 4 0.0 +5 129730 295 4 0.0 +3 129740 296 4 0.0 +7 129740 297 4 0.0 +11 129780 298 4 0.0 +11 129780 299 4 0.0 +13 129780 300 4 0.0 +11 129800 301 4 0.0 +5 129970 302 4 0.0 +3 129980 303 4 0.0 +1 129980 304 4 0.0 +1 130940 305 3 0.0 +7 131850 306 6 0.0 +5 131870 307 6 0.0 +3 131880 308 6 0.0 +5 131940 309 6 0.0 +9 132190 310 5 0.0 +9 132200 311 5 0.0 +11 132200 312 5 0.0 +3 132200 313 5 0.0 +7 132200 314 5 0.0 +5 132210 315 5 0.0 +9 132220 316 5 0.0 +3 132220 317 5 0.0 +3 132230 318 5 0.0 +5 132240 319 5 0.0 +7 132240 320 5 0.0 +5 132310 321 5 0.0 +3 132320 322 5 0.0 +7 133370 323 7 0.0 +5 133380 324 7 0.0 +3 133390 325 7 0.0 +5 133420 326 7 0.0 +7 133570 327 6 0.0 +5 133570 328 6 0.0 +3 133570 329 6 0.0 +3 133570 330 6 0.0 +3 133580 331 6 0.0 +5 133590 332 6 0.0 +7 133590 333 6 0.0 +5 133620 334 6 0.0 +3 133630 335 6 0.0 +7 134270 336 8 0.0 +5 134270 337 8 0.0 +3 134290 338 8 0.0 +5 134300 339 8 0.0 +7 134380 340 7 0.0 +5 134380 341 7 0.0 +3 134380 342 7 0.0 +3 134390 343 7 0.0 +3 134400 344 7 0.0 +5 134410 345 7 0.0 +7 134410 346 7 0.0 +5 134420 347 7 0.0 +3 134430 348 7 0.0 +7 134840 349 9 0.0 +5 134840 350 9 0.0 +5 134870 351 9 0.0 +7 134920 352 8 0.0 +3 134920 353 8 0.0 +3 134920 354 8 0.0 +5 134920 355 8 0.0 +3 134920 356 8 0.0 +5 134940 357 8 0.0 +7 134940 358 8 0.0 +5 134940 359 8 0.0 +3 134950 360 8 0.0 +5 135230 361 10 0.0 +7 135230 362 10 0.0 +5 135250 363 10 0.0 +5 135280 364 9 0.0 +3 135280 365 9 0.0 +3 135280 366 9 0.0 +7 135280 367 9 0.0 +3 135280 368 9 0.0 +5 135300 369 9 0.0 +5 135300 370 9 0.0 +7 135300 371 9 0.0 +3 135300 372 9 0.0 +7 135500 373 11 0.0 +7 135540 374 10 0.0 +3 135540 375 10 0.0 +5 135540 376 10 0.0 +3 135540 377 10 0.0 +3 135540 378 10 0.0 +5 135560 379 10 0.0 +3 135560 380 10 0.0 +7 135560 381 10 0.0 +5 135560 382 10 0.0 +5 135680 383 4 0.0 +1 135680 384 4 0.0 +3 135680 385 4 0.0 +7 135700 386 12 0.0 +5 135720 387 12 0.0 +5 135730 388 11 0.0 +3 135730 389 11 0.0 +7 135730 390 11 0.0 +3 135730 391 11 0.0 +3 135740 392 11 0.0 +3 135750 393 11 0.0 +5 135750 394 11 0.0 +7 135760 395 11 0.0 +5 135760 396 11 0.0 +7 135850 397 13 0.0 +5 135880 398 12 0.0 +3 135880 399 12 0.0 +3 135880 400 12 0.0 +7 135880 401 12 0.0 +3 135890 402 12 0.0 +3 135900 403 12 0.0 +5 135900 404 12 0.0 +7 135900 405 12 0.0 +5 135900 406 12 0.0 +3 135990 407 13 0.0 +7 135990 408 13 0.0 +3 135990 409 13 0.0 +5 135990 410 13 0.0 +5 136000 411 14 0.0 +3 136000 412 13 0.0 +5 136010 413 13 0.0 +3 136010 414 13 0.0 +5 136070 415 14 0.0 +3 136070 416 14 0.0 +3 136070 417 14 0.0 +7 136070 418 14 0.0 +3 136080 419 14 0.0 +5 136100 420 14 0.0 +7 136140 421 15 0.0 +3 136140 422 15 0.0 +5 136140 423 15 0.0 +3 136140 424 15 0.0 +5 136170 425 15 0.0 +3 136190 426 16 0.0 +7 136190 427 16 0.0 +3 136190 428 16 0.0 +5 136190 429 16 0.0 +5 136240 430 16 0.0 +3 136350 431 4 0.0 +5 137930 432 3 0.0 +1 137950 433 3 0.0 +3 137950 434 3 0.0 +5 137950 435 3 0.0 +3 137960 436 3 0.0 +5 137960 437 3 0.0 +7 137960 438 3 0.0 +3 137980 439 3 0.0 +3 142650 440 5 0.0 +5 142650 441 5 0.0 +1 142650 442 5 0.0 +3 142740 443 5 0.0 +5 143360 444 4 0.0 +3 143360 445 4 0.0 +5 143360 446 4 0.0 +3 143360 447 4 0.0 +5 143360 448 4 0.0 +7 143360 449 4 0.0 +1 143360 450 4 0.0 +3 143380 451 4 0.0 +5 145520 452 6 0.0 +3 145520 453 6 0.0 +1 145520 454 6 0.0 +3 145620 455 6 0.0 +5 145870 456 5 0.0 +3 145870 457 5 0.0 +1 145870 458 5 0.0 +5 145870 459 5 0.0 +3 145870 460 5 0.0 +5 145870 461 5 0.0 +7 145870 462 5 0.0 +3 145890 463 5 0.0 +3 147030 464 7 0.0 +1 147030 465 7 0.0 +5 147030 466 7 0.0 +3 147060 467 7 0.0 +5 147230 468 6 0.0 +5 147230 469 6 0.0 +1 147230 470 6 0.0 +7 147230 471 6 0.0 +5 147230 472 6 0.0 +3 147230 473 6 0.0 +3 147230 474 6 0.0 +3 147240 475 6 0.0 +3 147920 476 8 0.0 +1 147920 477 8 0.0 +5 147920 478 8 0.0 +3 147940 479 8 0.0 +5 148040 480 7 0.0 +3 148050 481 7 0.0 +5 148050 482 7 0.0 +1 148050 483 7 0.0 +3 148050 484 7 0.0 +7 148050 485 7 0.0 +5 148050 486 7 0.0 +3 148060 487 7 0.0 +5 148500 488 9 0.0 +3 148500 489 9 0.0 +1 148500 490 9 0.0 +3 148500 491 9 0.0 +5 148580 492 8 0.0 +7 148580 493 8 0.0 +1 148580 494 8 0.0 +5 148580 495 8 0.0 +3 148580 496 8 0.0 +3 148580 497 8 0.0 +5 148580 498 8 0.0 +3 148580 499 8 0.0 +5 148880 500 10 0.0 +1 148880 501 10 0.0 +3 148880 502 10 0.0 +3 148890 503 10 0.0 +5 148940 504 9 0.0 +5 148950 505 9 0.0 +1 148950 506 9 0.0 +7 148950 507 9 0.0 +5 148950 508 9 0.0 +3 148950 509 9 0.0 +3 148950 510 9 0.0 +3 148950 511 9 0.0 +1 149160 512 11 0.0 +3 149160 513 11 0.0 +5 149160 514 11 0.0 +3 149170 515 11 0.0 +1 149200 516 10 0.0 +5 149200 517 10 0.0 +3 149200 518 10 0.0 +3 149200 519 10 0.0 +5 149200 520 10 0.0 +7 149200 521 10 0.0 +5 149200 522 10 0.0 +5 149360 523 12 0.0 +3 149360 524 12 0.0 +1 149360 525 12 0.0 +3 149390 526 11 0.0 +3 149390 527 11 0.0 +1 149390 528 11 0.0 +5 149390 529 11 0.0 +7 149390 530 11 0.0 +5 149390 531 11 0.0 +5 149390 532 11 0.0 +5 149510 533 13 0.0 +3 149510 534 13 0.0 +1 149510 535 13 0.0 +5 149540 536 12 0.0 +3 149540 537 12 0.0 +1 149540 538 12 0.0 +5 149540 539 12 0.0 +3 149540 540 12 0.0 +7 149540 541 12 0.0 +3 149630 542 14 0.0 +5 149630 543 14 0.0 +1 149630 544 14 0.0 +5 149650 545 13 0.0 +1 149650 546 13 0.0 +3 149650 547 13 0.0 +3 149650 548 13 0.0 +5 149650 549 13 0.0 +7 149650 550 13 0.0 +5 149740 551 14 0.0 +1 149740 552 14 0.0 +5 149740 553 14 0.0 +3 149740 554 14 0.0 +7 149740 555 14 0.0 +3 149740 556 14 0.0 +1 149820 557 15 0.0 +3 149820 558 15 0.0 +3 149820 559 15 0.0 +5 149820 560 15 0.0 +7 149820 561 15 0.0 +5 149820 562 15 0.0 +3 149920 563 17 0.0 +5 149920 564 17 0.0 +1 149920 565 17 0.0 +3 149920 566 17 0.0 +5 149920 567 17 0.0 +7 149920 568 17 0.0 +5 149960 569 18 0.0 +3 149960 570 18 0.0 +5 149960 571 18 0.0 +1 149960 572 18 0.0 +3 149960 573 18 0.0 +7 149960 574 18 0.0 +7 150000 575 19 0.0 +5 150000 576 19 0.0 +3 150000 577 19 0.0 +1 150000 578 19 0.0 +5 150000 579 19 0.0 +3 150000 580 19 0.0 + +847 +697.53 1 447 5 3 602000 0 0 +697.53 1 448 5 5 5300000 0 0 +697.53 1 449 5 7 20500000 0 0 +698.30 2 447 3 3 8970000 0 0 +698.30 2 448 3 5 15800000 0 0 +698.63 3 447 1 3 11900000 0 0 +724.84 1 437 5 5 11900000 0 0 +724.84 1 438 5 7 46000000 0 0 +724.84 1 436 5 3 1350000 0 0 +725.67 2 436 3 3 20100000 0 0 +725.67 2 437 3 5 35300000 0 0 +726.03 3 436 1 3 26600000 0 0 +769.35 1 303 5 3 88400000 0 0 +769.41 1 302 5 5 159000000 0 0 +770.26 2 304 3 1 211000000 0 0 +770.29 2 303 3 3 52900000 0 0 +770.35 2 302 3 5 52900000 0 0 +770.70 3 303 1 3 70400000 0 0 +770.79 1 296 5 3 25800000 0 0 +770.99 1 294 5 3 483000 0 0 +771.02 1 292 5 5 4400000 0 0 +771.06 1 290 5 7 17900000 0 0 +771.73 2 296 3 3 15400000 0 0 +771.93 2 294 3 3 7200000 0 0 +771.97 2 292 3 5 13100000 0 0 +772.14 3 296 1 3 5120000 0 0 +772.34 3 294 1 3 9580000 0 0 +791.51 1 274 5 3 275000000 0 0 +791.97 1 273 5 5 494000000 0 0 +792.23 2 275 3 1 659000000 0 0 +792.51 2 274 3 3 164000000 0 0 +792.94 3 274 1 3 219000000 0 0 +792.97 2 273 3 5 164000000 0 0 +804.27 1 269 5 3 70200000 0 0 +804.74 1 265 5 3 1210000 0 0 +804.78 1 263 5 5 11000000 0 0 +804.85 1 261 5 7 44700000 0 0 +805.29 2 269 3 3 42100000 0 0 +805.74 3 269 1 3 14000000 0 0 +805.76 2 265 3 3 18000000 0 0 +805.80 2 263 3 5 32900000 0 0 +806.21 3 265 1 3 24000000 0 0 +810.66 1 253 5 3 13700000 0 0 +811.05 1 252 5 5 24600000 0 0 +811.50 2 254 3 1 32700000 0 0 +811.71 2 253 3 3 8170000 0 0 +812.09 2 252 3 5 8150000 0 0 +812.16 3 253 1 3 10900000 0 0 +816.72 1 250 5 3 1630000 0 0 +816.77 1 249 5 5 14700000 0 0 +816.86 1 248 5 7 58900000 0 0 +817.78 2 250 3 3 24400000 0 0 +817.83 2 249 3 5 44000000 0 0 +818.24 3 250 1 3 32500000 0 0 +839.83 4 357 5 5 10300000 0 0 +839.83 4 358 5 7 11200000 0 0 +843.59 4 346 5 7 16300000 0 0 +843.59 4 345 5 5 15100000 0 0 +844.33 4 339 5 5 9090000 0 0 +849.45 4 333 5 7 24900000 0 0 +849.48 4 332 5 5 23300000 0 0 +850.68 4 326 5 5 14600000 0 0 +859.31 4 320 5 7 40600000 0 0 +859.35 4 319 5 5 38200000 0 0 +859.59 4 313 5 3 11000000 0 0 +861.56 4 309 5 5 25800000 0 0 +877.80 1 243 5 3 285000000 0 0 +877.88 1 242 5 5 512000000 0 0 +878.20 4 297 5 7 70500000 0 0 +878.25 4 295 5 5 66800000 0 0 +878.62 4 289 5 3 17000000 0 0 +878.97 2 244 3 1 681000000 0 0 +879.02 2 243 3 3 170000000 0 0 +879.10 2 242 3 5 170000000 0 0 +879.55 3 243 1 3 226000000 0 0 +882.89 4 284 5 5 52200000 0 0 +922.01 4 268 5 7 123000000 0 0 +922.07 4 267 5 5 117000000 0 0 +922.46 4 266 5 3 20400000 0 0 +924.95 1 134 5 3 201000 0 0 +924.95 1 135 5 7 7220000 0 0 +924.95 1 133 5 5 1810000 0 0 +926.31 2 134 3 3 3000000 0 0 +926.31 2 133 3 5 5390000 0 0 +926.90 3 134 1 3 3990000 0 0 +929.52 1 116 5 3 296000 0 0 +929.52 1 115 5 5 2660000 0 0 +929.52 1 117 5 7 10600000 0 0 +930.26 1 109 5 3 6900000 0 0 +930.89 2 115 3 5 7950000 0 0 +930.89 2 116 3 3 4420000 0 0 +931.48 3 116 1 3 5880000 0 0 +931.63 2 109 3 3 4120000 0 0 +932.23 3 109 1 3 1370000 0 0 +935.19 4 251 5 5 133000000 0 0 +936.63 1 91 5 7 16600000 0 0 +936.63 1 90 5 5 4150000 0 0 +936.63 1 89 5 3 461000 0 0 +937.84 1 83 5 3 11100000 0 0 +938.02 2 90 3 5 12400000 0 0 +938.02 2 89 3 3 6880000 0 0 +938.62 3 89 1 3 9160000 0 0 +939.24 2 83 3 3 6630000 0 0 +939.84 3 83 1 3 2210000 0 0 +948.69 1 65 5 5 7020000 0 0 +948.69 1 67 5 3 780000 0 0 +948.69 1 66 5 7 28100000 0 0 +950.11 2 67 3 3 11600000 0 0 +950.11 2 65 3 5 21000000 0 0 +950.73 3 67 1 3 15500000 0 0 +950.88 1 59 5 3 19400000 0 0 +952.32 2 59 3 3 11600000 0 0 +952.94 3 59 1 3 3850000 0 0 +971.74 1 43 5 3 1620000 0 0 +971.74 1 42 5 5 14600000 0 0 +971.74 1 41 5 7 58500000 0 0 +973.23 2 43 3 3 24200000 0 0 +973.23 2 42 3 5 43700000 0 0 +973.88 3 43 1 3 32300000 0 0 +974.07 1 35 5 5 110000 0 0 +975.57 2 35 3 5 22200 0 0 +976.45 1 34 5 3 38600000 0 0 +977.96 2 34 3 3 23000000 0 0 +978.62 3 34 1 3 7660000 0 0 +988.58 1 32 5 3 6470000 0 0 +988.65 1 31 5 5 57700000 0 0 +988.77 1 30 5 7 226000000 0 0 +990.13 2 32 3 3 94700000 0 0 +990.20 2 31 3 5 168000000 0 0 +990.80 3 32 1 3 125000000 0 0 +999.50 4 246 5 3 506000000 0 0 +1025.80 1 23 5 7 76600000 0 0 +1025.80 1 22 5 5 19100000 0 0 +1025.80 1 21 5 3 2110000 0 0 +1027.40 2 21 3 3 31700000 0 0 +1027.40 2 22 3 5 57100000 0 0 +1028.20 3 21 1 3 42200000 0 0 +1039.20 1 15 5 3 94300000 0 0 +1040.90 2 15 3 3 56400000 0 0 +1041.70 3 15 1 3 18800000 0 0 +1152.20 4 35 5 5 528000000 0 0 +1172.50 4 32 5 3 49800 0 0 +1172.60 4 31 5 5 366 0 0 +1172.80 4 30 5 7 7970 0 0 +1217.60 5 246 1 3 206000000 0 0 +1302.20 1 7 5 3 341000000 0 0 +1304.90 2 7 3 3 203000000 0 0 +1306.00 3 7 1 3 67600000 0 0 +1355.60 1 6 5 5 4200 0 0 +1358.50 2 6 3 5 1360 0 0 +1484.50 5 32 1 3 9050 0 0 +1641.30 4 7 5 3 1830 0 0 +1727.10 4 6 5 5 0.00532 0 0 +1827.10 11 447 3 3 77900 0 0 +1827.10 11 448 3 5 152000 0 0 +1827.10 13 447 1 3 112000 0 0 +1827.10 12 448 5 5 43200 0 0 +1827.10 12 449 5 7 196000 0 0 +2027.10 11 436 3 3 105000 0 0 +2027.10 11 437 3 5 282000 0 0 +2027.10 13 436 1 3 192000 0 0 +2027.10 12 437 5 5 48500 0 0 +2027.10 12 438 5 7 370000 0 0 +2289.20 27 448 3 5 135000 0 0 +2289.20 27 447 3 3 24800 0 0 +2289.30 28 449 5 7 167000 0 0 +2289.30 29 447 1 3 82900 0 0 +2325.50 5 7 1 3 4.61 0 0 +2418.10 11 304 3 1 298000 0 0 +2418.40 11 303 3 3 74500 0 0 +2418.50 12 303 5 3 124000 0 0 +2418.50 13 303 1 3 99300 0 0 +2419.00 11 302 3 5 74400 0 0 +2419.00 12 302 5 5 223000 0 0 +2432.70 11 296 3 3 371000 0 0 +2432.80 12 296 5 3 619000 0 0 +2432.80 13 296 1 3 123000 0 0 +2434.70 11 294 3 3 128000 0 0 +2434.80 13 294 1 3 170000 0 0 +2435.10 11 292 3 5 232000 0 0 +2435.10 12 292 5 5 77000 0 0 +2435.40 12 290 5 7 313000 0 0 +2612.20 27 436 3 3 95700 0 0 +2612.20 28 438 5 7 148000 0 0 +2612.20 27 437 3 5 108000 0 0 +2612.20 28 437 5 5 71000 0 0 +2612.20 29 436 1 3 90000 0 0 +2800.70 11 269 3 3 485000 0 0 +2800.70 12 269 5 3 808000 0 0 +2800.70 13 269 1 3 161000 0 0 +2806.40 11 265 3 3 177000 0 0 +2806.40 12 265 5 3 11800 0 0 +2806.40 13 265 1 3 236000 0 0 +2806.80 11 263 3 5 322000 0 0 +2806.90 12 263 5 5 107000 0 0 +2807.70 12 261 5 7 435000 0 0 +2877.10 11 254 3 1 1470000 0 0 +2879.80 11 253 3 3 368000 0 0 +2879.80 12 253 5 3 613000 0 0 +2879.80 13 253 1 3 490000 0 0 +2884.70 11 252 3 5 366000 0 0 +2884.70 12 252 5 5 1100000 0 0 +2959.20 1 5 5 1 0.000242 0 0 +2973.20 2 5 3 1 0.0754 0 0 +3299.90 27 304 3 1 143000 0 0 +3300.50 27 303 3 3 35700 0 0 +3300.50 28 303 5 3 59500 0 0 +3300.50 29 303 1 3 47600 0 0 +3301.50 27 302 3 5 35700 0 0 +3301.50 28 302 5 5 107000 0 0 +3327.20 27 296 3 3 217000 0 0 +3327.20 28 296 5 3 364000 0 0 +3327.20 29 296 1 3 72200 0 0 +3330.90 27 294 3 3 11000 0 0 +3330.90 29 294 1 3 14500 0 0 +3331.50 27 292 3 5 20100 0 0 +3331.50 28 292 5 5 6720 0 0 +3332.10 28 290 5 7 28100 0 0 +3693.40 7 57 3 1 93000 0 0 +3693.40 7 56 3 3 93000 0 0 +3693.40 7 55 3 5 93000 0 0 +3823.70 30 277 7 5 117000 0 0 +3824.50 30 276 7 7 663000 0 0 +3825.00 31 278 5 3 187000 0 0 +3825.40 31 277 5 5 519000 0 0 +3826.10 32 278 3 3 559000 0 0 +3826.30 31 276 5 7 83100 0 0 +3826.60 32 277 3 5 112000 0 0 +3856.10 35 280 5 5 1630000 0 0 +3948.40 6 26 5 7 491000 0 0 +3948.60 6 25 5 5 488000 0 0 +3948.70 6 24 5 3 487000 0 0 +3953.00 11 244 3 1 310000 0 0 +3954.00 11 243 3 3 77400 0 0 +3954.10 12 243 5 3 129000 0 0 +3954.10 13 243 1 3 103000 0 0 +3955.60 11 242 3 5 77300 0 0 +3955.70 12 242 5 5 232000 0 0 +3999.10 35 279 5 3 2410000 0 0 +4055.90 27 269 3 3 272000 0 0 +4055.90 28 269 5 3 456000 0 0 +4056.00 29 269 1 3 90500 0 0 +4067.80 27 265 3 3 96000 0 0 +4067.90 28 265 5 3 6430 0 0 +4067.90 29 265 1 3 128000 0 0 +4068.90 27 263 3 5 174000 0 0 +4068.90 28 263 5 5 58400 0 0 +4070.70 28 261 5 7 235000 0 0 +4218.30 27 254 3 1 544000 0 0 +4223.90 27 253 3 3 136000 0 0 +4224.00 28 253 5 3 226000 0 0 +4224.00 29 253 1 3 181000 0 0 +4234.50 27 252 3 5 135000 0 0 +4234.50 28 252 5 5 404000 0 0 +4369.40 7 29 3 1 756000 0 0 +4369.50 7 28 3 5 759000 0 0 +4369.50 7 27 3 3 758000 0 0 +4655.40 8 132 3 1 430000 0 0 +4655.40 8 131 3 3 323000 0 0 +4655.40 8 130 3 5 151000 0 0 +4655.90 9 131 5 3 108000 0 0 +4655.90 9 130 5 5 251000 0 0 +4655.90 9 129 5 7 287000 0 0 +4656.70 10 130 7 5 28700 0 0 +4656.70 10 129 7 7 143000 0 0 +4656.70 10 128 7 9 430000 0 0 +4773.80 8 114 3 1 700000 0 0 +4773.80 8 113 3 3 525000 0 0 +4773.80 8 112 3 5 245000 0 0 +4774.20 9 113 5 3 175000 0 0 +4774.20 9 112 5 5 408000 0 0 +4774.20 9 111 5 7 467000 0 0 +4775.10 10 112 7 5 46600 0 0 +4775.10 10 111 7 7 233000 0 0 +4775.10 10 110 7 9 700000 0 0 +4803.00 8 108 3 5 262000 0 0 +4803.50 9 108 5 5 437000 0 0 +4804.30 10 108 7 5 611000 0 0 +4968.80 8 88 3 1 1270000 0 0 +4968.80 8 87 3 3 950000 0 0 +4968.80 8 86 3 5 443000 0 0 +4969.30 9 87 5 3 316000 0 0 +4969.30 9 86 5 5 738000 0 0 +4969.30 9 85 5 7 844000 0 0 +4970.20 10 86 7 5 84300 0 0 +4970.20 10 85 7 7 422000 0 0 +4970.20 10 84 7 9 1270000 0 0 +5020.20 8 82 3 5 428000 0 0 +5020.70 9 82 5 5 713000 0 0 +5021.60 10 82 7 5 998000 0 0 +5132.60 11 133 3 5 74800 0 0 +5132.60 11 134 3 3 41600 0 0 +5132.70 12 133 5 5 24900 0 0 +5132.70 12 135 5 7 99800 0 0 +5132.70 12 134 5 3 2770 0 0 +5132.80 13 134 1 3 55400 0 0 +5276.40 11 115 3 5 132000 0 0 +5276.40 11 116 3 3 73400 0 0 +5276.60 12 117 5 7 176000 0 0 +5276.60 12 116 5 3 4890 0 0 +5276.60 12 115 5 5 44000 0 0 +5276.60 13 116 1 3 97800 0 0 +5300.40 11 109 3 3 358000 0 0 +5300.50 12 109 5 3 596000 0 0 +5300.60 13 109 1 3 119000 0 0 +5330.60 8 64 3 1 2710000 0 0 +5330.60 8 63 3 3 2030000 0 0 +5330.60 8 62 3 5 948000 0 0 +5331.20 9 63 5 3 677000 0 0 +5331.20 9 62 5 5 1580000 0 0 +5331.20 9 61 5 7 1810000 0 0 +5332.20 10 62 7 5 180000 0 0 +5332.20 10 61 7 7 902000 0 0 +5332.20 10 60 7 9 2710000 0 0 +5436.70 8 58 3 5 774000 0 0 +5437.30 9 58 5 5 1290000 0 0 +5438.40 10 58 7 5 1800000 0 0 +5514.10 11 89 3 3 149000 0 0 +5514.10 11 90 3 5 269000 0 0 +5514.30 12 91 5 7 358000 0 0 +5514.30 12 90 5 5 89500 0 0 +5514.30 12 89 5 3 9950 0 0 +5514.40 13 89 1 3 199000 0 0 +5556.40 11 83 3 3 583000 0 0 +5556.50 12 83 5 3 971000 0 0 +5556.60 13 83 1 3 194000 0 0 +5578.90 4 5 5 1 1.26 0 0 +5960.00 11 65 3 5 680000 0 0 +5960.00 11 67 3 3 378000 0 0 +5960.20 12 65 5 5 227000 0 0 +5960.20 12 67 5 3 25200 0 0 +5960.20 12 66 5 7 906000 0 0 +5960.30 13 67 1 3 504000 0 0 +6047.90 11 59 3 3 1050000 0 0 +6048.10 12 59 5 3 1750000 0 0 +6048.20 13 59 1 3 350000 0 0 +6142.30 9 41 5 7 962 0 0 +6157.70 8 40 3 1 7620000 0 0 +6157.70 8 39 3 3 5720000 0 0 +6157.70 8 38 3 5 2670000 0 0 +6158.40 9 39 5 3 1910000 0 0 +6158.50 9 38 5 5 4450000 0 0 +6158.50 9 37 5 7 5080000 0 0 +6159.90 10 38 7 5 507000 0 0 +6159.90 10 37 7 7 2540000 0 0 +6159.90 10 36 7 9 7620000 0 0 +6302.00 1 4 5 5 2.11E-05 0 0 +6302.00 1 4 5 5 0.00563 0 0 +6325.10 21 238 3 3 18100 0 0 +6325.20 22 238 5 3 6020 0 0 +6326.50 21 237 3 5 3610 0 0 +6326.50 22 237 5 5 16800 0 0 +6326.60 22 236 5 7 2680 0 0 +6326.60 23 237 7 5 3760 0 0 +6326.60 23 236 7 7 21400 0 0 +6365.50 2 4 3 5 0.00182 0 0 +6365.50 2 4 3 5 3.39E-06 0 0 +6393.50 3 4 1 5 8.6E-07 0 0 +6455.40 8 33 3 5 1650000 0 0 +6456.20 9 33 5 5 2750000 0 0 +6457.80 10 33 7 5 3850000 0 0 +6728.10 6 12 5 5 1180 0 0 +6728.40 6 11 5 3 644 0 0 +7003.80 11 43 3 3 1470000 0 0 +7003.90 11 42 3 5 2650000 0 0 +7004.10 12 43 5 3 98300 0 0 +7004.10 12 42 5 5 883000 0 0 +7004.20 12 41 5 7 3530000 0 0 +7004.20 13 43 1 3 1960000 0 0 +7019.20 27 244 3 1 32200 0 0 +7022.30 27 243 3 3 8050 0 0 +7022.30 28 243 5 3 13400 0 0 +7022.40 29 243 1 3 10700 0 0 +7027.40 27 242 3 5 8030 0 0 +7027.50 28 242 5 5 24100 0 0 +7158.70 35 247 5 5 50500000 0 0 +7256.20 11 34 3 3 2240000 0 0 +7256.40 12 34 5 3 3730000 0 0 +7256.50 13 34 1 3 745000 0 0 +7774.10 6 10 5 7 36900000 0 0 +7776.30 6 9 5 5 36900000 0 0 +7777.50 6 8 5 3 36900000 0 0 +7984.10 11 32 3 3 23300 0 0 +7984.50 12 32 5 3 1800 0 0 +7984.60 13 32 1 3 30900 0 0 +7989.20 11 31 3 5 41900 0 0 +7989.50 12 31 5 5 14100 0 0 +7997.30 12 30 5 7 56300 0 0 +8224.10 30 237 7 5 5080000 0 0 +8224.10 30 236 7 7 28900000 0 0 +8229.90 31 238 5 3 8130000 0 0 +8232.30 31 237 5 5 22600000 0 0 +8232.30 31 236 5 7 3620000 0 0 +8235.30 32 238 3 3 24300000 0 0 +8237.60 32 237 3 5 4860000 0 0 +8448.60 7 13 3 1 32200000 0 0 +8448.70 7 12 3 5 32200000 0 0 +8449.10 7 11 3 3 32200000 0 0 +8822.80 35 245 5 7 29300000 0 0 +9207.50 9 23 5 7 1660 0 0 +9263.30 8 20 3 1 44600000 0 0 +9263.40 8 19 3 3 33400000 0 0 +9263.50 8 18 3 5 15600000 0 0 +9265.10 9 19 5 3 11100000 0 0 +9265.20 9 18 5 5 26000000 0 0 +9265.30 9 17 5 7 29700000 0 0 +9268.40 10 18 7 5 2970000 0 0 +9268.50 10 17 7 7 14800000 0 0 +9268.50 10 16 7 9 44500000 0 0 +9485.50 35 235 5 3 23400000 0 0 +9624.80 42 238 5 3 52200 0 0 +9624.80 43 238 3 3 157000 0 0 +9627.90 41 237 7 5 32500 0 0 +9627.90 41 236 7 7 185000 0 0 +9628.00 42 237 5 5 145000 0 0 +9628.00 42 236 5 7 23200 0 0 +9628.00 43 237 3 5 31300 0 0 +9697.30 14 78 5 7 45400 0 0 +9697.60 14 77 5 5 45400 0 0 +9697.70 14 76 5 3 45400 0 0 +9828.50 16 122 9 9 224000 0 0 +9828.50 16 120 9 7 19200 0 0 +9828.50 16 118 9 11 1340000 0 0 +9828.60 17 121 7 5 53700 0 0 +9828.60 17 120 7 7 403000 0 0 +9828.60 17 122 7 9 1120000 0 0 +9828.70 18 119 5 3 89500 0 0 +9828.70 18 121 5 5 537000 0 0 +9828.70 18 120 5 7 921000 0 0 +9828.80 19 121 3 5 752000 0 0 +9828.80 19 119 3 3 627000 0 0 +9828.80 20 119 1 3 627000 0 0 +9894.40 21 125 3 5 1080000 0 0 +9894.40 22 124 5 7 1140000 0 0 +9894.40 22 125 5 5 200000 0 0 +9894.50 23 125 7 5 5630 0 0 +9894.50 23 123 7 9 1280000 0 0 +9894.50 23 124 7 7 143000 0 0 +10170.00 7 9 3 5 361 0 0 +10172.00 7 8 3 3 197 0 0 +10679.00 16 92 9 9 395000 0 0 +10679.00 16 93 9 7 33900 0 0 +10679.00 16 96 9 11 2370000 0 0 +10679.00 17 94 7 5 94900 0 0 +10679.00 17 92 7 9 1980000 0 0 +10679.00 17 93 7 7 712000 0 0 +10679.00 18 95 5 3 158000 0 0 +10679.00 18 93 5 7 1630000 0 0 +10679.00 18 94 5 5 949000 0 0 +10679.00 19 95 3 3 1110000 0 0 +10679.00 19 94 3 5 1330000 0 0 +10679.00 20 95 1 3 1110000 0 0 +10756.00 21 98 3 5 1910000 0 0 +10756.00 22 97 5 7 2020000 0 0 +10756.00 22 98 5 5 355000 0 0 +10757.00 23 99 7 9 2280000 0 0 +10757.00 23 97 7 7 254000 0 0 +10757.00 23 98 7 5 10000 0 0 +11095.00 24 132 3 1 287000 0 0 +11095.00 24 131 3 3 215000 0 0 +11095.00 24 130 3 5 100000 0 0 +11096.00 25 131 5 3 71700 0 0 +11096.00 25 130 5 5 167000 0 0 +11096.00 25 129 5 7 191000 0 0 +11097.00 26 130 7 5 19100 0 0 +11097.00 26 129 7 7 95500 0 0 +11097.00 26 128 7 9 287000 0 0 +11289.00 11 22 3 5 23200000 0 0 +11289.00 11 21 3 3 12900000 0 0 +11290.00 12 23 5 7 30900000 0 0 +11290.00 12 22 5 5 7740000 0 0 +11290.00 12 21 5 3 860000 0 0 +11290.00 13 21 1 3 17200000 0 0 +11298.00 8 14 3 5 5340000 0 0 +11301.00 9 14 5 5 8900000 0 0 +11305.00 10 14 7 5 12500000 0 0 +11377.00 13 19 1 3 398 0 0 +11377.00 12 17 5 7 1010 0 0 +11792.00 24 114 3 1 470000 0 0 +11792.00 24 113 3 3 353000 0 0 +11792.00 24 112 3 5 165000 0 0 +11793.00 25 113 5 3 118000 0 0 +11793.00 25 112 5 5 274000 0 0 +11793.00 25 111 5 7 313000 0 0 +11794.00 26 112 7 5 31300 0 0 +11794.00 26 111 7 7 157000 0 0 +11794.00 26 110 7 9 470000 0 0 +11858.00 27 133 3 5 102000 0 0 +11858.00 27 134 3 3 56500 0 0 +11858.00 28 135 5 7 136000 0 0 +11858.00 28 134 5 3 3770 0 0 +11858.00 28 133 5 5 33900 0 0 +11859.00 29 134 1 3 75400 0 0 +11871.00 21 80 3 5 852 0 0 +11871.00 21 81 3 3 21300 0 0 +11871.00 21 79 3 1 85200 0 0 +11871.00 22 80 5 5 12800 0 0 +11871.00 22 81 5 3 63900 0 0 +11872.00 23 80 7 5 71500 0 0 +11950.00 16 78 9 7 16100 0 0 +11950.00 17 78 7 7 4170 0 0 +11950.00 18 78 5 7 595 0 0 +11950.00 17 77 7 5 11700 0 0 +11951.00 18 77 5 5 7290 0 0 +11951.00 19 77 3 5 1880 0 0 +11951.00 18 76 5 3 7290 0 0 +11951.00 19 76 3 3 9380 0 0 +11951.00 20 76 1 3 4170 0 0 +11972.00 24 108 3 5 124000 0 0 +11973.00 25 108 5 5 206000 0 0 +11974.00 26 108 7 5 289000 0 0 +12270.00 14 54 5 7 235000 0 0 +12271.00 14 53 5 5 235000 0 0 +12271.00 14 52 5 3 235000 0 0 +12467.00 16 69 9 9 827000 0 0 +12467.00 16 71 9 7 70900 0 0 +12467.00 16 72 9 11 4960000 0 0 +12467.00 17 69 7 9 4140000 0 0 +12467.00 17 68 7 5 198000 0 0 +12467.00 17 71 7 7 1490000 0 0 +12468.00 18 68 5 5 1980000 0 0 +12468.00 18 71 5 7 3410000 0 0 +12468.00 18 70 5 3 331000 0 0 +12468.00 19 68 3 5 2780000 0 0 +12468.00 19 70 3 3 2320000 0 0 +12468.00 20 70 1 3 2320000 0 0 +12573.00 21 74 3 5 4050000 0 0 +12573.00 22 75 5 7 4280000 0 0 +12573.00 22 74 5 5 752000 0 0 +12574.00 23 74 7 5 21200 0 0 +12574.00 23 73 7 9 4820000 0 0 +12574.00 23 75 7 7 537000 0 0 +12655.00 27 116 3 3 97500 0 0 +12655.00 27 115 3 5 176000 0 0 +12655.00 28 115 5 5 58500 0 0 +12655.00 28 116 5 3 6500 0 0 +12655.00 28 117 5 7 234000 0 0 +12656.00 29 116 1 3 130000 0 0 +12794.00 27 109 3 3 177000 0 0 +12794.00 28 109 5 3 295000 0 0 +12794.00 29 109 1 3 58900 0 0 +13057.00 24 88 3 1 865000 0 0 +13057.00 24 87 3 3 649000 0 0 +13057.00 24 86 3 5 303000 0 0 +13059.00 25 87 5 3 216000 0 0 +13059.00 25 86 5 5 505000 0 0 +13059.00 25 85 5 7 577000 0 0 +13061.00 26 86 7 5 57700 0 0 +13061.00 26 85 7 7 288000 0 0 +13061.00 26 84 7 9 865000 0 0 +13080.00 15 57 3 1 286000 0 0 +13080.00 15 56 3 3 286000 0 0 +13081.00 15 55 3 5 286000 0 0 +13167.00 11 15 3 3 7140000 0 0 +13168.00 12 15 5 3 11900000 0 0 +13169.00 13 15 1 3 2380000 0 0 +13419.00 24 82 3 5 208000 0 0 +13420.00 25 82 5 5 346000 0 0 +13422.00 26 82 7 5 484000 0 0 +14115.00 27 90 3 5 349000 0 0 +14115.00 27 89 3 3 194000 0 0 +14115.00 28 91 5 7 465000 0 0 +14115.00 28 90 5 5 116000 0 0 +14115.00 28 89 5 3 12900 0 0 +14115.00 29 89 1 3 258000 0 0 +14395.00 27 83 3 3 296000 0 0 +14395.00 28 83 5 3 493000 0 0 +14395.00 29 83 1 3 98600 0 0 +15480.00 30 125 7 5 68.2 0 0 +15480.00 30 123 7 9 15500 0 0 +15480.00 30 124 7 7 1730 0 0 +15510.00 31 125 5 5 2400 0 0 +15510.00 31 124 5 7 13700 0 0 +15529.00 32 125 3 5 12900 0 0 +15669.00 21 57 3 1 183000 0 0 +15670.00 21 56 3 3 45700 0 0 +15670.00 21 55 3 5 1830 0 0 +15670.00 22 56 5 3 137000 0 0 +15670.00 22 55 5 5 27400 0 0 +15670.00 23 55 7 5 154000 0 0 +15892.00 24 64 3 1 1930000 0 0 +15892.00 24 63 3 3 1450000 0 0 +15892.00 24 62 3 5 675000 0 0 +15894.00 25 63 5 3 482000 0 0 +15894.00 25 62 5 5 1130000 0 0 +15894.00 25 61 5 7 1290000 0 0 +15897.00 26 62 7 5 129000 0 0 +15897.00 26 61 7 7 643000 0 0 +15897.00 26 60 7 9 1930000 0 0 +16113.00 16 54 9 7 31200 0 0 +16114.00 17 54 7 7 8080 0 0 +16114.00 18 54 5 7 1150 0 0 +16115.00 17 53 7 5 22600 0 0 +16115.00 18 53 5 5 14100 0 0 +16116.00 19 53 3 5 3630 0 0 +16116.00 18 52 5 3 14100 0 0 +16117.00 19 52 3 3 18200 0 0 +16117.00 20 52 1 3 8070 0 0 +16874.00 24 58 3 5 399000 0 0 +16876.00 25 58 5 5 664000 0 0 +16879.00 26 58 7 5 930000 0 0 +17458.00 27 67 3 3 492000 0 0 +17458.00 27 65 3 5 885000 0 0 +17458.00 28 67 5 3 32800 0 0 +17458.00 28 65 5 5 295000 0 0 +17458.00 28 66 5 7 1180000 0 0 +17459.00 29 67 1 3 656000 0 0 +17700.00 30 99 7 9 25200 0 0 +17700.00 30 98 7 5 111 0 0 +17700.00 30 97 7 7 2810 0 0 +17738.00 31 98 5 5 3900 0 0 +17738.00 31 97 5 7 22200 0 0 +17763.00 32 98 3 5 20900 0 0 +18026.00 16 44 9 11 14800000 0 0 +18026.00 16 45 9 9 2460000 0 0 +18026.00 16 46 9 7 211000 0 0 +18026.00 17 47 7 5 591000 0 0 +18026.00 17 45 7 9 12300000 0 0 +18026.00 17 46 7 7 4430000 0 0 +18026.00 18 47 5 5 5910000 0 0 +18026.00 18 48 5 3 985000 0 0 +18026.00 18 46 5 7 10100000 0 0 +18027.00 19 47 3 5 8270000 0 0 +18027.00 19 48 3 3 6900000 0 0 +18027.00 20 48 1 3 6900000 0 0 +18234.00 27 59 3 3 568000 0 0 +18234.00 28 59 5 3 947000 0 0 +18235.00 29 59 1 3 189000 0 0 +18248.00 21 50 3 5 12400000 0 0 +18249.00 22 50 5 5 2300000 0 0 +18249.00 22 49 5 7 13100000 0 0 +18249.00 23 50 7 5 64800 0 0 +18249.00 23 49 7 7 1640000 0 0 +18249.00 23 51 7 9 14700000 0 0 +19463.00 48 132 3 1 9020 0 0 +19463.00 47 131 5 3 6020 0 0 +19463.00 48 131 3 3 3010 0 0 +19463.00 46 130 7 5 6190 0 0 +19463.00 48 130 3 5 258 0 0 +19463.00 47 130 5 5 2580 0 0 +19463.00 47 129 5 7 184 0 0 +19463.00 46 129 7 7 1930 0 0 +19463.00 45 129 9 7 6910 0 0 +19463.00 45 128 9 9 1070 0 0 +19463.00 44 128 11 9 7880 0 0 +19463.00 46 128 7 9 71.6 0 0 +21143.00 36 122 9 9 131000 0 0 +21143.00 36 120 9 7 11300 0 0 +21143.00 36 118 9 11 788000 0 0 +21143.00 37 121 7 5 31500 0 0 +21143.00 37 120 7 7 236000 0 0 +21143.00 37 122 7 9 657000 0 0 +21144.00 38 120 5 7 540000 0 0 +21144.00 38 121 5 5 315000 0 0 +21144.00 38 119 5 3 52500 0 0 +21144.00 39 121 3 5 441000 0 0 +21144.00 39 119 3 3 368000 0 0 +21144.00 40 119 1 3 368000 0 0 +21337.00 41 123 7 9 760000 0 0 +21337.00 41 124 7 7 84700 0 0 +21337.00 41 125 7 5 3340 0 0 +21337.00 42 125 5 5 119000 0 0 +21337.00 42 124 5 7 675000 0 0 +21337.00 43 125 3 5 638000 0 0 +21714.00 48 114 3 1 15000 0 0 +21714.00 48 113 3 3 4990 0 0 +21714.00 47 113 5 3 9980 0 0 +21714.00 47 112 5 5 4280 0 0 +21714.00 46 112 7 5 10300 0 0 +21714.00 48 112 3 5 428 0 0 +21714.00 45 111 9 7 11500 0 0 +21714.00 46 111 7 7 3210 0 0 +21714.00 47 111 5 7 305 0 0 +21714.00 44 110 11 9 13100 0 0 +21714.00 45 110 9 9 1780 0 0 +21714.00 46 110 7 9 119 0 0 +23222.00 30 74 7 5 192 0 0 +23222.00 30 75 7 7 4870 0 0 +23222.00 30 73 7 9 43700 0 0 +23287.00 31 74 5 5 6760 0 0 +23287.00 31 75 5 7 38500 0 0 +23330.00 32 74 3 5 36200 0 0 +25512.00 36 93 9 7 19500 0 0 +25512.00 36 96 9 11 1370000 0 0 +25512.00 36 92 9 9 228000 0 0 +25513.00 37 94 7 5 54600 0 0 +25513.00 37 92 7 9 1140000 0 0 +25513.00 37 93 7 7 410000 0 0 +25513.00 38 95 5 3 91100 0 0 +25513.00 38 93 5 7 937000 0 0 +25513.00 38 94 5 5 546000 0 0 +25513.00 39 95 3 3 637000 0 0 +25513.00 39 94 3 5 765000 0 0 +25514.00 40 95 1 3 637000 0 0 +25794.00 41 98 7 5 5890 0 0 +25794.00 41 97 7 7 149000 0 0 +25794.00 41 99 7 9 1340000 0 0 +25795.00 42 97 5 7 1190000 0 0 +25795.00 42 98 5 5 209000 0 0 +25795.00 43 98 3 5 1120000 0 0 +26209.00 24 42 3 5 92.3 0 0 +26214.00 25 41 5 7 847 0 0 +26432.00 48 88 3 1 28100 0 0 +26432.00 48 87 3 3 9370 0 0 +26432.00 47 87 5 3 18700 0 0 +26432.00 48 86 3 5 803 0 0 +26432.00 47 86 5 5 8030 0 0 +26432.00 46 86 7 5 19300 0 0 +26433.00 46 85 7 7 6030 0 0 +26433.00 47 85 5 7 574 0 0 +26433.00 45 85 9 7 21500 0 0 +26433.00 45 84 9 9 3350 0 0 +26433.00 44 84 11 9 24500 0 0 +26433.00 46 84 7 9 223 0 0 +26506.00 24 40 3 1 6450000 0 0 +26506.00 24 39 3 3 4840000 0 0 +26507.00 24 38 3 5 2260000 0 0 +26511.00 25 39 5 3 1610000 0 0 +26511.00 25 38 5 5 3760000 0 0 +26512.00 25 37 5 7 4300000 0 0 +26520.00 26 38 7 5 429000 0 0 +26520.00 26 37 7 7 2150000 0 0 +26520.00 26 36 7 9 6440000 0 0 +27639.00 14 26 5 7 4300000 0 0 +27648.00 14 25 5 5 4290000 0 0 +27653.00 14 24 5 3 4290000 0 0 +28933.00 15 29 3 1 4100000 0 0 +28935.00 15 28 3 5 4100000 0 0 +28936.00 15 27 3 3 4100000 0 0 +30984.00 27 43 3 3 2100000 0 0 +30984.00 27 42 3 5 3780000 0 0 +30984.00 28 43 5 3 140000 0 0 +30985.00 28 42 5 5 1260000 0 0 +30985.00 28 41 5 7 5040000 0 0 +30987.00 29 43 1 3 2800000 0 0 +31401.00 27 38 3 5 32.5 0 0 +31402.00 28 38 5 5 72.4 0 0 +31402.00 28 37 5 7 697 0 0 +31404.00 29 39 1 3 62.7 0 0 +33072.00 24 33 3 5 1100000 0 0 +33079.00 25 33 5 5 1840000 0 0 +33092.00 26 33 7 5 2570000 0 0 +33293.00 41 80 7 5 57000 0 0 +33294.00 42 81 5 3 50900 0 0 +33294.00 42 80 5 5 10200 0 0 +33294.00 43 79 3 1 67800 0 0 +33294.00 43 81 3 3 17000 0 0 +34207.00 36 78 9 7 10400 0 0 +34208.00 37 78 7 7 2710 0 0 +34208.00 38 78 5 7 386 0 0 +34211.00 37 77 7 5 7570 0 0 +34212.00 38 77 5 5 4730 0 0 +34212.00 39 77 3 5 1220 0 0 +34213.00 38 76 5 3 4730 0 0 +34214.00 39 76 3 3 6080 0 0 +34214.00 40 76 1 3 2700 0 0 +34860.00 15 25 3 5 62 0 0 +34868.00 15 24 3 3 47.2 0 0 +36569.00 30 55 7 5 22000 0 0 +36616.00 27 34 3 3 1610000 0 0 +36617.00 28 34 5 3 2680000 0 0 +36621.00 29 34 1 3 535000 0 0 +36731.00 31 56 5 3 19300 0 0 +36732.00 31 55 5 5 3870 0 0 +36835.00 32 57 3 1 25600 0 0 +36838.00 32 56 3 3 6390 0 0 +38818.00 36 72 9 11 2680000 0 0 +38818.00 36 71 9 7 38300 0 0 +38818.00 36 69 9 9 447000 0 0 +38818.00 37 71 7 7 805000 0 0 +38818.00 37 68 7 5 107000 0 0 +38818.00 37 69 7 9 2240000 0 0 +38819.00 38 70 5 3 179000 0 0 +38819.00 38 68 5 5 1070000 0 0 +38819.00 38 71 5 7 1840000 0 0 +38820.00 39 68 3 5 1500000 0 0 +38820.00 39 70 3 3 1250000 0 0 +38820.00 40 70 1 3 1250000 0 0 +39473.00 41 73 7 9 2720000 0 0 +39473.00 41 75 7 7 303000 0 0 +39473.00 41 74 7 5 12000 0 0 +39474.00 42 74 5 5 425000 0 0 +39474.00 42 75 5 7 2420000 0 0 +39475.00 43 74 3 5 2290000 0 0 +41370.00 48 64 3 1 64400 0 0 +41370.00 48 63 3 3 21500 0 0 +41370.00 47 63 5 3 43000 0 0 +41371.00 47 62 5 5 18400 0 0 +41371.00 46 62 7 5 44100 0 0 +41371.00 48 62 3 5 1840 0 0 +41371.00 47 61 5 7 1310 0 0 +41371.00 46 61 7 7 13800 0 0 +41371.00 45 61 9 7 49300 0 0 +41372.00 46 60 7 9 511 0 0 +41372.00 45 60 9 9 7670 0 0 +41372.00 44 60 11 9 56200 0 0 +45601.00 21 29 3 1 986000 0 0 +45606.00 21 28 3 5 9860 0 0 +45608.00 22 28 5 5 148000 0 0 +45608.00 21 27 3 3 246000 0 0 +45610.00 22 27 5 3 739000 0 0 +45610.00 23 28 7 5 828000 0 0 +54557.00 30 49 7 7 1760 0 0 +54557.00 30 51 7 9 15800 0 0 +54557.00 30 50 7 5 69.7 0 0 +54920.00 31 50 5 5 2420 0 0 +54920.00 31 49 5 7 13800 0 0 +55160.00 32 50 3 5 12900 0 0 +59730.00 16 26 9 7 384000 0 0 +59733.00 17 26 7 7 99500 0 0 +59737.00 18 26 5 7 14200 0 0 +59776.00 17 25 7 5 278000 0 0 +59780.00 18 25 5 5 174000 0 0 +59784.00 19 25 3 5 44700 0 0 +59804.00 18 24 5 3 174000 0 0 +59808.00 19 24 3 3 223000 0 0 +59809.00 20 24 1 3 99200 0 0 +62301.00 23 25 7 5 17.1 0 0 +103980.00 43 57 3 1 364000 0 0 +103990.00 41 55 7 5 306000 0 0 +104000.00 42 56 5 3 273000 0 0 +104000.00 43 56 3 3 90900 0 0 +104000.00 42 55 5 5 54600 0 0 +131390.00 36 54 9 7 156000 0 0 +131400.00 37 54 7 7 40400 0 0 +131410.00 38 54 5 7 5770 0 0 +131480.00 37 53 7 5 113000 0 0 +131490.00 38 53 5 5 70500 0 0 +131500.00 39 53 3 5 18100 0 0 +131550.00 38 52 5 3 70400 0 0 +131560.00 39 52 3 3 90600 0 0 +131570.00 40 52 1 3 40200 0 0 +440570.00 1 3 5 1 1.34E-10 0 0 +631850.00 1 2 5 3 8.91E-05 0 0 +631850.00 1 2 5 3 1.66E-11 0 0 +973300.00 36 46 9 7 3.43 0 0 +973300.00 36 45 9 9 40 0 0 +973300.00 36 44 9 11 240 0 0 +973690.00 37 45 7 9 200 0 0 +973690.00 37 46 7 7 72 0 0 +973690.00 37 47 7 5 9.6 0 0 +974250.00 38 48 5 3 16 0 0 +974250.00 38 46 5 7 164 0 0 +974250.00 38 47 5 5 95.8 0 0 +974720.00 39 48 3 3 112 0 0 +974720.00 39 47 3 5 134 0 0 +974940.00 40 48 1 3 112 0 0 diff --git a/regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_O/Radiation_Emission_Absorption_reference.csv b/regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_O/Radiation_Emission_Absorption_reference.csv new file mode 100644 index 000000000..d343b3dcb --- /dev/null +++ b/regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_O/Radiation_Emission_Absorption_reference.csv @@ -0,0 +1,501 @@ + wavelength,emission_coefficient,absorption_coefficient + 777.25000000000000 , 2.2940531500821097E-002 , 2.9343624713800640E-016 + 777.25140280561129 , 121764540696.41615 , 1.5573725042691644E-003 + 777.25280561122258 , 1581660616.9457488 , 2.0229870454368109E-005 + 777.25420841683376 , 1607527439.3625348 , 2.0560694159452405E-005 + 777.25561122244494 , 1634430780.4774055 , 2.0904774077205436E-005 + 777.25701402805612 , 1701087525.4291079 , 2.1757925015218731E-005 + 777.25841683366741 , 1757741137.7995865 , 2.2482966435290620E-005 + 777.25981963927859 , 1786939337.6426511 , 2.2856401792433203E-005 + 777.26122244488988 , 1816946295.7255118 , 2.3240180511489024E-005 + 777.26262525050106 , 1847793646.6239748 , 2.3634707167306221E-005 + 777.26402805611224 , 1879653502.7266552 , 2.4042182998375538E-005 + 777.26543086172353 , 1912793713.3362222 , 2.4466033623689962E-005 + 777.26683366733471 , 1946410896.3053451 , 2.4895984149272436E-005 + 777.26823647294600 , 1981012773.4409595 , 2.5338528060246575E-005 + 777.26963927855718 , 2016642062.7262826 , 2.5794211697987950E-005 + 777.27104208416847 , 2053341790.0535593 , 2.6263585320206151E-005 + 777.27244488977954 , 2091160728.7545974 , 2.6747272746712046E-005 + 777.27384769539083 , 2130730760.5274017 , 2.7253355197790554E-005 + 777.27525050100201 , 2171149757.9134822 , 2.7770295174191564E-005 + 777.27665330661330 , 2212665473.0726085 , 2.8301261072859029E-005 + 777.27805611222448 , 2255508640.0500321 , 2.8849203900460536E-005 + 777.27945891783577 , 2299739001.2990055 , 2.9414887701682337E-005 + 777.28086172344695 , 2345420104.0564265 , 2.9999125186511519E-005 + 777.28226452905812 , 2392923057.2139826 , 3.0606662597506171E-005 + 777.28366733466942 , 2442387865.9117098 , 3.1239290454658355E-005 + 777.28507014028060 , 2492909117.1631861 , 3.1885429017304813E-005 + 777.28647294589189 , 2545178587.0670538 , 3.2553925682337191E-005 + 777.28787575150307 , 2599281164.2783027 , 3.3245866087379743E-005 + 777.28927855711424 , 2655306990.7592573 , 3.3962403054205521E-005 + 777.29068136272542 , 2713357491.1918459 , 3.4704833794493923E-005 + 777.29208416833671 , 2774568404.9627252 , 3.5487683321844984E-005 + 777.29348697394801 , 2837205472.8408208 , 3.6288771924699910E-005 + 777.29488977955918 , 2902049187.8413229 , 3.7118081332267431E-005 + 777.29629258517048 , 2969369437.2168231 , 3.7979063238161435E-005 + 777.29769539078154 , 3039298236.3819723 , 3.8873405980447704E-005 + 777.29909819639283 , 3111978813.2910385 , 3.9802941332655510E-005 + 777.30050100200401 , 3188205311.1088042 , 4.0777825684312188E-005 + 777.30190380761530 , 3267803062.8048635 , 4.1795825130549081E-005 + 777.30330661322648 , 3349818012.6841965 , 4.2844737942528730E-005 + 777.30470941883777 , 3435263900.9877777 , 4.3937529070791975E-005 + 777.30611222444895 , 3524339821.7782459 , 4.5076744716714816E-005 + 777.30751503006013 , 3617259411.5569777 , 4.6265117063700766E-005 + 777.30891783567142 , 3714260475.1504712 , 4.7505687524315948E-005 + 777.31032064128260 , 3817564470.7984095 , 4.8826866282451436E-005 + 777.31172344689389 , 3923703013.0363216 , 5.0184295831956872E-005 + 777.31312625250507 , 4034692079.1279078 , 5.1603758614684438E-005 + 777.31452905811636 , 4150882964.5167632 , 5.3089747389332578E-005 + 777.31593186372743 , 4272610859.6546111 , 5.4646548882370251E-005 + 777.31733466933872 , 4400242762.7788906 , 5.6278856687843588E-005 + 777.31873747494990 , 4535601757.8280687 , 5.8009986231650057E-005 + 777.32014028056119 , 4677726278.2265511 , 5.9827639862149866E-005 + 777.32154308617248 , 4825859818.6045132 , 6.1722142450783919E-005 + 777.32294589178366 , 4981707123.2718487 , 6.3715296107126444E-005 + 777.32434869739484 , 5145817299.3204546 , 6.5814123318786393E-005 + 777.32575150300602 , 5318789555.3327265 , 6.8026287327969918E-005 + 777.32715430861731 , 5501596591.0061893 , 7.0364228080662679E-005 + 777.32855711422849 , 5697944916.4634113 , 7.2875347982532705E-005 + 777.32995991983978 , 5902165533.2000532 , 7.5487145842599340E-005 + 777.33136272545096 , 6118322769.2044106 , 7.8251600522474365E-005 + 777.33276553106214 , 6347372530.0958805 , 8.1180937019778695E-005 + 777.33416833667343 , 6590369492.8056831 , 8.4288643509547898E-005 + 777.33557114228461 , 6848487608.0018816 , 8.7589733680397297E-005 + 777.33697394789590 , 7126585534.2899075 , 9.1146344662975919E-005 + 777.33837675350708 , 7421645120.3296967 , 9.4919877100014096E-005 + 777.33977955911837 , 7734342974.8289232 , 9.8918984043752263E-005 + 777.34118236472943 , 8068394844.7296009 , 1.0319118608516314E-004 + 777.34258517034073 , 8425812309.0583735 , 1.0776220913344936E-004 + 777.34398797595190 , 8808850192.7369022 , 1.1266089000374187E-004 + 777.34539078156320 , 9221630279.0516243 , 1.1793994199259524E-004 + 777.34679358717449 , 9671514893.8344994 , 1.2369352124746362E-004 + 777.34819639278567 , 10149386664.234524 , 1.2980502574332992E-004 + 777.34959919839685 , 10665249082.407030 , 1.3640238976273203E-004 + 777.35100200400802 , 11223162608.058678 , 1.4353754216295418E-004 + 777.35240480961932 , 11827692577.351847 , 1.5126886862010732E-004 + 777.35380761523049 , 12483984063.357483 , 1.5966216921058671E-004 + 777.35521042084179 , 13208889404.690767 , 1.6893296717569235E-004 + 777.35661322645296 , 13993195193.308149 , 1.7896343225327210E-004 + 777.35801603206426 , 14845854646.529266 , 1.8986806659921593E-004 + 777.35941883767532 , 15778926699.092560 , 2.0180109099336236E-004 + 777.36082164328661 , 16802282505.577206 , 2.1488874673738817E-004 + 777.36222444889790 , 17927837433.303894 , 2.2928341849636351E-004 + 777.36362725450908 , 19178630166.301048 , 2.4527974609824378E-004 + 777.36503006012038 , 20584190733.161816 , 2.6325538616779604E-004 + 777.36643286573155 , 22149195658.570919 , 2.8327014575093852E-004 + 777.36783567134273 , 23952885188.418739 , 3.0633742158596444E-004 + 777.36923847695391 , 26111610019.409996 , 3.3394521204673004E-004 + 777.37064128256520 , 28848097321.769482 , 3.6894195446168153E-004 + 777.37204408817638 , 32589026031.822018 , 4.1678440672126166E-004 + 777.37344689378767 , 38285973926.019341 , 4.8964220990252352E-004 + 777.37484969939896 , 47398820348.048439 , 6.0618562524434390E-004 + 777.37625250501003 , 62785279474.695473 , 8.0296169726074040E-004 + 777.37765531062132 , 89439602209.217239 , 1.1438414414281664E-003 + 777.37905811623250 , 135784963733.93146 , 1.7365480703826547E-003 + 777.38046092184379 , 215584639138.02106 , 2.7570988434596410E-003 + 777.38186372745497 , 352233024757.59222 , 4.5046825437885267E-003 + 777.38326653306626 , 581889150134.44922 , 7.4417336735992006E-003 + 777.38466933867733 , 950576390807.37537 , 1.2156840948986962E-002 + 777.38607214428862 , 1529582331404.0703 , 1.9561694732979633E-002 + 777.38747494989991 , 2412238793235.7632 , 3.0849907103397956E-002 + 777.38887775551109 , 3717441632265.8857 , 4.7542026225854468E-002 + 777.39028056112238 , 5588569638715.2090 , 7.1471710260267038E-002 + 777.39168336673356 , 8252541943867.4766 , 0.10554100710429842 + 777.39308617234474 , 11795487333251.162 , 0.15085140987210074 + 777.39448897795592 , 16398360245259.600 , 0.20971712823251634 + 777.39589178356721 , 22178887139098.594 , 0.28364375504350930 + 777.39729458917839 , 29182726409077.863 , 0.37321521131013330 + 777.39869739478968 , 37356736626135.883 , 0.47775187618454801 + 777.40010020040086 , 46619361540849.094 , 0.59621073429506422 + 777.40150300601204 , 56571153069455.836 , 0.72348328083979885 + 777.40290581162333 , 66635963112202.703 , 0.85220121076708755 + 777.40430861723451 , 76343358203410.969 , 0.97634819375669146 + 777.40571142284580 , 85076150953872.766 , 1.0880310770588801 + 777.40711422845698 , 92220581287465.188 , 1.1794005395158811 + 777.40851703406827 , 97237658107843.312 , 1.2435634735749084 + 777.40991983967933 , 99706523739469.359 , 1.2751375691353615 + 777.41132264529062 , 99787917893253.062 , 1.2761785115733508 + 777.41272545090180 , 97641829671435.734 , 1.2487323868021567 + 777.41412825651310 , 92936802644821.656 , 1.1885602290372277 + 777.41553106212439 , 86038859471596.531 , 1.1003430683862727 + 777.41693386773557 , 77472669707664.984 , 0.99079085553933954 + 777.41833667334686 , 67729798823774.320 , 0.86619017608689652 + 777.41973947895792 , 57593761800754.500 , 0.73656133104646393 + 777.42114228456921 , 47696808315624.344 , 0.60999010338214477 + 777.42254509018039 , 38425969335946.336 , 0.49142619653802472 + 777.42394789579168 , 30113077525815.727 , 0.38511338793226785 + 777.42535070140286 , 22953672267735.016 , 0.29355241274171107 + 777.42675350701415 , 17003789771510.760 , 0.21745991289964517 + 777.42815631262533 , 12205889249232.389 , 0.15610000456170348 + 777.42955911823651 , 8578343997641.7754 , 0.10970766212892097 + 777.43096192384780 , 5870382486496.8789 , 7.5075791568788838E-002 + 777.43236472945898 , 3913592012506.7925 , 5.0050578310105523E-002 + 777.43376753507027 , 2544073406483.7876 , 3.2535930954277661E-002 + 777.43517034068145 , 1615243609143.4658 , 2.0657212239502645E-002 + 777.43657314629263 , 999412412418.69702 , 1.2781403841539819E-002 + 777.43797595190381 , 612477088910.98645 , 7.8329237122837948E-003 + 777.43937875751510 , 373852015473.84467 , 4.7811697318137746E-003 + 777.44078156312628 , 229247849650.93323 , 2.9318404932345858E-003 + 777.44218436873757 , 143680868408.90411 , 1.8375323806635929E-003 + 777.44358717434886 , 94011860674.307526 , 1.2023201526133146E-003 + 777.44498997995993 , 65429807734.205307 , 8.3678705392249068E-004 + 777.44639278557122 , 48982165741.830048 , 6.2643982318183271E-004 + 777.44779559118240 , 39484865713.862526 , 5.0497987883012685E-004 + 777.44919839679369 , 33600422010.621487 , 4.2972442497073838E-004 + 777.45060120240487 , 29692638035.956898 , 3.7974829393755193E-004 + 777.45200400801616 , 26874645600.731552 , 3.4370941040147115E-004 + 777.45340681362723 , 24677330728.252838 , 3.1560831931771576E-004 + 777.45480961923852 , 22832348368.203613 , 2.9201318141718876E-004 + 777.45621242484981 , 21261741836.820538 , 2.7192701247311568E-004 + 777.45761523046099 , 19877906607.014278 , 2.5422944847129203E-004 + 777.45901803607228 , 18637369623.330391 , 2.3836451663113099E-004 + 777.46042084168346 , 17517178805.710033 , 2.2403868510302103E-004 + 777.46182364729464 , 16501361838.725302 , 2.1104768595153338E-004 + 777.46322645290581 , 15571943168.117857 , 1.9916163327611251E-004 + 777.46462925851711 , 14721660120.538549 , 1.8828764162899162E-004 + 777.46603206412829 , 13955772474.695999 , 1.7849297918175850E-004 + 777.46743486973958 , 13255245840.465139 , 1.6953421766692113E-004 + 777.46883767535076 , 12613474888.958263 , 1.6132688231196030E-004 + 777.47024048096205 , 12024625972.195246 , 1.5379636775165420E-004 + 777.47164328657323 , 11483581632.582209 , 1.4687722827235074E-004 + 777.47304609218440 , 10977369680.466478 , 1.4040356353708447E-004 + 777.47444889779570 , 10518730040.160892 , 1.3453830035307213E-004 + 777.47585170340687 , 10096086097.974228 , 1.2913338897326809E-004 + 777.47725450901817 , 9705320468.9219971 , 1.2413617276475151E-004 + 777.47865731462934 , 9343586724.3212318 , 1.1951024946104255E-004 + 777.48006012024052 , 9008344305.4835320 , 1.1522312840050197E-004 + 777.48146292585170 , 8694926300.9966030 , 1.1121512893458127E-004 + 777.48286573146299 , 8403452236.1050329 , 1.0748777175383857E-004 + 777.48426853707429 , 8135705179.4580059 , 1.0406386464404132E-004 + 777.48567134268546 , 7886641590.4412422 , 1.0087890665938572E-004 + 777.48707414829676 , 7654831434.5888739 , 9.7914609536888355E-005 + 777.48847695390782 , 7439032606.3158379 , 9.5155089132630387E-005 + 777.48987975951911 , 7238235251.7100639 , 9.2587432670774412E-005 + 777.49128256513029 , 7047413223.0410042 , 9.0147358677266005E-005 + 777.49268537074158 , 6873500515.4966545 , 8.7923543793379946E-005 + 777.49408817635276 , 6711538939.2446308 , 8.5852580996338744E-005 + 777.49549098196405 , 6560771910.1138954 , 8.3924794833733680E-005 + 777.49689378757523 , 6420540122.2343807 , 8.2131754393966028E-005 + 777.49829659318641 , 6290280471.5381174 , 8.0466259190414843E-005 + 777.49969939879770 , 6168191934.2809496 , 7.8905280396188314E-005 + 777.50110220440888 , 6055023922.1176672 , 7.7458392383864227E-005 + 777.50250501002017 , 5951477468.1828671 , 7.6134566791990403E-005 + 777.50390781563135 , 5855847573.1196642 , 7.4911999146576959E-005 + 777.50531062124253 , 5767766586.3829155 , 7.3785988350684320E-005 + 777.50671342685371 , 5686933002.6415119 , 7.2752679776714435E-005 + 777.50811623246500 , 5613256842.7129097 , 7.1810928165934212E-005 + 777.50951903807618 , 5544422781.0003681 , 7.0931114995268749E-005 + 777.51092184368747 , 5483705461.0994387 , 7.0155121288209926E-005 + 777.51232464929876 , 5429144741.9771080 , 6.9457882133583135E-005 + 777.51372745490983 , 5380552314.2224684 , 6.8836990184276793E-005 + 777.51513026052112 , 5337808348.5062466 , 6.8290914694532748E-005 + 777.51653306613230 , 5300994485.8718243 , 6.7820703002983312E-005 + 777.51793587174359 , 5269094706.9491062 , 6.7413363938082795E-005 + 777.51933867735477 , 5242646024.7058840 , 6.7075754967839971E-005 + 777.52074148296606 , 5222096305.2537365 , 6.6813612274232534E-005 + 777.52214428857724 , 5206855692.9488497 , 6.6619393617697552E-005 + 777.52354709418842 , 5196910452.9972210 , 6.6492925189569541E-005 + 777.52494989979971 , 5192247660.8853283 , 6.6434043328861571E-005 + 777.52635270541089 , 5193665757.1267443 , 6.6452972733399343E-005 + 777.52775551102218 , 5198860280.6960716 , 6.6520221186887891E-005 + 777.52915831663336 , 5210240394.3009453 , 6.6666610081275946E-005 + 777.53056112224465 , 5227013747.2770414 , 6.6882009660796171E-005 + 777.53196392785571 , 5249265656.6534872 , 6.7167513291087899E-005 + 777.53336673346701 , 5277175386.9964952 , 6.7525417231822539E-005 + 777.53476953907818 , 5311534129.8086681 , 6.7965849469140460E-005 + 777.53617234468948 , 5351231368.7580805 , 6.8474604546957114E-005 + 777.53757515030065 , 5396735529.8182611 , 6.9057664785671579E-005 + 777.53897795591195 , 5448728570.4689503 , 6.9723764465254306E-005 + 777.54038076152312 , 5507223271.7725258 , 7.0473070644201183E-005 + 777.54178356713430 , 5572532437.6281443 , 7.1309588444818417E-005 + 777.54318637274559 , 5645053959.4283457 , 7.2238411576363020E-005 + 777.54458917835677 , 5726785341.1700344 , 7.3285112365820276E-005 + 777.54599198396807 , 5814100563.3680925 , 7.4403276966075046E-005 + 777.54739478957924 , 5910177566.8771114 , 7.5633576243882769E-005 + 777.54879759519042 , 6014951550.1595106 , 7.6975187521962667E-005 + 777.55020040080160 , 6128959447.1011524 , 7.8434984471266228E-005 + 777.55160320641289 , 6252846057.4807262 , 8.0021221733245275E-005 + 777.55300601202418 , 6389283807.2413731 , 8.1768107246887119E-005 + 777.55440881763536 , 6535725763.0459547 , 8.3643046241091114E-005 + 777.55581162324665 , 6693602630.8186731 , 8.5664341059770471E-005 + 777.55721442885772 , 6864510485.3311520 , 8.7852427428614880E-005 + 777.55861723446901 , 7049385820.5886946 , 9.0219294270149451E-005 + 777.56002004008019 , 7249451607.0626783 , 9.2780597055903296E-005 + 777.56142284569148 , 7467014220.2640781 , 9.5565858108496001E-005 + 777.56282565130266 , 7705232396.7395000 , 9.8615513715924783E-005 + 777.56422845691395 , 7959408926.2073898 , 1.0186943610920811E-004 + 777.56563126252513 , 8235248979.7428312 , 1.0540065028495037E-004 + 777.56703406813631 , 8534500882.1076260 , 1.0923153945857723E-004 + 777.56843687374760 , 8859519916.0970173 , 1.1339225289768542E-004 + 777.56983967935878 , 9212908323.3321590 , 1.1791610080661127E-004 + 777.57124248497007 , 9604391117.7558613 , 1.2292756738371892E-004 + 777.57264529058125 , 10026006845.859489 , 1.2832474792772325E-004 + 777.57404809619254 , 10485183934.948410 , 1.3420272026819078E-004 + 777.57545090180361 , 10987118043.977839 , 1.4062799630335180E-004 + 777.57685370741490 , 11536559397.330980 , 1.4766138145687341E-004 + 777.57825651302608 , 12139046732.201323 , 1.5537377515682799E-004 + 777.57965931863737 , 12806276005.168177 , 1.6391488970607826E-004 + 777.58106212424866 , 13544436437.774612 , 1.7336395309481330E-004 + 777.58246492985984 , 14350605360.029503 , 1.8368355147337879E-004 + 777.58386773547102 , 15244356593.184008 , 1.9512423728286574E-004 + 777.58527054108220 , 16242490418.532530 , 2.0790106405967667E-004 + 777.58667334669349 , 17372524925.998432 , 2.2236627668603372E-004 + 777.58807615230467 , 18682745489.891937 , 2.3913794962876961E-004 + 777.58947895791596 , 20302628255.499592 , 2.5987343680944434E-004 + 777.59088176352714 , 22358607932.472149 , 2.8619116361449054E-004 + 777.59228456913831 , 25227532422.344646 , 3.2291494917507908E-004 + 777.59368737474961 , 29575157788.924503 , 3.7856677896510850E-004 + 777.59509018036078 , 36629269481.169189 , 4.6886286814466636E-004 + 777.59649298597208 , 48588778256.364532 , 6.2195028010334776E-004 + 777.59789579158326 , 69671797467.819061 , 8.9182279162885645E-004 + 777.59929859719455 , 106634638932.75105 , 1.3649642844712909E-003 + 777.60070140280561 , 170023346758.83838 , 2.1763689396509635E-003 + 777.60210420841690 , 277084167065.26294 , 3.5467965883123477E-003 + 777.60350701402808 , 453577705495.19098 , 5.8059947556636880E-003 + 777.60490981963937 , 736835149782.20654 , 9.4318197048964617E-003 + 777.60631262525055 , 1180813289478.9619 , 1.5114942996949305E-002 + 777.60771543086184 , 1868858308978.6213 , 2.3922233879085500E-002 + 777.60911823647302 , 2871451022636.4619 , 3.6755878983815181E-002 + 777.61052104208420 , 4301394518826.2251 , 5.5059809385307620E-002 + 777.61192384769549 , 6276284505884.8652 , 8.0339303889531616E-002 + 777.61332665330667 , 8915946622157.8965 , 0.11412818542389452 + 777.61472945891796 , 12328078476193.029 , 0.15780503259170123 + 777.61613226452914 , 16664454859357.646 , 0.21331263207632711 + 777.61753507014032 , 21855376092558.086 , 0.27975879613827126 + 777.61893787575150 , 27842301892459.500 , 0.35639418239744380 + 777.62034068136279 , 34499491688509.762 , 0.44160925409285612 + 777.62174348697408 , 41582861699517.898 , 0.53227962728907519 + 777.62314629258526 , 48757000113032.359 , 0.62411187751854147 + 777.62454909819655 , 55654309872806.023 , 0.71240059447964232 + 777.62595190380762 , 61799004279685.992 , 0.79105549100931294 + 777.62735470941891 , 66634577735949.898 , 0.85295304115530579 + 777.62875751503009 , 69882152647333.477 , 0.89452348427241823 + 777.63016032064138 , 71297040686779.359 , 0.91263469796281615 + 777.63156312625256 , 71147562917490.094 , 0.91072131444987181 + 777.63296593186385 , 69332126782578.672 , 0.88748290258009632 + 777.63436873747503 , 65617712947632.320 , 0.83993670839132739 + 777.63577154308621 , 60424077631676.281 , 0.77345580330280983 + 777.63717434869750 , 54130891145663.469 , 0.69290014078721118 + 777.63857715430868 , 47171983893826.086 , 0.60382294826414196 + 777.63997995991997 , 39986028017554.805 , 0.51183942960122430 + 777.64138276553115 , 32967480752034.383 , 0.42199881766319169 + 777.64278557114244 , 26378886547556.570 , 0.33766180138186364 + 777.64418837675350 , 20526998248860.707 , 0.26275495734820625 + 777.64559118236480 , 15579356974469.459 , 0.19942288843944092 + 777.64699398797597 , 11504848142386.049 , 0.14726731378699323 + 777.64839679358727 , 8266761921349.8496 , 0.10581833077731476 + 777.64979959919856 , 5780541163239.6904 , 7.3993569279212842E-002 + 777.65120240480974 , 3932528207533.0933 , 5.0338159295741328E-002 + 777.65260521042092 , 2592152216302.1382 , 3.3180734437263416E-002 + 777.65400801603209 , 1681492061498.4739 , 2.1523868660909461E-002 + 777.65541082164339 , 1066457940627.3055 , 1.3651151218870426E-002 + 777.65681362725456 , 663450237401.35632 , 8.4924688229147879E-003 + 777.65821643286586 , 407061122897.36517 , 5.2105713772318358E-003 + 777.65961923847703 , 248532095551.56909 , 3.1813277818102535E-003 + 777.66102204408821 , 152411681476.09891 , 1.9509429662563026E-003 + 777.66242484969951 , 96742034929.631989 , 1.2383464767212185E-003 + 777.66382765531068 , 64775050184.053940 , 8.2915490725501376E-004 + 777.66523046092198 , 46400855642.436302 , 5.9395728230527507E-004 + 777.66663326653315 , 35805285650.736061 , 4.5832962684839323E-004 + 777.66803607214445 , 29556874042.921047 , 3.7834761635110049E-004 + 777.66943887775551 , 25679693562.508152 , 3.2871846460291585E-004 + 777.67084168336680 , 23096241777.373909 , 2.9564965746085137E-004 + 777.67224448897798 , 21265121172.378967 , 2.7221106279535151E-004 + 777.67364729458927 , 19839312499.991001 , 2.5396067583177429E-004 + 777.67505010020045 , 18666813477.239754 , 2.3895280173143296E-004 + 777.67645290581174 , 17669662449.200954 , 2.2618950610185708E-004 + 777.67785571142292 , 16803997813.718531 , 2.1510933570300945E-004 + 777.67925851703410 , 16032153896.703600 , 2.0523015195307031E-004 + 777.68066132264539 , 15366174403.650085 , 1.9670612967442934E-004 + 777.68206412825657 , 14785064270.430695 , 1.8926852615343520E-004 + 777.68346693386786 , 14278645136.334274 , 1.8278705862036010E-004 + 777.68486973947904 , 13841573131.540075 , 1.7719333276103446E-004 + 777.68627254509033 , 13470999551.360739 , 1.7245090127360508E-004 + 777.68767535070140 , 13153915653.952354 , 1.6839322465015639E-004 + 777.68907815631269 , 12893348701.008709 , 1.6505907644173741E-004 + 777.69048096192398 , 12692464430.713030 , 1.6248898927309147E-004 + 777.69188376753516 , 12543991423.403372 , 1.6058989444017862E-004 + 777.69328657314645 , 12446724985.741055 , 1.5934638378613304E-004 + 777.69468937875763 , 12405050121.656652 , 1.5881462737756869E-004 + 777.69609218436881 , 12411688182.486322 , 1.5890142950897586E-004 + 777.69749498997999 , 12463734790.244249 , 1.5956963715237576E-004 + 777.69889779559128 , 12574797426.469061 , 1.6099345885837465E-004 + 777.70030060120246 , 12741152304.176409 , 1.6312524942686127E-004 + 777.70170340681375 , 12965927314.684532 , 1.6600507347450103E-004 + 777.70310621242493 , 13257835360.531250 , 1.6974451638822549E-004 + 777.70450901803611 , 13623904589.398640 , 1.7443358741530852E-004 + 777.70591182364740 , 14063652152.166405 , 1.8006612098496434E-004 + 777.70731462925858 , 14606799532.167736 , 1.8702271828746397E-004 + 777.70871743486987 , 15292369620.301870 , 1.9580310792658974E-004 + 777.71012024048105 , 16193183073.033592 , 2.0733983998227977E-004 + 777.71152304609234 , 17452323958.730778 , 2.2346524885334416E-004 + 777.71292585170340 , 19404269639.402611 , 2.4846264313691142E-004 + 777.71432865731470 , 22522164974.750683 , 2.8839110442159755E-004 + 777.71573146292587 , 27813669141.512711 , 3.5615468772182926E-004 + 777.71713426853717 , 37023832841.361656 , 4.7410043260960144E-004 + 777.71853707414846 , 53131391104.229065 , 6.8037392362279984E-004 + 777.71993987975964 , 81066532840.134430 , 1.0381109821907856E-003 + 777.72134268537081 , 129623533478.41202 , 1.6599307797477366E-003 + 777.72274549098199 , 211402926449.94550 , 2.7071952878908734E-003 + 777.72414829659328 , 344273015000.06519 , 4.4087253525915736E-003 + 777.72555110220446 , 555093206251.29858 , 7.1084815467136750E-003 + 777.72695390781575 , 879895526559.26318 , 1.1267888685113079E-002 + 777.72835671342693 , 1365440364421.3901 , 1.7485758593079510E-002 + 777.72975951903811 , 2073055192679.0520 , 2.6547448643648278E-002 + 777.73116232464940 , 3086602862755.9849 , 3.9526903441838943E-002 + 777.73256513026058 , 4451283845978.4180 , 5.7002958571590191E-002 + 777.73396793587187 , 6247506012893.5518 , 8.0005314278415451E-002 + 777.73537074148305 , 8532222835284.2266 , 0.10926331463127281 + 777.73677354709434 , 11337620074547.055 , 0.14518912931595823 + 777.73817635270552 , 14658286160464.619 , 0.18771345796399924 + 777.73957915831670 , 18503939986439.676 , 0.23696076036922950 + 777.74098196392788 , 22657175515681.945 , 0.29014694278790160 + 777.74238476953917 , 26960575596734.898 , 0.34525612694964114 + 777.74378757515046 , 31204925062211.270 , 0.39960911107456221 + 777.74519038076164 , 35132847664550.539 , 0.44990994436797782 + 777.74659318637293 , 38477804229454.727 , 0.49274533592640546 + 777.74799599198400 , 41003975774044.125 , 0.52509539649313108 + 777.74939879759529 , 42474383395082.289 , 0.54392538291332504 + 777.75080160320647 , 42836512159776.422 , 0.54856279088369853 + 777.75220440881776 , 42317164095384.773 , 0.54191203885637251 + 777.75360721442894 , 40701993514293.930 , 0.52122822380583156 + 777.75501002004023 , 38078035047935.445 , 0.48762590803538719 + 777.75641282565141 , 34648307046354.145 , 0.44370493710118980 + 777.75781563126259 , 30580093704213.562 , 0.39160754627353461 + 777.75921843687388 , 26307225326406.277 , 0.33688935054820185 + 777.76062124248506 , 22016684937778.539 , 0.28194484769551376 + 777.76202404809635 , 17924546974849.410 , 0.22954107903059842 + 777.76342685370753 , 14194952302566.404 , 0.18178002646113500 + 777.76482965931871 , 10933936819098.498 , 0.14001958181545504 + 777.76623246492989 , 8165507348085.8799 , 0.10456717559839933 + 777.76763527054118 , 5941502352550.4414 , 7.6086649269031970E-002 + 777.76903807615236 , 4218879276122.5298 , 5.4026801429038110E-002 + 777.77044088176365 , 2916457025532.7539 , 3.7348029968555109E-002 + 777.77184368737494 , 1963586299775.4858 , 2.5145602527447502E-002 + 777.77324649298600 , 1288590182361.8850 , 1.6501627138281103E-002 + 777.77464929859730 , 824164421641.78174 , 1.0554208020288980E-002 + 777.77605210420847 , 514070866012.65363 , 6.5831614639772365E-003 + 777.77745490981977 , 318031451168.85498 , 4.0726880538392938E-003 + 777.77885771543095 , 194758054487.00397 , 2.4940536042369218E-003 + 777.78026052104224 , 119327070298.23549 , 1.5280873317496790E-003 + 777.78166332665330 , 74312862764.346893 , 9.5163718325593839E-004 + 777.78306613226459 , 48014636101.619255 , 6.1486319662662253E-004 + 777.78446893787589 , 32745721250.281532 , 4.1933016975446936E-004 + 777.78587174348706 , 24155510068.295834 , 3.0932437423354046E-004 + 777.78727454909836 , 19151591108.765259 , 2.4524450404682315E-004 + 777.78867735470953 , 16108542604.683706 , 2.0627546478104282E-004 + 777.79008016032083 , 14139241420.963440 , 1.8105679153852710E-004 + 777.79148296593189 , 12758164072.634241 , 1.6337088790641276E-004 + 777.79288577154318 , 11699815939.413654 , 1.4981784007219148E-004 + 777.79428857715436 , 10836317440.360744 , 1.3876002689463743E-004 + 777.79569138276565 , 10105942239.917551 , 1.2940698397103604E-004 + 777.79709418837683 , 9461984816.7426567 , 1.2116060160116125E-004 + 777.79849699398812 , 8885087226.2209034 , 1.1377298213479380E-004 + 777.79989979959930 , 8363397919.8245277 , 1.0709235532897925E-004 + 777.80130260521048 , 7888944676.4212189 , 1.0101662945509754E-004 + 777.80270541082177 , 7449019881.7937698 , 9.5383071472322897E-005 + 777.80410821643295 , 7054499951.3719101 , 9.0330964462565188E-005 + 777.80551102204424 , 6692507236.3822784 , 8.5695399007799524E-005 + 777.80691382765542 , 6360121036.0580750 , 8.1438970328813286E-005 + 777.80831663326660 , 6054106049.5606747 , 7.7520248725513401E-005 + 777.80971943887778 , 5771846689.3371744 , 7.3905738586898447E-005 + 777.81112224448907 , 5508234593.9701605 , 7.0530022839737538E-005 + 777.81252505010036 , 5265535227.7252979 , 6.7422112987927289E-005 + 777.81392785571154 , 5041849841.8517704 , 6.4557694485169593E-005 + 777.81533066132283 , 4833900379.9781351 , 6.1894787691240265E-005 + 777.81673346693390 , 4640230157.3489685 , 5.9414738673210385E-005 + 777.81813627254519 , 4459502575.5771217 , 5.7100430714611525E-005 + 777.81953907815637 , 4289908984.1340356 , 5.4928702647501489E-005 + 777.82094188376766 , 4129711886.2445054 , 5.2877304258354231E-005 + 777.82234468937884 , 3981604296.4342694 , 5.0980722433090566E-005 + 777.82374749499013 , 3842326194.6322269 , 4.9197209896368173E-005 + 777.82515030060131 , 3711391096.4104853 , 4.7520535559612926E-005 + 777.82655310621249 , 3587997353.0390682 , 4.5940434282716434E-005 + 777.82795591182378 , 3471572967.3036470 , 4.4449580786109263E-005 + 777.82935871743496 , 3360067592.1707411 , 4.3021718703921213E-005 + 777.83076152304625 , 3255881926.7765608 , 4.1687591333198759E-005 + 777.83216432865743 , 3157383770.4987745 , 4.0426297487851792E-005 + 777.83356713426861 , 3064063262.0374284 , 3.9231306719728477E-005 + 777.83496993987978 , 2975476948.1041284 , 3.8096940963603363E-005 + 777.83637274549108 , 2891311693.9597964 , 3.7019189620437318E-005 + 777.83777555110225 , 2810686898.5880394 , 3.5986776171937754E-005 + 777.83917835671355 , 2733801924.4124570 , 3.5002253685025252E-005 + 777.84058116232484 , 2661211940.1934185 , 3.4072731940728426E-005 + 777.84198396793590 , 2591920028.6871052 , 3.3185444375492127E-005 + 777.84338677354719 , 2525827229.0124373 , 3.2339123253480050E-005 + 777.84478957915837 , 2462662615.3110633 , 3.1530299395843117E-005 + 777.84619238476967 , 2402226521.5867658 , 3.0756415736687421E-005 + 777.84759519038084 , 2343517108.6224546 , 3.0004642977252796E-005 + 777.84899799599214 , 2288211241.1168218 , 2.9296455006195856E-005 + 777.85040080160331 , 2235067389.1012220 , 2.8615953500966181E-005 + 777.85180360721449 , 2184186233.3726940 , 2.7964426540420997E-005 + 777.85320641282578 , 2135318740.3722372 , 2.7338685931908022E-005 + 777.85460921843696 , 2088386170.3706317 , 2.6737722705008914E-005 + 777.85601202404825 , 2042815947.6575794 , 2.6154204853345049E-005 + 777.85741482965943 , 1999196590.0630774 , 2.5595668931944723E-005 + 777.85881763527073 , 1957400991.5442321 , 2.5060487568104902E-005 + 777.86022044088179 , 1917146470.3529484 , 2.4545040376852452E-005 + 777.86162324649308 , 1878380940.9376070 , 2.4048660371875019E-005 + 777.86302605210426 , 1840997356.1210327 , 2.3569976691747509E-005 + 777.86442885771555 , 1804797945.1803081 , 2.3106456665510791E-005 + 777.86583166332673 , 1769579517.4099448 , 2.2655498391445300E-005 + 777.86723446893802 , 1735964348.4753726 , 2.2225070789894588E-005 + 777.86863727454920 , 1703397663.6393018 , 2.1808069782919859E-005 + 777.87004008016038 , 1671983677.4474673 , 2.1405829125102396E-005 + 777.87144288577167 , 1641574660.4460378 , 2.1016457655883978E-005 + 777.87284569138285 , 1612152936.1287153 , 2.0639728521759436E-005 + 777.87424849699414 , 1583301548.4178894 , 2.0270302494710081E-005 + 777.87565130260532 , 1555651931.8531849 , 1.9916265714253244E-005 + 777.87705410821650 , 1528853130.0081584 , 1.9573124198989733E-005 + 777.87845691382768 , 1502899417.2825775 , 1.9240804081188499E-005 + 777.87985971943897 , 1477729202.2831450 , 1.8918516940105665E-005 + 777.88126252505026 , 1453305982.5171614 , 1.8605795096053316E-005 + 777.88266533066144 , 1429441906.8509672 , 1.8300233007669817E-005 + 777.88406813627273 , 1406233589.6891677 , 1.8003068013940597E-005 + 777.88547094188380 , 1383848674.7585859 , 1.7716447092464248E-005 + 777.88687374749509 , 1362054213.6284080 , 1.7437387167985439E-005 + 777.88827655310627 , 1340908826.8920567 , 1.7166638540806057E-005 + 777.88967935871756 , 1320328888.2161517 , 1.6903130666046546E-005 + 777.89108216432874 , 1300299363.4650390 , 1.6646670672921004E-005 + 777.89248496994003 , 1280550520.5033984 , 1.6393804612225904E-005 + 777.89388777555121 , 1261590314.0585217 , 1.6151037342081933E-005 + 777.89529058116239 , 1243056467.3401031 , 1.5913729911789981E-005 + 777.89669338677368 , 1225049243.8669031 , 1.5683165648041208E-005 + 777.89809619238486 , 1207490163.9055545 , 1.5458340048558702E-005 + 777.89949899799615 , 1190379261.3239818 , 1.5239253170173350E-005 + 777.90090180360733 , 1173542027.8000691 , 1.5023670418858536E-005 + 777.90230460921862 , 1157191349.2062128 , 1.4814318059792372E-005 + 777.90370741482968 , 983760610.69240117 , 1.2596090601633556E-005 + 777.90511022044097 , 969077202.73872733 , 1.2408074149826504E-005 + 777.90651302605215 , 954786709.23217595 , 1.2225088877258528E-005 + 777.90791583166344 , 940841271.87917161 , 1.2046522113469937E-005 + 777.90931863727474 , 927179597.14952445 , 1.1871588941028382E-005 + 777.91072144288592 , 913749867.87698448 , 1.1699625796335600E-005 + 777.91212424849709 , 900778627.31945610 , 1.1533533804574463E-005 + 777.91352705410827 , 888054773.04901135 , 1.1370609876982164E-005 + 777.91492985971956 , 875679054.94376028 , 1.1212143608714108E-005 + 777.91633266533074 , 863584432.19321072 , 1.1057276799609586E-005 + 777.91773547094203 , 851761891.23787844 , 1.0905894026888729E-005 + 777.91913827655321 , 840063111.76941288 , 1.0756095910541960E-005 + 777.92054108216439 , 828743496.51966512 , 1.0611153132915228E-005 + 777.92194388777568 , 817660762.33176768 , 1.0469243812918437E-005 + 777.92334669338686 , 806832715.36057079 , 1.0330595706517182E-005 + 777.92474949899815 , 796256594.03687894 , 1.0195173428196823E-005 + 777.92615230460933 , 785905271.71413612 , 1.0062629709803334E-005 + 777.92755511022062 , 775707322.09443617 , 9.9320498726098049E-006 + 777.92895791583169 , 765714382.70224988 , 9.8040951886028746E-006 + 777.93036072144298 , 755993980.79637051 , 9.6796304723532407E-006 + 777.93176352705416 , 746445404.36373007 , 9.5573661036307047E-006 + 777.93316633266545 , 737129495.43805134 , 9.4380808601260715E-006 + 777.93456913827663 , 728001314.33772182 , 9.3211994663401288E-006 + 777.93597194388792 , 719047970.12598956 , 9.2065568447260621E-006 + 777.93737474949910 , 710167328.48792040 , 9.0928450702449897E-006 + 777.93877755511028 , 701576740.68342602 , 8.9828475383456369E-006 + 777.94018036072157 , 693117239.46077907 , 8.8745287227807451E-006 + 777.94158316633275 , 684848866.63983643 , 8.7686571641087375E-006 + 777.94298597194404 , 676747836.90635669 , 8.6649283780849744E-006 + 777.94438877755522 , 668800824.83819830 , 8.5631717726629838E-006 + 777.94579158316640 , 660933810.90090370 , 8.4624394592358671E-006 + 777.94719438877758 , 653251251.71636498 , 8.3640691082544278E-006 + 777.94859719438887 , 645730494.58202815 , 8.2677707217923026E-006 + 777.95000000000016 , 638339260.26985168 , 8.1731308946191194E-006 diff --git a/regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_O/analyze.ini b/regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_O/analyze.ini new file mode 100644 index 000000000..87ca3c7ce --- /dev/null +++ b/regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_O/analyze.ini @@ -0,0 +1,5 @@ +compare_data_file_name = Radiation_Emission_Absorption.csv +compare_data_file_reference = Radiation_Emission_Absorption_reference.csv +compare_data_file_tolerance = 1E-5 +compare_data_file_tolerance_type = relative + diff --git a/regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_O/command_line.ini b/regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_O/command_line.ini new file mode 100644 index 000000000..0100a3584 --- /dev/null +++ b/regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_O/command_line.ini @@ -0,0 +1 @@ +MPI=1 diff --git a/regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_O/cube_mesh.h5 b/regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_O/cube_mesh.h5 new file mode 100755 index 0000000000000000000000000000000000000000..5a856e34960bcfa98ab26b8a4b4d22cc1e8a5197 GIT binary patch literal 6872 zcmeHLKT}gd5Z{*shy-R5z<*RJsjMih3?@XACNhFb;~0boi4*cL{2Az&vB8dyKxxS* zaQp!NVaCSJuRv!RZ*O-K?wv0ojD#q;;_dD3y?wjC+q>I$?{l+{Mu#Vd0b4W*5s2%q zJnGzjOp-)+(HFVnFg;-UAw(SqVt~3kERVDOWS9g~JZ|A>HVY5}u`iTggT+DWMOkoo zmpWos#`Wp{i9jyPM&9-9LLFrw@g)?5$yxH1;O4kYz6$d1@++8NSz zs@aOWzWEpI%$HZ(4(#x9RX)s+-@yJ9ypHS;mZ0ni-lG)PvugS6w##0fKfb14f3(Nm zo!_4L=fI%e=jeg+I7M-XXl7)7a|7B$A5okFoE>rL#@8}{??WB&V5=|RfYki@SSUTC}b{NsXnkq1$X3o*j@5f_XZ zV?<2xh)QQ()!fyJyS!E2ag*1solOgc1`v$*Qhtg$P{(eGI`ElknWU48i`mDhlh02G9Qqyq7#k0By~NlDxfk&Bov)WVxJ&kA|P40aocdyV(znKf6P)D0zy^Y1||%##ZWc^6yuiapA!5AUS9)M literal 0 HcmV?d00001 diff --git a/regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_O/parameter.ini b/regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_O/parameter.ini new file mode 100755 index 000000000..184179e42 --- /dev/null +++ b/regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_O/parameter.ini @@ -0,0 +1,97 @@ +! =============================================================================== ! +! EQUATION (linearscalaradvection) +! =============================================================================== ! +IniExactFunc = 0 + +! =============================================================================== ! +! DISCRETIZATION +! =============================================================================== ! +N = 1 ! Polynomial degree +NAnalyze = 1 ! Number of analyze points + +! =============================================================================== ! +! MESH +! =============================================================================== ! +MeshFile = cube_mesh.h5 +useCurveds = F +! if boundaries have to be changed (else they are used from Mesh directly): + +! =============================================================================== ! +! OUTPUT / VISUALIZATION +! =============================================================================== ! +ProjectName = RadLas = T +CalcKineticEnergy = TRUE +CalcTemp = TRUE +CalcNumSpec = TRUE +CalcInternalEnergy = TRUE +CalcReacRates=FALSE ! Compile with TimeDisc=42 +Logging = F +! =============================================================================== ! +! CALCULATION +! =============================================================================== ! +tend = 5E-5 ! End time +Analyze_dt = 5E-5 ! Timestep of analyze outputs +CFLscale = 0.2 ! Scaling of theoretical CFL number +! =============================================================================== ! +! PARTICLES +! =============================================================================== ! +Part-maxParticleNumber=10 +Part-nSpecies=1 +Part-nBounds=1 +Part-Boundary1-SourceName=BC_reflective +Part-Boundary1-Condition=reflective +Part-FIBGMdeltas=(/4.64E-4,4.64E-4,4.64E-4/) +! =============================================================================== ! +! Species1 - O +! =============================================================================== ! +Part-Species1-MacroParticleFactor=4E10 +Part-Species1-MassIC=2.65700E-26 ! O Molecular Mass + +Part-Species1-SpeciesName=O +Part-Species1-InteractionID = 1 +Part-Species1-Tref =273 +Part-Species1-dref = 3.0E-10 +Part-Species1-omega=0.24 + +Part-Species1-RadiationTtrans=20000.0 +Part-Species1-RadiationTelec=10000.0 +Part-Species1-RadiationNumDens=1.0E+21 +Part-Species1-RadiationIonizationEn = 109837.1 +Part-Species1-RadiationRadius_A = 0.66 +Part-Species1-Starkex = 0.0 +Part-Species1-NuclCharge = 1 +Radiation-Species1-SpectraFileName = Oi_NIST.dat +! =============================================================================== ! +! Electrons +! =============================================================================== ! +Radiation-NumDensElectrons=1.0E+21 +Radiation-TElectrons =10000.0 + +! =============================================================================== ! +! DSMC +! =============================================================================== ! +UseDSMC=true +Particles-DSMCReservoirSim=true +Particles-DSMC-CollisMode=2 !(1:elast coll, 2: elast + rela, 3:chem) +Part-NumberOfRandomSeeds =2 +Particles-RandomSeed1= 1 +Particles-RandomSeed2= 2 +Particles-DSMC-CalcQualityFactors=TRUE + +Particles-ManualTimeStep=5E-5 + +! =============================================================================== ! +! Radiation +! =============================================================================== ! +Radiation-RadType = 3 ! 1:particle radiation, 2:black body radiation, 3:rad solver + +Radiation-bb-atoms = t ! atomic line radiation (t,f) +Radiation-bb-molecules = f ! molecular band radiation (t,f) +Radiation-bf = f ! bound-free radiation +Radiation-ff = f ! free-free radiation + +Radiation-MinWaveLen =777.25 ! minimum wavelength [nm] +Radiation-MaxWaveLen =777.95 ! maximum Wavelength [nm] +Radiation-WaveLenDiscr =500 ! number of discretization points + + diff --git a/regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_O/readme.md b/regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_O/readme.md new file mode 100644 index 000000000..27fa5e718 --- /dev/null +++ b/regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_O/readme.md @@ -0,0 +1,3 @@ +# Radiation - Emission and absorption +* Testing cell local emission and absorption coefficient of radiation solver +* Comparison: emission and absorption coefficient of atomic bound-bound transitions of atomic oxygen (777 nm triplet) diff --git a/regressioncheck/NIG_Radiation/builds.ini b/regressioncheck/NIG_Radiation/builds.ini new file mode 100644 index 000000000..4b565029a --- /dev/null +++ b/regressioncheck/NIG_Radiation/builds.ini @@ -0,0 +1,17 @@ +! relative binary path in build directory +binary=./bin/piclas + +! fixed compiler flags +CMAKE_BUILD_TYPE = RELEASE +LIBS_BUILD_HDF5 = OFF +PICLAS_POLYNOMIAL_DEGREE = N +PICLAS_EQNSYSNAME = maxwell +PICLAS_TIMEDISCMETHOD = Radiation +LIBS_USE_MPI = ON +PICLAS_NODETYPE = GAUSS +PICLAS_INTKIND8 = ON,OFF + +!PICLAS_MEASURE_MPI_WAIT = ON + +! exclude combinations +!EXCLUDE:PICLAS_EQNSYSNAME=poisson,PICLAS_TIMEDISCMETHOD=DSMC From ee6b3544c4e89bdd8fbbd25e3b4780579f8a81a1 Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Wed, 18 Oct 2023 22:30:43 +0200 Subject: [PATCH 251/495] Bugfix: SampElectronicExcitation=T led to a skipping of the surface output --- src/particles/dsmc/dsmc_analyze.f90 | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/particles/dsmc/dsmc_analyze.f90 b/src/particles/dsmc/dsmc_analyze.f90 index b8972d88f..60a7b2815 100644 --- a/src/particles/dsmc/dsmc_analyze.f90 +++ b/src/particles/dsmc/dsmc_analyze.f90 @@ -791,7 +791,7 @@ SUBROUTINE CalcMacroElecExcitation(MacroElecExcitation) USE MOD_PreProc USE MOD_Globals USE MOD_Mesh_Vars ,ONLY: nElems -USE MOD_Particle_Vars ,ONLY: WriteMacroSurfaceValues,MacroValSampTime +USE MOD_Particle_Vars ,ONLY: WriteMacroVolumeValues,WriteMacroSurfaceValues,MacroValSampTime USE MOD_Particle_Vars ,ONLY: ExcitationSampleData,ExcitationLevelCounter USE MOD_Restart_Vars ,ONLY: RestartTime USE MOD_TimeDisc_Vars ,ONLY: TEnd @@ -810,11 +810,13 @@ SUBROUTINE CalcMacroElecExcitation(MacroElecExcitation) REAL :: TimeSample !=================================================================================================================================== -! Determine the sampling time for the calculation of the rate (TODO: SAME AS IN CalcSurfaceValues) -IF (WriteMacroSurfaceValues) THEN +! Determine the sampling time for the calculation of the rate +IF (WriteMacroVolumeValues) THEN ! Elapsed time since last sampling (variable dt's possible!) TimeSample = Time - MacroValSampTime - MacroValSampTime = Time + ! Set MacroValSampTime to the current time for the next output, BUT only if it is not used in CalcSurfaceValues, otherwise CalcSurfaceValues will be skipped + ! TODO: Have a global calculation of the sample time before the output regardless of surface and/or volume output + IF(.NOT.WriteMacroSurfaceValues) MacroValSampTime = Time ELSE IF (RestartTime.GT.(1-DSMC%TimeFracSamp)*TEnd) THEN ! Sampling at the end of the simulation: When a restart is performed and the sampling starts immediately, determine the correct sampling time ! (e.g. sampling is set to 20% of tend = 1s, and restart is performed at 0.9s, sample time = 0.1s) From 576495ce0e69b6f41e9bc691dfb4cf52968666c4 Mon Sep 17 00:00:00 2001 From: Patrick Kopper Date: Fri, 8 Sep 2023 08:12:52 +0200 Subject: [PATCH 252/495] Work around GCC13 parse_associate issue GCC13 introduced an issue with parse_associate. The fix is applied to versions after GCC13.2, see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109948. For GCC13.1/13.2, work around the issue by explicitly passing the associate array bounds to gfortran --- .../particle_mpi/particle_mpi_emission.f90 | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/particles/particle_mpi/particle_mpi_emission.f90 b/src/particles/particle_mpi/particle_mpi_emission.f90 index 805067cd8..d5736a67a 100644 --- a/src/particles/particle_mpi/particle_mpi_emission.f90 +++ b/src/particles/particle_mpi/particle_mpi_emission.f90 @@ -361,10 +361,10 @@ SUBROUTINE InitEmissionComm() lineVector = UNITVECTOR(normal) END IF ! VECNORM(lineVector).LE.0. - xCoords(1:3,1)=O - xCoords(1:3,2)=O+v2 - xCoords(1:3,3)=O+v3 - xCoords(1:3,4)=O+v2+v3 + xCoords(1:3,1)=O(1:3) + xCoords(1:3,2)=O(1:3)+v2(1:3) + xCoords(1:3,3)=O(1:3)+v3(1:3) + xCoords(1:3,4)=O(1:3)+v2(1:3)+v3(1:3) height= Species(iSpec)%Init(iInit)%CuboidHeightIC DO iNode=1,4 @@ -403,11 +403,11 @@ SUBROUTINE InitEmissionComm() ! 1. Check if inside outer radius radius = Species(iSpec)%Init(iInit)%RadiusIC ! here no radius, already included - xCoords(1:3,1)=Species(iSpec)%Init(iInit)%BasePointIC -v1 -v2 + xCoords(1:3,1)=Species(iSpec)%Init(iInit)%BasePointIC -v1(1:3) -v2(1:3) - xCoords(1:3,2)=xCoords(1:3,1)+2.0*v1 - xCoords(1:3,3)=xCoords(1:3,1)+2.0*v2 - xCoords(1:3,4)=xCoords(1:3,1)+2.0*v1+2.0*v2 + xCoords(1:3,2)=xCoords(1:3,1)+2.0*v1(1:3) + xCoords(1:3,3)=xCoords(1:3,1)+2.0*v2(1:3) + xCoords(1:3,4)=xCoords(1:3,1)+2.0*v1(1:3)+2.0*v2(1:3) height= Species(iSpec)%Init(iInit)%CylinderHeightIC DO iNode=1,4 From 7d4d2fdf5261ec4feb31bcb081560a2147ac00f9 Mon Sep 17 00:00:00 2001 From: Patrick Kopper Date: Mon, 12 Jun 2023 15:29:17 +0200 Subject: [PATCH 253/495] Fixes for GCC13 --- src/io_hdf5/hdf5_input.f90 | 4 +++- src/output/output_vtk.f90 | 8 ++++++-- src/piclas.h | 4 ++-- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/io_hdf5/hdf5_input.f90 b/src/io_hdf5/hdf5_input.f90 index a696081a9..ce039326a 100644 --- a/src/io_hdf5/hdf5_input.f90 +++ b/src/io_hdf5/hdf5_input.f90 @@ -372,7 +372,9 @@ SUBROUTINE GetDataProps(DatasetName,nVar_HDF5,N_HDF5,nElems_HDF5,NodeType_HDF5,n ! Dimensional shift (optional) if arrays with rank > 5 are processed (e.g. DG_Solution from state files with an additional ! dimension that corresponds to time) -nDimsOffset_loc = MERGE(nDimsOffset_opt, 0, PRESENT(nDimsOffset_opt)) +IF (PRESENT(nDimsOffset_opt)) THEN; nDimsOffset_loc = nDimsOffset_opt +ELSE ; nDimsOffset_loc = 0 +END IF ! Read in attributes ! Open given dataset with default properties. diff --git a/src/output/output_vtk.f90 b/src/output/output_vtk.f90 index 8f9576575..bacb6a3d9 100644 --- a/src/output/output_vtk.f90 +++ b/src/output/output_vtk.f90 @@ -180,8 +180,12 @@ SUBROUTINE WriteDataToVTK(nVal,NVisu,nElems,VarNames,Coord,Value,FileString,dim, REAL :: StartT,EndT ! Timer !=================================================================================================================================== GETTIME(StartT) -DGFV_loc = MERGE(DGFV, 0, PRESENT(DGFV)) -nValAtLastDimension_loc = MERGE(nValAtLastDimension, .FALSE., PRESENT(nValAtLastDimension)) +IF (PRESENT(DGFV)) THEN; DGFV_loc = DGFV +ELSE; DGFV_loc = 0 +END IF +IF (PRESENT(nValAtLastDimension)) THEN; nValAtLastDimension_loc = nValAtLastDimension +ELSE; nValAtLastDimension_loc = .FALSE. +END IF IF (dim.EQ.3) THEN NVisu_k = NVisu NVisu_j = NVisu diff --git a/src/piclas.h b/src/piclas.h index e194f97e4..f96d27015 100644 --- a/src/piclas.h +++ b/src/piclas.h @@ -57,8 +57,8 @@ #define UNLOCK_AND_FREE(a) UNLOCK_AND_FREE_DUMMY(a,'a') #ifdef GNU -#define CHECKSAFEINT(x,k) IF(x>HUGE(1_ k).OR.x<-HUGE(1_ k)) CALL ABORT(__STAMP__,'Integer KIND=k conversion failed: out of range!') -#define CHECKSAFEREAL(x,k) IF(x>HUGE(1._ k).OR.x<-HUGE(1._ k)) CALL ABORT(__STAMP__,'Real KIND=k conversion failed: out of range!') +#define CHECKSAFEINT(x,k) IF(x>HUGE(INT( 1,KIND=k)).OR.x<-HUGE(INT( 1,KIND=k))) CALL Abort(__STAMP__,'Integer conversion failed: out of range!') +#define CHECKSAFEREAL(x,k) IF(x>HUGE(REAL(1,KIND=k)).OR.x<-HUGE(REAL(1,KIND=k))) CALL Abort(__STAMP__,'Real conversion failed: out of range!') #elif CRAY #define CHECKSAFEINT(x,k) #define CHECKSAFEREAL(x,k) From d267bf529882433bdbf24c2837e9ebf37c936db7 Mon Sep 17 00:00:00 2001 From: Julian Beyer Date: Thu, 19 Oct 2023 16:43:27 +0200 Subject: [PATCH 254/495] up --- .gitlab-ci.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d5b2d761d..0c1fcdf2b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -683,6 +683,12 @@ NIG_Photoionization_petsc_debug: script: - if [ -n "${DO_NIGHTLY}" ]; then cd build_poisson_petsc_debug ; fi - if [ -n "${DO_NIGHTLY}" ]; then python ./reggie/reggie.py ../regressioncheck/NIG_Photoionization -e ./bin/piclas ; fi + +NIG_Radiation: + <<: *defaults_nightly + stage: reggie_nightly + script: + - if [ -n "${DO_NIGHTLY}" ]; then cd build ; python ./reggie/reggie.py ../regressioncheck/NIG_Radiation/ ; fi # ---------------------------------------------------------------------------------------------------------------------------------------------------- # Stage "reggie_nightly_build_all": Build and run From 0cbd389c25a6e47fe282b6cfc8be77c8d1ac947e Mon Sep 17 00:00:00 2001 From: Julian Beyer Date: Thu, 19 Oct 2023 17:18:26 +0200 Subject: [PATCH 255/495] removed virtual cell merge --- .../radiation_solver/radiation_init.f90 | 219 +----------------- 1 file changed, 3 insertions(+), 216 deletions(-) diff --git a/src/radiation/radiation_solver/radiation_init.f90 b/src/radiation/radiation_solver/radiation_init.f90 index f61a09113..83720b997 100644 --- a/src/radiation/radiation_solver/radiation_init.f90 +++ b/src/radiation/radiation_solver/radiation_init.f90 @@ -104,7 +104,7 @@ SUBROUTINE InitRadiation() USE MOD_Mesh_Vars, ONLY : nElems, nGlobalElems USE MOD_Particle_Mesh_Vars, ONLY : nComputeNodeElems USE MOD_ReadInTools -USE MOD_PARTICLE_Vars, ONLY : nSpecies, Species, DoVirtualCellMerge +USE MOD_PARTICLE_Vars, ONLY : nSpecies, Species USE MOD_Radiation_Vars USE MOD_DSMC_Vars, ONLY : SpecDSMC USE MOD_Radiation_ReadIn, ONLY : Radiation_readin_atoms, Radiation_readin_molecules @@ -133,8 +133,6 @@ SUBROUTINE InitRadiation() SpeciesRadiation(:)%nLevels = 0 SpeciesRadiation(:)%nLines = 0 -IF (DoVirtualCellMerge) CALL CellMergeRad() - IF (RadiationSwitches%RadType.NE.2) THEN DO iSpec = 1, nSpecies IF(SpecDSMC(iSpec)%InterID.EQ.4) CYCLE @@ -317,13 +315,13 @@ SUBROUTINE MacroscopicRadiationInput() USE MOD_io_hdf5 USE MOD_HDF5_Input ,ONLY: OpenDataFile,CloseDataFile,DatasetExists,ReadArray,GetDataProps USE MOD_Mesh_Vars ,ONLY: offsetElem, nElems - USE MOD_Particle_Vars ,ONLY: nSpecies, DoVirtualCellMerge, VirtMergedCells + USE MOD_Particle_Vars ,ONLY: nSpecies USE MOD_DSMC_Vars ,ONLY: SpecDSMC USE MOD_Radiation_Vars ,ONLY: RadiationSwitches, MacroRadInputParameters, MacroRadInputParameters_Shared, & MacroRadInputParameters_Shared_Win USE MOD_Mesh_Tools ,ONLY: GetCNElemID USE MOD_ReadInTools - USE MOD_Particle_Mesh_Vars ,ONLY: nComputeNodeElems, ElemVolume_Shared + USE MOD_Particle_Mesh_Vars ,ONLY: nComputeNodeElems #if USE_MPI !USE MOD_MPI_Shared_Vars USE MOD_MPI_Shared @@ -343,7 +341,6 @@ SUBROUTINE MacroscopicRadiationInput() CHARACTER(LEN=300) :: MacroRadiationInputFile INTEGER, ALLOCATABLE :: SortElemInd(:) REAL, ALLOCATABLE :: SortElemYPos(:) - INTEGER :: CNMasterElemID, masterElemID !=================================================================================================================================== MacroRadiationInputFile = GETSTR('Radiation-MacroInput-Filename') @@ -434,36 +431,6 @@ SUBROUTINE MacroscopicRadiationInput() END IF END IF -IF (DoVirtualCellMerge) THEN - DO iElem =1, nElems - CNElemID = GetCNElemID(iElem+offsetElem) - IF (VirtMergedCells(iElem)%isMerged) CYCLE - IF (VirtMergedCells(iElem)%NumOfMergedCells.GT.0) THEN - - print*, 'IsMerged', iElem, VirtMergedCells(iElem)%NumOfMergedCells - MacroRadInputParameters(CNElemID,:,1:5) = MacroRadInputParameters(CNElemID,:,1:5)*ElemVolume_Shared(CNElemID)/VirtMergedCells(iElem)%MergedVolume - END IF - END DO - - DO iElem =1, nElems - CNElemID = GetCNElemID(iElem+offsetElem) - IF (VirtMergedCells(iElem)%isMerged) THEN - masterElemID = VirtMergedCells(iElem)%MasterCell - offSetElem - CNMasterElemID = GetCNElemID(masterElemID+offsetElem) - MacroRadInputParameters(CNMasterElemID,:,1:5) = MacroRadInputParameters(CNMasterElemID,:,1:5) + MacroRadInputParameters(CNElemID,:,1:5)*ElemVolume_Shared(CNElemID)/VirtMergedCells(masterElemID)%MergedVolume - END IF - END DO - - DO iElem =1, nElems - CNElemID = GetCNElemID(iElem+offsetElem) - IF (VirtMergedCells(iElem)%isMerged) THEN - masterElemID = VirtMergedCells(iElem)%MasterCell - offSetElem - CNMasterElemID = GetCNElemID(masterElemID+offsetElem) - MacroRadInputParameters(CNElemID,:,1:5) = MacroRadInputParameters(CNMasterElemID,:,1:5) - END IF - END DO -END IF - #if USE_MPI CALL BARRIER_AND_SYNC(MacroRadInputParameters_Shared_Win ,MPI_COMM_SHARED) #endif @@ -566,184 +533,4 @@ SUBROUTINE FinalizeRadiation() END SUBROUTINE FinalizeRadiation - - - -SUBROUTINE CellMergeRad() -!=================================================================================================================================== -!> Routine for virtual merging of neighbouring cells. -!> Currently, the merging is only done via the number of particles within the cells. -!=================================================================================================================================== -! MODULES -USE MOD_Particle_Vars, ONLY: VirtMergedCells, PEM, VirtualCellMergeSpread, MaxNumOfMergedCells -USE MOD_Mesh_Vars, ONLY: nElems,offsetElem -USE MOD_Particle_Mesh_Vars, ONLY: ElemToElemMapping,ElemToElemInfo, ElemVolume_Shared -USE MOD_Mesh_Tools, ONLY: GetCNElemID, GetGlobalElemID -! IMPLICIT VARIABLE HANDLING - IMPLICIT NONE -!----------------------------------------------------------------------------------------------------------------------------------- -! INPUT VARIABLES -!----------------------------------------------------------------------------------------------------------------------------------- -! OUTPUT VARIABLES -!----------------------------------------------------------------------------------------------------------------------------------- -! LOCAL VARIABLES -INTEGER :: CNElemID, GlobalElemID, iNbElem, GlobNbElem, LocNBElem, MasterCellID -INTEGER :: CNNbElem, iElem, iOldElem, currentCellCount -INTEGER, ALLOCATABLE :: tempCellID(:) -LOGICAL :: AllowBackMerge -!=================================================================================================================================== -!Nullify every value -DO iElem = 1, nElems - VirtMergedCells(iElem)%isMerged = .FALSE. - VirtMergedCells(iElem)%MasterCell = 0 - VirtMergedCells(iElem)%MergedVolume = 0.0 - IF (VirtMergedCells(iElem)%NumOfMergedCells.GT.0) THEN - DEALLOCATE(VirtMergedCells(iElem)%MergedCellID) - VirtMergedCells(iElem)%NumOfMergedCells=0 - END IF -END DO - -!Loop over all cells and neighbouring cells to merge them -ElemLoop: DO iElem = 1, nElems - IF(VirtMergedCells(iElem)%isMerged) CYCLE - - GlobalElemID = iElem + offSetElem - CNElemID = GetCNElemID(GlobalElemID) - AllowBackMerge = .TRUE. - NBElemLoop: DO iNbElem = 1,ElemToElemMapping(2,CNElemID) - GlobNbElem = GetGlobalElemID(ElemToElemInfo(ElemToElemMapping(1,CNElemID)+iNbElem)) - LocNBElem = GlobNbElem-offSetElem - CNNbElem = GetCNElemID(GlobNbElem) - IF ((LocNBElem.LT.1).OR.(LocNBElem.GT.nElems)) CYCLE - IF(VirtMergedCells(LocNBElem)%isMerged.AND.AllowBackMerge) THEN - IF(VirtualCellMergeSpread.GT.1) THEN - IF (VirtMergedCells(iElem)%NumOfMergedCells.GT.0) THEN - MasterCellID = VirtMergedCells(LocNBElem)%MasterCell-offSetElem - IF(VirtMergedCells(MasterCellID)%NumOfMergedCells.GE.(MaxNumOfMergedCells-1)) CYCLE NBElemLoop - ALLOCATE(tempCellID(VirtMergedCells(MasterCellID)%NumOfMergedCells)) - tempCellID = VirtMergedCells(MasterCellID)%MergedCellID - DEALLOCATE(VirtMergedCells(MasterCellID)%MergedCellID) - VirtMergedCells(MasterCellID)%NumOfMergedCells = VirtMergedCells(MasterCellID)%NumOfMergedCells + 1 + VirtMergedCells(iElem)%NumOfMergedCells - ALLOCATE(VirtMergedCells(MasterCellID)%MergedCellID(1:VirtMergedCells(MasterCellID)%NumOfMergedCells)) - VirtMergedCells(MasterCellID)%MergedCellID(1:VirtMergedCells(MasterCellID)%NumOfMergedCells-1-VirtMergedCells(iElem)%NumOfMergedCells) = & - tempCellID(1:VirtMergedCells(MasterCellID)%NumOfMergedCells-1-VirtMergedCells(iElem)%NumOfMergedCells) - oldMasterElemLoop: DO iOldElem = 1, VirtMergedCells(iElem)%NumOfMergedCells - currentCellCount = VirtMergedCells(MasterCellID)%NumOfMergedCells-VirtMergedCells(iElem)%NumOfMergedCells -1 + iOldElem - VirtMergedCells(MasterCellID)%MergedCellID(currentCellCount) = VirtMergedCells(iElem)%MergedCellID(iOldElem) - VirtMergedCells(VirtMergedCells(iElem)%MergedCellID(iOldElem))%MasterCell = VirtMergedCells(LocNBElem)%MasterCell - END DO oldMasterElemLoop - VirtMergedCells(MasterCellID)%MergedCellID(VirtMergedCells(MasterCellID)%NumOfMergedCells) = iElem - VirtMergedCells(iElem)%MasterCell = VirtMergedCells(LocNBElem)%MasterCell - VirtMergedCells(iElem)%isMerged = .TRUE. - VirtMergedCells(MasterCellID)%MergedVolume=VirtMergedCells(MasterCellID)%MergedVolume+VirtMergedCells(iElem)%MergedVolume - VirtMergedCells(iElem)%MergedVolume = 0.0 - VirtMergedCells(iElem)%NumOfMergedCells = 0 - DEALLOCATE(VirtMergedCells(iElem)%MergedCellID) - DEALLOCATE(tempCellID) - CYCLE ElemLoop - ELSE - MasterCellID = VirtMergedCells(LocNBElem)%MasterCell-offSetElem - IF(VirtMergedCells(MasterCellID)%NumOfMergedCells.GE.(MaxNumOfMergedCells-1)) CYCLE NBElemLoop - ALLOCATE(tempCellID(VirtMergedCells(MasterCellID)%NumOfMergedCells)) - tempCellID = VirtMergedCells(MasterCellID)%MergedCellID - DEALLOCATE(VirtMergedCells(MasterCellID)%MergedCellID) - VirtMergedCells(MasterCellID)%NumOfMergedCells = VirtMergedCells(MasterCellID)%NumOfMergedCells + 1 - ALLOCATE(VirtMergedCells(MasterCellID)%MergedCellID(1:VirtMergedCells(MasterCellID)%NumOfMergedCells)) - VirtMergedCells(MasterCellID)%MergedCellID(1:VirtMergedCells(MasterCellID)%NumOfMergedCells-1) = & - tempCellID(1:VirtMergedCells(MasterCellID)%NumOfMergedCells-1) - VirtMergedCells(MasterCellID)%MergedCellID(VirtMergedCells(MasterCellID)%NumOfMergedCells) = iElem - VirtMergedCells(MasterCellID)%MergedVolume=VirtMergedCells(MasterCellID)%MergedVolume+ElemVolume_Shared(CNElemID) - VirtMergedCells(iElem)%MasterCell = VirtMergedCells(LocNBElem)%MasterCell - VirtMergedCells(iElem)%isMerged = .TRUE. - DEALLOCATE(tempCellID) - CYCLE ElemLoop - END IF - ELSE - CYCLE NBElemLoop - END IF - ELSE IF ((VirtMergedCells(LocNBElem)%NumOfMergedCells.GT.0).AND.AllowBackMerge) THEN - IF(VirtualCellMergeSpread.GT.0) THEN - IF (VirtMergedCells(iElem)%NumOfMergedCells.GT.0) THEN - MasterCellID = LocNBElem - IF(VirtMergedCells(MasterCellID)%NumOfMergedCells.GE.(MaxNumOfMergedCells-1)) CYCLE NBElemLoop - ALLOCATE(tempCellID(VirtMergedCells(MasterCellID)%NumOfMergedCells)) - tempCellID = VirtMergedCells(MasterCellID)%MergedCellID - DEALLOCATE(VirtMergedCells(MasterCellID)%MergedCellID) - VirtMergedCells(MasterCellID)%NumOfMergedCells = VirtMergedCells(MasterCellID)%NumOfMergedCells + 1 + VirtMergedCells(iElem)%NumOfMergedCells - ALLOCATE(VirtMergedCells(MasterCellID)%MergedCellID(1:VirtMergedCells(MasterCellID)%NumOfMergedCells)) - VirtMergedCells(MasterCellID)%MergedCellID(1:VirtMergedCells(MasterCellID)%NumOfMergedCells-1-VirtMergedCells(iElem)%NumOfMergedCells) = & - tempCellID(1:VirtMergedCells(MasterCellID)%NumOfMergedCells-1-VirtMergedCells(iElem)%NumOfMergedCells) - oldMasterElemLoop2: DO iOldElem = 1, VirtMergedCells(iElem)%NumOfMergedCells - currentCellCount = VirtMergedCells(MasterCellID)%NumOfMergedCells-VirtMergedCells(iElem)%NumOfMergedCells -1 + iOldElem - VirtMergedCells(MasterCellID)%MergedCellID(currentCellCount) = VirtMergedCells(iElem)%MergedCellID(iOldElem) - VirtMergedCells(VirtMergedCells(iElem)%MergedCellID(iOldElem))%MasterCell = MasterCellID + offSetElem - END DO oldMasterElemLoop2 - VirtMergedCells(MasterCellID)%MergedCellID(VirtMergedCells(MasterCellID)%NumOfMergedCells) = iElem - VirtMergedCells(iElem)%MasterCell = MasterCellID + offSetElem - VirtMergedCells(iElem)%isMerged = .TRUE. - VirtMergedCells(MasterCellID)%MergedVolume=VirtMergedCells(MasterCellID)%MergedVolume+VirtMergedCells(iElem)%MergedVolume - VirtMergedCells(iElem)%MergedVolume = 0.0 - VirtMergedCells(iElem)%NumOfMergedCells = 0 - DEALLOCATE(VirtMergedCells(iElem)%MergedCellID) - DEALLOCATE(tempCellID) - CYCLE ElemLoop - ELSE - MasterCellID = LocNBElem - IF(VirtMergedCells(MasterCellID)%NumOfMergedCells.GE.(MaxNumOfMergedCells-1)) CYCLE NBElemLoop - ALLOCATE(tempCellID(VirtMergedCells(MasterCellID)%NumOfMergedCells)) - tempCellID = VirtMergedCells(MasterCellID)%MergedCellID - DEALLOCATE(VirtMergedCells(MasterCellID)%MergedCellID) - VirtMergedCells(MasterCellID)%NumOfMergedCells = VirtMergedCells(MasterCellID)%NumOfMergedCells + 1 - ALLOCATE(VirtMergedCells(MasterCellID)%MergedCellID(1:VirtMergedCells(MasterCellID)%NumOfMergedCells)) - VirtMergedCells(MasterCellID)%MergedCellID(1:VirtMergedCells(MasterCellID)%NumOfMergedCells-1) = & - tempCellID(1:VirtMergedCells(MasterCellID)%NumOfMergedCells-1) - VirtMergedCells(MasterCellID)%MergedCellID(VirtMergedCells(MasterCellID)%NumOfMergedCells) = iElem - VirtMergedCells(MasterCellID)%MergedVolume=VirtMergedCells(MasterCellID)%MergedVolume+ElemVolume_Shared(CNElemID) - VirtMergedCells(iElem)%MasterCell = MasterCellID + offSetElem - VirtMergedCells(iElem)%isMerged = .TRUE. - DEALLOCATE(tempCellID) - CYCLE ElemLoop - END IF - ELSE - CYCLE NBElemLoop - END IF - ELSE IF (VirtMergedCells(LocNBElem)%isMerged.AND.(.NOT.AllowBackMerge)) THEN - CYCLE NBElemLoop - ELSE IF ((VirtMergedCells(LocNBElem)%NumOfMergedCells.GT.0).AND.(.NOT.AllowBackMerge)) THEN - CYCLE NBElemLoop - ELSE - IF(VirtualCellMergeSpread.LT.3) AllowBackMerge = .FALSE. - IF (VirtMergedCells(iElem)%NumOfMergedCells.EQ.0) THEN - VirtMergedCells(iElem)%MergedVolume = VirtMergedCells(iElem)%MergedVolume + ElemVolume_Shared(CNElemID) - VirtMergedCells(iElem)%NumOfMergedCells = VirtMergedCells(iElem)%NumOfMergedCells + 1 - ALLOCATE(VirtMergedCells(iElem)%MergedCellID(VirtMergedCells(iElem)%NumOfMergedCells)) - VirtMergedCells(iElem)%MergedCellID(VirtMergedCells(iElem)%NumOfMergedCells) = LocNBElem - VirtMergedCells(iElem)%MergedVolume = VirtMergedCells(iElem)%MergedVolume + ElemVolume_Shared(CNNbElem) - VirtMergedCells(iElem)%MasterCell = iElem + offSetElem - VirtMergedCells(LocNBElem)%MasterCell = iElem + offSetElem - VirtMergedCells(LocNBElem)%isMerged = .TRUE. - ELSE - IF(VirtMergedCells(iElem)%NumOfMergedCells.GE.(MaxNumOfMergedCells-1)) CYCLE ElemLoop - ALLOCATE(tempCellID(VirtMergedCells(iElem)%NumOfMergedCells)) - tempCellID = VirtMergedCells(iElem)%MergedCellID - DEALLOCATE(VirtMergedCells(iElem)%MergedCellID) - VirtMergedCells(iElem)%NumOfMergedCells = VirtMergedCells(iElem)%NumOfMergedCells + 1 - ALLOCATE(VirtMergedCells(iElem)%MergedCellID(VirtMergedCells(iElem)%NumOfMergedCells)) - VirtMergedCells(iElem)%MergedCellID(1:VirtMergedCells(iElem)%NumOfMergedCells-1) = & - tempCellID(1:VirtMergedCells(iElem)%NumOfMergedCells-1) - VirtMergedCells(iElem)%MergedCellID(VirtMergedCells(iElem)%NumOfMergedCells) = LocNBElem - VirtMergedCells(iElem)%MergedVolume = VirtMergedCells(iElem)%MergedVolume + ElemVolume_Shared(CNNbElem) - VirtMergedCells(LocNBElem)%MasterCell = iElem + offSetElem - VirtMergedCells(LocNBElem)%isMerged = .TRUE. - DEALLOCATE(tempCellID) - END IF - END IF - END DO NBElemLoop -END DO ElemLoop - -END SUBROUTINE CellMergeRad - - - - END MODULE MOD_Radiation_Init From 5c754769993da6437c942b0c9ae19ac4cf35a6eb Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Thu, 19 Oct 2023 19:04:08 +0200 Subject: [PATCH 256/495] WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_TruncAverage: Increased number of particles to avoid strong fluctuations --- .../parameter.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_TruncAverage/parameter.ini b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_TruncAverage/parameter.ini index 6aabb6569..2bd70e77a 100644 --- a/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_TruncAverage/parameter.ini +++ b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_TruncAverage/parameter.ini @@ -74,7 +74,7 @@ Part-FIBGMdeltas=(/2.5e-6,1e-5,1e-5/) ! Species1 - O2 ! =============================================================================== ! Part-Species1-MassIC=5.31352E-26 -Part-Species1-MacroParticleFactor=2E3 +Part-Species1-MacroParticleFactor=1E3 Part-Species1-nInits=1 Part-Species1-Init1-SpaceIC=cell_local From d38957edfaf6dc1331cc7b3c24298dda6caae88d Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Thu, 19 Oct 2023 19:47:38 +0200 Subject: [PATCH 257/495] Description of profile-guided optimization in the workflow documentation --- CMakeListsMachine.txt | 2 +- docs/documentation/userguide/workflow.md | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/CMakeListsMachine.txt b/CMakeListsMachine.txt index 1fd41e266..4bac8bc4f 100644 --- a/CMakeListsMachine.txt +++ b/CMakeListsMachine.txt @@ -290,7 +290,7 @@ IF (USE_PGO) SET(CMAKE_Fortran_FLAGS_RELEASE "${CMAKE_Fortran_FLAGS_RELEASE} -fprofile-use") SET(CMAKE_Fortran_FLAGS_PROFILE "${CMAKE_Fortran_FLAGS_PROFILE} -fprofile-generate") ELSE() - MESSAGE( SEND_ERROR "Profile-guided optimization (PGO) currently only supported for GNU compiler. Either set USE_GPO=OFF or use the GNU compiler." ) + MESSAGE( SEND_ERROR "Profile-guided optimization (PGO) currently only supported for GNU compiler. Either set USE_PGO=OFF or use the GNU compiler." ) ENDIF() ENDIF() diff --git a/docs/documentation/userguide/workflow.md b/docs/documentation/userguide/workflow.md index 9e4c29038..09b8117f3 100644 --- a/docs/documentation/userguide/workflow.md +++ b/docs/documentation/userguide/workflow.md @@ -193,6 +193,18 @@ the mesh is simply divided into parts along the space filling curve. Thus, domai not limited by e.g. an integer factor between the number of cores and elements. The only limitation is that the number of cores may not exceed the number of elements. +### Profile-guided optimization (PGO) + +To further increase performance for production runs, profile-guided optimization can be utilized with the GNU compiler. This requires the execution of a representative simulation run with PICLas compiled using profiling instrumentation. For this purpose, the code has to be configured and compiled using the following additional settings and the `Profile` build type: + + -DPICLAS_PERFORMANCE=ON -DUSE_PGO=ON -DCMAKE_BUILD_TYPE=Profile + +A short representative simulation has to be performed, where additional files with the profiling information will be stored. Note that the test run should be relatively short as the code will be substantially slower than the regular `Release` build type. Afterwards, the code can be configured and compiled again for the production runs, using the `Release` build type: + + -DPICLAS_PERFORMANCE=ON -DUSE_PGO=ON -DCMAKE_BUILD_TYPE=Release + +Warnings regarding missing profiling files (`-Wmissing-profile`) can be ignored, if they concern modules not relevant for the current simulation method (e.g. `bgk_colloperator.f90` will be missing profile information if only a DSMC simulation has been performed). + ## Post-processing **PICLas** comes with a tool for visualization. The piclas2vtk tool converts the HDF5 files generated by **PICLas** to the binary From 5b5660203fa45a17f450aa6a7ae242a647e392c4 Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Thu, 19 Oct 2023 23:50:43 +0200 Subject: [PATCH 258/495] WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstMassflow: increased sampling duration of adaptive BC --- .../ChannelFlow_AdaptiveBoundary_ConstMassflow/parameter.ini | 2 +- .../parameter.ini | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstMassflow/parameter.ini b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstMassflow/parameter.ini index e5f06d50d..75243fdf6 100644 --- a/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstMassflow/parameter.ini +++ b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstMassflow/parameter.ini @@ -105,7 +105,7 @@ Part-Species1-Surfaceflux2-Adaptive-Pressure=2.5 ! Continuous sample, where the current value is added partially, multiplied the relaxation factor AdaptiveBC-RelaxationFactor = 0.1 ! Sample is reset every given number of iterations -AdaptiveBC-SamplingIteration = 0,10,10,10 +AdaptiveBC-SamplingIteration = 0,20,20,20 ! Sample is not reset, current value replaces the oldest (DEFAULT: TRUE) AdaptiveBC-TruncateRunningAverage = F,F,T,T ! Average the sample over the whole BC diff --git a/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_TruncAverage/parameter.ini b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_TruncAverage/parameter.ini index 2bd70e77a..3de5cda38 100644 --- a/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_TruncAverage/parameter.ini +++ b/regressioncheck/WEK_DSMC/ChannelFlow_AdaptiveBoundary_ConstPressure_TruncAverage/parameter.ini @@ -90,7 +90,7 @@ Part-Species1-nSurfaceFluxBCs=2 ! Inlet: Constant pressure, Type 1 Part-Species1-Surfaceflux1-BC=1 Part-Species1-Surfaceflux1-velocityDistribution=maxwell_lpn -Part-Species1-Surfaceflux1-VeloIC=5 +Part-Species1-Surfaceflux1-VeloIC=20 Part-Species1-Surfaceflux1-VeloVecIC=(/-1.0,0.0,0.0/) Part-Species1-Surfaceflux1-MWTemperatureIC=300. Part-Species1-Surfaceflux1-TempVib=300. @@ -102,7 +102,7 @@ Part-Species1-Surfaceflux1-Adaptive-Pressure=5.0 ! Outlet: Constant pressure, Type 2 Part-Species1-Surfaceflux2-BC=2 Part-Species1-Surfaceflux2-velocityDistribution=maxwell_lpn -Part-Species1-Surfaceflux2-VeloIC=5 +Part-Species1-Surfaceflux2-VeloIC=20 Part-Species1-Surfaceflux2-VeloVecIC=(/1.0,0.0,0.0/) Part-Species1-Surfaceflux2-MWTemperatureIC=300. Part-Species1-Surfaceflux2-TempVib=300. From 263438a97ce27bec402b5c582745026af370cef7 Mon Sep 17 00:00:00 2001 From: Franziska Hild Date: Mon, 23 Oct 2023 14:34:29 +0200 Subject: [PATCH 259/495] DSMC_main: if collismode.ne.0 moved out of ielem loop --- src/particles/dsmc/dsmc_main.f90 | 51 ++++++++++++++++++++++---------- 1 file changed, 35 insertions(+), 16 deletions(-) diff --git a/src/particles/dsmc/dsmc_main.f90 b/src/particles/dsmc/dsmc_main.f90 index df02ce165..c0cd485ff 100644 --- a/src/particles/dsmc/dsmc_main.f90 +++ b/src/particles/dsmc/dsmc_main.f90 @@ -77,22 +77,24 @@ SUBROUTINE DSMC_main(DoElement) IF ((DSMC%ElectronicModel.EQ.4).AND.(CollisMode.EQ.3)) THEN ElecRelaxPart(1:PDM%ParticleVecLength) = .TRUE. END IF + #if USE_LOADBALANCE CALL LBStartTime(tLBStart) #endif /*USE_LOADBALANCE*/ -DO iElem = 1, nElems ! element/cell main loop - IF(PRESENT(DoElement)) THEN - IF (.NOT.DoElement(iElem)) CYCLE - END IF - nPart = PEM%pNumber(iElem) - IF (nPart.LT.1) CYCLE - IF(DSMC%CalcQualityFactors) THEN - DSMC%CollProbMax = 0.0; DSMC%CollProbMean = 0.0; DSMC%CollProbMeanCount = 0; DSMC%CollSepDist = 0.0; DSMC%CollSepCount = 0 - DSMC%MeanFreePath = 0.0; DSMC%MCSoverMFP = 0.0 - IF(DSMC%RotRelaxProb.GT.2) DSMC%CalcRotProb = 0. - DSMC%CalcVibProb = 0. - END IF - IF (CollisMode.NE.0) THEN + +IF (CollisMode.NE.0) THEN + DO iElem = 1, nElems ! element/cell main loop + IF(PRESENT(DoElement)) THEN + IF (.NOT.DoElement(iElem)) CYCLE + END IF + nPart = PEM%pNumber(iElem) + IF (nPart.LT.1) CYCLE + IF(DSMC%CalcQualityFactors) THEN + DSMC%CollProbMax = 0.0; DSMC%CollProbMean = 0.0; DSMC%CollProbMeanCount = 0; DSMC%CollSepDist = 0.0; DSMC%CollSepCount = 0 + DSMC%MeanFreePath = 0.0; DSMC%MCSoverMFP = 0.0 + IF(DSMC%RotRelaxProb.GT.2) DSMC%CalcRotProb = 0. + DSMC%CalcVibProb = 0. + END IF CALL InitCalcVibRelaxProb IF(BGGas%NumberOfSpecies.GT.0) THEN ! Decide between MCC and DSMC-based background gas @@ -121,11 +123,28 @@ SUBROUTINE DSMC_main(DoElement) END IF CALL FinalizeCalcVibRelaxProb(iElem) IF(DSMC%CalcQualityFactors) CALL SummarizeQualityFactors(iElem) - END IF ! --- CollisMode.NE.0 #if USE_LOADBALANCE - CALL LBElemSplitTime(iElem,tLBStart) + CALL LBElemSplitTime(iElem,tLBStart) +#endif /*USE_LOADBALANCE*/ + END DO ! iElem Loop +ELSE ! CollisMode = 0 + DO iElem = 1, nElems ! element/cell main loop + IF(PRESENT(DoElement)) THEN + IF (.NOT.DoElement(iElem)) CYCLE + END IF + nPart = PEM%pNumber(iElem) + IF (nPart.LT.1) CYCLE + IF(DSMC%CalcQualityFactors) THEN + DSMC%CollProbMax = 0.0; DSMC%CollProbMean = 0.0; DSMC%CollProbMeanCount = 0; DSMC%CollSepDist = 0.0; DSMC%CollSepCount = 0 + DSMC%MeanFreePath = 0.0; DSMC%MCSoverMFP = 0.0 + IF(DSMC%RotRelaxProb.GT.2) DSMC%CalcRotProb = 0. + DSMC%CalcVibProb = 0. + END IF +#if USE_LOADBALANCE + CALL LBElemSplitTime(iElem,tLBStart) #endif /*USE_LOADBALANCE*/ -END DO ! iElem Loop + END DO ! iElem Loop +END IF ! CollisMode.NE.0 ! Advance particle vector length and the current next free position with newly created particles PDM%ParticleVecLength = PDM%ParticleVecLength + DSMCSumOfFormedParticles From 90e0662f49e59c8734d701bb2f3af132733d94e2 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Mon, 23 Oct 2023 14:49:40 +0200 Subject: [PATCH 260/495] up --- .../developerguide/bestpractices.md | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/docs/documentation/developerguide/bestpractices.md b/docs/documentation/developerguide/bestpractices.md index 0f3007f24..1cef40209 100644 --- a/docs/documentation/developerguide/bestpractices.md +++ b/docs/documentation/developerguide/bestpractices.md @@ -86,7 +86,25 @@ The following principles should always be considered when using shared memory wi to split the operations and use MPI to distribute the information among the processes. -- [Use atomic MPI operations to read/write from contested shared memory [772c371]](https://github.com/piclas-framework/piclas/commit/772c3711bbb0c935659b2d08fccd18c80e6b72dc) +- Atomic MPI operations on shared memory + - Example 1: [Store the min/max extent when building the CN FIBGM [6350cc2]](https://github.com/piclas-framework/piclas/commit/6350cc2575d15c7ceb804bc8d839ca5ef2b33dbb?diff=split#diff-aa2cf11ef2c11ce88cdefcf02fe06b643771c968021311ea356c428bbb20d041L1214) + - Example 2: [Use atomic MPI operations to read/write from contested shared memory [772c371]](https://github.com/piclas-framework/piclas/commit/772c3711bbb0c935659b2d08fccd18c80e6b72dc) + - The main idea is to access and change parts of a shared array with multiple processes to, e.g., sum up numbers from different + processes and guarantee that in the end the sum is correct without having a predefined order in which the numbers are added to the + entry in the shared array. + + In the example in [772c371], get the memory window while bypassing local caches + + CALL MPI_FETCH_AND_OP(ElemDone,ElemDone,MPI_INTEGER,0,INT(posElem*SIZE_INT,MPI_ADDRESS_KIND),MPI_NO_OP,ElemInfo_Shared_Win,iError) + + Flush only performs the pending operations (getting the value) + + CALL MPI_WIN_FLUSH(0,ElemInfo_Shared_Win,iError) + + Using `MPI_REPLACE` makes sure that the correct value is written in the end by one of the processes in an undefined order. + + MPI_FETCH_AND_OP(haloChange,dummyInt,MPI_INTEGER,0,INT(posElem*SIZE_INT,MPI_ADDRESS_KIND),MPI_REPLACE,ElemInfo_Shared_Win,iError) + CALL MPI_WIN_FLUSH(0,ElemInfo_Shared_Win,iError) ## Hawk From db6bbe512f0d827b8b25cfb9dc4de89834edcdb4 Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Mon, 23 Oct 2023 16:48:37 +0200 Subject: [PATCH 261/495] NIG_LoadBalance/sphere_soft_RK4_without_DSMC: reduced the load balance threshold to guarantee load balance step --- .../sphere_soft_RK4_without_DSMC/analyze.ini | 2 +- .../parameter.ini | 36 ++++--------------- 2 files changed, 8 insertions(+), 30 deletions(-) diff --git a/regressioncheck/NIG_LoadBalance/sphere_soft_RK4_without_DSMC/analyze.ini b/regressioncheck/NIG_LoadBalance/sphere_soft_RK4_without_DSMC/analyze.ini index 7f4dcf47a..0dc321181 100644 --- a/regressioncheck/NIG_LoadBalance/sphere_soft_RK4_without_DSMC/analyze.ini +++ b/regressioncheck/NIG_LoadBalance/sphere_soft_RK4_without_DSMC/analyze.ini @@ -2,7 +2,7 @@ analyze_L2=1000 ! check if particles are outside of domain at tEnd -check_hdf5_file = implicit_one_State_000.00000010000000000.h5 +check_hdf5_file = implicit_one_State_000.00000002000000000.h5 check_hdf5_data_set = PartData check_hdf5_span = 1 ! check all rows check_hdf5_dimension = 0:2 diff --git a/regressioncheck/NIG_LoadBalance/sphere_soft_RK4_without_DSMC/parameter.ini b/regressioncheck/NIG_LoadBalance/sphere_soft_RK4_without_DSMC/parameter.ini index f1a36852d..68ede7641 100644 --- a/regressioncheck/NIG_LoadBalance/sphere_soft_RK4_without_DSMC/parameter.ini +++ b/regressioncheck/NIG_LoadBalance/sphere_soft_RK4_without_DSMC/parameter.ini @@ -8,11 +8,9 @@ IniExactFunc = 0 ! =============================================================================== ! N = 3 ! Polynomial degree NAnalyze = 2 ! Number of analyze points -nSample = 4 ! =============================================================================== ! ! MESH ! =============================================================================== ! -!MeshFile = Sphere_Ngeo4_004_005_mesh.h5 MeshFile = Sphere_Ngeo4_001_001_mesh.h5 useCurveds = T ! if boundaries have to be changed (else they are used from Mesh directly): @@ -30,7 +28,7 @@ DoCalcErrorNorms = T ! Load Balance ! =============================================================================== ! DoLoadBalance = T -Load-DeviationThreshold = 0.1 +Load-DeviationThreshold = 1E-9 Particles-MPIWeight = 0.01 ! =============================================================================== ! @@ -39,15 +37,14 @@ Particles-MPIWeight = 0.01 CFLscale = 0.9 ! Scaling of theoretical CFL number c_corr = 1 BezierClipTolerance = 1e-12 -!BezierNewtonTolerance = 1e-4 ! =============================================================================== ! ! IMPLICIT ! =============================================================================== ! -tend = 1E-7 ! End time +tend = 2E-8 ! End time Analyze_dt = 1E-8 ! Timestep of analyze outputs CalcPotentialEnergy = TRUE - +IterDisplayStep = 50 ! =============================================================================== ! ! PARTICLES ! =============================================================================== ! @@ -57,52 +54,33 @@ Part-Boundary1-Condition=reflective Part-FIBGMdeltas=(/.5,.5,.5/) -Part-vMPF=F Part-maxParticleNumber=20000 Part-nSpecies=1 -PIC-externalField=(/0.,0.,0.,0.,0.,0./) Part-Species1-ChargeIC=-1.6022E-19 Part-Species1-MassIC=9.1093826E-31 Part-Species1-MacroParticleFactor=1000 -Part-Species1-nInits=1 +Part-Species1-nInits=1 Part-Species1-Init1-SpaceIC=cuboid -Part-Species1-Init1-velocityDistribution=maxwell +Part-Species1-Init1-velocityDistribution=maxwell Part-Species1-Init1-MWTemperatureIC=1e8 Part-Species1-Init1-ParticleNumber=500 - Part-Species1-Init1-BasePointIC=(/.25,.25,-0.25/) Part-Species1-Init1-BaseVector1IC=(/-.5,0.0,0.0/) Part-Species1-Init1-BaseVector2IC=(/0.0,-.5,0.0/) Part-Species1-Init1-CuboidHeightIC=0.5 - Part-Species1-Init1-NormalIC=(/0.,0.,1./) - Part-Species1-Init1-VeloIC=0. Part-Species1-Init1-VeloVecIC=(/1.,0.,0./) ! =============================================================================== ! ! tracking ! =============================================================================== ! -RefMappingGuess=1 !,3 -!BezierClipTolerance=1e-8 -!BezierClipMaxIter =105 -!BezierClipHit =2e-4 -!BezierSplitLimit =0.6 -!!epsilontol =1e-12 -!BezierElevation=20 -!RefMappingEps =1e-8 -PIC-DoInterpolation=F - - TrackingMethod = refmapping +RefMappingGuess=1 +PIC-DoInterpolation=F ! =============================================================================== ! ! DSMC ! =============================================================================== ! UseDSMC=F -Particles-DSMCReservoirSim=false -Particles-DSMC-CollisMode=0 ! Collisionless flow -Part-NumberOfRandomSeeds =2 -Particles-RandomSeed1= 1 -Particles-RandomSeed2= 2 Particles-HaloEpsVelo=50000 From 6b281fa887754a587a650a4c0a6af0d14bc59a71 Mon Sep 17 00:00:00 2001 From: Franziska Hild Date: Mon, 23 Oct 2023 17:15:19 +0200 Subject: [PATCH 262/495] Resolve #166 + delete timedisc 42 for reservoir - instead use timedisc 4 for dsmc with flag Particles-DSMCReservoirSim --- .gitlab-ci.yml | 4 +- .../dsmc-reservoir/dsmc-reservoir.md | 19 +- docs/documentation/userguide/workflow.md | 3 +- src/loadbalance/loadbalance.f90 | 8 +- src/particles/analyze/particle_analyze.f90 | 228 ++++++------ .../analyze/particle_analyze_tools.f90 | 10 +- src/particles/dsmc/dsmc_analyze.f90 | 13 +- src/particles/dsmc/dsmc_chemical_init.f90 | 87 +---- .../dsmc/dsmc_chemical_reactions.f90 | 16 +- src/particles/dsmc/dsmc_collis_mode.f90 | 341 +++--------------- src/particles/dsmc/dsmc_collision_prob.f90 | 40 +- src/particles/dsmc/dsmc_electronic_model.f90 | 94 ++--- src/particles/dsmc/dsmc_init.f90 | 38 +- src/particles/dsmc/dsmc_vars.f90 | 8 +- src/particles/mcc/mcc.f90 | 34 +- src/particles/mcc/mcc_xsec.f90 | 4 +- src/particles/particle_init.f90 | 8 +- src/particles/particle_mesh/particle_bgm.f90 | 10 +- src/timedisc/timedisc.f90 | 4 +- src/timedisc/timedisc_TimeStep_DSMC.f90 | 14 + src/timedisc/timedisc_TimeStep_DSMC_Debug.f90 | 135 ------- src/timedisc/timedisc_init.f90 | 2 - src/timedisc/timedisc_vars.f90 | 2 +- 23 files changed, 327 insertions(+), 795 deletions(-) delete mode 100644 src/timedisc/timedisc_TimeStep_DSMC_Debug.f90 diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 677f8802c..53dbf6cf8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -466,7 +466,7 @@ NIG_Reservoir: <<: *defaults_nightly stage: reggie_DSMC_nightly script: - - cd build/ ; python ../reggie/reggie.py ../regressioncheck/NIG_Reservoir + - cd build_DSMC_release/ ; python ../reggie/reggie.py ../regressioncheck/NIG_Reservoir -e bin/piclas # ---------------------------------------------------------------------------------------------------------------------------------------------------- # Stage "reggie_DSMC_nightly": Build and run tracking examples on nightly @@ -745,7 +745,7 @@ WEK_Reservoir: <<: *defaults_weekly stage: reggie_weekly script: - - cd build ; python ../reggie/reggie.py ../regressioncheck/WEK_Reservoir + - cd build_DSMC_release ; python ../reggie/reggie.py ../regressioncheck/WEK_Reservoir -e bin/piclas WEK_FPFlow: <<: *defaults_weekly diff --git a/docs/documentation/userguide/tutorials/dsmc-reservoir/dsmc-reservoir.md b/docs/documentation/userguide/tutorials/dsmc-reservoir/dsmc-reservoir.md index 11531cb19..2472ebf1c 100644 --- a/docs/documentation/userguide/tutorials/dsmc-reservoir/dsmc-reservoir.md +++ b/docs/documentation/userguide/tutorials/dsmc-reservoir/dsmc-reservoir.md @@ -33,7 +33,7 @@ Order of the corners to define the used mesh. The first node is placed at the or Afterwards this element is scaled via postScaleMesh = T - meshScale = 4.64E-6 + meshScale = 4.64E-6 The number of mesh elements for the block in each direction can be adjusted by changing the line @@ -58,13 +58,13 @@ For more information about hopr, visit [https://github.com/hopr-framework/hopr]( Install **piclas** by compiling the source code as described in Chapter {ref}`userguide/installation:Installation` and make sure to set the correct compile flags (ie. chose the correct simulation method) - PICLAS_TIMEDISCMETHOD = RESERVOIR + PICLAS_TIMEDISCMETHOD = DSMC or simply run the following command from inside the *build* directory - cmake ../ -DPICLAS_TIMEDISCMETHOD=RESERVOIR + cmake ../ -DPICLAS_TIMEDISCMETHOD=DSMC -to configure the build process and run `make` afterwards to build the executable. For this setup, the reservoir method, which is based on the DSMC method, is needed to allow for reservoir specific settings. It is recommended to either utilize a separate build folder (e.g. build_DSMC/) or to delete the contents of the folder beforehand to avoid conflicts between different compiler options (e.g. the setting `PICLAS_EQNSYSNAME = poisson` from the plasma wave tutorial is in conflict with the DSMC method). An overview over the available solver and discretization options is given in Section {ref}`sec:solver-settings`. The physical parameters for this test case are summarized in {numref}`tab:dsmc_chem_off_phys`. +to configure the build process and run `make` afterwards to build the executable. It is recommended to either utilize a separate build folder (e.g. build_DSMC/) or to delete the contents of the folder beforehand to avoid conflicts between different compiler options (e.g. the setting `PICLAS_EQNSYSNAME = poisson` from the plasma wave tutorial is in conflict with the DSMC method). An overview over the available solver and discretization options is given in Section {ref}`sec:solver-settings`. The physical parameters for this test case are summarized in {numref}`tab:dsmc_chem_off_phys`. ```{table} Physical properties at the simulation start --- @@ -109,14 +109,14 @@ where, the path to the mesh file `MeshFile`, project name and particle tracking where the final simulation time `tend` [s], the time step for the field and particle solver is set via `ManualTimeStep` [s]. The time between restart/checkpoint file output is defined via `Analyze_dt` (which is also the output time for specific analysis functions in the field solver context). The number of time step iterations `IterDisplayStep` defines the interval between information output regarding the current status of the simulation, which is written to std.out. The `Particles-HaloEpsVelo` [m/s] determines the size of the halo region for MPI communication and should not be smaller than the fastest particles in the simulation. (sec:tutorial-dsmc-analysis-setup)= -### Analysis setup +### Analysis setup For this case our focus is on the run-time analysis to investigate the transient behavior of the reservoir. The first parameter `Part-AnalyzeStep` allows to perform the output every N$^\text{th}$ iteration to reduce the size of the output file and to increase the computational speed. Different parameters for run-time analysis can be enabled, in this case the number of particles per species (`CalcNumSpec`) and the temperature output (`CalcTemp`). It is also recommended to enable `Particles-DSMC-CalcQualityFactors`, which provides outputs to evaluate the quality of the simulation results such as the mean and maximum collision probabilities. The parameter `TimeStampLength = 13` reduces the output filename length. It can be needed for postprocessing, as e.g. ParaView sometimes does not sort the files correctly if the timestamps are too long. The displayed time solution would then be faulty. ! =============================================================================== ! ! Particle Analysis ! =============================================================================== ! - + Part-AnalyzeStep = 1 CalcNumSpec = T CalcTemp = T @@ -188,8 +188,7 @@ $$ N_{\text{CO}_2,\text{sim}} = \frac{n_{\text{CO}_2} V}{w_{\text{CO}_2}} $$ (sec:tutorial-dsmc-dsmc-setup)= ### DSMC setup -Finally, DSMC has to be enabled (`UseDSMC = T`) and the particle movement is disabled via `Particles-DSMCReservoirSim = T` to reduce the computational effort. Keep in mind that the latter needs a compiled -version of piclas using `PICLAS_TIMEDISCMETHOD = RESERVOIR`. Besides these settings `Particles-DSMC-CollisMode` is an important parameter. If set to 1, only elastic collisions +Finally, DSMC has to be enabled (`UseDSMC = T`) and the particle movement is disabled via `Particles-DSMCReservoirSim = T` to reduce the computational effort. Besides these settings `Particles-DSMC-CollisMode` is an important parameter. If set to 1, only elastic collisions are performed, if set to 2 relaxation processes are allowed and if set to 3 chemistry is enabled. Additionally, constant values for the rotational (`Particles-DSMC-RotRelaxProb`) and vibrational (`Particles-DSMC-VibRelaxProb`) relaxation probabilities are defined. ! =============================================================================== ! @@ -199,7 +198,7 @@ are performed, if set to 2 relaxation processes are allowed and if set to 3 chem Particles-DSMCReservoirSim = T Particles-DSMC-CollisMode = 2 Particles-DSMC-RotRelaxProb = 0.2 - Particles-DSMC-VibRelaxProb = 0.02 + Particles-DSMC-VibRelaxProb = 0.02 Besides the data given in the **parameter.ini**, a proper DSMC simulation needs additional species information, which is defined in the **DSMC.ini**. The species numeration needs to be the same in both files. @@ -342,7 +341,7 @@ Therefore, in this example with one reaction and each of the three species as po In order to investigate the transient behavior, a longer simulation time was chosen. This results in comparatively long computing times, which is why the use of several computing cores is recommended. The number of cores may not exceed the number of cells. This results in a maximum of 4 cores for the described simulation. Another important note is that bash does not understand aliases which are not at the start of a line. Thus a copy of the **piclas** binary must be located in the current folder cp $PICLAS_PATH/build/bin/piclas . - + or the whole path to the binary must be used instead. Assuming a run with 4 cores is desired and the **piclas** binary is located at the current directory, the command mpirun -np 4 piclas parameter.ini DSMC.ini | tee std.out diff --git a/docs/documentation/userguide/workflow.md b/docs/documentation/userguide/workflow.md index 9e4c29038..00f1ee7ba 100644 --- a/docs/documentation/userguide/workflow.md +++ b/docs/documentation/userguide/workflow.md @@ -84,7 +84,6 @@ Before setting up a simulation, the code must be compiled with the desired param * RK4: Runge-Kutta 4th order in time * RK14: Low storage Runge-Kutta 4, 14 stages version - Niegemann et al 2012 * DSMC: Direct Simulation Monte Carlo, Section {ref}`sec:DSMC` - * RESERVOIR: Simplified DSMC module for single cell reservoir simulations * FP-Flow: Fokker-Planck-based collision operator, Section {ref}`sec:FP-Flow` * BGK-Flow: Bhatnagar-Gross-Krook collision operator, Section {ref}`sec:BGK-Flow` * ``PICLAS_EQNSYSNAME``: Equation system to be solved @@ -152,7 +151,7 @@ The concept of the parameter file is described as followed: * The order of defined variables is irrelevant, except for the special case when redefining boundaries. However, it is preferable to group similar variables together. -The options and underlying models are discussed in Chapter {ref}`userguide/features-and-models/index:Features & Models`, while the available +The options and underlying models are discussed in Chapter {ref}`userguide/features-and-models/index:Features & Models`, while the available output options are given in Chapter {ref}`userguide/visu_output:Visualization & Output`. Due to the sheer number of parameters available, it is advisable to build upon an existing parameter file from one of the tutorials in Chapter {ref}`userguide/tutorials/index:Tutorials`. diff --git a/src/loadbalance/loadbalance.f90 b/src/loadbalance/loadbalance.f90 index 37e610dc3..f5b56d936 100644 --- a/src/loadbalance/loadbalance.f90 +++ b/src/loadbalance/loadbalance.f90 @@ -489,9 +489,9 @@ SUBROUTINE ComputeImbalance() USE MOD_Globals USE MOD_LoadBalance_Vars ,ONLY: WeightSum, TargetWeight,CurrentImbalance, MaxWeight, MinWeight USE MOD_LoadBalance_Vars ,ONLY: ElemTime, PerformLBSample, DeviationThreshold -#if !((PP_TimeDiscMethod==4) || (PP_TimeDiscMethod==42) || (PP_TimeDiscMethod==300) || (PP_TimeDiscMethod==400)) +#if !((PP_TimeDiscMethod==4) || (PP_TimeDiscMethod==300) || (PP_TimeDiscMethod==400)) USE MOD_LoadBalance_Vars ,ONLY: ElemTimeFieldTot,ElemTimeField -#endif /*!((PP_TimeDiscMethod==4) || (PP_TimeDiscMethod==42) || (PP_TimeDiscMethod==300) || (PP_TimeDiscMethod==400))*/ +#endif /*!((PP_TimeDiscMethod==4) || (PP_TimeDiscMethod==300) || (PP_TimeDiscMethod==400))*/ #ifdef PARTICLES USE MOD_LoadBalance_Vars ,ONLY: ElemTimePartTot,ElemTimePart #endif /*PARTICLES*/ @@ -512,14 +512,14 @@ SUBROUTINE ComputeImbalance() CurrentImbalance = -1.0 ELSE -#if (PP_TimeDiscMethod==4) || (PP_TimeDiscMethod==42) || (PP_TimeDiscMethod==300) || (PP_TimeDiscMethod==400) +#if (PP_TimeDiscMethod==4) || (PP_TimeDiscMethod==300) || (PP_TimeDiscMethod==400) WeightSum = 0. ! initialize before adding particle info #else ! Collect ElemTime for particles and field separately (only on root process) ! Skip the reduce for DSMC timedisc CALL MPI_REDUCE(ElemTimeField , ElemTimeFieldTot , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_WORLD , IERROR) WeightSum = ElemTimeFieldTot ! only correct on MPI root -#endif /*(PP_TimeDiscMethod==4) || (PP_TimeDiscMethod==42) || (PP_TimeDiscMethod==300) || (PP_TimeDiscMethod==400)*/ +#endif /*(PP_TimeDiscMethod==4) || (PP_TimeDiscMethod==300) || (PP_TimeDiscMethod==400)*/ #ifdef PARTICLES CALL MPI_REDUCE(ElemTimePart , ElemTimePartTot , 1 , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_WORLD , IERROR) WeightSum = WeightSum + ElemTimePartTot ! only correct on MPI root diff --git a/src/particles/analyze/particle_analyze.f90 b/src/particles/analyze/particle_analyze.f90 index 2c19eb39f..c0212114b 100644 --- a/src/particles/analyze/particle_analyze.f90 +++ b/src/particles/analyze/particle_analyze.f90 @@ -578,7 +578,7 @@ SUBROUTINE InitParticleAnalyze() !-- Coupled Power CalcCoupledPower = GETLOGICAL('CalcCoupledPower') #if USE_HDG -IF(UseCoupledPowerPotential.AND.(.NOT.CalcCoupledPower)) CALL abort(__STAMP__,'Coupled power potential requires CalcCoupledPower=T') +IF(UseCoupledPowerPotential.AND.(.NOT.CalcCoupledPower)) CALL abort(__STAMP__,'Coupled power potential requires CalcCoupledPower=T') #endif /*USE_HDG*/ IF(CalcCoupledPower) THEN @@ -852,14 +852,14 @@ SUBROUTINE AnalyzeParticles(Time) USE MOD_Particle_Analyze_Tools ,ONLY: CalcNumPartsOfSpec,CalcShapeEfficiencyR,CalcKineticEnergy,CalcKineticEnergyAndMaximum USE MOD_Particle_Analyze_Tools ,ONLY: CalcNumberDensity,CalcSurfaceFluxInfo,CalcTransTemp,CalcVelocities USE MOD_Particle_Analyze_Output ,ONLY: DisplayCoupledPowerPart -#if (PP_TimeDiscMethod==2 || PP_TimeDiscMethod==4 || PP_TimeDiscMethod==42 || PP_TimeDiscMethod==300 || PP_TimeDiscMethod==400 || (PP_TimeDiscMethod>=501 && PP_TimeDiscMethod<=509) || PP_TimeDiscMethod==120) +#if (PP_TimeDiscMethod==2 || PP_TimeDiscMethod==4 || PP_TimeDiscMethod==300 || PP_TimeDiscMethod==400 || (PP_TimeDiscMethod>=501 && PP_TimeDiscMethod<=509) || PP_TimeDiscMethod==120) USE MOD_DSMC_Vars ,ONLY: CollisMode USE MOD_Particle_Mesh_Vars ,ONLY: MeshVolume USE MOD_DSMC_Analyze ,ONLY: CalcMeanFreePath USE MOD_DSMC_Vars ,ONLY: BGGas USE MOD_Particle_Analyze_Tools ,ONLY: CalcMixtureTemp, CalcRelaxProbRotVib #endif -#if (PP_TimeDiscMethod==42) +#if (PP_TimeDiscMethod==4) USE MOD_DSMC_Vars ,ONLY: CollInf, useDSMC, ChemReac, SpecDSMC USE MOD_Globals_Vars ,ONLY: ElementaryCharge USE MOD_MCC_Vars ,ONLY: SpecXSec, XSec_Relaxation @@ -889,14 +889,14 @@ SUBROUTINE AnalyzeParticles(Time) REAL :: NumSpec(nSpecAnalyze), NumDens(nSpecAnalyze) REAL :: Ekin(nSpecAnalyze), Temp(nSpecAnalyze) REAL :: EkinMax(nSpecies) -#if (PP_TimeDiscMethod==2 || PP_TimeDiscMethod==4 || PP_TimeDiscMethod==42 || PP_TimeDiscMethod==300 || PP_TimeDiscMethod==400 || (PP_TimeDiscMethod>=501 && PP_TimeDiscMethod<=509) || PP_TimeDiscMethod==120) +#if (PP_TimeDiscMethod==2 || PP_TimeDiscMethod==4 || PP_TimeDiscMethod==300 || PP_TimeDiscMethod==400 || (PP_TimeDiscMethod>=501 && PP_TimeDiscMethod<=509) || PP_TimeDiscMethod==120) REAL :: ETotal REAL :: IntEn(nSpecAnalyze,3),IntTemp(nSpecies,3),TempTotal(nSpecAnalyze), Xi_Vib(nSpecies), Xi_Elec(nSpecies) REAL :: MaxCollProb, MeanCollProb, MeanFreePath REAL :: NumSpecTmp(nSpecAnalyze), RotRelaxProb(2), VibRelaxProb(2) INTEGER :: bgSpec #endif -#if (PP_TimeDiscMethod==42) +#if (PP_TimeDiscMethod==4) INTEGER :: jSpec, iCase, iLevel REAL, ALLOCATABLE :: CRate(:), RRate(:), VibRelaxRate(:), ElecRelaxRate(:,:) #endif @@ -917,24 +917,26 @@ SUBROUTINE AnalyzeParticles(Time) IF(DoRestart) isRestart = .true. IF(.NOT.DoPartAnalyze) RETURN ParticleAnalyzeSampleTime = Time - ParticleAnalyzeSampleTime ! Set ParticleAnalyzeSampleTime=Time at the end of this routine -#if (PP_TimeDiscMethod==42) - IF (useDSMC) THEN - IF (CollisMode.NE.0) THEN - SDEALLOCATE(CRate) - ALLOCATE(CRate(CollInf%NumCase + 1)) - CRate = 0.0 - IF(CalcRelaxProb) THEN - ALLOCATE(VibRelaxRate(CollInf%NumCase)) - VibRelaxRate = 0.0 - IF(ANY(SpecDSMC(:)%UseElecXSec)) THEN - ALLOCATE(ElecRelaxRate(CollInf%NumCase,MAXVAL(SpecXSec(:)%NumElecLevel))) - ElecRelaxRate = 0.0 +#if (PP_TimeDiscMethod==4) + IF (DSMC%ReservoirSimu) THEN + IF (useDSMC) THEN + IF (CollisMode.NE.0) THEN + SDEALLOCATE(CRate) + ALLOCATE(CRate(CollInf%NumCase + 1)) + CRate = 0.0 + IF(CalcRelaxProb) THEN + ALLOCATE(VibRelaxRate(CollInf%NumCase)) + VibRelaxRate = 0.0 + IF(ANY(SpecDSMC(:)%UseElecXSec)) THEN + ALLOCATE(ElecRelaxRate(CollInf%NumCase,MAXVAL(SpecXSec(:)%NumElecLevel))) + ElecRelaxRate = 0.0 + END IF + END IF + IF (CollisMode.EQ.3) THEN + SDEALLOCATE(RRate) + ALLOCATE(RRate(ChemReac%NumOfReact)) + RRate = 0.0 END IF - END IF - IF (CollisMode.EQ.3) THEN - SDEALLOCATE(RRate) - ALLOCATE(RRate(ChemReac%NumOfReact)) - RRate = 0.0 END IF END IF END IF @@ -1099,7 +1101,7 @@ SUBROUTINE AnalyzeParticles(Time) OutputCounter = OutputCounter + 1 END DO END IF -#if (PP_TimeDiscMethod==2 || PP_TimeDiscMethod==4 || PP_TimeDiscMethod==42 || PP_TimeDiscMethod==300 || PP_TimeDiscMethod==400 || (PP_TimeDiscMethod>=501 && PP_TimeDiscMethod<=509) || PP_TimeDiscMethod==120) +#if (PP_TimeDiscMethod==2 || PP_TimeDiscMethod==4 || PP_TimeDiscMethod==300 || PP_TimeDiscMethod==400 || (PP_TimeDiscMethod>=501 && PP_TimeDiscMethod<=509) || PP_TimeDiscMethod==120) IF (CollisMode.GT.1) THEN IF(CalcEint(2)) THEN DO iSpec=1, nSpecAnalyze @@ -1218,56 +1220,58 @@ SUBROUTINE AnalyzeParticles(Time) OutputCounter = OutputCounter + 1 END IF END IF -#if (PP_TimeDiscMethod==42) - IF(CalcCollRates) THEN ! calculates collision rates per collision pair - DO iSpec = 1, nSpecies - DO jSpec = iSpec, nSpecies - WRITE(unit_index,'(A1)',ADVANCE='NO') ',' - WRITE(unit_index,'(I3.3,A,I3.3,A,I3.3)',ADVANCE='NO') OutputCounter,'-CollRate', iSpec, '+', jSpec - OutputCounter = OutputCounter + 1 - END DO - END DO - WRITE(unit_index,'(A1)',ADVANCE='NO') ',' - WRITE(unit_index,'(I3.3,A)',ADVANCE='NO') OutputCounter,'-TotalCollRate' - OutputCounter = OutputCounter + 1 - END IF - IF(CalcRelaxProb) THEN - IF(XSec_Relaxation) THEN +#if (PP_TimeDiscMethod==4) + IF (DSMC%ReservoirSimu) THEN + IF(CalcCollRates) THEN ! calculates collision rates per collision pair DO iSpec = 1, nSpecies DO jSpec = iSpec, nSpecies - IF(SpecXSec(CollInf%Coll_Case(iSpec,jSpec))%UseVibXSec) THEN - ! Skip entry if both species are NOT molecules - IF(((SpecDSMC(iSpec)%InterID.NE.2).AND.(SpecDSMC(iSpec)%InterID.NE.20)).AND. & - ((SpecDSMC(jSpec)%InterID.NE.2).AND.(SpecDSMC(jSpec)%InterID.NE.20))) CYCLE - WRITE(unit_index,'(A1)',ADVANCE='NO') ',' - WRITE(unit_index,'(I3.3,A,I3.3,A,I3.3)',ADVANCE='NO') OutputCounter,'-VibRelaxRate', iSpec, '+', jSpec - OutputCounter = OutputCounter + 1 - END IF + WRITE(unit_index,'(A1)',ADVANCE='NO') ',' + WRITE(unit_index,'(I3.3,A,I3.3,A,I3.3)',ADVANCE='NO') OutputCounter,'-CollRate', iSpec, '+', jSpec + OutputCounter = OutputCounter + 1 END DO END DO + WRITE(unit_index,'(A1)',ADVANCE='NO') ',' + WRITE(unit_index,'(I3.3,A)',ADVANCE='NO') OutputCounter,'-TotalCollRate' + OutputCounter = OutputCounter + 1 END IF - DO iSpec = 1, nSpecies - DO jSpec = iSpec, nSpecies - iCase = CollInf%Coll_Case(iSpec,jSpec) - IF(SpecXSec(iCase)%UseElecXSec) THEN - DO iLevel = 1, SpecXSec(iCase)%NumElecLevel - WRITE(unit_index,'(A1)',ADVANCE='NO') ',' - WRITE(unit_index,'(I3.3,A,I3.3,A,I3.3,A,F0.2)',ADVANCE='NO') OutputCounter,'-ElecRelaxRate', iSpec, '+', jSpec, '-', & - SpecXSec(iCase)%ElecLevel(iLevel)%Threshold/ElementaryCharge - OutputCounter = OutputCounter + 1 + IF(CalcRelaxProb) THEN + IF(XSec_Relaxation) THEN + DO iSpec = 1, nSpecies + DO jSpec = iSpec, nSpecies + IF(SpecXSec(CollInf%Coll_Case(iSpec,jSpec))%UseVibXSec) THEN + ! Skip entry if both species are NOT molecules + IF(((SpecDSMC(iSpec)%InterID.NE.2).AND.(SpecDSMC(iSpec)%InterID.NE.20)).AND. & + ((SpecDSMC(jSpec)%InterID.NE.2).AND.(SpecDSMC(jSpec)%InterID.NE.20))) CYCLE + WRITE(unit_index,'(A1)',ADVANCE='NO') ',' + WRITE(unit_index,'(I3.3,A,I3.3,A,I3.3)',ADVANCE='NO') OutputCounter,'-VibRelaxRate', iSpec, '+', jSpec + OutputCounter = OutputCounter + 1 + END IF END DO - END IF - END DO - END DO - END IF - IF(CalcReacRates) THEN ! calculates reaction rate per reaction - IF(CollisMode.EQ.3) THEN - DO iCase=1, ChemReac%NumOfReact - WRITE(unit_index,'(A1)',ADVANCE='NO') ',' - WRITE(unit_index,'(I3.3,A,I3.3)',ADVANCE='NO') OutputCounter,'-Reaction', iCase - OutputCounter = OutputCounter + 1 + END DO + END IF + DO iSpec = 1, nSpecies + DO jSpec = iSpec, nSpecies + iCase = CollInf%Coll_Case(iSpec,jSpec) + IF(SpecXSec(iCase)%UseElecXSec) THEN + DO iLevel = 1, SpecXSec(iCase)%NumElecLevel + WRITE(unit_index,'(A1)',ADVANCE='NO') ',' + WRITE(unit_index,'(I3.3,A,I3.3,A,I3.3,A,F0.2)',ADVANCE='NO') OutputCounter,'-ElecRelaxRate', iSpec, '+', jSpec, '-', & + SpecXSec(iCase)%ElecLevel(iLevel)%Threshold/ElementaryCharge + OutputCounter = OutputCounter + 1 + END DO + END IF + END DO END DO END IF + IF(CalcReacRates) THEN ! calculates reaction rate per reaction + IF(CollisMode.EQ.3) THEN + DO iCase=1, ChemReac%NumOfReact + WRITE(unit_index,'(A1)',ADVANCE='NO') ',' + WRITE(unit_index,'(I3.3,A,I3.3)',ADVANCE='NO') OutputCounter,'-Reaction', iCase + OutputCounter = OutputCounter + 1 + END DO + END IF + END IF END IF #endif #if USE_HDG @@ -1341,7 +1345,7 @@ SUBROUTINE AnalyzeParticles(Time) #endif /*USE_MPI*/ END IF IF(CalcTemp(1)) CALL CalcTransTemp(NumSpec, Temp) -#if (PP_TimeDiscMethod==2 || PP_TimeDiscMethod==4 || PP_TimeDiscMethod==42 || PP_TimeDiscMethod==300 || PP_TimeDiscMethod==400 || (PP_TimeDiscMethod>=501 && PP_TimeDiscMethod<=509) || PP_TimeDiscMethod==120) +#if (PP_TimeDiscMethod==2 || PP_TimeDiscMethod==4 || PP_TimeDiscMethod==300 || PP_TimeDiscMethod==400 || (PP_TimeDiscMethod>=501 && PP_TimeDiscMethod<=509) || PP_TimeDiscMethod==120) ! CalcTemp(1) is required for Temp ! CalcEint(1) is required for Ekin IF(CalcTemp(1).AND.CalcEint(1)) THEN @@ -1497,17 +1501,19 @@ SUBROUTINE AnalyzeParticles(Time) !----------------------------------------------------------------------------------------------------------------------------------- !----------------------------------------------------------------------------------------------------------------------------------- ! Calculate the collision rates and reaction rate coefficients (Arrhenius-type chemistry) -#if (PP_TimeDiscMethod==42) - IF(iter.GT.0) THEN - IF(CalcCollRates) CALL CollRates(CRate) - IF(CalcRelaxProb) THEN - CALL CalcRelaxRates(NumSpecTmp,VibRelaxRate) - IF(DSMC%ElectronicModel.EQ.3) THEN - IF(ANY(SpecXSec(:)%UseElecXSec)) CALL CalcRelaxRatesElec(ElecRelaxRate) +#if (PP_TimeDiscMethod==4) + IF (DSMC%ReservoirSimu) THEN + IF(iter.GT.0) THEN + IF(CalcCollRates) CALL CollRates(CRate) + IF(CalcRelaxProb) THEN + CALL CalcRelaxRates(NumSpecTmp,VibRelaxRate) + IF(DSMC%ElectronicModel.EQ.3) THEN + IF(ANY(SpecXSec(:)%UseElecXSec)) CALL CalcRelaxRatesElec(ElecRelaxRate) + END IF + END IF + IF(CalcReacRates) THEN + IF (CollisMode.EQ.3) CALL ReacRates(NumSpecTmp,RRate) END IF - END IF - IF(CalcReacRates) THEN - IF (CollisMode.EQ.3) CALL ReacRates(NumSpecTmp,RRate) END IF END IF #endif @@ -1599,7 +1605,7 @@ SUBROUTINE AnalyzeParticles(Time) END DO END IF -#if (PP_TimeDiscMethod==2 || PP_TimeDiscMethod==4 || PP_TimeDiscMethod==42 || PP_TimeDiscMethod==300 || PP_TimeDiscMethod==400 || (PP_TimeDiscMethod>=501 && PP_TimeDiscMethod<=509)) +#if (PP_TimeDiscMethod==2 || PP_TimeDiscMethod==4 || PP_TimeDiscMethod==300 || PP_TimeDiscMethod==400 || (PP_TimeDiscMethod>=501 && PP_TimeDiscMethod<=509)) IF (CollisMode.GT.1) THEN IF(CalcEint(2)) THEN DO iSpec=1, nSpecAnalyze @@ -1668,45 +1674,47 @@ SUBROUTINE AnalyzeParticles(Time) WRITE(unit_index,CSVFORMAT,ADVANCE='NO') ',', BGK_MaxRotRelaxFactor END IF END IF -#if (PP_TimeDiscMethod==42) - IF(CalcCollRates) THEN - DO iCase=1, CollInf%NumCase +1 - WRITE(unit_index,CSVFORMAT,ADVANCE='NO') ',', CRate(iCase) - END DO - END IF - IF(CalcRelaxProb) THEN - IF(XSec_Relaxation) THEN - DO iSpec = 1, nSpecies - DO jSpec = iSpec, nSpecies - iCase = CollInf%Coll_Case(iSpec,jSpec) - IF(SpecXSec(iCase)%UseVibXSec) THEN - ! Skip entry if both species are NOT molecules - IF(((SpecDSMC(iSpec)%InterID.NE.2).AND.(SpecDSMC(iSpec)%InterID.NE.20)).AND. & - ((SpecDSMC(jSpec)%InterID.NE.2).AND.(SpecDSMC(jSpec)%InterID.NE.20))) CYCLE - WRITE(unit_index,CSVFORMAT,ADVANCE='NO') ',', VibRelaxRate(iCase) - END IF - END DO +#if (PP_TimeDiscMethod==4) + IF (DSMC%ReservoirSimu) THEN + IF(CalcCollRates) THEN + DO iCase=1, CollInf%NumCase +1 + WRITE(unit_index,CSVFORMAT,ADVANCE='NO') ',', CRate(iCase) END DO END IF - IF(DSMC%ElectronicModel.EQ.3) THEN - DO iSpec = 1, nSpecies - DO jSpec = iSpec, nSpecies - iCase = CollInf%Coll_Case(iSpec,jSpec) - IF(SpecXSec(iCase)%UseElecXSec) THEN - DO iLevel = 1, SpecXSec(iCase)%NumElecLevel - WRITE(unit_index,CSVFORMAT,ADVANCE='NO') ',', ElecRelaxRate(iCase,iLevel) - END DO - END IF + IF(CalcRelaxProb) THEN + IF(XSec_Relaxation) THEN + DO iSpec = 1, nSpecies + DO jSpec = iSpec, nSpecies + iCase = CollInf%Coll_Case(iSpec,jSpec) + IF(SpecXSec(iCase)%UseVibXSec) THEN + ! Skip entry if both species are NOT molecules + IF(((SpecDSMC(iSpec)%InterID.NE.2).AND.(SpecDSMC(iSpec)%InterID.NE.20)).AND. & + ((SpecDSMC(jSpec)%InterID.NE.2).AND.(SpecDSMC(jSpec)%InterID.NE.20))) CYCLE + WRITE(unit_index,CSVFORMAT,ADVANCE='NO') ',', VibRelaxRate(iCase) + END IF + END DO END DO + END IF + IF(DSMC%ElectronicModel.EQ.3) THEN + DO iSpec = 1, nSpecies + DO jSpec = iSpec, nSpecies + iCase = CollInf%Coll_Case(iSpec,jSpec) + IF(SpecXSec(iCase)%UseElecXSec) THEN + DO iLevel = 1, SpecXSec(iCase)%NumElecLevel + WRITE(unit_index,CSVFORMAT,ADVANCE='NO') ',', ElecRelaxRate(iCase,iLevel) + END DO + END IF + END DO + END DO + END IF + END IF + IF(CalcReacRates) THEN + DO iCase=1, ChemReac%NumOfReact + WRITE(unit_index,CSVFORMAT,ADVANCE='NO') ',', RRate(iCase) END DO END IF END IF - IF(CalcReacRates) THEN - DO iCase=1, ChemReac%NumOfReact - WRITE(unit_index,CSVFORMAT,ADVANCE='NO') ',', RRate(iCase) - END DO - END IF -#endif /*(PP_TimeDiscMethod==42)*/ +#endif #if USE_HDG IF(CalcBRVariableElectronTemp.OR.BRAutomaticElectronRef)THEN ! variable reference electron temperature DO iRegions=1,BRNbrOfRegions diff --git a/src/particles/analyze/particle_analyze_tools.f90 b/src/particles/analyze/particle_analyze_tools.f90 index d8a7878db..ff1bd35ba 100644 --- a/src/particles/analyze/particle_analyze_tools.f90 +++ b/src/particles/analyze/particle_analyze_tools.f90 @@ -50,13 +50,13 @@ MODULE MOD_Particle_Analyze_Tools PUBLIC :: CalcTransTemp PUBLIC :: CalcMixtureTemp PUBLIC :: CalcTelec,CalcTVibPoly -#if (PP_TimeDiscMethod==2 || PP_TimeDiscMethod==4 || PP_TimeDiscMethod==42 || PP_TimeDiscMethod==300 || PP_TimeDiscMethod==400 || (PP_TimeDiscMethod>=501 && PP_TimeDiscMethod<=509) || PP_TimeDiscMethod==120) +#if (PP_TimeDiscMethod==2 || PP_TimeDiscMethod==4 || PP_TimeDiscMethod==300 || PP_TimeDiscMethod==400 || (PP_TimeDiscMethod>=501 && PP_TimeDiscMethod<=509) || PP_TimeDiscMethod==120) PUBLIC :: CalcRelaxProbRotVib #endif PUBLIC :: CalcVelocities -#if (PP_TimeDiscMethod==42) +#if (PP_TimeDiscMethod==4) PUBLIC :: CollRates,CalcRelaxRates,CalcRelaxRatesElec,ReacRates -#endif /*(PP_TimeDiscMethod==42)*/ +#endif /*(PP_TimeDiscMethod==4)*/ PUBLIC :: CalcPowerDensity PUBLIC :: CalculatePartElemData PUBLIC :: CalcCoupledPowerPart, CalcEelec @@ -1888,7 +1888,7 @@ REAL FUNCTION CalcTVibPoly(MeanEVib, iSpec) END FUNCTION CalcTVibPoly -#if (PP_TimeDiscMethod==2 || PP_TimeDiscMethod==4 || PP_TimeDiscMethod==42 || PP_TimeDiscMethod==300 || PP_TimeDiscMethod==400 || (PP_TimeDiscMethod>=501 && PP_TimeDiscMethod<=509) || PP_TimeDiscMethod==120) +#if (PP_TimeDiscMethod==2 || PP_TimeDiscMethod==4 || PP_TimeDiscMethod==300 || PP_TimeDiscMethod==400 || (PP_TimeDiscMethod>=501 && PP_TimeDiscMethod<=509) || PP_TimeDiscMethod==120) SUBROUTINE CalcRelaxProbRotVib(RotRelaxProb,VibRelaxProb) !=================================================================================================================================== ! Calculates global rotational and vibrational relaxation probability for PartAnalyse.csv @@ -2138,7 +2138,7 @@ SUBROUTINE CalcVelocities(PartVtrans, PartVtherm,NumSpec,SimNumSpec) END SUBROUTINE CalcVelocities -#if (PP_TimeDiscMethod==42) +#if (PP_TimeDiscMethod==4) SUBROUTINE CollRates(CRate) !=================================================================================================================================== !> Calculate the collision rate per species pairing by diving the summed up variables by the current timestep diff --git a/src/particles/dsmc/dsmc_analyze.f90 b/src/particles/dsmc/dsmc_analyze.f90 index b8972d88f..460c23e8e 100644 --- a/src/particles/dsmc/dsmc_analyze.f90 +++ b/src/particles/dsmc/dsmc_analyze.f90 @@ -775,7 +775,7 @@ SUBROUTINE DSMC_output_calc(nVar,nVar_quality,nVarloc,DSMC_MacroVal) IF (DoVirtualCellMerge) THEN DO iElem = 1, nElems IF (VirtMergedCells(iElem)%isMerged) THEN - DSMC_MacroVal(:,iElem) = DSMC_MacroVal(:,VirtMergedCells(iElem)%MasterCell-offSetElem) + DSMC_MacroVal(:,iElem) = DSMC_MacroVal(:,VirtMergedCells(iElem)%MasterCell-offSetElem) END IF END DO END IF @@ -785,7 +785,7 @@ END SUBROUTINE DSMC_output_calc SUBROUTINE CalcMacroElecExcitation(MacroElecExcitation) !=================================================================================================================================== -!> +!> !=================================================================================================================================== ! MODULES USE MOD_PreProc @@ -806,7 +806,7 @@ SUBROUTINE CalcMacroElecExcitation(MacroElecExcitation) ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -! INTEGER :: +! INTEGER :: REAL :: TimeSample !=================================================================================================================================== @@ -824,7 +824,7 @@ SUBROUTINE CalcMacroElecExcitation(MacroElecExcitation) TimeSample = (Time-(1-DSMC%TimeFracSamp)*TEnd) END IF -! Rate +! Rate MacroElecExcitation = ExcitationSampleData / TimeSample END SUBROUTINE CalcMacroElecExcitation @@ -1023,7 +1023,7 @@ SUBROUTINE WriteDSMCToHDF5(MeshFileName,OutputTime) CALL WriteAttributeToHDF5(File_ID,'Time',1,RealScalar=OutputTime) CALL WriteAttributeToHDF5(File_ID,'MeshFile',1,StrScalar=(/TRIM(MeshFileName)/)) CALL WriteAttributeToHDF5(File_ID,'NSpecies',1,IntegerScalar=nSpecies) - ! Standard variable names + ! Standard variable names CALL WriteAttributeToHDF5(File_ID,'VarNamesAdd',nVar+nVar_quality,StrArray=StrVarNames) ! Additional variable names: electronic excitation rate output IF(SampleElecExcitation) CALL WriteAttributeToHDF5(File_ID,'VarNamesExci',ExcitationLevelCounter,StrArray=StrVarNamesElecExci) @@ -1212,11 +1212,8 @@ SUBROUTINE DSMCMacroSampling() ! LOCAL VARIABLES INTEGER :: nOutput !----------------------------------------------------------------------------------------------------------------------------------- - -#if (PP_TimeDiscMethod==42) ! Do not perform sampling in the case of a reservoir simulation IF (DSMC%ReservoirSimu) RETURN -#endif ! Use user given TimeFracSamp IF((Time.GE.(1-DSMC%TimeFracSamp)*TEnd).AND.(.NOT.SamplingActive)) THEN diff --git a/src/particles/dsmc/dsmc_chemical_init.f90 b/src/particles/dsmc/dsmc_chemical_init.f90 index a86b1b577..86464596f 100644 --- a/src/particles/dsmc/dsmc_chemical_init.f90 +++ b/src/particles/dsmc/dsmc_chemical_init.f90 @@ -220,12 +220,12 @@ SUBROUTINE DSMC_chemical_init() !---------------------------------------------------------------------------------------------------------------------------------- ALLOCATE(ChemReac%NumReac(ChemReac%NumOfReact)) ChemReac%NumReac = 0 -#if (PP_TimeDiscMethod==42) -ALLOCATE(ChemReac%ReacCount(ChemReac%NumOfReact)) -ChemReac%ReacCount = 0 -ALLOCATE(ChemReac%ReacCollMean(CollInf%NumCase)) -ChemReac%ReacCollMean = 0.0 -#endif +IF (DSMC%ReservoirSimu) THEN + ALLOCATE(ChemReac%ReacCount(ChemReac%NumOfReact)) + ChemReac%ReacCount = 0 + ALLOCATE(ChemReac%ReacCollMean(CollInf%NumCase)) + ChemReac%ReacCollMean = 0.0 +END IF ALLOCATE(ChemReac%ReactType(ChemReac%NumOfReact)) ChemReac%ReactType = '0' ALLOCATE(ChemReac%ReactModel(ChemReac%NumOfReact)) @@ -778,79 +778,4 @@ SUBROUTINE DSMC_BackwardRate_init() END SUBROUTINE DSMC_BackwardRate_init - -! SUBROUTINE Init_TLU_Data -! !=================================================================================================================================== -! ! Reads Scattering Angle Lookup Table from Test_Lookup_komplett.txt -! !=================================================================================================================================== -! ! MODULES -! USE MOD_Globals -! USE MOD_DSMC_Vars, ONLY : TLU_Data, ChemReac -! ! IMPLICIT VARIABLE HANDLING -! IMPLICIT NONE -! -! !-- parameters -! INTEGER,PARAMETER :: unit1=20 -! !DOUBLE PRECISION, PARAMETER :: mass_ion=2.180d-25 !Xenon -! !DOUBLE PRECISION, PARAMETER :: mass_neutral=2.180d-25 !Xenon -! -! !-- local variables -! INTEGER :: io_error1,read_error,iLine -! CHARACTER(LEN=1000000) :: string1 -! INTEGER :: N_b, N_E -! DOUBLE PRECISION :: real1, real2 -! !=================================================================================================================================== -! -! OPEN(UNIT=unit1,file=TRIM(ChemReac%TLU_FileName(ChemReac%NumOfReact)),STATUS='old',ACTION='READ',IOSTAT=io_error1) -! IF ( io_error1 .EQ. 0) THEN -! !----------------------------------Schleife ueber alle Zeilen in file1----------------------------------! -! iLine=0 -! DO -! !----------------------------------Einlesen----------------------------------! -! READ(unit1,'(A)',IOSTAT=read_error) string1 -! IF ( read_error .GT. 0) THEN -! CALL abort(__STAMP__,& -! 'Chemistry - Error in Init_TLU_Data, Error:',read_error) -! ELSE IF (read_error .LT. 0 ) THEN -! EXIT ! Dateiende erreicht -! ELSE -! iLine=iLine+1 -! IF (iLine.EQ.1) THEN -! READ(string1,*,IOSTAT=read_error) real1, real2 -! N_b=NINT(real1) -! N_E=NINT(real2) -! ALLOCATE( TLU_Data%Chitable(1:N_E,1:N_b)) -! ALLOCATE( TLU_Data%deltabj(1:N_E)) -! ELSE IF (iLine.EQ.2) THEN -! READ(string1,*,IOSTAT=read_error) TLU_Data%Emin, TLU_Data%Emax, TLU_Data%deltaE -! ELSE IF (iLine.EQ.3) THEN -! READ(string1,*,IOSTAT=read_error) TLU_Data%deltabj(1:N_E) -! ELSE IF (iLine.EQ.4 .OR. iLine.EQ.5) THEN -! !dummy lines... -! ELSE IF (iLine.GE.6 .AND. iLine.LE.N_b+5) THEN -! READ(string1,*,IOSTAT=read_error) TLU_Data%Chitable(:,iLine-5) -! ELSE -! CALL abort(__STAMP__,& -! 'Chemistry - Error in Init_TLU_Data, File too long, Error:',read_error) -! END IF -! IF ( read_error .NE. 0) THEN -! !STOP "Datenfehler im gelesenen String!" -! CALL abort(__STAMP__,& -! 'Chemistry - Error in Init_TLU_Data, Data error in loaded string,Error:',read_error) -! END IF -! END IF -! END DO -! ELSE -! !STOP "Datenfehler im gelesenen String!" -! CALL abort(__STAMP__,& -! 'Chemistry - Error in Init_TLU_Data, Error while opening of Test_Lookup_komplett.txt, Error:',io_error1) -! !WRITE(*,'(A,I0,A)') 'Beim Oeffenen der Datei Test_Lookup_komplett.txt ist Fehler Nr. ', io_error1,' aufgetreten!' -! END IF -! -! ! Force Chi at N_b to be 0 -! TLU_Data%Chitable(:,N_b) = 0 -! -! CLOSE(unit=unit1) -! END SUBROUTINE Init_TLU_Data - END MODULE MOD_DSMC_ChemInit diff --git a/src/particles/dsmc/dsmc_chemical_reactions.f90 b/src/particles/dsmc/dsmc_chemical_reactions.f90 index 642c4b41e..0bbbf0003 100644 --- a/src/particles/dsmc/dsmc_chemical_reactions.f90 +++ b/src/particles/dsmc/dsmc_chemical_reactions.f90 @@ -282,9 +282,7 @@ SUBROUTINE CalcReactionProb(iPair,iReac,ReactionProb,nPair,NumDens) END IF IF(DSMC%ReservoirSimu) THEN -#if (PP_TimeDiscMethod==42) IF(DSMC%ReservoirRateStatistic) THEN -#endif IF((ReactionProb.GT.1).AND.(ReactionProbGTUnityCounter.LT.100)) THEN ReactionProbGTUnityCounter=ReactionProbGTUnityCounter+1 IPWRITE(*,*) 'Warning: ReactionProb greater than unity! ReacNbr:', iReac,' ReactionProb:',ReactionProb @@ -292,18 +290,14 @@ SUBROUTINE CalcReactionProb(iPair,iReac,ReactionProb,nPair,NumDens) IPWRITE(*,*) ' Counted 100 ReactionProb greater than unity. Turning this warning off.' END IF END IF -#if (PP_TimeDiscMethod==42) END IF -#endif END IF ! ReactionProb should not be gt 1 to avoid meaningless high weighting of a single reaction IF (ReactionProb.GT.1) ReactionProb = 1.0 -#if (PP_TimeDiscMethod==42) -IF (.NOT.DSMC%ReservoirRateStatistic) THEN +IF (DSMC%ReservoirSimu.AND..NOT.DSMC%ReservoirRateStatistic) THEN ChemReac%NumReac(iReac) = ChemReac%NumReac(iReac) + ReactionProb ChemReac%ReacCount(iReac) = ChemReac%ReacCount(iReac) + 1 END IF -#endif END SUBROUTINE CalcReactionProb @@ -427,8 +421,7 @@ SUBROUTINE DSMC_Chemistry(iPair, iReac) END IF ! Do not perform the reaction in case the reaction is to be calculated at a constant gas composition (DSMC%ReservoirSimuRate = T) -#if (PP_TimeDiscMethod==42) -IF (DSMC%ReservoirSimuRate) THEN +IF (DSMC%ReservoirSimu.AND.DSMC%ReservoirSimuRate) THEN ! Count the number of reactions to determine the actual reaction rate IF (DSMC%ReservoirRateStatistic) THEN ChemReac%NumReac(iReac) = ChemReac%NumReac(iReac) + 1 @@ -436,7 +429,6 @@ SUBROUTINE DSMC_Chemistry(iPair, iReac) ! Leave the routine again RETURN END IF -#endif Xi_elec = 0. EZeroTempToExec = 0. @@ -1612,8 +1604,7 @@ SUBROUTINE PhotoIonization_InsertProducts(iPair, iReac, iInit, InitSpec, iLineOp ProductReac(1:4) = ChemReac%Products(iReac,1:4) ! Do not perform the reaction in case the reaction is to be calculated at a constant gas composition (DSMC%ReservoirSimuRate = T) -#if (PP_TimeDiscMethod==42) -IF (DSMC%ReservoirSimuRate) THEN +IF (DSMC%ReservoirSimu.AND.DSMC%ReservoirSimuRate) THEN ! Count the number of reactions to determine the actual reaction rate IF (DSMC%ReservoirRateStatistic) THEN ChemReac%NumReac(iReac) = ChemReac%NumReac(iReac) + 1 @@ -1621,7 +1612,6 @@ SUBROUTINE PhotoIonization_InsertProducts(iPair, iReac, iInit, InitSpec, iLineOp ! Leave the routine again RETURN END IF -#endif Weight = 0. NumProd = 2; SumWeightProd = 0. diff --git a/src/particles/dsmc/dsmc_collis_mode.f90 b/src/particles/dsmc/dsmc_collis_mode.f90 index aa0a57d76..de1b4165c 100644 --- a/src/particles/dsmc/dsmc_collis_mode.f90 +++ b/src/particles/dsmc/dsmc_collis_mode.f90 @@ -49,9 +49,7 @@ SUBROUTINE DSMC_Elastic_Col(iPair) USE MOD_Globals ,ONLY: unit_stdout,myrank USE MOD_Particle_Vars ,ONLY: Symmetry #endif /* CODE_ANALYZE */ -#if (PP_TimeDiscMethod==42) USE MOD_DSMC_Vars ,ONLY: DSMC -#endif ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -71,17 +69,14 @@ SUBROUTINE DSMC_Elastic_Col(iPair) INTEGER :: iMom, iMomDim #endif /* CODE_ANALYZE */ !=================================================================================================================================== - -#if (PP_TimeDiscMethod==42) ! Reservoir simulation for obtaining the reaction rate at one given point does not require to perform the reaction -IF (DSMC%ReservoirSimuRate) RETURN -#endif +IF (DSMC%ReservoirSimu.AND.DSMC%ReservoirSimuRate) RETURN - iPart1 = Coll_pData(iPair)%iPart_p1 - iPart2 = Coll_pData(iPair)%iPart_p2 +iPart1 = Coll_pData(iPair)%iPart_p1 +iPart2 = Coll_pData(iPair)%iPart_p2 - iSpec1 = PartSpecies(iPart1) - iSpec2 = PartSpecies(iPart2) +iSpec1 = PartSpecies(iPart1) +iSpec2 = PartSpecies(iPart2) #ifdef CODE_ANALYZE ! Momentum conservation @@ -106,13 +101,13 @@ SUBROUTINE DSMC_Elastic_Col(iPair) cRelaNew(1:3) = PostCollVec(iPair) ! deltaV particle 1 (post collision particle 1 velocity in laboratory frame) - PartState(4,iPart1) = VeloMx + FracMassCent2 * cRelaNew(1) + PartState(4,iPart1) = VeloMx + FracMassCent2 * cRelaNew(1) PartState(5,iPart1) = VeloMy + FracMassCent2 * cRelaNew(2) PartState(6,iPart1) = VeloMz + FracMassCent2 * cRelaNew(3) ! deltaV particle 2 (post collision particle 2 velocity in laboratory frame) - PartState(4,iPart2) = VeloMx - FracMassCent1 * cRelaNew(1) + PartState(4,iPart2) = VeloMx - FracMassCent1 * cRelaNew(1) PartState(5,iPart2) = VeloMy - FracMassCent1 * cRelaNew(2) - PartState(6,iPart2) = VeloMz - FracMassCent1 * cRelaNew(3) + PartState(6,iPart2) = VeloMz - FracMassCent1 * cRelaNew(3) #ifdef CODE_ANALYZE Momentum_new(1:3) = Species(iSpec2)%MassIC* (/VeloMx - FracMassCent1*cRelaNew(1),& VeloMy - FracMassCent1*cRelaNew(2),& @@ -153,189 +148,6 @@ SUBROUTINE DSMC_Elastic_Col(iPair) END SUBROUTINE DSMC_Elastic_Col -!SUBROUTINE DSMC_Scat_Col(iPair) -!!=================================================================================================================================== -!! Performs a collision with the possibility of a CEX. In the calculation of the new particle velocities a scattering angle is used, -!! which is interpolated from a lookup table. -!!=================================================================================================================================== -!! MODULES -! USE MOD_DSMC_Vars, ONLY : Coll_pData, CollInf, TLU_Data, ChemReac -! USE MOD_Particle_Vars, ONLY : PartSpecies, PartState -! USE MOD_DSMC_ChemReact, ONLY : simpleCEX, simpleMEX -! -!! IMPLICIT VARIABLE HANDLING -! IMPLICIT NONE -!!----------------------------------------------------------------------------------------------------------------------------------- -!! INPUT VARIABLES -! INTEGER, INTENT(IN) :: iPair -!!----------------------------------------------------------------------------------------------------------------------------------- -!! OUTPUT VARIABLES -!!----------------------------------------------------------------------------------------------------------------------------------- -!! LOCAL VARIABLES -! REAL :: FracMassCent1, FracMassCent2 ! mx/(mx+my) -! REAL :: VeloMx, VeloMy, VeloMz ! center of mass velo -! REAL :: cRelax, cRelay, cRelaz ! pre-collisional relativ velo -! REAL :: cRelaxN, cRelayN, cRelazN ! post-collisional relativ velo -! REAL :: b, bmax ! impact parameters -! REAL :: Ekin -! REAL :: ScatAngle, RotAngle ! scattering and rotational angle -! REAL :: sigma_el, sigma_tot ! cross-sections -! REAL :: P_CEX ! charge exchange probability -! INTEGER :: iReac -! REAL :: uRan2, uRan3, uRanRot, uRanVHS -! REAL :: Pi, aEL, bEL, aCEX, bCEX -! INTEGER :: iPart1, iPart2 ! Colliding particles 1 and 2 -!!=================================================================================================================================== -! iPart1 = Coll_pData(iPair)%iPart_p1 -! iPart2 = Coll_pData(iPair)%iPart_p2 -! -! Pi = ACOS(-1.0) -! aCEX = ChemReac%CEXa(ChemReac%ReactNum(PartSpecies(iPart1),PartSpecies(iPart2),1)) -! bCEX = ChemReac%CEXb(ChemReac%ReactNum(PartSpecies(iPart1),PartSpecies(iPart2),1)) -! aEL = ChemReac%ELa(ChemReac%ReactNum(PartSpecies(iPart1),PartSpecies(iPart2),1)) -! bEL = ChemReac%ELb(ChemReac%ReactNum(PartSpecies(iPart1),PartSpecies(iPart2),1)) -! ! Decision if scattering angle is greater than 1 degree and should be calculated -! -! sigma_el = bEL + aEL*0.5 * LOG10(Coll_pData(iPair)%cRela2) -! -! sigma_tot = ((aCEX+0.5*aEL)*0.5*LOG10(Coll_pData(iPair)%cRela2)+bCEX+0.5*bEL) -! -! CALL RANDOM_NUMBER(uRan2) -! -!IF ((sigma_el/sigma_tot).GT.uRan2) THEN -! ! Calculation of relative velocities -! cRelax = PartState(4,iPart1) - PartState(4,iPart2) -! cRelay = PartState(5,iPart1) - PartState(5,iPart2) -! cRelaz = PartState(6,iPart1) - PartState(6,iPart2) -! -! FracMassCent1 = CollInf%FracMassCent(PartSpecies(iPart1), Coll_pData(iPair)%PairType) -! FracMassCent2 = CollInf%FracMassCent(PartSpecies(iPart2), Coll_pData(iPair)%PairType) -! -! ! Calculation of velo from center of mass -! VeloMx = FracMassCent1 * PartState(4,iPart1) + FracMassCent2 * PartState(4,iPart2) -! VeloMy = FracMassCent1 * PartState(5,iPart1) + FracMassCent2 * PartState(5,iPart2) -! VeloMz = FracMassCent1 * PartState(6,iPart1) + FracMassCent2 * PartState(6,iPart2) -! -! ! Calculation of impact parameter b -! bmax = SQRT(sigma_el/Pi) -! b = bmax * SQRT(uRan2) -! Ekin = (0.5*CollInf%MassRed(Coll_pData(iPair)%PairType)*Coll_pData(iPair)%cRela2/(1.6021766208E-19)) -! -! -! ! Determination of scattering angle by interpolation from a lookup table -! ! Check if Collision Energy is below the threshold of table -! IF (Ekin.LT.TLU_Data%Emin) THEN -! ! Isotropic scattering -! CALL RANDOM_NUMBER(uRanVHS) -! ScatAngle = 2*ACOS(SQRT(uRanVHS)) -! ELSE -! ! scattering corresponding to table lookup -! CALL TLU_Scat_Interpol(Ekin,b,ScatAngle) -! END IF -! -! ! Determination of rotational angle by random number -! CALL RANDOM_NUMBER(uRanRot) -! RotAngle = uRanRot * 2 * Pi -! -! ! Calculation of post-collision relative velocities in center-of-mass frame -! cRelaxN = COS(ScatAngle)*cRelax + SIN(ScatAngle)*SIN(RotAngle)*(cRelay**2+cRelaz**2)**0.5 -! cRelayN = COS(ScatAngle)*cRelay & -! +SIN(ScatAngle)*(SQRT(Coll_pData(ipair)%cRela2)*cRelaz*COS(RotAngle)-cRelax*cRelay*SIN(RotAngle))/(cRelay**2+cRelaz**2)**0.5 -! cRelazN = COS(ScatAngle)*cRelaz & -! -SIN(ScatAngle)*(SQRT(Coll_pData(ipair)%cRela2)*cRelay*COS(RotAngle)+cRelax*cRelaz*SIN(RotAngle))/(cRelay**2+cRelaz**2)**0.5 -! -! ! Transformation to laboratory frame -! ! deltaV particle 1 -! PartState(4,iPart1) = VeloMx + FracMassCent2*CRelaxN -! PartState(5,iPart1) = VeloMy + FracMassCent2*CRelayN -! PartState(6,iPart1) = VeloMz + FracMassCent2*CRelazN -! ! deltaV particle 2 -! PartState(4,iPart2) = VeloMx - FracMassCent1*CRelaxN -! PartState(5,iPart2) = VeloMy - FracMassCent1*CRelayN -! PartState(6,iPart2) = VeloMz - FracMassCent1*CRelazN -! -! ! Decision concerning CEX -! P_CEX = 0.5 -! CALL RANDOM_NUMBER(uRan3) -! iReac = ChemReac%ReactNum(PartSpecies(iPart1), PartSpecies(iPart2), 1) -! IF (P_CEX.GT.uRan3) THEN -! CALL simpleCEX(iReac, iPair, resetRHS_opt=.FALSE.) -! ELSE -! CALL simpleMEX(iReac, iPair) -! END IF -! -! ELSE -! ! Perform CEX and leave velocity vectors alone otherwise -! ! CEX -! iReac = ChemReac%ReactNum(PartSpecies(iPart1), PartSpecies(iPart2), 1) -! CALL simpleCEX(iReac, iPair) -! -! END IF -! -!END SUBROUTINE DSMC_Scat_Col - -!SUBROUTINE TLU_Scat_Interpol(E_p,b_p,ScatAngle) -!!=================================================================================================================================== -!! Interpolates ScatAngle from a lookup table -!!=================================================================================================================================== -!! MODULES -! USE MOD_Globals -! USE MOD_DSMC_Vars, ONLY : TLU_Data -!! IMPLICIT VARIABLE HANDLING -! IMPLICIT NONE -!!----------------------------------------------------------------------------------------------------------------------------------- -!! INPUT VARIABLES -! REAL, INTENT (IN) :: E_p, b_p ! E_p has to have the unit eV -!!----------------------------------------------------------------------------------------------------------------------------------- -!! OUTPUT VARIABLES -! REAL, INTENT (OUT) :: ScatAngle -!!----------------------------------------------------------------------------------------------------------------------------------- -!! LOCAL VARIABLES -! REAL :: i_f_jp1, j_f, i_f_j -! INTEGER :: I_j,I_jp1,J -! REAL :: w_i_j,w_i_jp1,w_j -! INTEGER :: szb,szE -! REAL :: chi_b_p_E_j,chi_b_p_E_jp1,chi_b_p_e_p -!!=================================================================================================================================== -! IF (E_p.GT.TLU_Data%Emax) THEN -! CALL abort(__STAMP__,& -! 'Collis_mode - Error in TLU_Scat_Interpol: E_p GT Emax') -! END IF -! !write (*,*) (E_p-TLU_Data%Emin), TLU_Data%deltaE -! j_f = (E_p-TLU_Data%Emin)/TLU_Data%deltaE -! J = FLOOR(j_f) -! w_j = j_f - J -! J = J + 1 ! Fitting of the indices for the use in FORTRAN matrix -! !write (*,*) j_f, J, w_j -! i_f_j = ABS((b_p)/TLU_Data%deltabj(J)) -! i_f_jp1 = ABS((b_p)/TLU_Data%deltabj(J+1)) -! I_j = FLOOR(i_f_j) -! I_jp1 = FLOOR(i_f_jp1) -! -! w_i_j = i_f_j - I_j -! w_i_jp1 = i_f_jp1-I_jp1 -! -! I_j = FLOOR(i_f_j)+1 ! Fitting of the indices for the use in FORTRAN matrix -! I_jp1 = FLOOR(i_f_jp1)+1 ! -! -! szE = SIZE(TLU_Data%Chitable,dim=1) !SIZE(delta_b_j) -! szB = SIZE(TLU_Data%Chitable,dim=2) -! -! -! -! IF ((I_jp1+1).GE.szB) THEN -! chi_b_p_E_j = (1 - w_i_j) * TLU_Data%Chitable(J,szB) !+ w_i_j * TLU_Data%Chitable(J,szB) -! chi_b_p_E_jp1 = (1-w_i_jp1) * TLU_Data%Chitable((J+1),szB) -! chi_b_p_E_p = (1-w_j) * chi_b_p_E_j + w_j * chi_b_p_E_jp1 -! ELSE -! chi_b_p_E_j = (1 - w_i_j) * TLU_Data%Chitable(J,I_j) + w_i_j * TLU_Data%Chitable(J,I_jp1) -! chi_b_p_E_jp1 = (1-w_i_jp1) * TLU_Data%Chitable((J+1),I_jp1) + w_i_jp1 * TLU_Data%Chitable((J+1),(I_jp1+1)) -! chi_b_p_E_p = (1-w_j) * chi_b_p_E_j + w_j * chi_b_p_E_jp1 -! END IF -! ScatAngle = chi_b_p_E_p -! -! !write(*,*) (ScatAngle/ACOS(-1.0)*180), I_jp1, szB -!END SUBROUTINE TLU_Scat_Interpol SUBROUTINE DSMC_Relax_Col_LauxTSHO(iPair) !=================================================================================================================================== @@ -352,10 +164,8 @@ SUBROUTINE DSMC_Relax_Col_LauxTSHO(iPair) USE MOD_part_tools ,ONLY: GetParticleWeight USE MOD_MCC_Vars ,ONLY: UseMCC, SpecXSec USE MOD_MCC_XSec ,ONLY: XSec_CalcElecRelaxProb, XSec_ElectronicRelaxation -#if (PP_TimeDiscMethod==42) USE MOD_MCC_Vars ,ONLY: XSec_Relaxation USE MOD_Particle_Analyze_Vars ,ONLY: CalcRelaxProb -#endif #ifdef CODE_ANALYZE USE MOD_Globals ,ONLY: Abort USE MOD_Globals ,ONLY: unit_stdout,myrank @@ -485,15 +295,15 @@ SUBROUTINE DSMC_Relax_Col_LauxTSHO(iPair) IF(ProbVib1.GT.iRan) DoVib1 = .TRUE. END IF -#if (PP_TimeDiscMethod==42) -IF(CalcRelaxProb) THEN - IF(XSec_Relaxation) THEN - IF(DoVib1) THEN - SpecXSec(iCase)%VibCount = SpecXSec(iCase)%VibCount + 1.0 + IF (DSMC%ReservoirSimu) THEN + IF(CalcRelaxProb) THEN + IF(XSec_Relaxation) THEN + IF(DoVib1) THEN + SpecXSec(iCase)%VibCount = SpecXSec(iCase)%VibCount + 1.0 + END IF + END IF END IF END IF -END IF -#endif IF((SpecDSMC(iSpec2)%InterID.EQ.2).OR.(SpecDSMC(iSpec2)%InterID.EQ.20)) THEN CALL RANDOM_NUMBER(iRan) @@ -527,17 +337,17 @@ SUBROUTINE DSMC_Relax_Col_LauxTSHO(iPair) FakXi = 0.5*Xi - 1. ! exponent factor of DOF, substitute of Xi_c - Xi_vib, laux diss page 40 -#if (PP_TimeDiscMethod==42) -IF(CalcRelaxProb) THEN - IF(XSec_Relaxation) THEN - IF(DoVib2) THEN - SpecXSec(iCase)%VibCount = SpecXSec(iCase)%VibCount + 1.0 +IF (DSMC%ReservoirSimu) THEN + IF(CalcRelaxProb) THEN + IF(XSec_Relaxation) THEN + IF(DoVib2) THEN + SpecXSec(iCase)%VibCount = SpecXSec(iCase)%VibCount + 1.0 + END IF END IF END IF + ! Reservoir simulation for obtaining the reaction rate at one given point does not require to perform the reaction + IF (DSMC%ReservoirSimuRate) RETURN END IF -! Reservoir simulation for obtaining the reaction rate at one given point does not require to perform the reaction -IF (DSMC%ReservoirSimuRate) RETURN -#endif !--------------------------------------------------------------------------------------------------! ! Electronic Relaxation / Transition @@ -672,12 +482,12 @@ SUBROUTINE DSMC_Relax_Col_LauxTSHO(iPair) ! deltaV particle 1 (post collision particle 1 velocity in laboratory frame) PartState(4,iPart1) = VeloMx + FracMassCent2*cRelaNew(1) - PartState(5,iPart1) = VeloMy + FracMassCent2*cRelaNew(2) - PartState(6,iPart1) = VeloMz + FracMassCent2*cRelaNew(3) + PartState(5,iPart1) = VeloMy + FracMassCent2*cRelaNew(2) + PartState(6,iPart1) = VeloMz + FracMassCent2*cRelaNew(3) ! deltaV particle 2 (post collision particle 2 velocity in laboratory frame) PartState(4,iPart2) = VeloMx - FracMassCent1*cRelaNew(1) - PartState(5,iPart2) = VeloMy - FracMassCent1*cRelaNew(2) - PartState(6,iPart2) = VeloMz - FracMassCent1*cRelaNew(3) + PartState(5,iPart2) = VeloMy - FracMassCent1*cRelaNew(2) + PartState(6,iPart2) = VeloMz - FracMassCent1*cRelaNew(3) #ifdef CODE_ANALYZE Energy_new= 0.5*Species(iSpec2)%MassIC*((VeloMx - FracMassCent1*cRelaNew(1))**2 & @@ -761,11 +571,8 @@ SUBROUTINE DSMC_Relax_Col_Gimelshein(iPair) REAL :: Weight1, Weight2 #endif /* CODE_ANALYZE */ !=================================================================================================================================== - -#if (PP_TimeDiscMethod==42) ! Reservoir simulation for obtaining the reaction rate at one given point does not require to perform the reaction -IF (DSMC%ReservoirSimuRate) RETURN -#endif +IF (DSMC%ReservoirSimu.AND.DSMC%ReservoirSimuRate) RETURN iPart1 = Coll_pData(iPair)%iPart_p1 iPart2 = Coll_pData(iPair)%iPart_p2 @@ -962,7 +769,7 @@ SUBROUTINE DSMC_Relax_Col_Gimelshein(iPair) ! --------------------------------------------------------------------------------------------------! ! Multi-mode relaxation with the Metropolis-Hastings method ! --------------------------------------------------------------------------------------------------! - CALL DSMC_VibRelaxPoly(iPair,iPart2,FakXi) + CALL DSMC_VibRelaxPoly(iPair,iPart2,FakXi) ELSE ! --------------------------------------------------------------------------------------------------! ! Single-mode relaxation of a previously selected mode @@ -1030,7 +837,7 @@ SUBROUTINE DSMC_Relax_Col_Gimelshein(iPair) ! Relaxation of first particle IF ( DoElec1 ) THEN ! calculate energy for electronic relaxation of particle 1 - Coll_pData(iPair)%Ec = Coll_pData(iPair)%Ec + PartStateIntEn(3,iPart1)*GetParticleWeight(iPart1) + Coll_pData(iPair)%Ec = Coll_pData(iPair)%Ec + PartStateIntEn(3,iPart1)*GetParticleWeight(iPart1) CALL ElectronicEnergyExchange(iPair,iPart1,FakXi) Coll_pData(iPair)%Ec = Coll_pData(iPair)%Ec - PartStateIntEn(3,iPart1)*GetParticleWeight(iPart1) END IF @@ -1038,9 +845,9 @@ SUBROUTINE DSMC_Relax_Col_Gimelshein(iPair) ! Electronic relaxation of second particle IF ( DoElec2 ) THEN ! calculate energy for electronic relaxation of particle 2 - Coll_pData(iPair)%Ec = Coll_pData(iPair)%Ec + PartStateIntEn(3,iPart2)*GetParticleWeight(iPart2) + Coll_pData(iPair)%Ec = Coll_pData(iPair)%Ec + PartStateIntEn(3,iPart2)*GetParticleWeight(iPart2) CALL ElectronicEnergyExchange(iPair,iPart2,FakXi) - Coll_pData(iPair)%Ec = Coll_pData(iPair)%Ec - PartStateIntEn(3,iPart2)*GetParticleWeight(iPart2) + Coll_pData(iPair)%Ec = Coll_pData(iPair)%Ec - PartStateIntEn(3,iPart2)*GetParticleWeight(iPart2) END IF !--------------------------------------------------------------------------------------------------! ! Calculation of new particle velocities @@ -1066,12 +873,12 @@ SUBROUTINE DSMC_Relax_Col_Gimelshein(iPair) ! deltaV particle 1 (post collision particle 1 velocity in laboratory frame) PartState(4,iPart1) = VeloMx + FracMassCent2*cRelaNew(1) - PartState(5,iPart1) = VeloMy + FracMassCent2*cRelaNew(2) - PartState(6,iPart1) = VeloMz + FracMassCent2*cRelaNew(3) + PartState(5,iPart1) = VeloMy + FracMassCent2*cRelaNew(2) + PartState(6,iPart1) = VeloMz + FracMassCent2*cRelaNew(3) ! deltaV particle 2 (post collision particle 2 velocity in laboratory frame) PartState(4,iPart2) = VeloMx - FracMassCent1*cRelaNew(1) - PartState(5,iPart2) = VeloMy - FracMassCent1*cRelaNew(2) - PartState(6,iPart2) = VeloMz - FracMassCent1*cRelaNew(3) + PartState(5,iPart2) = VeloMy - FracMassCent1*cRelaNew(2) + PartState(6,iPart2) = VeloMz - FracMassCent1*cRelaNew(3) #ifdef CODE_ANALYZE Energy_new= 0.5*Species(PartSpecies(iPart2))%MassIC*((VeloMx - FracMassCent1*cRelaNew(1))**2 & @@ -1118,12 +925,10 @@ SUBROUTINE DSMC_perform_collision(iPair, iElem, NodeVolume, NodePartNum) USE MOD_Particle_Vars ,ONLY: PartState, WriteMacroVolumeValues, Symmetry USE MOD_Particle_Vars ,ONLY: UseRotRefFrame, PDM, PartVeloRotRef, RotRefFrameOmega USE MOD_TimeDisc_Vars ,ONLY: TEnd, Time -#if (PP_TimeDiscMethod==42) USE MOD_DSMC_Vars ,ONLY: RadialWeighting USE MOD_Particle_Vars ,ONLY: usevMPF, Species, PartSpecies USE MOD_Particle_Analyze_Vars ,ONLY: CalcCollRates USE MOD_part_tools ,ONLY: GetParticleWeight -#endif ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -1139,24 +944,21 @@ SUBROUTINE DSMC_perform_collision(iPair, iElem, NodeVolume, NodePartNum) LOGICAL :: RelaxToDo INTEGER :: iPart1, iPart2 ! Colliding particles 1 and 2 REAL :: Distance -#if (PP_TimeDiscMethod==42) REAL :: MacroParticleFactor, PairWeight -#endif !=================================================================================================================================== - -#if (PP_TimeDiscMethod==42) -IF(CalcCollRates) THEN - PairWeight = (GetParticleWeight(Coll_pData(iPair)%iPart_p1) + GetParticleWeight(Coll_pData(iPair)%iPart_p2))/2. - IF(usevMPF.OR.RadialWeighting%DoRadialWeighting) THEN - ! Weighting factor already included in the PairWeight - MacroParticleFactor = 1. - ELSE - ! Weighting factor should be the same for all species anyway (BGG: first species is the non-BGG particle species) - MacroParticleFactor = Species(PartSpecies(Coll_pData(iPair)%iPart_p1))%MacroParticleFactor +IF (DSMC%ReservoirSimu) THEN + IF(CalcCollRates) THEN + PairWeight = (GetParticleWeight(Coll_pData(iPair)%iPart_p1) + GetParticleWeight(Coll_pData(iPair)%iPart_p2))/2. + IF(usevMPF.OR.RadialWeighting%DoRadialWeighting) THEN + ! Weighting factor already included in the PairWeight + MacroParticleFactor = 1. + ELSE + ! Weighting factor should be the same for all species anyway (BGG: first species is the non-BGG particle species) + MacroParticleFactor = Species(PartSpecies(Coll_pData(iPair)%iPart_p1))%MacroParticleFactor + END IF + DSMC%NumColl(Coll_pData(iPair)%PairType) = DSMC%NumColl(Coll_pData(iPair)%PairType) + PairWeight*MacroParticleFactor END IF - DSMC%NumColl(Coll_pData(iPair)%PairType) = DSMC%NumColl(Coll_pData(iPair)%PairType) + PairWeight*MacroParticleFactor END IF -#endif iPart1 = Coll_pData(iPair)%iPart_p1 iPart2 = Coll_pData(iPair)%iPart_p2 @@ -1292,7 +1094,7 @@ SUBROUTINE ReactionDecision(iPair, RelaxToDo, iElem, NodeVolume, NodePartNum) ReactionProbArray = 0. ! Reset the complete array (only populated for the specific collision case) PerformReaction = .FALSE. -DO iPath = 1, ChemReac%CollCaseInfo(iCase)%NumOfReactionPaths +DO iPath = 1, ChemReac%CollCaseInfo(iCase)%NumOfReactionPaths ReacTest = ChemReac%CollCaseInfo(iCase)%ReactionIndex(iPath) IF(TRIM(ChemReac%ReactModel(ReacTest)).EQ.'QK') THEN CALL QK_TestReaction(iPair,ReacTest,PerformReaction(iPath)) @@ -1335,7 +1137,7 @@ SUBROUTINE ReactionDecision(iPair, RelaxToDo, iElem, NodeVolume, NodePartNum) RelaxToDo = .FALSE. IF(ReacCounter.GT.1) THEN ! Determine which reaction will occur, perform it and leave the loop - ReactionProb = ReactionProb + 1./REAL(ReacCounter) + ReactionProb = ReactionProb + 1./REAL(ReacCounter) IF(ReactionProb.GT.iRan) THEN CALL DSMC_Chemistry(iPair, ReacTest) ! Exit the routine @@ -1398,51 +1200,6 @@ SUBROUTINE ReactionDecision(iPair, RelaxToDo, iElem, NodeVolume, NodePartNum) END IF END IF -! ! ############################################################################################################################### ! -! CASE(16) ! simple CEX/MEX -! ! ############################################################################################################################### ! -! iReac = ChemReac%ReactNum(PartSpecies(iPart1), PartSpecies(iPart2), 1) -! IF (ChemReac%DoScat(iReac)) THEN! MEX -! CALL DSMC_Scat_Col(iPair) -! ELSE -! sigmaCEX = (ChemReac%CEXa(iReac)*0.5*LOG10(Coll_pData(iPair)%cRela2) + ChemReac%CEXb(iReac)) -! sigmaMEX = (ChemReac%MEXa(iReac)*0.5*LOG10(Coll_pData(iPair)%cRela2) + ChemReac%MEXb(iReac)) -! ReactionProb=0. -! IF ((sigmaMEX.EQ.0.).AND.(sigmaCEX.GT.0.)) THEN -! ReactionProb=1. -! ELSEIF ((sigmaMEX.GT.0.).AND.(sigmaCEX.GE.0.)) THEN -! ReactionProb=(sigmaCEX/sigmaMEX)/((sigmaCEX/sigmaMEX)+1) -! ELSE -! CALL Abort(& -! __STAMP__& -! ,'ERROR! CEX/MEX cross sections are both zero or at least one of them is negative.') -! END IF -! #if (PP_TimeDiscMethod==42) -! IF (.NOT.DSMC%ReservoirRateStatistic) THEN -! ChemReac%NumReac(iReac) = ChemReac%NumReac(iReac) + ReactionProb ! for calculation of reaction rate coefficient -! ChemReac%ReacCount(iReac) = ChemReac%ReacCount(iReac) + 1 -! END IF -! #endif -! CALL RANDOM_NUMBER(iRan) -! IF (ReactionProb.GT.iRan) THEN !CEX, otherwise MEX -! #if (PP_TimeDiscMethod==42) -! ! Reservoir simulation for obtaining the reaction rate at one given point does not require to perform the reaction -! IF (.NOT.DSMC%ReservoirSimuRate) THEN -! #endif -! CALL simpleCEX(iReac, iPair) -! #if (PP_TimeDiscMethod==42) -! END IF -! IF (DSMC%ReservoirRateStatistic) THEN -! ChemReac%NumReac(iReac) = ChemReac%NumReac(iReac) + 1 ! for calculation of reaction rate coefficient -! END IF -! #endif -! ELSE -! CALL DSMC_Elastic_Col(iPair) -! CALL simpleMEX(iReac, iPair) -! END IF -! END IF !ChemReac%DoScat(iReac) -! RelaxToDo = .FALSE. - END SUBROUTINE ReactionDecision diff --git a/src/particles/dsmc/dsmc_collision_prob.f90 b/src/particles/dsmc/dsmc_collision_prob.f90 index 2fe475165..e9a506178 100644 --- a/src/particles/dsmc/dsmc_collision_prob.f90 +++ b/src/particles/dsmc/dsmc_collision_prob.f90 @@ -240,33 +240,33 @@ SUBROUTINE DSMC_prob_calc(iElem, iPair, NodeVolume) DSMC%CollProbMeanCount = DSMC%CollProbMeanCount + 1 END IF -#if (PP_TimeDiscMethod==42) -! Sum of collision probabilities for the collision pair, required for the correct reaction rate -IF(ChemReac%NumOfReact.GT.0) THEN - IF (ChemReac%CollCaseInfo(iCase)%NumOfReactionPaths.GT.0) THEN - CollProb = Coll_pData(iPair)%Prob - IF(SpecDSMC(iSpec_p1)%UseCollXSec) THEN - ! Calculate the collision probability for the null collision probability case - IF(BGGas%BackgroundSpecies(iSpec_p2)) THEN - IF(XSec_NullCollision) THEN - IF(BGGas%UseDistribution) THEN - CollProb = CollProb * SpecXSec(iCase)%ProbNullElem(iElem) +IF (DSMC%ReservoirSimu) THEN + ! Sum of collision probabilities for the collision pair, required for the correct reaction rate + IF(ChemReac%NumOfReact.GT.0) THEN + IF (ChemReac%CollCaseInfo(iCase)%NumOfReactionPaths.GT.0) THEN + CollProb = Coll_pData(iPair)%Prob + IF(SpecDSMC(iSpec_p1)%UseCollXSec) THEN + ! Calculate the collision probability for the null collision probability case + IF(BGGas%BackgroundSpecies(iSpec_p2)) THEN + IF(XSec_NullCollision) THEN + IF(BGGas%UseDistribution) THEN + CollProb = CollProb * SpecXSec(iCase)%ProbNullElem(iElem) + ELSE + CollProb = CollProb * SpecXSec(iCase)%ProbNull + END IF ELSE - CollProb = CollProb * SpecXSec(iCase)%ProbNull + IF(BGGas%UseDistribution)THEN + CollProb = CollProb * BGGas%SpeciesFractionElem(BGGas%MapSpecToBGSpec(iSpec_p2),iElem) + ELSE + CollProb = CollProb * BGGas%SpeciesFraction(BGGas%MapSpecToBGSpec(iSpec_p2)) + END IF ! BGGas%UseDistribution END IF - ELSE - IF(BGGas%UseDistribution)THEN - CollProb = CollProb * BGGas%SpeciesFractionElem(BGGas%MapSpecToBGSpec(iSpec_p2),iElem) - ELSE - CollProb = CollProb * BGGas%SpeciesFraction(BGGas%MapSpecToBGSpec(iSpec_p2)) - END IF ! BGGas%UseDistribution END IF END IF + ChemReac%ReacCollMean(iCase) = ChemReac%ReacCollMean(iCase) + CollProb END IF - ChemReac%ReacCollMean(iCase) = ChemReac%ReacCollMean(iCase) + CollProb END IF END IF -#endif END SUBROUTINE DSMC_prob_calc diff --git a/src/particles/dsmc/dsmc_electronic_model.f90 b/src/particles/dsmc/dsmc_electronic_model.f90 index 242371916..e52067f04 100644 --- a/src/particles/dsmc/dsmc_electronic_model.f90 +++ b/src/particles/dsmc/dsmc_electronic_model.f90 @@ -341,7 +341,7 @@ SUBROUTINE ElectronicEnergyExchange(iPair,iPart1,FakXi, NewPart, XSec_Level) (1.-LocRelaxProb)*ElectronicDistriPart(iPart1)%DistriFunc(iQua+1) + & LocRelaxProb * SpecDSMC(iSpec)%ElectronicState(1,iQua) *EXP (-tmpExp)/ElectronicPartition ELSE - ElectronicDistriPart(iPart1)%DistriFunc(iQua+1) = (1.-LocRelaxProb)*ElectronicDistriPart(iPart1)%DistriFunc(iQua+1) + ElectronicDistriPart(iPart1)%DistriFunc(iQua+1) = (1.-LocRelaxProb)*ElectronicDistriPart(iPart1)%DistriFunc(iQua+1) END IF ! ElectronicDistriPart(iPart1)%DistriFunc(iQua+1) = SpecDSMC(iSpec)%ElectronicState(1,iQua) * & ! EXP ( - SpecDSMC(iSpec)%ElectronicState(2,iQua) / TransElec)/ElectronicPartition @@ -497,7 +497,7 @@ SUBROUTINE LT_ElectronicEnergyExchange(iPartIndx_Node, nPart, NodeVolume) nElecRelaxSpec =0; nElecRelax=0 DO iLoop = 1, nPart iPart = iPartIndx_Node(iLoop) - iSpec = PartSpecies(iPart) + iSpec = PartSpecies(iPart) IF((SpecDSMC(iSpec)%InterID.NE.4).AND.(.NOT.SpecDSMC(iSpec)%FullyIonized)) THEN IF (.NOT.ElecRelaxPart(iPart)) CYCLE partWeight = GetParticleWeight(iPart) @@ -532,7 +532,7 @@ SUBROUTINE LT_ElectronicEnergyExchange(iPartIndx_Node, nPart, NodeVolume) DO iLoop = 1, nElecRelax iPart = iPartIndx_NodeRelaxElec(iLoop) iSpec = PartSpecies(iPart) - partWeight = GetParticleWeight(iPart) + partWeight = GetParticleWeight(iPart) CALL RANDOM_NUMBER(iRan) iQua = INT( ( SpecDSMC(iSpec)%MaxElecQuant ) * iRan) ElectronicPartitionTemp = SpecDSMC(iSpec)%ElectronicState(1,iQua) * EXP(-SpecDSMC(iSpec)%ElectronicState(2,iQua)/TEqui) @@ -544,12 +544,12 @@ SUBROUTINE LT_ElectronicEnergyExchange(iPartIndx_Node, nPart, NodeVolume) ElectronicPartitionTemp = SpecDSMC(iSpec)%ElectronicState(1,iQua) * EXP(-SpecDSMC(iSpec)%ElectronicState(2,iQua)/TEqui) CALL RANDOM_NUMBER(iRan) END DO - iQua = MAX(iQua,1) + iQua = MAX(iQua,1) PartStateIntEn( 3,iPart) = BoltzmannConst*SpecDSMC(iSpec)%ElectronicState(2,iQua) IF (TEqui.GT.SpecDSMC(iSpec)%MaxMeanXiElec(2)) THEN SkipEnergyCons(iSpec)= .TRUE. IF ((OldEn - (PartStateIntEn(3,iPart)*partWeight)).LT.0.0) THEN - DO WHILE ((OldEn - (PartStateIntEn(3,iPart)*partWeight)).LT.0.0) + DO WHILE ((OldEn - (PartStateIntEn(3,iPart)*partWeight)).LT.0.0) iQua = iQua - 1 PartStateIntEn(3,iPart) = BoltzmannConst*SpecDSMC(iSpec)%ElectronicState(2,iQua) IF (iQua.EQ.0) EXIT @@ -566,7 +566,7 @@ SUBROUTINE LT_ElectronicEnergyExchange(iPartIndx_Node, nPart, NodeVolume) ! 8.) Determine the new particle state and ensure energy conservation by scaling the new velocities with the factor alpha. alpha = SQRT(OldEn/NewEn) DO iLoop = 1, nPart - iPart = iPartIndx_Node(iLoop) + iPart = iPartIndx_Node(iLoop) PartState(4:6,iPart) = vBulkAll(1:3) + alpha*(PartState(4:6,iPart)-vBulkAll(1:3)) END DO @@ -575,7 +575,7 @@ END SUBROUTINE LT_ElectronicEnergyExchange SUBROUTINE LT_ElectronicEnergyExchangeChem(iPartIndx_Node, nPart) !=================================================================================================================================== -!> Subroutine for the electronic excitation of chemical reacting particles, same steps as LT_ElectronicEnergyExchange but only for +!> Subroutine for the electronic excitation of chemical reacting particles, same steps as LT_ElectronicEnergyExchange but only for !> chemical reacting particles assuming an thermal equilibrium between translation and electronical excitation after the chemical !> reaction !=================================================================================================================================== @@ -621,16 +621,16 @@ SUBROUTINE LT_ElectronicEnergyExchangeChem(iPartIndx_Node, nPart) DO iLoop = 1, nPart iPart = iPartIndx_Node(iLoop) partWeight = GetParticleWeight(iPart) - iSpec = PartSpecies(iPart) - V_rel(1:3)=PartState(4:6,iPart)-vBulkAll(1:3) - vmag2 = V_rel(1)**2 + V_rel(2)**2 + V_rel(3)**2 + iSpec = PartSpecies(iPart) + V_rel(1:3)=PartState(4:6,iPart)-vBulkAll(1:3) + vmag2 = V_rel(1)**2 + V_rel(2)**2 + V_rel(3)**2 OldEn = OldEn + 0.5*Species(iSpec)%MassIC * vmag2*partWeight END DO NewEn = OldEn DO iLoop = 1, nPart iPart = iPartIndx_Node(iLoop) - iSpec = PartSpecies(iPart) + iSpec = PartSpecies(iPart) IF((SpecDSMC(iSpec)%InterID.NE.4).AND.(.NOT.SpecDSMC(iSpec)%FullyIonized)) THEN partWeight = GetParticleWeight(iPart) OldEn = OldEn + PartStateIntEn(3,iPart)* partWeight @@ -672,13 +672,13 @@ SUBROUTINE LT_ElectronicEnergyExchangeChem(iPartIndx_Node, nPart) DO iSpec = 1, nSpecies Xi_ElecTotal = Xi_ElecTotal + Xi_ElecSpec(iSpec)*totalWeightSpec(iSpec) END DO - + TempEn = (3.*(nPart-1.)/nPart*totalWeight+Xi_ElecTotal)/2.*BoltzmannConst*TEqui IF (TempEn.GT.OldEn) THEN MaxTemp = TEqui ELSE MinTemp = TEqui - END IF + END IF END DO ElectronicPartition = 0. @@ -708,7 +708,7 @@ SUBROUTINE LT_ElectronicEnergyExchangeChem(iPartIndx_Node, nPart) nElecRelax = nElecRelax + 1 nElecRelaxSpec(iSpec) = nElecRelaxSpec(iSpec) + 1 iPartIndx_NodeRelaxElec(nElecRelax) = iPart - partWeight = GetParticleWeight(iPart) + partWeight = GetParticleWeight(iPart) CALL RANDOM_NUMBER(iRan) iQua = INT( ( SpecDSMC(iSpec)%MaxElecQuant ) * iRan) ElectronicPartitionTemp = SpecDSMC(iSpec)%ElectronicState(1,iQua) * EXP(-SpecDSMC(iSpec)%ElectronicState(2,iQua)/TEqui) @@ -720,12 +720,12 @@ SUBROUTINE LT_ElectronicEnergyExchangeChem(iPartIndx_Node, nPart) ElectronicPartitionTemp = SpecDSMC(iSpec)%ElectronicState(1,iQua) * EXP(-SpecDSMC(iSpec)%ElectronicState(2,iQua)/TEqui) CALL RANDOM_NUMBER(iRan) END DO - iQua = MAX(iQua,1) + iQua = MAX(iQua,1) PartStateIntEn( 3,iPart) = BoltzmannConst*SpecDSMC(iSpec)%ElectronicState(2,iQua) IF (TEqui.GT.SpecDSMC(iSpec)%MaxMeanXiElec(2)) THEN SkipEnergyCons(iSpec)= .TRUE. IF ((OldEn - (PartStateIntEn(3,iPart)*partWeight)).LT.0.0) THEN - DO WHILE ((OldEn - (PartStateIntEn(3,iPart)*partWeight)).LT.0.0) + DO WHILE ((OldEn - (PartStateIntEn(3,iPart)*partWeight)).LT.0.0) iQua = iQua - 1 PartStateIntEn(3,iPart) = BoltzmannConst*SpecDSMC(iSpec)%ElectronicState(2,iQua) IF (iQua.EQ.0) EXIT @@ -744,7 +744,7 @@ SUBROUTINE LT_ElectronicEnergyExchangeChem(iPartIndx_Node, nPart) alpha = SQRT(OldEn/NewEn) DO iLoop = 1, nPart - iPart = iPartIndx_Node(iLoop) + iPart = iPartIndx_Node(iLoop) PartState(4:6,iPart) = vBulkAll(1:3) + alpha*(PartState(4:6,iPart)-vBulkAll(1:3)) END DO @@ -753,7 +753,7 @@ END SUBROUTINE LT_ElectronicEnergyExchangeChem SUBROUTINE LT_ElectronicExc_ConstructPartList(iPartIndx_NodeTotal, iPartIndx_NodeTotalElecExc, nPart, nPartRelax) !=================================================================================================================================== -!> Construct List of Particles that must be checked for electronic excitation. +!> Construct List of Particles that must be checked for electronic excitation. !> Sort out the particles that have already been relaxed by a chemical reaction. !=================================================================================================================================== ! MODULES @@ -865,13 +865,13 @@ SUBROUTINE CalcMoments_ElectronicExchange(nPart, iPartIndx_Node, nSpec, vBulkAll DO iLoop = 1, nPart iPart = iPartIndx_Node(iLoop) partWeight = GetParticleWeight(iPart) - iSpec = PartSpecies(iPart) + iSpec = PartSpecies(iPart) V_rel(1:3)=PartState(4:6,iPart)-vBulkSpec(1:3,iSpec) - vmag2 = V_rel(1)**2 + V_rel(2)**2 + V_rel(3)**2 + vmag2 = V_rel(1)**2 + V_rel(2)**2 + V_rel(3)**2 u2Spec(iSpec) = u2Spec(iSpec) + vmag2*partWeight - V_rel(1:3)=PartState(4:6,iPart)-vBulkAll(1:3) - vmag2 = V_rel(1)**2 + V_rel(2)**2 + V_rel(3)**2 + V_rel(1:3)=PartState(4:6,iPart)-vBulkAll(1:3) + vmag2 = V_rel(1)**2 + V_rel(2)**2 + V_rel(3)**2 OldEn = OldEn + 0.5*Species(iSpec)%MassIC * vmag2*partWeight IF((SpecDSMC(iSpec)%InterID.NE.4).AND.(.NOT.SpecDSMC(iSpec)%FullyIonized)) THEN EElecSpec(iSpec) = EElecSpec(iSpec) + PartStateIntEn(3,iPart) * partWeight @@ -880,7 +880,7 @@ SUBROUTINE CalcMoments_ElectronicExchange(nPart, iPartIndx_Node, nSpec, vBulkAll IF (nSpecies.GT.1) THEN SpecTemp = 0.0 - EnerTotal = 0.0 + EnerTotal = 0.0 tempweight = 0.0; tempweight2 = 0.0; tempmass = 0.0; vBulkTemp = 0.0 DO iSpec = 1, nSpecies IF ((nSpec(iSpec).GE.2).AND.(.NOT.ALMOSTZERO(u2Spec(iSpec)))) THEN @@ -891,9 +891,9 @@ SUBROUTINE CalcMoments_ElectronicExchange(nPart, iPartIndx_Node, nSpec, vBulkAll EnerTotal = EnerTotal + totalWeightSpec(iSpec) * Species(iSpec)%MassIC / 2. * vmag2 tempweight = tempweight + totalWeightSpec(iSpec) tempweight2 = tempweight2 + totalWeightSpec2(iSpec) - tempmass = tempmass + totalWeightSpec(iSpec) * Species(iSpec)%MassIC - vBulkTemp(1:3) = vBulkTemp(1:3) + vBulkSpec(1:3,iSpec)*totalWeightSpec(iSpec) * Species(iSpec)%MassIC - END IF + tempmass = tempmass + totalWeightSpec(iSpec) * Species(iSpec)%MassIC + vBulkTemp(1:3) = vBulkTemp(1:3) + vBulkSpec(1:3,iSpec)*totalWeightSpec(iSpec) * Species(iSpec)%MassIC + END IF END DO vBulkTemp(1:3) = vBulkTemp(1:3) / tempmass @@ -1032,7 +1032,7 @@ SUBROUTINE EnergyConsElec(nPart, nElecRelax, nElecRelaxSpec, iPartIndx_NodeRelax DO iSpec = 1, nSpecies IF (SkipEnergyCons(iSpec)) CYCLE IF (NewEnElec(iSpec).GT.0.0) THEN - alpha(iSpec) = OldEn/NewEnElec(iSpec)*(Xi_ElecSpec(iSpec)*nElecRelaxSpec(iSpec)/(3.*(nPart-1.)+Xi_ElecTotal)) + alpha(iSpec) = OldEn/NewEnElec(iSpec)*(Xi_ElecSpec(iSpec)*nElecRelaxSpec(iSpec)/(3.*(nPart-1.)+Xi_ElecTotal)) ELSE alpha(iSpec) = 0.0 END IF @@ -1041,16 +1041,16 @@ SUBROUTINE EnergyConsElec(nPart, nElecRelax, nElecRelaxSpec, iPartIndx_NodeRelax iPart = iPartIndx_NodeRelaxElec(iLoop) partWeight = GetParticleWeight(iPart) iSpec = PartSpecies(iPart) - IF (SkipEnergyCons(iSpec)) CYCLE + IF (SkipEnergyCons(iSpec)) CYCLE betaV = alpha(iSpec)*PartStateIntEn( 3,iPart) DO iQuant = 1, SpecDSMC(iSpec)%MaxElecQuant - 1 IF (betaV.LT.BoltzmannConst * SpecDSMC(iSpec)%ElectronicState(2,iQuant)) THEN - iQuaMax = iQuant + iQuaMax = iQuant EXIT END IF IF(iQuant.EQ.SpecDSMC(iSpec)%MaxElecQuant - 1) iQuaMax = iQuant END DO - Prob = (betaV-BoltzmannConst*SpecDSMC(iSpec)%ElectronicState(2,iQuaMax-1)) & + Prob = (betaV-BoltzmannConst*SpecDSMC(iSpec)%ElectronicState(2,iQuaMax-1)) & / (BoltzmannConst*(SpecDSMC(iSpec)%ElectronicState(2,iQuaMax) - SpecDSMC(iSpec)%ElectronicState(2,iQuaMax-1))) CALL RANDOM_NUMBER(iRan) IF (iRan.GT.Prob) THEN @@ -1061,7 +1061,7 @@ SUBROUTINE EnergyConsElec(nPart, nElecRelax, nElecRelaxSpec, iPartIndx_NodeRelax PartStateIntEn(3,iPart) = BoltzmannConst*SpecDSMC(iSpec)%ElectronicState(2,iQuaMax) END IF IF ((OldEn - (PartStateIntEn(3,iPart)*partWeight)).LT.0.0) THEN - DO WHILE ((OldEn - (PartStateIntEn(3,iPart)*partWeight)).LT.0.0) + DO WHILE ((OldEn - (PartStateIntEn(3,iPart)*partWeight)).LT.0.0) iQuant = iQuant - 1 PartStateIntEn(3,iPart) = BoltzmannConst*SpecDSMC(iSpec)%ElectronicState(2,iQuant) IF (iQuant.EQ.0) EXIT @@ -1069,7 +1069,7 @@ SUBROUTINE EnergyConsElec(nPart, nElecRelax, nElecRelaxSpec, iPartIndx_NodeRelax END IF OldEn = OldEn - PartStateIntEn(3,iPart)*partWeight END DO -END IF +END IF END SUBROUTINE EnergyConsElec @@ -1095,26 +1095,10 @@ SUBROUTINE TVEEnergyExchange(CollisionEnergy,iPart1,FakXi) INTEGER :: iQuaMax, MaxElecQuant, iQua ! , iQuaMax3 INTEGER :: jQVib, QMaxVib REAL :: iRan, iRan2, gmax, gtemp, PartStateTemp, iRanVib -!#if ( PP_TimeDiscMethod==42 ) -! INTEGER :: iQuaold -!#endif !=================================================================================================================================== iQuaMax = 0 ! Determine max electronic quant MaxElecQuant = SpecDSMC(PartSpecies(iPart1))%MaxElecQuant - 1 -!#if ( PP_TimeDiscMethod==42 ) -! iQuaold=0 -! ! determine old Quant -! DO iQua = 0, MaxElecQuant -! IF ( PartStateIntEn(3,iPart1) / BoltzmannConst .ge. & -! SpecDSMC(PartSpecies(iPart1))%ElectronicState(2,iQua) ) THEN -! iQuaold = iQua -! ELSE -! ! exit loop -! EXIT -! END IF -! END DO -!#endif ! determine maximal Quant and term according to Eq (7) of Liechty gmax = 0 PartStateTemp = CollisionEnergy / BoltzmannConst @@ -1165,16 +1149,12 @@ SUBROUTINE TVEEnergyExchange(CollisionEnergy,iPart1,FakXi) END IF CALL RANDOM_NUMBER(iRan2) END DO -#if (PP_TimeDiscMethod==42) -! Reservoir simulation for obtaining the reaction rate at one given point does not require to performe the reaction - IF (.NOT.DSMC%ReservoirSimuRate) THEN -#endif + ! Reservoir simulation for obtaining the reaction rate at one given point does not require to perform the reaction + IF (DSMC%ReservoirSimu.AND..NOT.DSMC%ReservoirSimuRate) THEN PartStateIntEn(3,iPart1) = BoltzmannConst * SpecDSMC(PartSpecies(iPart1))%ElectronicState(2,iQua) PartStateIntEn(1,iPart1) = (jQVib + DSMC%GammaQuant) * BoltzmannConst & * SpecDSMC(PartSpecies(iPart1))%CharaTVib -#if (PP_TimeDiscMethod==42) END IF -#endif END SUBROUTINE TVEEnergyExchange @@ -1389,7 +1369,7 @@ SUBROUTINE CalcProbCorrFactorElec() MinTemp=MIN(DSMC%InstantTXiElec(1,iSpec),DSMC%InstantTransTemp(nSpecies+1)) MaxTemp=MAX(DSMC%InstantTXiElec(1,iSpec),DSMC%InstantTransTemp(nSpecies+1)) Tequi= 0.5*(MaxTemp+MinTemp) - iLoop = 1 + iLoop = 1 OldEn =DSMC%InstantTXiElec(1,iSpec)*DSMC%InstantTXiElec(2,iSpec)+Xi_rel*DSMC%InstantTransTemp(nSpecies+1) NewEn=(CalcXiElec(TEqui, iSpec)+Xi_rel)*Tequi DO WHILE(ABS(OldEn-NewEn).GT.1E-2) @@ -1397,8 +1377,8 @@ SUBROUTINE CalcProbCorrFactorElec() MaxTemp = TEqui ELSE MinTemp = TEqui - END IF - Tequi= 0.5*(MaxTemp+MinTemp) + END IF + Tequi= 0.5*(MaxTemp+MinTemp) NewEn=(CalcXiElec(TEqui, iSpec)+Xi_rel)*Tequi iLoop = iLoop + 1 IF (iLoop.EQ.100) THEN diff --git a/src/particles/dsmc/dsmc_init.f90 b/src/particles/dsmc/dsmc_init.f90 index 60e1be226..8ca00a10e 100644 --- a/src/particles/dsmc/dsmc_init.f90 +++ b/src/particles/dsmc/dsmc_init.f90 @@ -555,9 +555,9 @@ SUBROUTINE InitDSMC() END IF ! DoFieldIonization.OR.CollisMode.NE.0 IF (CollisMode.EQ.0) THEN -#if (PP_TimeDiscMethod==42) - CALL Abort(__STAMP__, "Free Molecular Flow (CollisMode=0) is not supported for reservoir!") -#endif + IF (DSMC%ReservoirSimu) THEN + CALL Abort(__STAMP__, "Free Molecular Flow (CollisMode=0) is not supported for reservoir!") + END IF ELSE !CollisMode.GT.0 ! species and case assignment arrays ALLOCATE(DSMC%NumColl(CollInf%NumCase +1)) @@ -774,21 +774,21 @@ SUBROUTINE InitDSMC() ! Comparison with Landau-Teller equation, including a different selection procedure (restricts relaxation to a single mode) ! and a correctional factor, both in dsmc_collis_mode.f90, also the translational temperature is fixed, in timedisc.f90 !----------------------------------------------------------------------------------------------------------------------------------- -#if (PP_TimeDiscMethod==42) - DSMC%CompareLandauTeller = GETLOGICAL('Particles-DSMC-CompareLandauTeller','.FALSE.') - IF(DSMC%CompareLandauTeller) THEN - IF(CollisMode.NE.2) THEN - CALL abort(& - __STAMP__& - ,'ERROR: Comparison with Landau-Teller only available in CollisMode = 2, CollisMode:', CollisMode) - END IF - IF(nSpecies.GT.1) THEN - CALL abort(& - __STAMP__& - ,'ERROR: Comparison with Landau-Teller only available for a single species, nSpecies:', nSpecies) + IF (DSMC%ReservoirSimu) THEN + DSMC%CompareLandauTeller = GETLOGICAL('Particles-DSMC-CompareLandauTeller','.FALSE.') + IF(DSMC%CompareLandauTeller) THEN + IF(CollisMode.NE.2) THEN + CALL abort(& + __STAMP__& + ,'ERROR: Comparison with Landau-Teller only available in CollisMode = 2, CollisMode:', CollisMode) + END IF + IF(nSpecies.GT.1) THEN + CALL abort(& + __STAMP__& + ,'ERROR: Comparison with Landau-Teller only available for a single species, nSpecies:', nSpecies) + END IF END IF END IF -#endif !----------------------------------------------------------------------------------------------------------------------------------- ! Setting the internal energy value of every particle DO iPart = 1, PDM%ParticleVecLength @@ -895,7 +895,11 @@ SUBROUTINE InitDSMC() ! Journal of Computational Physics 246, 28–36. doi:10.1016/j.jcp.2013.03.018 !----------------------------------------------------------------------------------------------------------------------------------- DSMC%UseOctree = GETLOGICAL('Particles-DSMC-UseOctree') + IF(DSMC%ReservoirSimu.AND.DSMC%UseOctree) CALL abort(__STAMP__,'Particles-DSMC-UseOctree = T not allowed for RESERVOIR simulation') DSMC%UseNearestNeighbour = GETLOGICAL('Particles-DSMC-UseNearestNeighbour') + IF(DSMC%ReservoirSimu.AND.DSMC%UseNearestNeighbour.AND.CollisMode.EQ.3) THEN + CALL abort(__STAMP__,'Particles-DSMC-UseNearestNeighbour = T not allowed for RESERVOIR simulation with chemical reactions') + END IF IF(DSMC%UseOctree) THEN IF(NGeo.GT.PP_N) CALL abort(__STAMP__,' Set PP_N to NGeo, else, the volume is not computed correctly.') CALL DSMC_init_octree() @@ -1518,7 +1522,7 @@ RECURSIVE SUBROUTINE DeleteNodeVolume(Node) INTEGER :: iLoop, nLoop !=================================================================================================================================== nLoop = 2**Symmetry%Order -IF(ASSOCIATED(Node%SubNode)) THEN +IF(ASSOCIATED(Node%SubNode)) THEN DO iLoop = 1, nLoop CALL DeleteNodeVolume(Node%SubNode(iLoop)) END DO diff --git a/src/particles/dsmc/dsmc_vars.f90 b/src/particles/dsmc/dsmc_vars.f90 index 3b1ae16ef..03690a413 100644 --- a/src/particles/dsmc/dsmc_vars.f90 +++ b/src/particles/dsmc/dsmc_vars.f90 @@ -49,7 +49,7 @@ MODULE MOD_DSMC_Vars INTEGER :: PairE_vMPF(2) ! 1: Pair chosen for energy redistribution ! 2: partical with minimal MPF of this Pair LOGICAL :: useDSMC -REAL , ALLOCATABLE :: PartStateIntEn(:,:) ! 1st index: 1:npartmax +REAL , ALLOCATABLE :: PartStateIntEn(:,:) ! 1st index: 1:npartmax ! ! 2nd index: Evib, Erot, Eel LOGICAL :: useRelaxProbCorrFactor ! Use the relaxation probability correction factor of Lumpkin @@ -91,8 +91,8 @@ MODULE MOD_DSMC_Vars REAL :: LastPartPos(1:3) REAL :: WeightingFactor INTEGER, ALLOCATABLE :: VibQuants(:) - REAL, ALLOCATABLE :: DistriFunc(:) - REAL, ALLOCATABLE :: AmbiPolVelo(:) + REAL, ALLOCATABLE :: DistriFunc(:) + REAL, ALLOCATABLE :: AmbiPolVelo(:) END TYPE TYPE(tClonedParticles),ALLOCATABLE :: ClonedParticles(:,:) @@ -252,9 +252,7 @@ MODULE MOD_DSMC_Vars ! coefficient with the equilibrium constant by partition functions REAL :: PartitionMaxTemp ! Temperature limit for pre-stored partition function (DEF: 20 000K) REAL :: PartitionInterval ! Temperature interval for pre-stored partition function (DEF: 10K) -#if (PP_TimeDiscMethod==42) LOGICAL :: CompareLandauTeller ! Keeps the translational temperature at the fixed value of the init -#endif LOGICAL :: MergeSubcells ! Merge subcells after quadtree division if number of particles within ! subcell is less than 7 LOGICAL :: DoAmbipolarDiff diff --git a/src/particles/mcc/mcc.f90 b/src/particles/mcc/mcc.f90 index 367d550cf..4a6bfb5ee 100644 --- a/src/particles/mcc/mcc.f90 +++ b/src/particles/mcc/mcc.f90 @@ -504,7 +504,7 @@ SUBROUTINE MonteCarloCollision(iElem) ELSE ! No collision IF(SplitInProgress) THEN ! Save the index of the first particle that did not collide - IF(SplitRestPart.EQ.0) THEN + IF(SplitRestPart.EQ.0) THEN SplitRestPart = PartIndex ! Reset the PartIndex to use a new particle (unless it is the last particle, keep the index to check whether it can be deleted) IF(iPartSplit.NE.SplitPartNum) PartIndex = 0 @@ -548,21 +548,23 @@ SUBROUTINE MonteCarloCollision(iElem) DSMC%CollProbMeanCount = DSMC%CollProbMeanCount + 1 END IF ! DSMC%CalcQualityFactors -#if (PP_TimeDiscMethod==42) - ! Sum of collision probabilities for the collision pair, required for the correct reaction rate - IF(ChemReac%NumOfReact.GT.0) THEN - IF (ChemReac%CollCaseInfo(iCase)%NumOfReactionPaths.GT.0) THEN - IF(SpecXSec(iSpec)%UseCollXSec) THEN - ! Calculate the collision probability for the null collision probability case - IF(XSec_NullCollision) THEN - CollProb = CollProb * ProbNull - ELSE - CollProb = CollProb * BGGasFraction +#if (PP_TimeDiscMethod==4) + IF (DSMC%ReservoirSimu) THEN + ! Sum of collision probabilities for the collision pair, required for the correct reaction rate + IF(ChemReac%NumOfReact.GT.0) THEN + IF (ChemReac%CollCaseInfo(iCase)%NumOfReactionPaths.GT.0) THEN + IF(SpecXSec(iSpec)%UseCollXSec) THEN + ! Calculate the collision probability for the null collision probability case + IF(XSec_NullCollision) THEN + CollProb = CollProb * ProbNull + ELSE + CollProb = CollProb * BGGasFraction + END IF END IF + ChemReac%ReacCollMean(iCase) = ChemReac%ReacCollMean(iCase) + CollProb END IF - ChemReac%ReacCollMean(iCase) = ChemReac%ReacCollMean(iCase) + CollProb - END IF - END IF ! ChemReac%NumOfReact.GT.0 + END IF ! ChemReac%NumOfReact.GT.0 + END IF #endif END DO ! DO WHILE(iLoop.LE.SpecPairNum(iCase)) SDEALLOCATE(PartIndexCase) @@ -710,8 +712,8 @@ SUBROUTINE MCC_CalcReactionProb(iCase,bgSpec,CRela2,CollEnergy_in,PartIndex,bggP ChemReac%CollCaseInfo(iCase)%ReactionProb(iPath) = 0. END IF ! Calculation of reaction rate coefficient -#if (PP_TimeDiscMethod==42) - IF (.NOT.DSMC%ReservoirRateStatistic) THEN +#if (PP_TimeDiscMethod==4) + IF (DSMC%ReservoirSimu.AND..NOT.DSMC%ReservoirRateStatistic) THEN ChemReac%NumReac(ReacTest) = ChemReac%NumReac(ReacTest) + ChemReac%CollCaseInfo(iCase)%ReactionProb(iPath) ChemReac%ReacCount(ReacTest) = ChemReac%ReacCount(ReacTest) + 1 END IF diff --git a/src/particles/mcc/mcc_xsec.f90 b/src/particles/mcc/mcc_xsec.f90 index 6d0b886d7..674c20bd6 100644 --- a/src/particles/mcc/mcc_xsec.f90 +++ b/src/particles/mcc/mcc_xsec.f90 @@ -1278,12 +1278,10 @@ SUBROUTINE XSec_CalcReactionProb(iPair,iCase,iElem,SpecNum1,SpecNum2,MacroPartic END IF END ASSOCIATE ! Calculation of reaction rate coefficient -#if (PP_TimeDiscMethod==42) - IF (.NOT.DSMC%ReservoirRateStatistic) THEN + IF (DSMC%ReservoirSimu.AND..NOT.DSMC%ReservoirRateStatistic) THEN ChemReac%NumReac(ReacTest) = ChemReac%NumReac(ReacTest) + ChemReac%CollCaseInfo(iCase)%ReactionProb(iPath) ChemReac%ReacCount(ReacTest) = ChemReac%ReacCount(ReacTest) + 1 END IF -#endif END IF END DO diff --git a/src/particles/particle_init.f90 b/src/particles/particle_init.f90 index 0f93b4c62..ea35a6946 100644 --- a/src/particles/particle_init.f90 +++ b/src/particles/particle_init.f90 @@ -130,7 +130,7 @@ SUBROUTINE DefineParametersParticles() 'i.e. how deep the merge extends into the mesh starting from \n'//& 'each cell. 0 is the least aggressive merge, 2 the most \n'//& 'aggressive merge.','0') -CALL prms%CreateIntOption( 'Part-MaxNumbCellsMerge' ,'Maximum number of cells to be merged.','4') +CALL prms%CreateIntOption( 'Part-MaxNumbCellsMerge' ,'Maximum number of cells to be merged.','4') CALL prms%SetSection("IMD") ! IMD things @@ -451,14 +451,14 @@ SUBROUTINE InitializeVariables() CALL InitializeVariablesPartBoundary() !-- Get PIC deposition (skip DSMC, FP-Flow and BGS-Flow related timediscs) -#if (PP_TimeDiscMethod==4) || (PP_TimeDiscMethod==42) || (PP_TimeDiscMethod==300) || (PP_TimeDiscMethod==400) +#if (PP_TimeDiscMethod==4) || (PP_TimeDiscMethod==300) || (PP_TimeDiscMethod==400) DoDeposition = .FALSE. !DoInterpolation = .FALSE. CALL PrintOption('No PIC-related Time discretization, turning deposition off. DoDeposition','INFO',LogOpt=DoDeposition) !CALL PrintOption('No PIC-related Time discretization, turning interpolation off. DoInterpolation','*CHANGE',LogOpt=DoDeposition) #else DoDeposition = GETLOGICAL('PIC-DoDeposition') -#endif /*(PP_TimeDiscMethod==4) || (PP_TimeDiscMethod==42) || (PP_TimeDiscMethod==300) || (PP_TimeDiscMethod==400)*/ +#endif /*(PP_TimeDiscMethod==4) || (PP_TimeDiscMethod==300) || (PP_TimeDiscMethod==400)*/ !-- Get PIC interpolation (could be skipped above, but DSMC octree requires some interpolation variables, which are allocated before ! init DSMC determines whether DSMC%UseOctree is true or false) @@ -686,7 +686,7 @@ SUBROUTINE InitializeVariablesVirtualCellMerge() DoVirtualCellMerge = GETLOGICAL('Part-DoVirtualCellMerge') IF(DoVirtualCellMerge)THEN #if USE_MPI -DoParticleLatencyHiding = .FALSE. +DoParticleLatencyHiding = .FALSE. #endif VirtualCellMergeSpread = GETINT('Part-CellMergeSpread') MaxNumOfMergedCells = GETINT('Part-MaxNumbCellsMerge') diff --git a/src/particles/particle_mesh/particle_bgm.f90 b/src/particles/particle_mesh/particle_bgm.f90 index f863fe648..38ef7fc69 100644 --- a/src/particles/particle_mesh/particle_bgm.f90 +++ b/src/particles/particle_mesh/particle_bgm.f90 @@ -407,7 +407,7 @@ SUBROUTINE BuildBGMAndIdentifyHaloRegion() deltaT=ManualTimeStep END IF IF (halo_eps_velo.EQ.0) halo_eps_velo = c -#if (PP_TimeDiscMethod==4 || PP_TimeDiscMethod==200 || PP_TimeDiscMethod==42) +#if (PP_TimeDiscMethod==4 || PP_TimeDiscMethod==200) IF (halo_eps_velo.EQ.c) CALL abort(__STAMP__, 'halo_eps_velo.EQ.c -> Halo Eps Velocity for MPI not defined') #endif #if (PP_TimeDiscMethod==501) || (PP_TimeDiscMethod==502) || (PP_TimeDiscMethod==506) @@ -710,7 +710,7 @@ SUBROUTINE BuildBGMAndIdentifyHaloRegion() IF (MeshHasPeriodic) CALL CheckPeriodicSides (EnlargeBGM) CALL BARRIER_AND_SYNC(ElemInfo_Shared_Win,MPI_COMM_SHARED) IF (PartBound%UseRotPeriodicBC) CALL CheckRotPeriodicSides(EnlargeBGM) - CALL BARRIER_AND_SYNC(ElemInfo_Shared_Win,MPI_COMM_SHARED) + CALL BARRIER_AND_SYNC(ElemInfo_Shared_Win,MPI_COMM_SHARED) IF (PartBound%UseInterPlaneBC) CALL CheckInterPlaneSides(EnlargeBGM) CALL BARRIER_AND_SYNC(ElemInfo_Shared_Win,MPI_COMM_SHARED) @@ -2001,10 +2001,10 @@ END SUBROUTINE CheckRotPeriodicSides SUBROUTINE CheckInterPlaneSides(EnlargeBGM) !=================================================================================================================================== !> checks the elements against inter plane -!> In addition to halo flat elements (normal halo region), find all elements on both side of a intermediate plane that +!> In addition to halo flat elements (normal halo region), find all elements on both side of a intermediate plane that !> are within range of the proc during a loop over all BCs: !> (1) Loop over all compute-node elements and check if they are within InterplaneRegion => Node is within InterplaneRegion -!> (2) Loop over all elements that are NOT on the compute node and add them as halo elements if they are within the corresponding +!> (2) Loop over all elements that are NOT on the compute node and add them as halo elements if they are within the corresponding !> InterplaneRegion !=================================================================================================================================== ! MODULES ! @@ -2058,7 +2058,7 @@ SUBROUTINE CheckInterPlaneSides(EnlargeBGM) END IF END DO IF(InInterPlaneRegion) THEN -! (2) Loop over all elements that are NOT on the compute node and add them as halo elements if they are within the corresponding +! (2) Loop over all elements that are NOT on the compute node and add them as halo elements if they are within the corresponding ! InterplaneRegion DO iElem = firstElem,lastElem ! only consider elements that are not already flagged diff --git a/src/timedisc/timedisc.f90 b/src/timedisc/timedisc.f90 index 734a97a2e..8953ff99a 100644 --- a/src/timedisc/timedisc.f90 +++ b/src/timedisc/timedisc.f90 @@ -233,7 +233,7 @@ SUBROUTINE TimeDisc() tTracking=0 tLocalization=0 END IF -IF(CalcEMFieldOutput) CALL WriteElectroMagneticPICFieldToHDF5() ! Write magnetic field to file +IF(CalcEMFieldOutput) CALL WriteElectroMagneticPICFieldToHDF5() ! Write magnetic field to file #endif /*PARTICLES*/ ! No computation needed if tEnd=tStart! @@ -283,8 +283,6 @@ SUBROUTINE TimeDisc() CALL TimeStep_DSMC() #elif (PP_TimeDiscMethod==6) CALL TimeStepByLSERK() -#elif (PP_TimeDiscMethod==42) - CALL TimeStep_DSMC_Debug() ! Reservoir and Debug #elif (PP_TimeDiscMethod==100) CALL TimeStepByEulerImplicit() ! O1 Euler Implicit #elif (PP_TimeDiscMethod==120) diff --git a/src/timedisc/timedisc_TimeStep_DSMC.f90 b/src/timedisc/timedisc_TimeStep_DSMC.f90 index 13d5041af..e154e7425 100644 --- a/src/timedisc/timedisc_TimeStep_DSMC.f90 +++ b/src/timedisc/timedisc_TimeStep_DSMC.f90 @@ -52,6 +52,7 @@ SUBROUTINE TimeStep_DSMC() USE MOD_SurfaceModel_Vars ,ONLY: nPorousBC USE MOD_vMPF ,ONLY: SplitAndMerge USE MOD_part_RHS ,ONLY: CalcPartRHSRotRefFrame +USE MOD_part_pos_and_velo ,ONLY: SetParticleVelocity USE MOD_Part_Tools ,ONLY: InRotRefFrameCheck USE MOD_Part_Tools ,ONLY: CalcPartSymmetryPos #if USE_MPI @@ -77,6 +78,19 @@ SUBROUTINE TimeStep_DSMC() REAL :: tLBStart #endif /*USE_LOADBALANCE*/ !=================================================================================================================================== +! for reservoir simulation: no surface flux, particle push, tracking, ... +IF (DSMC%ReservoirSimu) THEN ! fix grid should be defined for reservoir simu + CALL UpdateNextFreePosition() + CALL DSMC_main() + IF(DSMC%CompareLandauTeller) THEN + DO iPart=1,PDM%ParticleVecLength + PDM%nextFreePosition(iPart)=iPart + END DO + CALL SetParticleVelocity(1,1,PDM%ParticleVecLength) + END IF + RETURN +END IF + #if USE_LOADBALANCE CALL LBStartTime(tLBStart) #endif /*USE_LOADBALANCE*/ diff --git a/src/timedisc/timedisc_TimeStep_DSMC_Debug.f90 b/src/timedisc/timedisc_TimeStep_DSMC_Debug.f90 deleted file mode 100644 index 0ed714231..000000000 --- a/src/timedisc/timedisc_TimeStep_DSMC_Debug.f90 +++ /dev/null @@ -1,135 +0,0 @@ -!================================================================================================================================== -! Copyright (c) 2010 - 2018 Prof. Claus-Dieter Munz and Prof. Stefanos Fasoulas -! -! This file is part of PICLas (piclas.boltzplatz.eu/piclas/piclas). PICLas is free software: you can redistribute it and/or modify -! it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 -! of the License, or (at your option) any later version. -! -! PICLas is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty -! of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License v3.0 for more details. -! -! You should have received a copy of the GNU General Public License along with PICLas. If not, see . -!================================================================================================================================== -#include "piclas.h" - - -#if (PP_TimeDiscMethod==42) -MODULE MOD_TimeStep -!=================================================================================================================================== -! Module for the Temporal discretization -!=================================================================================================================================== -! MODULES -! IMPLICIT VARIABLE HANDLING -IMPLICIT NONE -PRIVATE -!----------------------------------------------------------------------------------------------------------------------------------- -PUBLIC :: TimeStep_DSMC_Debug -!=================================================================================================================================== -CONTAINS - - -SUBROUTINE TimeStep_DSMC_Debug() -!=================================================================================================================================== -! Hesthaven book, page 64 -! Low-Storage Runge-Kutta integration of degree 4 with 5 stages. -! This procedure takes the current time t, the time step dt and the solution at -! the current time U(t) and returns the solution at the next time level. -!=================================================================================================================================== -! MODULES -USE MOD_PreProc -USE MOD_Globals ,ONLY: abort -USE MOD_TimeDisc_Vars ,ONLY: dt -#ifdef PARTICLES -USE MOD_Particle_Vars ,ONLY: DoSurfaceFlux -USE MOD_Particle_Vars ,ONLY: PartState, LastPartPos, PDM,PEM -USE MOD_DSMC_Vars ,ONLY: DSMC -USE MOD_DSMC ,ONLY: DSMC_main -USE MOD_part_tools ,ONLY: UpdateNextFreePosition -USE MOD_part_emission ,ONLY: ParticleInserting -USE MOD_part_pos_and_velo ,ONLY: SetParticleVelocity -USE MOD_Particle_SurfFlux ,ONLY: ParticleSurfaceflux -USE MOD_Particle_Tracking ,ONLY: PerformTracking -USE MOD_Particle_Tracking_vars ,ONLY: tTracking,MeasureTrackTime -#if USE_MPI -USE MOD_Particle_MPI ,ONLY: IRecvNbOfParticles, MPIParticleSend,MPIParticleRecv,SendNbOfparticles -#endif /*USE_MPI*/ -#endif -! IMPLICIT VARIABLE HANDLING -IMPLICIT NONE -!----------------------------------------------------------------------------------------------------------------------------------- -! INPUT VARIABLES -!----------------------------------------------------------------------------------------------------------------------------------- -! LOCAL VARIABLES -INTEGER :: iPart -REAL :: timeStart, timeEnd, RandVal, dtFrac -!=================================================================================================================================== -IF(DSMC%UseOctree) CALL abort(__STAMP__,'Particles-DSMC-UseOctree = T not allowed for RESERVOIR simulation') - -IF (DSMC%ReservoirSimu) THEN ! fix grid should be defined for reservoir simu - - CALL UpdateNextFreePosition() - - CALL DSMC_main() - - IF(DSMC%CompareLandauTeller) THEN - DO iPart=1,PDM%ParticleVecLength - PDM%nextFreePosition(iPart)=iPart - END DO - CALL SetParticleVelocity(1,1,PDM%ParticleVecLength) - END IF -ELSE - IF (DoSurfaceFlux) THEN - CALL ParticleSurfaceflux() - DO iPart=1,PDM%ParticleVecLength - IF (PDM%ParticleInside(iPart)) THEN - IF (.NOT.PDM%dtFracPush(iPart)) THEN - LastPartPos(1:3,iPart)=PartState(1:3,iPart) - PEM%LastGlobalElemID(iPart)=PEM%GlobalElemID(iPart) - PartState(1:3,iPart) = PartState(1:3,iPart) + PartState(4:6,iPart) * dt - ELSE !dtFracPush (SurfFlux): LastPartPos and LastElem already set! - CALL RANDOM_NUMBER(RandVal) - dtFrac = dt * RandVal - PartState(1:3,iPart) = PartState(1:3,iPart) + PartState(4:6,iPart) * dtFrac - PDM%dtFracPush(iPart) = .FALSE. - END IF - END IF - END DO - ELSE - LastPartPos(1:3,1:PDM%ParticleVecLength)=PartState(1:3,1:PDM%ParticleVecLength) - ! bugfix if more than 2.x mio (2000001) particle per process - ! tested with 64bit Ubuntu 12.04 backports - DO iPart = 1, PDM%ParticleVecLength - PEM%LastGlobalElemID(iPart)=PEM%GlobalElemID(iPart) - END DO - !PEM%LastGlobalElemID(1:PDM%ParticleVecLength)=PEM%GlobalElemID(1:PDM%ParticleVecLength) - PartState(1:3,1:PDM%ParticleVecLength) = PartState(1:3,1:PDM%ParticleVecLength) + PartState(4:6,1:PDM%ParticleVecLength) * dt - END IF -#if USE_MPI - ! open receive buffer for number of particles - CALL IRecvNbOfParticles() -#endif /*USE_MPI*/ - IF(MeasureTrackTime) CALL CPU_TIME(TimeStart) - ! actual tracking - CALL PerformTracking() - IF(MeasureTrackTime) THEN - CALL CPU_TIME(TimeEnd) - tTracking=tTracking+TimeEnd-TimeStart - END IF -#if USE_MPI - ! send number of particles - CALL SendNbOfParticles() - ! finish communication of number of particles and send particles - CALL MPIParticleSend() - ! finish communication - CALL MPIParticleRecv() -#endif /*USE_MPI*/ - CALL ParticleInserting() - CALL UpdateNextFreePosition() - CALL DSMC_main() -END IF - -END SUBROUTINE TimeStep_DSMC_Debug - - -END MODULE MOD_TimeStep -#endif diff --git a/src/timedisc/timedisc_init.f90 b/src/timedisc/timedisc_init.f90 index 971ac1992..239b4bfcb 100644 --- a/src/timedisc/timedisc_init.f90 +++ b/src/timedisc/timedisc_init.f90 @@ -200,8 +200,6 @@ SUBROUTINE InitTimeDisc() SWRITE(UNIT_stdOut,'(A)') ' Method of time integration: Direct Simulation Monte Carlo (DSMC)' #elif (PP_TimeDiscMethod==6) SWRITE(UNIT_stdOut,'(A)') ' Method of time integration: LSERK4-14 ' -#elif (PP_TimeDiscMethod==42) - SWRITE(UNIT_stdOut,'(A)') ' Method of time integration: DSMC Reservoir and Debug' #elif (PP_TimeDiscMethod==120) SWRITE(UNIT_stdOut,'(A)') ' Method of time integration: Heun/Crank-Nicolson1-2-2' #elif (PP_TimeDiscMethod==121) diff --git a/src/timedisc/timedisc_vars.f90 b/src/timedisc/timedisc_vars.f90 index 199967af8..fed719aac 100644 --- a/src/timedisc/timedisc_vars.f90 +++ b/src/timedisc/timedisc_vars.f90 @@ -100,7 +100,7 @@ MODULE MOD_TimeDisc_Vars #endif /*PP_NodeType*/ #endif -#if ((PP_TimeDiscMethod==4) || (PP_TimeDiscMethod==42)) +#if ((PP_TimeDiscMethod==4)) INTEGER,PARAMETER :: nRKStages=1 #endif From 4b22bcfa6941dcb960997f04b03cf59d46ae73e7 Mon Sep 17 00:00:00 2001 From: Tobias Ott Date: Mon, 23 Oct 2023 17:52:20 +0200 Subject: [PATCH 263/495] Added regression test + fixed zero potential value --- .../CHE_poisson_periodic/builds.ini | 16 +++++++ .../CHE_poisson_periodic/poisson/analyze.ini | 6 +++ .../poisson/command_line.ini | 1 + .../poisson/externals.ini | 6 +++ .../CHE_poisson_periodic/poisson/hopr.ini | 39 ++++++++++++++++++ .../poisson/parameter.ini | 34 +++++++++++++++ .../poisson/periodic_test_State_ref.h5 | Bin 0 -> 213520 bytes src/equations/poisson/equation.f90 | 7 +++- src/hdg/hdg.f90 | 16 ++++--- 9 files changed, 119 insertions(+), 6 deletions(-) create mode 100644 regressioncheck/CHE_poisson_periodic/builds.ini create mode 100644 regressioncheck/CHE_poisson_periodic/poisson/analyze.ini create mode 100644 regressioncheck/CHE_poisson_periodic/poisson/command_line.ini create mode 100644 regressioncheck/CHE_poisson_periodic/poisson/externals.ini create mode 100644 regressioncheck/CHE_poisson_periodic/poisson/hopr.ini create mode 100644 regressioncheck/CHE_poisson_periodic/poisson/parameter.ini create mode 100644 regressioncheck/CHE_poisson_periodic/poisson/periodic_test_State_ref.h5 diff --git a/regressioncheck/CHE_poisson_periodic/builds.ini b/regressioncheck/CHE_poisson_periodic/builds.ini new file mode 100644 index 000000000..1e0f330ab --- /dev/null +++ b/regressioncheck/CHE_poisson_periodic/builds.ini @@ -0,0 +1,16 @@ +! relative binary path in build directory +binary=./bin/piclas + +! fixed compiler flags +CMAKE_BUILD_TYPE = DEBUG +LIBS_BUILD_HDF5 = OFF +PICLAS_POLYNOMIAL_DEGREE = N +PICLAS_EQNSYSNAME = poisson +PICLAS_PARTICLES = OFF +PICLAS_TIMEDISCMETHOD = RK3 +PICLAS_PETSC = OFF,ON +LIBS_USE_MPI = ON +PICLAS_NODETYPE = GAUSS +PICLAS_CODE_ANALYZE = ON +PICLAS_DEBUG_MEMORY = ON +PICLAS_MEASURE_MPI_WAIT = ON \ No newline at end of file diff --git a/regressioncheck/CHE_poisson_periodic/poisson/analyze.ini b/regressioncheck/CHE_poisson_periodic/poisson/analyze.ini new file mode 100644 index 000000000..a10791ae3 --- /dev/null +++ b/regressioncheck/CHE_poisson_periodic/poisson/analyze.ini @@ -0,0 +1,6 @@ +h5diff_file = periodic_test_State_001.0.h5 +h5diff_reference_file = periodic_test_State_ref.h5 +h5diff_data_set = DG_Solution +h5diff_tolerance_value = 1.e-8 +h5diff_tolerance_type = absolute +h5diff_max_differences = 4096 \ No newline at end of file diff --git a/regressioncheck/CHE_poisson_periodic/poisson/command_line.ini b/regressioncheck/CHE_poisson_periodic/poisson/command_line.ini new file mode 100644 index 000000000..aa194a247 --- /dev/null +++ b/regressioncheck/CHE_poisson_periodic/poisson/command_line.ini @@ -0,0 +1 @@ +MPI = 1,2,3,6 diff --git a/regressioncheck/CHE_poisson_periodic/poisson/externals.ini b/regressioncheck/CHE_poisson_periodic/poisson/externals.ini new file mode 100644 index 000000000..460aff1c7 --- /dev/null +++ b/regressioncheck/CHE_poisson_periodic/poisson/externals.ini @@ -0,0 +1,6 @@ +MPI = 1 +externalbinary = ./hopr/build/bin/hopr , ./bin/piclas2vtk +externaldirectory = hopr.ini , parameter.ini +externalruntime = pre , post +cmd_suffix = , periodic_test_State_001.0.h5 +nocrosscombination:MPI,externalbinary,externaldirectory,externalruntime,cmd_suffix \ No newline at end of file diff --git a/regressioncheck/CHE_poisson_periodic/poisson/hopr.ini b/regressioncheck/CHE_poisson_periodic/poisson/hopr.ini new file mode 100644 index 000000000..88d0666b6 --- /dev/null +++ b/regressioncheck/CHE_poisson_periodic/poisson/hopr.ini @@ -0,0 +1,39 @@ +DEFVAR=(INT): ni = 4 +DEFVAR=(REAL): li = 6.283185306 + +!=============================================================================== ! +! OUTPUT +!=============================================================================== ! +ProjectName = periodic_box ! name of the project (used for filenames) +Debugvisu = T ! Write debug mesh to tecplot file +Logging = F ! Write log files + +!=============================================================================== ! +! MESH +!=============================================================================== ! +Mode = 1 ! 1 Cartesian 2 gambit file 3 CGNS +nZones = 1 ! number of zones +Corner = (/0.,0.,0.,,li,0.,0.,,li,li,0.,,0.,li,0. ,,0.,0.,li,,li,0.,li,,li,li,li,,0.,li,li/) +nElems = (/ni,ni,ni/) ! number of elements in each direction +BCIndex = (/5,3,2,4,1,6/) ! Indices of UserDefinedBoundaries +elemtype = 108 ! Element form (108: Hexahedra) + +!=============================================================================== ! +! BOUNDARY CONDITIONS +!=============================================================================== ! +BoundaryName = BC_periodicx+ ! Periodic (+vv1) +BoundaryType = (/1,0,0,1/) ! Periodic (+vv1) +BoundaryName = BC_periodicx- ! Periodic (-vv1) +BoundaryType = (/1,0,0,-1/) ! Periodic (-vv1) +BoundaryName = BC_periodicy+ ! Periodic (+vv2) +BoundaryType = (/1,0,0,2/) ! Periodic (+vv2) +BoundaryName = BC_periodicy- ! Periodic (-vv2) +BoundaryType = (/1,0,0,-2/) ! Periodic (-vv2) +BoundaryName = BC_periodicz+ ! Periodic (+vv3) +BoundaryType = (/1,0,0,3/) ! Periodic (+vv3) +BoundaryName = BC_periodicz- ! Periodic (-vv3) +BoundaryType = (/1,0,0,-3/) ! Periodic (-vv3) + +VV=(/li , 0. , 0./) ! Displacement vector 1 (x-direction) +VV=(/0. , li , 0./) ! Displacement vector 2 (y-direction) +VV=(/0. , 0. , li/) ! Displacement vector 3 (z-direction) diff --git a/regressioncheck/CHE_poisson_periodic/poisson/parameter.ini b/regressioncheck/CHE_poisson_periodic/poisson/parameter.ini new file mode 100644 index 000000000..35814efa2 --- /dev/null +++ b/regressioncheck/CHE_poisson_periodic/poisson/parameter.ini @@ -0,0 +1,34 @@ +! =============================================================================== ! +! DISCRETIZATION +! =============================================================================== ! +N = 3 ! Polynomial degree of the DG method (field solver) +! =============================================================================== ! +! MESH +! =============================================================================== ! +MeshFile = periodic_box_mesh.h5 ! Relative path to the mesh .h5 file +! =============================================================================== ! +! General +! =============================================================================== ! +ProjectName = periodic_test ! Project name that is used for naming state files +! =============================================================================== ! +! CALCULATION +! =============================================================================== ! +ManualTimeStep = 1. +tend = 1. +Analyze_dt = 1. +IterDisplayStep = 1 +! =============================================================================== ! +! Field Solver: HDGSEM +! =============================================================================== ! +epsCG = 1e-16 ! Stopping criterion (residual) of iterative CG solver (default that is used for the HDGSEM solver) +maxIterCG = 10000 ! Maximum number of iterations +IniExactFunc = 105 ! Initial field condition. SIN³(x) solution +! =============================================================================== ! +! Analysis +! =============================================================================== ! +TimeStampLength = 5 ! Reduces the length of the timestamps in filenames for better postprocessing +PIC-OutputSource = T ! writes the deposited charge +! =============================================================================== ! +! piclas2vtk +! =============================================================================== ! +NVisu = 10 ! Polynomial degree used for the visualization when the .h5 file is converted to .vtu/.vtk format. \ No newline at end of file diff --git a/regressioncheck/CHE_poisson_periodic/poisson/periodic_test_State_ref.h5 b/regressioncheck/CHE_poisson_periodic/poisson/periodic_test_State_ref.h5 new file mode 100644 index 0000000000000000000000000000000000000000..1a50628617b20253d324d134adc11b5650bd0a0f GIT binary patch literal 213520 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 WtKKB~f4+8jANqf~GtLP8KmQ+ztHS>P literal 0 HcmV?d00001 diff --git a/src/equations/poisson/equation.f90 b/src/equations/poisson/equation.f90 index d8c12a2aa..7ef429c74 100644 --- a/src/equations/poisson/equation.f90 +++ b/src/equations/poisson/equation.f90 @@ -565,6 +565,8 @@ SUBROUTINE ExactFunc(ExactFunction,x,resu,t,ElemID,iRefState,iLinState,BCState) resu(:)=IniAmplitude*(1/r2-1/r1) CASE(104) ! solution to Laplace's equation: Phi_xx + Phi_yy + Phi_zz = 0 resu(1) = ( COS(x(1))+SIN(x(1)) )*( COS(x(2))+SIN(x(2)) )*( COSH(SQRT(2.0)*x(3))+SINH(SQRT(2.0)*x(3)) ) +CASE(105) ! 3D periodic test case + resu(1)= SIN(x(1) + 1) * SIN(x(2) + 2) * SIN(x(3) + 3) CASE(200) ! Dielectric Sphere of Radius R in constant electric field E_0 from book: ! John David Jackson, Classical Electrodynamics, 3rd edition, New York: Wiley, 1999. ! E_0 : constant electric field in z-direction far away from sphere @@ -739,7 +741,7 @@ SUBROUTINE ExactFunc(ExactFunction,x,resu,t,ElemID,iRefState,iLinState,BCState) SWRITE(*,*) "r1=",r1 CALL abort(__STAMP__,'Point source in dielectric region: Cannot evaluate the exact function at the singularity!') END IF - resu(1:PP_nVar) = (2.0*Q/eps12) * 1./r1 + resu(1:PP_nVar) = (2.0*Q/eps12) * 1./r1 END IF END ASSOCIATE CASE(500) ! Coaxial capacitor with Floating Boundary Condition (FPC) with from @@ -938,6 +940,9 @@ PPURE SUBROUTINE CalcSourceHDG(i,j,k,iElem,resu, Phi, warning_linear, warning_li dr2dx2(:)= r2+dr2dx(:)*dx2 resu(1)=- IniAmplitude*( SUM((r1*dr1dx2(:)-2*dr1dx(:)**2)/(r1*r1*r1)) & -SUM((r2*dr2dx2(:)-2*dr2dx(:)**2)/(r2*r2*r2)) ) +CASE(105) ! 3D periodic test case + x(1:3) = Elem_xGP(1:3,i,j,k,iElem) + resu(1)=-3 * SIN(x(1) + 1) * SIN(x(2) + 2) * SIN(x(3) + 3) CASE DEFAULT resu=0. ! CALL abort(__STAMP__,& diff --git a/src/hdg/hdg.f90 b/src/hdg/hdg.f90 index bff1b3a14..52320c963 100644 --- a/src/hdg/hdg.f90 +++ b/src/hdg/hdg.f90 @@ -275,15 +275,15 @@ SUBROUTINE InitHDG() ! Get the global number of Dirichlet boundaries. If there are none, the potential of a single DOF must be set. #if USE_MPI - IF(MPIroot)THEN - CALL MPI_REDUCE(nDirichletBCsides , nDirichletBCsidesGlobal , 1 , MPI_INTEGER , MPI_MAX , 0 , MPI_COMM_WORLD , IERROR) - ELSE - CALL MPI_REDUCE(nDirichletBCsides , 0 , 1 , MPI_INTEGER , MPI_MAX , 0 , MPI_COMM_WORLD , IERROR) - END IF + CALL MPI_ALLREDUCE(nDirichletBCsides , nDirichletBCsidesGlobal , 1 , MPI_INTEGER , MPI_MAX , MPI_COMM_WORLD , IERROR) #else nDirichletBCsidesGlobal = nDirichletBCsides #endif /*USE_MPI*/ +#if USE_PETSC +IF(nDirichletBCsidesGlobal.EQ.0) THEN +#else IF(MPIroot .AND. (nDirichletBCsidesGlobal.EQ.0)) THEN +#endif SetZeroPotentialDOF = .TRUE. ELSE SetZeroPotentialDOF = .FALSE. @@ -2020,6 +2020,12 @@ SUBROUTINE HDGLinear(time,U_out) PetscCallA(VecSetValuesBlocked(RHS_petsc,1,nPETScUniqueSidesGlobal-1-FPC%nUniqueFPCBounds+iUniqueFPCBC,RHS_conductor,INSERT_VALUES,ierr)) END DO !iUniqueFPCBC = 1, FPC%nUniqueFPCBounds END IF ! MPIRoot + + ! Reset the RHS of the first DOF if ZeroPotential must be set + IF(MPIroot .AND. SetZeroPotentialDOF) THEN + PetscCallA(VecSetValue(RHS_petsc,0,0,INSERT_VALUES,ierr)) + END IF + PetscCallA(VecAssemblyBegin(RHS_petsc,ierr)) PetscCallA(VecAssemblyEnd(RHS_petsc,ierr)) From 743684322f9a6d8030f28c3fb3bdb07681b4d91a Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Mon, 23 Oct 2023 18:00:41 +0200 Subject: [PATCH 264/495] Moved SplitAndMerge routine outside of useDSMC=T clause to enable usage of vMPF=T for PIC without DSMC/background gas --- .../features-particle-solver.md | 2 +- .../2D_Landmark/parameter.ini | 5 ++- src/particles/particle_init.f90 | 23 +++------- src/particles/particle_vMPF.f90 | 45 +++++++++++-------- src/timedisc/timedisc_TimeStepByLSERK.f90 | 15 +++---- src/timedisc/timedisc_TimeStepPoisson.f90 | 14 +++--- ...imedisc_TimeStepPoissonByBorisLeapfrog.f90 | 15 +++---- .../timedisc_TimeStepPoissonByHigueraCary.f90 | 15 +++---- .../timedisc_TimeStepPoissonByLSERK.f90 | 14 +++--- src/timedisc/timedisc_TimeStep_DSMC.f90 | 9 +--- 10 files changed, 66 insertions(+), 91 deletions(-) diff --git a/docs/documentation/userguide/features-and-models/features-particle-solver.md b/docs/documentation/userguide/features-and-models/features-particle-solver.md index 3295521e7..16336e34b 100644 --- a/docs/documentation/userguide/features-and-models/features-particle-solver.md +++ b/docs/documentation/userguide/features-and-models/features-particle-solver.md @@ -224,7 +224,7 @@ only at the stagnation point, the time step defined during the initialization is (sec:variable-particle-weighting)= #### Variable Particle Weighting -Variable particle weighting is currently supported with PIC and/or with a background gas (an additional trace species feature is described in Section {ref}`sec:background-gas`). The general functionality can be enabled with the following flag: +Variable particle weighting is currently supported for PIC (with and without background gas) or a background gas (an additional trace species feature is described in Section {ref}`sec:background-gas`). The general functionality can be enabled with the following flag: Part-vMPF = T diff --git a/regressioncheck/NIG_PIC_poisson_Boris-Leapfrog/2D_Landmark/parameter.ini b/regressioncheck/NIG_PIC_poisson_Boris-Leapfrog/2D_Landmark/parameter.ini index 50f855e0e..d8d4e3de6 100644 --- a/regressioncheck/NIG_PIC_poisson_Boris-Leapfrog/2D_Landmark/parameter.ini +++ b/regressioncheck/NIG_PIC_poisson_Boris-Leapfrog/2D_Landmark/parameter.ini @@ -80,7 +80,6 @@ DisplayLostParticles=T Part-Species1-MacroParticleFactor = 1.67e4 ! 1.67e2 originally used for z=1e-4 m (case2: 75 parts per cell with dx=dy=5e-5 m) Part-Species2-MacroParticleFactor = 1.67e4 ! 1.67e2 originally used for z=1e-4 m (case2: 75 parts per cell with dx=dy=5e-5 m) -Part-Species3-MacroParticleFactor = 1.67e4 ! 1.67e2 originally used for z=1e-4 m (case2: 75 parts per cell with dx=dy=5e-5 m) ! =============================================================================== ! ! Particle Boundary Conditions @@ -123,6 +122,10 @@ Particles-RandomSeed2 = 2 Particles-HaloEpsVelo = 300e6 +Part-vMPF= T +Part-Species1-vMPFMergeThreshold = 200 +Part-Species2-vMPFMergeThreshold = 200 + ! =============================================================================== ! ! Species1 | e ! =============================================================================== ! diff --git a/src/particles/particle_init.f90 b/src/particles/particle_init.f90 index 308dd4106..7dc555f23 100644 --- a/src/particles/particle_init.f90 +++ b/src/particles/particle_init.f90 @@ -595,34 +595,21 @@ SUBROUTINE AllocateParticleArrays() PDM%nextFreePosition(1:PDM%maxParticleNumber)=0 ALLOCATE(PEM%GlobalElemID(1:PDM%maxParticleNumber), STAT=ALLOCSTAT) -IF (ALLOCSTAT.NE.0) CALL abort(& -__STAMP__& - ,' Cannot allocate PEM%GlobalElemID(1:PDM%maxParticleNumber) array!') +IF (ALLOCSTAT.NE.0) CALL abort(__STAMP__,' Cannot allocate PEM%GlobalElemID(1:PDM%maxParticleNumber) array!') ALLOCATE(PEM%LastGlobalElemID(1:PDM%maxParticleNumber), STAT=ALLOCSTAT) -IF (ALLOCSTAT.NE.0) CALL abort(& -__STAMP__& - ,' Cannot allocate PEM%LastGlobalElemID(1:PDM%maxParticleNumber) array!') +IF (ALLOCSTAT.NE.0) CALL abort(__STAMP__,' Cannot allocate PEM%LastGlobalElemID(1:PDM%maxParticleNumber) array!') -IF (useDSMC) THEN +IF (useDSMC.OR.usevMPF) THEN ALLOCATE(PEM%pStart(1:nElems) , & PEM%pNumber(1:nElems) , & PEM%pEnd(1:nElems) , & PEM%pNext(1:PDM%maxParticleNumber) , STAT=ALLOCSTAT) - - IF (ALLOCSTAT.NE.0) THEN - CALL abort(& -__STAMP__& - , ' Cannot allocate DSMC PEM arrays!') - END IF + IF (ALLOCSTAT.NE.0) CALL abort(__STAMP__, ' Cannot allocate DSMC PEM arrays!') END IF IF (useDSMC) THEN ALLOCATE(PDM%PartInit(1:PDM%maxParticleNumber), STAT=ALLOCSTAT) - IF (ALLOCSTAT.NE.0) THEN - CALL abort(& -__STAMP__& - ,' Cannot allocate DSMC PEM arrays!') - END IF + IF (ALLOCSTAT.NE.0) CALL abort(__STAMP__,' Cannot allocate PDM%PartInit array!') END IF END SUBROUTINE AllocateParticleArrays diff --git a/src/particles/particle_vMPF.f90 b/src/particles/particle_vMPF.f90 index e948dbf3d..269ff71f6 100644 --- a/src/particles/particle_vMPF.f90 +++ b/src/particles/particle_vMPF.f90 @@ -40,9 +40,12 @@ MODULE MOD_vMPF !=================================================================================================================================== SUBROUTINE SplitAndMerge() ! MODULES -USE MOD_PARTICLE_Vars ,ONLY: vMPFMergeThreshold, vMPFSplitThreshold, PEM, nSpecies, PartSpecies,PDM -USE MOD_Mesh_Vars ,ONLY: nElems -USE MOD_part_tools ,ONLY: UpdateNextFreePosition +USE MOD_PARTICLE_Vars ,ONLY: vMPFMergeThreshold, vMPFSplitThreshold, PEM, nSpecies, PartSpecies,PDM +USE MOD_Mesh_Vars ,ONLY: nElems +USE MOD_part_tools ,ONLY: UpdateNextFreePosition +#if USE_LOADBALANCE +USE MOD_LoadBalance_Timers ,ONLY: LBStartTime, LBElemSplitTime +#endif /*USE_LOADBALANCE*/ ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -52,15 +55,21 @@ SUBROUTINE SplitAndMerge() !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES INTEGER :: iElem, iLoop, iPart, nPartCell, iSpec -INTEGER, ALLOCATABLE :: iPartIndx_Node(:), nPart(:),iPartIndx_Node_Temp(:,:) +INTEGER, ALLOCATABLE :: iPartIndx_Node(:,:), nPart(:) +#if USE_LOADBALANCE +REAL :: tLBStart +#endif /*USE_LOADBALANCE*/ !=================================================================================================================================== +#if USE_LOADBALANCE +CALL LBStartTime(tLBStart) +#endif /*USE_LOADBALANCE*/ ALLOCATE(nPart(nSpecies)) DO iElem = 1, nElems nPart(:) = 0 nPartCell = PEM%pNumber(iElem) - ALLOCATE(iPartIndx_Node_Temp(nSpecies,nPartCell)) + ALLOCATE(iPartIndx_Node(nSpecies,nPartCell)) DO iSpec = 1, nSpecies - iPartIndx_Node_Temp(iSpec,1:nPartCell) = 0 + iPartIndx_Node(iSpec,1:nPartCell) = 0 END DO iPart = PEM%pStart(iElem) @@ -72,29 +81,29 @@ SUBROUTINE SplitAndMerge() END IF iSpec = PartSpecies(iPart) nPart(iSpec) = nPart(iSpec) + 1 - iPartIndx_Node_Temp(iSpec,nPart(iSpec)) = iPart + iPartIndx_Node(iSpec,nPart(iSpec)) = iPart iPart = PEM%pNext(iPart) END DO DO iSpec = 1, nSpecies - IF((vMPFMergeThreshold(iSpec).EQ.0).AND.(vMPFSplitThreshold(iSpec).EQ.0)) CYCLE ! Skip default values - IF(nPart(iSpec).EQ.0) CYCLE ! Skip when no particles are present + ! Skip default values + IF((vMPFMergeThreshold(iSpec).EQ.0).AND.(vMPFSplitThreshold(iSpec).EQ.0)) CYCLE + ! Skip when no particles are present + IF(nPart(iSpec).EQ.0) CYCLE - ! 2.) build partindx list for species - ALLOCATE(iPartIndx_Node(nPart(iSpec))) - iPartIndx_Node(1:nPart(iSpec)) = iPartIndx_Node_Temp(iSpec,1:nPart(iSpec)) - - ! 3.) Call split or merge routine + ! 2.) Call split or merge routine IF(nPart(iSpec).GT.vMPFMergeThreshold(iSpec).AND.(vMPFMergeThreshold(iSpec).NE.0)) THEN ! Merge - CALL MergeParticles(iPartIndx_Node, nPart(iSpec), vMPFMergeThreshold(iSpec),iElem) + CALL MergeParticles(iPartIndx_Node(iSpec,1:nPart(iSpec)), nPart(iSpec), vMPFMergeThreshold(iSpec),iElem) ELSE IF(nPart(iSpec).LT.vMPFSplitThreshold(iSpec)) THEN ! Split - CALL SplitParticles(iPartIndx_Node, nPart(iSpec), vMPFSplitThreshold(iSpec)) + CALL SplitParticles(iPartIndx_Node(iSpec,1:nPart(iSpec)), nPart(iSpec), vMPFSplitThreshold(iSpec)) END IF - DEALLOCATE(iPartIndx_Node) END DO - DEALLOCATE(iPartIndx_Node_Temp) + DEALLOCATE(iPartIndx_Node) +#if USE_LOADBALANCE + CALL LBElemSplitTime(iElem,tLBStart) +#endif /*USE_LOADBALANCE*/ END DO CALL UpdateNextFreePosition() DEALLOCATE(nPart) diff --git a/src/timedisc/timedisc_TimeStepByLSERK.f90 b/src/timedisc/timedisc_TimeStepByLSERK.f90 index 8dce149be..4489540a6 100644 --- a/src/timedisc/timedisc_TimeStepByLSERK.f90 +++ b/src/timedisc/timedisc_TimeStepByLSERK.f90 @@ -290,18 +290,15 @@ SUBROUTINE TimeStepByLSERK() IF ((time.GE.DelayTime).OR.(time.EQ.0)) CALL UpdateNextFreePosition() -IF (useDSMC) THEN - IF (time.GE.DelayTime) THEN +IF (time.GE.DelayTime) THEN + ! Direct Simulation Monte Carlo + IF (useDSMC) THEN CALL DSMC_main() -#if USE_LOADBALANCE - CALL LBStartTime(tLBStart) -#endif /*USE_LOADBALANCE*/ - IF(UseSplitAndMerge) CALL SplitAndMerge() -#if USE_LOADBALANCE - CALL LBPauseTime(LB_DSMC,tLBStart) -#endif /*USE_LOADBALANCE*/ END IF + ! Split & Merge: Variable particle weighting + IF(UseSplitAndMerge) CALL SplitAndMerge() END IF + #ifdef EXTRAE CALL extrae_eventandcounters(int(9000001), int8(0)) #endif /*EXTRAE*/ diff --git a/src/timedisc/timedisc_TimeStepPoisson.f90 b/src/timedisc/timedisc_TimeStepPoisson.f90 index 0554e30c7..525fc96e9 100644 --- a/src/timedisc/timedisc_TimeStepPoisson.f90 +++ b/src/timedisc/timedisc_TimeStepPoisson.f90 @@ -251,17 +251,13 @@ SUBROUTINE TimeStepPoisson() IF ((time.GE.DelayTime).OR.(iter.EQ.0)) CALL UpdateNextFreePosition() -IF (useDSMC) THEN - IF (time.GE.DelayTime) THEN +IF (time.GE.DelayTime) THEN + ! Direct Simulation Monte Carlo + IF (useDSMC) THEN CALL DSMC_main() -#if USE_LOADBALANCE - CALL LBStartTime(tLBStart) -#endif /*USE_LOADBALANCE*/ - IF(UseSplitAndMerge) CALL SplitAndMerge() -#if USE_LOADBALANCE - CALL LBPauseTime(LB_DSMC,tLBStart) -#endif /*USE_LOADBALANCE*/ END IF + ! Split & Merge: Variable particle weighting + IF(UseSplitAndMerge) CALL SplitAndMerge() END IF #endif /*PARTICLES*/ diff --git a/src/timedisc/timedisc_TimeStepPoissonByBorisLeapfrog.f90 b/src/timedisc/timedisc_TimeStepPoissonByBorisLeapfrog.f90 index 9ffd5b3b4..3202d8148 100644 --- a/src/timedisc/timedisc_TimeStepPoissonByBorisLeapfrog.f90 +++ b/src/timedisc/timedisc_TimeStepPoissonByBorisLeapfrog.f90 @@ -263,18 +263,15 @@ SUBROUTINE TimeStepPoissonByBorisLeapfrog() IF ((time.GE.DelayTime).OR.(iter.EQ.0)) CALL UpdateNextFreePosition() -IF (useDSMC) THEN - IF (time.GE.DelayTime) THEN +IF (time.GE.DelayTime) THEN + ! Direct Simulation Monte Carlo + IF (useDSMC) THEN CALL DSMC_main() -#if USE_LOADBALANCE - CALL LBStartTime(tLBStart) -#endif /*USE_LOADBALANCE*/ - IF(UseSplitAndMerge) CALL SplitAndMerge() -#if USE_LOADBALANCE - CALL LBPauseTime(LB_DSMC,tLBStart) -#endif /*USE_LOADBALANCE*/ END IF + ! Split & Merge: Variable particle weighting + IF(UseSplitAndMerge) CALL SplitAndMerge() END IF + #ifdef EXTRAE CALL extrae_eventandcounters(int(9000001), int8(0)) #endif /*EXTRAE*/ diff --git a/src/timedisc/timedisc_TimeStepPoissonByHigueraCary.f90 b/src/timedisc/timedisc_TimeStepPoissonByHigueraCary.f90 index 9c599e4ff..24c742a6a 100644 --- a/src/timedisc/timedisc_TimeStepPoissonByHigueraCary.f90 +++ b/src/timedisc/timedisc_TimeStepPoissonByHigueraCary.f90 @@ -251,18 +251,15 @@ SUBROUTINE TimeStepPoissonByHigueraCary() IF ((time.GE.DelayTime).OR.(iter.EQ.0)) CALL UpdateNextFreePosition() -IF (useDSMC) THEN - IF (time.GE.DelayTime) THEN +IF (time.GE.DelayTime) THEN + ! Direct Simulation Monte Carlo + IF (useDSMC) THEN CALL DSMC_main() -#if USE_LOADBALANCE - CALL LBStartTime(tLBStart) -#endif /*USE_LOADBALANCE*/ - IF(UseSplitAndMerge) CALL SplitAndMerge() -#if USE_LOADBALANCE - CALL LBPauseTime(LB_DSMC,tLBStart) -#endif /*USE_LOADBALANCE*/ END IF + ! Split & Merge: Variable particle weighting + IF(UseSplitAndMerge) CALL SplitAndMerge() END IF + #ifdef EXTRAE CALL extrae_eventandcounters(int(9000001), int8(0)) #endif /*EXTRAE*/ diff --git a/src/timedisc/timedisc_TimeStepPoissonByLSERK.f90 b/src/timedisc/timedisc_TimeStepPoissonByLSERK.f90 index 0376e53a0..eaf2c8af7 100644 --- a/src/timedisc/timedisc_TimeStepPoissonByLSERK.f90 +++ b/src/timedisc/timedisc_TimeStepPoissonByLSERK.f90 @@ -369,17 +369,13 @@ SUBROUTINE TimeStepPoissonByLSERK() #ifdef PARTICLES IF ((time.GE.DelayTime).OR.(iter.EQ.0)) CALL UpdateNextFreePosition() -IF (useDSMC) THEN - IF (time.GE.DelayTime) THEN +IF (time.GE.DelayTime) THEN + ! Direct Simulation Monte Carlo + IF (useDSMC) THEN CALL DSMC_main() -#if USE_LOADBALANCE - CALL LBStartTime(tLBStart) -#endif /*USE_LOADBALANCE*/ - IF(UseSplitAndMerge) CALL SplitAndMerge() -#if USE_LOADBALANCE - CALL LBPauseTime(LB_DSMC,tLBStart) -#endif /*USE_LOADBALANCE*/ END IF + ! Split & Merge: Variable particle weighting + IF(UseSplitAndMerge) CALL SplitAndMerge() END IF #endif /*PARTICLES*/ diff --git a/src/timedisc/timedisc_TimeStep_DSMC.f90 b/src/timedisc/timedisc_TimeStep_DSMC.f90 index 13d5041af..ee3a82120 100644 --- a/src/timedisc/timedisc_TimeStep_DSMC.f90 +++ b/src/timedisc/timedisc_TimeStep_DSMC.f90 @@ -237,16 +237,9 @@ SUBROUTINE TimeStep_DSMC() CALL DSMC_main() -#if USE_LOADBALANCE -CALL LBStartTime(tLBStart) -#endif /*USE_LOADBALANCE*/ - +! Split & Merge: Variable particle weighting IF(UseSplitAndMerge) CALL SplitAndMerge() -#if USE_LOADBALANCE -CALL LBPauseTime(LB_DSMC,tLBStart) -#endif /*USE_LOADBALANCE*/ - END SUBROUTINE TimeStep_DSMC From 0e2b19806c8c0bdbc090054a8eb61bdeaaeaee3d Mon Sep 17 00:00:00 2001 From: Felix Garmirian Date: Mon, 23 Oct 2023 18:08:27 +0200 Subject: [PATCH 265/495] naive fix test small=slave --- src/interfaces/interfaces.f90 | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/src/interfaces/interfaces.f90 b/src/interfaces/interfaces.f90 index c09ca59c2..55e7ed37c 100644 --- a/src/interfaces/interfaces.f90 +++ b/src/interfaces/interfaces.f90 @@ -128,15 +128,36 @@ SUBROUTINE InitInterfaces ! b) - dielectric <-> dielectric : RIEMANN_DIELECTRIC = 2 ! a1) - dielectric -> vacuum : RIEMANN_DIELECTRIC2VAC = 3 or 5 (when using non-conservative fluxes) ! a2) - vacuum -> dielectric : RIEMANN_VAC2DIELECTRIC = 4 or 6 (when using non-conservative fluxes) + ! am1) - vacuum -> dielectric mortar : RIEMANN_VAC2DIELECTRIC = 4 or 6 (when using non-conservative fluxes) + ! am2) - dielectric -> vacuum mortar : RIEMANN_DIELECTRIC2VAC = 3 or 5 (when using non-conservative fluxes) IF(DoDielectric) THEN IF (isDielectricFace(SideID))THEN ! 1.) RiemannDielectric IF(isDielectricInterFace(SideID))THEN ! a) physical <-> dielectric region: for Riemann solver, select A+ and A- as functions of f(Eps0,Mu0) or f(EpsR,MuR) ElemID = SideToElem(S2E_ELEM_ID,SideID) ! get master element ID for checking if it is in a physical or dielectric region - IF(MortarType(1,SideID).GE.0) CALL abort(__STAMP__,'Mortars not fully implemented for dielectric <-> vacuum interfaces') + !IF(MortarType(1,SideID).GE.0) CALL abort(__STAMP__,'Mortars not fully implemented for dielectric <-> vacuum interfaces') IF(ElemID.EQ.-1) THEN - InterfaceRiemann(SideID)=-1 - CYCLE ! skip + IF(MortarType(1,SideID).EQ.0) THEN + ! small mortar slave sides have no corresponding master element + IF(isDielectricElem(SideToElem(S2E_NB_ELEM_ID,SideID)))THEN + ! am1) big elem is PHYSICAL and small slave DIELECTRIC + IF(DielectricFluxNonConserving)THEN + InterfaceRiemann(SideID)=RIEMANN_VAC2DIELECTRIC_NC ! use two different Riemann solvers + ELSE + InterfaceRiemann(SideID)=RIEMANN_VAC2DIELECTRIC ! A+(EpsR,MuR) and A-(Eps0,Mu0) + END IF + ELSE + ! am2) big elem is DIELECTRIC and small slave PHYSICAL + IF(DielectricFluxNonConserving)THEN ! use one flux (conserving) or two fluxes (non-conserving) at the interface + InterfaceRiemann(SideID)=RIEMANN_DIELECTRIC2VAC_NC ! use two different Riemann solvers + ELSE + InterfaceRiemann(SideID)=RIEMANN_DIELECTRIC2VAC ! A+(Eps0,Mu0) and A-(EpsR,MuR) + END IF + END IF + ELSE + InterfaceRiemann(SideID)=-1 + CYCLE ! skip + END IF END IF IF(isDielectricElem(ElemID))THEN ! a1) master is DIELECTRIC and slave PHYSICAL From 8ad79a9598208ac2f0ee3ab30f944df14a8448cb Mon Sep 17 00:00:00 2001 From: Franziska Hild Date: Mon, 23 Oct 2023 18:12:28 +0200 Subject: [PATCH 266/495] Abort for DSMC octree and spaceic point combination --- src/particles/dsmc/dsmc_init.f90 | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/particles/dsmc/dsmc_init.f90 b/src/particles/dsmc/dsmc_init.f90 index f2d7ff97d..b2ce2ed68 100644 --- a/src/particles/dsmc/dsmc_init.f90 +++ b/src/particles/dsmc/dsmc_init.f90 @@ -897,6 +897,13 @@ SUBROUTINE InitDSMC() DSMC%UseOctree = GETLOGICAL('Particles-DSMC-UseOctree') DSMC%UseNearestNeighbour = GETLOGICAL('Particles-DSMC-UseNearestNeighbour') IF(DSMC%UseOctree) THEN + DO iSpec = 1, nSpecies + DO iInit = 1, Species(iSpec)%NumberOfInits + IF (TRIM(Species(iSpec)%Init(iInit)%SpaceIC).EQ.'point') THEN + CALL abort(__STAMP__,'ERROR: No combination of octree and SpaceIC=point possible!') + END IF + END DO + END DO IF(NGeo.GT.PP_N) CALL abort(__STAMP__,' Set PP_N to NGeo, else, the volume is not computed correctly.') CALL DSMC_init_octree() END IF From 48e129477f637f352dbe1f4673c83809376670ab Mon Sep 17 00:00:00 2001 From: Felix Garmirian Date: Tue, 24 Oct 2023 11:17:42 +0200 Subject: [PATCH 267/495] reactivate reggie --- .../excludeBuild.ini | 5 ----- 1 file changed, 5 deletions(-) diff --git a/regressioncheck/NIG_convtest_poisson/Dielectric_sphere_in_sphere_curved_mortar/excludeBuild.ini b/regressioncheck/NIG_convtest_poisson/Dielectric_sphere_in_sphere_curved_mortar/excludeBuild.ini index 67ed5c0ba..2169008ef 100644 --- a/regressioncheck/NIG_convtest_poisson/Dielectric_sphere_in_sphere_curved_mortar/excludeBuild.ini +++ b/regressioncheck/NIG_convtest_poisson/Dielectric_sphere_in_sphere_curved_mortar/excludeBuild.ini @@ -1,7 +1,2 @@ -! Deactivate reggie for now -! Fix by implementing dielectric <-> vacuum mortar interfaces correctly -! Delete the following line afterwards -PICLAS_EQNSYSNAME = poisson - ! run only with particles PICLAS_PARTICLES=OFF From 04f7768a5fb00a61eb12c8434b97a04f39d0a0a8 Mon Sep 17 00:00:00 2001 From: Felix Garmirian Date: Tue, 24 Oct 2023 16:30:43 +0200 Subject: [PATCH 268/495] really reativate dielectric mortar reggie --- regressioncheck/NIG_convtest_poisson/builds.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regressioncheck/NIG_convtest_poisson/builds.ini b/regressioncheck/NIG_convtest_poisson/builds.ini index ebf13abd5..a0e9e2cc1 100644 --- a/regressioncheck/NIG_convtest_poisson/builds.ini +++ b/regressioncheck/NIG_convtest_poisson/builds.ini @@ -9,4 +9,4 @@ PICLAS_EQNSYSNAME = poisson PICLAS_TIMEDISCMETHOD = RK3 LIBS_USE_MPI = ON PICLAS_NODETYPE = GAUSS -PICLAS_PARTICLES = OFF ! activate also PICLAS_PARTICLES=ON as soon as the mortar dielectric reggie is fixed +PICLAS_PARTICLES = ON,OFF From a651c62051db8eaf65e5a1e09da37b783010fc80 Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Tue, 24 Oct 2023 22:09:32 +0200 Subject: [PATCH 269/495] NIG_PIC_poisson_Boris-Leapfrog/2D_Landmark: Added vMPF=T additionally to the regular calculation --- .../NIG_PIC_poisson_Boris-Leapfrog/2D_Landmark/parameter.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regressioncheck/NIG_PIC_poisson_Boris-Leapfrog/2D_Landmark/parameter.ini b/regressioncheck/NIG_PIC_poisson_Boris-Leapfrog/2D_Landmark/parameter.ini index d8d4e3de6..ee08df388 100644 --- a/regressioncheck/NIG_PIC_poisson_Boris-Leapfrog/2D_Landmark/parameter.ini +++ b/regressioncheck/NIG_PIC_poisson_Boris-Leapfrog/2D_Landmark/parameter.ini @@ -122,7 +122,7 @@ Particles-RandomSeed2 = 2 Particles-HaloEpsVelo = 300e6 -Part-vMPF= T +Part-vMPF= F,T Part-Species1-vMPFMergeThreshold = 200 Part-Species2-vMPFMergeThreshold = 200 From 2c7ae490eb188e9fc3fdb1102a87d3e75090c2cd Mon Sep 17 00:00:00 2001 From: Felix Garmirian Date: Wed, 25 Oct 2023 12:10:47 +0200 Subject: [PATCH 270/495] fix particle bc for reggie with dummy particle --- .../NIG_convtest_poisson/Laplace_h_N1_mortar/parameter.ini | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/regressioncheck/NIG_convtest_poisson/Laplace_h_N1_mortar/parameter.ini b/regressioncheck/NIG_convtest_poisson/Laplace_h_N1_mortar/parameter.ini index b2949c3e5..66eea7c03 100644 --- a/regressioncheck/NIG_convtest_poisson/Laplace_h_N1_mortar/parameter.ini +++ b/regressioncheck/NIG_convtest_poisson/Laplace_h_N1_mortar/parameter.ini @@ -106,7 +106,7 @@ PIC-Deposition-Type = shape_function PIC-shapefunction-radius = 0.3 PIC-Depo-Periodic = FALSE -Part-nBounds = 6 +Part-nBounds = 7 Part-Boundary1-SourceName = BC_z- Part-Boundary1-Condition = open Part-Boundary2-SourceName = BC_y- @@ -118,6 +118,8 @@ Part-Boundary4-Condition = open Part-Boundary5-SourceName = BC_x- Part-Boundary5-Condition = open Part-Boundary6-SourceName = BC_z+ +Part-Boundary6-Condition = open +Part-Boundary7-SourceName = inner ! =============================================================================== ! ! DSMC From c5118e543aea5195c2bd0546dc18e8789540a318 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Thu, 26 Oct 2023 10:03:48 +0200 Subject: [PATCH 271/495] Removed warnings --- src/particles/particle_init.f90 | 6 +- .../radiation_solver/radiation_init.f90 | 217 ++- .../radiation_solver/radiation_main.f90 | 9 +- .../radiative_transfer/radtrans_init.f90 | 128 +- .../radiative_transfer/radtrans_main.f90 | 133 +- .../radiative_transfer/radtrans_output.f90 | 639 +++++---- .../tracking/radtrans_tools.f90.bak | 1176 +++++++++++++++++ .../tracking/radtrans_tracking_output.f90 | 4 +- 8 files changed, 1739 insertions(+), 573 deletions(-) create mode 100644 src/radiation/radiative_transfer/tracking/radtrans_tools.f90.bak diff --git a/src/particles/particle_init.f90 b/src/particles/particle_init.f90 index c59e4f6d2..5be59e54f 100644 --- a/src/particles/particle_init.f90 +++ b/src/particles/particle_init.f90 @@ -130,7 +130,7 @@ SUBROUTINE DefineParametersParticles() 'i.e. how deep the merge extends into the mesh starting from \n'//& 'each cell. 0 is the least aggressive merge, 2 the most \n'//& 'aggressive merge.','0') -CALL prms%CreateIntOption( 'Part-MaxNumbCellsMerge' ,'Maximum number of cells to be merged.','4') +CALL prms%CreateIntOption( 'Part-MaxNumbCellsMerge' ,'Maximum number of cells to be merged.','4') CALL prms%SetSection("IMD") ! IMD things @@ -307,7 +307,9 @@ SUBROUTINE InitParticles() USE MOD_SurfaceModel_Porous ,ONLY: InitPorousBoundaryCondition USE MOD_Particle_Boundary_Sampling ,ONLY: InitParticleBoundarySampling USE MOD_SurfaceModel_Vars ,ONLY: nPorousBC,BulkElectronTempSEE +#if ! (PP_TimeDiscMethod==600) USE MOD_Particle_Boundary_Vars ,ONLY: PartBound +#endif /*! (PP_TimeDiscMethod==600)*/ USE MOD_Particle_Tracking_Vars ,ONLY: TrackingMethod USE MOD_Particle_Vars ,ONLY: ParticlesInitIsDone,WriteMacroVolumeValues,WriteMacroSurfaceValues,nSpecies USE MOD_Particle_Sampling_Vars ,ONLY: UseAdaptive @@ -741,7 +743,7 @@ SUBROUTINE InitializeVariablesVirtualCellMerge() DoVirtualCellMerge = GETLOGICAL('Part-DoVirtualCellMerge') IF(DoVirtualCellMerge)THEN #if USE_MPI -DoParticleLatencyHiding = .FALSE. +DoParticleLatencyHiding = .FALSE. #endif VirtualCellMergeSpread = GETINT('Part-CellMergeSpread') MaxNumOfMergedCells = GETINT('Part-MaxNumbCellsMerge') diff --git a/src/radiation/radiation_solver/radiation_init.f90 b/src/radiation/radiation_solver/radiation_init.f90 index 83720b997..ad6c933d5 100644 --- a/src/radiation/radiation_solver/radiation_init.f90 +++ b/src/radiation/radiation_solver/radiation_init.f90 @@ -101,10 +101,10 @@ SUBROUTINE InitRadiation() ! MODULES USE MOD_Globals USE MOD_Globals_Vars, ONLY : PlanckConst, c -USE MOD_Mesh_Vars, ONLY : nElems, nGlobalElems +USE MOD_Mesh_Vars, ONLY : nGlobalElems USE MOD_Particle_Mesh_Vars, ONLY : nComputeNodeElems USE MOD_ReadInTools -USE MOD_PARTICLE_Vars, ONLY : nSpecies, Species +USE MOD_PARTICLE_Vars, ONLY : nSpecies USE MOD_Radiation_Vars USE MOD_DSMC_Vars, ONLY : SpecDSMC USE MOD_Radiation_ReadIn, ONLY : Radiation_readin_atoms, Radiation_readin_molecules @@ -229,7 +229,7 @@ SUBROUTINE InitRadiation() TElectrons = GETREAL('Radiation-TElectrons') #if USE_MPI - ! allocate shared array for Radiation_Emission/Absorption_Spec + ! allocate shared array for Radiation_Emission/Absorption_Spec CALL Allocate_Shared((/RadiationParameter%WaveLenDiscrCoarse,nComputeNodeElems/), Radiation_Emission_Spec_Shared_Win,Radiation_Emission_Spec_Shared) CALL MPI_WIN_LOCK_ALL(0,Radiation_Emission_Spec_Shared_Win,IERROR) CALL Allocate_Shared((/INT(RadiationParameter%WaveLenDiscrCoarse,IK)*INT(nGlobalElems,IK)/),Radiation_Absorption_Spec_Shared_Win,Radiation_Absorption_Spec_Shared) @@ -293,7 +293,7 @@ SUBROUTINE InitRadiation() , MPI_COMM_LEADERS_SHARED & , IERROR) END IF - END IF + END IF CALL BARRIER_AND_SYNC(Radiation_Absorption_Spec_Shared_Win ,MPI_COMM_SHARED) CALL BARRIER_AND_SYNC(Radiation_Absorption_SpecPercent_Shared_Win ,MPI_COMM_SHARED) #endif @@ -306,136 +306,135 @@ END SUBROUTINE InitRadiation SUBROUTINE MacroscopicRadiationInput() - !=================================================================================================================================== - !> - !=================================================================================================================================== - ! MODULES - USE MOD_Globals - USE MOD_PreProc - USE MOD_io_hdf5 - USE MOD_HDF5_Input ,ONLY: OpenDataFile,CloseDataFile,DatasetExists,ReadArray,GetDataProps - USE MOD_Mesh_Vars ,ONLY: offsetElem, nElems - USE MOD_Particle_Vars ,ONLY: nSpecies - USE MOD_DSMC_Vars ,ONLY: SpecDSMC - USE MOD_Radiation_Vars ,ONLY: RadiationSwitches, MacroRadInputParameters, MacroRadInputParameters_Shared, & - MacroRadInputParameters_Shared_Win - USE MOD_Mesh_Tools ,ONLY: GetCNElemID - USE MOD_ReadInTools - USE MOD_Particle_Mesh_Vars ,ONLY: nComputeNodeElems +!=================================================================================================================================== +!> +!=================================================================================================================================== +! MODULES +USE MOD_Globals +USE MOD_PreProc +USE MOD_io_hdf5 +USE MOD_HDF5_Input ,ONLY: OpenDataFile,CloseDataFile,DatasetExists,ReadArray,GetDataProps +USE MOD_Mesh_Vars ,ONLY: offsetElem, nElems +USE MOD_Particle_Vars ,ONLY: nSpecies +USE MOD_DSMC_Vars ,ONLY: SpecDSMC +USE MOD_Radiation_Vars ,ONLY: RadiationSwitches, MacroRadInputParameters, MacroRadInputParameters_Shared, & + MacroRadInputParameters_Shared_Win +USE MOD_Mesh_Tools ,ONLY: GetCNElemID +USE MOD_ReadInTools +USE MOD_Particle_Mesh_Vars ,ONLY: nComputeNodeElems #if USE_MPI !USE MOD_MPI_Shared_Vars - USE MOD_MPI_Shared - USE MOD_MPI_Shared_Vars +USE MOD_MPI_Shared +USE MOD_MPI_Shared_Vars #endif - USE MOD_Particle_Mesh_Vars ,ONLY: ElemMidPoint_Shared - ! IMPLICIT VARIABLE HANDLING - IMPLICIT NONE - !----------------------------------------------------------------------------------------------------------------------------------- - ! INPUT VARIABLES - !----------------------------------------------------------------------------------------------------------------------------------- - ! OUTPUT VARIABLES - !----------------------------------------------------------------------------------------------------------------------------------- - ! LOCAL VARIABLES - INTEGER :: nVar_HDF5, N_HDF5, nElems_HDF5, iVar, iSpec, iElem, CNElemID, IndexElectronTemp, iSpecElectrons - REAL, ALLOCATABLE :: ElemData_HDF5(:,:) - CHARACTER(LEN=300) :: MacroRadiationInputFile - INTEGER, ALLOCATABLE :: SortElemInd(:) - REAL, ALLOCATABLE :: SortElemYPos(:) - !=================================================================================================================================== - - MacroRadiationInputFile = GETSTR('Radiation-MacroInput-Filename') - CALL OpenDataFile(MacroRadiationInputFile,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_WORLD) - - CALL GetDataProps('ElemData',nVar_HDF5,N_HDF5,nElems_HDF5) +USE MOD_Particle_Mesh_Vars ,ONLY: ElemMidPoint_Shared +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +INTEGER :: nVar_HDF5, N_HDF5, nElems_HDF5, iVar, iSpec, iElem, CNElemID, IndexElectronTemp, iSpecElectrons +REAL, ALLOCATABLE :: ElemData_HDF5(:,:) +CHARACTER(LEN=300) :: MacroRadiationInputFile +INTEGER, ALLOCATABLE :: SortElemInd(:) +REAL, ALLOCATABLE :: SortElemYPos(:) +!=================================================================================================================================== + +MacroRadiationInputFile = GETSTR('Radiation-MacroInput-Filename') +CALL OpenDataFile(MacroRadiationInputFile,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_WORLD) + +CALL GetDataProps('ElemData',nVar_HDF5,N_HDF5,nElems_HDF5) #if USE_MPI - ! allocate shared array for Radiation_Emission/Absorption_Spec - CALL Allocate_Shared((/nComputeNodeElems,nSpecies,5/), MacroRadInputParameters_Shared_Win,MacroRadInputParameters_Shared) - CALL MPI_WIN_LOCK_ALL(0,MacroRadInputParameters_Shared_Win,IERROR) +! allocate shared array for Radiation_Emission/Absorption_Spec +CALL Allocate_Shared((/nComputeNodeElems,nSpecies,5/), MacroRadInputParameters_Shared_Win,MacroRadInputParameters_Shared) +CALL MPI_WIN_LOCK_ALL(0,MacroRadInputParameters_Shared_Win,IERROR) - MacroRadInputParameters => MacroRadInputParameters_Shared +MacroRadInputParameters => MacroRadInputParameters_Shared #else ! allocate local array for ElemInfo - ALLOCATE(MacroRadInputParameters(1:nElems,1:nSpecies,1:5)) +ALLOCATE(MacroRadInputParameters(1:nElems,1:nSpecies,1:5)) #endif /*USE_MPI*/ - - ALLOCATE(ElemData_HDF5(1:nVar_HDF5,1:nElems)) - ! Associate construct for integer KIND=8 possibility - ASSOCIATE (& - nVar_HDF5 => INT(nVar_HDF5,IK) ,& - offsetElem => INT(offsetElem,IK),& - nElems => INT(nElems,IK) ) - CALL ReadArray('ElemData',2,(/nVar_HDF5,nElems/),offsetElem,2,RealArray=ElemData_HDF5(:,:)) - END ASSOCIATE +ALLOCATE(ElemData_HDF5(1:nVar_HDF5,1:nElems)) +! Associate construct for integer KIND=8 possibility +ASSOCIATE (& + nVar_HDF5 => INT(nVar_HDF5,IK) ,& + offsetElem => INT(offsetElem,IK),& + nElems => INT(nElems,IK) ) + CALL ReadArray('ElemData',2,(/nVar_HDF5,nElems/),offsetElem,2,RealArray=ElemData_HDF5(:,:)) +END ASSOCIATE - IF(RadiationSwitches%SortCellsY) THEN !Sort cells if manually created input is used - ALLOCATE(SortElemInd(nElems), SortElemYPos(nElems)) +IF(RadiationSwitches%SortCellsY) THEN !Sort cells if manually created input is used + ALLOCATE(SortElemInd(nElems), SortElemYPos(nElems)) + DO iElem = 1, nElems + SortElemInd(iElem) = iElem + END DO + SortElemYPos(:) = -ElemMidPoint_Shared(2,:) + CALL BubbleSortID(SortElemYPos, SortElemInd, nElems) + + iVar = 1 + DO iSpec = 1, nSpecies DO iElem = 1, nElems - SortElemInd(iElem) = iElem + CNElemID = GetCNElemID(iElem+offsetElem) + MacroRadInputParameters(SortElemInd(CNElemID),iSpec,1) = MAX(0.,ElemData_HDF5(iVar+ 6,iElem)) !density + MacroRadInputParameters(SortElemInd(CNElemID),iSpec,2) = MAX(0.,ElemData_HDF5(iVar+ 7,iElem)) !T_vib + MacroRadInputParameters(SortElemInd(CNElemID),iSpec,3) = MAX(0.,ElemData_HDF5(iVar+ 8,iElem)) !T_rot + MacroRadInputParameters(SortElemInd(CNElemID),iSpec,4) = MAX(0.,ElemData_HDF5(iVar+ 9,iElem)) !T_elec + MacroRadInputParameters(SortElemInd(CNElemID),iSpec,5) = MAX(0.,ElemData_HDF5(iVar+11,iElem)) !T_mean END DO - SortElemYPos(:) = -ElemMidPoint_Shared(2,:) - CALL BubbleSortID(SortElemYPos, SortElemInd, nElems) + iVar = iVar + DSMC_NVARS + END DO +ELSE + iVar = 1 + DO iSpec = 1, nSpecies + DO iElem = 1, nElems + CNElemID = GetCNElemID(iElem+offsetElem) + MacroRadInputParameters(CNElemID,iSpec,1) = MAX(0.,ElemData_HDF5(iVar+ 6,iElem)) !density + MacroRadInputParameters(CNElemID,iSpec,2) = MAX(0.,ElemData_HDF5(iVar+ 7,iElem)) !T_vib + MacroRadInputParameters(CNElemID,iSpec,3) = MAX(0.,ElemData_HDF5(iVar+ 8,iElem)) !T_rot + MacroRadInputParameters(CNElemID,iSpec,4) = MAX(0.,ElemData_HDF5(iVar+ 9,iElem)) !T_elec + !IF((iSpec.EQ.12) .OR. (iSpec.EQ.13)) MacroRadInputParameters(CNElemID,iSpec,4)=MacroRadInputParameters(CNElemID,iSpec,4)*1.1 !Fe Fe+ +-10percent + MacroRadInputParameters(CNElemID,iSpec,5) = MAX(0.,ElemData_HDF5(iVar+11,iElem)) !T_mean + END DO + iVar = iVar + DSMC_NVARS + END DO - iVar = 1 + IF(.NOT.RadiationSwitches%UseElectronicExcitation) THEN + iSpecElectrons = 0 DO iSpec = 1, nSpecies - DO iElem = 1, nElems - CNElemID = GetCNElemID(iElem+offsetElem) - MacroRadInputParameters(SortElemInd(CNElemID),iSpec,1) = MAX(0.,ElemData_HDF5(iVar+ 6,iElem)) !density - MacroRadInputParameters(SortElemInd(CNElemID),iSpec,2) = MAX(0.,ElemData_HDF5(iVar+ 7,iElem)) !T_vib - MacroRadInputParameters(SortElemInd(CNElemID),iSpec,3) = MAX(0.,ElemData_HDF5(iVar+ 8,iElem)) !T_rot - MacroRadInputParameters(SortElemInd(CNElemID),iSpec,4) = MAX(0.,ElemData_HDF5(iVar+ 9,iElem)) !T_elec - MacroRadInputParameters(SortElemInd(CNElemID),iSpec,5) = MAX(0.,ElemData_HDF5(iVar+11,iElem)) !T_mean - END DO - iVar = iVar + DSMC_NVARS + IF (SpecDSMC(iSpec)%InterID .EQ. 4) iSpecElectrons = iSpec END DO - ELSE - iVar = 1 - DO iSpec = 1, nSpecies - DO iElem = 1, nElems + IF (iSpecElectrons .EQ. 0) THEN + PRINT*, "unknown species number for electrons while reading flow field data" + STOP + END IF + IndexElectronTemp = (iSpecElectrons-1)*DSMC_NVARS+1 + 11 !132 for 11th Species + DO iElem = 1, nElems + DO iSpec = 1, nSpecies CNElemID = GetCNElemID(iElem+offsetElem) - MacroRadInputParameters(CNElemID,iSpec,1) = MAX(0.,ElemData_HDF5(iVar+ 6,iElem)) !density - MacroRadInputParameters(CNElemID,iSpec,2) = MAX(0.,ElemData_HDF5(iVar+ 7,iElem)) !T_vib - MacroRadInputParameters(CNElemID,iSpec,3) = MAX(0.,ElemData_HDF5(iVar+ 8,iElem)) !T_rot - MacroRadInputParameters(CNElemID,iSpec,4) = MAX(0.,ElemData_HDF5(iVar+ 9,iElem)) !T_elec - !IF((iSpec.EQ.12) .OR. (iSpec.EQ.13)) MacroRadInputParameters(CNElemID,iSpec,4)=MacroRadInputParameters(CNElemID,iSpec,4)*1.1 !Fe Fe+ +-10percent - MacroRadInputParameters(CNElemID,iSpec,5) = MAX(0.,ElemData_HDF5(iVar+11,iElem)) !T_mean + IF((SpecDSMC(iSpec)%InterID .EQ. 1) .OR. (SpecDSMC(iSpec)%InterID .EQ. 10) .OR. & + (SpecDSMC(iSpec)%InterID .EQ. 2) .OR. (SpecDSMC(iSpec)%InterID .EQ. 20)) THEN + MacroRadInputParameters(CNElemID,iSpec,4) = MAX(0.,ElemData_HDF5(IndexElectronTemp,iElem)) + ELSE IF(SpecDSMC(iSpec)%InterID .EQ. 4) THEN + CYCLE + ELSE + PRINT*, "excitation temperature cannot be matched, unknown InterID for species", iSpec + END IF END DO - iVar = iVar + DSMC_NVARS END DO - - IF(.NOT.RadiationSwitches%UseElectronicExcitation) THEN - iSpecElectrons = 0 - DO iSpec = 1, nSpecies - IF (SpecDSMC(iSpec)%InterID .EQ. 4) iSpecElectrons = iSpec - END DO - IF (iSpecElectrons .EQ. 0) THEN - PRINT*, "unknown species number for electrons while reading flow field data" - STOP - END IF - IndexElectronTemp = (iSpecElectrons-1)*DSMC_NVARS+1 + 11 !132 for 11th Species - DO iElem = 1, nElems - DO iSpec = 1, nSpecies - CNElemID = GetCNElemID(iElem+offsetElem) - IF((SpecDSMC(iSpec)%InterID .EQ. 1) .OR. (SpecDSMC(iSpec)%InterID .EQ. 10) .OR. & - (SpecDSMC(iSpec)%InterID .EQ. 2) .OR. (SpecDSMC(iSpec)%InterID .EQ. 20)) THEN - MacroRadInputParameters(CNElemID,iSpec,4) = MAX(0.,ElemData_HDF5(IndexElectronTemp,iElem)) - ELSE IF(SpecDSMC(iSpec)%InterID .EQ. 4) THEN - CYCLE - ELSE - PRINT*, "excitation temperature cannot be matched, unknown InterID for species", iSpec - END IF - END DO - END DO - END IF END IF +END IF #if USE_MPI - CALL BARRIER_AND_SYNC(MacroRadInputParameters_Shared_Win ,MPI_COMM_SHARED) +CALL BARRIER_AND_SYNC(MacroRadInputParameters_Shared_Win ,MPI_COMM_SHARED) #endif - DEALLOCATE(ElemData_HDF5) +DEALLOCATE(ElemData_HDF5) END SUBROUTINE MacroscopicRadiationInput diff --git a/src/radiation/radiation_solver/radiation_main.f90 b/src/radiation/radiation_solver/radiation_main.f90 index b0b48cd81..028438489 100644 --- a/src/radiation/radiation_solver/radiation_main.f90 +++ b/src/radiation/radiation_solver/radiation_main.f90 @@ -26,7 +26,7 @@ MODULE MOD_Radiation END INTERFACE !----------------------------------------------------------------------------------------------------------------------------------- -! GLOBAL VARIABLES +! GLOBAL VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! Private Part --------------------------------------------------------------------------------------------------------------------- ! Public Part ---------------------------------------------------------------------------------------------------------------------- @@ -39,7 +39,7 @@ MODULE MOD_Radiation SUBROUTINE radiation_main(iElem) !=================================================================================================================================== ! Main routine of the radiation solver, called cell-locally in the radtrans_init.f90 in each computational cell to calculate the -! local emission and absorption coefficients needed to solve the radiative transfer equation +! local emission and absorption coefficients needed to solve the radiative transfer equation !=================================================================================================================================== ! MODULES USE MOD_Globals @@ -116,10 +116,11 @@ SUBROUTINE radiation_main(iElem) ! WRITE(*,*) 'continuum emission : ', em_cont, '[w/m³]' ! WRITE(*,*) 'total emission : ', em_tot, '[w/m³]' ! WRITE(*,*) '' - + DO iWave=1, RadiationParameter%WaveLenDiscrCoarse sumAbsSpecies =SUM(Radiation_Absorption_SpeciesWave(iWave, :)) - IF(sumAbsSpecies.GT.0.0) Radiation_Absorption_SpecPercent(iWave,:,GetGlobalElemID(iElem)) = NINT(Radiation_Absorption_SpeciesWave(iWave, :)/sumAbsSpecies*10000.) + ! Cast to INTEGER KIND=2 + IF(sumAbsSpecies.GT.0.0) Radiation_Absorption_SpecPercent(iWave,:,GetGlobalElemID(iElem)) = NINT(Radiation_Absorption_SpeciesWave(iWave, :)/sumAbsSpecies*10000., 2) END DO IF((RadiationSwitches%RadType.EQ.3) .AND. (nGlobalElems.EQ.1)) THEN diff --git a/src/radiation/radiative_transfer/radtrans_init.f90 b/src/radiation/radiative_transfer/radtrans_init.f90 index eef7118b0..1ef664935 100644 --- a/src/radiation/radiative_transfer/radtrans_init.f90 +++ b/src/radiation/radiative_transfer/radtrans_init.f90 @@ -65,43 +65,43 @@ END SUBROUTINE DefineParametersRadiationTrans SUBROUTINE InitRadiationTransport() !=================================================================================================================================== -! Initialization of the radiative transfer solver +! Initialization of the radiative transfer solver !=================================================================================================================================== ! MODULES USE MOD_Globals -USE MOD_Globals_Vars, ONLY : Pi, c +USE MOD_Globals_Vars ,ONLY: Pi, c USE MOD_ReadInTools USE MOD_RadiationTrans_Vars -USE MOD_Mesh_Vars, ONLY : nElems, nGlobalElems -USE MOD_Particle_Mesh_Vars, ONLY : ElemVolume_Shared,ElemMidPoint_Shared, GEO, nComputeNodeElems -USE MOD_Globals_Vars, ONLY : BoltzmannConst, PlanckConst -USE MOD_Particle_Boundary_Sampling, ONLY : InitParticleBoundarySampling -USE MOD_Particle_Boundary_Vars, ONLY : nComputeNodeSurfTotalSides,nSurfSample -USE MOD_Radiation_Vars, ONLY : RadiationParameter, Radiation_Emission_spec, Radiation_Absorption_spec, RadiationSwitches -USE MOD_Radiation_Vars, ONLY : Radiation_Absorption_SpecPercent -USE MOD_RadiationTrans_Vars, ONLY : RadObservation_Emission -USE MOD_Radiation, ONLY : radiation_main -USE MOD_DSMC_Vars, ONLY: RadialWeighting -USE MOD_Output, ONLY: PrintStatusLineRadiation -USE MOD_Mesh_Tools, ONLY : GetGlobalElemID -USE MOD_Particle_Vars, ONLY : Symmetry, nSpecies +USE MOD_Mesh_Vars ,ONLY: nGlobalElems +USE MOD_Particle_Mesh_Vars ,ONLY: ElemVolume_Shared,ElemMidPoint_Shared, GEO, nComputeNodeElems +USE MOD_Globals_Vars ,ONLY: BoltzmannConst, PlanckConst +USE MOD_Particle_Boundary_Sampling ,ONLY: InitParticleBoundarySampling +USE MOD_Particle_Boundary_Vars ,ONLY: nComputeNodeSurfTotalSides,nSurfSample +USE MOD_Radiation_Vars ,ONLY: RadiationParameter, Radiation_Emission_Spec, Radiation_Absorption_Spec, RadiationSwitches +USE MOD_Radiation_Vars ,ONLY: Radiation_Absorption_SpecPercent +USE MOD_RadiationTrans_Vars ,ONLY: RadObservation_Emission +USE MOD_Radiation ,ONLY: radiation_main +USE MOD_DSMC_Vars ,ONLY: RadialWeighting +USE MOD_Output ,ONLY: PrintStatusLineRadiation +USE MOD_Mesh_Tools ,ONLY: GetGlobalElemID +USE MOD_Particle_Vars ,ONLY: Symmetry, nSpecies USE MOD_MPI_Shared_Vars USE MOD_MPI_Shared -USE MOD_Particle_Mesh_Build, ONLY: BuildMesh2DInfo -USE MOD_SuperB_Tools, ONLY: FindLinIndependentVectors, GramSchmidtAlgo +USE MOD_Particle_Mesh_Build ,ONLY: BuildMesh2DInfo +USE MOD_SuperB_Tools ,ONLY: FindLinIndependentVectors, GramSchmidtAlgo #if USE_MPI -USE MOD_RadiationTrans_Vars, ONLY : RadTransObsVolumeFrac_Shared_Win, RadTransObsVolumeFrac_Shared -USE MOD_Radiation_Vars, ONLY : Radiation_Absorption_Spec_Shared, Radiation_Absorption_Spec_Shared_Win, RadiationInput -USE MOD_Radiation_Vars, ONLY : Radiation_Emission_Spec_Shared_Win, Radiation_Emission_Spec_Shared, MacroRadInputParameters -USE MOD_Radiation_Vars, ONLY : Radiation_Absorption_SpecPercent_Shared, Radiation_Absorption_SpecPercent_Shared_Win +USE MOD_RadiationTrans_Vars ,ONLY: RadTransObsVolumeFrac_Shared_Win, RadTransObsVolumeFrac_Shared +USE MOD_Radiation_Vars ,ONLY: Radiation_Absorption_Spec_Shared, Radiation_Absorption_Spec_Shared_Win, RadiationInput +USE MOD_Radiation_Vars ,ONLY: Radiation_Emission_Spec_Shared_Win, MacroRadInputParameters +USE MOD_Radiation_Vars ,ONLY: Radiation_Absorption_SpecPercent_Shared, Radiation_Absorption_SpecPercent_Shared_Win +USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWallProc +USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall_Shared, PhotonSampWall_Shared_Win,PhotonSampWallProc +#else +USE MOD_Mesh_Vars ,ONLY: nElems #endif -USE MOD_RayTracing_Vars ,ONLY: Ray -USE MOD_Photon_Tracking ,ONLY: InitPhotonSurfSample -#if USE_MPI -USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWallProc -USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall_Shared, PhotonSampWall_Shared_Win,PhotonSampWallProc -#endif /*USE_MPI*/ -USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall +USE MOD_RayTracing_Vars ,ONLY: Ray +USE MOD_Photon_Tracking ,ONLY: InitPhotonSurfSample +USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -114,7 +114,7 @@ SUBROUTINE InitRadiationTransport() REAL :: LocTemp, ObsLengt, MaxSumTemp(2), GlobalMaxTemp(2), tmp LOGICAL :: ElemInCone REAL,ALLOCATABLE :: Radiation_ShockTube_Spec(:,:) -INTEGER :: w, io_error +INTEGER :: io_error CHARACTER(LEN=3) :: hilf !=================================================================================================================================== SWRITE(UNIT_StdOut,'(132("-"))') @@ -158,7 +158,7 @@ SUBROUTINE InitRadiationTransport() CALL FindLinIndependentVectors(RadObservationPoint%OrthoNormBasis(1:3,1), RadObservationPoint%OrthoNormBasis(1:3,2), RadObservationPoint%OrthoNormBasis(1:3,3)) CALL GramSchmidtAlgo(RadObservationPoint%OrthoNormBasis(1:3,1), RadObservationPoint%OrthoNormBasis(1:3,2), RadObservationPoint%OrthoNormBasis(1:3,3)) IF (RadObservationPointMethod.EQ.2) RadObservationPoint%Diameter = 0.0 - ObsLengt = RadObservationPoint%Diameter/(2.*TAN(RadObservationPoint%AngularAperture/2.)) + ObsLengt = RadObservationPoint%Diameter/(2.*TAN(RadObservationPoint%AngularAperture/2.)) RadObservationPoint%StartPoint(1:3) = RadObservationPoint%MidPoint(1:3) - ObsLengt*RadObservationPoint%ViewDirection(1:3) RadObservationPoint%Area = Pi*RadObservationPoint%Diameter*RadObservationPoint%Diameter/4. IF (RadObservationPointMethod.EQ.2) THEN @@ -185,15 +185,15 @@ SUBROUTINE InitRadiationTransport() CALL MPI_WIN_LOCK_ALL(0,RadiationElemAbsEnergy_Shared_Win,IERROR) IF (myComputeNodeRank.EQ.0) RadiationElemAbsEnergy_Shared = 0. -CALL BARRIER_AND_SYNC(RadiationElemAbsEnergy_Shared_Win,MPI_COMM_SHARED) +CALL BARRIER_AND_SYNC(RadiationElemAbsEnergy_Shared_Win,MPI_COMM_SHARED) ! allocate shared array for Radiation_Emission/Absorption_Spec CALL Allocate_Shared((/nSpecies,nGlobalElems/),RadiationElemAbsEnergySpec_Shared_Win,RadiationElemAbsEnergySpec_Shared) CALL MPI_WIN_LOCK_ALL(0,RadiationElemAbsEnergySpec_Shared_Win,IERROR) IF (myComputeNodeRank.EQ.0) RadiationElemAbsEnergySpec_Shared = 0. -CALL BARRIER_AND_SYNC(RadiationElemAbsEnergySpec_Shared_Win,MPI_COMM_SHARED) - +CALL BARRIER_AND_SYNC(RadiationElemAbsEnergySpec_Shared_Win,MPI_COMM_SHARED) + CALL Allocate_Shared((/nComputeNodeElems/), RadTransPhotPerCell_Shared_Win,RadTransPhotPerCell_Shared) CALL MPI_WIN_LOCK_ALL(0,RadTransPhotPerCell_Shared_Win,IERROR) CALL Allocate_Shared((/nComputeNodeElems/), Radiation_Emission_Spec_Total_Shared_Win,Radiation_Emission_Spec_Total_Shared) @@ -267,7 +267,7 @@ SUBROUTINE InitRadiationTransport() MaxSumTemp(1) = 0.0 currentRank = 0 firstElem = 1 - ElemLoop: DO iElem = 1, nComputeNodeElems + ElemLoop: DO iElem = 1, nComputeNodeElems DO iSpec = 1, nSpecies IF(.NOT.RadiationInput(iSpec)%DoRadiation) CYCLE MaxSumTemp(1) = MaxSumTemp(1) + MacroRadInputParameters(iElem,iSpec,4) @@ -280,7 +280,7 @@ SUBROUTINE InitRadiationTransport() EXIT ElemLoop ELSE CYCLE ElemLoop - END IF + END IF END IF IF (MaxSumTemp(1).GE.GlobalMaxTemp(1)) THEN currentRank = currentRank + 1 @@ -294,7 +294,7 @@ SUBROUTINE InitRadiationTransport() END DO ElemLoop IF (myRank+1.EQ.nComputeNodeProcessors) lastElem = nComputeNodeElems END IF - + MaxSumTemp(2) = REAL(myRank) MaxSumTemp(1) = 0.0 DO iSpec = 1, nSpecies @@ -332,14 +332,14 @@ SUBROUTINE InitRadiationTransport() DO iWave = 1, RadiationParameter%WaveLenDiscrCoarse Radiation_Emission_Spec_Total(iElem) = Radiation_Emission_Spec_Total(iElem) & + 4.*Pi*Radiation_Emission_Spec(iWave, iElem) * RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor - IF (RadiationPhotonWaveLengthModel.EQ.1) Radiation_Emission_Spec_Max(iElem) = MAX(Radiation_Emission_Spec_Max(iElem), & + IF (RadiationPhotonWaveLengthModel.EQ.1) Radiation_Emission_Spec_Max(iElem) = MAX(Radiation_Emission_Spec_Max(iElem), & 4.*Pi*Radiation_Emission_Spec(iWave, iElem) * RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor) END DO IF (RadiationParameter%WaveLenReductionFactor.GT.1) THEN IF (MOD(RadiationParameter%WaveLenDiscr,RadiationParameter%WaveLenDiscrCoarse).NE.0) THEN Radiation_Emission_Spec_Total(iElem) = Radiation_Emission_Spec_Total(iElem) & - + 4.*Pi*Radiation_Emission_Spec(RadiationParameter%WaveLenDiscrCoarse, iElem) * RadiationParameter%WaveLenIncr - IF (RadiationPhotonWaveLengthModel.EQ.1) Radiation_Emission_Spec_Max(iElem) = MAX(Radiation_Emission_Spec_Max(iElem), & + + 4.*Pi*Radiation_Emission_Spec(RadiationParameter%WaveLenDiscrCoarse, iElem) * RadiationParameter%WaveLenIncr + IF (RadiationPhotonWaveLengthModel.EQ.1) Radiation_Emission_Spec_Max(iElem) = MAX(Radiation_Emission_Spec_Max(iElem), & 4.*Pi*Radiation_Emission_Spec(RadiationParameter%WaveLenDiscrCoarse, iElem) * RadiationParameter%WaveLenIncr*(RadiationParameter%WaveLenReductionFactor+1.)) END IF END IF @@ -364,7 +364,7 @@ SUBROUTINE InitRadiationTransport() Radiation_Absorption_Spec(iWave, GetGlobalElemID(iElem)) = 1. Radiation_Absorption_SpecPercent(iWave,:,GetGlobalElemID(iElem)) = 10000 END DO - END DO + END DO CASE(3) !only radiation SWRITE(UNIT_stdOut,'(A)') ' Calculate Radiation Data per Cell ...' DO iElem = firstElem, lastElem @@ -397,19 +397,17 @@ SUBROUTINE InitRadiationTransport() DO iElem=1,nGlobalElems WRITE(40,CSVFORMAT,ADVANCE="NO") ',', ElemMidPoint_Shared(1,iElem) END DO - WRITE(40,*) + WRITE(40,*) DO iWave =1,RadiationParameter%WaveLenDiscr WRITE(40,'(E23.16E3)',ADVANCE="NO") RadiationParameter%WaveLen(iWave)*1.E9 DO iElem = 1,nGlobalElems WRITE(40,CSVFORMAT,ADVANCE="NO") ',', Radiation_ShockTube_Spec(iWave,iElem) END DO - WRITE(40,*) + WRITE(40,*) END DO CASE DEFAULT - CALL abort(& - __STAMP__& - ,' ERROR: Radiation type is not implemented! (unknown case)') + CALL abort(__STAMP__,' ERROR: Radiation type is not implemented! (unknown case)') END SELECT @@ -433,7 +431,7 @@ SUBROUTINE InitRadiationTransport() , MPI_COMM_LEADERS_SHARED & , IERROR) END IF - END IF + END IF CALL BARRIER_AND_SYNC(Radiation_Absorption_Spec_Shared_Win ,MPI_COMM_SHARED) CALL BARRIER_AND_SYNC(Radiation_Absorption_SpecPercent_Shared_Win ,MPI_COMM_SHARED) IF(nLeaderGroupProcs.GT.1)THEN @@ -448,7 +446,7 @@ SUBROUTINE InitRadiationTransport() , MPI_COMM_LEADERS_SHARED & , IERROR) END IF - END IF + END IF CALL BARRIER_AND_SYNC(Radiation_Absorption_SpecPercent_Shared_Win ,MPI_COMM_SHARED) IF (RadObservationPointMethod.EQ.2) CALL BARRIER_AND_SYNC(RadObservationPOI_Shared_Win ,MPI_COMM_SHARED) !print*, 'AHAAAA', SUM(RadObservationPOI(7,:)) @@ -469,7 +467,7 @@ SUBROUTINE InitRadiationTransport() IF (RadialWeighting%DoRadialWeighting) THEN CALL MPI_ALLREDUCE(MPI_IN_PLACE,RadTrans%ScaledGlobalRadiationPower,1,MPI_DOUBLE_PRECISION,MPI_SUM,MPI_COMM_WORLD,iError) END IF -#endif /*USE_MPI*/ +#endif /*USE_MPI*/ RadTrans%GlobalPhotonNum = RadTrans%NumPhotonsPerCell * nGlobalElems @@ -566,17 +564,17 @@ SUBROUTINE ElemInObsCone(ElemID, ElemInCone) ConeRadius = TAN(RadObservationPoint%AngularAperture/2.) * ConeDist orthoDist = VECNORM(NodePoint(1:3) - RadObservationPoint%StartPoint(1:3) - ConeDist*RadObservationPoint%ViewDirection(1:3)) IF (orthoDist.LE.ConeRadius) THEN - NodeInCone(iNode) = .TRUE. + NodeInCone(iNode) = .TRUE. END IF END DO IF (ALL(NodeInCone)) THEN - ElemInCone = .TRUE. + ElemInCone = .TRUE. ELSE IF (ANY(NodeInCone)) THEN iGlobalElem = GetGlobalElemID(ElemID) RadTransObsVolumeFrac(ElemID) = 0.0 - ElemInCone = .TRUE. - ASSOCIATE( Bounds => BoundsOfElem_Shared(1:2,1:3,iGlobalElem) ) + ElemInCone = .TRUE. + ASSOCIATE( Bounds => BoundsOfElem_Shared(1:2,1:3,iGlobalElem) ) DO iPoint = 1, MCVar InsideFlag=.FALSE. DO WHILE(.NOT.InsideFlag) @@ -590,9 +588,9 @@ SUBROUTINE ElemInObsCone(ElemID, ElemInCone) ConeRadius = TAN(RadObservationPoint%AngularAperture/2.) * ConeDist orthoDist = VECNORM(RandomPos(1:3) - RadObservationPoint%StartPoint(1:3) - ConeDist*RadObservationPoint%ViewDirection(1:3)) IF (orthoDist.LE.ConeRadius) RadTransObsVolumeFrac(ElemID) = RadTransObsVolumeFrac(ElemID) + 1./REAL(MCVar) - END DO + END DO END ASSOCIATE -ELSE +ELSE nlocSides = ElemInfo_Shared(ELEM_LASTSIDEIND,ElemID) - ElemInfo_Shared(ELEM_FIRSTSIDEIND,ElemID) SideLoop: DO iLocSide=1,nlocSides TempSideID = ElemInfo_Shared(ELEM_FIRSTSIDEIND,ElemID) + iLocSide @@ -605,7 +603,7 @@ SUBROUTINE ElemInObsCone(ElemID, ElemInCone) CALL PhotonIntersectionWithSide2DDir(localSideID,ElemID,ThroughSide, RadObservationPoint%StartPoint(1:3),RadObservationPoint%ViewDirection(1:3)) IF (ThroughSide) THEN ElemInCone = .TRUE. - ASSOCIATE( Bounds => BoundsOfElem_Shared(1:2,1:3,iGlobalElem) ) + ASSOCIATE( Bounds => BoundsOfElem_Shared(1:2,1:3,iGlobalElem) ) DO iPoint = 1, MCVar InsideFlag=.FALSE. DO WHILE(.NOT.InsideFlag) @@ -619,17 +617,17 @@ SUBROUTINE ElemInObsCone(ElemID, ElemInCone) ConeRadius = TAN(RadObservationPoint%AngularAperture/2.) * ConeDist orthoDist = VECNORM(RandomPos(1:3) - RadObservationPoint%StartPoint(1:3) - ConeDist*RadObservationPoint%ViewDirection(1:3)) IF (orthoDist.LE.ConeRadius) RadTransObsVolumeFrac(ElemID) = RadTransObsVolumeFrac(ElemID) + 1./REAL(MCVar) - END DO + END DO END ASSOCIATE EXIT SideLoop - END IF + END IF ELSE DO TriNum = 1,2 ThroughSide = .FALSE. CALL PhotonThroughSideCheck3DDir(localSideID,ElemID,ThroughSide,TriNum, RadObservationPoint%StartPoint(1:3),RadObservationPoint%ViewDirection(1:3)) IF (ThroughSide) THEN ElemInCone = .TRUE. - ASSOCIATE( Bounds => BoundsOfElem_Shared(1:2,1:3,iGlobalElem) ) + ASSOCIATE( Bounds => BoundsOfElem_Shared(1:2,1:3,iGlobalElem) ) DO iPoint = 1, MCVar InsideFlag=.FALSE. DO WHILE(.NOT.InsideFlag) @@ -643,7 +641,7 @@ SUBROUTINE ElemInObsCone(ElemID, ElemInCone) ConeRadius = TAN(RadObservationPoint%AngularAperture/2.) * ConeDist orthoDist = VECNORM(RandomPos(1:3) - RadObservationPoint%StartPoint(1:3) - ConeDist*RadObservationPoint%ViewDirection(1:3)) IF (orthoDist.LE.ConeRadius) RadTransObsVolumeFrac(ElemID) = RadTransObsVolumeFrac(ElemID) + 1./REAL(MCVar) - END DO + END DO END ASSOCIATE EXIT SideLoop END IF @@ -662,8 +660,8 @@ SUBROUTINE ElemOnLineOfSight(ElemID, ElemInCone) ! MODULES USE MOD_Globals USE MOD_Mesh_Tools ,ONLY: GetGlobalElemID -USE MOD_Particle_Mesh_Vars ,ONLY: NodeCoords_Shared,ElemInfo_Shared, BoundsOfElem_Shared, SideInfo_Shared, SideIsSymSide -USE MOD_RadiationTrans_Vars ,ONLY: RadObservationPoint, RadTransObsVolumeFrac, RadObservationPOI +USE MOD_Particle_Mesh_Vars ,ONLY: ElemInfo_Shared, SideInfo_Shared, SideIsSymSide +USE MOD_RadiationTrans_Vars ,ONLY: RadObservationPoint, RadObservationPOI USE MOD_Particle_Vars ,ONLY: Symmetry USE MOD_Particle_Mesh_Tools ,ONLY: ParticleInsideQuad3D USE MOD_Photon_TrackingTools ,ONLY: PhotonIntersectionWithSide2DDir, PhotonThroughSideCheck3DDir @@ -678,10 +676,10 @@ SUBROUTINE ElemOnLineOfSight(ElemID, ElemInCone) LOGICAL, INTENT(OUT) :: ElemInCone !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -INTEGER :: iNode, MCVar, iGlobalElem, iPoint, iLocSide, nlocSides, TempSideID, localSideID, TriNum +INTEGER :: iLocSide, nlocSides, TempSideID, localSideID, TriNum INTEGER :: nThroughSide, BCType -LOGICAL :: NodeInCone(8), InsideFlag, ThroughSide, IsSymElem -REAL :: NodePoint(3), ConeDist, ConeRadius, orthoDist, RandomPos(3),IntersectionPos(1:3), Distance(2) +LOGICAL :: ThroughSide, IsSymElem +REAL :: IntersectionPos(1:3), Distance(2) REAL :: length !=================================================================================================================================== ElemInCone = .FALSE. @@ -715,7 +713,7 @@ SUBROUTINE ElemOnLineOfSight(ElemID, ElemInCone) RadObservationPOI(7, ElemID) = VECNORM(RadObservationPOI(4:6, ElemID)-RadObservationPOI(1:3, ElemID)) EXIT SideLoop END IF - END IF + END IF ELSE DO TriNum = 1,2 ThroughSide = .FALSE. diff --git a/src/radiation/radiative_transfer/radtrans_main.f90 b/src/radiation/radiative_transfer/radtrans_main.f90 index 6a524d865..101dc82c1 100644 --- a/src/radiation/radiative_transfer/radtrans_main.f90 +++ b/src/radiation/radiative_transfer/radtrans_main.f90 @@ -26,7 +26,7 @@ MODULE MOD_RadTransport END INTERFACE !----------------------------------------------------------------------------------------------------------------------------------- -! GLOBAL VARIABLES +! GLOBAL VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! Private Part --------------------------------------------------------------------------------------------------------------------- ! Public Part ---------------------------------------------------------------------------------------------------------------------- @@ -41,7 +41,6 @@ SUBROUTINE RadTrans_main() !=================================================================================================================================== ! MODULES USE MOD_Globals -USE MOD_Mesh_Vars ,ONLY: nElems USE MOD_Particle_Mesh_Vars ,ONLY: GEO, nComputeNodeElems, ElemMidPoint_Shared, ElemVolume_Shared USE MOD_RadiationTrans_Vars ,ONLY: Radiation_Emission_Spec_Total, RadTrans, RadEmiAdaptPhotonNum, RadTransObsVolumeFrac USE MOD_RadiationTrans_Vars ,ONLY: RadiationDirectionModel, RadTransPhotPerCellLoc, RadObservationPoint @@ -56,6 +55,9 @@ SUBROUTINE RadTrans_main() USE MOD_MPI_Shared_Vars USE MOD_MPI_Shared USE MOD_Particle_Vars ,ONLY: Symmetry +#if !(USE_MPI) +USE MOD_Mesh_Vars ,ONLY: nElems +#endif /*!(USE_MPI)*/ ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -66,7 +68,6 @@ SUBROUTINE RadTrans_main() ! LOCAL VARIABLES INTEGER :: iElem, nPhotons, iPhot, globPhotNum, nPhotonsCN, photonCount, iPhotLoc, photVisCount, LocPhotNum, PhotDisp INTEGER :: firstElem, lastElem, firstPhoton, lastPhoton -REAL :: Bounds(1:2,1:3) ! Bounds(1,1:3) --> maxCoords , Bounds(2,1:3) --> minCoords REAL :: RandRot(3,3) !, PartPos(1:3) !=================================================================================================================================== IF ((RadiationSwitches%RadType.EQ.3) .OR. (RadiationSwitches%RadType.EQ.4)) RETURN @@ -81,7 +82,7 @@ SUBROUTINE RadTrans_main() SWRITE(UNIT_stdOut,'(A)') ' Distribute Photons to Processors ...' IF (RadEmiAdaptPhotonNum) THEN DO iElem = firstElem, lastElem - IF (RadObservationPoint%CalcFullSpectra) THEN + IF (RadObservationPoint%CalcFullSpectra) THEN IF (Radiation_Emission_Spec_Total(iElem).GT.0.0) THEN RadTransPhotPerCell(iElem) = RadTrans%NumPhotonsPerCell ELSE @@ -102,22 +103,22 @@ SUBROUTINE RadTrans_main() END IF END IF END DO -#if USE_MPI +#if USE_MPI CALL BARRIER_AND_SYNC(RadTransPhotPerCell_Shared_Win ,MPI_COMM_SHARED) - IF(myComputeNodeRank.EQ.0) nPhotons = SUM(RadTransPhotPerCell(:)) + IF(myComputeNodeRank.EQ.0) nPhotons = SUM(RadTransPhotPerCell(:)) IF(nLeaderGroupProcs.GT.1)THEN IF(myComputeNodeRank.EQ.0)THEN CALL MPI_ALLREDUCE(MPI_IN_PLACE,nPhotons,1,MPI_INTEGER,MPI_SUM,MPI_COMM_LEADERS_SHARED,iError) END IF END IF CALL MPI_BCAST(nPhotons,1, MPI_INTEGER,0,MPI_COMM_SHARED,iERROR) - nPhotonsCN = SUM(RadTransPhotPerCell(:)) + nPhotonsCN = SUM(RadTransPhotPerCell(:)) firstPhoton = INT(REAL( myComputeNodeRank) *REAL(nPhotonsCN)/REAL(nComputeNodeProcessors))+1 lastPhoton = INT(REAL(myComputeNodeRank+1)*REAL(nPhotonsCN)/REAL(nComputeNodeProcessors)) photonCount = 0 DO iELem = 1, nComputeNodeElems IF (photonCount.GT.lastPhoton) THEN - RadTransPhotPerCellLoc(iELem) = 0 + RadTransPhotPerCellLoc(iELem) = 0 ELSE IF ((photonCount.GT.firstPhoton).AND.((photonCount+RadTransPhotPerCell(iElem)).LE.lastPhoton)) THEN RadTransPhotPerCellLoc(iELem) = RadTransPhotPerCell(iElem) ELSE IF ((photonCount.LT.firstPhoton).AND.((photonCount+RadTransPhotPerCell(iElem)).GT.lastPhoton)) THEN @@ -132,12 +133,12 @@ SUBROUTINE RadTrans_main() photonCount = photonCount + RadTransPhotPerCell(iELem) END DO #else - RadTransPhotPerCellLoc(:) = RadTransPhotPerCell(:) + RadTransPhotPerCellLoc(:) = RadTransPhotPerCell(:) nPhotons = SUM(RadTransPhotPerCell(:)) #endif /*USE_MPI*/ RadTrans%GlobalPhotonNum = nPhotons ELSE -#if USE_MPI +#if USE_MPI IF(myComputeNodeRank.EQ.0) RadTransPhotPerCell(:) = RadTrans%NumPhotonsPerCell CALL BARRIER_AND_SYNC(RadTransPhotPerCell_Shared_Win ,MPI_COMM_SHARED) #else @@ -147,7 +148,7 @@ SUBROUTINE RadTrans_main() RadTransPhotPerCellLoc(firstElem:lastElem) = RadTransPhotPerCell(firstElem:lastElem) firstPhoton = 1 END IF - + SWRITE(UNIT_stdOut,'(A)') ' Start Radiative Transport Calculation ...' globPhotNum = 0 photonCount = 0 @@ -162,11 +163,11 @@ SUBROUTINE RadTrans_main() IF(MPIroot.AND.(MOD(photVisCount,PhotDisp).EQ.0)) CALL PrintStatusLineRadiation(REAL(photVisCount),REAL(1),REAL(LocPhotNum),.TRUE.) photVisCount = photVisCount + 1 PhotonProps%PhotonPos(1:3) = SetPhotonPos(iElem, globPhotNum) - PhotonProps%PhotonLastPos(1:3) = PhotonProps%PhotonPos(1:3) + PhotonProps%PhotonLastPos(1:3) = PhotonProps%PhotonPos(1:3) PhotonProps%ElemID = GetGlobalElemID(iElem) - IF ((photonCount.LT.firstPhoton)) THEN + IF ((photonCount.LT.firstPhoton)) THEN iPhotLoc = firstPhoton - photonCount + iPhot - 1 - ELSE + ELSE iPhotLoc = iPhot END IF PhotonProps%PhotonDirection(1:3) = SetPhotonStartDirection(iElem, iPhotLoc, RandRot) @@ -179,14 +180,14 @@ SUBROUTINE RadTrans_main() PhotonProps%WaveLength = SetParticleWavelengthBiSec(iElem) END IF END IF - PhotonProps%PhotonEnergy = SetPhotonEnergy(iElem,PhotonProps%PhotonPos(1:3), PhotonProps%WaveLength) + PhotonProps%PhotonEnergy = SetPhotonEnergy(iElem,PhotonProps%PhotonPos(1:3), PhotonProps%WaveLength) IF (PhotonProps%PhotonEnergy.EQ.0.0) CYCLE locPhotLoop IF(Symmetry%Axisymmetric) THEN CALL Photon2DSymTracking() ELSE CALL PhotonTriaTracking() END IF - END DO locPhotLoop + END DO locPhotLoop END IF photonCount = photonCount + RadTransPhotPerCell(iELem) END DO @@ -199,7 +200,7 @@ FUNCTION SetPhotonEnergy(iElem, Point, iWave) !=================================================================================================================================== ! MODULES USE MOD_Globals -USE MOD_Globals_Vars, ONLY : Pi +USE MOD_Globals_Vars, ONLY : Pi USE MOD_RadiationTrans_Vars ,ONLY : RadEmiAdaptPhotonNum, Radiation_Emission_Spec_Total, RadTrans, RadTransPhotPerCell USE MOD_RadiationTrans_Vars ,ONLY : RadObservationPoint, RadObservationPointMethod,RadTransObsVolumeFrac,RadObservationPOI USE MOD_Particle_Mesh_Vars ,ONLY : ElemVolume_Shared @@ -207,13 +208,13 @@ FUNCTION SetPhotonEnergy(iElem, Point, iWave) ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- -! INPUT VARIABLES -INTEGER, INTENT(IN) :: iElem +! INPUT VARIABLES +INTEGER, INTENT(IN) :: iElem REAL, INTENT(IN) :: Point(3) -INTEGER, INTENT(IN), OPTIONAL :: iWave +INTEGER, INTENT(IN), OPTIONAL :: iWave !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES -REAL :: SetPhotonEnergy +REAL :: SetPhotonEnergy !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES !REAL :: ProjectedDist(3), Dist(3), ClosestPoint(3), FarthestPoint(3), Vec1(3), Vec2(3), fullangle @@ -225,7 +226,7 @@ FUNCTION SetPhotonEnergy(iElem, Point, iWave) SetPhotonEnergy = Radiation_Emission_Spec_Total(iElem)*ElemVolume_Shared(iElem)*RadTransObsVolumeFrac(iElem) / (RadTrans%NumPhotonsPerCell) END IF -IF (RadObservationPointMethod.EQ.1) THEN +IF (RadObservationPointMethod.EQ.1) THEN Dist(1:3) = Point(1:3) - RadObservationPoint%MidPoint(1:3) absdistnorm = VECNORM(Dist(1:3)) DistNorm(1:3) = Dist(1:3)/absdistnorm @@ -266,12 +267,12 @@ FUNCTION SetPhotonPos(iElem, globPhotNum) ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- -! INPUT VARIABLES +! INPUT VARIABLES INTEGER, INTENT(IN) :: iElem -INTEGER, INTENT(INOUT) :: globPhotNum +INTEGER, INTENT(INOUT) :: globPhotNum !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES -REAL :: SetPhotonPos(3) +REAL :: SetPhotonPos(3) !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES LOGICAL :: InsideFlag @@ -279,7 +280,7 @@ FUNCTION SetPhotonPos(iElem, globPhotNum) !=================================================================================================================================== InsideFlag=.FALSE. globElemID = GetGlobalElemID(iElem) - ASSOCIATE( Bounds => BoundsOfElem_Shared(1:2,1:3,globElemID) ) + ASSOCIATE( Bounds => BoundsOfElem_Shared(1:2,1:3,globElemID) ) IF (RadObservationPointMethod.EQ.2) THEN SetPhotonPos(1:3) = RadObservationPOI(1:3, iElem) + 0.5*(RadObservationPOI(4:6,iElem)-RadObservationPOI(1:3,iElem)) CALL ParticleInsideQuad3D(SetPhotonPos,globElemID,InsideFlag) @@ -321,7 +322,7 @@ FUNCTION SetPhotonStartDirection(iElem, iPhot, RandRot) !=================================================================================================================================== ! MODULES USE MOD_Globals -USE MOD_Globals_Vars ,ONLY: Pi +USE MOD_Globals_Vars ,ONLY: Pi USE MOD_RadiationTrans_Vars ,ONLY: RadiationDirectionModel, RadTransPhotPerCell, RadObservationPointMethod,RadObservationPoint USE MOD_Photon_TrackingVars ,ONLY: PhotonProps ! IMPLICIT VARIABLE HANDLING @@ -364,7 +365,7 @@ FUNCTION SetPhotonStartDirection(iElem, iPhot, RandRot) SetPhotonStartDirection(3) = RandomDirection(1) * SIN(RandomDirection(2)) SetPhotonStartDirection(1:3) = MATMUL(RadObservationPoint%OrthoNormBasis, SetPhotonStartDirection(1:3)) SetPhotonStartDirection(1:3) = SetPhotonStartDirection(1:3) + RadObservationPoint%MidPoint(1:3) - SetPhotonStartDirection(1:3) = SetPhotonStartDirection(1:3) - PhotonProps%PhotonPos(1:3) + SetPhotonStartDirection(1:3) = SetPhotonStartDirection(1:3) - PhotonProps%PhotonPos(1:3) SetPhotonStartDirection(1:3) = SetPhotonStartDirection(1:3) / VECNORM(SetPhotonStartDirection(1:3)) ELSEIF (RadObservationPointMethod.EQ.2) THEN ! SetPhotonStartDirection(1:3) = RadObservationPoint%MidPoint(1:3) @@ -381,7 +382,7 @@ FUNCTION SetPhotonStartDirection(iElem, iPhot, RandRot) SetPhotonStartDirection(1) = SIN(RandomDirection(2))*SQRT(1.-RandomDirection(1)**2.) SetPhotonStartDirection(2) = COS(RandomDirection(2))*SQRT(1.-RandomDirection(1)**2.) SetPhotonStartDirection(3) = RandomDirection(1) - CASE(2) + CASE(2) SpiralStep = 0.1+1.2*REAL(RadTransPhotPerCell(iElem)) start = (-1. + 1./(REAL(RadTransPhotPerCell(iElem))-1.)) incr = (2.-2./(REAL(RadTransPhotPerCell(iElem))-1.))/(REAL(RadTransPhotPerCell(iElem))-1.) @@ -390,7 +391,7 @@ FUNCTION SetPhotonStartDirection(iElem, iPhot, RandRot) Y_new = Pi/2.*SIGN(1.,SpiralPos)*(1.-SQRT(1.-ABS(SpiralPos))) SetPhotonStartDirection(1) = COS(X_new)*COS(Y_new) SetPhotonStartDirection(2) = SIN(X_new)*COS(Y_new) - SetPhotonStartDirection(3) = SIN(Y_new) + SetPhotonStartDirection(3) = SIN(Y_new) SetPhotonStartDirection(1:3) = MATMUL(RandRot, SetPhotonStartDirection(1:3)) CASE DEFAULT CALL abort(& @@ -405,8 +406,8 @@ FUNCTION RandomRotMatrix() !=================================================================================================================================== ! Rotation matrix with random rotational angle to avoid preferred directions !=================================================================================================================================== -! MODULES - USE MOD_Globals_Vars, ONLY : Pi +! MODULES + USE MOD_Globals_Vars, ONLY : Pi ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -450,39 +451,39 @@ FUNCTION SetParticleWavelengthAR(iElem) INTEGER :: SetParticleWavelengthAR !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -INTEGER :: iWaveLength, iWave +INTEGER :: iWaveLength REAL :: iRan, iRadPower !=================================================================================================================================== - + +CALL RANDOM_NUMBER(iRan) +iWaveLength = INT(RadiationParameter%WaveLenDiscrCoarse*iRan) + 1 +IF ((RadiationParameter%WaveLenReductionFactor.GT.1).AND.(iWaveLength.EQ.RadiationParameter%WaveLenDiscrCoarse)) THEN + IF (MOD(RadiationParameter%WaveLenDiscr,RadiationParameter%WaveLenDiscrCoarse).NE.0) THEN + iRadPower = 4.*Pi*Radiation_Emission_Spec(RadiationParameter%WaveLenDiscrCoarse, iElem) * RadiationParameter%WaveLenIncr & + * (1.+RadiationParameter%WaveLenReductionFactor) + ELSE + iRadPower = 4.*Pi*Radiation_Emission_Spec(iWaveLength,iElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor + END IF +ELSE + iRadPower = 4.*Pi*Radiation_Emission_Spec(iWaveLength,iElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor +END IF +CALL RANDOM_NUMBER(iRan) +DO WHILE (iRan.GT.(iRadPower/Radiation_Emission_Spec_Max(iElem))) CALL RANDOM_NUMBER(iRan) iWaveLength = INT(RadiationParameter%WaveLenDiscrCoarse*iRan) + 1 IF ((RadiationParameter%WaveLenReductionFactor.GT.1).AND.(iWaveLength.EQ.RadiationParameter%WaveLenDiscrCoarse)) THEN IF (MOD(RadiationParameter%WaveLenDiscr,RadiationParameter%WaveLenDiscrCoarse).NE.0) THEN iRadPower = 4.*Pi*Radiation_Emission_Spec(RadiationParameter%WaveLenDiscrCoarse, iElem) * RadiationParameter%WaveLenIncr & * (1.+RadiationParameter%WaveLenReductionFactor) - ELSE - iRadPower = 4.*Pi*Radiation_Emission_Spec(iWaveLength,iElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor + ELSE + iRadPower = 4.*Pi*Radiation_Emission_Spec(iWaveLength,iElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor END IF ELSE - iRadPower = 4.*Pi*Radiation_Emission_Spec(iWaveLength,iElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor + iRadPower = 4.*Pi*Radiation_Emission_Spec(iWaveLength,iElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor END IF - CALL RANDOM_NUMBER(iRan) - DO WHILE (iRan.GT.(iRadPower/Radiation_Emission_Spec_Max(iElem))) - CALL RANDOM_NUMBER(iRan) - iWaveLength = INT(RadiationParameter%WaveLenDiscrCoarse*iRan) + 1 - IF ((RadiationParameter%WaveLenReductionFactor.GT.1).AND.(iWaveLength.EQ.RadiationParameter%WaveLenDiscrCoarse)) THEN - IF (MOD(RadiationParameter%WaveLenDiscr,RadiationParameter%WaveLenDiscrCoarse).NE.0) THEN - iRadPower = 4.*Pi*Radiation_Emission_Spec(RadiationParameter%WaveLenDiscrCoarse, iElem) * RadiationParameter%WaveLenIncr & - * (1.+RadiationParameter%WaveLenReductionFactor) - ELSE - iRadPower = 4.*Pi*Radiation_Emission_Spec(iWaveLength,iElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor - END IF - ELSE - iRadPower = 4.*Pi*Radiation_Emission_Spec(iWaveLength,iElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor - END IF - CALL RANDOM_NUMBER(iRan) - END DO - SetParticleWavelengthAR = iWaveLength + CALL RANDOM_NUMBER(iRan) +END DO +SetParticleWavelengthAR = iWaveLength END FUNCTION SetParticleWavelengthAR @@ -511,7 +512,7 @@ FUNCTION SetParticleWavelengthBiSec(iElem) INTEGER :: iWaveLength, iWave, iWaveOld, iWaveMin, iWaveMax REAL :: iRan, iRadPower, iRadPower2 !=================================================================================================================================== - + CALL RANDOM_NUMBER(iRan) iWaveOld = 1 iWaveLength = INT(RadiationParameter%WaveLenDiscrCoarse/2) @@ -522,11 +523,11 @@ FUNCTION SetParticleWavelengthBiSec(iElem) ELSE iRadPower = 0.0 DO iWave = 1, iWaveLength - iRadPower = iRadPower + 4.*Pi*Radiation_Emission_Spec(iWave,iElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor + iRadPower = iRadPower + 4.*Pi*Radiation_Emission_Spec(iWave,iElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor END DO END IF - - DO + + DO IF (iRan.GT.(iRadPower/Radiation_Emission_Spec_Total(iElem)))THEN iWaveMin = iWaveLength ELSE @@ -539,13 +540,13 @@ FUNCTION SetParticleWavelengthBiSec(iElem) ELSE iRadPower = 0.0 DO iWave = 1, iWaveLength - iRadPower = iRadPower + 4.*Pi*Radiation_Emission_Spec(iWave,iElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor + iRadPower = iRadPower + 4.*Pi*Radiation_Emission_Spec(iWave,iElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor END DO - END IF + END IF IF (ABS(iWaveOld-iWaveLength).LE.1) EXIT - + END DO - + iWaveOld = iWaveLength IF (iRan.LT.(iRadPower/Radiation_Emission_Spec_Total(iElem))) THEN IF (iWaveLength.EQ.1) THEN @@ -554,22 +555,22 @@ FUNCTION SetParticleWavelengthBiSec(iElem) iWaveLength = iWaveLength - 1 iRadPower2 = 0.0 DO iWave = 1, iWaveLength - iRadPower2 = iRadPower2 + 4.*Pi*Radiation_Emission_Spec(iWave,iElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor + iRadPower2 = iRadPower2 + 4.*Pi*Radiation_Emission_Spec(iWave,iElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor END DO IF (ABS(iRan-(iRadPower/Radiation_Emission_Spec_Total(iElem))).LT.ABS(iRan-(iRadPower2/Radiation_Emission_Spec_Total(iElem)))) THEN iWaveLength = iWaveOld END IF END IF - ELSE + ELSE iWaveLength = iWaveLength + 1 iRadPower2 = 0.0 DO iWave = 1, iWaveLength - iRadPower2 = iRadPower2 + 4.*Pi*Radiation_Emission_Spec(iWave,iElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor + iRadPower2 = iRadPower2 + 4.*Pi*Radiation_Emission_Spec(iWave,iElem)*RadiationParameter%WaveLenIncr*RadiationParameter%WaveLenReductionFactor END DO IF (ABS(iRan-(iRadPower/Radiation_Emission_Spec_Total(iElem))).LT.ABS(iRan-(iRadPower2/Radiation_Emission_Spec_Total(iElem)))) THEN iWaveLength = iWaveOld END IF - END IF + END IF SetParticleWavelengthBiSec = iWaveLength END FUNCTION SetParticleWavelengthBiSec diff --git a/src/radiation/radiative_transfer/radtrans_output.f90 b/src/radiation/radiative_transfer/radtrans_output.f90 index 229be9526..a487c818d 100644 --- a/src/radiation/radiative_transfer/radtrans_output.f90 +++ b/src/radiation/radiative_transfer/radtrans_output.f90 @@ -41,22 +41,22 @@ SUBROUTINE WriteRadiationToHDF5() ! Writes Radiation values to HDF5 !=================================================================================================================================== ! MODULES - USE MOD_Globals - USE MOD_PreProc - USE MOD_io_HDF5 - USE MOD_HDF5_output ,ONLY: WriteArrayToHDF5,WriteAttributeToHDF5,WriteHDF5Header - USE MOD_Mesh_Vars ,ONLY: offsetElem,nGlobalElems, MeshFile - USE MOD_RadiationTrans_Vars ,ONLY: RadiationElemAbsEnergy_Shared, RadObservationPointMethod, RadObservation_Emission, RadObservationPoint - USE MOD_RadiationTrans_Vars ,ONLY: Radiation_Emission_Spec_Total, RadTransPhotPerCell, RadObservation_EmissionPart - USE MOD_RadiationTrans_Vars ,ONLY: ObservationDoConvolution, RadObservation_Emission_Conv, RadiationElemAbsEnergySpec_Shared - USE MOD_Globals_Vars ,ONLY: ProjectName - USE MOD_Particle_Mesh_Vars ,ONLY: ElemVolume_Shared - USE MOD_Radiation_Vars ,ONLY: RadiationSwitches, Radiation_ElemEnergy_Species, RadiationParameter, Radiation_Absorption_Spec - USE MOD_Particle_Vars ,ONLY: nSpecies - USE MOD_Mesh_Tools ,ONLY: GetCNElemID - USE MOD_Photon_TrackingOutput,ONLY:WritePhotonSurfSampleToHDF5 +USE MOD_Globals +USE MOD_PreProc +USE MOD_io_HDF5 +USE MOD_HDF5_output ,ONLY: WriteArrayToHDF5,WriteAttributeToHDF5,WriteHDF5Header +USE MOD_Mesh_Vars ,ONLY: offsetElem,nGlobalElems, MeshFile +USE MOD_RadiationTrans_Vars ,ONLY: RadiationElemAbsEnergy_Shared, RadObservationPointMethod, RadObservation_Emission, RadObservationPoint +USE MOD_RadiationTrans_Vars ,ONLY: Radiation_Emission_Spec_Total, RadTransPhotPerCell, RadObservation_EmissionPart +USE MOD_RadiationTrans_Vars ,ONLY: ObservationDoConvolution, RadObservation_Emission_Conv, RadiationElemAbsEnergySpec_Shared +USE MOD_Globals_Vars ,ONLY: ProjectName +USE MOD_Particle_Mesh_Vars ,ONLY: ElemVolume_Shared +USE MOD_Radiation_Vars ,ONLY: RadiationSwitches, Radiation_ElemEnergy_Species, RadiationParameter, Radiation_Absorption_Spec +USE MOD_Particle_Vars ,ONLY: nSpecies +USE MOD_Mesh_Tools ,ONLY: GetCNElemID +USE MOD_Photon_TrackingOutput,ONLY:WritePhotonSurfSampleToHDF5 ! IMPLICIT VARIABLE HANDLING - IMPLICIT NONE +IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- @@ -64,248 +64,238 @@ SUBROUTINE WriteRadiationToHDF5() !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- - CHARACTER(LEN=255) :: FileString,Statedummy - CHARACTER(LEN=255) :: SpecID - INTEGER :: nVal, iElem, nVar, iSpec, nVarCount, nVarSpec, CNElemID, iWave - REAL, ALLOCATABLE :: TempOutput(:,:) - CHARACTER(LEN=255), ALLOCATABLE :: StrVarNames(:) - REAL :: AbsTotal,tempSpecAbs, tmpPartNum, tmpEmission(2) - INTEGER :: iWavetmp(2) +CHARACTER(LEN=255) :: FileString,Statedummy +CHARACTER(LEN=255) :: SpecID +INTEGER :: nVal, iElem, nVar, iSpec, nVarCount, nVarSpec, CNElemID, iWave +REAL, ALLOCATABLE :: TempOutput(:,:) +CHARACTER(LEN=255), ALLOCATABLE :: StrVarNames(:) +REAL :: tmpPartNum, tmpEmission(2) +INTEGER :: iWavetmp(2) !=================================================================================================================================== - SWRITE(UNIT_stdOut,'(a)',ADVANCE='NO') ' WRITE Radiation TO HDF5 FILE...' - FileString=TRIM(ProjectName)//'_RadiationState.h5' - Statedummy = 'RadiationState' - IF (RadiationSwitches%RadType.EQ.1) THEN - nVarSpec=2 ! _Emission, _Absorption - nVar=nVarSpec*nSpecies+5 ! nVarSpec + Total_Emission, Total_Absorption, Total_Heatflux, and Total_PhotonNum - ELSE - nVar=4 - END IF +SWRITE(UNIT_stdOut,'(a)',ADVANCE='NO') ' WRITE Radiation TO HDF5 FILE...' +FileString=TRIM(ProjectName)//'_RadiationState.h5' +Statedummy = 'RadiationState' +IF (RadiationSwitches%RadType.EQ.1) THEN + nVarSpec=2 ! _Emission, _Absorption + nVar=nVarSpec*nSpecies+5 ! nVarSpec + Total_Emission, Total_Absorption, Total_Heatflux, and Total_PhotonNum +ELSE + nVar=4 +END IF - ALLOCATE(StrVarNames(nVar)) - ALLOCATE(TempOutput(nVar, PP_nElems)) +ALLOCATE(StrVarNames(nVar)) +ALLOCATE(TempOutput(nVar, PP_nElems)) - IF (RadiationSwitches%RadType.EQ.1) THEN - nVarCount=0 - DO iSpec=1, nSpecies - WRITE(SpecID,'(I3.3)') iSpec - StrVarNames(nVarCount+1)='Spec'//TRIM(SpecID)//'_Emission' - StrVarNames(nVarCount+2)='Spec'//TRIM(SpecID)//'_Absorption' - nVarCount=nVarCount+nVarSpec +IF (RadiationSwitches%RadType.EQ.1) THEN + nVarCount=0 + DO iSpec=1, nSpecies + WRITE(SpecID,'(I3.3)') iSpec + StrVarNames(nVarCount+1)='Spec'//TRIM(SpecID)//'_Emission' + StrVarNames(nVarCount+2)='Spec'//TRIM(SpecID)//'_Absorption' + nVarCount=nVarCount+nVarSpec - END DO - StrVarNames(nVarCount+1)='Total_Emission' - StrVarNames(nVarCount+2)='Total_Absorption' - StrVarNames(nVarCount+3)='Total_Heatflux' - StrVarNames(nVarCount+4)='Total_PhotonNum' - StrVarNames(nVarCount+5)='Mean_OpticalDepth' - ELSE - StrVarNames(1)='Total_Emission' - StrVarNames(2)='Total_Absorption' - StrVarNames(3)='Total_Heatflux' - StrVarNames(4)='Total_PhotonNum' - END IF + END DO + StrVarNames(nVarCount+1)='Total_Emission' + StrVarNames(nVarCount+2)='Total_Absorption' + StrVarNames(nVarCount+3)='Total_Heatflux' + StrVarNames(nVarCount+4)='Total_PhotonNum' + StrVarNames(nVarCount+5)='Mean_OpticalDepth' +ELSE + StrVarNames(1)='Total_Emission' + StrVarNames(2)='Total_Absorption' + StrVarNames(3)='Total_Heatflux' + StrVarNames(4)='Total_PhotonNum' +END IF - IF(MPIRoot) THEN - CALL OpenDataFile(FileString,create=.TRUE.,single=.TRUE.,readOnly=.FALSE.) - CALL WriteHDF5Header(Statedummy,File_ID) - CALL WriteAttributeToHDF5(File_ID,'VarNamesAdd',nVar,StrArray=StrVarNames) - CALL WriteAttributeToHDF5(File_ID,'MeshFile',1,StrScalar=(/TRIM(MeshFile)/)) - CALL CloseDataFile() - END IF +IF(MPIRoot) THEN + CALL OpenDataFile(FileString,create=.TRUE.,single=.TRUE.,readOnly=.FALSE.) + CALL WriteHDF5Header(Statedummy,File_ID) + CALL WriteAttributeToHDF5(File_ID,'VarNamesAdd',nVar,StrArray=StrVarNames) + CALL WriteAttributeToHDF5(File_ID,'MeshFile',1,StrScalar=(/TRIM(MeshFile)/)) + CALL CloseDataFile() +END IF #if USE_MPI - CALL MPI_ExchangeRadiationInfo() +CALL MPI_ExchangeRadiationInfo() #endif /*USE_MPI*/ - CALL OpenDataFile(FileString,create=.false.,single=.FALSE.,readOnly=.FALSE.,communicatorOpt=MPI_COMM_WORLD) - - IF (RadiationSwitches%RadType.EQ.1) THEN - DO iElem=1,PP_nElems - CNElemID = GetCNElemID(iElem+offSetElem) - nVarCount=0 -! AbsTotal=0. -! DO iSpec=1, nSpecies ! Sum over absorbtion coefficient to determine absorbed energy portion per species -! AbsTotal = AbsTotal + Radiation_ElemEnergy_Species(iSpec,CNElemID,2) -! END DO - DO iSpec=1, nSpecies - TempOutput(nVarCount+1, iElem) = Radiation_ElemEnergy_Species(iSpec,CNElemID,1) -! TempOutput(nVarCount+2, iElem) = Radiation_ElemEnergy_Species(iSpec,iElem,2) !abs coefficient -! IF (AbsTotal.GT.0) THEN -! tempSpecAbs = Radiation_ElemEnergy_Species(iSpec,CNElemID,2)/AbsTotal * RadiationElemAbsEnergy_Shared(1,iElem+offSetElem)/ ElemVolume_Shared(CNElemID) -! ELSE -! tempSpecAbs = 0.0 -! END IF - TempOutput(nVarCount+2, iElem) = RadiationElemAbsEnergySpec_Shared(iSpec, iElem+offSetElem)/ ElemVolume_Shared(CNElemID) !MAX(tempSpecAbs,0.) !lost energy - nVarCount=nVarCount+nVarSpec - END DO - TempOutput((nVarSpec*nSpecies+1), iElem) = Radiation_Emission_Spec_Total(CNElemID) ! SUM(Radiation_ElemEnergy_Species(:,CNElemID,1)) - TempOutput((nVarSpec*nSpecies+2), iElem) = SUM(RadiationElemAbsEnergySpec_Shared(:, iElem+offSetElem))/ ElemVolume_Shared(CNElemID) - TempOutput(nVarSpec*nSpecies+3, iElem) = SUM(Radiation_ElemEnergy_Species(:,CNElemID,1))- SUM(RadiationElemAbsEnergySpec_Shared(:, iElem+offSetElem))/ ElemVolume_Shared(CNElemID) - TempOutput(nVarSpec*nSpecies+4, iElem) = RadTransPhotPerCell(CNElemID) - IF (RadiationElemAbsEnergy_Shared(2,iElem+offSetElem).GT.0) THEN - TempOutput(nVarSpec*nSpecies+5, iElem) = RadiationElemAbsEnergy_Shared(1,iElem+offSetElem)/RadiationElemAbsEnergy_Shared(2,iElem+offSetElem) - ELSE - TempOutput(nVarSpec*nSpecies+5, iElem) = 0.0 - END IF - END DO - ELSE IF (RadiationSwitches%RadType.EQ.2) THEN - DO iElem=1, PP_nElems - CNElemID = GetCNElemID(iElem+offSetElem) - TempOutput(1, iElem) = Radiation_Emission_Spec_Total(CNElemID) - TempOutput(2, iElem) = RadiationElemAbsEnergySpec_Shared(1,iElem+offSetElem)/ElemVolume_Shared(CNElemID) - TempOutput(3, iElem) = Radiation_Emission_Spec_Total(CNElemID)- RadiationElemAbsEnergySpec_Shared(1,iElem+offSetElem)/ElemVolume_Shared(CNElemID) - TempOutput(4, iElem) = RadTransPhotPerCell(CNElemID) +CALL OpenDataFile(FileString,create=.false.,single=.FALSE.,readOnly=.FALSE.,communicatorOpt=MPI_COMM_WORLD) + +IF (RadiationSwitches%RadType.EQ.1) THEN + DO iElem=1,PP_nElems + CNElemID = GetCNElemID(iElem+offSetElem) + nVarCount=0 + DO iSpec=1, nSpecies + TempOutput(nVarCount+1, iElem) = Radiation_ElemEnergy_Species(iSpec,CNElemID,1) + TempOutput(nVarCount+2, iElem) = RadiationElemAbsEnergySpec_Shared(iSpec, iElem+offSetElem)/ ElemVolume_Shared(CNElemID) + nVarCount=nVarCount+nVarSpec END DO - ELSE IF (RadiationSwitches%RadType.EQ.3) THEN - DO iElem=1, PP_nElems - CNElemID = GetCNElemID(iElem+offSetElem) - TempOutput(1, iElem) = Radiation_Emission_Spec_Total(CNElemID) - TempOutput(2, iElem) = 0.0 - DO iWave = 1, RadiationParameter%WaveLenDiscr - TempOutput(2, iElem) = TempOutput(2, iElem) + Radiation_Absorption_Spec(iWave, iElem+offSetElem) * RadiationParameter%WaveLenIncr - END DO - TempOutput(3, iElem) = Radiation_Emission_Spec_Total(CNElemID) - TempOutput(2, iElem) - TempOutput(4, iElem) = RadTransPhotPerCell(CNElemID) + TempOutput((nVarSpec*nSpecies+1), iElem) = Radiation_Emission_Spec_Total(CNElemID) + TempOutput((nVarSpec*nSpecies+2), iElem) = SUM(RadiationElemAbsEnergySpec_Shared(:, iElem+offSetElem))/ ElemVolume_Shared(CNElemID) + TempOutput(nVarSpec*nSpecies+3, iElem) = SUM(Radiation_ElemEnergy_Species(:,CNElemID,1))- SUM(RadiationElemAbsEnergySpec_Shared(:, iElem+offSetElem))/ ElemVolume_Shared(CNElemID) + TempOutput(nVarSpec*nSpecies+4, iElem) = RadTransPhotPerCell(CNElemID) + IF (RadiationElemAbsEnergy_Shared(2,iElem+offSetElem).GT.0) THEN + TempOutput(nVarSpec*nSpecies+5, iElem) = RadiationElemAbsEnergy_Shared(1,iElem+offSetElem)/RadiationElemAbsEnergy_Shared(2,iElem+offSetElem) + ELSE + TempOutput(nVarSpec*nSpecies+5, iElem) = 0.0 + END IF + END DO +ELSE IF (RadiationSwitches%RadType.EQ.2) THEN + DO iElem=1, PP_nElems + CNElemID = GetCNElemID(iElem+offSetElem) + TempOutput(1, iElem) = Radiation_Emission_Spec_Total(CNElemID) + TempOutput(2, iElem) = RadiationElemAbsEnergySpec_Shared(1,iElem+offSetElem)/ElemVolume_Shared(CNElemID) + TempOutput(3, iElem) = Radiation_Emission_Spec_Total(CNElemID)- RadiationElemAbsEnergySpec_Shared(1,iElem+offSetElem)/ElemVolume_Shared(CNElemID) + TempOutput(4, iElem) = RadTransPhotPerCell(CNElemID) + END DO +ELSE IF (RadiationSwitches%RadType.EQ.3) THEN + DO iElem=1, PP_nElems + CNElemID = GetCNElemID(iElem+offSetElem) + TempOutput(1, iElem) = Radiation_Emission_Spec_Total(CNElemID) + TempOutput(2, iElem) = 0.0 + DO iWave = 1, RadiationParameter%WaveLenDiscr + TempOutput(2, iElem) = TempOutput(2, iElem) + Radiation_Absorption_Spec(iWave, iElem+offSetElem) * RadiationParameter%WaveLenIncr END DO - ELSE IF (RadiationSwitches%RadType.EQ.4) THEN - DO iElem=1, PP_nElems - CNElemID = GetCNElemID(iElem+offSetElem) - TempOutput(1, iElem) = Radiation_Emission_Spec_Total(CNElemID) - TempOutput(2, iElem) = 0.0 - DO iWave = 1, RadiationParameter%WaveLenDiscr - TempOutput(2, iElem) = TempOutput(2, iElem) + Radiation_Absorption_Spec(iWave, iElem+offSetElem) * RadiationParameter%WaveLenIncr - END DO - TempOutput(3, iElem) = Radiation_Emission_Spec_Total(CNElemID) - TempOutput(2, iElem) - TempOutput(4, iElem) = RadTransPhotPerCell(CNElemID) + TempOutput(3, iElem) = Radiation_Emission_Spec_Total(CNElemID) - TempOutput(2, iElem) + TempOutput(4, iElem) = RadTransPhotPerCell(CNElemID) + END DO +ELSE IF (RadiationSwitches%RadType.EQ.4) THEN + DO iElem=1, PP_nElems + CNElemID = GetCNElemID(iElem+offSetElem) + TempOutput(1, iElem) = Radiation_Emission_Spec_Total(CNElemID) + TempOutput(2, iElem) = 0.0 + DO iWave = 1, RadiationParameter%WaveLenDiscr + TempOutput(2, iElem) = TempOutput(2, iElem) + Radiation_Absorption_Spec(iWave, iElem+offSetElem) * RadiationParameter%WaveLenIncr END DO - ELSE - CALL abort(__STAMP__,' ERROR: Radiation type is not implemented! (unknown case)') - END IF - - nVal=nGlobalElems ! For the MPI case this must be replaced by the global number of elements (sum over all procs) - ASSOCIATE (& - nVar => INT(nVar,IK) ,& - nGlobalElems => INT(nGlobalElems,IK) ,& - offsetElem => INT(offsetElem,IK) ,& - PP_nElems => INT(PP_nElems,IK)) - CALL WriteArrayToHDF5(DataSetName='ElemData', rank=2,& - nValGlobal=(/nVar, nGlobalElems/),& - nVal= (/nVar, PP_nElems/),& - offset= (/0_IK, offsetElem /),& - collective=.TRUE., RealArray=TempOutput(:,:)) - END ASSOCIATE - CALL CloseDataFile() - SWRITE(*,*) 'DONE' - - CALL WritePhotonSurfSampleToHDF5() + TempOutput(3, iElem) = Radiation_Emission_Spec_Total(CNElemID) - TempOutput(2, iElem) + TempOutput(4, iElem) = RadTransPhotPerCell(CNElemID) + END DO +ELSE + CALL abort(__STAMP__,' ERROR: Radiation type is not implemented! (unknown case)') +END IF - IF (RadObservationPointMethod.GT.0) THEN - IF (myRank.EQ.0) THEN - CALL MPI_REDUCE(MPI_IN_PLACE,RadObservation_Emission,RadiationParameter%WaveLenDiscrCoarse,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_WORLD,IERROR) - ELSE - CALL MPI_REDUCE(RadObservation_Emission,0 ,RadiationParameter%WaveLenDiscrCoarse,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_WORLD,IERROR) - ENDIF - IF (myRank.EQ.0) THEN - CALL MPI_REDUCE(MPI_IN_PLACE,RadObservation_EmissionPart,RadiationParameter%WaveLenDiscrCoarse,MPI_INTEGER,MPI_SUM,0,MPI_COMM_WORLD,IERROR) - ELSE - CALL MPI_REDUCE(RadObservation_EmissionPart,0 ,RadiationParameter%WaveLenDiscrCoarse,MPI_INTEGER,MPI_SUM,0,MPI_COMM_WORLD,IERROR) - ENDIF - IF (myRank.EQ.0) THEN - IF(ObservationDoConvolution) THEN - CALL SpectralConvolution(RadObservation_Emission,RadObservation_Emission_Conv) - OPEN(unit=20,file='Radiation_ObservationPoint.csv', status='replace',action='write') - WRITE(20,*) 'x,y1,y2,y3' - IF (RadObservationPointMethod.EQ.1) THEN - IF (RadiationParameter%WaveLenReductionFactor.NE.1) THEN +nVal=nGlobalElems ! For the MPI case this must be replaced by the global number of elements (sum over all procs) +ASSOCIATE (& + nVar => INT(nVar,IK) ,& + nGlobalElems => INT(nGlobalElems,IK) ,& + offsetElem => INT(offsetElem,IK) ,& + PP_nElems => INT(PP_nElems,IK)) + CALL WriteArrayToHDF5(DataSetName='ElemData', rank=2,& + nValGlobal=(/nVar, nGlobalElems/),& + nVal= (/nVar, PP_nElems/),& + offset= (/0_IK, offsetElem /),& + collective=.TRUE., RealArray=TempOutput(:,:)) +END ASSOCIATE +CALL CloseDataFile() +SWRITE(*,*) 'DONE' + +CALL WritePhotonSurfSampleToHDF5() + +IF (RadObservationPointMethod.GT.0) THEN + IF (myRank.EQ.0) THEN + CALL MPI_REDUCE(MPI_IN_PLACE,RadObservation_Emission,RadiationParameter%WaveLenDiscrCoarse,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_WORLD,IERROR) + ELSE + CALL MPI_REDUCE(RadObservation_Emission,0 ,RadiationParameter%WaveLenDiscrCoarse,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_WORLD,IERROR) + ENDIF + IF (myRank.EQ.0) THEN + CALL MPI_REDUCE(MPI_IN_PLACE,RadObservation_EmissionPart,RadiationParameter%WaveLenDiscrCoarse,MPI_INTEGER,MPI_SUM,0,MPI_COMM_WORLD,IERROR) + ELSE + CALL MPI_REDUCE(RadObservation_EmissionPart,0 ,RadiationParameter%WaveLenDiscrCoarse,MPI_INTEGER,MPI_SUM,0,MPI_COMM_WORLD,IERROR) + ENDIF + IF (myRank.EQ.0) THEN + IF(ObservationDoConvolution) THEN + CALL SpectralConvolution(RadObservation_Emission,RadObservation_Emission_Conv) + OPEN(unit=20,file='Radiation_ObservationPoint.csv', status='replace',action='write') + WRITE(20,*) 'x,y1,y2,y3' + IF (RadObservationPointMethod.EQ.1) THEN + IF (RadiationParameter%WaveLenReductionFactor.NE.1) THEN + DO iWave=1, RadiationParameter%WaveLenDiscrCoarse + WRITE(20,*) RadiationParameter%WaveLenCoarse(iWave)*1.E10,',',RadObservation_Emission(iWave)/RadObservationPoint%Area,',',RadObservation_EmissionPart(iWave),',',RadObservation_Emission_Conv(iWave)/RadObservationPoint%Area + END DO + ELSE + IF (RadiationParameter%WaveLenReductionFactorOutput.GT.1) THEN + tmpPartNum=0.; tmpEmission=0.; iWavetmp(1)=0; iWavetmp(2)=1 DO iWave=1, RadiationParameter%WaveLenDiscrCoarse - WRITE(20,*) RadiationParameter%WaveLenCoarse(iWave)*1.E10,',',RadObservation_Emission(iWave)/RadObservationPoint%Area,',',RadObservation_EmissionPart(iWave),',',RadObservation_Emission_Conv(iWave)/RadObservationPoint%Area + IF (MOD(iWave,RadiationParameter%WaveLenReductionFactorOutput).EQ.0) THEN + iWavetmp(1) = iWavetmp(1) + 1 + tmpPartNum = tmpPartNum + RadObservation_EmissionPart(iWave) + tmpEmission(1) = tmpEmission(1) + RadObservation_Emission(iWave) + tmpEmission(2) = tmpEmission(2) + RadObservation_Emission_Conv(iWave) + WRITE(20,*) (RadiationParameter%WaveLen(iWavetmp(2))+RadiationParameter%WaveLen(iWavetmp(2)+iWavetmp(1)-1))/2.*1.E10,',',tmpEmission(1)/RadObservationPoint%Area,',',tmpPartNum,',',tmpEmission(2)/RadObservationPoint%Area + tmpPartNum = 0.; tmpEmission= 0. + iWavetmp(1)=0; iWavetmp(2)=iWave + ELSE + iWavetmp(1) = iWavetmp(1) + 1 + tmpPartNum = tmpPartNum + RadObservation_EmissionPart(iWave) + tmpEmission(1) = tmpEmission(1) + RadObservation_Emission(iWave) + tmpEmission(2) = tmpEmission(2) + RadObservation_Emission_Conv(iWave) + END IF END DO ELSE - IF (RadiationParameter%WaveLenReductionFactorOutput.GT.1) THEN - tmpPartNum=0.; tmpEmission=0.; iWavetmp(1)=0; iWavetmp(2)=1 - DO iWave=1, RadiationParameter%WaveLenDiscrCoarse - IF (MOD(iWave,RadiationParameter%WaveLenReductionFactorOutput).EQ.0) THEN - iWavetmp(1) = iWavetmp(1) + 1 - tmpPartNum = tmpPartNum + RadObservation_EmissionPart(iWave) - tmpEmission(1) = tmpEmission(1) + RadObservation_Emission(iWave) - tmpEmission(2) = tmpEmission(2) + RadObservation_Emission_Conv(iWave) - WRITE(20,*) (RadiationParameter%WaveLen(iWavetmp(2))+RadiationParameter%WaveLen(iWavetmp(2)+iWavetmp(1)-1))/2.*1.E10,',',tmpEmission(1)/RadObservationPoint%Area,',',tmpPartNum,',',tmpEmission(2)/RadObservationPoint%Area - tmpPartNum = 0.; tmpEmission= 0. - iWavetmp(1)=0; iWavetmp(2)=iWave - ELSE - iWavetmp(1) = iWavetmp(1) + 1 - tmpPartNum = tmpPartNum + RadObservation_EmissionPart(iWave) - tmpEmission(1) = tmpEmission(1) + RadObservation_Emission(iWave) - tmpEmission(2) = tmpEmission(2) + RadObservation_Emission_Conv(iWave) - END IF - END DO - ELSE - DO iWave=1, RadiationParameter%WaveLenDiscrCoarse - WRITE(20,*) RadiationParameter%WaveLen(iWave)*1.E10,',',RadObservation_Emission(iWave)/RadObservationPoint%Area,',',RadObservation_EmissionPart(iWave),',',RadObservation_Emission_Conv(iWave)/RadObservationPoint%Area - END DO - END IF - END IF - ELSEIF (RadObservationPointMethod.EQ.2) THEN - IF (RadiationParameter%WaveLenReductionFactor.NE.1) THEN DO iWave=1, RadiationParameter%WaveLenDiscrCoarse - WRITE(20,*) RadiationParameter%WaveLenCoarse(iWave)*1.E10,',',RadObservation_Emission(iWave),',',RadObservation_EmissionPart(iWave),',',RadObservation_Emission_Conv(iWave) + WRITE(20,*) RadiationParameter%WaveLen(iWave)*1.E10,',',RadObservation_Emission(iWave)/RadObservationPoint%Area,',',RadObservation_EmissionPart(iWave),',',RadObservation_Emission_Conv(iWave)/RadObservationPoint%Area END DO - ELSE - IF (RadiationParameter%WaveLenReductionFactorOutput.GT.1) THEN - tmpPartNum=0.; tmpEmission=0.; iWavetmp(1)=0; iWavetmp(2)=1 - DO iWave=1, RadiationParameter%WaveLenDiscrCoarse - IF (MOD(iWave,RadiationParameter%WaveLenReductionFactorOutput).EQ.0) THEN - iWavetmp(1) = iWavetmp(1) + 1 - tmpPartNum = tmpPartNum + RadObservation_EmissionPart(iWave) - tmpEmission(1) = tmpEmission(1) + RadObservation_Emission(iWave) - tmpEmission(2) = tmpEmission(2) + RadObservation_Emission_Conv(iWave) - WRITE(20,*) (RadiationParameter%WaveLen(iWavetmp(2))+RadiationParameter%WaveLen(iWavetmp(2)+iWavetmp(1)-1))/2.*1.E10,',',tmpEmission(1),',',tmpPartNum,',',tmpEmission(2) - tmpPartNum = 0.; tmpEmission= 0. - iWavetmp(1)=0; iWavetmp(2)=iWave - ELSE - iWavetmp(1) = iWavetmp(1) + 1 - tmpPartNum = tmpPartNum + RadObservation_EmissionPart(iWave) - tmpEmission(1) = tmpEmission(1) + RadObservation_Emission(iWave) - tmpEmission(2) = tmpEmission(2) + RadObservation_Emission_Conv(iWave) - END IF - END DO - ELSE - DO iWave=1, RadiationParameter%WaveLenDiscrCoarse - WRITE(20,*) RadiationParameter%WaveLen(iWave)*1.E10,',',RadObservation_Emission(iWave),',',RadObservation_EmissionPart(iWave),',',RadObservation_Emission_Conv(iWave) - END DO - END IF END IF END IF - CLOSE(unit=20) - ELSE - OPEN(unit=20,file='Radiation_ObservationPoint.csv', status='replace',action='write') - WRITE(20,*) 'x,y1,y2' - IF (RadObservationPointMethod.EQ.1) THEN - IF (RadiationParameter%WaveLenReductionFactor.NE.1) THEN + ELSEIF (RadObservationPointMethod.EQ.2) THEN + IF (RadiationParameter%WaveLenReductionFactor.NE.1) THEN + DO iWave=1, RadiationParameter%WaveLenDiscrCoarse + WRITE(20,*) RadiationParameter%WaveLenCoarse(iWave)*1.E10,',',RadObservation_Emission(iWave),',',RadObservation_EmissionPart(iWave),',',RadObservation_Emission_Conv(iWave) + END DO + ELSE + IF (RadiationParameter%WaveLenReductionFactorOutput.GT.1) THEN + tmpPartNum=0.; tmpEmission=0.; iWavetmp(1)=0; iWavetmp(2)=1 DO iWave=1, RadiationParameter%WaveLenDiscrCoarse - WRITE(20,*) RadiationParameter%WaveLenCoarse(iWave)*1.E10,',',RadObservation_Emission(iWave)/RadObservationPoint%Area,',',RadObservation_EmissionPart(iWave) + IF (MOD(iWave,RadiationParameter%WaveLenReductionFactorOutput).EQ.0) THEN + iWavetmp(1) = iWavetmp(1) + 1 + tmpPartNum = tmpPartNum + RadObservation_EmissionPart(iWave) + tmpEmission(1) = tmpEmission(1) + RadObservation_Emission(iWave) + tmpEmission(2) = tmpEmission(2) + RadObservation_Emission_Conv(iWave) + WRITE(20,*) (RadiationParameter%WaveLen(iWavetmp(2))+RadiationParameter%WaveLen(iWavetmp(2)+iWavetmp(1)-1))/2.*1.E10,',',tmpEmission(1),',',tmpPartNum,',',tmpEmission(2) + tmpPartNum = 0.; tmpEmission= 0. + iWavetmp(1)=0; iWavetmp(2)=iWave + ELSE + iWavetmp(1) = iWavetmp(1) + 1 + tmpPartNum = tmpPartNum + RadObservation_EmissionPart(iWave) + tmpEmission(1) = tmpEmission(1) + RadObservation_Emission(iWave) + tmpEmission(2) = tmpEmission(2) + RadObservation_Emission_Conv(iWave) + END IF END DO ELSE DO iWave=1, RadiationParameter%WaveLenDiscrCoarse - WRITE(20,*) RadiationParameter%WaveLen(iWave)*1.E10,',',RadObservation_Emission(iWave)/RadObservationPoint%Area,',',RadObservation_EmissionPart(iWave) - END DO - END IF - ELSEIF (RadObservationPointMethod.EQ.2) THEN - IF (RadiationParameter%WaveLenReductionFactor.NE.1) THEN - DO iWave=1, RadiationParameter%WaveLenDiscrCoarse - WRITE(20,*) RadiationParameter%WaveLenCoarse(iWave)*1.E10,',',RadObservation_Emission(iWave),',',RadObservation_EmissionPart(iWave) - END DO - ELSE - DO iWave=1, RadiationParameter%WaveLenDiscrCoarse - WRITE(20,*) RadiationParameter%WaveLen(iWave)*1.E10,',',RadObservation_Emission(iWave),',',RadObservation_EmissionPart(iWave) + WRITE(20,*) RadiationParameter%WaveLen(iWave)*1.E10,',',RadObservation_Emission(iWave),',',RadObservation_EmissionPart(iWave),',',RadObservation_Emission_Conv(iWave) END DO END IF END IF - CLOSE(unit=20) END IF - + CLOSE(unit=20) + ELSE + OPEN(unit=20,file='Radiation_ObservationPoint.csv', status='replace',action='write') + WRITE(20,*) 'x,y1,y2' + IF (RadObservationPointMethod.EQ.1) THEN + IF (RadiationParameter%WaveLenReductionFactor.NE.1) THEN + DO iWave=1, RadiationParameter%WaveLenDiscrCoarse + WRITE(20,*) RadiationParameter%WaveLenCoarse(iWave)*1.E10,',',RadObservation_Emission(iWave)/RadObservationPoint%Area,',',RadObservation_EmissionPart(iWave) + END DO + ELSE + DO iWave=1, RadiationParameter%WaveLenDiscrCoarse + WRITE(20,*) RadiationParameter%WaveLen(iWave)*1.E10,',',RadObservation_Emission(iWave)/RadObservationPoint%Area,',',RadObservation_EmissionPart(iWave) + END DO + END IF + ELSEIF (RadObservationPointMethod.EQ.2) THEN + IF (RadiationParameter%WaveLenReductionFactor.NE.1) THEN + DO iWave=1, RadiationParameter%WaveLenDiscrCoarse + WRITE(20,*) RadiationParameter%WaveLenCoarse(iWave)*1.E10,',',RadObservation_Emission(iWave),',',RadObservation_EmissionPart(iWave) + END DO + ELSE + DO iWave=1, RadiationParameter%WaveLenDiscrCoarse + WRITE(20,*) RadiationParameter%WaveLen(iWave)*1.E10,',',RadObservation_Emission(iWave),',',RadObservation_EmissionPart(iWave) + END DO + END IF + END IF + CLOSE(unit=20) END IF + END IF +END IF END SUBROUTINE WriteRadiationToHDF5 @@ -316,14 +306,14 @@ SUBROUTINE MPI_ExchangeRadiationInfo() ! MPI routine for output of radiative transfer solver !=================================================================================================================================== ! MODULES - USE MOD_Globals - USE MOD_PreProc - USE MOD_RadiationTrans_Vars, ONLY : RadiationElemAbsEnergy, RadiationElemAbsEnergy_Shared, RadiationElemAbsEnergy_Shared_Win - USE MOD_RadiationTrans_Vars, ONLY : RadiationElemAbsEnergySpec, RadiationElemAbsEnergySpec_Shared, RadiationElemAbsEnergySpec_Shared_Win - USE MOD_Mesh_Vars, ONLY : nGlobalElems - USE MOD_MPI_Shared_Vars - USE MOD_MPI_Shared - USE MOD_Particle_Vars, ONLY: nSpecies +USE MOD_Globals +USE MOD_PreProc +USE MOD_RadiationTrans_Vars ,ONLY: RadiationElemAbsEnergy, RadiationElemAbsEnergy_Shared, RadiationElemAbsEnergy_Shared_Win +USE MOD_RadiationTrans_Vars ,ONLY: RadiationElemAbsEnergySpec, RadiationElemAbsEnergySpec_Shared, RadiationElemAbsEnergySpec_Shared_Win +USE MOD_Mesh_Vars ,ONLY: nGlobalElems +USE MOD_MPI_Shared_Vars +USE MOD_MPI_Shared +USE MOD_Particle_Vars ,ONLY: nSpecies ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -333,7 +323,7 @@ SUBROUTINE MPI_ExchangeRadiationInfo() !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- -INTEGER :: MessageSize, iELem +INTEGER :: MessageSize !=================================================================================================================================== ! collect the information from the proc-local shadow arrays in the compute-node shared array MessageSize = 2*nGlobalElems @@ -366,7 +356,7 @@ SUBROUTINE MPI_ExchangeRadiationInfo() IF(myComputeNodeRank.EQ.0)THEN CALL MPI_ALLREDUCE(MPI_IN_PLACE,RadiationElemAbsEnergySpec_Shared,MessageSize,MPI_DOUBLE_PRECISION,MPI_SUM,MPI_COMM_LEADERS_SHARED,iError) END IF - + CALL BARRIER_AND_SYNC(RadiationElemAbsEnergySpec_Shared_Win ,MPI_COMM_SHARED) END IF @@ -375,98 +365,97 @@ END SUBROUTINE MPI_ExchangeRadiationInfo SUBROUTINE SpectralConvolution(RadObservation_Emission, RadObservation_Emission_Conv) - !=================================================================================================================================== - ! calculates spectral concolution with slit function/instrumental broadening profile/spectral resolution function - !=================================================================================================================================== - ! MODULES - ! USE MOD_Globals - USE MOD_RadiationTrans_Vars ,ONLY: RadObservationPoint - USE MOD_Radiation_Vars ,ONLY : RadiationInput, RadiationParameter, SpeciesRadiation - ! IMPLICIT VARIABLE HANDLING - IMPLICIT NONE - !----------------------------------------------------------------------------------------------------------------------------------- - ! INPUT VARIABLES - REAL, INTENT(IN) :: RadObservation_Emission(:) - REAL, INTENT(INOUT) :: RadObservation_Emission_Conv(:) - !----------------------------------------------------------------------------------------------------------------------------------- - ! OUTPUT VARIABLES - !----------------------------------------------------------------------------------------------------------------------------------- - ! LOCAL VARIABLES - REAL :: topwidth, basewidth - INTEGER :: iWave_min, iWave, i - REAL :: topwidth_half, basewidth_half, slope - REAL :: wavelength_min_base, wavelength_max_base, wavelength_min_top, wavelength_max_top - INTEGER :: io_error, w - REAL :: fractionl, fractionr, delta_base, delta_top - !=================================================================================================================================== - - topwidth = RadObservationPoint%SlitFunction(1)*1.E-10 - basewidth = RadObservationPoint%SlitFunction(2)*1.E-10 - - iWave_min = 1!0 - - basewidth_half = 0.5 * basewidth - topwidth_half = 0.5 * topwidth - slope = 1. / (basewidth_half-topwidth_half) - RadObservation_Emission_Conv=0.0 - DO iWave=1, RadiationParameter%WaveLenDiscr - wavelength_min_base = RadiationParameter%WaveLen(iWave) - basewidth_half - wavelength_max_base = RadiationParameter%WaveLen(iWave) + basewidth_half - wavelength_min_top = RadiationParameter%WaveLen(iWave) - topwidth_half - wavelength_max_top = RadiationParameter%WaveLen(iWave) + topwidth_half -! --- start index determination - DO WHILE(RadiationParameter%WaveLen(iWave_min+1) .LT. wavelength_min_base) - iWave_min = iWave_min + 1 - END DO +!=================================================================================================================================== +! calculates spectral concolution with slit function/instrumental broadening profile/spectral resolution function +!=================================================================================================================================== +! MODULES +! USE MOD_Globals +USE MOD_RadiationTrans_Vars ,ONLY: RadObservationPoint +USE MOD_Radiation_Vars ,ONLY: RadiationParameter +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES +REAL, INTENT(IN) :: RadObservation_Emission(:) +REAL, INTENT(INOUT) :: RadObservation_Emission_Conv(:) +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +REAL :: topwidth, basewidth +INTEGER :: iWave_min, iWave, i +REAL :: topwidth_half, basewidth_half, slope +REAL :: wavelength_min_base, wavelength_max_base, wavelength_min_top, wavelength_max_top +REAL :: fractionl, fractionr, delta_base, delta_top +!=================================================================================================================================== -! --- slit function - DO i = iWave_min, RadiationParameter%WaveLenDiscr-1 - IF(RadiationParameter%WaveLen(i) .LT. wavelength_min_base) THEN - fractionl = 0. - IF(RadiationParameter%WaveLen(i+1) .GT. wavelength_min_top) THEN - STOP 'slit function: step width is too big!' - END IF - fractionr = slope * (RadiationParameter%WaveLen(i+1) - RadiationParameter%WaveLen(iWave) + basewidth_half) - delta_base = RadiationParameter%WaveLen(i+1) - wavelength_min_base - delta_top = 0. - ELSEIF(RadiationParameter%WaveLen(i+1) .LT. wavelength_min_top) THEN - fractionl = slope * (RadiationParameter%WaveLen(i ) - RadiationParameter%WaveLen(iWave) + basewidth_half) - fractionr = slope * (RadiationParameter%WaveLen(i+1) - RadiationParameter%WaveLen(iWave) + basewidth_half) - delta_base = RadiationParameter%WaveLenIncr - delta_top = 0. - ELSEIF(RadiationParameter%WaveLen(i ) .LT. wavelength_min_top) THEN - fractionl = slope * (RadiationParameter%WaveLen(i ) - RadiationParameter%WaveLen(iWave) + basewidth_half) - fractionr = 1. - delta_base = wavelength_min_top - RadiationParameter%WaveLen(i) - delta_top = RadiationParameter%WaveLen(i+1) - wavelength_min_top - ELSEIF(RadiationParameter%WaveLen(i+1) .LT. wavelength_max_top) THEN - delta_base = 0. - delta_top = RadiationParameter%WaveLenIncr - ELSEIF(RadiationParameter%WaveLen(i ) .LT. wavelength_max_top) THEN - fractionl = 1. - fractionr = - slope * (RadiationParameter%WaveLen(i+1) - RadiationParameter%WaveLen(iWave) - basewidth_half) - delta_base = RadiationParameter%WaveLen(i+1) - wavelength_max_top - delta_top = wavelength_max_top - RadiationParameter%WaveLen(i) - ELSEIF(RadiationParameter%WaveLen(i+1) .LT. wavelength_max_base) THEN - fractionl = - slope * (RadiationParameter%WaveLen(i ) - RadiationParameter%WaveLen(iWave) - basewidth_half) - fractionr = - slope * (RadiationParameter%WaveLen(i+1) - RadiationParameter%WaveLen(iWave) - basewidth_half) - delta_base = RadiationParameter%WaveLenIncr - delta_top = 0. - ELSEIF(RadiationParameter%WaveLen(i) .LT. wavelength_max_base) THEN - fractionl = - slope * (RadiationParameter%WaveLen(i ) - RadiationParameter%WaveLen(iWave) - basewidth_half) - fractionr = 0. - delta_base = wavelength_max_base - RadiationParameter%WaveLen(i) - delta_top = 0. - ELSE - exit +topwidth = RadObservationPoint%SlitFunction(1)*1.E-10 +basewidth = RadObservationPoint%SlitFunction(2)*1.E-10 + +iWave_min = 1!0 + +basewidth_half = 0.5 * basewidth +topwidth_half = 0.5 * topwidth +slope = 1. / (basewidth_half-topwidth_half) +RadObservation_Emission_Conv=0.0 +DO iWave=1, RadiationParameter%WaveLenDiscr + wavelength_min_base = RadiationParameter%WaveLen(iWave) - basewidth_half + wavelength_max_base = RadiationParameter%WaveLen(iWave) + basewidth_half + wavelength_min_top = RadiationParameter%WaveLen(iWave) - topwidth_half + wavelength_max_top = RadiationParameter%WaveLen(iWave) + topwidth_half + ! --- start index determination + DO WHILE(RadiationParameter%WaveLen(iWave_min+1) .LT. wavelength_min_base) + iWave_min = iWave_min + 1 + END DO + + ! --- slit function + DO i = iWave_min, RadiationParameter%WaveLenDiscr-1 + IF(RadiationParameter%WaveLen(i) .LT. wavelength_min_base) THEN + fractionl = 0. + IF(RadiationParameter%WaveLen(i+1) .GT. wavelength_min_top) THEN + STOP 'slit function: step width is too big!' END IF + fractionr = slope * (RadiationParameter%WaveLen(i+1) - RadiationParameter%WaveLen(iWave) + basewidth_half) + delta_base = RadiationParameter%WaveLen(i+1) - wavelength_min_base + delta_top = 0. + ELSEIF(RadiationParameter%WaveLen(i+1) .LT. wavelength_min_top) THEN + fractionl = slope * (RadiationParameter%WaveLen(i ) - RadiationParameter%WaveLen(iWave) + basewidth_half) + fractionr = slope * (RadiationParameter%WaveLen(i+1) - RadiationParameter%WaveLen(iWave) + basewidth_half) + delta_base = RadiationParameter%WaveLenIncr + delta_top = 0. + ELSEIF(RadiationParameter%WaveLen(i ) .LT. wavelength_min_top) THEN + fractionl = slope * (RadiationParameter%WaveLen(i ) - RadiationParameter%WaveLen(iWave) + basewidth_half) + fractionr = 1. + delta_base = wavelength_min_top - RadiationParameter%WaveLen(i) + delta_top = RadiationParameter%WaveLen(i+1) - wavelength_min_top + ELSEIF(RadiationParameter%WaveLen(i+1) .LT. wavelength_max_top) THEN + delta_base = 0. + delta_top = RadiationParameter%WaveLenIncr + ELSEIF(RadiationParameter%WaveLen(i ) .LT. wavelength_max_top) THEN + fractionl = 1. + fractionr = - slope * (RadiationParameter%WaveLen(i+1) - RadiationParameter%WaveLen(iWave) - basewidth_half) + delta_base = RadiationParameter%WaveLen(i+1) - wavelength_max_top + delta_top = wavelength_max_top - RadiationParameter%WaveLen(i) + ELSEIF(RadiationParameter%WaveLen(i+1) .LT. wavelength_max_base) THEN + fractionl = - slope * (RadiationParameter%WaveLen(i ) - RadiationParameter%WaveLen(iWave) - basewidth_half) + fractionr = - slope * (RadiationParameter%WaveLen(i+1) - RadiationParameter%WaveLen(iWave) - basewidth_half) + delta_base = RadiationParameter%WaveLenIncr + delta_top = 0. + ELSEIF(RadiationParameter%WaveLen(i) .LT. wavelength_max_base) THEN + fractionl = - slope * (RadiationParameter%WaveLen(i ) - RadiationParameter%WaveLen(iWave) - basewidth_half) + fractionr = 0. + delta_base = wavelength_max_base - RadiationParameter%WaveLen(i) + delta_top = 0. + ELSE + exit + END IF - RadObservation_Emission_Conv(iWave) = RadObservation_Emission_Conv(iWave) & - + ((fractionl+fractionr)*.5*delta_base+delta_top) & - * RadObservation_Emission(i+1)*1.E10 + RadObservation_Emission_Conv(iWave) = RadObservation_Emission_Conv(iWave) & + + ((fractionl+fractionr)*.5*delta_base+delta_top) & + * RadObservation_Emission(i+1)*1.E10 - END DO END DO +END DO END SUBROUTINE SpectralConvolution diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tools.f90.bak b/src/radiation/radiative_transfer/tracking/radtrans_tools.f90.bak new file mode 100644 index 000000000..45afa924f --- /dev/null +++ b/src/radiation/radiative_transfer/tracking/radtrans_tools.f90.bak @@ -0,0 +1,1176 @@ +!================================================================================================================================== +! Copyright (c) 2010 - 2018 Prof. Claus-Dieter Munz and Prof. Stefanos Fasoulas +! +! This file is part of PICLas (gitlab.com/piclas/piclas). PICLas is free software: you can redistribute it and/or modify +! it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 +! of the License, or (at your option) any later version. +! +! PICLas is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty +! of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License v3.0 for more details. +! +! You should have received a copy of the GNU General Public License along with PICLas. If not, see . +!================================================================================================================================== +#include "piclas.h" + +MODULE MOD_Photon_TrackingTools +!=================================================================================================================================== +! Routines for photon tracking in radiave transfer solver +!=================================================================================================================================== +! MODULES +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +PUBLIC + +INTERFACE PhotonThroughSideCheck3DFast + MODULE PROCEDURE PhotonThroughSideCheck3DFast +END INTERFACE + +PUBLIC :: PhotonThroughSideCheck3DFast, PhotonIntersectionWithSide, CalcAbsoprtion, PerfectPhotonReflection, DiffusePhotonReflection +PUBLIC :: CalcWallAbsoprtion, PointInObsCone, PhotonIntersectSensor, PhotonThroughSideCheck3DDir, PhotonIntersectionWithSide2DDir +PUBLIC :: PhotonIntersectionWithSide2D, RotatePhotonIn2DPlane, PerfectPhotonReflection2D,DiffusePhotonReflection2D, PhotonOnLineOfSight +!----------------------------------------------------------------------------------------------------------------------------------- +!----------------------------------------------------------------------------------------------------------------------------------- +!=================================================================================================================================== + +CONTAINS + + +SUBROUTINE PhotonThroughSideCheck3DFast(iLocSide,Element,ThroughSide,TriNum, IsMortar) +!=================================================================================================================================== +!> Routine to check whether a particle crossed the given triangle of a side. The determinant between the normalix_photon_startd trajectory +!> vector and the vectors from two of the three nodes to the old particle position is calculated. If the determinants for the three +!> possible combinations are greater than x_photon_startro, then the particle went through this triangle of the side. +!> Note that if this is a mortar side, the side of the small neighbouring mortar element has to be checked. Thus, the orientation +!> is reversed. +!=================================================================================================================================== +! MODULES +USE MOD_Globals_Vars ,ONLY: EpsMach +USE MOD_Particle_Mesh_Vars, ONLY : NodeCoords_Shared, ElemSideNodeID_Shared +USE MOD_RadiationTrans_Vars, ONLY:PhotonProps +USE MOD_Mesh_Tools ,ONLY: GetCNElemID +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +! INPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT/OUTPUT VARIABLES +INTEGER,INTENT(IN) :: iLocSide +INTEGER,INTENT(IN) :: Element +INTEGER,INTENT(IN) :: TriNum +LOGICAL,INTENT(OUT) :: ThroughSide +LOGICAL, INTENT(IN), OPTIONAL :: IsMortar +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +INTEGER :: CNElemID +INTEGER :: n, NodeID +REAL :: Px, Py, Pz +REAL :: Vx, Vy, Vz!, Vall +REAL :: xNode(3), yNode(3), zNode(3), Ax(3), Ay(3), Az(3) +REAL :: det(3) +!=================================================================================================================================== +CNElemID = GetCNElemID(Element) +ThroughSide = .FALSE. + +Px = PhotonProps%PhotonLastPos(1) +Py = PhotonProps%PhotonLastPos(2) +Pz = PhotonProps%PhotonLastPos(3) + +! Normalix_photon_startd particle trajectory (PartPos - lastPartPos)/ABS(PartPos - lastPartPos) +Vx = PhotonProps%PhotonDirection(1) +Vy = PhotonProps%PhotonDirection(2) +Vz = PhotonProps%PhotonDirection(3) +! Get the coordinates of the first node and the vector from the particle position to the node +xNode(1) = NodeCoords_Shared(1,ElemSideNodeID_Shared(1,iLocSide,CNElemID)+1) +yNode(1) = NodeCoords_Shared(2,ElemSideNodeID_Shared(1,iLocSide,CNElemID)+1) +zNode(1) = NodeCoords_Shared(3,ElemSideNodeID_Shared(1,iLocSide,CNElemID)+1) +Ax(1) = xNode(1) - Px +Ay(1) = yNode(1) - Py +Az(1) = zNode(1) - Pz +! Get the vectors to the other two nodes, depending on the triangle number +IF(PRESENT(IsMortar)) THEN + ! Note: reverse orientation in the mortar case, as the side is treated from the perspective of the smaller neighbouring element + ! (TriNum=1: NodeID=3,2; TriNum=2: NodeID=4,3) + xNode(2) = NodeCoords_Shared(1,ElemSideNodeID_Shared(2+TriNum,iLocSide,CNElemID)+1) + yNode(2) = NodeCoords_Shared(2,ElemSideNodeID_Shared(2+TriNum,iLocSide,CNElemID)+1) + zNode(2) = NodeCoords_Shared(3,ElemSideNodeID_Shared(2+TriNum,iLocSide,CNElemID)+1) + + Ax(2) = xNode(2) - Px + Ay(2) = yNode(2) - Py + Az(2) = zNode(2) - Pz + + xNode(3) = NodeCoords_Shared(1,ElemSideNodeID_Shared(1+TriNum,iLocSide,CNElemID)+1) + yNode(3) = NodeCoords_Shared(2,ElemSideNodeID_Shared(1+TriNum,iLocSide,CNElemID)+1) + zNode(3) = NodeCoords_Shared(3,ElemSideNodeID_Shared(1+TriNum,iLocSide,CNElemID)+1) + + Ax(3) = xNode(3) - Px + Ay(3) = yNode(3) - Py + Az(3) = zNode(3) - Pz +ELSE + DO n = 2,3 + NodeID = n+TriNum-1 ! m = true node number of the sides (TriNum=1: NodeID=2,3; TriNum=2: NodeID=3,4) + xNode(n) = NodeCoords_Shared(1,ElemSideNodeID_Shared(NodeID,iLocSide,CNElemID)+1) + yNode(n) = NodeCoords_Shared(2,ElemSideNodeID_Shared(NodeID,iLocSide,CNElemID)+1) + zNode(n) = NodeCoords_Shared(3,ElemSideNodeID_Shared(NodeID,iLocSide,CNElemID)+1) + + Ax(n) = xNode(n) - Px + Ay(n) = yNode(n) - Py + Az(n) = zNode(n) - Pz + END DO +END IF +!--- check whether v and the vectors from the particle to the two edge nodes build +!--- a right-hand-szstem. If yes for all edges: vector goes potentially through side +det(1) = ((Ay(1) * Vz - Az(1) * Vy) * Ax(3) + & + (Az(1) * Vx - Ax(1) * Vz) * Ay(3) + & + (Ax(1) * Vy - Ay(1) * Vx) * Az(3)) + +det(2) = ((Ay(2) * Vz - Az(2) * Vy) * Ax(1) + & + (Az(2) * Vx - Ax(2) * Vz) * Ay(1) + & + (Ax(2) * Vy - Ay(2) * Vx) * Az(1)) + +det(3) = ((Ay(3) * Vz - Az(3) * Vy) * Ax(2) + & + (Az(3) * Vx - Ax(3) * Vz) * Ay(2) + & + (Ax(3) * Vy - Ay(3) * Vx) * Az(2)) + +! Comparison of the determinants with eps, where a x_photon_startro is stored (due to machine precision) +IF ((det(1).ge.-epsMach).AND.(det(2).ge.-epsMach).AND.(det(3).ge.-epsMach)) THEN + ThroughSide = .TRUE. +END IF + +RETURN + +END SUBROUTINE PhotonThroughSideCheck3DFast + + +SUBROUTINE PhotonThroughSideCheck3DDir(iLocSide,CNElemID,ThroughSide,TriNum,StartPoint,Dir) +!=================================================================================================================================== +!> Routine to check whether a particle crossed the given triangle of a side. The determinant between the normalix_photon_startd trajectory +!> vector and the vectors from two of the three nodes to the old particle position is calculated. If the determinants for the three +!> possible combinations are greater than x_photon_startro, then the particle went through this triangle of the side. +!> Note that if this is a mortar side, the side of the small neighbouring mortar element has to be checked. Thus, the orientation +!> is reversed. +!=================================================================================================================================== +! MODULES +USE MOD_Globals_Vars ,ONLY: EpsMach +USE MOD_Particle_Mesh_Vars, ONLY : NodeCoords_Shared, ElemSideNodeID_Shared +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +! INPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT/OUTPUT VARIABLES +INTEGER,INTENT(IN) :: iLocSide +INTEGER,INTENT(IN) :: CNElemID +INTEGER,INTENT(IN) :: TriNum +LOGICAL,INTENT(OUT) :: ThroughSide +REAL, INTENT(IN) :: StartPoint(3), Dir(3) +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +INTEGER :: n, NodeID +REAL :: Px, Py, Pz +REAL :: Vx, Vy, Vz!, Vall +REAL :: xNode(3), yNode(3), zNode(3), Ax(3), Ay(3), Az(3) +REAL :: det(3) +!=================================================================================================================================== +ThroughSide = .FALSE. + +Px = StartPoint(1) +Py = StartPoint(2) +Pz = StartPoint(3) + +! Normalix_photon_startd particle trajectory (PartPos - lastPartPos)/ABS(PartPos - lastPartPos) +Vx = Dir(1) +Vy = Dir(2) +Vz = Dir(3) +! Get the coordinates of the first node and the vector from the particle position to the node +xNode(1) = NodeCoords_Shared(1,ElemSideNodeID_Shared(1,iLocSide,CNElemID)+1) +yNode(1) = NodeCoords_Shared(2,ElemSideNodeID_Shared(1,iLocSide,CNElemID)+1) +zNode(1) = NodeCoords_Shared(3,ElemSideNodeID_Shared(1,iLocSide,CNElemID)+1) +Ax(1) = xNode(1) - Px +Ay(1) = yNode(1) - Py +Az(1) = zNode(1) - Pz +! Get the vectors to the other two nodes, depending on the triangle number + +DO n = 2,3 + NodeID = n+TriNum-1 ! m = true node number of the sides (TriNum=1: NodeID=2,3; TriNum=2: NodeID=3,4) + xNode(n) = NodeCoords_Shared(1,ElemSideNodeID_Shared(NodeID,iLocSide,CNElemID)+1) + yNode(n) = NodeCoords_Shared(2,ElemSideNodeID_Shared(NodeID,iLocSide,CNElemID)+1) + zNode(n) = NodeCoords_Shared(3,ElemSideNodeID_Shared(NodeID,iLocSide,CNElemID)+1) + + Ax(n) = xNode(n) - Px + Ay(n) = yNode(n) - Py + Az(n) = zNode(n) - Pz +END DO + +!--- check whether v and the vectors from the particle to the two edge nodes build +!--- a right-hand-szstem. If yes for all edges: vector goes potentially through side +det(1) = ((Ay(1) * Vz - Az(1) * Vy) * Ax(3) + & + (Az(1) * Vx - Ax(1) * Vz) * Ay(3) + & + (Ax(1) * Vy - Ay(1) * Vx) * Az(3)) + +det(2) = ((Ay(2) * Vz - Az(2) * Vy) * Ax(1) + & + (Az(2) * Vx - Ax(2) * Vz) * Ay(1) + & + (Ax(2) * Vy - Ay(2) * Vx) * Az(1)) + +det(3) = ((Ay(3) * Vz - Az(3) * Vy) * Ax(2) + & + (Az(3) * Vx - Ax(3) * Vz) * Ay(2) + & + (Ax(3) * Vy - Ay(3) * Vx) * Az(2)) + +! Comparison of the determinants with eps, where a x_photon_startro is stored (due to machine precision) +IF ((det(1).ge.-epsMach).AND.(det(2).ge.-epsMach).AND.(det(3).ge.-epsMach)) THEN + ThroughSide = .TRUE. +END IF + +RETURN + +END SUBROUTINE PhotonThroughSideCheck3DDir + + +SUBROUTINE PhotonIntersectionWithSide2D(iLocSide,Element,ThroughSide,IntersectionPos,isLastSide,Distance) +!=================================================================================================================================== +!> Routine to check whether a photon crossed the given side. +!=================================================================================================================================== +! MODULES +USE MOD_Particle_Mesh_Vars, ONLY : ElemSideNodeID2D_Shared, NodeCoords_Shared +USE MOD_RadiationTrans_Vars, ONLY : PhotonProps +USE MOD_Mesh_Tools ,ONLY: GetCNElemID +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +! INPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT/OUTPUT VARIABLES +LOGICAL,INTENT(OUT) :: ThroughSide +INTEGER,INTENT(IN) :: iLocSide, Element +REAL, INTENT(OUT) :: IntersectionPos(3) +REAL, INTENT(OUT) :: Distance +LOGICAL, INTENT(IN) :: isLastSide +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +INTEGER :: CNElemID +REAL :: y_photon_start,x_photon_start,yNode1,xNode1,yNode2,xNode2,sy,sz,sx +REAL :: l1,S1,l2,S2,l,S +REAL :: beta, alpha, deltay, a, b, c, tmpsqrt +!=================================================================================================================================== + CNElemID = GetCNElemID(Element) + ThroughSide = .FALSE. + + xNode1 = NodeCoords_Shared(1,ElemSideNodeID2D_Shared(1,iLocSide, CNElemID)) + yNode1 = NodeCoords_Shared(2,ElemSideNodeID2D_Shared(1,iLocSide, CNElemID)) + xNode2 = NodeCoords_Shared(1,ElemSideNodeID2D_Shared(2,iLocSide, CNElemID)) + yNode2 = NodeCoords_Shared(2,ElemSideNodeID2D_Shared(2,iLocSide, CNElemID)) + + x_photon_start=PhotonProps%PhotonLastPos(1) + y_photon_start=PhotonProps%PhotonLastPos(2) + + sx=PhotonProps%PhotonDirection(1) + sy=PhotonProps%PhotonDirection(2) + sz=PhotonProps%PhotonDirection(3) + + IF (sx .EQ. 0.0) THEN + l = (x_photon_start-xNode1)/(xNode2-xNode1) + a = sy*sy + sz*sz + b = 2*sy*y_photon_start + c = y_photon_start*y_photon_start - yNode1*yNode1 + 2.*l*yNode1*yNode1 - l*l*yNode1*yNode1 & + - 2.*yNode1*yNode2*l + 2.*yNode1*yNode2*l*l - yNode2*yNode2*l*l + tmpsqrt = b*b - 4.*a*c + IF (tmpsqrt.LE.0.0) THEN + RETURN + END IF + S1 = (-b+SQRT(tmpsqrt))/(2.*a) + S2 = (-b-SQRT(tmpsqrt))/(2.*a) + + IF(isLastSide) THEN + IF (ALMOSTEQUAL(S1,S2)) THEN + RETURN ! TODO + ELSE IF (ABS(S1).GT.ABS(S2)) THEN + S=S1 + ELSE + S=S2 + END IF + ELSE + IF (S1.LE.0.0) THEN + S = S2 + ELSE + IF (S2.GT.0.0) THEN + IF(S2.GT.S1) THEN + S = S1 + ELSE + S = S2 + END IF + ELSE + S = S1 + END IF + END IF + END IF + + + ELSE + alpha = (xNode1 - x_photon_start) / sx + beta = (xNode2 - xNode1) / sx + deltay = (yNode2 - yNode1) + a = beta*beta*sy*sy - deltay*deltay + beta*beta*sz*sz + b = 2.*beta*sy*y_photon_start + 2.*alpha*beta*sy*sy - 2.*deltay*yNode1 + 2.*alpha*beta*sz*sz + c = y_photon_start*y_photon_start - yNode1*yNode1 + 2.*alpha*sy*y_photon_start + alpha*alpha*sy*sy + sz*sz*alpha*alpha + tmpsqrt = b*b - 4.*a*c + IF (tmpsqrt.LE.0.0) THEN + RETURN + END IF + l1 = (-b + SQRT(tmpsqrt))/(2.*a) + S1 = (xNode1-x_photon_start+(xNode2-xNode1)*l1)/sx + l2 = (-b - SQRT(tmpsqrt))/(2.*a) + S2 = (xNode1-x_photon_start+(xNode2-xNode1)*l2)/sx + + IF (isLastSide) THEN + IF (ALMOSTEQUAL(S1,S2).AND.ALMOSTEQUAL(ABS(l1),ABS(l2))) THEN + RETURN + ELSE IF (ALMOSTEQUAL(S1,S2)) THEN + IF (ABS(l1).GT.ABS(l2)) THEN + l=l1; S=S1 + ELSE + l=l2; S=S2 + END IF + ELSE IF (ALMOSTZERO(S1).AND.ALMOSTZERO(S2)) THEN + IF (ABS(l1).GT.ABS(l2)) THEN + l=l1; S=S1 + ELSE + l=l2; S=S2 + END IF + ELSE IF (ABS(S1).GT.ABS(S2)) THEN !though same spot again, caused by numerical inaccuray (discard shorter solution) + l=l1; S=S1 + ELSE + l=l2; S=S2 + END IF + ELSE IF ((l1.LE.0.0).OR.(l1.GE.1.0)) THEN !if 1 is not a valid intersection -> 2 + l = l2; S = S2 + ELSE !1 is valid intersection + IF ((S1.LE.0.0)) THEN !1 would be moving backwards -> 2 + l = l2; S = S2 + ELSE + IF ((l2.GT.0.0).AND.(l2.LT.1.0).AND.(S2.GT.0.0)) THEN !1 and 2 valid -> chose shorter one + IF (S2.GT.S1) THEN + l=l1; S=S1 + ELSE + l=l2; S=S2 + END IF + ELSE !1 is only valid intersection -> 1 + l=l1; S=S1 + END IF + END IF + END IF + + END IF + + IF((S .GT. 0.0) .AND. (0.0 .LE. l) .AND. (l .LE. 1.0)) THEN + ThroughSide = .TRUE. + IntersectionPos(1) = PhotonProps%PhotonLastPos(1) + S*sx + IntersectionPos(2) = PhotonProps%PhotonLastPos(2) + S*sy + IntersectionPos(3) = S*sz + Distance = S + END IF + +END SUBROUTINE PhotonIntersectionWithSide2D + + +SUBROUTINE PhotonIntersectionWithSide2DDir(iLocSide,CNElemID,ThroughSide,StartPoint, Dir, IntersectionPos, Distance) +!=================================================================================================================================== +!> Routine to check whether a photon crossed the given side. +!=================================================================================================================================== +! MODULES +USE MOD_Particle_Mesh_Vars, ONLY : ElemSideNodeID2D_Shared, NodeCoords_Shared +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +! INPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT/OUTPUT VARIABLES +LOGICAL,INTENT(OUT) :: ThroughSide +INTEGER,INTENT(IN) :: iLocSide, CNElemID +REAL, INTENT(OUT), OPTIONAL :: IntersectionPos(3), Distance +REAL,INTENT(IN) :: StartPoint(3), Dir(3) +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +REAL :: y_photon_start,x_photon_start,yNode1,xNode1,yNode2,xNode2,sy,sz,sx +REAL :: l1,S1,l2,S2,l,S +REAL :: beta, alpha, deltay, a, b, c, tmpsqrt +!=================================================================================================================================== + ThroughSide = .FALSE. + + xNode1 = NodeCoords_Shared(1,ElemSideNodeID2D_Shared(1,iLocSide, CNElemID)) + yNode1 = NodeCoords_Shared(2,ElemSideNodeID2D_Shared(1,iLocSide, CNElemID)) + xNode2 = NodeCoords_Shared(1,ElemSideNodeID2D_Shared(2,iLocSide, CNElemID)) + yNode2 = NodeCoords_Shared(2,ElemSideNodeID2D_Shared(2,iLocSide, CNElemID)) + + x_photon_start=StartPoint(1) + y_photon_start=StartPoint(2) + + sx=Dir(1) + sy=Dir(2) + sz=Dir(3) + + IF (sx .EQ. 0.0) THEN + l = (x_photon_start-xNode1)/(xNode2-xNode1) + a = sy*sy + sz*sz + b = 2*sy*y_photon_start + c = y_photon_start*y_photon_start - yNode1*yNode1 + 2.*l*yNode1*yNode1 - l*l*yNode1*yNode1 & + - 2.*yNode1*yNode2*l + 2.*yNode1*yNode2*l*l - yNode2*yNode2*l*l + tmpsqrt = b*b - 4.*a*c + IF (tmpsqrt.LE.0.0) THEN + RETURN + END IF + S1 = (-b+SQRT(tmpsqrt))/(2.*a) + S2 = (-b-SQRT(tmpsqrt))/(2.*a) + + IF (S1.LE.0.0) THEN + S = S2 + ELSE + IF (S2.GT.0.0) THEN + IF(S2.GT.S1) THEN + S = S1 + ELSE + S = S2 + END IF + ELSE + S = S1 + END IF + END IF + ELSE + alpha = (xNode1 - x_photon_start) / sx + beta = (xNode2 - xNode1) / sx + deltay = (yNode2 - yNode1) + a = beta*beta*sy*sy - deltay*deltay + beta*beta*sz*sz + b = 2.*beta*sy*y_photon_start + 2.*alpha*beta*sy*sy - 2.*deltay*yNode1 + 2.*alpha*beta*sz*sz + c = y_photon_start*y_photon_start - yNode1*yNode1 + 2.*alpha*sy*y_photon_start + alpha*alpha*sy*sy + sz*sz*alpha*alpha + tmpsqrt = b*b - 4.*a*c + IF (tmpsqrt.LE.0.0) THEN + RETURN + END IF + l1 = (-b + SQRT(tmpsqrt))/(2.*a) + S1 = (xNode1-x_photon_start+(xNode2-xNode1)*l1)/sx + l2 = (-b - SQRT(tmpsqrt))/(2.*a) + S2 = (xNode1-x_photon_start+(xNode2-xNode1)*l2)/sx + + IF ((l1.LE.0.0).OR.(l1.GE.1.0)) THEN !if 1 is not a valid intersection -> 2 + l = l2; S = S2 + ELSE !1 is valid intersection + IF ((S1.LE.0.0)) THEN !1 would be moving backwards -> 2 + l = l2; S = S2 + ELSE + IF ((l2.GT.0.0).AND.(l2.LT.1.0).AND.(S2.GT.0.0)) THEN !1 and 2 valid -> chose shorter one + IF (S2.GT.S1) THEN + l=l1; S=S1 + ELSE + l=l2; S=S2 + END IF + ELSE !1 is only valid intersection -> 1 + l=l1; S=S1 + END IF + END IF + END IF + + END IF + + IF((S .GT. 0.0) .AND. (0.0 .LE. l) .AND. (l .LE. 1.0)) THEN + ThroughSide = .TRUE. + IF (PRESENT(IntersectionPos)) THEN + IntersectionPos(1) = StartPoint(1) + S*sx + IntersectionPos(2) = StartPoint(2) + S*sy + IntersectionPos(3) = S*sz + Distance = S + END IF + END IF +END SUBROUTINE PhotonIntersectionWithSide2DDir + +SUBROUTINE RotatePhotonIn2DPlane(IntersectionPos) +!=================================================================================================================================== +!> Routine to check whether a photon crossed the given side. +!=================================================================================================================================== +! MODULES +USE MOD_RadiationTrans_Vars, ONLY:PhotonProps +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT/OUTPUT VARIABLES +REAL, INTENT(OUT) :: IntersectionPos(3) +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +REAL :: NewYPho, NewYVelo + !=================================================================================================================================== +PhotonProps%PhotonLastPos(1:3) = IntersectionPos(1:3) +NewYPho = SQRT(PhotonProps%PhotonLastPos(2)**2 + PhotonProps%PhotonLastPos(3)**2) +! Rotation: Vy' = Vy * cos(alpha) + Vz * sin(alpha) = Vy * y/y' + Vz * z/y' +! Vz' = - Vy * sin(alpha) + Vz * cos(alpha) = - Vy * z/y' + Vz * y/y' +! Right-hand system, using new y and z positions after tracking, position vector and velocity vector DO NOT have to +! coincide (as opposed to Bird 1994, p. 391, where new positions are calculated with the velocity vector) +NewYVelo = (PhotonProps%PhotonDirection(2)*PhotonProps%PhotonLastPos(2) & + + PhotonProps%PhotonDirection(3)*PhotonProps%PhotonLastPos(3))/NewYPho +PhotonProps%PhotonDirection(3) = (-PhotonProps%PhotonDirection(2)*PhotonProps%PhotonLastPos(3) & + + PhotonProps%PhotonDirection(3)*PhotonProps%PhotonLastPos(2))/NewYPho +PhotonProps%PhotonLastPos(2) = NewYPho +PhotonProps%PhotonLastPos(3) = 0.0 +PhotonProps%PhotonDirection(2) = NewYVelo +PhotonProps%PhotonPos(1:3) = PhotonProps%PhotonLastPos(1:3) + +END SUBROUTINE RotatePhotonIn2DPlane + + + +SUBROUTINE PhotonIntersectionWithSide(iLocSide,Element,TriNum, IntersectionPos, IsMortar) +!--------------------------------------------------------------------------------------------------! +! Based on PerfectReflection3D +!--------------------------------------------------------------------------------------------------! +USE MOD_Particle_Mesh_Vars, ONLY : ElemSideNodeID_Shared, NodeCoords_Shared +USE MOD_RadiationTrans_Vars, ONLY:PhotonProps +USE MOD_Mesh_Tools ,ONLY: GetCNElemID +!--------------------------------------------------------------------------------------------------! + IMPLICIT NONE ! +!--------------------------------------------------------------------------------------------------! +! argument list declaration ! + INTEGER,INTENT(IN) :: iLocSide ! + INTEGER,INTENT(IN) :: Element ! + INTEGER,INTENT(IN) :: TriNum ! + REAL,INTENT(OUT) :: IntersectionPos(1:3) + LOGICAL, INTENT(IN), OPTIONAL :: IsMortar +! Local variable declaration ! + INTEGER :: CNElemID + INTEGER :: Node1, Node2 ! + REAL :: PoldX, PoldY, PoldZ, nx, ny, nz, nVal ! + REAL :: bx,by,bz, ax,ay,az, dist + REAL :: xNod, yNod, zNod,IntersecPara ! + REAL :: Vector1(1:3), Vector2(1:3), VectorShift(1:3) ! +!--------------------------------------------------------------------------------------------------! +!--------------------------------------------------------------------------------------------------! + + CNElemID = GetCNElemID(Element) + + PoldX = PhotonProps%PhotonLastPos(1) + PoldY = PhotonProps%PhotonLastPos(2) + PoldZ = PhotonProps%PhotonLastPos(3) + + xNod = NodeCoords_Shared(1,ElemSideNodeID_Shared(1,iLocSide,CNElemID)+1) + yNod = NodeCoords_Shared(2,ElemSideNodeID_Shared(1,iLocSide,CNElemID)+1) + zNod = NodeCoords_Shared(3,ElemSideNodeID_Shared(1,iLocSide,CNElemID)+1) + + !---- Calculate normal vector: + IF(PRESENT(IsMortar)) THEN + Node1 = TriNum+2 ! normal = cross product of 1-2 and 1-3 for first triangle + Node2 = TriNum+1 ! and 1-3 and 1-4 for second triangle + ELSE + Node1 = TriNum+1 ! normal = cross product of 1-2 and 1-3 for first triangle + Node2 = TriNum+2 ! and 1-3 and 1-4 for second triangle + END IF + + Vector1(1) = NodeCoords_Shared(1,ElemSideNodeID_Shared(Node1,iLocSide,CNElemID)+1) - xNod + Vector1(2) = NodeCoords_Shared(2,ElemSideNodeID_Shared(Node1,iLocSide,CNElemID)+1) - yNod + Vector1(3) = NodeCoords_Shared(3,ElemSideNodeID_Shared(Node1,iLocSide,CNElemID)+1) - zNod + + Vector2(1) = NodeCoords_Shared(1,ElemSideNodeID_Shared(Node2,iLocSide,CNElemID)+1) - xNod + Vector2(2) = NodeCoords_Shared(2,ElemSideNodeID_Shared(Node2,iLocSide,CNElemID)+1) - yNod + Vector2(3) = NodeCoords_Shared(3,ElemSideNodeID_Shared(Node2,iLocSide,CNElemID)+1) - zNod + + nx = Vector1(2) * Vector2(3) - Vector1(3) * Vector2(2) + ny = Vector1(3) * Vector2(1) - Vector1(1) * Vector2(3) + nz = Vector1(1) * Vector2(2) - Vector1(2) * Vector2(1) + + nVal = SQRT(nx*nx + ny*ny + nz*nz) + + nx = nx/nVal + ny = ny/nVal + nz = nz/nVal + + !---- Calculate Intersection + + bx = PoldX - xNod + by = PoldY - yNod + bz = PoldZ - zNod + + ax = bx - nx * (bx * nx + by * ny + bz * nz) + ay = by - ny * (bx * nx + by * ny + bz * nz) + az = bz - nz * (bx * nx + by * ny + bz * nz) + + dist = SQRT(((ay * bz - az * by) * (ay * bz - az * by) + & + (az * bx - ax * bz) * (az * bx - ax * bz) + & + (ax * by - ay * bx) * (ax * by - ay * bx))/ & + (ax * ax + ay * ay + az * az)) + + ! If vector from old point to new point goes through the node, a will be x_photon_startro + ! dist is then simply length of vector b instead of |axb|/|a| + IF (dist.NE.dist) dist = SQRT(bx*bx+by*by+bz*bz) + + VectorShift(1) = PhotonProps%PhotonDirection(1) + VectorShift(2) = PhotonProps%PhotonDirection(2) + VectorShift(3) = PhotonProps%PhotonDirection(3) + + IntersecPara = VectorShift(1) * nx + VectorShift(2) * ny + VectorShift(3) * nz + IntersecPara = dist / IntersecPara + + IntersectionPos(1) = PoldX + IntersecPara * VectorShift(1) + IntersectionPos(2) = PoldY + IntersecPara * VectorShift(2) + IntersectionPos(3) = PoldZ + IntersecPara * VectorShift(3) + + RETURN +END SUBROUTINE PhotonIntersectionWithSide + + +SUBROUTINE CalcAbsoprtionMC(IntersectionPos,Element, DONE) +!--------------------------------------------------------------------------------------------------! +! Calculates absorbed energy of photons along their paths stochastically +!--------------------------------------------------------------------------------------------------! +USE MOD_RadiationTrans_Vars, ONLY:PhotonProps,RadiationElemAbsEnergy, RadiationElemAbsEnergySpec +USE MOD_Radiation_Vars, ONLY:Radiation_Absorption_spec, Radiation_Absorption_SpecPercent +!--------------------------------------------------------------------------------------------------! + IMPLICIT NONE ! +!--------------------------------------------------------------------------------------------------! +! argument list declaration ! + INTEGER, INTENT(IN) :: Element + REAL, INTENT(IN) :: IntersectionPos(3) + LOGICAL, INTENT(OUT) :: DONE +! Local variable declaration ! +!--------------------------------------------------------------------------------------------------! + REAL :: iRan, DistanceVec(3), Distance, opticalPath +!--------------------------------------------------------------------------------------------------! + IF ((Radiation_Absorption_Spec(PhotonProps%WaveLength,Element).GT.0.0)& + .AND.(SUM(Radiation_Absorption_SpecPercent(PhotonProps%WaveLength,:,Element)).GT.0)) THEN + DistanceVec(1:3) = PhotonProps%PhotonPos(1:3) - IntersectionPos(1:3) + Distance = SQRT(DistanceVec(1)*DistanceVec(1) + DistanceVec(2)*DistanceVec(2) + DistanceVec(3)*DistanceVec(3)) + CALL RANDOM_NUMBER(iRan) + opticalPath = Distance*Radiation_Absorption_Spec(PhotonProps%WaveLength,Element) + IF (-LOG(iRan).LT.opticalPath) THEN + RadiationElemAbsEnergySpec(:,Element) = RadiationElemAbsEnergySpec(:,Element) & + + PhotonProps%PhotonEnergy*(REAL(Radiation_Absorption_SpecPercent(PhotonProps%WaveLength,:,Element))& + /SUM(REAL(Radiation_Absorption_SpecPercent(PhotonProps%WaveLength,:,Element)))) + DONE = .TRUE. + ELSE + PhotonProps%PhotonPos(1:3) = IntersectionPos(1:3) + END IF + ELSE + PhotonProps%PhotonPos(1:3) = IntersectionPos(1:3) + END IF + RadiationElemAbsEnergy(1,Element) = RadiationElemAbsEnergy(1,Element) + opticalPath + RadiationElemAbsEnergy(2,Element) = RadiationElemAbsEnergy(2,Element) + 1.0 + +END SUBROUTINE CalcAbsoprtionMC + + +SUBROUTINE CalcAbsoprtionAnalytic(IntersectionPos,Element, DONE) +!--------------------------------------------------------------------------------------------------! +! Calculates absorbed energy of photons along their paths analytically +!--------------------------------------------------------------------------------------------------! +!DEC$ ATTRIBUTES FORCEINLINE :: ParticleThroughSideLastPosCheck + USE MOD_Globals + USE MOD_RadiationTrans_Vars, ONLY:PhotonProps, RadTrans + USE MOD_RadiationTrans_Vars, ONLY:RadiationElemAbsEnergy, RadiationElemAbsEnergySpec + USE MOD_Radiation_Vars, ONLY:Radiation_Absorption_spec, Radiation_Absorption_SpecPercent +!--------------------------------------------------------------------------------------------------! + IMPLICIT NONE ! +!--------------------------------------------------------------------------------------------------! +! argument list declaration ! + INTEGER, INTENT(IN) :: Element + REAL, INTENT(IN) :: IntersectionPos(3) + LOGICAL, INTENT(OUT) :: DONE +! Local variable declaration ! +!--------------------------------------------------------------------------------------------------! + REAL :: DistanceVec(3), Distance, LostEnergy, opticalPath +!--------------------------------------------------------------------------------------------------! + IF ((Radiation_Absorption_Spec(PhotonProps%WaveLength,Element).GT.0.0)& + .AND.(SUM(Radiation_Absorption_SpecPercent(PhotonProps%WaveLength,:,Element)).GT.0)) THEN + DistanceVec(1:3) = PhotonProps%PhotonPos(1:3) - IntersectionPos(1:3) + Distance = SQRT(DistanceVec(1)*DistanceVec(1) + DistanceVec(2)*DistanceVec(2) + DistanceVec(3)*DistanceVec(3)) + opticalPath = Distance*Radiation_Absorption_Spec(PhotonProps%WaveLength,Element) + IF (CHECKEXP(opticalPath)) THEN + LostEnergy = PhotonProps%PhotonEnergy*(1.-EXP(-opticalPath)) + ELSE + LostEnergy = PhotonProps%PhotonEnergy + DONE = .TRUE. + END IF + IF (SUM(REAL(Radiation_Absorption_SpecPercent(PhotonProps%WaveLength,:,Element))).EQ.0.0) THEN + print*,'arg',Element,PhotonProps%WaveLength, Radiation_Absorption_Spec(PhotonProps%WaveLength,Element) + print*, 'percent', Radiation_Absorption_SpecPercent(PhotonProps%WaveLength,:,Element) + END IF + PhotonProps%PhotonEnergy = PhotonProps%PhotonEnergy - LostEnergy + RadiationElemAbsEnergySpec(:,Element) = RadiationElemAbsEnergySpec(:,Element) & + + LostEnergy*(REAL(Radiation_Absorption_SpecPercent(PhotonProps%WaveLength,:,Element))& + /SUM(REAL(Radiation_Absorption_SpecPercent(PhotonProps%WaveLength,:,Element)))) + ELSE + opticalPath = 0.0 + END IF +! IF (PhotonProps%PhotonEnergy.LE.(RadTrans%GlobalRadiationPower/(1000.*RadTrans%GlobalPhotonNum))) THEN +! DONE = .TRUE. +! ELSE + +! END IF + PhotonProps%PhotonPos(1:3) = IntersectionPos(1:3) + RadiationElemAbsEnergy(1,Element) = RadiationElemAbsEnergy(1,Element) + opticalPath + RadiationElemAbsEnergy(2,Element) = RadiationElemAbsEnergy(2,Element) + 1.0 + +END SUBROUTINE CalcAbsoprtionAnalytic + + +SUBROUTINE CalcAbsoprtion(IntersectionPos,Element, DONE) + !--------------------------------------------------------------------------------------------------! +! Calculates absorbed energy of photons along their paths +!--------------------------------------------------------------------------------------------------! + USE MOD_Globals + USE MOD_RadiationTrans_Vars, ONLY : RadiationAbsorptionModel +!--------------------------------------------------------------------------------------------------! + IMPLICIT NONE ! +!--------------------------------------------------------------------------------------------------! +! argument list declaration ! + INTEGER, INTENT(IN) :: Element + REAL, INTENT(IN) :: IntersectionPos(3) + LOGICAL, INTENT(INOUT) :: DONE +! Local variable declaration ! +!--------------------------------------------------------------------------------------------------! +!--------------------------------------------------------------------------------------------------! + IF (RadiationAbsorptionModel.EQ.1) THEN + CALL CalcAbsoprtionAnalytic(IntersectionPos,Element, DONE) + ELSE IF (RadiationAbsorptionModel.EQ.2) THEN + CALL CalcAbsoprtionMC(IntersectionPos,Element, DONE) + ELSE + CALL Abort(& + __STAMP__,& + 'AbsorptionModel must be 1 or 2!') + END IF + +END SUBROUTINE CalcAbsoprtion + +SUBROUTINE PerfectPhotonReflection(iLocSide,Element,TriNum, IntersectionPos, IntersecAlreadyCalc) +!--------------------------------------------------------------------------------------------------! +! Determines velocity vectors of photons after a perfect reflection at a boundary +!--------------------------------------------------------------------------------------------------! + USE MOD_Particle_Mesh_Vars, ONLY : NodeCoords_Shared, ElemSideNodeID_Shared + USE MOD_RadiationTrans_Vars, ONLY : PhotonProps + USE MOD_Mesh_Tools ,ONLY: GetCNElemID +!--------------------------------------------------------------------------------------------------! + IMPLICIT NONE ! +!--------------------------------------------------------------------------------------------------! +! argument list declaration ! + INTEGER,INTENT(IN) :: iLocSide ! + INTEGER,INTENT(IN) :: Element ! + INTEGER,INTENT(IN) :: TriNum ! + REAL, INTENT(INOUT) :: IntersectionPos(1:3) + LOGICAL, INTENT(IN) :: IntersecAlreadyCalc + ! Local variable declaration + INTEGER :: CNElemID + INTEGER :: Node1, Node2 ! + REAL :: PoldX, PoldY, PoldZ, nx, ny, nz, nVal ! + REAL :: xNod, yNod, zNod + REAL :: VelX, VelY, VelZ + REAL :: Vector1(1:3), Vector2(1:3), POI_fak, ProjVel +!--------------------------------------------------------------------------------------------------! +!--------------------------------------------------------------------------------------------------! + + CNElemID = GetCNElemID(Element) + PoldX = PhotonProps%PhotonLastPos(1) + PoldY = PhotonProps%PhotonLastPos(2) + PoldZ = PhotonProps%PhotonLastPos(3) + + VelX = PhotonProps%PhotonDirection(1) + VelY = PhotonProps%PhotonDirection(2) + VelZ = PhotonProps%PhotonDirection(3) + + xNod = NodeCoords_Shared(1,ElemSideNodeID_Shared(1,iLocSide,CNElemID)+1) + yNod = NodeCoords_Shared(2,ElemSideNodeID_Shared(1,iLocSide,CNElemID)+1) + zNod = NodeCoords_Shared(3,ElemSideNodeID_Shared(1,iLocSide,CNElemID)+1) + + !---- Calculate normal vector: + + Node1 = TriNum+1 ! normal = cross product of 1-2 and 1-3 for first triangle + Node2 = TriNum+2 ! and 1-3 and 1-4 for second triangle + + Vector1(1) = NodeCoords_Shared(1,ElemSideNodeID_Shared(Node1,iLocSide,CNElemID)+1) - xNod + Vector1(2) = NodeCoords_Shared(2,ElemSideNodeID_Shared(Node1,iLocSide,CNElemID)+1) - yNod + Vector1(3) = NodeCoords_Shared(3,ElemSideNodeID_Shared(Node1,iLocSide,CNElemID)+1) - zNod + + Vector2(1) = NodeCoords_Shared(1,ElemSideNodeID_Shared(Node2,iLocSide,CNElemID)+1) - xNod + Vector2(2) = NodeCoords_Shared(2,ElemSideNodeID_Shared(Node2,iLocSide,CNElemID)+1) - yNod + Vector2(3) = NodeCoords_Shared(3,ElemSideNodeID_Shared(Node2,iLocSide,CNElemID)+1) - zNod + + nx = Vector1(2) * Vector2(3) - Vector1(3) * Vector2(2) + ny = Vector1(3) * Vector2(1) - Vector1(1) * Vector2(3) + nz = Vector1(1) * Vector2(2) - Vector1(2) * Vector2(1) + + nVal = SQRT(nx*nx + ny*ny + nz*nz) + + nx = nx/nVal + ny = ny/nVal + nz = nz/nVal + + !---- Calculate Point of Intersection (POI) + IF (.NOT.IntersecAlreadyCalc) THEN + POI_fak = (Vector2(2)*(Vector1(1)*(zNod-PoldZ)+Vector1(3)*(PoldX-xNod)) & + +Vector1(2)*(Vector2(1)*(PoldZ-zNod)+Vector2(3)*(xNod-PoldX)) & + +yNod*(Vector1(3)*Vector2(1)-Vector1(1)*Vector2(3)) & + +PoldY*(Vector1(1)*Vector2(3)-Vector1(3)*Vector2(1))) & + /(Vector1(2)*(Vector2(3)*VelX-Vector2(1)*VelZ) & + + Vector2(2)*(Vector1(1)*VelZ-Vector1(3)*VelX) & + + VelY*(Vector1(3)*Vector2(1)-Vector1(1)*Vector2(3))) + + IntersectionPos(1) = PoldX + POI_fak * VelX + IntersectionPos(2) = PoldY + POI_fak * VelY + IntersectionPos(3) = PoldZ + POI_fak * VelZ + END IF + + !---- Calculate new velocity vector + ProjVel = nx*PhotonProps%PhotonDirection(1)+ny*PhotonProps%PhotonDirection(2) & + +nz*PhotonProps%PhotonDirection(3) + VelX=PhotonProps%PhotonDirection(1)-2.*ProjVel*nx + VelY=PhotonProps%PhotonDirection(2)-2.*ProjVel*ny + VelZ=PhotonProps%PhotonDirection(3)-2.*ProjVel*nz + + !---- Assign new values to "old" variables to continue loop + + PhotonProps%PhotonLastPos(1) = IntersectionPos(1) + PhotonProps%PhotonLastPos(2) = IntersectionPos(2) + PhotonProps%PhotonLastPos(3) = IntersectionPos(3) + + PhotonProps%PhotonDirection(1) = VelX + PhotonProps%PhotonDirection(2) = VelY + PhotonProps%PhotonDirection(3) = VelZ + RETURN +END SUBROUTINE PerfectPhotonReflection + +SUBROUTINE PerfectPhotonReflection2D(iLocSide,Element, IntersectionPos) +!--------------------------------------------------------------------------------------------------! +! Determines velocity vectors of photons after a perfect reflection at a boundary (2D rotationally symmetric) +!--------------------------------------------------------------------------------------------------! + USE MOD_Particle_Mesh_Vars, ONLY : SideNormalEdge2D_Shared + USE MOD_RadiationTrans_Vars, ONLY : PhotonProps + USE MOD_Mesh_Tools ,ONLY: GetCNElemID +!--------------------------------------------------------------------------------------------------! + IMPLICIT NONE ! +!--------------------------------------------------------------------------------------------------! +! argument list declaration ! + INTEGER,INTENT(IN) :: iLocSide ! + INTEGER,INTENT(IN) :: Element ! + REAL, INTENT(INOUT) :: IntersectionPos(1:3) + ! Local variable declaration ! + INTEGER :: CNElemID ! + REAL :: nx, ny, nz, nValIntersec + REAL :: VelX, VelY, VelZ + REAL :: ProjVel +!--------------------------------------------------------- -----------------------------------------! +!--------------------------------------------------------------------------------------------------! + CNElemID = GetCNElemID(Element) + + nx = SideNormalEdge2D_Shared(1,iLocSide, CNElemID) + nValIntersec = SQRT(IntersectionPos(2)*IntersectionPos(2) + IntersectionPos(3)*IntersectionPos(3)) + ny = IntersectionPos(2)/nValIntersec * SideNormalEdge2D_Shared(2,iLocSide, CNElemID) + nz = IntersectionPos(3)/nValIntersec * SideNormalEdge2D_Shared(2,iLocSide, CNElemID) + + !---- Calculate new velocity vector + ProjVel = nx*PhotonProps%PhotonDirection(1)+ny*PhotonProps%PhotonDirection(2) & + +nz*PhotonProps%PhotonDirection(3) + VelX=PhotonProps%PhotonDirection(1)-2.*ProjVel*nx + VelY=PhotonProps%PhotonDirection(2)-2.*ProjVel*ny + VelZ=PhotonProps%PhotonDirection(3)-2.*ProjVel*nz + + !---- Assign new values to "old" variables to continue loop + + PhotonProps%PhotonLastPos(1) = IntersectionPos(1) + PhotonProps%PhotonLastPos(2) = IntersectionPos(2) + PhotonProps%PhotonLastPos(3) = IntersectionPos(3) + + PhotonProps%PhotonDirection(1) = VelX + PhotonProps%PhotonDirection(2) = VelY + PhotonProps%PhotonDirection(3) = VelZ +END SUBROUTINE PerfectPhotonReflection2D + +SUBROUTINE DiffusePhotonReflection(iLocSide,Element,TriNum, IntersectionPos, IntersecAlreadyCalc) +!--------------------------------------------------------------------------------------------------! +! Determines velocity vectors of photons after a diffuse reflection at a boundary +!--------------------------------------------------------------------------------------------------! + USE MOD_Particle_Mesh_Vars, ONLY : ElemSideNodeID_Shared, NodeCoords_Shared + USE MOD_RadiationTrans_Vars, ONLY : PhotonProps + USE Ziggurat + USE MOD_Mesh_Tools ,ONLY: GetCNElemID +!--------------------------------------------------------------------------------------------------! + IMPLICIT NONE ! +!--------------------------------------------------------------------------------------------------! +! argument list declaration ! + INTEGER,INTENT(IN) :: iLocSide ! + INTEGER,INTENT(IN) :: Element ! + INTEGER,INTENT(IN) :: TriNum ! + REAL, INTENT(INOUT) :: IntersectionPos(1:3) + LOGICAL, INTENT(IN) :: IntersecAlreadyCalc + ! Local variable declaration ! + INTEGER :: CNElemID + INTEGER :: Node1, Node2 ! + REAL :: PoldX, PoldY, PoldZ, nx, ny, nz, nVal ! + REAL :: xNod, yNod, zNod, VecX, VecY, VecZ + REAL :: VelX, VelY, VelZ, VeloCx, VeloCy, VeloCz, NormVec, RanNum + REAL :: Vector1(1:3), Vector2(1:3), POI_fak +!--------------------------------------------------------------------------------------------------! +!--------------------------------------------------------------------------------------------------! + CNElemID = GetCNElemID(Element) + PoldX = PhotonProps%PhotonLastPos(1) + PoldY = PhotonProps%PhotonLastPos(2) + PoldZ = PhotonProps%PhotonLastPos(3) + + VelX = PhotonProps%PhotonDirection(1) + VelY = PhotonProps%PhotonDirection(2) + VelZ = PhotonProps%PhotonDirection(3) + + xNod = NodeCoords_Shared(1,ElemSideNodeID_Shared(1,iLocSide,CNElemID)+1) + yNod = NodeCoords_Shared(2,ElemSideNodeID_Shared(1,iLocSide,CNElemID)+1) + zNod = NodeCoords_Shared(3,ElemSideNodeID_Shared(1,iLocSide,CNElemID)+1) + + !---- Calculate normal vector: + + Node1 = TriNum+1 ! normal = cross product of 1-2 and 1-3 for first triangle + Node2 = TriNum+2 ! and 1-3 and 1-4 for second triangle + + Vector1(1) = NodeCoords_Shared(1,ElemSideNodeID_Shared(Node1,iLocSide,CNElemID)+1) - xNod + Vector1(2) = NodeCoords_Shared(2,ElemSideNodeID_Shared(Node1,iLocSide,CNElemID)+1) - yNod + Vector1(3) = NodeCoords_Shared(3,ElemSideNodeID_Shared(Node1,iLocSide,CNElemID)+1) - zNod + + Vector2(1) = NodeCoords_Shared(1,ElemSideNodeID_Shared(Node2,iLocSide,CNElemID)+1) - xNod + Vector2(2) = NodeCoords_Shared(2,ElemSideNodeID_Shared(Node2,iLocSide,CNElemID)+1) - yNod + Vector2(3) = NodeCoords_Shared(3,ElemSideNodeID_Shared(Node2,iLocSide,CNElemID)+1) - zNod + + nx = Vector1(2) * Vector2(3) - Vector1(3) * Vector2(2) + ny = Vector1(3) * Vector2(1) - Vector1(1) * Vector2(3) + nz = Vector1(1) * Vector2(2) - Vector1(2) * Vector2(1) + + nVal = SQRT(nx*nx + ny*ny + nz*nz) + + nx = nx/nVal + ny = ny/nVal + nz = nz/nVal + + !---- Calculate Point of Intersection (POI) + !---- Calculate Point of Intersection (POI) + IF (.NOT.IntersecAlreadyCalc) THEN + POI_fak = (Vector2(2)*(Vector1(1)*(zNod-PoldZ)+Vector1(3)*(PoldX-xNod)) & + +Vector1(2)*(Vector2(1)*(PoldZ-zNod)+Vector2(3)*(xNod-PoldX)) & + +yNod*(Vector1(3)*Vector2(1)-Vector1(1)*Vector2(3)) & + +PoldY*(Vector1(1)*Vector2(3)-Vector1(3)*Vector2(1))) & + /(Vector1(2)*(Vector2(3)*VelX-Vector2(1)*VelZ) & + + Vector2(2)*(Vector1(1)*VelZ-Vector1(3)*VelX) & + + VelY*(Vector1(3)*Vector2(1)-Vector1(1)*Vector2(3))) + + IntersectionPos(1) = PoldX + POI_fak * VelX + IntersectionPos(2) = PoldY + POI_fak * VelY + IntersectionPos(3) = PoldZ + POI_fak * VelZ + END IF + !---- Calculate new velocity vector (Extended Maxwellian Model) + + VeloCx = rnor() !normal distri + VeloCy = rnor() !normal distri + CALL RANDOM_NUMBER(RanNum) + VeloCz = SQRT(-2.*LOG(RanNum)) ! rayleigh distri + + !---- Transformation local distribution -> global coordinates + VecX = Vector1(1) / SQRT( Vector1(1)**2 + Vector1(2)**2 + Vector1(3)**2 ) + VecY = Vector1(2) / SQRT( Vector1(1)**2 + Vector1(2)**2 + Vector1(3)**2 ) + VecZ = Vector1(3) / SQRT( Vector1(1)**2 + Vector1(2)**2 + Vector1(3)**2 ) + + VelX = VecX*VeloCx + (nz*VecY-ny*VecZ)*VeloCy - nx*VeloCz + VelY = VecY*VeloCx + (nx*VecZ-nz*VecX)*VeloCy - ny*VeloCz + VelZ = VecZ*VeloCx + (ny*VecX-nx*VecY)*VeloCy - nz*VeloCz + !---- Assign new values to "old" variables to continue loop + + PhotonProps%PhotonLastPos(1) = IntersectionPos(1) + PhotonProps%PhotonLastPos(2) = IntersectionPos(2) + PhotonProps%PhotonLastPos(3) = IntersectionPos(3) + + !---- saving new particle velocity + NormVec = SQRT(VelX*VelX + VelY*VelY + VelZ*VelZ) + PhotonProps%PhotonDirection(1) = VelX / NormVec + PhotonProps%PhotonDirection(2) = VelY / NormVec + PhotonProps%PhotonDirection(3) = VelZ / NormVec + + RETURN +END SUBROUTINE DiffusePhotonReflection + + +SUBROUTINE DiffusePhotonReflection2D(iLocSide,Element, IntersectionPos) +!--------------------------------------------------------------------------------------------------! +! Determines velocity vectors of photons after a diffuse reflection at a boundary (2D rotationally symmetric) +!--------------------------------------------------------------------------------------------------! + USE MOD_Particle_Mesh_Vars, ONLY : SideNormalEdge2D_Shared + USE MOD_RadiationTrans_Vars, ONLY : PhotonProps + USE Ziggurat + USE MOD_Mesh_Tools ,ONLY: GetCNElemID +!--------------------------------------------------------------------------------------------------! + IMPLICIT NONE ! +!--------------------------------------------------------------------------------------------------! +! argument list declaration ! + INTEGER,INTENT(IN) :: iLocSide ! + INTEGER,INTENT(IN) :: Element ! + REAL, INTENT(IN) :: IntersectionPos(1:3) + ! Local variable declaration + INTEGER :: CNElemID + REAL :: nx, ny, nz, nValIntersec, VecX, VecY, VecZ + REAL :: VelX, VelY, VelZ, VeloCx, VeloCy, VeloCz, NormVec, RanNum +!--------------------------------------------------------------------------------------------------! +!--------------------------------------------------------------------------------------------------! + CNElemID = GetCNElemID(Element) + nx = SideNormalEdge2D_Shared(1,iLocSide, CNElemID) + nValIntersec = SQRT(IntersectionPos(2)*IntersectionPos(2) + IntersectionPos(3)*IntersectionPos(3)) + ny = IntersectionPos(2)/nValIntersec * SideNormalEdge2D_Shared(2,iLocSide, CNElemID) + nz = IntersectionPos(3)/nValIntersec * SideNormalEdge2D_Shared(2,iLocSide, CNElemID) + + VecX = SideNormalEdge2D_Shared(3,iLocSide, CNElemID) + VecY = IntersectionPos(2)/nValIntersec * SideNormalEdge2D_Shared(4,iLocSide, CNElemID) + VecZ = IntersectionPos(3)/nValIntersec * SideNormalEdge2D_Shared(4,iLocSide, CNElemID) + !---- Calculate new velocity vector (Extended Maxwellian Model) + + VeloCx = rnor() !normal distri + VeloCy = rnor() !normal distri + CALL RANDOM_NUMBER(RanNum) + VeloCz = SQRT(-2.*LOG(RanNum)) ! rayleigh distri + + VelX = VecX*VeloCx + (nz*VecY-ny*VecZ)*VeloCy - nx*VeloCz + VelY = VecY*VeloCx + (nx*VecZ-nz*VecX)*VeloCy - ny*VeloCz + VelZ = VecZ*VeloCx + (ny*VecX-nx*VecY)*VeloCy - nz*VeloCz + !---- Assign new values to "old" variables to continue loop + + PhotonProps%PhotonLastPos(1) = IntersectionPos(1) + PhotonProps%PhotonLastPos(2) = IntersectionPos(2) + PhotonProps%PhotonLastPos(3) = IntersectionPos(3) + + !---- saving new particle velocity + NormVec = SQRT(VelX*VelX + VelY*VelY + VelZ*VelZ) + PhotonProps%PhotonDirection(1) = VelX / NormVec + PhotonProps%PhotonDirection(2) = VelY / NormVec + PhotonProps%PhotonDirection(3) = VelZ / NormVec + +END SUBROUTINE DiffusePhotonReflection2D + +SUBROUTINE CalcWallAbsoprtion(GlobSideID, DONE) +!--------------------------------------------------------------------------------------------------! +! Calculates the absorbed energy if a photon hits a wall +!--------------------------------------------------------------------------------------------------! + USE MOD_RadiationTrans_Vars, ONLY : PhotonSampWall, PhotonProps + USE MOD_Particle_Boundary_Vars, ONLY:PartBound, GlobalSide2SurfSide + USE MOD_Particle_Mesh_Vars ,ONLY: SideInfo_Shared +!--------------------------------------------------------------------------------------------------! + IMPLICIT NONE ! +!--------------------------------------------------------------------------------------------------! +! argument list declaration ! + INTEGER, INTENT(IN) :: GlobSideID + LOGICAL, INTENT(OUT) :: DONE +! Local variable declaration ! +!--------------------------------------------------------------------------------------------------! + REAL :: iRan + INTEGER :: SurfSideID +!--------------------------------------------------------------------------------------------------! + SurfSideID = GlobalSide2SurfSide(SURF_SIDEID,GlobSideID) + CALL RANDOM_NUMBER(iRan) + DONE = .FALSE. + IF (PartBound%PhotonEnACC(PartBound%MapToPartBC(SideInfo_Shared(SIDE_BCID,GlobSideID))).GT.iRan) THEN + DONE = .TRUE. + PhotonSampWall(1,SurfSideID) = PhotonSampWall(1,SurfSideID) + 1. + PhotonSampWall(2,SurfSideID) = PhotonSampWall(2,SurfSideID) + PhotonProps%PhotonEnergy + END IF + +END SUBROUTINE CalcWallAbsoprtion + +LOGICAL FUNCTION PointInObsCone(Point) +!=================================================================================================================================== +! checks if a point is in the opening cone of an external observer +!=================================================================================================================================== +! MODULES + USE MOD_Globals + USE MOD_RadiationTrans_Vars, ONLY: RadObservationPoint +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! INOUTPUT VARIABLES +REAL, INTENT(IN) :: Point(3) +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +REAL :: ConeDist, ConeRadius, orthoDist +!=================================================================================================================================== +PointInObsCone = .FALSE. +ConeDist = DOT_PRODUCT(Point(1:3) - RadObservationPoint%StartPoint(1:3), RadObservationPoint%ViewDirection(1:3)) +ConeRadius = TAN(RadObservationPoint%AngularAperture/2.) * ConeDist +orthoDist = VECNORM(Point(1:3) - RadObservationPoint%StartPoint(1:3) - ConeDist*RadObservationPoint%ViewDirection(1:3)) +IF (orthoDist.LE.ConeRadius) PointInObsCone = .TRUE. + +END FUNCTION PointInObsCone + +LOGICAL FUNCTION PhotonIntersectSensor(Point, Direction) +!=================================================================================================================================== +! checks if the photon's apth intersect with the opening cone of an external observer +!=================================================================================================================================== +! MODULES + USE MOD_Globals + USE MOD_RadiationTrans_Vars, ONLY: RadObservationPoint +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! INOUTPUT VARIABLES +REAL, INTENT(IN) :: Point(3), Direction(3) +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +REAL :: projectedDist, DirectionVec(3) +!=================================================================================================================================== +PhotonIntersectSensor = .FALSE. + +projectedDist = DOT_PRODUCT(RadObservationPoint%ViewDirection(1:3), Direction(1:3)) +IF (projectedDist.LT.0.0) THEN + DirectionVec(1:3) = RadObservationPoint%MidPoint(1:3) - Point(1:3) + !distance to travel + projectedDist = DOT_PRODUCT(DirectionVec(1:3), RadObservationPoint%ViewDirection(1:3))/projectedDist + ! actual intersection point + DirectionVec(1:3) = Point(1:3) + projectedDist*Direction(1:3) + !Vector from midpoint of sensor + DirectionVec(1:3) = DirectionVec(1:3) - RadObservationPoint%MidPoint(1:3) + !distance to midpoint + projectedDist = VECNORM(DirectionVec(1:3)) + IF (projectedDist.LE.RadObservationPoint%Diameter/2.) PhotonIntersectSensor = .TRUE. +END IF + +END FUNCTION PhotonIntersectSensor + +LOGICAL FUNCTION PhotonOnLineOfSight(Direction) +!=================================================================================================================================== +! checks if a photon is on the simulated line of sight +!=================================================================================================================================== +! MODULES + USE MOD_Globals + USE MOD_RadiationTrans_Vars, ONLY: RadObservationPoint +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! INOUTPUT VARIABLES +REAL, INTENT(IN) :: Direction(3) +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +REAL :: SkalarFactors(3) +INTEGER :: iDir, jDir +!=================================================================================================================================== +PhotonOnLineOfSight = .FALSE. +DO iDir = 1, 3 + IF (Direction(iDir).EQ.0.0) THEN + IF (RadObservationPoint%ViewDirection(iDir).NE.0.0) THEN + RETURN + ELSE + SkalarFactors(iDir) = 0.0 + END IF + ELSE + IF (RadObservationPoint%ViewDirection(iDir).EQ.0.0) THEN + RETURN + ELSE + SkalarFactors(iDir) = Direction(iDir)/ RadObservationPoint%ViewDirection(iDir) + END IF + END IF +END DO +PhotonOnLineOfSight = .TRUE. +DO iDir = 1, 2 + DO jDir = iDir+1 , 3 + IF (SkalarFactors(iDir).EQ.0.0) CYCLE + IF (SkalarFactors(jDir).EQ.0.0) CYCLE + IF (.NOT.ALMOSTEQUAL(SkalarFactors(iDir),SkalarFactors(jDir))) THEN + PhotonOnLineOfSight = .FALSE. + RETURN + END IF + END DO +END DO + +END FUNCTION PhotonOnLineOfSight + +END MODULE MOD_Photon_TrackingTools diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 index cf975df7d..dceba3d90 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 @@ -455,8 +455,8 @@ SUBROUTINE WritePhotonSurfSampleToHDF5() helpArray(1,1:nSurfSample,1:nSurfSample,OutputCounter) = PhotonSampWall(1,1:nSurfSample,1:nSurfSample,iSurfSide) helpArray2(OutputCounter) = SurfSide2GlobalSide(SURF_SIDEID,iSurfSide) ! SurfaceArea should be changed to 1:SurfMesh%nSides if inner sampling sides exist... - DO p = 1, nSurfSample - DO q = 1, nSurfSample + DO p = 1, INT(nSurfSample) + DO q = 1, INT(nSurfSample) helpArray(2,p,q,OutputCounter) = PhotonSampWall(2,p,q,iSurfSide)/PhotonSurfSideArea(p,q,iSurfSide) helpArray(3,p,q,OutputCounter) = PartBound%MapToPartBC(SideInfo_Shared(SIDE_BCID,GlobalSideID)) END DO ! q = 1, nSurfSample From 19cfc0056b43b0bec3e6b45043b81654bc812085 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Thu, 26 Oct 2023 11:07:50 +0200 Subject: [PATCH 272/495] Fixes for radiation --- .../NIG_Radiation/RadTrans_Cylinder_2D/analyze.ini | 2 +- .../NIG_Radiation/RadTrans_Cylinder_2D/hopr.ini | 0 .../RadTrans_Cylinder_2D/parameter.ini | 0 .../NIG_Radiation/RadTrans_Cylinder_3D/hopr.ini | 0 .../RadTrans_Cylinder_3D/parameter.ini | 0 .../Rad_Emission_SingleCell_N/Ni_NIST.dat | 0 .../Rad_Emission_SingleCell_N/cube_mesh.h5 | Bin .../Rad_Emission_SingleCell_N/parameter.ini | 0 .../Rad_Emission_SingleCell_O/Oi_NIST.dat | 0 .../Rad_Emission_SingleCell_O/cube_mesh.h5 | Bin .../Rad_Emission_SingleCell_O/parameter.ini | 0 src/particles/dsmc/dsmc_symmetry.f90 | 13 +++++++------ .../particle_mesh/particle_mesh_readin.f90 | 8 +++++--- src/particles/tracking/particle_triatracking.f90 | 2 +- 14 files changed, 14 insertions(+), 11 deletions(-) mode change 100755 => 100644 regressioncheck/NIG_Radiation/RadTrans_Cylinder_2D/hopr.ini mode change 100755 => 100644 regressioncheck/NIG_Radiation/RadTrans_Cylinder_2D/parameter.ini mode change 100755 => 100644 regressioncheck/NIG_Radiation/RadTrans_Cylinder_3D/hopr.ini mode change 100755 => 100644 regressioncheck/NIG_Radiation/RadTrans_Cylinder_3D/parameter.ini mode change 100755 => 100644 regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_N/Ni_NIST.dat mode change 100755 => 100644 regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_N/cube_mesh.h5 mode change 100755 => 100644 regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_N/parameter.ini mode change 100755 => 100644 regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_O/Oi_NIST.dat mode change 100755 => 100644 regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_O/cube_mesh.h5 mode change 100755 => 100644 regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_O/parameter.ini diff --git a/regressioncheck/NIG_Radiation/RadTrans_Cylinder_2D/analyze.ini b/regressioncheck/NIG_Radiation/RadTrans_Cylinder_2D/analyze.ini index a71a8e363..271cf3683 100644 --- a/regressioncheck/NIG_Radiation/RadTrans_Cylinder_2D/analyze.ini +++ b/regressioncheck/NIG_Radiation/RadTrans_Cylinder_2D/analyze.ini @@ -2,6 +2,6 @@ h5diff_file = RadTrans_Cylinder_2D_RadiationState.h5 h5diff_reference_file = RadTrans_Cylinder_2D_reference_RadiationState.h5 h5diff_data_set = ElemData -h5diff_tolerance_value = 10.0e-2 +h5diff_tolerance_value = 15.0e-2 h5diff_tolerance_type = relative h5diff_max_differences = 3 diff --git a/regressioncheck/NIG_Radiation/RadTrans_Cylinder_2D/hopr.ini b/regressioncheck/NIG_Radiation/RadTrans_Cylinder_2D/hopr.ini old mode 100755 new mode 100644 diff --git a/regressioncheck/NIG_Radiation/RadTrans_Cylinder_2D/parameter.ini b/regressioncheck/NIG_Radiation/RadTrans_Cylinder_2D/parameter.ini old mode 100755 new mode 100644 diff --git a/regressioncheck/NIG_Radiation/RadTrans_Cylinder_3D/hopr.ini b/regressioncheck/NIG_Radiation/RadTrans_Cylinder_3D/hopr.ini old mode 100755 new mode 100644 diff --git a/regressioncheck/NIG_Radiation/RadTrans_Cylinder_3D/parameter.ini b/regressioncheck/NIG_Radiation/RadTrans_Cylinder_3D/parameter.ini old mode 100755 new mode 100644 diff --git a/regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_N/Ni_NIST.dat b/regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_N/Ni_NIST.dat old mode 100755 new mode 100644 diff --git a/regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_N/cube_mesh.h5 b/regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_N/cube_mesh.h5 old mode 100755 new mode 100644 diff --git a/regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_N/parameter.ini b/regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_N/parameter.ini old mode 100755 new mode 100644 diff --git a/regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_O/Oi_NIST.dat b/regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_O/Oi_NIST.dat old mode 100755 new mode 100644 diff --git a/regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_O/cube_mesh.h5 b/regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_O/cube_mesh.h5 old mode 100755 new mode 100644 diff --git a/regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_O/parameter.ini b/regressioncheck/NIG_Radiation/Rad_Emission_SingleCell_O/parameter.ini old mode 100755 new mode 100644 diff --git a/src/particles/dsmc/dsmc_symmetry.f90 b/src/particles/dsmc/dsmc_symmetry.f90 index 490d63414..fc53b140d 100644 --- a/src/particles/dsmc/dsmc_symmetry.f90 +++ b/src/particles/dsmc/dsmc_symmetry.f90 @@ -85,7 +85,7 @@ SUBROUTINE DSMC_2D_InitVolumes() USE MOD_Particle_Mesh_Vars ,ONLY: GEO,LocalVolume,MeshVolume USE MOD_DSMC_Vars ,ONLY: SymmetrySide USE MOD_Particle_Mesh_Vars ,ONLY: ElemVolume_Shared,ElemCharLength_Shared -USE MOD_Particle_Mesh_Vars ,ONLY: NodeCoords_Shared,ElemSideNodeID_Shared, SideInfo_Shared, SideIsSymSide_Shared +USE MOD_Particle_Mesh_Vars ,ONLY: NodeCoords_Shared,ElemSideNodeID_Shared, SideInfo_Shared, SideIsSymSide_Shared, SideIsSymSide USE MOD_Mesh_Tools ,ONLY: GetCNElemID USE MOD_Particle_Mesh_Tools ,ONLY: GetGlobalNonUniqueSideID USE MOD_Particle_Surfaces ,ONLY: CalcNormAndTangTriangle @@ -119,14 +119,15 @@ SUBROUTINE DSMC_2D_InitVolumes() #if USE_MPI CALL Allocate_Shared((/nNonUniqueGlobalSides/),SideIsSymSide_Shared_Win,SideIsSymSide_Shared) CALL MPI_WIN_LOCK_ALL(0,SideIsSymSide_Shared_Win,IERROR) +SideIsSymSide => SideIsSymSide_Shared ! only CN root nullifies -IF(myComputeNodeRank.EQ.0) SideIsSymSide_Shared = .FALSE. +IF(myComputeNodeRank.EQ.0) SideIsSymSide = .FALSE. ! This sync/barrier is required as it cannot be guaranteed that the zeros have been written to memory by the time the MPI_REDUCE ! is executed (see MPI specification). Until the Sync is complete, the status is undefined, i.e., old or new value or utter nonsense. CALL BARRIER_AND_SYNC(SideIsSymSide_Shared_Win,MPI_COMM_SHARED) #else -ALLOCATE(SideIsSymSide_Shared(nComputeNodeSides)) -SideIsSymSide_Shared = .FALSE. +ALLOCATE(SideIsSymSide(nComputeNodeSides)) +SideIsSymSide = .FALSE. #endif /*USE_MPI*/ ! Flag of symmetry sides to be skipped during tracking @@ -139,7 +140,7 @@ SUBROUTINE DSMC_2D_InitVolumes() #endif DO iSide = firstSide, lastSide - SideIsSymSide_Shared(iSide) = .FALSE. + SideIsSymSide(iSide) = .FALSE. ! ignore non-BC sides IF (SideInfo_Shared(SIDE_BCID,iSide).LE.0) CYCLE #if USE_MPI @@ -147,7 +148,7 @@ SUBROUTINE DSMC_2D_InitVolumes() IF (ElemInfo_Shared(ELEM_HALOFLAG,SideInfo_Shared(SIDE_ELEMID,iSide)).EQ.0) CYCLE #endif /*USE_MPI*/ IF (PartBound%TargetBoundCond(PartBound%MapToPartBC(SideInfo_Shared(SIDE_BCID,iSide))).EQ.PartBound%SymmetryBC) & - SideIsSymSide_Shared(iSide) = .TRUE. + SideIsSymSide(iSide) = .TRUE. END DO SymmetryBCExists = .FALSE. diff --git a/src/particles/particle_mesh/particle_mesh_readin.f90 b/src/particles/particle_mesh/particle_mesh_readin.f90 index 4ad065c6d..1ead3a16e 100644 --- a/src/particles/particle_mesh/particle_mesh_readin.f90 +++ b/src/particles/particle_mesh/particle_mesh_readin.f90 @@ -445,8 +445,9 @@ SUBROUTINE FinalizeMeshReadin() USE MOD_MPI_Shared_Vars #endif #if USE_LOADBALANCE -USE MOD_LoadBalance_Vars ,ONLY: PerformLoadBalance +USE MOD_LoadBalance_Vars ,ONLY: PerformLoadBalance #endif /*USE_LOADBALANCE*/ +USE MOD_Particle_Vars ,ONLY: Symmetry ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -458,8 +459,9 @@ SUBROUTINE FinalizeMeshReadin() ! First, free every shared memory window. This requires MPI_BARRIER as per MPI3.1 specification #if USE_MPI CALL MPI_BARRIER(MPI_COMM_SHARED,iERROR) - -! volumes +! Sides +IF(Symmetry%Order.EQ.2) CALL UNLOCK_AND_FREE(SideIsSymSide_Shared_Win) +! Volumes CALL UNLOCK_AND_FREE(ElemVolume_Shared_Win) CALL UNLOCK_AND_FREE(ElemCharLength_Shared_Win) #endif /*USE_MPI*/ diff --git a/src/particles/tracking/particle_triatracking.f90 b/src/particles/tracking/particle_triatracking.f90 index 86857e139..702d49d3f 100644 --- a/src/particles/tracking/particle_triatracking.f90 +++ b/src/particles/tracking/particle_triatracking.f90 @@ -206,7 +206,7 @@ SUBROUTINE SingleParticleTriaTracking(i,IsInterPlanePart) TempSideID = ElemInfo_Shared(ELEM_FIRSTSIDEIND,ElemID) + iLocSide ! Skip symmetry side IF(Symmetry%Order.EQ.2) THEN - IF(SideIsSymSide_Shared(TempSideID)) CYCLE + IF(SideIsSymSide(TempSideID)) CYCLE END IF localSideID = SideInfo_Shared(SIDE_LOCALID,TempSideID) ! Side is not one of the 6 local sides From 76f5448faebd535ac906aa3eec28a3a97cbfbd4b Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Thu, 26 Oct 2023 11:54:54 +0200 Subject: [PATCH 273/495] Added PICLAS_SHARED_MEMORY tests to bug and feature gitlab templates --- .gitlab/merge_request_templates/Bug.md | 4 ++++ .gitlab/merge_request_templates/Feature.md | 6 +++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/.gitlab/merge_request_templates/Bug.md b/.gitlab/merge_request_templates/Bug.md index 76e5174b0..4cb1c18b1 100644 --- a/.gitlab/merge_request_templates/Bug.md +++ b/.gitlab/merge_request_templates/Bug.md @@ -7,3 +7,7 @@ Closes #number * [ ] Style Guide * [ ] Maximum of 10 compile warnings via *./tools/test_max_warnings.sh* * [ ] No large files via *./tools/test_max_file_size.sh*. What is the largest file? +* [ ] Test the three shared memory modes + * [ ] `PICLAS_SHARED_MEMORY = OMPI_COMM_TYPE_CORE` (default) for splitting shared memory domains on the physical node + * [ ] `PICLAS_SHARED_MEMORY = OMPI_COMM_TYPE_CORE` for splitting at process level, .i.e, each process yields a logical node + * [ ] `PICLAS_SHARED_MEMORY = PICLAS_COMM_TYPE_NODE` for splitting at 2 processes per logical node diff --git a/.gitlab/merge_request_templates/Feature.md b/.gitlab/merge_request_templates/Feature.md index 09a1888d6..23b6b3872 100644 --- a/.gitlab/merge_request_templates/Feature.md +++ b/.gitlab/merge_request_templates/Feature.md @@ -16,4 +16,8 @@ * [ ] Add small test setup * [ ] Add entry in REGGIE.md table * [ ] Check automatic restart functionality of reggie example via Load Balance (checks correct allocation and deallocation for the test case) -* [ ] New feature description in appropriate documentation (user/developer guide) \ No newline at end of file + * [ ] Test the three shared memory modes + * [ ] `PICLAS_SHARED_MEMORY = OMPI_COMM_TYPE_CORE` (default) for splitting shared memory domains on the physical node + * [ ] `PICLAS_SHARED_MEMORY = OMPI_COMM_TYPE_CORE` for splitting at process level, .i.e, each process yields a logical node + * [ ] `PICLAS_SHARED_MEMORY = PICLAS_COMM_TYPE_NODE` for splitting at 2 processes per logical node +* [ ] New feature description in appropriate documentation (user/developer guide) From 30b994cd4e290be2dbd3a8b815d74724a0be7a9d Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Thu, 26 Oct 2023 15:39:40 +0200 Subject: [PATCH 274/495] Removed element loop in CollisMode = 0 case, and added load balance instrumentation to BGGas_DeleteParticles --- src/particles/dsmc/dsmc_bg_gas.f90 | 20 +++++++++++++++++--- src/particles/dsmc/dsmc_main.f90 | 20 ++------------------ 2 files changed, 19 insertions(+), 21 deletions(-) diff --git a/src/particles/dsmc/dsmc_bg_gas.f90 b/src/particles/dsmc/dsmc_bg_gas.f90 index dcbddbd00..c8f936ee1 100644 --- a/src/particles/dsmc/dsmc_bg_gas.f90 +++ b/src/particles/dsmc/dsmc_bg_gas.f90 @@ -525,9 +525,12 @@ SUBROUTINE BGGas_DeleteParticles() ! Deletes all background gas particles and updates the particle index list !=================================================================================================================================== ! MODULES -USE MOD_DSMC_Vars, ONLY : BGGas -USE MOD_PARTICLE_Vars, ONLY : PDM, PartSpecies -USE MOD_part_tools, ONLY : UpdateNextFreePosition +USE MOD_DSMC_Vars ,ONLY: BGGas +USE MOD_PARTICLE_Vars ,ONLY: PDM, PartSpecies +USE MOD_part_tools ,ONLY: UpdateNextFreePosition +#if USE_LOADBALANCE +USE MOD_LoadBalance_Timers ,ONLY: LBStartTime, LBPauseTime +#endif /*USE_LOADBALANCE*/ ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -537,7 +540,14 @@ SUBROUTINE BGGas_DeleteParticles() !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES INTEGER :: iPart +#if USE_LOADBALANCE +REAL :: tLBStart +#endif /*USE_LOADBALANCE*/ !=================================================================================================================================== +#if USE_LOADBALANCE +CALL LBStartTime(tLBStart) +#endif /*USE_LOADBALANCE*/ + DO iPart = 1, PDM%ParticleVecLength IF (PDM%ParticleInside(iPart)) THEN IF(BGGas%BackgroundSpecies(PartSpecies(iPart))) PDM%ParticleInside(iPart) = .FALSE. @@ -545,6 +555,10 @@ SUBROUTINE BGGas_DeleteParticles() END DO BGGas%PairingPartner = 0 +#if USE_LOADBALANCE +CALL LBPauseTime(LB_DSMC,tLBStart) +#endif /*USE_LOADBALANCE*/ + CALL UpdateNextFreePosition() END SUBROUTINE BGGas_DeleteParticles diff --git a/src/particles/dsmc/dsmc_main.f90 b/src/particles/dsmc/dsmc_main.f90 index c0cd485ff..ad7b99b70 100644 --- a/src/particles/dsmc/dsmc_main.f90 +++ b/src/particles/dsmc/dsmc_main.f90 @@ -127,23 +127,6 @@ SUBROUTINE DSMC_main(DoElement) CALL LBElemSplitTime(iElem,tLBStart) #endif /*USE_LOADBALANCE*/ END DO ! iElem Loop -ELSE ! CollisMode = 0 - DO iElem = 1, nElems ! element/cell main loop - IF(PRESENT(DoElement)) THEN - IF (.NOT.DoElement(iElem)) CYCLE - END IF - nPart = PEM%pNumber(iElem) - IF (nPart.LT.1) CYCLE - IF(DSMC%CalcQualityFactors) THEN - DSMC%CollProbMax = 0.0; DSMC%CollProbMean = 0.0; DSMC%CollProbMeanCount = 0; DSMC%CollSepDist = 0.0; DSMC%CollSepCount = 0 - DSMC%MeanFreePath = 0.0; DSMC%MCSoverMFP = 0.0 - IF(DSMC%RotRelaxProb.GT.2) DSMC%CalcRotProb = 0. - DSMC%CalcVibProb = 0. - END IF -#if USE_LOADBALANCE - CALL LBElemSplitTime(iElem,tLBStart) -#endif /*USE_LOADBALANCE*/ - END DO ! iElem Loop END IF ! CollisMode.NE.0 ! Advance particle vector length and the current next free position with newly created particles @@ -155,8 +138,9 @@ SUBROUTINE DSMC_main(DoElement) ,'ERROR in DSMC: ParticleVecLength greater than MaxParticleNumber! Increase the MaxParticleNumber to at least: ' & , IntInfoOpt=PDM%ParticleVecLength) END IF + ! Delete background gas particles -IF((BGGas%NumberOfSpecies.GT.0).AND.(.NOT.UseMCC)) CALL BGGas_DeleteParticles +IF((BGGas%NumberOfSpecies.GT.0).AND.(.NOT.UseMCC)) CALL BGGas_DeleteParticles() ! Sampling of macroscopic values ! (here for a continuous average; average over N iterations is performed in src/analyze/analyze.f90) From 7aac6da6f4aabce52383b9caa33a5e181817d6ce Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Thu, 26 Oct 2023 17:15:14 +0200 Subject: [PATCH 275/495] Added check to prevent tab characters from being committed to the git repo --- .githooks/pre-commit | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/.githooks/pre-commit b/.githooks/pre-commit index 6d6721644..c0b004790 100755 --- a/.githooks/pre-commit +++ b/.githooks/pre-commit @@ -131,6 +131,18 @@ if [ -n "$CHANGED" ]; then ERROR=1 fi + # Check for tab characters in specific file endings + echo $file + if [ "${file:-4}" = ".txt" ] || [ "${file:-3}" = ".f90" ] || [ "${file:-4}" = ".ini" ]; then + # -P, --perl-regexp PATTERNS are Perl regular expressions + NbrOfLinesWithTabs=$(grep -P '\t' $file | wc -l) + echo "[${NbrOfLinesWithTabs}]" + if [ "${NbrOfLinesWithTabs}" -gt 0 ]; then + printf "${RED}Tab characters found in [${file}]. Remove them and then commit again!${NC}\n" + ERROR=1 + fi + fi + done # Abort if hook encountered any error @@ -144,4 +156,4 @@ if [ -n "$CHANGED" ]; then else echo 'No staged changes. Exiting ...' exit 0 -fi \ No newline at end of file +fi From 59da5bc9ec3333b1c0bb03d7dba95a87f2de3c9c Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Fri, 27 Oct 2023 00:00:46 +0200 Subject: [PATCH 276/495] Removed remains of RESERVOIR timedisc --- .../CHE_BGK/RELAX_CH4/parameter.ini | 1 - regressioncheck/CHE_DSMC/cube/parameter.ini | 3 - .../parameter.ini | 3 - .../CHE_FPFlow/RELAX_CH4/parameter.ini | 1 - .../IMD_coupling/parameter.ini | 1 - .../Macroscopic_Restart/parameter.ini | 1 - .../sphere_soft_DSMC/parameter.ini | 1 - .../sphere_soft_RK4_with_DSMC/parameter.ini | 1 - .../parameter.ini | 1 - regressioncheck/NIG_Reservoir/builds.ini | 2 +- .../CHEM_CONS_XSec_diss_ion_H2/parameter.ini | 4 - .../FieldIonization/parameter.ini | 1 - .../NIG_code_analyze/Semicircle/parameter.ini | 1 - .../parameter.ini | 1 - .../Laplace_h_N1_mortar/parameter.ini | 1 - .../NIG_dielectric/HDG_cylinder/parameter.ini | 1 - .../NIG_dielectric/HDG_slab/parameter.ini | 1 - .../parameter.ini | 1 - .../parameter.ini | 1 - .../parameter.ini | 1 - .../NIG_sanitize/poisson/parameter.ini | 20 --- .../Flow_N2_70degCone/parameter.ini | 1 - .../Flow_Argon_Cylinder_Curved/parameter.ini | 1 - .../parameter.ini | 1 - .../WEK_DSMC/Flow_N2_70degCone/parameter.ini | 1 - .../Flow_N2_70degCone/parameter.ini | 1 - regressioncheck/WEK_Reservoir/builds.ini | 2 +- .../run_basic/poisson/parameter.ini | 20 --- src/CMakeLists.txt | 6 - src/particles/dsmc/dsmc_electronic_model.f90 | 118 +++++++++--------- src/particles/dsmc/dsmc_init.f90 | 6 +- src/particles/dsmc/dsmc_vars.f90 | 4 +- src/particles/mcc/mcc.f90 | 12 +- .../chemistry-off/parameter.ini | 2 +- .../dsmc-reservoir/chemistry-on/parameter.ini | 6 +- 35 files changed, 71 insertions(+), 158 deletions(-) diff --git a/regressioncheck/CHE_BGK/RELAX_CH4/parameter.ini b/regressioncheck/CHE_BGK/RELAX_CH4/parameter.ini index 84e156f9a..2f13e57f3 100644 --- a/regressioncheck/CHE_BGK/RELAX_CH4/parameter.ini +++ b/regressioncheck/CHE_BGK/RELAX_CH4/parameter.ini @@ -73,7 +73,6 @@ Particles-DSMC-VibRelaxProb=0.05 ! DSMC ! =============================================================================== ! UseDSMC=T -Particles-DSMCReservoirSim=T Particles-DSMC-CalcQualityFactors=F Particles-DSMC-CollisMode=2 !(1:elast coll, 2: elast + rela, 3:chem) Part-NumberOfRandomSeeds =2 diff --git a/regressioncheck/CHE_DSMC/cube/parameter.ini b/regressioncheck/CHE_DSMC/cube/parameter.ini index 1208cf298..e537040ca 100644 --- a/regressioncheck/CHE_DSMC/cube/parameter.ini +++ b/regressioncheck/CHE_DSMC/cube/parameter.ini @@ -144,9 +144,6 @@ Part-Species14-MacroParticleFactor=1E7 ! DSMC ! =============================================================================== ! UseDSMC=true -Particles-DSMCReservoirSim=false -!Particles-DSMCReservoirSimRate=true -!Particles-DSMCReservoirStatistic=true Particles-DSMC-CollisMode=2,3 !(1:elast coll, 2: elast + rela, 3:chem) Part-NumberOfRandomSeeds=2 Particles-RandomSeed1=1 diff --git a/regressioncheck/CHE_DSMC/vMPF_BGG_MultiSpec_Merge_TraceSpec/parameter.ini b/regressioncheck/CHE_DSMC/vMPF_BGG_MultiSpec_Merge_TraceSpec/parameter.ini index 44328e5e4..11b01d90f 100644 --- a/regressioncheck/CHE_DSMC/vMPF_BGG_MultiSpec_Merge_TraceSpec/parameter.ini +++ b/regressioncheck/CHE_DSMC/vMPF_BGG_MultiSpec_Merge_TraceSpec/parameter.ini @@ -47,9 +47,6 @@ Part-FIBGMdeltas=(/4.64E-6,4.64E-6,4.64E-6/) ! =============================================================================== ! UseDSMC = T Particles-DSMC-CollisMode = 2 -Particles-DSMCReservoirSim = T -Particles-DSMCReservoirSimRate = T -Particles-DSMCReservoirStatistic = T Part-NumberOfRandomSeeds=2 Particles-RandomSeed1=1 Particles-RandomSeed2=2 diff --git a/regressioncheck/CHE_FPFlow/RELAX_CH4/parameter.ini b/regressioncheck/CHE_FPFlow/RELAX_CH4/parameter.ini index 100076b68..57c244db3 100644 --- a/regressioncheck/CHE_FPFlow/RELAX_CH4/parameter.ini +++ b/regressioncheck/CHE_FPFlow/RELAX_CH4/parameter.ini @@ -74,7 +74,6 @@ Particles-DSMC-VibRelaxProb=0.05 ! DSMC ! =============================================================================== ! UseDSMC=T -Particles-DSMCReservoirSim=T Particles-DSMC-CalcQualityFactors=F Particles-DSMC-CollisMode=2 !(1:elast coll, 2: elast + rela, 3:chem) Part-NumberOfRandomSeeds =2 diff --git a/regressioncheck/CHE_PIC_maxwell_RK4/IMD_coupling/parameter.ini b/regressioncheck/CHE_PIC_maxwell_RK4/IMD_coupling/parameter.ini index 0901591de..3a329ec81 100644 --- a/regressioncheck/CHE_PIC_maxwell_RK4/IMD_coupling/parameter.ini +++ b/regressioncheck/CHE_PIC_maxwell_RK4/IMD_coupling/parameter.ini @@ -162,7 +162,6 @@ Part-Species5-IsIMDSpecies = T ! DSMC ! =============================================================================== ! UseDSMC=false -Particles-DSMCReservoirSim=false Particles-NumberForDSMCOutputs=0 Part-TimeFracForSampling=0.0 Particles-DSMC-CollisMode=3 !(1:elast coll, 2: elast + rela, 3:chem) diff --git a/regressioncheck/NIG_DSMC/Macroscopic_Restart/parameter.ini b/regressioncheck/NIG_DSMC/Macroscopic_Restart/parameter.ini index 17b84c8c3..5241016d9 100644 --- a/regressioncheck/NIG_DSMC/Macroscopic_Restart/parameter.ini +++ b/regressioncheck/NIG_DSMC/Macroscopic_Restart/parameter.ini @@ -95,7 +95,6 @@ Particles-NumberForDSMCOutputs = 1 Part-TimeFracForSampling = 0.5 Particles-DSMC-CalcSurfaceVal = T Particles-DSMC-CalcQualityFactors = F -Particles-DSMCReservoirSim = F Particles-DSMC-CollisMode = 2 !(1:elast coll, 2: elast + rela, 3:chem) Part-NumberOfRandomSeeds = 2 Particles-RandomSeed1 = 1 diff --git a/regressioncheck/NIG_LoadBalance/sphere_soft_DSMC/parameter.ini b/regressioncheck/NIG_LoadBalance/sphere_soft_DSMC/parameter.ini index 46b48187d..397e53cb0 100644 --- a/regressioncheck/NIG_LoadBalance/sphere_soft_DSMC/parameter.ini +++ b/regressioncheck/NIG_LoadBalance/sphere_soft_DSMC/parameter.ini @@ -92,7 +92,6 @@ TrackingMethod = refmapping ! DSMC ! =============================================================================== ! UseDSMC = true -Particles-DSMCReservoirSim = false Particles-DSMC-CollisMode = 0 ! Collisionless flow Part-NumberOfRandomSeeds = 2 Particles-RandomSeed1 = 1 diff --git a/regressioncheck/NIG_LoadBalance/sphere_soft_RK4_with_DSMC/parameter.ini b/regressioncheck/NIG_LoadBalance/sphere_soft_RK4_with_DSMC/parameter.ini index d0bfce27b..a23b5f1bb 100644 --- a/regressioncheck/NIG_LoadBalance/sphere_soft_RK4_with_DSMC/parameter.ini +++ b/regressioncheck/NIG_LoadBalance/sphere_soft_RK4_with_DSMC/parameter.ini @@ -101,7 +101,6 @@ TrackingMethod = refmapping ! DSMC ! =============================================================================== ! UseDSMC=true -Particles-DSMCReservoirSim=false Particles-DSMC-CollisMode=0 ! Collisionless flow Part-NumberOfRandomSeeds =2 Particles-RandomSeed1= 1 diff --git a/regressioncheck/NIG_LoadBalance/sphere_soft_RK4_without_DSMC/parameter.ini b/regressioncheck/NIG_LoadBalance/sphere_soft_RK4_without_DSMC/parameter.ini index f1a36852d..82a6fdad1 100644 --- a/regressioncheck/NIG_LoadBalance/sphere_soft_RK4_without_DSMC/parameter.ini +++ b/regressioncheck/NIG_LoadBalance/sphere_soft_RK4_without_DSMC/parameter.ini @@ -100,7 +100,6 @@ TrackingMethod = refmapping ! DSMC ! =============================================================================== ! UseDSMC=F -Particles-DSMCReservoirSim=false Particles-DSMC-CollisMode=0 ! Collisionless flow Part-NumberOfRandomSeeds =2 Particles-RandomSeed1= 1 diff --git a/regressioncheck/NIG_Reservoir/builds.ini b/regressioncheck/NIG_Reservoir/builds.ini index 3bd7c1fa7..ae811b804 100644 --- a/regressioncheck/NIG_Reservoir/builds.ini +++ b/regressioncheck/NIG_Reservoir/builds.ini @@ -6,7 +6,7 @@ CMAKE_BUILD_TYPE=RELEASE LIBS_BUILD_HDF5 =OFF PICLAS_POLYNOMIAL_DEGREE=N PICLAS_EQNSYSNAME=maxwell -PICLAS_TIMEDISCMETHOD=RESERVOIR +PICLAS_TIMEDISCMETHOD=DSMC LIBS_USE_MPI =ON PICLAS_NODETYPE=GAUSS diff --git a/regressioncheck/NIG_code_analyze/CHEM_CONS_XSec_diss_ion_H2/parameter.ini b/regressioncheck/NIG_code_analyze/CHEM_CONS_XSec_diss_ion_H2/parameter.ini index 74000c0d2..3770fdac1 100755 --- a/regressioncheck/NIG_code_analyze/CHEM_CONS_XSec_diss_ion_H2/parameter.ini +++ b/regressioncheck/NIG_code_analyze/CHEM_CONS_XSec_diss_ion_H2/parameter.ini @@ -55,10 +55,6 @@ Particles-DSMCElectronicDatabase = Electronic-State-Database.h5 EpsMergeElectronicState = 1E-3 Part-Species$-ElecRelaxProb = 1. -Particles-DSMCReservoirSim = T -Particles-DSMCReservoirSimRate = F -Particles-DSMCReservoirStatistic = F - Particles-DSMC-VibRelaxProb = 0. ! =============================================================================== ! ! PARTICLES diff --git a/regressioncheck/NIG_code_analyze/FieldIonization/parameter.ini b/regressioncheck/NIG_code_analyze/FieldIonization/parameter.ini index 6ff35513b..ff7fe3954 100644 --- a/regressioncheck/NIG_code_analyze/FieldIonization/parameter.ini +++ b/regressioncheck/NIG_code_analyze/FieldIonization/parameter.ini @@ -72,7 +72,6 @@ Particles-DSMC-CollisMode = 0 !(0: No Collisions (0:free molecular flow w Particles-DSMC-ElectronicModel = 1 Particles-DSMCElectronicDatabase = DSMCSpecies_electronic_state_full_Data.h5 ! when supplied: doQK = true EpsMergeElectronicState = 1.e-2 ! merge QK levels when difference falls below eps -Particles-DSMCReservoirSim = F Particles-NumberForDSMCOutputs = 0 Part-TimeFracForSampling = 0.0 Part-NumberOfRandomSeeds = 2 diff --git a/regressioncheck/NIG_code_analyze/Semicircle/parameter.ini b/regressioncheck/NIG_code_analyze/Semicircle/parameter.ini index d187db88e..d23e36c6f 100644 --- a/regressioncheck/NIG_code_analyze/Semicircle/parameter.ini +++ b/regressioncheck/NIG_code_analyze/Semicircle/parameter.ini @@ -66,7 +66,6 @@ printDiffVec =(/0.21145302115002,0.18723754743135,0.,-0.26787840265560,- ! DSMC ! =============================================================================== ! UseDSMC=true -Particles-DSMCReservoirSim=false Particles-DSMC-CollisMode=0 !(1:elast coll, 2: elast + rela, 3:chem) Part-NumberOfRandomSeeds =2 Particles-RandomSeed1= 1 diff --git a/regressioncheck/NIG_convtest_poisson/Dielectric_sphere_in_sphere_curved_mortar/parameter.ini b/regressioncheck/NIG_convtest_poisson/Dielectric_sphere_in_sphere_curved_mortar/parameter.ini index b6d217335..c87f317c2 100644 --- a/regressioncheck/NIG_convtest_poisson/Dielectric_sphere_in_sphere_curved_mortar/parameter.ini +++ b/regressioncheck/NIG_convtest_poisson/Dielectric_sphere_in_sphere_curved_mortar/parameter.ini @@ -116,7 +116,6 @@ Part-Boundary1-Condition = open ! =============================================================================== ! UseDSMC=F Particles-DSMCElectronicDatabase=DSMCSpecies_electronic_state_full_Data.h5 ! when supplied: doQK=true -Particles-DSMCReservoirSim=false Particles-NumberForDSMCOutputs=0 Part-TimeFracForSampling=0.0 Particles-DSMC-CollisMode=3 !(1:elast coll, 2: elast + rela, 3:chem) diff --git a/regressioncheck/NIG_convtest_poisson/Laplace_h_N1_mortar/parameter.ini b/regressioncheck/NIG_convtest_poisson/Laplace_h_N1_mortar/parameter.ini index b2949c3e5..2ea59d99a 100644 --- a/regressioncheck/NIG_convtest_poisson/Laplace_h_N1_mortar/parameter.ini +++ b/regressioncheck/NIG_convtest_poisson/Laplace_h_N1_mortar/parameter.ini @@ -124,7 +124,6 @@ Part-Boundary6-SourceName = BC_z+ ! =============================================================================== ! UseDSMC=F Particles-DSMCElectronicDatabase=DSMCSpecies_electronic_state_full_Data.h5 ! when supplied: doQK=true -Particles-DSMCReservoirSim=false Particles-NumberForDSMCOutputs=0 Part-TimeFracForSampling=0.0 Particles-DSMC-CollisMode=3 !(1:elast coll, 2: elast + rela, 3:chem) diff --git a/regressioncheck/NIG_dielectric/HDG_cylinder/parameter.ini b/regressioncheck/NIG_dielectric/HDG_cylinder/parameter.ini index c420f9033..7d6e6a64a 100644 --- a/regressioncheck/NIG_dielectric/HDG_cylinder/parameter.ini +++ b/regressioncheck/NIG_dielectric/HDG_cylinder/parameter.ini @@ -122,7 +122,6 @@ Part-nPeriodicVectors=2 ! =============================================================================== ! UseDSMC=F Particles-DSMCElectronicDatabase=DSMCSpecies_electronic_state_full_Data.h5 ! when supplied: doQK=true -Particles-DSMCReservoirSim=false Particles-NumberForDSMCOutputs=0 Part-TimeFracForSampling=0.0 Particles-DSMC-CollisMode=3 !(1:elast coll, 2: elast + rela, 3:chem) diff --git a/regressioncheck/NIG_dielectric/HDG_slab/parameter.ini b/regressioncheck/NIG_dielectric/HDG_slab/parameter.ini index 1afa7ca79..a2fb4ea30 100644 --- a/regressioncheck/NIG_dielectric/HDG_slab/parameter.ini +++ b/regressioncheck/NIG_dielectric/HDG_slab/parameter.ini @@ -127,7 +127,6 @@ Part-nPeriodicVectors=2 ! =============================================================================== ! UseDSMC=F Particles-DSMCElectronicDatabase=DSMCSpecies_electronic_state_full_Data.h5 ! when supplied: doQK=true -Particles-DSMCReservoirSim=false Particles-NumberForDSMCOutputs=0 Part-TimeFracForSampling=0.0 Particles-DSMC-CollisMode=3 !(1:elast coll, 2: elast + rela, 3:chem) diff --git a/regressioncheck/NIG_dielectric/HDG_sphere_in_box_analytical_BC/parameter.ini b/regressioncheck/NIG_dielectric/HDG_sphere_in_box_analytical_BC/parameter.ini index fab85c66e..0cc1a8e77 100644 --- a/regressioncheck/NIG_dielectric/HDG_sphere_in_box_analytical_BC/parameter.ini +++ b/regressioncheck/NIG_dielectric/HDG_sphere_in_box_analytical_BC/parameter.ini @@ -123,7 +123,6 @@ Part-Boundary6-Condition = open ! =============================================================================== ! UseDSMC=F Particles-DSMCElectronicDatabase=DSMCSpecies_electronic_state_full_Data.h5 ! when supplied: doQK=true -Particles-DSMCReservoirSim=false Particles-NumberForDSMCOutputs=0 Part-TimeFracForSampling=0.0 Particles-DSMC-CollisMode=3 !(1:elast coll, 2: elast + rela, 3:chem) diff --git a/regressioncheck/NIG_dielectric/HDG_sphere_in_box_potential_BC/parameter.ini b/regressioncheck/NIG_dielectric/HDG_sphere_in_box_potential_BC/parameter.ini index fe7fb8648..3f2e1095e 100644 --- a/regressioncheck/NIG_dielectric/HDG_sphere_in_box_potential_BC/parameter.ini +++ b/regressioncheck/NIG_dielectric/HDG_sphere_in_box_potential_BC/parameter.ini @@ -133,7 +133,6 @@ Part-nPeriodicVectors=2 ! =============================================================================== ! UseDSMC=F Particles-DSMCElectronicDatabase=DSMCSpecies_electronic_state_full_Data.h5 ! when supplied: doQK=true -Particles-DSMCReservoirSim=false Particles-NumberForDSMCOutputs=0 Part-TimeFracForSampling=0.0 Particles-DSMC-CollisMode=3 !(1:elast coll, 2: elast + rela, 3:chem) diff --git a/regressioncheck/NIG_dielectric/HDG_sphere_in_sphere_analytical_BC/parameter.ini b/regressioncheck/NIG_dielectric/HDG_sphere_in_sphere_analytical_BC/parameter.ini index a4a1d9041..e40b6f32d 100644 --- a/regressioncheck/NIG_dielectric/HDG_sphere_in_sphere_analytical_BC/parameter.ini +++ b/regressioncheck/NIG_dielectric/HDG_sphere_in_sphere_analytical_BC/parameter.ini @@ -96,7 +96,6 @@ Part-Boundary1-Condition = open ! =============================================================================== ! UseDSMC=F Particles-DSMCElectronicDatabase=DSMCSpecies_electronic_state_full_Data.h5 ! when supplied: doQK=true -Particles-DSMCReservoirSim=false Particles-NumberForDSMCOutputs=0 Part-TimeFracForSampling=0.0 Particles-DSMC-CollisMode=3 !(1:elast coll, 2: elast + rela, 3:chem) diff --git a/regressioncheck/NIG_sanitize/poisson/parameter.ini b/regressioncheck/NIG_sanitize/poisson/parameter.ini index 1ff1e4470..0772af05f 100644 --- a/regressioncheck/NIG_sanitize/poisson/parameter.ini +++ b/regressioncheck/NIG_sanitize/poisson/parameter.ini @@ -121,29 +121,9 @@ Part-PartLorentzType = 3 ! old ! =============================================================================== ! ! DSMC ! =============================================================================== ! -! UseDSMC=false -! Particles-DSMCReservoirSim=false -! Particles-NumberForDSMCOutputs=0 -! Part-TimeFracForSampling=0.0 -! Particles-DSMC-CollisMode=3 !(1:elast coll, 2: elast + rela, 3:chem) -! Part-NumberOfRandomSeeds =2 -! Particles-RandomSeed1= 1 -! Particles-RandomSeed2= 2 -! !ManualTimeStep=3.3E-13 -! -! Particles-HaloEpsVelo=300E6 -! epsCG=1e-6 ! 1.0E-6 -! maxIterCG=2000 !'500' -! ! MISC -! -! xyzPhysicalMinMax = (/-5.00E-01,5.00E-01,-5.00E-01,5.00E-01,-5.00E-01,5.00E-01,/) ! - - - UseDSMC=T ! yolo Particles-DSMC-ElectronicModel= 1 Particles-DSMCElectronicDatabase=DSMCSpecies_electronic_state_full_Data.h5 ! when supplied: doQK=true -Particles-DSMCReservoirSim=false Particles-NumberForDSMCOutputs=0 Part-TimeFracForSampling=0.0 Particles-DSMC-CollisMode=3 !(1:elast coll, 2: elast + rela, 3:chem) diff --git a/regressioncheck/WEK_BGKFlow/Flow_N2_70degCone/parameter.ini b/regressioncheck/WEK_BGKFlow/Flow_N2_70degCone/parameter.ini index ed443a8a9..40f935278 100644 --- a/regressioncheck/WEK_BGKFlow/Flow_N2_70degCone/parameter.ini +++ b/regressioncheck/WEK_BGKFlow/Flow_N2_70degCone/parameter.ini @@ -91,7 +91,6 @@ Particles-NumberForDSMCOutputs = 1 Part-TimeFracForSampling = 0.5 Particles-DSMC-CalcSurfaceVal = T Particles-DSMC-CalcQualityFactors = T -Particles-DSMCReservoirSim = F Particles-DSMC-CollisMode = 2 !(1:elast coll, 2: elast + rela, 3:chem) Part-NumberOfRandomSeeds = 2 Particles-RandomSeed1 = 1 diff --git a/regressioncheck/WEK_DSMC/Flow_Argon_Cylinder_Curved/parameter.ini b/regressioncheck/WEK_DSMC/Flow_Argon_Cylinder_Curved/parameter.ini index 28b062893..43f26cfd3 100644 --- a/regressioncheck/WEK_DSMC/Flow_Argon_Cylinder_Curved/parameter.ini +++ b/regressioncheck/WEK_DSMC/Flow_Argon_Cylinder_Curved/parameter.ini @@ -88,7 +88,6 @@ Particles-NumberForDSMCOutputs=100 Particles-DSMC-CalcSurfaceVal=true Particles-DSMC-CalcQualityFactors=true UseDSMC=true -Particles-DSMCReservoirSim=false Particles-DSMC-CollisMode=1 !(1:elast coll, 2: elast + rela, 3:chem) Part-NumberOfRandomSeeds=2 Particles-RandomSeed1=1 diff --git a/regressioncheck/WEK_DSMC/Flow_Argon_Cylinder_LinearMesh/parameter.ini b/regressioncheck/WEK_DSMC/Flow_Argon_Cylinder_LinearMesh/parameter.ini index bdc2c4bd1..347f5951b 100644 --- a/regressioncheck/WEK_DSMC/Flow_Argon_Cylinder_LinearMesh/parameter.ini +++ b/regressioncheck/WEK_DSMC/Flow_Argon_Cylinder_LinearMesh/parameter.ini @@ -81,7 +81,6 @@ Part-TimeFracForSampling=0.75 Particles-DSMC-CalcSurfaceVal=T Particles-DSMC-CalcQualityFactors=T UseDSMC=true -Particles-DSMCReservoirSim=false Particles-DSMC-CollisMode=1 !(1:elast coll, 2: elast + rela, 3:chem) Part-NumberOfRandomSeeds=2 Particles-RandomSeed1=1 diff --git a/regressioncheck/WEK_DSMC/Flow_N2_70degCone/parameter.ini b/regressioncheck/WEK_DSMC/Flow_N2_70degCone/parameter.ini index d7d9e7d37..67034307b 100755 --- a/regressioncheck/WEK_DSMC/Flow_N2_70degCone/parameter.ini +++ b/regressioncheck/WEK_DSMC/Flow_N2_70degCone/parameter.ini @@ -98,7 +98,6 @@ Particles-NumberForDSMCOutputs = 1 Part-TimeFracForSampling = 0.5 Particles-DSMC-CalcSurfaceVal = T Particles-DSMC-CalcQualityFactors = T -Particles-DSMCReservoirSim = F Particles-DSMC-CollisMode = 2 !(1:elast coll, 2: elast + rela, 3:chem) Part-NumberOfRandomSeeds = 2 Particles-RandomSeed1 = 1 diff --git a/regressioncheck/WEK_FPFlow/Flow_N2_70degCone/parameter.ini b/regressioncheck/WEK_FPFlow/Flow_N2_70degCone/parameter.ini index c71b25f7e..a13580503 100644 --- a/regressioncheck/WEK_FPFlow/Flow_N2_70degCone/parameter.ini +++ b/regressioncheck/WEK_FPFlow/Flow_N2_70degCone/parameter.ini @@ -91,7 +91,6 @@ Particles-NumberForDSMCOutputs = 1 Part-TimeFracForSampling = 0.5 Particles-DSMC-CalcSurfaceVal = T Particles-DSMC-CalcQualityFactors = T -Particles-DSMCReservoirSim = F Particles-DSMC-CollisMode = 2 !(1:elast coll, 2: elast + rela, 3:chem) Part-NumberOfRandomSeeds = 2 Particles-RandomSeed1 = 1 diff --git a/regressioncheck/WEK_Reservoir/builds.ini b/regressioncheck/WEK_Reservoir/builds.ini index 3bd7c1fa7..ae811b804 100644 --- a/regressioncheck/WEK_Reservoir/builds.ini +++ b/regressioncheck/WEK_Reservoir/builds.ini @@ -6,7 +6,7 @@ CMAKE_BUILD_TYPE=RELEASE LIBS_BUILD_HDF5 =OFF PICLAS_POLYNOMIAL_DEGREE=N PICLAS_EQNSYSNAME=maxwell -PICLAS_TIMEDISCMETHOD=RESERVOIR +PICLAS_TIMEDISCMETHOD=DSMC LIBS_USE_MPI =ON PICLAS_NODETYPE=GAUSS diff --git a/regressioncheck/run_basic/poisson/parameter.ini b/regressioncheck/run_basic/poisson/parameter.ini index 5e8648cbe..c766acdd6 100644 --- a/regressioncheck/run_basic/poisson/parameter.ini +++ b/regressioncheck/run_basic/poisson/parameter.ini @@ -121,29 +121,9 @@ Part-PartLorentzType = 3 ! old ! =============================================================================== ! ! DSMC ! =============================================================================== ! -! UseDSMC=false -! Particles-DSMCReservoirSim=false -! Particles-NumberForDSMCOutputs=0 -! Part-TimeFracForSampling=0.0 -! Particles-DSMC-CollisMode=3 !(1:elast coll, 2: elast + rela, 3:chem) -! Part-NumberOfRandomSeeds =2 -! Particles-RandomSeed1= 1 -! Particles-RandomSeed2= 2 -! !ManualTimeStep=3.3E-13 -! -! Particles-HaloEpsVelo=300E6 -! epsCG=1e-6 ! 1.0E-6 -! maxIterCG=2000 !'500' -! ! MISC -! -! xyzPhysicalMinMax = (/-5.00E-01,5.00E-01,-5.00E-01,5.00E-01,-5.00E-01,5.00E-01,/) ! - - - UseDSMC=T ! yolo Particles-DSMC-ElectronicModel= 1 Particles-DSMCElectronicDatabase=DSMCSpecies_electronic_state_full_Data.h5 ! when supplied: doQK=true -Particles-DSMCReservoirSim=false Particles-NumberForDSMCOutputs=0 Part-TimeFracForSampling=0.0 Particles-DSMC-CollisMode=3 !(1:elast coll, 2: elast + rela, 3:chem) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index bee1ec4c8..eb4e1225e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -28,7 +28,6 @@ SET_PROPERTY(CACHE PICLAS_TIMEDISCMETHOD PROPERTY STRINGS Euler-Explicit RK4 RK14 DSMC - RESERVOIR FP-Flow BGK-Flow CN @@ -160,8 +159,6 @@ IF(PICLAS_PARTICLES) ELSE() IF(PICLAS_TIMEDISCMETHOD STREQUAL "DSMC") MESSAGE(SEND_ERROR "DSMC cannot be used without particles.") - ELSEIF(PICLAS_TIMEDISCMETHOD STREQUAL "RESERVOIR") - MESSAGE(SEND_ERROR "RESERVOIR cannot be used without particles.") ELSEIF(PICLAS_TIMEDISCMETHOD STREQUAL "BGK-Flow") MESSAGE(SEND_ERROR "BGK-Flow cannot be used without particles.") ELSEIF(PICLAS_TIMEDISCMETHOD STREQUAL "FP-Flow") @@ -240,9 +237,6 @@ ELSEIF(PICLAS_TIMEDISCMETHOD STREQUAL "RK14") ELSEIF(PICLAS_TIMEDISCMETHOD STREQUAL "DSMC") FILE(GLOB timediscF90 ${CMAKE_CURRENT_SOURCE_DIR}/src/timedisc/timedisc_TimeStep_DSMC.f90) ADD_DEFINITIONS(-DPP_TimeDiscMethod=4) -ELSEIF(PICLAS_TIMEDISCMETHOD STREQUAL "RESERVOIR") - FILE(GLOB timediscF90 ${CMAKE_CURRENT_SOURCE_DIR}/src/timedisc/timedisc_TimeStep_DSMC_Debug.f90) - ADD_DEFINITIONS(-DPP_TimeDiscMethod=42) ELSEIF(PICLAS_TIMEDISCMETHOD STREQUAL "CN") FILE(GLOB timediscF90 ${CMAKE_CURRENT_SOURCE_DIR}/src/timedisc/timedisc_TimeStepByImplicitRK.f90) ADD_DEFINITIONS(-DPP_TimeDiscMethod=120 -DIMPA) diff --git a/src/particles/dsmc/dsmc_electronic_model.f90 b/src/particles/dsmc/dsmc_electronic_model.f90 index e52067f04..bcf25dab7 100644 --- a/src/particles/dsmc/dsmc_electronic_model.f90 +++ b/src/particles/dsmc/dsmc_electronic_model.f90 @@ -29,10 +29,6 @@ MODULE MOD_DSMC_ElectronicModel MODULE PROCEDURE InitElectronShell END INTERFACE -INTERFACE TVEEnergyExchange - MODULE PROCEDURE TVEEnergyExchange -END INTERFACE - INTERFACE ReadSpeciesLevel MODULE PROCEDURE ReadSpeciesLevel END INTERFACE @@ -1076,55 +1072,69 @@ END SUBROUTINE EnergyConsElec SUBROUTINE TVEEnergyExchange(CollisionEnergy,iPart1,FakXi) !=================================================================================================================================== -! Electronic energy exchange +! Translational-vibrational-electronic energy exchange !=================================================================================================================================== - USE MOD_DSMC_Vars, ONLY : DSMC, SpecDSMC, PartStateIntEn - USE MOD_Particle_Vars, ONLY : PartSpecies - USE MOD_Globals_Vars, ONLY : BoltzmannConst +USE MOD_DSMC_Vars ,ONLY: DSMC, SpecDSMC, PartStateIntEn +USE MOD_Particle_Vars ,ONLY: PartSpecies +USE MOD_Globals_Vars ,ONLY: BoltzmannConst ! IMPLICIT VARIABLE HANDLING - IMPLICIT NONE +IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES - INTEGER, INTENT(IN) :: iPart1 - REAL, INTENT(IN) :: FakXi +INTEGER, INTENT(IN) :: iPart1 +REAL, INTENT(IN) :: FakXi !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES - REAL, INTENT(INOUT) :: CollisionEnergy ! +REAL, INTENT(INOUT) :: CollisionEnergy !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES - INTEGER :: iQuaMax, MaxElecQuant, iQua ! , iQuaMax3 - INTEGER :: jQVib, QMaxVib - REAL :: iRan, iRan2, gmax, gtemp, PartStateTemp, iRanVib +INTEGER :: iQuaMax, MaxElecQuant, iQua +INTEGER :: jQVib, QMaxVib +REAL :: iRan, iRan2, gmax, gtemp, PartStateTemp, iRanVib !=================================================================================================================================== - iQuaMax = 0 - ! Determine max electronic quant - MaxElecQuant = SpecDSMC(PartSpecies(iPart1))%MaxElecQuant - 1 - ! determine maximal Quant and term according to Eq (7) of Liechty - gmax = 0 - PartStateTemp = CollisionEnergy / BoltzmannConst - DO iQua = 0, MaxElecQuant - IF ( (PartStateTemp & - - SpecDSMC(PartSpecies(iPart1))%ElectronicState(2,iQua) & - - DSMC%GammaQuant * SpecDSMC(PartSpecies(iPart1))%CharaTVib) & - .ge. 0 ) THEN - gtemp = SpecDSMC(PartSpecies(iPart1))%ElectronicState(1,iQua) * & - ( CollisionEnergy - BoltzmannConst * SpecDSMC(PartSpecies(iPart1))%ElectronicState(2,iQua) & - -DSMC%GammaQuant * SpecDSMC(PartSpecies(iPart1))%CharaTVib * BoltzmannConst)**FakXi - ! maximal possible Quant before term goes negative - iQuaMax = iQua - IF ( gtemp .gt. gmax ) THEN - ! Quant of largest value of Eq (7) - gmax = gtemp - END IF +iQuaMax = 0 +! Determine max electronic quant +MaxElecQuant = SpecDSMC(PartSpecies(iPart1))%MaxElecQuant - 1 +! determine maximal Quant and term according to Eq (7) of Liechty +gmax = 0 +PartStateTemp = CollisionEnergy / BoltzmannConst +DO iQua = 0, MaxElecQuant + IF ( (PartStateTemp & + - SpecDSMC(PartSpecies(iPart1))%ElectronicState(2,iQua) & + - DSMC%GammaQuant * SpecDSMC(PartSpecies(iPart1))%CharaTVib) & + .ge. 0 ) THEN + gtemp = SpecDSMC(PartSpecies(iPart1))%ElectronicState(1,iQua) * & + ( CollisionEnergy - BoltzmannConst * SpecDSMC(PartSpecies(iPart1))%ElectronicState(2,iQua) & + -DSMC%GammaQuant * SpecDSMC(PartSpecies(iPart1))%CharaTVib * BoltzmannConst)**FakXi + ! maximal possible Quant before term goes negative + iQuaMax = iQua + IF ( gtemp .gt. gmax ) THEN + ! Quant of largest value of Eq (7) + gmax = gtemp END IF - END DO - ! max iQuant for dicing - QMaxVib = INT(CollisionEnergy/(BoltzmannConst*SpecDSMC(PartSpecies(iPart1))%CharaTVib) & - - DSMC%GammaQuant) - QMaxVib = MIN(QMaxVib + 1, SpecDSMC(PartSpecies(iPart1))%MaxVibQuant) + END IF +END DO +! max iQuant for dicing +QMaxVib = INT(CollisionEnergy/(BoltzmannConst*SpecDSMC(PartSpecies(iPart1))%CharaTVib) & + - DSMC%GammaQuant) +QMaxVib = MIN(QMaxVib + 1, SpecDSMC(PartSpecies(iPart1))%MaxVibQuant) +CALL RANDOM_NUMBER(iRan) +CALL RANDOM_NUMBER(iRanVib) +iQua = INT( ( iQuaMax +1 ) * iRan) +jQVib = INT(iRanVib * QMaxVib) +gtemp =( CollisionEnergy - BoltzmannConst * SpecDSMC(PartSpecies(iPart1))%ElectronicState(2,iQua) & + -(DSMC%GammaQuant + jQVib) * SpecDSMC(PartSpecies(iPart1))%CharaTVib * BoltzmannConst) +IF (gtemp.LE.0.0) THEN + gtemp = 0.0 +ELSE + gtemp = SpecDSMC(PartSpecies(iPart1))%ElectronicState(1,iQua) *(gtemp)**FakXi +END IF +CALL RANDOM_NUMBER(iRan2) +! acceptance-rejection for iQuaElec +DO WHILE ( iRan2 .ge. gtemp / gmax ) CALL RANDOM_NUMBER(iRan) CALL RANDOM_NUMBER(iRanVib) - iQua = INT( ( iQuaMax +1 ) * iRan) + iQua = int( ( iQuaMax +1 ) * iRan) jQVib = INT(iRanVib * QMaxVib) gtemp =( CollisionEnergy - BoltzmannConst * SpecDSMC(PartSpecies(iPart1))%ElectronicState(2,iQua) & -(DSMC%GammaQuant + jQVib) * SpecDSMC(PartSpecies(iPart1))%CharaTVib * BoltzmannConst) @@ -1134,27 +1144,11 @@ SUBROUTINE TVEEnergyExchange(CollisionEnergy,iPart1,FakXi) gtemp = SpecDSMC(PartSpecies(iPart1))%ElectronicState(1,iQua) *(gtemp)**FakXi END IF CALL RANDOM_NUMBER(iRan2) - ! acceptance-rejection for iQuaElec - DO WHILE ( iRan2 .ge. gtemp / gmax ) - CALL RANDOM_NUMBER(iRan) - CALL RANDOM_NUMBER(iRanVib) - iQua = int( ( iQuaMax +1 ) * iRan) - jQVib = INT(iRanVib * QMaxVib) - gtemp =( CollisionEnergy - BoltzmannConst * SpecDSMC(PartSpecies(iPart1))%ElectronicState(2,iQua) & - -(DSMC%GammaQuant + jQVib) * SpecDSMC(PartSpecies(iPart1))%CharaTVib * BoltzmannConst) - IF (gtemp.LE.0.0) THEN - gtemp = 0.0 - ELSE - gtemp = SpecDSMC(PartSpecies(iPart1))%ElectronicState(1,iQua) *(gtemp)**FakXi - END IF - CALL RANDOM_NUMBER(iRan2) - END DO - ! Reservoir simulation for obtaining the reaction rate at one given point does not require to perform the reaction - IF (DSMC%ReservoirSimu.AND..NOT.DSMC%ReservoirSimuRate) THEN - PartStateIntEn(3,iPart1) = BoltzmannConst * SpecDSMC(PartSpecies(iPart1))%ElectronicState(2,iQua) - PartStateIntEn(1,iPart1) = (jQVib + DSMC%GammaQuant) * BoltzmannConst & - * SpecDSMC(PartSpecies(iPart1))%CharaTVib - END IF +END DO + +PartStateIntEn(3,iPart1) = BoltzmannConst * SpecDSMC(PartSpecies(iPart1))%ElectronicState(2,iQua) +PartStateIntEn(1,iPart1) = (jQVib + DSMC%GammaQuant) * BoltzmannConst & + * SpecDSMC(PartSpecies(iPart1))%CharaTVib END SUBROUTINE TVEEnergyExchange diff --git a/src/particles/dsmc/dsmc_init.f90 b/src/particles/dsmc/dsmc_init.f90 index 8ca00a10e..5b8478722 100644 --- a/src/particles/dsmc/dsmc_init.f90 +++ b/src/particles/dsmc/dsmc_init.f90 @@ -895,10 +895,10 @@ SUBROUTINE InitDSMC() ! Journal of Computational Physics 246, 28–36. doi:10.1016/j.jcp.2013.03.018 !----------------------------------------------------------------------------------------------------------------------------------- DSMC%UseOctree = GETLOGICAL('Particles-DSMC-UseOctree') - IF(DSMC%ReservoirSimu.AND.DSMC%UseOctree) CALL abort(__STAMP__,'Particles-DSMC-UseOctree = T not allowed for RESERVOIR simulation') + IF(DSMC%ReservoirSimu.AND.DSMC%UseOctree) CALL abort(__STAMP__,'Particles-DSMC-UseOctree = T not allowed for RESERVOIR simulations!') DSMC%UseNearestNeighbour = GETLOGICAL('Particles-DSMC-UseNearestNeighbour') - IF(DSMC%ReservoirSimu.AND.DSMC%UseNearestNeighbour.AND.CollisMode.EQ.3) THEN - CALL abort(__STAMP__,'Particles-DSMC-UseNearestNeighbour = T not allowed for RESERVOIR simulation with chemical reactions') + IF(DSMC%ReservoirSimu.AND.DSMC%UseNearestNeighbour) THEN + CALL abort(__STAMP__,'Particles-DSMC-UseNearestNeighbour = T not allowed for RESERVOIR simulations!') END IF IF(DSMC%UseOctree) THEN IF(NGeo.GT.PP_N) CALL abort(__STAMP__,' Set PP_N to NGeo, else, the volume is not computed correctly.') diff --git a/src/particles/dsmc/dsmc_vars.f90 b/src/particles/dsmc/dsmc_vars.f90 index 03690a413..6d887e889 100644 --- a/src/particles/dsmc/dsmc_vars.f90 +++ b/src/particles/dsmc/dsmc_vars.f90 @@ -168,7 +168,7 @@ MODULE MOD_DSMC_Vars LOGICAL :: UseElecXSec ! Flag if the electronic relaxation probability should be treated, ! using read-in cross-sectional data (currently only with BGG) REAL,ALLOCATABLE :: CollFreqPreFactor(:) ! Prefactors for calculating the collision frequency in each time step - REAL,ALLOCATABLE :: ElecRelaxCorrectFac(:) ! Correction factor for electronical landau-teller relaxation + REAL,ALLOCATABLE :: ElecRelaxCorrectFac(:) ! Correction factor for electronic landau-teller relaxation REAL :: MaxMeanXiElec(2) ! 1: max mean XiElec 2: Temperature corresponding to max mean XiElec END TYPE tSpeciesDSMC @@ -185,7 +185,7 @@ MODULE MOD_DSMC_Vars INTEGER :: NumOutput ! number of Outputs REAL :: DeltaTimeOutput ! Time interval for Output LOGICAL :: ReservoirSimu ! Flag for reservoir simulation - LOGICAL :: ReservoirSimuRate ! Does not performe the collision. + LOGICAL :: ReservoirSimuRate ! Does not perform the collision. ! Switch to enable to create reaction rates curves LOGICAL :: ReservoirSurfaceRate ! Switch enabling surface rate output without changing surface coverages LOGICAL :: ReservoirRateStatistic ! if false, calculate the reaction coefficient rate by the probability diff --git a/src/particles/mcc/mcc.f90 b/src/particles/mcc/mcc.f90 index 4a6bfb5ee..71197edb5 100644 --- a/src/particles/mcc/mcc.f90 +++ b/src/particles/mcc/mcc.f90 @@ -547,8 +547,7 @@ SUBROUTINE MonteCarloCollision(iElem) DSMC%CollProbMean = DSMC%CollProbMean + CollProb DSMC%CollProbMeanCount = DSMC%CollProbMeanCount + 1 END IF ! DSMC%CalcQualityFactors - -#if (PP_TimeDiscMethod==4) + ! Reservoir simulation: determination of the reaction probabilities IF (DSMC%ReservoirSimu) THEN ! Sum of collision probabilities for the collision pair, required for the correct reaction rate IF(ChemReac%NumOfReact.GT.0) THEN @@ -563,9 +562,8 @@ SUBROUTINE MonteCarloCollision(iElem) END IF ChemReac%ReacCollMean(iCase) = ChemReac%ReacCollMean(iCase) + CollProb END IF - END IF ! ChemReac%NumOfReact.GT.0 - END IF -#endif + END IF ! ChemReac%NumOfReact.GT.0 + END IF ! DSMC%ReservoirSimu END DO ! DO WHILE(iLoop.LE.SpecPairNum(iCase)) SDEALLOCATE(PartIndexCase) END DO ! bgSpec = 1, BGGas%NumberOfSpecies @@ -711,13 +709,11 @@ SUBROUTINE MCC_CalcReactionProb(iCase,bgSpec,CRela2,CollEnergy_in,PartIndex,bggP ELSE ChemReac%CollCaseInfo(iCase)%ReactionProb(iPath) = 0. END IF - ! Calculation of reaction rate coefficient -#if (PP_TimeDiscMethod==4) + ! Reservoir simulation: Calculation of reaction rate coefficient IF (DSMC%ReservoirSimu.AND..NOT.DSMC%ReservoirRateStatistic) THEN ChemReac%NumReac(ReacTest) = ChemReac%NumReac(ReacTest) + ChemReac%CollCaseInfo(iCase)%ReactionProb(iPath) ChemReac%ReacCount(ReacTest) = ChemReac%ReacCount(ReacTest) + 1 END IF -#endif END IF END DO diff --git a/tutorials/dsmc-reservoir/chemistry-off/parameter.ini b/tutorials/dsmc-reservoir/chemistry-off/parameter.ini index 0d9e679c7..250b18d65 100644 --- a/tutorials/dsmc-reservoir/chemistry-off/parameter.ini +++ b/tutorials/dsmc-reservoir/chemistry-off/parameter.ini @@ -85,7 +85,7 @@ Part-Species1-Init1-VeloVecIC = (/0.,0.,1./) ! Normalized veloc ! DSMC ! =============================================================================== ! UseDSMC = T ! Flag for using DSMC in Calculation -Particles-DSMCReservoirSim = T ! Set [T] to disable particle movement (needs compiled TIMEDISCMETHOD=RESERVOIR) +Particles-DSMCReservoirSim = T ! Set [T] to disable particle movement Particles-DSMC-CollisMode = 2 ! Define mode of collision handling in DSMC (1:elast coll, 2: elast + rela, 3:chem) Particles-DSMC-RotRelaxProb = 0.2 ! Define the rotational relaxation probability upon collision of molecules (0-1: constant, 2: variable, Boyd, 3: variable, Zhang) Particles-DSMC-VibRelaxProb = 0.02 ! Define the vibrational relaxation probability upon collision of molecules (0-1: constant, 2: variable, Boyd) diff --git a/tutorials/dsmc-reservoir/chemistry-on/parameter.ini b/tutorials/dsmc-reservoir/chemistry-on/parameter.ini index e9ce47d32..4b723f90b 100644 --- a/tutorials/dsmc-reservoir/chemistry-on/parameter.ini +++ b/tutorials/dsmc-reservoir/chemistry-on/parameter.ini @@ -130,9 +130,9 @@ Part-Species3-Init1-VeloVecIC = (/0.,0.,1./) ! DSMC ! =============================================================================== ! UseDSMC = T ! Flag for using DSMC in Calculation -Particles-DSMCReservoirSim = T ! Set [T] to disable particle movement (needs compiled TIMEDISCMETHOD=RESERVOIR) -Particles-DSMCReservoirSimRate = F ! Set [T] to disable particle reactions (needs compiled TIMEDISCMETHOD=RESERVOIR) -Particles-DSMCReservoirStatistic = F ! Set how probabilities (rates) are calculated (needs compiled TIMEDISCMETHOD=RESERVOIR) +Particles-DSMCReservoirSim = T ! Set [T] to disable particle movement +Particles-DSMCReservoirSimRate = F ! Set [T] to disable particle reactions +Particles-DSMCReservoirStatistic = F ! Set how probabilities (rates) are calculated Particles-DSMC-CollisMode = 3 ! Define mode of collision handling in DSMC (1:elast coll, 2: elast + rela, 3:chem) Particles-DSMC-BackwardReacRate = T ! Set [T] to enable the automatic calculation of the backward reaction rate Particles-DSMC-RotRelaxProb = 0.2 ! Define the rotational relaxation probability upon collision of molecules (0-1: constant, 2: variable, Boyd, 3: variable, Zhang) From 5eb3e358c172dd4df9320e52621191c089c1ebef Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Fri, 27 Oct 2023 00:06:31 +0200 Subject: [PATCH 277/495] Added need for build_DSMC for NIG/WEK_Reservoir --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 53dbf6cf8..d4d910b98 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -463,7 +463,7 @@ CHE_FPFlow: # Stage "reggie_DSMC_nightly": Build and run chemistry examples on nightly (check reaction rates in RESERVOIR simulation) # ---------------------------------------------------------------------------------------------------------------------------------------------------- NIG_Reservoir: - <<: *defaults_nightly + <<: *defaults_DSMC_nightly stage: reggie_DSMC_nightly script: - cd build_DSMC_release/ ; python ../reggie/reggie.py ../regressioncheck/NIG_Reservoir -e bin/piclas @@ -742,7 +742,7 @@ WEK_DSMC: - cd build_DSMC_release ; python ../reggie/reggie.py ../regressioncheck/WEK_DSMC -e bin/piclas WEK_Reservoir: - <<: *defaults_weekly + <<: *defaults_DSMC_weekly stage: reggie_weekly script: - cd build_DSMC_release ; python ../reggie/reggie.py ../regressioncheck/WEK_Reservoir -e bin/piclas From 685d9ef201578eb424f1f9a18c0b635e5057f985 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Fri, 27 Oct 2023 11:21:48 +0200 Subject: [PATCH 278/495] Fixed MPI_INTEGER2 for MPI communication of KIND=2 integer parameters. Cleanup of shared array usage. Fixed MPI=OFF. --- .../radiation_solver/radiation_init.f90 | 44 ++++++++++--------- .../radiative_transfer/radtrans_init.f90 | 36 +++++++-------- .../radiative_transfer/radtrans_main.f90 | 8 ++-- .../radiative_transfer/radtrans_output.f90 | 34 ++++++++++---- 4 files changed, 71 insertions(+), 51 deletions(-) diff --git a/src/radiation/radiation_solver/radiation_init.f90 b/src/radiation/radiation_solver/radiation_init.f90 index ad6c933d5..4a6c1c104 100644 --- a/src/radiation/radiation_solver/radiation_init.f90 +++ b/src/radiation/radiation_solver/radiation_init.f90 @@ -113,6 +113,8 @@ SUBROUTINE InitRadiation() !USE MOD_MPI_Shared_Vars USE MOD_MPI_Shared USE MOD_MPI_Shared_Vars +#else +USE MOD_Mesh_Vars, ONLY : nElems #endif ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -240,13 +242,13 @@ SUBROUTINE InitRadiation() CALL MPI_WIN_LOCK_ALL(0,Radiation_ElemEnergy_Species_Shared_Win,IERROR) Radiation_Emission_spec => Radiation_Emission_spec_Shared -Radiation_Absorption_spec(1:RadiationParameter%WaveLenDiscrCoarse ,1:nGlobalElems) => Radiation_Absorption_spec_Shared +Radiation_Absorption_Spec(1:RadiationParameter%WaveLenDiscrCoarse ,1:nGlobalElems) => Radiation_Absorption_Spec_Shared Radiation_Absorption_SpecPercent(1:RadiationParameter%WaveLenDiscrCoarse ,1:nSpecies, 1:nGlobalElems) => Radiation_Absorption_SpecPercent_Shared Radiation_ElemEnergy_Species => Radiation_ElemEnergy_Species_Shared #else ! allocate local array for ElemInfo ALLOCATE(Radiation_Emission_spec(RadiationParameter%WaveLenDiscrCoarse,nElems)) -ALLOCATE(Radiation_Absorption_spec(RadiationParameter%WaveLenDiscrCoarse,nElems)) +ALLOCATE(Radiation_Absorption_Spec(RadiationParameter%WaveLenDiscrCoarse,nElems)) ALLOCATE(Radiation_Absorption_SpecPercent(RadiationParameter%WaveLenDiscrCoarse,nSpecies,nElems)) ALLOCATE(Radiation_ElemEnergy_Species(nSpecies,nElems,2)) #endif /*USE_MPI*/ @@ -263,7 +265,7 @@ SUBROUTINE InitRadiation() DO iElem = firstElem, lastElem Radiation_Emission_spec(:,iElem) = 0.0 - Radiation_Absorption_spec(:,GetGlobalElemID(iElem)) = 0.0 + Radiation_Absorption_Spec(:,GetGlobalElemID(iElem)) = 0.0 Radiation_Absorption_SpecPercent(:,:,GetGlobalElemID(iElem)) = 0 Radiation_ElemEnergy_Species(:,iElem,:) =0.0 END DO @@ -274,23 +276,23 @@ SUBROUTINE InitRadiation() CALL BARRIER_AND_SYNC(Radiation_Absorption_SpecPercent_Shared_Win ,MPI_COMM_SHARED) IF(nLeaderGroupProcs.GT.1)THEN IF(myComputeNodeRank.EQ.0)THEN - CALL MPI_ALLGATHERV( MPI_IN_PLACE & - , 0 & - , MPI_DATATYPE_NULL & - , Radiation_Absorption_Spec_Shared & - , RadiationParameter%WaveLenDiscrCoarse *recvcountElem & - , RadiationParameter%WaveLenDiscrCoarse *displsElem & - , MPI_DOUBLE_PRECISION & - , MPI_COMM_LEADERS_SHARED & + CALL MPI_ALLGATHERV( MPI_IN_PLACE & + , 0 & + , MPI_DATATYPE_NULL & + , Radiation_Absorption_Spec & + , RadiationParameter%WaveLenDiscrCoarse *recvcountElem & + , RadiationParameter%WaveLenDiscrCoarse *displsElem & + , MPI_DOUBLE_PRECISION & + , MPI_COMM_LEADERS_SHARED & , IERROR) - CALL MPI_ALLGATHERV( MPI_IN_PLACE & - , 0 & - , MPI_DATATYPE_NULL & - , Radiation_Absorption_SpecPercent_Shared & - , RadiationParameter%WaveLenDiscrCoarse*nSpecies *recvcountElem & - , RadiationParameter%WaveLenDiscrCoarse*nSpecies *displsElem & - , MPI_INTEGER & - , MPI_COMM_LEADERS_SHARED & + CALL MPI_ALLGATHERV( MPI_IN_PLACE & + , 0 & + , MPI_DATATYPE_NULL & + , Radiation_Absorption_SpecPercent & + , RadiationParameter%WaveLenDiscrCoarse*nSpecies *recvcountElem & + , RadiationParameter%WaveLenDiscrCoarse*nSpecies *displsElem & + , MPI_INTEGER2 & + , MPI_COMM_LEADERS_SHARED & , IERROR) END IF END IF @@ -317,12 +319,12 @@ SUBROUTINE MacroscopicRadiationInput() USE MOD_Mesh_Vars ,ONLY: offsetElem, nElems USE MOD_Particle_Vars ,ONLY: nSpecies USE MOD_DSMC_Vars ,ONLY: SpecDSMC -USE MOD_Radiation_Vars ,ONLY: RadiationSwitches, MacroRadInputParameters, MacroRadInputParameters_Shared, & - MacroRadInputParameters_Shared_Win +USE MOD_Radiation_Vars ,ONLY: RadiationSwitches, MacroRadInputParameters USE MOD_Mesh_Tools ,ONLY: GetCNElemID USE MOD_ReadInTools USE MOD_Particle_Mesh_Vars ,ONLY: nComputeNodeElems #if USE_MPI +USE MOD_Radiation_Vars ,ONLY: MacroRadInputParameters_Shared,MacroRadInputParameters_Shared_Win !USE MOD_MPI_Shared_Vars USE MOD_MPI_Shared USE MOD_MPI_Shared_Vars diff --git a/src/radiation/radiative_transfer/radtrans_init.f90 b/src/radiation/radiative_transfer/radtrans_init.f90 index 1ef664935..0c6fc39bc 100644 --- a/src/radiation/radiative_transfer/radtrans_init.f90 +++ b/src/radiation/radiative_transfer/radtrans_init.f90 @@ -91,9 +91,9 @@ SUBROUTINE InitRadiationTransport() USE MOD_SuperB_Tools ,ONLY: FindLinIndependentVectors, GramSchmidtAlgo #if USE_MPI USE MOD_RadiationTrans_Vars ,ONLY: RadTransObsVolumeFrac_Shared_Win, RadTransObsVolumeFrac_Shared -USE MOD_Radiation_Vars ,ONLY: Radiation_Absorption_Spec_Shared, Radiation_Absorption_Spec_Shared_Win, RadiationInput +USE MOD_Radiation_Vars ,ONLY: Radiation_Absorption_Spec_Shared_Win, RadiationInput USE MOD_Radiation_Vars ,ONLY: Radiation_Emission_Spec_Shared_Win, MacroRadInputParameters -USE MOD_Radiation_Vars ,ONLY: Radiation_Absorption_SpecPercent_Shared, Radiation_Absorption_SpecPercent_Shared_Win +USE MOD_Radiation_Vars ,ONLY: Radiation_Absorption_SpecPercent_Shared_Win USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWallProc USE MOD_Photon_TrackingVars ,ONLY: PhotonSampWall_Shared, PhotonSampWall_Shared_Win,PhotonSampWallProc #else @@ -421,14 +421,14 @@ SUBROUTINE InitRadiationTransport() CALL BARRIER_AND_SYNC(Radiation_Absorption_Spec_Shared_Win ,MPI_COMM_SHARED) IF(nLeaderGroupProcs.GT.1)THEN IF(myComputeNodeRank.EQ.0)THEN - CALL MPI_ALLGATHERV( MPI_IN_PLACE & - , 0 & - , MPI_DATATYPE_NULL & - , Radiation_Absorption_Spec_Shared & - , RadiationParameter%WaveLenDiscrCoarse *recvcountElem & - , RadiationParameter%WaveLenDiscrCoarse *displsElem & - , MPI_DOUBLE_PRECISION & - , MPI_COMM_LEADERS_SHARED & + CALL MPI_ALLGATHERV( MPI_IN_PLACE & + , 0 & + , MPI_DATATYPE_NULL & + , Radiation_Absorption_Spec & + , RadiationParameter%WaveLenDiscrCoarse *recvcountElem & + , RadiationParameter%WaveLenDiscrCoarse *displsElem & + , MPI_DOUBLE_PRECISION & + , MPI_COMM_LEADERS_SHARED & , IERROR) END IF END IF @@ -436,14 +436,14 @@ SUBROUTINE InitRadiationTransport() CALL BARRIER_AND_SYNC(Radiation_Absorption_SpecPercent_Shared_Win ,MPI_COMM_SHARED) IF(nLeaderGroupProcs.GT.1)THEN IF(myComputeNodeRank.EQ.0)THEN - CALL MPI_ALLGATHERV( MPI_IN_PLACE & - , 0 & - , MPI_DATATYPE_NULL & - , Radiation_Absorption_SpecPercent_Shared & - , RadiationParameter%WaveLenDiscrCoarse *nSpecies*recvcountElem & - , RadiationParameter%WaveLenDiscrCoarse *nSpecies*displsElem & - , MPI_INTEGER & - , MPI_COMM_LEADERS_SHARED & + CALL MPI_ALLGATHERV( MPI_IN_PLACE & + , 0 & + , MPI_DATATYPE_NULL & + , Radiation_Absorption_SpecPercent & + , RadiationParameter%WaveLenDiscrCoarse *nSpecies*recvcountElem & + , RadiationParameter%WaveLenDiscrCoarse *nSpecies*displsElem & + , MPI_INTEGER2 & + , MPI_COMM_LEADERS_SHARED & , IERROR) END IF END IF diff --git a/src/radiation/radiative_transfer/radtrans_main.f90 b/src/radiation/radiative_transfer/radtrans_main.f90 index 101dc82c1..a915e689a 100644 --- a/src/radiation/radiative_transfer/radtrans_main.f90 +++ b/src/radiation/radiative_transfer/radtrans_main.f90 @@ -45,7 +45,7 @@ SUBROUTINE RadTrans_main() USE MOD_RadiationTrans_Vars ,ONLY: Radiation_Emission_Spec_Total, RadTrans, RadEmiAdaptPhotonNum, RadTransObsVolumeFrac USE MOD_RadiationTrans_Vars ,ONLY: RadiationDirectionModel, RadTransPhotPerCellLoc, RadObservationPoint USE MOD_Photon_TrackingVars ,ONLY: PhotonProps -USE MOD_RadiationTrans_Vars ,ONLY: RadTransPhotPerCell, RadTransPhotPerCell_Shared_Win, RadiationPhotonWaveLengthModel +USE MOD_RadiationTrans_Vars ,ONLY: RadTransPhotPerCell, RadiationPhotonWaveLengthModel USE MOD_RadiationTrans_Vars ,ONLY: RadObservationPointMethod USE MOD_Photon_Tracking ,ONLY: PhotonTriaTracking, Photon2DSymTracking USE MOD_Radiation_Vars ,ONLY: RadiationSwitches @@ -55,9 +55,11 @@ SUBROUTINE RadTrans_main() USE MOD_MPI_Shared_Vars USE MOD_MPI_Shared USE MOD_Particle_Vars ,ONLY: Symmetry -#if !(USE_MPI) +#if USE_MPI +USE MOD_RadiationTrans_Vars ,ONLY: RadTransPhotPerCell_Shared_Win +#else USE MOD_Mesh_Vars ,ONLY: nElems -#endif /*!(USE_MPI)*/ +#endif /*USE_MPI*/ ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- diff --git a/src/radiation/radiative_transfer/radtrans_output.f90 b/src/radiation/radiative_transfer/radtrans_output.f90 index a487c818d..a01e26ba4 100644 --- a/src/radiation/radiative_transfer/radtrans_output.f90 +++ b/src/radiation/radiative_transfer/radtrans_output.f90 @@ -46,15 +46,20 @@ SUBROUTINE WriteRadiationToHDF5() USE MOD_io_HDF5 USE MOD_HDF5_output ,ONLY: WriteArrayToHDF5,WriteAttributeToHDF5,WriteHDF5Header USE MOD_Mesh_Vars ,ONLY: offsetElem,nGlobalElems, MeshFile -USE MOD_RadiationTrans_Vars ,ONLY: RadiationElemAbsEnergy_Shared, RadObservationPointMethod, RadObservation_Emission, RadObservationPoint +USE MOD_RadiationTrans_Vars ,ONLY: RadObservationPointMethod, RadObservation_Emission, RadObservationPoint USE MOD_RadiationTrans_Vars ,ONLY: Radiation_Emission_Spec_Total, RadTransPhotPerCell, RadObservation_EmissionPart -USE MOD_RadiationTrans_Vars ,ONLY: ObservationDoConvolution, RadObservation_Emission_Conv, RadiationElemAbsEnergySpec_Shared +USE MOD_RadiationTrans_Vars ,ONLY: ObservationDoConvolution, RadObservation_Emission_Conv USE MOD_Globals_Vars ,ONLY: ProjectName USE MOD_Particle_Mesh_Vars ,ONLY: ElemVolume_Shared USE MOD_Radiation_Vars ,ONLY: RadiationSwitches, Radiation_ElemEnergy_Species, RadiationParameter, Radiation_Absorption_Spec USE MOD_Particle_Vars ,ONLY: nSpecies USE MOD_Mesh_Tools ,ONLY: GetCNElemID USE MOD_Photon_TrackingOutput,ONLY:WritePhotonSurfSampleToHDF5 +#if USE_MPI +USE MOD_RadiationTrans_Vars ,ONLY: RadiationElemAbsEnergySpec_Shared, RadiationElemAbsEnergy_Shared +#else +USE MOD_RadiationTrans_Vars ,ONLY: RadiationElemAbsEnergySpec, RadiationElemAbsEnergy +#endif /*USE_MPI*/ ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -119,21 +124,26 @@ SUBROUTINE WriteRadiationToHDF5() CALL OpenDataFile(FileString,create=.false.,single=.FALSE.,readOnly=.FALSE.,communicatorOpt=MPI_COMM_WORLD) +#if USE_MPI +ASSOCIATE( RadiationElemAbsEnergySpec => RadiationElemAbsEnergySpec_Shared,& + RadiationElemAbsEnergy => RadiationElemAbsEnergy_Shared ) +#endif /*USE_MPI*/ + IF (RadiationSwitches%RadType.EQ.1) THEN DO iElem=1,PP_nElems CNElemID = GetCNElemID(iElem+offSetElem) nVarCount=0 DO iSpec=1, nSpecies TempOutput(nVarCount+1, iElem) = Radiation_ElemEnergy_Species(iSpec,CNElemID,1) - TempOutput(nVarCount+2, iElem) = RadiationElemAbsEnergySpec_Shared(iSpec, iElem+offSetElem)/ ElemVolume_Shared(CNElemID) + TempOutput(nVarCount+2, iElem) = RadiationElemAbsEnergySpec(iSpec, iElem+offSetElem)/ ElemVolume_Shared(CNElemID) nVarCount=nVarCount+nVarSpec END DO TempOutput((nVarSpec*nSpecies+1), iElem) = Radiation_Emission_Spec_Total(CNElemID) - TempOutput((nVarSpec*nSpecies+2), iElem) = SUM(RadiationElemAbsEnergySpec_Shared(:, iElem+offSetElem))/ ElemVolume_Shared(CNElemID) - TempOutput(nVarSpec*nSpecies+3, iElem) = SUM(Radiation_ElemEnergy_Species(:,CNElemID,1))- SUM(RadiationElemAbsEnergySpec_Shared(:, iElem+offSetElem))/ ElemVolume_Shared(CNElemID) + TempOutput((nVarSpec*nSpecies+2), iElem) = SUM(RadiationElemAbsEnergySpec(:, iElem+offSetElem))/ ElemVolume_Shared(CNElemID) + TempOutput(nVarSpec*nSpecies+3, iElem) = SUM(Radiation_ElemEnergy_Species(:,CNElemID,1))- SUM(RadiationElemAbsEnergySpec(:, iElem+offSetElem))/ ElemVolume_Shared(CNElemID) TempOutput(nVarSpec*nSpecies+4, iElem) = RadTransPhotPerCell(CNElemID) - IF (RadiationElemAbsEnergy_Shared(2,iElem+offSetElem).GT.0) THEN - TempOutput(nVarSpec*nSpecies+5, iElem) = RadiationElemAbsEnergy_Shared(1,iElem+offSetElem)/RadiationElemAbsEnergy_Shared(2,iElem+offSetElem) + IF (RadiationElemAbsEnergy(2,iElem+offSetElem).GT.0) THEN + TempOutput(nVarSpec*nSpecies+5, iElem) = RadiationElemAbsEnergy(1,iElem+offSetElem)/RadiationElemAbsEnergy(2,iElem+offSetElem) ELSE TempOutput(nVarSpec*nSpecies+5, iElem) = 0.0 END IF @@ -142,8 +152,8 @@ SUBROUTINE WriteRadiationToHDF5() DO iElem=1, PP_nElems CNElemID = GetCNElemID(iElem+offSetElem) TempOutput(1, iElem) = Radiation_Emission_Spec_Total(CNElemID) - TempOutput(2, iElem) = RadiationElemAbsEnergySpec_Shared(1,iElem+offSetElem)/ElemVolume_Shared(CNElemID) - TempOutput(3, iElem) = Radiation_Emission_Spec_Total(CNElemID)- RadiationElemAbsEnergySpec_Shared(1,iElem+offSetElem)/ElemVolume_Shared(CNElemID) + TempOutput(2, iElem) = RadiationElemAbsEnergySpec(1,iElem+offSetElem)/ElemVolume_Shared(CNElemID) + TempOutput(3, iElem) = Radiation_Emission_Spec_Total(CNElemID)- RadiationElemAbsEnergySpec(1,iElem+offSetElem)/ElemVolume_Shared(CNElemID) TempOutput(4, iElem) = RadTransPhotPerCell(CNElemID) END DO ELSE IF (RadiationSwitches%RadType.EQ.3) THEN @@ -172,6 +182,10 @@ SUBROUTINE WriteRadiationToHDF5() CALL abort(__STAMP__,' ERROR: Radiation type is not implemented! (unknown case)') END IF +#if USE_MPI +END ASSOCIATE +#endif /*USE_MPI*/ + nVal=nGlobalElems ! For the MPI case this must be replaced by the global number of elements (sum over all procs) ASSOCIATE (& nVar => INT(nVar,IK) ,& @@ -190,6 +204,7 @@ SUBROUTINE WriteRadiationToHDF5() CALL WritePhotonSurfSampleToHDF5() IF (RadObservationPointMethod.GT.0) THEN +#if USE_MPI IF (myRank.EQ.0) THEN CALL MPI_REDUCE(MPI_IN_PLACE,RadObservation_Emission,RadiationParameter%WaveLenDiscrCoarse,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_WORLD,IERROR) ELSE @@ -200,6 +215,7 @@ SUBROUTINE WriteRadiationToHDF5() ELSE CALL MPI_REDUCE(RadObservation_EmissionPart,0 ,RadiationParameter%WaveLenDiscrCoarse,MPI_INTEGER,MPI_SUM,0,MPI_COMM_WORLD,IERROR) ENDIF +#endif /*USE_MPI*/ IF (myRank.EQ.0) THEN IF(ObservationDoConvolution) THEN CALL SpectralConvolution(RadObservation_Emission,RadObservation_Emission_Conv) From fdfdd5fe802bd6fabf0832ca8929f7057f022163 Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Fri, 27 Oct 2023 15:14:38 +0200 Subject: [PATCH 279/495] Removed .directory file --- .directory | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 .directory diff --git a/.directory b/.directory deleted file mode 100644 index 2b38e4c30..000000000 --- a/.directory +++ /dev/null @@ -1,6 +0,0 @@ -[Dolphin] -Timestamp=2016,11,16,13,25,9 -Version=3 - -[Settings] -HiddenFilesShown=true From 8606414a8363399a10299977037a9326f67cc8a9 Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Fri, 27 Oct 2023 17:22:11 +0200 Subject: [PATCH 280/495] Removed MCC output during LB step --- src/particles/mcc/mcc_init.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/particles/mcc/mcc_init.f90 b/src/particles/mcc/mcc_init.f90 index ac48218ab..82e2bf555 100644 --- a/src/particles/mcc/mcc_init.f90 +++ b/src/particles/mcc/mcc_init.f90 @@ -392,8 +392,8 @@ SUBROUTINE InitMCC() CALL abort(__STAMP__,'Total null collision probability is above unity. Please reduce the time step! Probability is: '& ,RealInfoOpt=TotalProb(partSpec)) ELSEIF(TotalProb(partSpec).GT.0.1) THEN - SWRITE(*,*) 'Total null collision probability is above 0.1. A value of 1E-2 is recommended in literature!' - SWRITE(*,*) 'Particle Species: ', TRIM(SpecDSMC(partSpec)%Name), ' Probability: ', TotalProb(partSpec) + LBWRITE(*,*) 'Total null collision probability is above 0.1. A value of 1E-2 is recommended in literature!' + LBWRITE(*,*) 'Particle Species: ', TRIM(SpecDSMC(partSpec)%Name), ' Probability: ', TotalProb(partSpec) END IF ! TotalProb(partSpec).GT.1.0 END IF ! XSec_NullCollision END IF ! SpecXSec(iCase)%UseCollXSec From a4157e50d3e0f3807f79d51abfed6fafba39b636 Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Fri, 27 Oct 2023 17:39:34 +0200 Subject: [PATCH 281/495] Removed further remains of TD=42 --- .../VarRelaxProb_Restart/parameter.ini | 2 +- .../NIG_Reservoir/VarRelaxProb_hot/parameter.ini | 2 +- src/particles/analyze/particle_analyze.f90 | 6 ++---- src/particles/dsmc/dsmc_init.f90 | 8 ++++---- src/particles/mcc/mcc_init.f90 | 14 +++++++------- src/particles/mcc/mcc_xsec.f90 | 2 +- 6 files changed, 16 insertions(+), 18 deletions(-) diff --git a/regressioncheck/NIG_Reservoir/VarRelaxProb_Restart/parameter.ini b/regressioncheck/NIG_Reservoir/VarRelaxProb_Restart/parameter.ini index 4b3cd0495..1ca1c6723 100644 --- a/regressioncheck/NIG_Reservoir/VarRelaxProb_Restart/parameter.ini +++ b/regressioncheck/NIG_Reservoir/VarRelaxProb_Restart/parameter.ini @@ -131,4 +131,4 @@ Part-NumberOfRandomSeeds = 2 Particles-RandomSeed1 = 1 Particles-RandomSeed2 = 2 Particles-DSMC-UseOctree = F -Particles-DSMC-UseNearestNeighbour = T +Particles-DSMC-UseNearestNeighbour = F diff --git a/regressioncheck/NIG_Reservoir/VarRelaxProb_hot/parameter.ini b/regressioncheck/NIG_Reservoir/VarRelaxProb_hot/parameter.ini index 5038e4f79..0f2ad7245 100644 --- a/regressioncheck/NIG_Reservoir/VarRelaxProb_hot/parameter.ini +++ b/regressioncheck/NIG_Reservoir/VarRelaxProb_hot/parameter.ini @@ -92,6 +92,6 @@ Part-NumberOfRandomSeeds=2 Particles-RandomSeed1=1 Particles-RandomSeed2=2 Particles-DSMC-UseOctree=F -Particles-DSMC-UseNearestNeighbour = T +Particles-DSMC-UseNearestNeighbour = F Particles-DSMCReservoirSim = T diff --git a/src/particles/analyze/particle_analyze.f90 b/src/particles/analyze/particle_analyze.f90 index c0212114b..4e6ab7b2f 100644 --- a/src/particles/analyze/particle_analyze.f90 +++ b/src/particles/analyze/particle_analyze.f90 @@ -121,11 +121,9 @@ SUBROUTINE InitParticleAnalyze() USE MOD_ReadInTools ,ONLY: GETLOGICAL, GETINT, GETSTR, GETINTARRAY, GETREALARRAY, GETREAL USE MOD_ReadInTools ,ONLY: PrintOption USE MOD_Particle_Sampling_Vars,ONLY: UseAdaptive -#if (PP_TimeDiscMethod == 42) USE MOD_TimeDisc_Vars ,ONLY: TEnd USE MOD_TimeDisc_Vars ,ONLY: ManualTimeStep USE MOD_Restart_Vars ,ONLY: RestartTime -#endif #if USE_MPI USE MOD_MPI_Shared USE MOD_MPI_Shared_Vars ,ONLY: MPI_COMM_SHARED @@ -521,7 +519,7 @@ SUBROUTINE InitParticleAnalyze() PartAnalyzeStep = GETINT('Part-AnalyzeStep','1') IF (PartAnalyzeStep.EQ.0) PartAnalyzeStep = HUGE(PartAnalyzeStep) -#if (PP_TimeDiscMethod == 42) +IF(DSMC%ReservoirSimu) THEN IF(PartAnalyzeStep.NE.HUGE(PartAnalyzeStep)) THEN IF(MOD(NINT((TEnd-RestartTime)/ManualTimeStep,8),PartAnalyzeStep).NE.0) THEN SWRITE(UNIT_stdOut,'(A,I0)') 'NINT((TEnd-RestartTime)/ManualTimeStep) = ',NINT((TEnd-RestartTime)/ManualTimeStep,8) @@ -529,7 +527,7 @@ SUBROUTINE InitParticleAnalyze() CALL abort(__STAMP__,'Please specify a PartAnalyzeStep, which is a factor of the total number of iterations!') END IF END IF -#endif +END IF DoPartAnalyze = .FALSE. ! PIC PPD and time step criteria: Activate DoPartAnalyze flag diff --git a/src/particles/dsmc/dsmc_init.f90 b/src/particles/dsmc/dsmc_init.f90 index 5b8478722..3345f0bae 100644 --- a/src/particles/dsmc/dsmc_init.f90 +++ b/src/particles/dsmc/dsmc_init.f90 @@ -82,14 +82,13 @@ SUBROUTINE DefineParametersDSMC() 'Time-averaged mean collision probability\n'//& 'Mean collision separation distance over mean free path' , '.FALSE.') CALL prms%CreateLogicalOption( 'Particles-DSMCReservoirSim', & - 'Only TD=Reservoir (42).\n'//& 'Set [TRUE] to disable particle movement. Use for reservoir simulations.' , '.FALSE.') CALL prms%CreateLogicalOption( 'Particles-DSMCReservoirSimRate', & - 'Only TD=Reservoir (42).\n'//& + 'Only with Particles-DSMCReservoirSim = T\n'//& 'Set [TRUE] to disable particle reactions. Only probabilities (rates) are calculated.', & '.FALSE.') CALL prms%CreateLogicalOption( 'Particles-DSMCReservoirStatistic', & - 'Only TD=Reservoir (42).\n'//& + 'Only with Particles-DSMCReservoirSim = T\n'//& 'Probabilities (rates) are calculated\n'//& ' [TRUE] counting reacting particles.\n'//& ' [FALSE] summing reaction probabilities (does not work with Q-K).' , '.FALSE.') @@ -115,7 +114,8 @@ SUBROUTINE DefineParametersDSMC() 'Every mode has its own corrected relaxation probability, comparison with the '//& 'same random number while the previous probability is added to the next', '.FALSE.') CALL prms%CreateLogicalOption( 'Particles-DSMC-CompareLandauTeller'& - ,'Only TD=Reservoir (42). ', '.FALSE.') + ,'Allows the comparison with Landau-Teller equation. Only with Particles-DSMCReservoirSim = T.',& + '.FALSE.') CALL prms%CreateLogicalOption( 'Particles-DSMC-UseOctree'& ,'Use octree method for dynamic grid resolution based on the current mean free path '//& 'and the particle number', '.FALSE.') diff --git a/src/particles/mcc/mcc_init.f90 b/src/particles/mcc/mcc_init.f90 index c78140d86..064dde982 100644 --- a/src/particles/mcc/mcc_init.f90 +++ b/src/particles/mcc/mcc_init.f90 @@ -117,14 +117,14 @@ SUBROUTINE InitMCC() IF(SpecDSMC(iSpec)%UseElecXSec.AND.SpecDSMC(iSpec)%InterID.EQ.4) THEN CALL Abort(__STAMP__,'ERROR: Electronic relaxation should be enabled for the respective heavy species, not the electrons!') END IF -#if (PP_TimeDiscMethod!=42) - IF(SpecDSMC(iSpec)%UseElecXSec.AND.(.NOT.BGGas%BackgroundSpecies(iSpec))) THEN - SWRITE(*,*) 'NOTE: Electronic relaxation via cross-sections for regular DSMC is currently only enabled for the RESERVOIR' - SWRITE(*,*) 'NOTE: timedisc to test the calculation of the probabilities during regression testing. For DSMC, a de-excitation' - SWRITE(*,*) 'NOTE: model should be implemented. Regression test: WEK_Reservoir/MCC_N2_XSec_Elec' - CALL Abort(__STAMP__,'ERROR: Electronic relaxation via cross-section (-UseElecXSec) is only supported with a background gas!') + IF(.NOT.DSMC%ReservoirSimu) THEN + IF(SpecDSMC(iSpec)%UseElecXSec.AND.(.NOT.BGGas%BackgroundSpecies(iSpec))) THEN + SWRITE(*,*) 'NOTE: Electronic relaxation via cross-sections for regular DSMC is currently only enabled using the flag' + SWRITE(*,*) 'NOTE: Particles-DSMCReservoirSim = T to test the calculation of the probabilities during regression testing.' + SWRITE(*,*) 'NOTE: For DSMC, a de-excitation model should be implemented. Regression test: WEK_Reservoir/MCC_N2_XSec_Elec' + CALL Abort(__STAMP__,'ERROR: Electronic relaxation via cross-section (-UseElecXSec) is only supported with a background gas!') + END IF END IF -#endif END DO ! Enable MCC if any of the flags was set diff --git a/src/particles/mcc/mcc_xsec.f90 b/src/particles/mcc/mcc_xsec.f90 index 674c20bd6..4da7a4a58 100644 --- a/src/particles/mcc/mcc_xsec.f90 +++ b/src/particles/mcc/mcc_xsec.f90 @@ -581,7 +581,7 @@ SUBROUTINE XSec_ElectronicRelaxation(iPair,iCase,iPart_p1,iPart_p2,DoElec1,DoEle !> 1. Interpolate the cross-section (MCC) or use the probability (VHS) !> 2. Determine which electronic level is to be excited !> 3. Reduce the total collision probability if no electronic excitation occurred -!> 4. Count the number of relaxation process for the relaxation rate (TimeDisc=42 only) +!> 4. Count the number of relaxation process for the relaxation rate (Only with Particles-DSMCReservoirSim = T) !=================================================================================================================================== ! MODULES USE MOD_DSMC_Vars ,ONLY: SpecDSMC, Coll_pData, PartStateIntEn From 7638345acea598267976b4dfffaae0e9a12510e6 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Sat, 28 Oct 2023 22:11:57 +0200 Subject: [PATCH 282/495] Removed obsolete code and warnings --- src/globals/globals.f90 | 3 --- src/particles/boundary/particle_boundary_sampling.f90 | 4 ---- 2 files changed, 7 deletions(-) diff --git a/src/globals/globals.f90 b/src/globals/globals.f90 index 9c1a3aa1e..5893cad6a 100644 --- a/src/globals/globals.f90 +++ b/src/globals/globals.f90 @@ -1497,9 +1497,6 @@ SUBROUTINE WarningMemusage(Threshold) #if USE_MPI USE MOD_MPI_Shared_Vars ,ONLY: myComputeNodeRank,myLeaderGroupRank USE MOD_MPI_Shared_Vars ,ONLY: MPI_COMM_LEADERS_SHARED,MPI_COMM_SHARED -#if ! (CORE_SPLIT==0) -USE MOD_MPI_Shared_Vars ,ONLY: NbrOfPhysicalNodes,nLeaderGroupProcs -#endif /*! (CORE_SPLIT==0)*/ #if defined(MEASURE_MPI_WAIT) USE MOD_MPI_Vars ,ONLY: MPIW8TimeMM,MPIW8CountMM #endif /*defined(MEASURE_MPI_WAIT)*/ diff --git a/src/particles/boundary/particle_boundary_sampling.f90 b/src/particles/boundary/particle_boundary_sampling.f90 index e205d7604..edfaf330c 100644 --- a/src/particles/boundary/particle_boundary_sampling.f90 +++ b/src/particles/boundary/particle_boundary_sampling.f90 @@ -163,7 +163,6 @@ SUBROUTINE InitParticleBoundarySampling() #endif /*USE_MPI*/ INTEGER :: NbGlobalSideID LOGICAL :: UseBezierControlPointsForArea -REAL,ALLOCATABLE :: xIP_VISU(:),wIP_VISU(:) !=================================================================================================================================== ! Get input parameters @@ -605,9 +604,6 @@ SUBROUTINE InitParticleBoundarySampling() ! compute area of sub-faces tmp1=dXiEQ_SurfSample/2.0 !(b-a)/2 -ALLOCATE(xIP_VISU(0:nSurfSample),wIP_VISU(0:nSurfSample)) -CALL GetNodesAndWeights(nSurfSample, NodeTypeVISU, xIP_VISU, wIP=wIP_VISU) - DO iSide = firstSide,LastSide ! get global SideID. This contains only nonUniqueSide, no special mortar treatment required SideID = SurfSide2GlobalSide(SURF_SIDEID,iSide) From 1c767bba19337bd3215846cb55eace681c755c23 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Sat, 28 Oct 2023 22:12:28 +0200 Subject: [PATCH 283/495] Reinstated radiation reggie as nightly (instead of checkin) --- .gitlab-ci.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 255de0699..d478e6155 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -756,10 +756,8 @@ NIG_Photoionization_petsc_debug_Leapfrog: - cd build_poisson_petsc_debug_Leapfrog; python ../reggie/reggie.py ../regressioncheck/NIG_Photoionization -e ./bin/piclas NIG_Radiation: - <<: *defaults_checkin - stage: reggie_checkin - #<<: *defaults_nightly - #stage: reggie_nightly + <<: *defaults_nightly + stage: reggie_nightly script: - cd build ; python ../reggie/reggie.py ../regressioncheck/NIG_Radiation From 88d9ea8b01738d6fa9e4ea5d0011e703fea1fb48 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Sat, 28 Oct 2023 22:23:07 +0200 Subject: [PATCH 284/495] Deactivate RK3 reggies for photoionization for now in order to save time when running the reggies. This features is currently only used in combination with Leapfrog anyway. --- .gitlab-ci.yml | 57 +++++++++++++++------------------ src/particles/particle_init.f90 | 4 +-- 2 files changed, 28 insertions(+), 33 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d478e6155..43d4be0c7 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -700,36 +700,31 @@ NIG_PIC_Deposition: script: - cd build ; python ../reggie/reggie.py ../regressioncheck/NIG_PIC_Deposition/ -# Add surf model (SEE) 13% probabilty test case here -#feature_SurfaceModel: -# <<: *defaults_nightly -# stage: reggie_nightly -# script: -# - cd build ; python ../reggie/reggie.py ../regressioncheck/NIG_SurfaceModel/ - -NIG_Photoionization_release_RK3: - <<: *defaults_poisson_nightly - stage: reggie_nightly - script: - - cd build_poisson_release_RK3; python ../reggie/reggie.py ../regressioncheck/NIG_Photoionization -e ./bin/piclas - -NIG_Photoionization_debug_RK3: - <<: *defaults_poisson_nightly - stage: reggie_nightly - script: - - cd build_poisson_debug_RK3; python ../reggie/reggie.py ../regressioncheck/NIG_Photoionization -e ./bin/piclas - -NIG_Photoionization_petsc_release_RK3: - <<: *defaults_poisson_petsc_nightly - stage: reggie_nightly - script: - - cd build_poisson_petsc_release_RK3; python ../reggie/reggie.py ../regressioncheck/NIG_Photoionization -e ./bin/piclas - -NIG_Photoionization_petsc_debug_RK3: - <<: *defaults_poisson_petsc_nightly - stage: reggie_nightly - script: - - cd build_poisson_petsc_debug_RK3; python ../reggie/reggie.py ../regressioncheck/NIG_Photoionization -e ./bin/piclas +# 2023-10-28: Deactivate RK3 for photoionization for now in order to save time when running the reggies. This features is currently only used in combination with Leapfrog anyway. +# +# NIG_Photoionization_release_RK3: +# <<: *defaults_poisson_nightly +# stage: reggie_nightly +# script: +# - cd build_poisson_release_RK3; python ../reggie/reggie.py ../regressioncheck/NIG_Photoionization -e ./bin/piclas +# +# NIG_Photoionization_debug_RK3: +# <<: *defaults_poisson_nightly +# stage: reggie_nightly +# script: +# - cd build_poisson_debug_RK3; python ../reggie/reggie.py ../regressioncheck/NIG_Photoionization -e ./bin/piclas +# +# NIG_Photoionization_petsc_release_RK3: +# <<: *defaults_poisson_petsc_nightly +# stage: reggie_nightly +# script: +# - cd build_poisson_petsc_release_RK3; python ../reggie/reggie.py ../regressioncheck/NIG_Photoionization -e ./bin/piclas +# +# NIG_Photoionization_petsc_debug_RK3: +# <<: *defaults_poisson_petsc_nightly +# stage: reggie_nightly +# script: +# - cd build_poisson_petsc_debug_RK3; python ../reggie/reggie.py ../regressioncheck/NIG_Photoionization -e ./bin/piclas NIG_Photoionization_release_Leapfrog: <<: *defaults_poisson_nightly @@ -754,7 +749,7 @@ NIG_Photoionization_petsc_debug_Leapfrog: stage: reggie_nightly script: - cd build_poisson_petsc_debug_Leapfrog; python ../reggie/reggie.py ../regressioncheck/NIG_Photoionization -e ./bin/piclas - + NIG_Radiation: <<: *defaults_nightly stage: reggie_nightly diff --git a/src/particles/particle_init.f90 b/src/particles/particle_init.f90 index 5be59e54f..0636ad47f 100644 --- a/src/particles/particle_init.f90 +++ b/src/particles/particle_init.f90 @@ -282,8 +282,8 @@ SUBROUTINE InitParticleGlobals(IsLoadBalance) END IF ! UseRayTracing #if (PP_TimeDiscMethod==600) -! Radiation solver/transport -PerformRayTracing = .TRUE. !todo: uncomment if merged with feature.radtrans.ray.tracing +! Radiation solver/transport always requires PerformRayTracing = T +PerformRayTracing = .TRUE. #endif LBWRITE(UNIT_stdOut,'(A)')' INIT PARTICLE GLOBALS DONE' From 8ea9486f15ce50e0017137e6b1d36441eec43d9c Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Sun, 29 Oct 2023 00:53:14 +0200 Subject: [PATCH 285/495] Updated ray tracing reggies and updated REGGIE.md table --- REGGIE.md | 20 +++++---- .../surface_emission/readme.md | 1 + .../surface_emission_rectangle/readme.md | 3 +- .../Electrons_ref.csv | 22 ++++++++++ .../analyze.ini | 41 ++++++++++-------- .../command_line.ini | 2 +- .../externals.ini | 2 +- .../parameter.ini | 11 ++--- .../readme.md | 5 ++- .../reference_RadiationSurfState.h5 | Bin 6904 -> 7768 bytes .../reference_RadiationVolState.h5 | Bin 47672 -> 87040 bytes .../analyze.ini | 24 ++++++---- .../readme.md | 3 +- .../volume_emission/readme.md | 3 +- .../volume_emission_polychromatic/readme.md | 3 +- .../volume_emission_rectangle/readme.md | 3 +- .../readme.md | 3 +- .../volume_emission_vMPF/readme.md | 3 +- 18 files changed, 99 insertions(+), 50 deletions(-) create mode 100644 regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/Electrons_ref.csv diff --git a/REGGIE.md b/REGGIE.md index 3f5e805f4..fa2564463 100644 --- a/REGGIE.md +++ b/REGGIE.md @@ -403,14 +403,18 @@ Pure Poisson solver without particles: [Link to build](regressioncheck/NIG_poiss Test all features of photoionization within the HDG solver (without interpolation and deposition): [Link to build](regressioncheck/NIG_Photoionization/builds.ini). -| **No.** | **Case** | **CMAKE-CONFIG** | **Feature** | **Execution** | **Comparing** | **Readme** | -| :-----: | :---------------------------: | :--------------: | :--------------------------------------------------------------------------------------------------------------------------: | :------------: | :--------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------: | -| 1 | volume_emission | | photoionization in the volume (circle and honeycomb) | nProcs=1,2,5,8 | the total number of real electrons in the system with an analytical expression | [Link](regressioncheck/NIG_Photoionization/volume_emission/readme.md) | -| 2 | volume_emission_rectangle | | photoionization in the volume (rectangle) | nProcs=1,2,5,8 | the total number of real electrons in the system with a numerical ref. solution | [Link](regressioncheck/NIG_Photoionization/volume_emission_rectangle/readme.md) | -| 3 | surface_emission | | secondary electron emission from a surface (circle and honeycomb) | nProcs=1,2,5,8 | the total number of real electrons in the system with an analytical expression | [Link](regressioncheck/NIG_Photoionization/surface_emission/readme.md) | -| 4 | surface_emission_rectangle | | secondary electron emission from a surface (rectangle), PartBCIndex=1 (BoundaryParticleOutput), emission-specific MPF (vMPF) | nProcs=1,2,5,8 | the total number of real electrons in the system with a numerical ref. solution | [Link](regressioncheck/NIG_Photoionization/surface_emission_rectangle/readme.md) | -| 5 | volume_emission_polychromatic | | photoionization in the volume with polychromatic photon spectrum and energy-dependent cross-section data | nProcs=1,2,5,8 | the total number of real electrons in the system with a reference solution and particle numbers for different MPFs | [Link](regressioncheck/NIG_Photoionization/volume_emission_polychromatic/readme.md) | -| 6 | volume_emission_vMPF | | photoionization in the volume with vMPF | nProcs=1,2,5,8 | the total number of real electrons in the system with an analytical expression and particle numbers for different MPFs | [Link](regressioncheck/NIG_Photoionization/volume_emission_vMPF/readme.md) | +| **No.** | **Case** | **CMAKE-CONFIG** | **Feature** | **Execution** | **Comparing** | **Readme** | +| :-----: | :---------------------------: | :--------------: | :--------------------------------------------------------------------------------------------------------------------------: | :------------: | :--------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------: | +| 1 | surface_emission/ | | Photoionization: Surface Emission via SEE | nProcs= 1,2,5,8 | the total number of real electrons in the system with an analytical expression | [Link](regressioncheck/NIG_Photoionizationsurface_emission/readme.md) | +| 2 | surface_emission_rectangle/ | | Secondary electron emission from a surface (rectangle), PartBCIndex=1 (BoundaryParticleOutput), emission-specific MPF (vMPF) | nProcs= 1,2,5,8 | the total number of real electrons in the system with a numerical ref. solution | [Link](regressioncheck/NIG_Photoionizationsurface_emission_rectangle/readme.md) | +| 3 | surface_emission_rectangle_ray_trace/ | | Photoionization: Surface Emission via SEE for ray tracing | nProcs= 1,2,5,8,11,25 | RadiationSurfState.h5 and RadiationVolState.h5 with reference files, the total number of real electrons in the system with a numerical ref. solution | [Link](regressioncheck/NIG_Photoionizationsurface_emission_rectangle_ray_trace/readme.md) | +| 4 | surface_emission_rectangle_ray_trace_high-order/ | | Photoionization: Surface Emission via SEE for ray tracing with high-order refinement | nProcs= 1,2,5,8,11,25 | RadiationSurfState.h5 and RadiationVolState.h5 with reference files, the total number of real electrons in the system with a numerical ref. solution | [Link](regressioncheck/NIG_Photoionizationsurface_emission_rectangle_ray_trace_high-order/readme.md) | +| 5 | volume_emission/ | | Photoionization in the volume (circle and honeycomb) | nProcs= 1,2,5,8 | the total number of real electrons in the system with an analytical expression | [Link](regressioncheck/NIG_Photoionizationvolume_emission/readme.md) | +| 6 | volume_emission_polychromatic/ | | Photoionization in the volume with polychromatic photon spectrum and energy-dependent cross-section data | nProcs= 1,2,5,8 | the total number of real electrons in the system with a reference solution and particle numbers for different MPFs | [Link](regressioncheck/NIG_Photoionizationvolume_emission_polychromatic/readme.md) | +| 7 | volume_emission_rectangle/ | | Photoionization in the volume (rectangle) | nProcs= 1,2,5,8 | the total number of real electrons in the system with a numerical ref. solution | [Link](regressioncheck/NIG_Photoionizationvolume_emission_rectangle/readme.md) | +| 8 | volume_emission_rectangle_ray_trace_high-order/ | | Photoionization in the volume (rectangle) for ray tracing with high-order refinement | nProcs= 1,2,5,8 | the total number of real electrons in the system with a numerical ref. solution | [Link](regressioncheck/NIG_Photoionizationvolume_emission_rectangle_ray_trace_high-order/readme.md) | +| 9 | volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/ | | Photoionization in the volume (rectangle) for ray tracing with high-order refinement and bilinear tracking | nProcs= 1,2,5,8 | the total number of real electrons in the system with a numerical ref. solution | [Link](regressioncheck/NIG_Photoionizationvolume_emission_rectangle_ray_trace_high-order_Cubit_3to1/readme.md) | +| 10 | volume_emission_vMPF/ | | Photoionization in the volume with vMPF | nProcs= 1,2,5,8 | the total number of real electrons in the system with an analytical expression and particle numbers for different MPFs | [Link](regressioncheck/NIG_Photoionizationvolume_emission_vMPF/readme.md) | ## Weekly diff --git a/regressioncheck/NIG_Photoionization/surface_emission/readme.md b/regressioncheck/NIG_Photoionization/surface_emission/readme.md index 2e79593da..582e3cadf 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission/readme.md +++ b/regressioncheck/NIG_Photoionization/surface_emission/readme.md @@ -1,4 +1,5 @@ # Photoionization: Surface Emission via SEE +* **Comparing**: the total number of real electrons in the system with an analytical expression * Particle emission due to secondary electron emission from a surface * no deposition, no interpolation * comparison of the number of emitted electrons with the analytic solution diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle/readme.md b/regressioncheck/NIG_Photoionization/surface_emission_rectangle/readme.md index 32b314c04..4e64196c1 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle/readme.md +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle/readme.md @@ -1,4 +1,5 @@ -# Photoionization: Surface Emission via SEE +# Secondary electron emission from a surface (rectangle), PartBCIndex=1 (BoundaryParticleOutput), emission-specific MPF (vMPF) +- **Comparing**: the total number of real electrons in the system with a numerical ref. solution * Particle emission due to secondary electron emission from a surface * no deposition, no interpolation * comparison of the number of emitted electrons with the reference solution diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/Electrons_ref.csv b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/Electrons_ref.csv new file mode 100644 index 000000000..cf1bea2f0 --- /dev/null +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/Electrons_ref.csv @@ -0,0 +1,22 @@ +"Nbr. of electrons (analytical)" +0.0000000000000000E+000 +0.8899999999999994E+009 +0.5459999999999996E+010 +0.2429999999999998E+011 +0.8663999999999994E+011 +0.2525199999999998E+012 +0.6073799999999996E+012 +0.1217649999999999E+013 +0.2061439999999999E+013 +0.2999459999999998E+013 +0.3837849999999998E+013 +0.4440339999999997E+013 +0.4788419999999997E+013 +0.4950099999999997E+013 +0.5010469999999997E+013 +0.5028589999999997E+013 +0.5032959999999997E+013 +0.5033809999999997E+013 +0.5033809999999997E+013 +0.5033809999999997E+013 +0.5033809999999997E+013 diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/analyze.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/analyze.ini index 936ed8a89..5e3acef0e 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/analyze.ini +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/analyze.ini @@ -1,22 +1,27 @@ +! =================================================================================================================== ! compare column -!compare_column_file = PartAnalyze.csv ! data file name -!compare_column_reference_file = Electrons_ref.csv ! data file name -!compare_column_index = 9 ! column index for comparison -!compare_column_tolerance_value = 1e9 ! tolerance (depends on machine accuracy and MPI) -!compare_column_tolerance_type = absolute ! absolute or relative tolerance +! =================================================================================================================== +compare_column_file = PartAnalyze.csv ! data file name +compare_column_reference_file = Electrons_ref.csv ! data file name +compare_column_index = 9 ! column index for comparison +compare_column_tolerance_value = 1e9 ! tolerance (depends on machine accuracy and MPI) +compare_column_tolerance_type = absolute ! absolute or relative tolerance +! =================================================================================================================== ! integrate columns x:y in a data file as integral(y(x), x, x(1), x(end)) -!integrate_line_file = SurfaceAnalyze.csv ! data file name -!integrate_line_columns = 0:1 ! columns x:y [time:nPart_in] -!integrate_line_integral_value = 0.0 ! X -!integrate_line_tolerance_value = 1.0e-7 ! tolerance -!integrate_line_tolerance_type = absolute ! special option +! =================================================================================================================== +integrate_line_file = SurfaceAnalyze.csv ! data file name +integrate_line_columns = 0:1 ! columns x:y [time:nPart_in] +integrate_line_integral_value = 8.065565e-07 ! Ampere +integrate_line_tolerance_value = 0.8e-2 ! tolerance +integrate_line_tolerance_type = relative ! special option -! temporarily deactivate until reference_RadiationSurfState.h5 is defined final -! ! hdf5 diff -! h5diff_file = photoionization_RadiationSurfState.h5 , photoionization_RadiationVolState.h5 -! h5diff_reference_file = reference_RadiationSurfState.h5 , reference_RadiationVolState.h5 -! h5diff_data_set = SurfaceData , ElemData -! h5diff_tolerance_value = 10E-2 , 10E-1 -! h5diff_tolerance_type = relative , relative -! !h5diff_max_differences = 5 +! =================================================================================================================== +! hdf5 diff +! =================================================================================================================== +h5diff_file = photoionization_RadiationSurfState.h5 , photoionization_RadiationVolState.h5 +h5diff_reference_file = reference_RadiationSurfState.h5 , reference_RadiationVolState.h5 +h5diff_data_set = SurfaceData , ElemData +h5diff_tolerance_value = 15E-2 , 10E-1 +h5diff_tolerance_type = relative , relative +!h5diff_max_differences = 5 diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/command_line.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/command_line.ini index 181521dce..6f94bea14 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/command_line.ini +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/command_line.ini @@ -1,2 +1,2 @@ -MPI = 1!,2,5,8,11,25 +MPI = 1,2,5,8,11,25 cmd_suffix = DSMC.ini diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/externals.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/externals.ini index 89b10c5ef..b7ec4f620 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/externals.ini +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/externals.ini @@ -3,6 +3,6 @@ MPI = 1 , 1 externalbinary = ./hopr/build/bin/hopr , ./bin/piclas2vtk , ./bin/piclas2vtk , ./bin/piclas2vtk externaldirectory = pre-hopr , ./parameter.ini , ./parameter.ini , ./parameter.ini externalruntime = pre , post , post , post -cmd_suffix = , photoionization_RadiationVolState.h5 , photoionization_RadiationSurfState.h5 , photoionization_PartStateBoundary_000.00000000500000000.h5 +cmd_suffix = , photoionization_RadiationVolState.h5 , photoionization_RadiationSurfState.h5 , photoionization_PartStateBoundary_000.00000010000000000.h5 nocrosscombination:MPI,externalbinary,externaldirectory,externalruntime,cmd_suffix diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/parameter.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/parameter.ini index 740e09ed9..56ef38fa6 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/parameter.ini +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/parameter.ini @@ -42,8 +42,8 @@ CalcElectronSEE = T ! CALCULATION ! =============================================================================== ! ManualTimeStep = 5.0E-9 -tend = 5.0E-9 -Analyze_dt = 5.0E-9 +tend = 100.0E-9 +Analyze_dt = 100.0E-9 PIC-DoDeposition = F @@ -135,8 +135,9 @@ RayTracing-RepetitionRate = 1000 RayTracing-RayDirection = (/ 0. , 0.5 , -1.0 /) ! SEE parameters -RayTracing-WorkFunctionSEE = 10.0 -RayTracing-YieldSEE = 0.1 +Part-Boundary5-PhotonSEE-WorkFunction = 10.0 +Part-Boundary5-PhotonSEE-Yield = 0.1 +Part-Boundary5-PhotonSEE-ElectronSpecies = 3 Part-Boundary$-PhotonEnACC = 1.0 ! =============================================================================== ! ! Weighting Factor @@ -145,7 +146,7 @@ Part-Species$-MacroParticleFactor = 1e4 ! Change MPF of SEE particles Part-vMPF = T -Part-Species3-Init1-MacroParticleFactor = 1e7!,1e8,1e9 +Part-Boundary5-PhotonSEE-MacroParticleFactor = 1E7 ! =============================================================================== ! ! Species1 | H2 diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/readme.md b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/readme.md index 9c5f0253e..58016c942 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/readme.md +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/readme.md @@ -1,5 +1,6 @@ -# Photoionization: Surface Emission via SEE -+ Ray tracing model from which surface emission is calculated +# Photoionization: Surface Emission via SEE for ray tracing +* **Comparing**: RadiationSurfState.h5 and RadiationVolState.h5 with reference files, the total number of real electrons in the system with a numerical ref. solution +* Ray tracing model from which surface emission is calculated * Particle emission due to secondary electron emission from a surface * No deposition, no interpolation * Comparison of the number of emitted electrons with the reference solution diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/reference_RadiationSurfState.h5 b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace/reference_RadiationSurfState.h5 index a3eb4a527014288a9d23fa9034e2cd14fce0a999..24b42f714a823689720a63bbc78c223219feb961 100644 GIT binary patch literal 7768 zcmeHLZ)jUp6u+~xZEx1Y;p9%sCX zg4xuQ>Wt=AGb&Y8w4aFS(`qaj4Qt*+Sj({yB5rNMfF!LvUgfxMM-DnvL9OuXMuC)m zETzWLPFT+d*iaN^S=bjc;B}3tX`5LKYDfK?w>HY#U^J$M#*Qa7&iiKkjjG|Onu+QO z;@DtD&1j~gvVuR0h`Xn>nM}y1#wmrH@t2I~86D`0&QTUkMILMx_@mbdWEu88)9cJ@J zdA}8Y*#UL9PpkOzCNhj@)CtaMp>-R5*7J)a%LbJFZKZbI!9%VPyFAo*GA6E_+qNt2 z@v_}JsJ{HY=iepbHxH)@SccrnCnmdNS2Jt>;2<7;caBAy}h>W;Bsk4!T0* zrmM*-BJBwY{f-QbjFcHQR}Hp5<`0-_&lS5Raf4~-DX59YxsM0p?Vgu%T#Nk7;@YQ& zwTkpy6Nh4)kQ3hEc*yJXc}6RiXPzo>Kg9j8h31#BD9g+LEw2#2_R|ccz;`J5&YVzF zB-N++cWsS7c)CJD21ve7xb$oyV;(P*cRHl0nZZ~#SJs%S7Cq=P)qbVT!bw!nR{H+~ zdyqCipDpahdYIpn;{Fm+oS)6!H^Z4EW9psnEpTed`zED{nkHwMRGO9R{I87j>~n^% zV+Zsnh4fikcnrQL*m|k*e|Q9aemBVxY!-yBSO48pGXq~F>fc%O%G8S5xMEC+?>!MW zLN>$wO?)cnTfIHp2gQ@yRuUMr99U2{{4R) zy-{r^SH$;i`^j9qk{u|GWdE9ku^}?QU z$$qPW*Y~Y_89pcJFXnM>?bVOoj7j>*BL3vWoxQ_HrFoYP9CVg`PCBJ^BDr*9S;N{5 zeS?R}$fzF=3Uu2B=mG2lJOp?I;0KHY;(#>ZIN&+J3BXCfhk#3fF96>It^s}m+yeXx z_#N;kpcy8Z1Iz19%7UHQ-yo4}iV!2csR}1Uw4BfI&bK@C;xHa2D_$ L;C;Xv;1|H(*zuS< delta 634 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 m``ESj3d|@lqriVxf&T-ze;Y#p delta 14293 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 Date: Sun, 29 Oct 2023 10:32:14 +0100 Subject: [PATCH 286/495] Slightly increased the tolerance for the reggie NIG_poisson_PETSC/poisson when testing SurfaceAnalyze.csv vs SurfaceAnalyze_reference.csv --- regressioncheck/NIG_poisson_PETSC/poisson/analyze.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regressioncheck/NIG_poisson_PETSC/poisson/analyze.ini b/regressioncheck/NIG_poisson_PETSC/poisson/analyze.ini index 029e97b63..33d062d8f 100644 --- a/regressioncheck/NIG_poisson_PETSC/poisson/analyze.ini +++ b/regressioncheck/NIG_poisson_PETSC/poisson/analyze.ini @@ -21,7 +21,7 @@ integrate_line_tolerance_type = relative ! relative or absolute ! compare the last row in SurfaceAnalyze.csv with a reference file compare_data_file_name = SurfaceAnalyze.csv compare_data_file_reference = SurfaceAnalyze_reference.csv -compare_data_file_tolerance = 80e-2 ! 1e-2 +compare_data_file_tolerance = 85e-2 ! 1e-2 compare_data_file_tolerance_type = relative ! =================================================================================================================== From d7c190bf6dc012924c3df698a5d537f9bbea0832 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Sun, 29 Oct 2023 12:59:21 +0100 Subject: [PATCH 287/495] Testing gitlab-ci excluding DO_CORE_SPLIT and DO_NODE_SPLIT for Photoionization reggies --- .gitlab-ci.yml | 35 ++++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 43d4be0c7..a07a8fc7d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -18,7 +18,8 @@ before_script: echo " PICLAS_SPLIT_TYPE=PICLAS_COMM_TYPE_NODE. Splitting shared memory domains on sub-node-level with 2 cores per node!"; export PICLAS_SPLIT_TYPE=PICLAS_COMM_TYPE_NODE; else - echo "Splitting shared memory domains on node-level! Set variable DO_CORE_SPLIT=T to force core-level OR DO_NODE_SPLIT=T to force sub-node-level shared memory splitting for all regression tests."; + echo "Splitting shared memory domains on node-level (default)!"; + echo "Set variable [DO_CORE_SPLIT=T] to force core-level OR [DO_NODE_SPLIT=T] to force sub-node-level shared memory splitting for all regression tests."; fi fi - if [ -n "${DO_NINJA}" ]; then @@ -381,11 +382,11 @@ build_hopr_in_piclas: - mkdir -p build_hopr_lib ; cd build_hopr_lib - python ../reggie/reggie.py ../regressioncheck/WEK_HOPR rules: + #- if: '$DO_CORE_SPLIT' + #when: never + #- if: '$DO_NODE_SPLIT' + #when: never - if: '$DO_WEEKLY' - - if: '$DO_CORE_SPLIT' - when: never - - if: '$DO_NODE_SPLIT' - when: never build_no_git: tags: [withmodules-concurrent] @@ -731,24 +732,48 @@ NIG_Photoionization_release_Leapfrog: stage: reggie_nightly script: - cd build_poisson_release_Leapfrog; python ../reggie/reggie.py ../regressioncheck/NIG_Photoionization -e ./bin/piclas + rules: + - if: '$DO_CORE_SPLIT' + when: never + - if: '$DO_NODE_SPLIT' + when: never + - if: '$DO_NIGHTLY' NIG_Photoionization_debug_Leapfrog: <<: *defaults_poisson_nightly stage: reggie_nightly script: - cd build_poisson_debug_Leapfrog; python ../reggie/reggie.py ../regressioncheck/NIG_Photoionization -e ./bin/piclas + rules: + - if: '$DO_CORE_SPLIT' + when: never + - if: '$DO_NODE_SPLIT' + when: never + - if: '$DO_NIGHTLY' NIG_Photoionization_petsc_release_Leapfrog: <<: *defaults_poisson_petsc_nightly stage: reggie_nightly script: - cd build_poisson_petsc_release_Leapfrog; python ../reggie/reggie.py ../regressioncheck/NIG_Photoionization -e ./bin/piclas + rules: + - if: '$DO_CORE_SPLIT' + when: never + - if: '$DO_NODE_SPLIT' + when: never + - if: '$DO_NIGHTLY' NIG_Photoionization_petsc_debug_Leapfrog: <<: *defaults_poisson_petsc_nightly stage: reggie_nightly script: - cd build_poisson_petsc_debug_Leapfrog; python ../reggie/reggie.py ../regressioncheck/NIG_Photoionization -e ./bin/piclas + rules: + - if: '$DO_CORE_SPLIT' + when: never + - if: '$DO_NODE_SPLIT' + when: never + - if: '$DO_NIGHTLY' NIG_Radiation: <<: *defaults_nightly From 72e5363dc0f28d7c90b6fab0a5ea41e5ca0abdd3 Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Sun, 29 Oct 2023 15:59:53 +0100 Subject: [PATCH 288/495] NIG_PIC_poisson_Boris-Leapfrog/2D_Landmark: increased tolerance from 4% to 5% to account for stronger fluctuations due to lower particle number in vMPF case --- .../NIG_PIC_poisson_Boris-Leapfrog/2D_Landmark/analyze.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regressioncheck/NIG_PIC_poisson_Boris-Leapfrog/2D_Landmark/analyze.ini b/regressioncheck/NIG_PIC_poisson_Boris-Leapfrog/2D_Landmark/analyze.ini index 02e4bbe4f..c61d5de89 100644 --- a/regressioncheck/NIG_PIC_poisson_Boris-Leapfrog/2D_Landmark/analyze.ini +++ b/regressioncheck/NIG_PIC_poisson_Boris-Leapfrog/2D_Landmark/analyze.ini @@ -3,5 +3,5 @@ integrate_line_file = SurfaceAnalyze.csv ! Data file name integrate_line_columns = 0:1 ! Columns x:y for integration y over x integrate_line_integral_value = 1.142E8 ! Number of removed electrons through the anode BC per second (=5.71e-4/5e-12) ! ! integrated value from one exemplary simulation -integrate_line_tolerance_value = 4e-2 ! Tolerance +integrate_line_tolerance_value = 5e-2 ! Tolerance integrate_line_tolerance_type = relative ! Relative or absolute tolerance From de3ace33648f9964a167077c09d5ddfb78d55593 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Mon, 30 Oct 2023 11:54:21 +0100 Subject: [PATCH 289/495] Added prerequisites checks for the HTML and PDF building scripts + info where the output files are created and how to view them. --- docs/documentation/buildHTML.sh | 17 +++++++++++++++-- docs/documentation/buildPDF.sh | 25 +++++++++++++++++++------ 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/docs/documentation/buildHTML.sh b/docs/documentation/buildHTML.sh index 05d0a4359..e5c94b2bb 100755 --- a/docs/documentation/buildHTML.sh +++ b/docs/documentation/buildHTML.sh @@ -1,2 +1,15 @@ -# Compile html files -python3 -m sphinx -T -E -b html -d _build/doctrees -D language=en . _build/html +#!/bin/bash + +# Check prerequisites +python3 -c "import sphinx" + +# $? Stores the exit value of the last command that was executed. +if [[ $? -eq 0 ]]; then + # Compile html files + python3 -m sphinx -T -E -b html -d _build/doctrees -D language=en . _build/html + + # Output info where the html file is + echo -e "\nThe HTML files have been created. Run, e.g., 'firefox _build/html/index.html &' to view the documentation." +else + echo -e "\nError: Could not build the documentation due to import errors in python! Fix them and run the script again." +fi diff --git a/docs/documentation/buildPDF.sh b/docs/documentation/buildPDF.sh index 83fa5e77b..302088238 100755 --- a/docs/documentation/buildPDF.sh +++ b/docs/documentation/buildPDF.sh @@ -1,8 +1,21 @@ -# Compile latex files -python3 -m sphinx -b latex -D language=en -d _build/doctrees . _build/latex +#!/bin/bash -# Switch to latex source files -cd _build/latex +# Check prerequisites +python3 -c "import sphinx" -# Compile pdf file(s) -latexmk -r latexmkrc -pdf -f -dvi- -ps- -jobname=piclas -interaction=nonstopmode +# $? Stores the exit value of the last command that was executed. +if [[ $? -eq 0 ]]; then + # Compile latex files + python3 -m sphinx -b latex -D language=en -d _build/doctrees . _build/latex + + # Switch to latex source files + cd _build/latex + + # Compile pdf file(s) + latexmk -r latexmkrc -pdf -f -dvi- -ps- -jobname=piclas -interaction=nonstopmode + + # Output info where the pdf file is + echo -e "\n The PDF has been created under ./_build/latex/piclas.pdf" +else + echo -e "\nError: Could not build the documentation due to import errors in python! Fix them and run the script again." +fi From 401efcf81083cff9fdb73ae58e3aa6a1d3a0a92b Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Mon, 30 Oct 2023 16:39:28 +0100 Subject: [PATCH 290/495] Temporarily added todo in gitlab templates for replacing MPI_COMM_WORLD with MPI_COMM_PICLAS --- .gitlab/merge_request_templates/Bug.md | 1 + .gitlab/merge_request_templates/Feature.md | 3 ++- src/hdg/hdg.f90 | 4 ++-- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.gitlab/merge_request_templates/Bug.md b/.gitlab/merge_request_templates/Bug.md index 76e5174b0..9d45a6908 100644 --- a/.gitlab/merge_request_templates/Bug.md +++ b/.gitlab/merge_request_templates/Bug.md @@ -7,3 +7,4 @@ Closes #number * [ ] Style Guide * [ ] Maximum of 10 compile warnings via *./tools/test_max_warnings.sh* * [ ] No large files via *./tools/test_max_file_size.sh*. What is the largest file? +* [ ] Replace `MPI_COMM_WORLD` with `MPI_COMM_PICLAS` diff --git a/.gitlab/merge_request_templates/Feature.md b/.gitlab/merge_request_templates/Feature.md index 09a1888d6..ec72454d8 100644 --- a/.gitlab/merge_request_templates/Feature.md +++ b/.gitlab/merge_request_templates/Feature.md @@ -16,4 +16,5 @@ * [ ] Add small test setup * [ ] Add entry in REGGIE.md table * [ ] Check automatic restart functionality of reggie example via Load Balance (checks correct allocation and deallocation for the test case) -* [ ] New feature description in appropriate documentation (user/developer guide) \ No newline at end of file +* [ ] New feature description in appropriate documentation (user/developer guide) +* [ ] Replace `MPI_COMM_WORLD` with `MPI_COMM_PICLAS` diff --git a/src/hdg/hdg.f90 b/src/hdg/hdg.f90 index a76309dfd..d47e7627b 100644 --- a/src/hdg/hdg.f90 +++ b/src/hdg/hdg.f90 @@ -274,7 +274,7 @@ SUBROUTINE InitHDG() ! Get the global number of Dirichlet boundaries. If there are none, the potential of a single DOF must be set. #if USE_MPI - CALL MPI_ALLREDUCE(nDirichletBCsides , nDirichletBCsidesGlobal , 1 , MPI_INTEGER , MPI_MAX , MPI_COMM_WORLD , IERROR) + CALL MPI_ALLREDUCE(nDirichletBCsides , nDirichletBCsidesGlobal , 1 , MPI_INTEGER , MPI_MAX , MPI_COMM_PICLAS , IERROR) #else nDirichletBCsidesGlobal = nDirichletBCsides #endif /*USE_MPI*/ @@ -3418,4 +3418,4 @@ SUBROUTINE FinalizeHDG() END SUBROUTINE FinalizeHDG -END MODULE MOD_HDG \ No newline at end of file +END MODULE MOD_HDG From 48c3300d1a666dd71a663befbad8387f836b6f16 Mon Sep 17 00:00:00 2001 From: Raphael Tietz Date: Tue, 31 Oct 2023 17:58:56 +0100 Subject: [PATCH 291/495] Included Dynamic maxPartNum and increase it if needed --- src/particles/dsmc/dsmc_ambipolardiff.f90 | 335 +++++------ src/particles/dsmc/dsmc_bg_gas.f90 | 31 +- .../dsmc/dsmc_chemical_reactions.f90 | 15 +- src/particles/dsmc/dsmc_main.f90 | 2 +- src/particles/dsmc/dsmc_symmetry.f90 | 10 +- .../emission/particle_br_electron_fluid.f90 | 10 +- src/particles/emission/particle_emission.f90 | 20 +- .../emission/particle_emission_init.f90 | 18 +- .../emission/particle_emission_tools.f90 | 134 ++--- .../emission/particle_macroscopic_restart.f90 | 99 +-- .../particle_position_and_velocity.f90 | 99 +-- .../emission/particle_surface_flux.f90 | 356 ++++++----- src/particles/mcc/mcc.f90 | 10 +- src/particles/particle_init.f90 | 21 +- src/particles/particle_mpi/particle_mpi.f90 | 15 +- .../particle_mpi/particle_mpi_emission.f90 | 70 +-- src/particles/particle_operations.f90 | 12 +- src/particles/particle_tools.f90 | 566 +++++++++++++++++- src/particles/particle_vMPF.f90 | 24 +- src/particles/particle_vars.f90 | 10 +- .../pic/deposition/pic_depo_tools.f90 | 3 +- src/particles/pic/models/pic_models.f90 | 24 +- src/particles/restart/particle_restart.f90 | 5 +- src/particles/ttm/ttm_init.f90 | 6 +- src/readIMD/readIMD.f90 | 2 +- src/timedisc/timedisc_TimeStep_BGK.f90 | 4 - src/timedisc/timedisc_TimeStep_DSMC.f90 | 4 - src/timedisc/timedisc_TimeStep_FPFlow.f90 | 5 - 28 files changed, 1152 insertions(+), 758 deletions(-) diff --git a/src/particles/dsmc/dsmc_ambipolardiff.f90 b/src/particles/dsmc/dsmc_ambipolardiff.f90 index bc0bd4754..cf021c101 100644 --- a/src/particles/dsmc/dsmc_ambipolardiff.f90 +++ b/src/particles/dsmc/dsmc_ambipolardiff.f90 @@ -80,7 +80,7 @@ SUBROUTINE AD_SetInitElectronVelo(FractNbr,iInit,NbrOfParticle) USE MOD_Particle_Vars USE MOD_Globals_Vars ,ONLY: BoltzmannConst USE MOD_part_emission_tools ,ONLY: CalcVelocity_maxwell_lpn -USE MOD_part_tools ,ONLY: BuildTransGaussNums +USE MOD_part_tools ,ONLY: BuildTransGaussNums, GetNextFreePosition USE MOD_DSMC_Vars ,ONLY: DSMC, AmbipolElecVelo ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -117,33 +117,27 @@ SUBROUTINE AD_SetInitElectronVelo(FractNbr,iInit,NbrOfParticle) SELECT CASE(TRIM(velocityDistribution)) CASE('constant') DO i = 1,NbrOfParticle - PositionNbr = PDM%nextFreePosition(i+PDM%CurrentNextFreePosition) - IF (PositionNbr.GT.0) THEN - IF (ALLOCATED(AmbipolElecVelo(PositionNbr)%ElecVelo)) DEALLOCATE(AmbipolElecVelo(PositionNbr)%ElecVelo) - ALLOCATE(AmbipolElecVelo(PositionNbr)%ElecVelo(3)) - AmbipolElecVelo(PositionNbr)%ElecVelo(1:3) = VeloVecIC(1:3) * VeloIC - END IF + PositionNbr = GetNextFreePosition(i) + IF (ALLOCATED(AmbipolElecVelo(PositionNbr)%ElecVelo)) DEALLOCATE(AmbipolElecVelo(PositionNbr)%ElecVelo) + ALLOCATE(AmbipolElecVelo(PositionNbr)%ElecVelo(3)) + AmbipolElecVelo(PositionNbr)%ElecVelo(1:3) = VeloVecIC(1:3) * VeloIC END DO CASE('maxwell_lpn') DO i = 1,NbrOfParticle - PositionNbr = PDM%nextFreePosition(i+PDM%CurrentNextFreePosition) - IF (PositionNbr.GT.0) THEN - CALL CalcVelocity_maxwell_lpn(DSMC%AmbiDiffElecSpec, Vec3D, Temperature=Species(FractNbr)%Init(iInit)%MWTemperatureIC) - IF (ALLOCATED(AmbipolElecVelo(PositionNbr)%ElecVelo)) DEALLOCATE(AmbipolElecVelo(PositionNbr)%ElecVelo) - ALLOCATE(AmbipolElecVelo(PositionNbr)%ElecVelo(3)) - AmbipolElecVelo(PositionNbr)%ElecVelo(1:3) = VeloIC *VeloVecIC(1:3) + Vec3D(1:3) - END IF + PositionNbr = GetNextFreePosition(i) + CALL CalcVelocity_maxwell_lpn(DSMC%AmbiDiffElecSpec, Vec3D, Temperature=Species(FractNbr)%Init(iInit)%MWTemperatureIC) + IF (ALLOCATED(AmbipolElecVelo(PositionNbr)%ElecVelo)) DEALLOCATE(AmbipolElecVelo(PositionNbr)%ElecVelo) + ALLOCATE(AmbipolElecVelo(PositionNbr)%ElecVelo(3)) + AmbipolElecVelo(PositionNbr)%ElecVelo(1:3) = VeloIC *VeloVecIC(1:3) + Vec3D(1:3) END DO CASE('maxwell') CALL BuildTransGaussNums(NbrOfParticle, iRanPart) maxwellfac = SQRT(BoltzmannConst*Species(FractNbr)%Init(iInit)%MWTemperatureIC/Species(DSMC%AmbiDiffElecSpec)%MassIC) DO i = 1,NbrOfParticle - PositionNbr = PDM%nextFreePosition(i+PDM%CurrentNextFreePosition) - IF (PositionNbr.GT.0) THEN - IF (ALLOCATED(AmbipolElecVelo(PositionNbr)%ElecVelo)) DEALLOCATE(AmbipolElecVelo(PositionNbr)%ElecVelo) - ALLOCATE(AmbipolElecVelo(PositionNbr)%ElecVelo(3)) - AmbipolElecVelo(PositionNbr)%ElecVelo(1:3) = VeloIC *VeloVecIC(1:3) + iRanPart(1:3,i)*maxwellfac - END IF + PositionNbr = GetNextFreePosition(i) + IF (ALLOCATED(AmbipolElecVelo(PositionNbr)%ElecVelo)) DEALLOCATE(AmbipolElecVelo(PositionNbr)%ElecVelo) + ALLOCATE(AmbipolElecVelo(PositionNbr)%ElecVelo(3)) + AmbipolElecVelo(PositionNbr)%ElecVelo(1:3) = VeloIC *VeloVecIC(1:3) + iRanPart(1:3,i)*maxwellfac END DO CASE DEFAULT CALL abort(& @@ -166,6 +160,7 @@ SUBROUTINE AD_SetSFElectronVelo(iSpec,iSFIon,iSample,jSample,iSide,BCSideID,Side USE MOD_Particle_Surfaces, ONLY : CalcNormAndTangBezier USE MOD_Particle_Sampling_Vars ,ONLY: AdaptBCMapElemToSample, AdaptBCMacroVal USE MOD_DSMC_Vars ,ONLY: AmbiPolarSFMapping, AmbipolElecVelo, DSMC +USE MOD_Part_Tools ,ONLY: GetNextFreePosition ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -256,31 +251,29 @@ SUBROUTINE AD_SetSFElectronVelo(iSpec,iSFIon,iSample,jSample,iSide,BCSideID,Side iPart = 0 DO i = NbrOfParticle-PartIns+1,NbrOfParticle iPart = iPart + 1 - PositionNbr = PDM%nextFreePosition(i+PDM%CurrentNextFreePosition) - IF (PositionNbr .NE. 0) THEN - ! In case of side-normal velocities: calc n-vector at particle position, xi was saved in PartState(4:5) - IF (Species(DSMC%AmbiDiffElecSpec)%Surfaceflux(iSF)%VeloIsNormal .AND. TriaSurfaceFlux) THEN - vec_nIn(1:3) = SurfMeshSubSideData(iSample,jSample,BCSideID)%vec_nIn(1:3) - vec_t1(1:3) = 0. !dummy - vec_t2(1:3) = 0. !dummy - ELSE IF (Species(DSMC%AmbiDiffElecSpec)%Surfaceflux(iSF)%VeloIsNormal) THEN - ! CALL CalcNormAndTangBezier( nVec=vec_nIn(1:3),xi=PartState(4,PositionNbr),eta=PartState(5,PositionNbr),SideID=SideID ) - CALL CalcNormAndTangBezier( nVec=vec_nIn(1:3),xi=particle_xis(2*(iPart-1)+1),eta=particle_xis(2*(iPart-1)+2),SideID=SideID ) - vec_nIn(1:3) = -vec_nIn(1:3) - vec_t1(1:3) = 0. !dummy - vec_t2(1:3) = 0. !dummy - ELSE - vec_nIn(1:3) = VeloVecIC(1:3) - END IF !VeloIsNormal - ! Build complete velo-vector - Vec3D(1:3) = vec_nIn(1:3) * Species(DSMC%AmbiDiffElecSpec)%Surfaceflux(iSF)%VeloIC - ! PartState(4:6,PositionNbr) = Vec3D(1:3) - IF (PositionNbr.GT.0) THEN - IF (ALLOCATED(AmbipolElecVelo(PositionNbr)%ElecVelo)) DEALLOCATE(AmbipolElecVelo(PositionNbr)%ElecVelo) - ALLOCATE(AmbipolElecVelo(PositionNbr)%ElecVelo(3)) - AmbipolElecVelo(PositionNbr)%ElecVelo(1:3) = Vec3D(1:3) - END IF - END IF !PositionNbr .NE. 0 + PositionNbr = GetNextFreePosition() + ! In case of side-normal velocities: calc n-vector at particle position, xi was saved in PartState(4:5) + IF (Species(DSMC%AmbiDiffElecSpec)%Surfaceflux(iSF)%VeloIsNormal .AND. TriaSurfaceFlux) THEN + vec_nIn(1:3) = SurfMeshSubSideData(iSample,jSample,BCSideID)%vec_nIn(1:3) + vec_t1(1:3) = 0. !dummy + vec_t2(1:3) = 0. !dummy + ELSE IF (Species(DSMC%AmbiDiffElecSpec)%Surfaceflux(iSF)%VeloIsNormal) THEN + ! CALL CalcNormAndTangBezier( nVec=vec_nIn(1:3),xi=PartState(4,PositionNbr),eta=PartState(5,PositionNbr),SideID=SideID ) + CALL CalcNormAndTangBezier( nVec=vec_nIn(1:3),xi=particle_xis(2*(iPart-1)+1),eta=particle_xis(2*(iPart-1)+2),SideID=SideID ) + vec_nIn(1:3) = -vec_nIn(1:3) + vec_t1(1:3) = 0. !dummy + vec_t2(1:3) = 0. !dummy + ELSE + vec_nIn(1:3) = VeloVecIC(1:3) + END IF !VeloIsNormal + ! Build complete velo-vector + Vec3D(1:3) = vec_nIn(1:3) * Species(DSMC%AmbiDiffElecSpec)%Surfaceflux(iSF)%VeloIC + ! PartState(4:6,PositionNbr) = Vec3D(1:3) + IF (PositionNbr.GT.0) THEN + IF (ALLOCATED(AmbipolElecVelo(PositionNbr)%ElecVelo)) DEALLOCATE(AmbipolElecVelo(PositionNbr)%ElecVelo) + ALLOCATE(AmbipolElecVelo(PositionNbr)%ElecVelo(3)) + AmbipolElecVelo(PositionNbr)%ElecVelo(1:3) = Vec3D(1:3) + END IF END DO !i = ...NbrOfParticle CASE('maxwell','maxwell_lpn') !-- determine envelope for most efficient ARM [Garcia and Wagner 2006, JCP217-2] @@ -306,151 +299,145 @@ SUBROUTINE AD_SetSFElectronVelo(iSpec,iSFIon,iSample,jSample,iSide,BCSideID,Side iPart = 0 DO i = NbrOfParticle-PartIns+1,NbrOfParticle iPart = iPart + 1 - PositionNbr = PDM%nextFreePosition(i+PDM%CurrentNextFreePosition) - IF (PositionNbr .NE. 0) THEN - !-- 0a.: In case of side-normal velocities: calc n-/t-vectors at particle position, xi was saved in PartState(4:5) - IF (Species(DSMC%AmbiDiffElecSpec)%Surfaceflux(iSF)%VeloIsNormal .AND. TriaSurfaceFlux) THEN - vec_nIn(1:3) = SurfMeshSubSideData(iSample,jSample,BCSideID)%vec_nIn(1:3) - vec_t1(1:3) = SurfMeshSubSideData(iSample,jSample,BCSideID)%vec_t1(1:3) - vec_t2(1:3) = SurfMeshSubSideData(iSample,jSample,BCSideID)%vec_t2(1:3) - ELSE IF (Species(DSMC%AmbiDiffElecSpec)%Surfaceflux(iSF)%VeloIsNormal) THEN - ! CALL CalcNormAndTangBezier( nVec=vec_nIn(1:3),tang1=vec_t1(1:3),tang2=vec_t2(1:3) & - ! ,xi=PartState(4,PositionNbr),eta=PartState(5,PositionNbr),SideID=SideID ) - CALL CalcNormAndTangBezier( nVec=vec_nIn(1:3),tang1=vec_t1(1:3),tang2=vec_t2(1:3) & - ,xi=particle_xis(2*(iPart-1)+1),eta=particle_xis(2*(iPart-1)+2),SideID=SideID ) - vec_nIn(1:3) = -vec_nIn(1:3) - END IF !VeloIsNormal - !-- 1.: determine zstar (initial generation of potentially too many RVu is for needed indentities of RVu used multiple times! - SELECT CASE(envelope) - CASE(0) - CALL RANDOM_NUMBER(RandVal1) - zstar = -SQRT(-LOG(RandVal1)) - CASE(1) - DO - CALL RANDOM_NUMBER(RandVal2) - zstar = -SQRT(a*a-LOG(RandVal2(1))) - IF ( -(a-zstar)/zstar .GT. RandVal2(2)) THEN + PositionNbr = GetNextFreePosition() + !-- 0a.: In case of side-normal velocities: calc n-/t-vectors at particle position, xi was saved in PartState(4:5) + IF (Species(DSMC%AmbiDiffElecSpec)%Surfaceflux(iSF)%VeloIsNormal .AND. TriaSurfaceFlux) THEN + vec_nIn(1:3) = SurfMeshSubSideData(iSample,jSample,BCSideID)%vec_nIn(1:3) + vec_t1(1:3) = SurfMeshSubSideData(iSample,jSample,BCSideID)%vec_t1(1:3) + vec_t2(1:3) = SurfMeshSubSideData(iSample,jSample,BCSideID)%vec_t2(1:3) + ELSE IF (Species(DSMC%AmbiDiffElecSpec)%Surfaceflux(iSF)%VeloIsNormal) THEN + ! CALL CalcNormAndTangBezier( nVec=vec_nIn(1:3),tang1=vec_t1(1:3),tang2=vec_t2(1:3) & + ! ,xi=PartState(4,PositionNbr),eta=PartState(5,PositionNbr),SideID=SideID ) + CALL CalcNormAndTangBezier( nVec=vec_nIn(1:3),tang1=vec_t1(1:3),tang2=vec_t2(1:3) & + ,xi=particle_xis(2*(iPart-1)+1),eta=particle_xis(2*(iPart-1)+2),SideID=SideID ) + vec_nIn(1:3) = -vec_nIn(1:3) + END IF !VeloIsNormal + !-- 1.: determine zstar (initial generation of potentially too many RVu is for needed indentities of RVu used multiple times! + SELECT CASE(envelope) + CASE(0) + CALL RANDOM_NUMBER(RandVal1) + zstar = -SQRT(-LOG(RandVal1)) + CASE(1) + DO + CALL RANDOM_NUMBER(RandVal2) + zstar = -SQRT(a*a-LOG(RandVal2(1))) + IF ( -(a-zstar)/zstar .GT. RandVal2(2)) THEN + EXIT + END IF + END DO + CASE(2) + z = 0.5*(a-SQRT(a*a+2.)) + beta = a-(1.0-a)*(a-z) + DO + CALL RANDOM_NUMBER(RandVal3) + IF (EXP(-(beta*beta))/(EXP(-(beta*beta))+2.0*(a-z)*(a-beta)*EXP(-(z*z))).GT.RandVal3(1)) THEN + zstar=-SQRT(beta*beta-LOG(RandVal3(2))) + IF ( -(a-zstar)/zstar .GT. RandVal3(3)) THEN EXIT END IF - END DO - CASE(2) - z = 0.5*(a-SQRT(a*a+2.)) - beta = a-(1.0-a)*(a-z) - DO - CALL RANDOM_NUMBER(RandVal3) - IF (EXP(-(beta*beta))/(EXP(-(beta*beta))+2.0*(a-z)*(a-beta)*EXP(-(z*z))).GT.RandVal3(1)) THEN - zstar=-SQRT(beta*beta-LOG(RandVal3(2))) - IF ( -(a-zstar)/zstar .GT. RandVal3(3)) THEN - EXIT - END IF - ELSE - zstar=beta+(a-beta)*RandVal3(2) - IF ( (a-zstar)/(a-z)*EXP(z*z-(zstar*zstar)) .GT. RandVal3(3)) THEN - EXIT - END IF + ELSE + zstar=beta+(a-beta)*RandVal3(2) + IF ( (a-zstar)/(a-z)*EXP(z*z-(zstar*zstar)) .GT. RandVal3(3)) THEN + EXIT END IF - END DO - CASE(3) - DO - CALL RANDOM_NUMBER(RandVal3) - u = RandVal3(1) - IF ( a*SQRT(PI)/(a*SQRT(PI)+1+a*a) .GT. u) THEN + END IF + END DO + CASE(3) + DO + CALL RANDOM_NUMBER(RandVal3) + u = RandVal3(1) + IF ( a*SQRT(PI)/(a*SQRT(PI)+1+a*a) .GT. u) THEN ! IF (.NOT.DoZigguratSampling) THEN !polar method - IF (RandN_in_Mem) THEN !reusing second RandN form previous polar method - RandN = RandN_save - RandN_in_Mem=.FALSE. - ELSE - Velosq = 2 - DO WHILE ((Velosq .GE. 1.) .OR. (Velosq .EQ. 0.)) - CALL RANDOM_NUMBER(RandVal2) - Velo1 = 2.*RandVal2(1) - 1. - Velo2 = 2.*RandVal2(2) - 1. - Velosq = Velo1**2 + Velo2**2 - END DO - RandN = Velo1*SQRT(-2*LOG(Velosq)/Velosq) - RandN_save = Velo2*SQRT(-2*LOG(Velosq)/Velosq) - RandN_in_Mem=.TRUE. - END IF + IF (RandN_in_Mem) THEN !reusing second RandN form previous polar method + RandN = RandN_save + RandN_in_Mem=.FALSE. + ELSE + Velosq = 2 + DO WHILE ((Velosq .GE. 1.) .OR. (Velosq .EQ. 0.)) + CALL RANDOM_NUMBER(RandVal2) + Velo1 = 2.*RandVal2(1) - 1. + Velo2 = 2.*RandVal2(2) - 1. + Velosq = Velo1**2 + Velo2**2 + END DO + RandN = Velo1*SQRT(-2*LOG(Velosq)/Velosq) + RandN_save = Velo2*SQRT(-2*LOG(Velosq)/Velosq) + RandN_in_Mem=.TRUE. + END IF ! ELSE !ziggurat method ! RandN=rnor() ! END IF - zstar = -1./SQRT(2.)*ABS(RandN) - EXIT - ELSE IF ( (a*SQRT(PI)+1.)/(a*SQRT(PI)+1+a*a) .GT. u) THEN - zstar = -SQRT(-LOG(RandVal3(2))) + zstar = -1./SQRT(2.)*ABS(RandN) + EXIT + ELSE IF ( (a*SQRT(PI)+1.)/(a*SQRT(PI)+1+a*a) .GT. u) THEN + zstar = -SQRT(-LOG(RandVal3(2))) + EXIT + ELSE + zstar = (1.0-SQRT(RandVal3(2)))*a + IF (EXP(-(zstar*zstar)).GT.RandVal3(3)) THEN EXIT - ELSE - zstar = (1.0-SQRT(RandVal3(2)))*a - IF (EXP(-(zstar*zstar)).GT.RandVal3(3)) THEN - EXIT - END IF END IF - END DO - CASE(4) - DO - CALL RANDOM_NUMBER(RandVal3) - IF (1.0/(2.0*a*SQRT(PI)+1.0).GT.RandVal3(1)) THEN - zstar=-SQRT(-LOG(RandVal3(2))) - ELSE + END IF + END DO + CASE(4) + DO + CALL RANDOM_NUMBER(RandVal3) + IF (1.0/(2.0*a*SQRT(PI)+1.0).GT.RandVal3(1)) THEN + zstar=-SQRT(-LOG(RandVal3(2))) + ELSE ! IF (.NOT.DoZigguratSampling) THEN !polar method - IF (RandN_in_Mem) THEN !reusing second RandN form previous polar method - RandN = RandN_save - RandN_in_Mem=.FALSE. - ELSE - Velosq = 2 - DO WHILE ((Velosq .GE. 1.) .OR. (Velosq .EQ. 0.)) - CALL RANDOM_NUMBER(RandVal2) - Velo1 = 2.*RandVal2(1) - 1. - Velo2 = 2.*RandVal2(2) - 1. - Velosq = Velo1**2 + Velo2**2 - END DO - RandN = Velo1*SQRT(-2*LOG(Velosq)/Velosq) - RandN_save = Velo2*SQRT(-2*LOG(Velosq)/Velosq) - RandN_in_Mem=.TRUE. - END IF + IF (RandN_in_Mem) THEN !reusing second RandN form previous polar method + RandN = RandN_save + RandN_in_Mem=.FALSE. + ELSE + Velosq = 2 + DO WHILE ((Velosq .GE. 1.) .OR. (Velosq .EQ. 0.)) + CALL RANDOM_NUMBER(RandVal2) + Velo1 = 2.*RandVal2(1) - 1. + Velo2 = 2.*RandVal2(2) - 1. + Velosq = Velo1**2 + Velo2**2 + END DO + RandN = Velo1*SQRT(-2*LOG(Velosq)/Velosq) + RandN_save = Velo2*SQRT(-2*LOG(Velosq)/Velosq) + RandN_in_Mem=.TRUE. + END IF ! ELSE !ziggurat method ! RandN=rnor() ! END IF - zstar = 1./SQRT(2.)*RandN - END IF - IF ( (a-zstar)/a .GT. RandVal3(3)) THEN - EXIT - END IF - END DO - CASE DEFAULT - CALL abort(__STAMP__,'ERROR in SurfaceFlux: Wrong envelope in SetSurfacefluxVelocities!') - END SELECT - !-- 2.: sample normal directions and build complete velo-vector - Vec3D(1:3) = vec_nIn(1:3) * SQRT(2.*BoltzmannConst*T/Species(DSMC%AmbiDiffElecSpec)%MassIC)*(a-zstar) + zstar = 1./SQRT(2.)*RandN + END IF + IF ( (a-zstar)/a .GT. RandVal3(3)) THEN + EXIT + END IF + END DO + CASE DEFAULT + CALL abort(__STAMP__,'ERROR in SurfaceFlux: Wrong envelope in SetSurfacefluxVelocities!') + END SELECT + !-- 2.: sample normal directions and build complete velo-vector + Vec3D(1:3) = vec_nIn(1:3) * SQRT(2.*BoltzmannConst*T/Species(DSMC%AmbiDiffElecSpec)%MassIC)*(a-zstar) ! IF (.NOT.DoZigguratSampling) THEN !polar method - Velosq = 2 - DO WHILE ((Velosq .GE. 1.) .OR. (Velosq .EQ. 0.)) - CALL RANDOM_NUMBER(RandVal2) - Velo1 = 2.*RandVal2(1) - 1. - Velo2 = 2.*RandVal2(2) - 1. - Velosq = Velo1**2 + Velo2**2 - END DO - Velo1 = Velo1*SQRT(-2*LOG(Velosq)/Velosq) - Velo2 = Velo2*SQRT(-2*LOG(Velosq)/Velosq) + Velosq = 2 + DO WHILE ((Velosq .GE. 1.) .OR. (Velosq .EQ. 0.)) + CALL RANDOM_NUMBER(RandVal2) + Velo1 = 2.*RandVal2(1) - 1. + Velo2 = 2.*RandVal2(2) - 1. + Velosq = Velo1**2 + Velo2**2 + END DO + Velo1 = Velo1*SQRT(-2*LOG(Velosq)/Velosq) + Velo2 = Velo2*SQRT(-2*LOG(Velosq)/Velosq) ! ELSE !ziggurat method ! Velo1=rnor() ! Velo2=rnor() ! END IF - Vec3D(1:3) = Vec3D(1:3) + vec_t1(1:3) * ( Velo_t1+Velo1*SQRT(BoltzmannConst*T/Species(DSMC%AmbiDiffElecSpec)%MassIC) ) - Vec3D(1:3) = Vec3D(1:3) + vec_t2(1:3) * ( Velo_t2+Velo2*SQRT(BoltzmannConst*T/Species(DSMC%AmbiDiffElecSpec)%MassIC) ) - IF (PositionNbr.GT.0) THEN - IF (ALLOCATED(AmbipolElecVelo(PositionNbr)%ElecVelo)) DEALLOCATE(AmbipolElecVelo(PositionNbr)%ElecVelo) - ALLOCATE(AmbipolElecVelo(PositionNbr)%ElecVelo(3)) - AmbipolElecVelo(PositionNbr)%ElecVelo(1:3) = Vec3D(1:3) - END IF - ELSE !PositionNbr .EQ. 0 - CALL abort(__STAMP__,'PositionNbr .EQ. 0!') - END IF !PositionNbr .NE. 0 + Vec3D(1:3) = Vec3D(1:3) + vec_t1(1:3) * ( Velo_t1+Velo1*SQRT(BoltzmannConst*T/Species(DSMC%AmbiDiffElecSpec)%MassIC) ) + Vec3D(1:3) = Vec3D(1:3) + vec_t2(1:3) * ( Velo_t2+Velo2*SQRT(BoltzmannConst*T/Species(DSMC%AmbiDiffElecSpec)%MassIC) ) + IF (ALLOCATED(AmbipolElecVelo(PositionNbr)%ElecVelo)) DEALLOCATE(AmbipolElecVelo(PositionNbr)%ElecVelo) + ALLOCATE(AmbipolElecVelo(PositionNbr)%ElecVelo(3)) + AmbipolElecVelo(PositionNbr)%ElecVelo(1:3) = Vec3D(1:3) END DO !i = ...NbrOfParticle CASE DEFAULT CALL abort(__STAMP__,'ERROR in SurfaceFlux: Wrong velocity distribution!') END SELECT - + END SUBROUTINE AD_SetSFElectronVelo @@ -459,12 +446,13 @@ SUBROUTINE AD_InsertParticles(iPartIndx_Node, nPart, iPartIndx_NodeTotalAmbi, To !> Creating electrons for each actual ion simulation particle, using the stored velocity vector for the electron !=================================================================================================================================== ! MODULES -USE MOD_Globals +USE MOD_Globals USE MOD_DSMC_Vars ,ONLY: BGGas, CollisMode, DSMC, PartStateIntEn, AmbipolElecVelo, RadialWeighting USE MOD_DSMC_Vars ,ONLY: DSMCSumOfFormedParticles, newAmbiParts, iPartIndx_NodeNewAmbi USE MOD_PARTICLE_Vars ,ONLY: PDM, PartSpecies, PartState, PEM, Species, PartMPF, Symmetry, usevMPF USE MOD_PARTICLE_Vars ,ONLY: UseVarTimeStep, PartTimeStep USE MOD_Particle_Tracking ,ONLY: ParticleInsideCheck +USE MOD_Part_Tools ,ONLY: GetNextFreePosition ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -506,12 +494,7 @@ SUBROUTINE AD_InsertParticles(iPartIndx_Node, nPart, iPartIndx_NodeTotalAmbi, To DO iLoop = 1, nNewElectrons DSMCSumOfFormedParticles = DSMCSumOfFormedParticles + 1 - PositionNbr = PDM%nextFreePosition(DSMCSumOfFormedParticles+PDM%CurrentNextFreePosition) - IF (PositionNbr.EQ.0) THEN - CALL Abort(& -__STAMP__& -,'ERROR in Ambipolar Diffusion: MaxParticleNumber too small!') - END IF + PositionNbr = GetNextFreePosition() InsideFlag=.FALSE. iElem = PEM%GlobalElemID(iPartIndx_Node(1)) DO WHILE(.NOT.InsideFlag) @@ -633,7 +616,7 @@ SUBROUTINE AD_DeleteParticles(iPartIndx_Node, nPart_opt) DO iLoop = 1, nElectron IF (ALLOCATED(AmbipolElecVelo(IonIndX(iLoop))%ElecVelo)) DEALLOCATE(AmbipolElecVelo(IonIndX(iLoop))%ElecVelo) ALLOCATE(AmbipolElecVelo(IonIndX(iLoop))%ElecVelo(3)) - AmbipolElecVelo(IonIndX(iLoop))%ElecVelo(1:3) = PartState(4:6,ElecIndx(iLoop)) + AmbipolElecVelo(IonIndX(iLoop))%ElecVelo(1:3) = PartState(4:6,ElecIndx(iLoop)) PDM%ParticleInside(ElecIndx(iLoop)) = .FALSE. END DO diff --git a/src/particles/dsmc/dsmc_bg_gas.f90 b/src/particles/dsmc/dsmc_bg_gas.f90 index dcbddbd00..dfb1023d4 100644 --- a/src/particles/dsmc/dsmc_bg_gas.f90 +++ b/src/particles/dsmc/dsmc_bg_gas.f90 @@ -223,6 +223,7 @@ SUBROUTINE BGGas_InsertParticles() USE MOD_Globals ,ONLY: Abort USE MOD_DSMC_Vars ,ONLY: BGGas USE MOD_PARTICLE_Vars ,ONLY: PDM, PartSpecies, PEM +USE MOD_Part_Tools ,ONLY: GetNextFreePosition #if USE_LOADBALANCE USE MOD_LoadBalance_Timers ,ONLY: LBStartTime,LBPauseTime #endif /*USE_LOADBALANCE*/ @@ -255,10 +256,7 @@ SUBROUTINE BGGas_InsertParticles() END IF ! Get a free particle index iNewPart = iNewPart + 1 - PositionNbr = PDM%nextFreePosition(iNewPart+PDM%CurrentNextFreePosition) - IF (PositionNbr.EQ.0) THEN - CALL Abort(__STAMP__,'ERROR in BGGas: MaxParticleNumber should be increased to account for the BGG particles!') - END IF + PositionNbr = GetNextFreePosition() ! Get the background gas species iSpec = BGGas_GetSpecies(PEM%LocalElemID(iPart)) ! Assign particle properties @@ -272,9 +270,6 @@ SUBROUTINE BGGas_InsertParticles() PEM%pNumber(LocalElemID) = PEM%pNumber(LocalElemID) + 1 END IF END DO -! Increase the particle vector length and update the linked list -PDM%ParticleVecLength = MAX(PDM%ParticleVecLength,PositionNbr) -PDM%CurrentNextFreePosition = PDM%CurrentNextFreePosition + iNewPart #if USE_LOADBALANCE CALL LBPauseTime(LB_DSMC,tLBStart) @@ -775,7 +770,7 @@ SUBROUTINE BGGas_PhotoIonization(iSpec,iInit,TotalNbrOfReactions) END DO ! Add the particles initialized through the emission and the background particles -PDM%ParticleVecLength = PDM%ParticleVecLength + NbrOfParticle + iNewPart +PDM%ParticleVecLength = MIN(PDM%maxParticleNumber,PDM%ParticleVecLength + NbrOfParticle + iNewPart) ! Update the current next free position PDM%CurrentNextFreePosition = PDM%CurrentNextFreePosition + NbrOfParticle + iNewPart @@ -817,7 +812,7 @@ SUBROUTINE BGGas_PhotoIonization(iSpec,iInit,TotalNbrOfReactions) END IF ! NbrOfPhotonXsecReactions.GT.0 ! Advance particle vector length and the current next free position with newly created particles -PDM%ParticleVecLength = PDM%ParticleVecLength + DSMCSumOfFormedParticles +PDM%ParticleVecLength = MIN(PDM%maxParticleNumber,PDM%ParticleVecLength + DSMCSumOfFormedParticles) PDM%CurrentNextFreePosition = PDM%CurrentNextFreePosition + DSMCSumOfFormedParticles DSMCSumOfFormedParticles = 0 @@ -915,7 +910,8 @@ SUBROUTINE BGGas_TraceSpeciesSplit(iElem, nPart, nPair) USE MOD_Globals USE MOD_DSMC_Vars ,ONLY: BGGas, CollisMode, PartStateIntEn, DSMC USE MOD_DSMC_Vars ,ONLY: DSMC, SpecDSMC, VibQuantsPar, PolyatomMolDSMC -USE MOD_Particle_Vars ,ONLY: PDM,PEM,PartSpecies,PartState,PartMPF,Species +USE MOD_Particle_Vars ,ONLY: PEM,PartSpecies,PartState,PartMPF,Species +USE MOD_Part_Tools ,ONLY: GetNextFreePosition ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -964,10 +960,7 @@ SUBROUTINE BGGas_TraceSpeciesSplit(iElem, nPart, nPair) ! --- Create clone of test particle iNewPart = iNewPart + 1 iSplitPart = iSplitPart + 1 - PartIndex = PDM%nextFreePosition(iNewPart+PDM%CurrentNextFreePosition) - IF (PartIndex.EQ.0) THEN - CALL Abort(__STAMP__,'ERROR in BGGas: MaxParticleNumber should be increased to account for the BGG particles!') - END IF + PartIndex = GetNextFreePosition() ! Assign properties but do not use the velocity and energy of the background gas CALL BGGas_AssignParticleProperties(iSpec,iPart,PartIndex,GetVelocity_opt=.FALSE.,GetInternalEnergy_opt=.TRUE.) ! Copy properties from the particle species @@ -990,10 +983,7 @@ SUBROUTINE BGGas_TraceSpeciesSplit(iElem, nPart, nPair) iNewPart = iNewPart + 1 iSplitPart = iSplitPart + 1 ! Get a free particle index - bggPartIndex = PDM%nextFreePosition(iNewPart+PDM%CurrentNextFreePosition) - IF (bggPartIndex.EQ.0) THEN - CALL Abort(__STAMP__,'ERROR in BGGas: MaxParticleNumber should be increased to account for the BGG particles!') - END IF + bggPartIndex = GetNextFreePosition() ! Set the pairing partner BGGas%PairingPartner(PartIndex) = bggPartIndex ! Assign properties of the background gas @@ -1007,9 +997,6 @@ SUBROUTINE BGGas_TraceSpeciesSplit(iElem, nPart, nPair) END IF iPart = PEM%pNext(iPart) END DO -! Increase the particle vector length and the position in the linked list -PDM%ParticleVecLength = MAX(PDM%ParticleVecLength,bggPartIndex) -PDM%CurrentNextFreePosition = PDM%CurrentNextFreePosition + iNewPart ! Set the new number of particles nPart = PEM%pNumber(iElem) @@ -1145,7 +1132,7 @@ END SUBROUTINE BGGas_InitRegions !=================================================================================================================================== -!> Background gas regions: Set the internal temperatures in case of DSMC and CollisMode = 2/3 (not yet available during +!> Background gas regions: Set the internal temperatures in case of DSMC and CollisMode = 2/3 (not yet available during !> BGGas_InitRegions). Loop over all elements, species and inits per species to set values for molecules and/or atoms. !=================================================================================================================================== SUBROUTINE BGGas_RegionsSetInternalTemp() diff --git a/src/particles/dsmc/dsmc_chemical_reactions.f90 b/src/particles/dsmc/dsmc_chemical_reactions.f90 index 642c4b41e..1c4d37ebf 100644 --- a/src/particles/dsmc/dsmc_chemical_reactions.f90 +++ b/src/particles/dsmc/dsmc_chemical_reactions.f90 @@ -365,7 +365,7 @@ SUBROUTINE DSMC_Chemistry(iPair, iReac) USE MOD_DSMC_CollisVec ,ONLY: PostCollVec USE MOD_Particle_Tracking_Vars ,ONLY: TrackingMethod USE MOD_Particle_Analyze_Vars ,ONLY: ChemEnergySum -USE MOD_part_tools ,ONLY: GetParticleWeight +USE MOD_part_tools ,ONLY: GetParticleWeight, GetNextFreePosition USE MOD_part_operations ,ONLY: RemoveParticle #ifdef CODE_ANALYZE USE MOD_Globals ,ONLY: unit_stdout,myrank @@ -511,8 +511,7 @@ SUBROUTINE DSMC_Chemistry(iPair, iReac) IF(ProductReac(3).NE.0) THEN ! === Get free particle index for the 3rd product DSMCSumOfFormedParticles = DSMCSumOfFormedParticles + 1 - ReactInx(3) = PDM%nextFreePosition(DSMCSumOfFormedParticles+PDM%CurrentNextFreePosition) - IF (ReactInx(3).EQ.0) CALL abort(__STAMP__,'New Particle Number greater max Part Num in DSMC_Chemistry. Reaction: ',iReac) + ReactInx(3) = GetNextFreePosition() PDM%ParticleInside(ReactInx(3)) = .true. PDM%IsNewPart(ReactInx(3)) = .true. PDM%dtFracPush(ReactInx(3)) = .FALSE. @@ -551,8 +550,7 @@ SUBROUTINE DSMC_Chemistry(iPair, iReac) IF(ProductReac(4).NE.0) THEN ! === Get free particle index for the 4th product DSMCSumOfFormedParticles = DSMCSumOfFormedParticles + 1 - ReactInx(4) = PDM%nextFreePosition(DSMCSumOfFormedParticles+PDM%CurrentNextFreePosition) - IF (ReactInx(4).EQ.0) CALL abort(__STAMP__,'New Particle Number greater max Part Num in DSMC_Chemistry. Reaction: ',iReac) + ReactInx(4) = GetNextFreePosition() PDM%ParticleInside(ReactInx(4)) = .true. PDM%IsNewPart(ReactInx(4)) = .true. PDM%dtFracPush(ReactInx(4)) = .FALSE. @@ -1584,6 +1582,7 @@ SUBROUTINE PhotoIonization_InsertProducts(iPair, iReac, iInit, InitSpec, iLineOp USE MOD_Particle_Tracking_Vars ,ONLY: TrackingMethod USE MOD_Particle_Analyze_Vars ,ONLY: ChemEnergySum USE MOD_part_tools ,ONLY: GetParticleWeight, DiceUnitVector, CalcERot_particle, CalcEVib_particle, CalcEElec_particle +USE MOD_Part_Tools ,ONLY: GetNextFreePosition USE MOD_part_emission_tools ,ONLY: CalcVelocity_maxwell_lpn USE MOD_Particle_Analyze_Vars ,ONLY: CalcPartBalance,nPartIn,PartEkinIn USE MOD_Particle_Analyze_Tools ,ONLY: CalcEkinPart @@ -1649,8 +1648,7 @@ SUBROUTINE PhotoIonization_InsertProducts(iPair, iReac, iInit, InitSpec, iLineOp IF(ProductReac(3).NE.0) THEN ! === Get free particle index for the 3rd product DSMCSumOfFormedParticles = DSMCSumOfFormedParticles + 1 - ReactInx(3) = PDM%nextFreePosition(DSMCSumOfFormedParticles+PDM%CurrentNextFreePosition) - IF (ReactInx(3).EQ.0) CALL abort(__STAMP__,'New Particle Number greater max Part Num in DSMC_Chemistry. Reaction: ',iReac) + ReactInx(3) = GetNextFreePosition() PDM%ParticleInside(ReactInx(3)) = .true. PDM%IsNewPart(ReactInx(3)) = .true. PDM%dtFracPush(ReactInx(3)) = .FALSE. @@ -1680,8 +1678,7 @@ SUBROUTINE PhotoIonization_InsertProducts(iPair, iReac, iInit, InitSpec, iLineOp IF(ProductReac(4).NE.0) THEN ! === Get free particle index for the 4th product DSMCSumOfFormedParticles = DSMCSumOfFormedParticles + 1 - ReactInx(4) = PDM%nextFreePosition(DSMCSumOfFormedParticles+PDM%CurrentNextFreePosition) - IF (ReactInx(4).EQ.0) CALL abort(__STAMP__,'New Particle Number greater max Part Num in DSMC_Chemistry. Reaction: ',iReac) + ReactInx(4) = GetNextFreePosition() PDM%ParticleInside(ReactInx(4)) = .true. PDM%IsNewPart(ReactInx(4)) = .true. PDM%dtFracPush(ReactInx(4)) = .FALSE. diff --git a/src/particles/dsmc/dsmc_main.f90 b/src/particles/dsmc/dsmc_main.f90 index df02ce165..700c31708 100644 --- a/src/particles/dsmc/dsmc_main.f90 +++ b/src/particles/dsmc/dsmc_main.f90 @@ -128,7 +128,7 @@ SUBROUTINE DSMC_main(DoElement) END DO ! iElem Loop ! Advance particle vector length and the current next free position with newly created particles -PDM%ParticleVecLength = PDM%ParticleVecLength + DSMCSumOfFormedParticles +PDM%ParticleVecLength = MIN(PDM%maxParticleNumber,PDM%ParticleVecLength + DSMCSumOfFormedParticles) PDM%CurrentNextFreePosition = PDM%CurrentNextFreePosition + DSMCSumOfFormedParticles IF(PDM%ParticleVecLength.GT.PDM%MaxParticleNumber) THEN diff --git a/src/particles/dsmc/dsmc_symmetry.f90 b/src/particles/dsmc/dsmc_symmetry.f90 index 8a68d896d..2aa125fd5 100644 --- a/src/particles/dsmc/dsmc_symmetry.f90 +++ b/src/particles/dsmc/dsmc_symmetry.f90 @@ -574,6 +574,7 @@ SUBROUTINE DSMC_2D_SetInClones() USE MOD_Particle_TimeStep ,ONLY: GetParticleTimeStep USE MOD_TimeDisc_Vars ,ONLY: iter USE MOD_Particle_Analyze_Vars ,ONLY: CalcPartBalance, nPartIn +USE MOD_Part_Tools ,ONLY: GetNextFreePosition ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -614,14 +615,7 @@ SUBROUTINE DSMC_2D_SetInClones() ! 2.) Insert the clones at the position they were created DO iPart = 1, RadialWeighting%ClonePartNum(DelayCounter) - PDM%ParticleVecLength = PDM%ParticleVecLength + 1 - PDM%CurrentNextFreePosition = PDM%CurrentNextFreePosition + 1 - PositionNbr = PDM%nextFreePosition(PDM%CurrentNextFreePosition) - IF (PDM%ParticleVecLength.GT.PDM%maxParticleNumber) THEN - CALL Abort(& - __STAMP__,& - 'ERROR in 2D axisymmetric simulation: New Particle Number greater max Part Num!') - END IF + PositionNbr = GetNextFreePosition() ! Copy particle parameters PDM%ParticleInside(PositionNbr) = .TRUE. PDM%IsNewPart(PositionNbr) = .TRUE. diff --git a/src/particles/emission/particle_br_electron_fluid.f90 b/src/particles/emission/particle_br_electron_fluid.f90 index df94d3872..80e45b4da 100644 --- a/src/particles/emission/particle_br_electron_fluid.f90 +++ b/src/particles/emission/particle_br_electron_fluid.f90 @@ -920,7 +920,7 @@ SUBROUTINE CreateElectronsFromBRFluid(CreateFromRestartFile) USE MOD_Particle_Mesh_Vars ,ONLY: ElemVolume_Shared USE MOD_HDG_Vars ,ONLY: ElemToBRRegion,RegionElectronRef USE MOD_Mesh_Tools ,ONLY: GetCNElemID -USE MOD_Part_Tools ,ONLY: UpdateNextFreePosition +USE MOD_Part_Tools ,ONLY: UpdateNextFreePosition, GetNextFreePosition USE MOD_TimeDisc_Vars ,ONLY: time !----------------------------------------------------------------------------------------------------------------------------------! IMPLICIT NONE @@ -1022,13 +1022,7 @@ SUBROUTINE CreateElectronsFromBRFluid(CreateFromRestartFile) DO iPart=1,ElemCharge BRNbrOfElectronsCreated = BRNbrOfElectronsCreated + 1 - ! Set the next free position in the particle vector list - PDM%CurrentNextFreePosition = PDM%CurrentNextFreePosition + 1 - ParticleIndexNbr = PDM%nextFreePosition(PDM%CurrentNextFreePosition) - IF (ParticleIndexNbr.EQ.0) THEN - CALL abort(__STAMP__,'ERROR in CreateElectronsFromBRFluid(): New Particle Number greater max Part Num!') - END IF - PDM%ParticleVecLength = PDM%ParticleVecLength + 1 + ParticleIndexNbr = GetNextFreePosition() !Set new SpeciesID of new particle (electron) PDM%ParticleInside(ParticleIndexNbr) = .TRUE. diff --git a/src/particles/emission/particle_emission.f90 b/src/particles/emission/particle_emission.f90 index 9d19810ca..e9823ec26 100644 --- a/src/particles/emission/particle_emission.f90 +++ b/src/particles/emission/particle_emission.f90 @@ -42,7 +42,7 @@ SUBROUTINE ParticleInserting() USE MOD_Timedisc_Vars ,ONLY: RKdtFrac,RKdtFracTotal USE MOD_Particle_Vars USE MOD_PIC_Vars -USE MOD_part_tools ,ONLY: UpdateNextFreePosition +USE MOD_part_tools ,ONLY: UpdateNextFreePosition, GetNextFreePosition USE MOD_DSMC_Vars ,ONLY: useDSMC, CollisMode, SpecDSMC USE MOD_part_emission_tools ,ONLY: DSMC_SetInternalEnr_LauxVFD USE MOD_DSMC_PolyAtomicModel ,ONLY: DSMC_SetInternalEnr_Poly @@ -333,13 +333,11 @@ SUBROUTINE ParticleInserting() IF (useDSMC.AND.(CollisMode.GT.1)) THEN iPart = 1 DO WHILE (iPart.LE.NbrOfParticle) - PositionNbr = PDM%nextFreePosition(iPart+PDM%CurrentNextFreePosition) - IF (PositionNbr.NE.0) THEN - IF (SpecDSMC(i)%PolyatomicMol) THEN - CALL DSMC_SetInternalEnr_Poly(i,iInit,PositionNbr,1) - ELSE - CALL DSMC_SetInternalEnr_LauxVFD(i,iInit,PositionNbr,1) - END IF + PositionNbr = GetNextFreePosition(iPart) + IF (SpecDSMC(i)%PolyatomicMol) THEN + CALL DSMC_SetInternalEnr_Poly(i,iInit,PositionNbr,1) + ELSE + CALL DSMC_SetInternalEnr_LauxVFD(i,iInit,PositionNbr,1) END IF iPart = iPart + 1 END DO @@ -348,13 +346,13 @@ SUBROUTINE ParticleInserting() IF(CalcPartBalance.AND.(NbrOfParticle.GT.0)) THEN nPartIn(i)=nPartIn(i) + NbrOfparticle DO iPart=1,NbrOfParticle - PositionNbr = PDM%nextFreePosition(iPart+PDM%CurrentNextFreePosition) - IF (PositionNbr .NE. 0) PartEkinIn(i) = PartEkinIn(i) + CalcEkinPart(PositionNbr) + PositionNbr = GetNextFreePosition(iPart) + PartEkinIn(i) = PartEkinIn(i) + CalcEkinPart(PositionNbr) END DO ! iPart END IF ! CalcPartBalance ! Update the current next free position and increase the particle vector length PDM%CurrentNextFreePosition = PDM%CurrentNextFreePosition + NbrOfParticle - PDM%ParticleVecLength = PDM%ParticleVecLength + NbrOfParticle + PDM%ParticleVecLength = MIN(PDM%maxParticleNumber,PDM%ParticleVecLength + NbrOfParticle) ! Complete check if all particles were emitted successfully #if USE_MPI diff --git a/src/particles/emission/particle_emission_init.f90 b/src/particles/emission/particle_emission_init.f90 index d313c071a..cb8ba2cc5 100644 --- a/src/particles/emission/particle_emission_init.f90 +++ b/src/particles/emission/particle_emission_init.f90 @@ -448,9 +448,10 @@ SUBROUTINE InitialParticleInserting() USE MOD_Part_Emission_Tools ,ONLY: SetParticleChargeAndMass,SetParticleMPF,SetParticleTimeStep USE MOD_Part_Pos_and_Velo ,ONLY: SetParticlePosition,SetParticleVelocity,SetPartPosAndVeloEmissionDistribution USE MOD_DSMC_AmbipolarDiffusion ,ONLY: AD_SetInitElectronVelo -USE MOD_Part_Tools ,ONLY: UpdateNextFreePosition +USE MOD_Part_Tools ,ONLY: UpdateNextFreePosition, IncreaseMaxParticleNumber USE MOD_Particle_Vars ,ONLY: Species,nSpecies,PDM,PEM, usevMPF, SpecReset, UseVarTimeStep USE MOD_Restart_Vars ,ONLY: DoRestart +USE MOD_Part_Tools ,ONLY: GetNextFreePosition #if USE_LOADBALANCE USE MOD_LoadBalance_Vars ,ONLY: PerformLoadBalance #endif /*USE_LOADBALANCE*/ @@ -498,7 +499,7 @@ SUBROUTINE InitialParticleInserting() IF (useDSMC) THEN IF (DSMC%DoAmbipolarDiff) CALL AD_SetInitElectronVelo(iSpec,iInit,NbrOfParticle) DO iPart = 1, NbrOfParticle - PositionNbr = PDM%nextFreePosition(iPart+PDM%CurrentNextFreePosition) + PositionNbr = GetNextFreePosition(iPart) IF (PositionNbr .NE. 0) THEN PDM%PartInit(PositionNbr) = iInit ELSE @@ -507,7 +508,7 @@ SUBROUTINE InitialParticleInserting() END DO END IF ! Add new particles to particle vector length - PDM%ParticleVecLength = PDM%ParticleVecLength + NbrOfParticle + PDM%ParticleVecLength = MIN(PDM%maxParticleNumber,PDM%ParticleVecLength + NbrOfParticle) ! Update CALL UpdateNextFreePosition() END IF ! Species(iSpec)%Init(iInit)%ParticleEmissionType.EQ.0 @@ -530,6 +531,7 @@ SUBROUTINE InitialParticleInserting() END DO END IF END IF +CALL IncreaseMaxParticleNumber() LBWRITE(UNIT_stdOut,'(A)') ' INITIAL PARTICLE INSERTING DONE!' @@ -752,7 +754,7 @@ SUBROUTINE DetermineInitialParticleNumber() USE MOD_Globals_Vars ,ONLY: PI USE MOD_DSMC_Vars ,ONLY: RadialWeighting, DSMC USE MOD_Particle_Mesh_Vars ,ONLY: LocalVolume -USE MOD_Particle_Vars ,ONLY: PDM,Species,nSpecies,SpecReset,Symmetry +USE MOD_Particle_Vars ,ONLY: Species,nSpecies,SpecReset,Symmetry USE MOD_ReadInTools USE MOD_Restart_Vars ,ONLY: DoRestart ! IMPLICIT VARIABLE HANDLING @@ -838,14 +840,6 @@ SUBROUTINE DetermineInitialParticleNumber() END DO ! iInit = 1, Species(iSpec)%NumberOfInits END DO ! iSpec=1,nSpecies -IF(.NOT.RadialWeighting%DoRadialWeighting) THEN - IF (insertParticles.GT.PDM%maxParticleNumber) THEN - IPWRITE(UNIT_stdOut,*)' Maximum particle number : ',PDM%maxParticleNumber - IPWRITE(UNIT_stdOut,*)' To be inserted particles: ',INT(insertParticles,4) - CALL abort(__STAMP__,'Number of to be inserted particles per init-proc exceeds max. particle number! ') - END IF -END IF - END SUBROUTINE DetermineInitialParticleNumber diff --git a/src/particles/emission/particle_emission_tools.f90 b/src/particles/emission/particle_emission_tools.f90 index f73b56709..aad3bc87f 100644 --- a/src/particles/emission/particle_emission_tools.f90 +++ b/src/particles/emission/particle_emission_tools.f90 @@ -210,8 +210,9 @@ SUBROUTINE SetParticleTimeStep(NbrOfParticle) !> the particle vector, loops over the total number of particles and the indices in the nextFreePosition array. !=================================================================================================================================== ! MODULES -USE MOD_Particle_Vars ,ONLY: PDM, PartTimeStep, PEM, PartState +USE MOD_Particle_Vars ,ONLY: PartTimeStep, PEM, PartState USE MOD_Particle_TimeStep ,ONLY: GetParticleTimeStep +USE MOD_Part_Tools ,ONLY: GetNextFreePosition !---------------------------------------------------------------------------------------------------------------------------------- ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -225,7 +226,7 @@ SUBROUTINE SetParticleTimeStep(NbrOfParticle) INTEGER :: iPart, PositionNbr !=================================================================================================================================== DO iPart=1, NbrOfParticle - PositionNbr = PDM%nextFreePosition(iPart+PDM%CurrentNextFreePosition) + PositionNbr = GetNextFreePosition(iPart) PartTimeStep(PositionNbr) = GetParticleTimeStep(PartState(1,PositionNbr), PartState(2,PositionNbr),PEM%LocalElemID(PositionNbr)) END DO @@ -238,7 +239,8 @@ SUBROUTINE SetParticleChargeAndMass(FractNbr,NbrOfParticle) !=================================================================================================================================== ! MODULES USE MOD_Globals -USE MOD_Particle_Vars, ONLY : PDM, PartSpecies +USE MOD_Particle_Vars ,ONLY: PartSpecies +USE MOD_Part_Tools ,ONLY: GetNextFreePosition !---------------------------------------------------------------------------------------------------------------------------------- ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -250,15 +252,11 @@ SUBROUTINE SetParticleChargeAndMass(FractNbr,NbrOfParticle) INTEGER,INTENT(INOUT) :: NbrOfParticle !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -INTEGER :: i,PositionNbr +INTEGER :: iPart,PositionNbr !=================================================================================================================================== -DO i=1, NbrOfParticle - PositionNbr = PDM%nextFreePosition(i+PDM%CurrentNextFreePosition) - IF (PositionNbr .NE. 0) THEN - PartSpecies(PositionNbr) = FractNbr - ELSE - CALL abort(__STAMP__,'ERROR in SetParticlePosition:ParticleIndexNbr.EQ.0 - maximum nbr of particles reached?') - END IF +DO iPart=1, NbrOfParticle + PositionNbr = GetNextFreePosition(iPart) + PartSpecies(PositionNbr) = FractNbr END DO END SUBROUTINE SetParticleChargeAndMass @@ -270,9 +268,9 @@ SUBROUTINE SetParticleMPF(FractNbr,iInit,NbrOfParticle) !=================================================================================================================================== ! MODULES USE MOD_Globals -USE MOD_Particle_Vars ,ONLY: PDM, PartMPF, Species, PartState +USE MOD_Particle_Vars ,ONLY: PartMPF, Species, PartState USE MOD_DSMC_Vars ,ONLY: RadialWeighting -USE MOD_part_tools ,ONLY: CalcRadWeightMPF +USE MOD_part_tools ,ONLY: CalcRadWeightMPF, GetNextFreePosition !=================================================================================================================================== ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -285,25 +283,19 @@ SUBROUTINE SetParticleMPF(FractNbr,iInit,NbrOfParticle) INTEGER,INTENT(INOUT) :: NbrOfParticle !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -INTEGER :: i,PositionNbr -!=================================================================================================================================== -i = 1 -DO WHILE (i .le. NbrOfParticle) - PositionNbr = PDM%nextFreePosition(i+PDM%CurrentNextFreePosition) - IF (PositionNbr .NE. 0) THEN - IF(RadialWeighting%DoRadialWeighting) THEN - PartMPF(PositionNbr) = CalcRadWeightMPF(PartState(2,PositionNbr),FractNbr,PositionNbr) - ELSE - IF(iInit.EQ.-1)THEN - PartMPF(PositionNbr) = Species(FractNbr)%MacroParticleFactor - ELSE - PartMPF(PositionNbr) = Species(FractNbr)%Init(iInit)%MacroParticleFactor ! Use emission-specific MPF (default is species MPF) - END IF ! iInit.EQ.-1 - END IF +INTEGER :: iPart,PositionNbr +!=================================================================================================================================== +DO iPart=1,NbrOfParticle + PositionNbr = GetNextFreePosition(iPart) + IF(RadialWeighting%DoRadialWeighting) THEN + PartMPF(PositionNbr) = CalcRadWeightMPF(PartState(2,PositionNbr),FractNbr,PositionNbr) ELSE - CALL abort(__STAMP__,'ERROR in SetParticlePosition:ParticleIndexNbr.EQ.0 - maximum nbr of particles reached?') + IF(iInit.EQ.-1)THEN + PartMPF(PositionNbr) = Species(FractNbr)%MacroParticleFactor + ELSE + PartMPF(PositionNbr) = Species(FractNbr)%Init(iInit)%MacroParticleFactor ! Use emission-specific MPF (default is species MPF) + END IF ! iInit.EQ.-1 END IF - i = i + 1 END DO END SUBROUTINE SetParticleMPF @@ -919,6 +911,7 @@ SUBROUTINE SetCellLocalParticlePosition(chunkSize,iSpec,iInit,UseExactPartNum) USE MOD_Particle_Tracking ,ONLY: ParticleInsideCheck USE MOD_Particle_Vars ,ONLY: Species, PDM, PartState, PEM, Symmetry, UseVarTimeStep, PartTimeStep, PartMPF USE MOD_Particle_TimeStep ,ONLY: GetParticleTimeStep +USE MOD_Part_Tools ,ONLY: IncreaseMaxParticleNumber, GetNextFreePosition ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -944,9 +937,7 @@ SUBROUTINE SetCellLocalParticlePosition(chunkSize,iSpec,iInit,UseExactPartNum) INTEGER :: CNElemID !----------------------------------------------------------------------------------------------------------------------------------- IF (UseExactPartNum) THEN - IF(chunkSize.GE.PDM%maxParticleNumber) THEN - CALL abort(__STAMP__,'SetCellLocalParticlePosition: Maximum particle number reached! max. particles needed: ',chunksize) - END IF + CALL IncreaseMaxParticleNumber(chunkSize) CellChunkSize(:)=0 ASSOCIATE( start => GetCNElemID(1+offsetElem),& end => GetCNElemID(nElems+offsetElem)) @@ -956,11 +947,7 @@ SUBROUTINE SetCellLocalParticlePosition(chunkSize,iSpec,iInit,UseExactPartNum) PartDens = Species(iSpec)%Init(iInit)%PartDensity / Species(iSpec)%MacroParticleFactor ! numerical Partdensity is needed IF(RadialWeighting%DoRadialWeighting) PartDens = PartDens * 2. / (RadialWeighting%PartScaleFactor) chunkSize_tmp = INT(PartDens * LocalVolume) - IF(chunkSize_tmp.GE.PDM%maxParticleNumber) THEN - CALL abort(__STAMP__,& - 'ERROR in SetCellLocalParticlePosition: Maximum particle number during sanity check! max. particles needed: ',& - IntInfoOpt=chunkSize_tmp) - END IF + CALL IncreaseMaxParticleNumber(chunkSize_tmp) END IF ichunkSize = 1 @@ -984,42 +971,33 @@ SUBROUTINE SetCellLocalParticlePosition(chunkSize,iSpec,iInit,UseExactPartNum) END IF END IF DO iPart = 1, nPart - ParticleIndexNbr = PDM%nextFreePosition(iChunksize + PDM%CurrentNextFreePosition) - IF (ParticleIndexNbr .ne. 0) THEN - InsideFlag=.FALSE. - DO WHILE(.NOT.InsideFlag) - CALL RANDOM_NUMBER(RandomPos) - IF(Symmetry%Axisymmetric.AND.(.NOT.RadialWeighting%DoRadialWeighting)) THEN - ! Treatment of axisymmetry without weighting - RandomPos(1) = Bounds(1,1) + RandomPos(1)*(Bounds(2,1)-Bounds(1,1)) - RandomPos(2) = SQRT(RandomPos(2)*(Bounds(2,2)**2-Bounds(1,2)**2)+Bounds(1,2)**2) - ELSE - RandomPos = Bounds(1,:) + RandomPos*(Bounds(2,:)-Bounds(1,:)) - END IF - IF(Symmetry%Order.LE.2) RandomPos(3) = 0. - IF(Symmetry%Order.LE.1) RandomPos(2) = 0. - InsideFlag = ParticleInsideCheck(RandomPos,iPart,iGlobalElem) - END DO - PartState(1:3,ParticleIndexNbr) = RandomPos(1:3) - PDM%ParticleInside(ParticleIndexNbr) = .TRUE. - PDM%IsNewPart(ParticleIndexNbr)=.TRUE. - PDM%dtFracPush(ParticleIndexNbr) = .FALSE. - PEM%GlobalElemID(ParticleIndexNbr) = iGlobalElem - ichunkSize = ichunkSize + 1 - IF (UseVarTimeStep) THEN - PartTimeStep(ParticleIndexNbr) = & - GetParticleTimeStep(PartState(1,ParticleIndexNbr), PartState(2,ParticleIndexNbr),iElem) - END IF - IF(RadialWeighting%DoRadialWeighting) THEN - PartMPF(ParticleIndexNbr) = CalcRadWeightMPF(PartState(2,ParticleIndexNbr),iSpec,ParticleIndexNbr) + ParticleIndexNbr = GetNextFreePosition(ichunkSize) + InsideFlag=.FALSE. + DO WHILE(.NOT.InsideFlag) + CALL RANDOM_NUMBER(RandomPos) + IF(Symmetry%Axisymmetric.AND.(.NOT.RadialWeighting%DoRadialWeighting)) THEN + ! Treatment of axisymmetry without weighting + RandomPos(1) = Bounds(1,1) + RandomPos(1)*(Bounds(2,1)-Bounds(1,1)) + RandomPos(2) = SQRT(RandomPos(2)*(Bounds(2,2)**2-Bounds(1,2)**2)+Bounds(1,2)**2) + ELSE + RandomPos = Bounds(1,:) + RandomPos*(Bounds(2,:)-Bounds(1,:)) END IF - ELSE - WRITE(UNIT_stdOut,*) "" - IPWRITE(UNIT_stdOut,*) "ERROR:" - IPWRITE(UNIT_stdOut,*) " iPart :", iPart - IPWRITE(UNIT_stdOut,*) "PDM%maxParticleNumber :", PDM%maxParticleNumber - CALL abort(__STAMP__& - ,'ERROR in SetCellLocalParticlePosition: Maximum particle number reached during inserting! --> ParticleIndexNbr.EQ.0') + IF(Symmetry%Order.LE.2) RandomPos(3) = 0. + IF(Symmetry%Order.LE.1) RandomPos(2) = 0. + InsideFlag = ParticleInsideCheck(RandomPos,iPart,iGlobalElem) + END DO + PartState(1:3,ParticleIndexNbr) = RandomPos(1:3) + PDM%ParticleInside(ParticleIndexNbr) = .TRUE. + PDM%IsNewPart(ParticleIndexNbr)=.TRUE. + PDM%dtFracPush(ParticleIndexNbr) = .FALSE. + PEM%GlobalElemID(ParticleIndexNbr) = iGlobalElem + ichunkSize = ichunkSize + 1 + IF (UseVarTimeStep) THEN + PartTimeStep(ParticleIndexNbr) = & + GetParticleTimeStep(PartState(1,ParticleIndexNbr), PartState(2,ParticleIndexNbr),iElem) + END IF + IF(RadialWeighting%DoRadialWeighting) THEN + PartMPF(ParticleIndexNbr) = CalcRadWeightMPF(PartState(2,ParticleIndexNbr),iSpec,ParticleIndexNbr) END IF END DO END ASSOCIATE @@ -1372,10 +1350,6 @@ SUBROUTINE SetParticlePositionCuboidCylinder(FractNbr,iInit,chunkSize,particle_p IF(Species(FractNbr)%MacroParticleFactor/RadWeightMPF.LT.iRan) THEN i=i+1 CYCLE - ELSE IF(chunkSize2.GT.PDM%maxParticleNumber) THEN - IPWRITE(UNIT_stdOut,*)'Inserted percentage of particles',REAL(i)/REAL(chunkSize)*100 - CALL CollectiveStop(__STAMP__,& - 'Number of to be inserted particles per init-proc exceeds max. particle number! ') END IF END IF END IF @@ -1434,10 +1408,6 @@ SUBROUTINE SetParticlePositionSphere(FractNbr,iInit,chunkSize,particle_positions IF(Species(FractNbr)%MacroParticleFactor/RadWeightMPF.LT.iRan) THEN i=i+1 CYCLE - ELSE IF(chunkSize2.GT.PDM%maxParticleNumber) THEN - IPWRITE(UNIT_stdOut,*)'Inserted percentage of particles',REAL(i)/REAL(chunkSize)*100 - CALL CollectiveStop(__STAMP__,& - 'Number of to be inserted particles per init-proc exceeds max. particle number! ') END IF END IF END IF @@ -2323,7 +2293,7 @@ SUBROUTINE SetParticlePositionLiu2010SzaboNeutralization(chunkSize,particle_posi ! Count number of emitted particles to compare with chunkSize later on emittedParticles = emittedParticles + 1 ! Emit at random position in element (assume tri-linear element geometry, if position is outside discard the position) - ASSOCIATE( Bounds => BoundsOfElem_Shared(1:2,1:3,GlobalElemID) ) ! 1-2: Min, Max value; 1-3: x,y,z + ASSOCIATE( Bounds => BoundsOfElem_Shared(1:2,1:3,GlobalElemID) ) ! 1-2: Min, Max value; 1-3: x,y,z InsideFlag = .FALSE. DO WHILE(.NOT.InsideFlag) CALL RANDOM_NUMBER(RandomPos) diff --git a/src/particles/emission/particle_macroscopic_restart.f90 b/src/particles/emission/particle_macroscopic_restart.f90 index 4830fc115..e28db82c2 100644 --- a/src/particles/emission/particle_macroscopic_restart.f90 +++ b/src/particles/emission/particle_macroscopic_restart.f90 @@ -38,12 +38,12 @@ SUBROUTINE MacroRestart_InsertParticles() USE MOD_Globals USE MOD_Globals_Vars ,ONLY: Pi USE MOD_DSMC_Vars ,ONLY: RadialWeighting, DSMC -USE MOD_part_tools ,ONLY: CalcRadWeightMPF,InitializeParticleMaxwell +USE MOD_part_tools ,ONLY: CalcRadWeightMPF,InitializeParticleMaxwell, IncreaseMaxParticleNumber USE MOD_Mesh_Vars ,ONLY: nElems,offsetElem USE MOD_Particle_TimeStep ,ONLY: GetParticleTimeStep USE MOD_Particle_Vars ,ONLY: Species, PDM, nSpecies, PartState, Symmetry, UseVarTimeStep USE MOD_Restart_Vars ,ONLY: MacroRestartValues -USE MOD_Particle_Mesh_Vars ,ONLY: ElemVolume_Shared,BoundsOfElem_Shared +USE MOD_Particle_Mesh_Vars ,ONLY: ElemVolume_Shared,BoundsOfElem_Shared, ElemMidPoint_Shared USE MOD_Particle_Tracking ,ONLY: ParticleInsideCheck !----------------------------------------------------------------------------------------------------------------------------------- ! IMPLICIT VARIABLE HANDLING @@ -57,7 +57,7 @@ SUBROUTINE MacroRestart_InsertParticles() !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES INTEGER :: iElem,iSpec,iPart,nPart,locnPart,iHeight,yPartitions,GlobalElemID -REAL :: iRan, RandomPos(3), PartDens, TempMPF, MaxPosTemp, MinPosTemp +REAL :: iRan, RandomPos(3), PartDens, MaxPosTemp, MinPosTemp REAL :: TempVol, Volume LOGICAL :: InsideFlag !=================================================================================================================================== @@ -77,26 +77,26 @@ SUBROUTINE MacroRestart_InsertParticles() IF (iSpec.EQ.DSMC%AmbiDiffElecSpec) CYCLE END IF yPartitions = 6 - PartDens = MacroRestartValues(iElem,iSpec,DSMC_NUMDENS) ! Particle weighting DO iHeight = 1, yPartitions MinPosTemp = Bounds(1,2) + (Bounds(2,2) - Bounds(1,2))/ yPartitions *(iHeight-1.) MaxPosTemp = Bounds(1,2) + (Bounds(2,2) - Bounds(1,2))/ yPartitions *iHeight TempVol = (MaxPosTemp-MinPosTemp)*(Bounds(2,1)-Bounds(1,1)) * Pi * (MaxPosTemp+MinPosTemp) - TempMPF = CalcRadWeightMPF((MaxPosTemp+MinPosTemp)*0.5,iSpec) + PartDens = MacroRestartValues(iElem,iSpec,DSMC_NUMDENS) / CalcRadWeightMPF((MaxPosTemp+MinPosTemp)*0.5,iSpec) IF(UseVarTimeStep) THEN - TempMPF = TempMPF * GetParticleTimeStep((Bounds(2,1)+Bounds(1,1))*0.5, (MaxPosTemp+MinPosTemp)*0.5, iElem) + PartDens = PartDens * GetParticleTimeStep((Bounds(2,1)+Bounds(1,1))*0.5, (MaxPosTemp+MinPosTemp)*0.5, iElem) END IF CALL RANDOM_NUMBER(iRan) - nPart = INT(PartDens / TempMPF * TempVol + iRan) + nPart = INT(PartDens * TempVol + iRan) DO iPart = 1, nPart InsideFlag=.FALSE. CALL RANDOM_NUMBER(RandomPos) RandomPos(1) = Bounds(1,1) + RandomPos(1)*(Bounds(2,1)-Bounds(1,1)) RandomPos(2) = MinPosTemp + RandomPos(2)*(MaxPosTemp-MinPosTemp) RandomPos(3) = 0.0 - InsideFlag = ParticleInsideCheck(RandomPos,iPart,GlobalElemID) + InsideFlag = ParticleInsideCheck(RandomPos,1,GlobalElemID) IF (InsideFlag) THEN + IF (locnPart.GT.PDM%maxParticleNumber) CALL IncreaseMaxParticleNumber() PartState(1:3,locnPart) = RandomPos(1:3) CALL InitializeParticleMaxwell(locnPart,iSpec,iElem,Mode=1) locnPart = locnPart + 1 @@ -109,12 +109,13 @@ SUBROUTINE MacroRestart_InsertParticles() IF (DSMC%DoAmbipolarDiff) THEN IF (iSpec.EQ.DSMC%AmbiDiffElecSpec) CYCLE END IF + PartDens = MacroRestartValues(iElem,iSpec,DSMC_NUMDENS) / Species(iSpec)%MacroParticleFactor CALL RANDOM_NUMBER(iRan) - TempMPF = Species(iSpec)%MacroParticleFactor IF(UseVarTimeStep) THEN - TempMPF = TempMPF * GetParticleTimeStep((Bounds(2,1)+Bounds(1,1))*0.5, (Bounds(2,2)+Bounds(1,2))*0.5, iElem) + PartDens = PartDens / GetParticleTimeStep(ElemMidPoint_Shared(1,GlobalElemID), ElemMidPoint_Shared(2,GlobalElemID), iElem) END IF - nPart = INT(MacroRestartValues(iElem,iSpec,DSMC_NUMDENS) / TempMPF * ElemVolume_Shared(GlobalElemID) + iRan) + nPart = INT(PartDens * ElemVolume_Shared(GlobalElemID) + iRan) + CALL IncreaseMaxParticleNumber(nPart) DO iPart = 1, nPart InsideFlag=.FALSE. DO WHILE (.NOT.InsideFlag) @@ -136,23 +137,25 @@ SUBROUTINE MacroRestart_InsertParticles() IF (DSMC%DoAmbipolarDiff) THEN IF (iSpec.EQ.DSMC%AmbiDiffElecSpec) CYCLE END IF + PartDens = MacroRestartValues(iElem,iSpec,DSMC_NUMDENS) / Species(iSpec)%MacroParticleFactor CALL RANDOM_NUMBER(iRan) - TempMPF = Species(iSpec)%MacroParticleFactor IF(UseVarTimeStep) THEN - TempMPF = TempMPF * GetParticleTimeStep((Bounds(2,1)+Bounds(1,1))*0.5, (Bounds(2,2)+Bounds(1,2))*0.5, iElem) + PartDens = PartDens / GetParticleTimeStep(ElemMidPoint_Shared(1,GlobalElemID), ElemMidPoint_Shared(2,GlobalElemID), iElem) END IF - nPart = INT(MacroRestartValues(iElem,iSpec,DSMC_NUMDENS) / TempMPF * Volume + iRan) + nPart = INT(PartDens * ElemVolume_Shared(GlobalElemID) + iRan) + CALL IncreaseMaxParticleNumber(nPart) + DO iPart = 1, nPart InsideFlag=.FALSE. - CALL RANDOM_NUMBER(RandomPos(1:2)) - RandomPos(1:2) = Bounds(1,1:2) + RandomPos(1:2)*(Bounds(2,1:2)-Bounds(1,1:2)) - RandomPos(3) = 0.0 - InsideFlag = ParticleInsideCheck(RandomPos,iPart,GlobalElemID) - IF (InsideFlag) THEN - PartState(1:3,locnPart) = RandomPos(1:3) - CALL InitializeParticleMaxwell(locnPart,iSpec,iElem,Mode=1) - locnPart = locnPart + 1 - END IF + DO WHILE(.NOT.InsideFlag) + CALL RANDOM_NUMBER(RandomPos(1:2)) + RandomPos(1:2) = Bounds(1,1:2) + RandomPos(1:2)*(Bounds(2,1:2)-Bounds(1,1:2)) + RandomPos(3) = 0.0 + InsideFlag = ParticleInsideCheck(RandomPos,iPart,GlobalElemID) + END DO + PartState(1:3,locnPart) = RandomPos(1:3) + CALL InitializeParticleMaxwell(locnPart,iSpec,iElem,Mode=1) + locnPart = locnPart + 1 END DO ! nPart END DO ! nSpecies ELSE IF(Symmetry%Order.EQ.1) THEN @@ -161,24 +164,25 @@ SUBROUTINE MacroRestart_InsertParticles() IF (DSMC%DoAmbipolarDiff) THEN IF (iSpec.EQ.DSMC%AmbiDiffElecSpec) CYCLE END IF + PartDens = MacroRestartValues(iElem,iSpec,DSMC_NUMDENS) / Species(iSpec)%MacroParticleFactor CALL RANDOM_NUMBER(iRan) - TempMPF = Species(iSpec)%MacroParticleFactor IF(UseVarTimeStep) THEN - TempMPF = TempMPF * GetParticleTimeStep((Bounds(2,1)+Bounds(1,1))*0.5, (Bounds(2,2)+Bounds(1,2))*0.5, iElem) + PartDens = PartDens / GetParticleTimeStep(ElemMidPoint_Shared(1,GlobalElemID), ElemMidPoint_Shared(2,GlobalElemID), iElem) END IF - nPart = INT(MacroRestartValues(iElem,iSpec,DSMC_NUMDENS) / TempMPF * Volume + iRan) + nPart = INT(PartDens * ElemVolume_Shared(GlobalElemID) + iRan) + CALL IncreaseMaxParticleNumber(nPart) DO iPart = 1, nPart InsideFlag=.FALSE. - CALL RANDOM_NUMBER(RandomPos(1)) - RandomPos(1:2) = Bounds(1,1) + RandomPos(1)*(Bounds(2,1)-Bounds(1,1)) - RandomPos(2) = 0.0 - RandomPos(3) = 0.0 - InsideFlag = ParticleInsideCheck(RandomPos,iPart,GlobalElemID) - IF (InsideFlag) THEN - PartState(1:3,locnPart) = RandomPos(1:3) - CALL InitializeParticleMaxwell(locnPart,iSpec,iElem,Mode=1) - locnPart = locnPart + 1 - END IF + DO WHILE(.NOT.InsideFlag) + CALL RANDOM_NUMBER(RandomPos(1)) + RandomPos(1:2) = Bounds(1,1) + RandomPos(1)*(Bounds(2,1)-Bounds(1,1)) + RandomPos(2) = 0.0 + RandomPos(3) = 0.0 + InsideFlag = ParticleInsideCheck(RandomPos,iPart,GlobalElemID) + END DO + PartState(1:3,locnPart) = RandomPos(1:3) + CALL InitializeParticleMaxwell(locnPart,iSpec,iElem,Mode=1) + locnPart = locnPart + 1 END DO ! nPart END DO ! nSpecies ELSE @@ -188,22 +192,23 @@ SUBROUTINE MacroRestart_InsertParticles() IF (DSMC%DoAmbipolarDiff) THEN IF (iSpec.EQ.DSMC%AmbiDiffElecSpec) CYCLE END IF + PartDens = MacroRestartValues(iElem,iSpec,DSMC_NUMDENS) / Species(iSpec)%MacroParticleFactor CALL RANDOM_NUMBER(iRan) - TempMPF = Species(iSpec)%MacroParticleFactor IF(UseVarTimeStep) THEN - TempMPF = TempMPF * GetParticleTimeStep(iElem=iElem) + PartDens = PartDens / GetParticleTimeStep(ElemMidPoint_Shared(1,GlobalElemID), ElemMidPoint_Shared(2,GlobalElemID), iElem) END IF - nPart = INT(MacroRestartValues(iElem,iSpec,DSMC_NUMDENS) / TempMPF * Volume + iRan) + nPart = INT(PartDens * ElemVolume_Shared(GlobalElemID) + iRan) + CALL IncreaseMaxParticleNumber(nPart) DO iPart = 1, nPart InsideFlag=.FALSE. - CALL RANDOM_NUMBER(RandomPos) - RandomPos(1:3) = Bounds(1,1:3) + RandomPos(1:3)*(Bounds(2,1:3)-Bounds(1,1:3)) - InsideFlag = ParticleInsideCheck(RandomPos,iPart,GlobalElemID) - IF (InsideFlag) THEN - PartState(1:3,locnPart) = RandomPos(1:3) - CALL InitializeParticleMaxwell(locnPart,iSpec,iElem,Mode=1) - locnPart = locnPart + 1 - END IF + DO WHILE(.NOT.InsideFlag) + CALL RANDOM_NUMBER(RandomPos) + RandomPos(1:3) = Bounds(1,1:3) + RandomPos(1:3)*(Bounds(2,1:3)-Bounds(1,1:3)) + InsideFlag = ParticleInsideCheck(RandomPos,iPart,GlobalElemID) + END DO + PartState(1:3,locnPart) = RandomPos(1:3) + CALL InitializeParticleMaxwell(locnPart,iSpec,iElem,Mode=1) + locnPart = locnPart + 1 END DO ! nPart END DO ! nSpecies END IF ! 1D/2D/Axisymmetric/3D diff --git a/src/particles/emission/particle_position_and_velocity.f90 b/src/particles/emission/particle_position_and_velocity.f90 index b27368573..cd592a781 100644 --- a/src/particles/emission/particle_position_and_velocity.f90 +++ b/src/particles/emission/particle_position_and_velocity.f90 @@ -134,8 +134,8 @@ SUBROUTINE SetParticlePosition(FractNbr,iInit,NbrOfParticle) !=================================================================================================================================== ! modules USE MOD_Globals -USE MOD_Particle_Vars ,ONLY: Species,PDM,PartState,FractNbrOld,chunkSizeOld,NeutralizationBalance -USE MOD_Particle_Localization ,ONLY: LocateParticleInElement +USE MOD_Particle_Vars ,ONLY: Species,PDM,PartState,FractNbrOld,chunkSizeOld,NeutralizationBalance, PartPosRef, PEM +USE MOD_Particle_Localization ,ONLY: SinglePointToElement USE MOD_part_emission_tools ,ONLY: IntegerDivide,SetCellLocalParticlePosition,SetParticlePositionPoint USE MOD_part_emission_tools ,ONLY: SetParticlePositionEquidistLine, SetParticlePositionLine, SetParticlePositionDisk USE MOD_part_emission_tools ,ONLY: SetParticlePositionCuboidCylinder, SetParticlePositionGyrotronCircle,SetParticlePositionCircle @@ -146,7 +146,9 @@ SUBROUTINE SetParticlePosition(FractNbr,iInit,NbrOfParticle) USE MOD_part_emission_tools ,ONLY: SetParticlePositionLandmark,SetParticlePositionLandmarkNeutralization USE MOD_part_emission_tools ,ONLY: SetParticlePositionLiu2010Neutralization,SetParticlePositionLiu2010Neutralization3D USE MOD_part_emission_tools ,ONLY: SetParticlePositionLiu2010SzaboNeutralization -USE MOD_DSMC_Vars ,ONLY: RadialWeighting +USE MOD_Eval_xyz ,ONLY: GetPositionInRefElem +USE MOD_Particle_Tracking_Vars ,ONLY: TrackingMethod +USE MOD_Part_Tools ,ONLY: IncreaseMaxParticleNumber, GetNextFreePosition #if USE_MPI USE MOD_Particle_MPI_Emission ,ONLY: SendEmissionParticlesToProcs USE MOD_Particle_MPI_Vars ,ONLY: PartMPI @@ -165,6 +167,7 @@ SUBROUTINE SetParticlePosition(FractNbr,iInit,NbrOfParticle) REAL,ALLOCATABLE :: particle_positions(:) INTEGER :: i,ParticleIndexNbr,allocStat,nChunks, chunkSize INTEGER :: DimSend +INTEGER, ALLOCATABLE :: AcceptedParts(:) #if USE_MPI INTEGER :: InitGroup #endif @@ -221,15 +224,9 @@ SUBROUTINE SetParticlePosition(FractNbr,iInit,NbrOfParticle) IF (PartMPI%InitGroup(InitGroup)%MPIROOT.OR.nChunks.GT.1) THEN #endif ! Allocate part pos buffer - IF(RadialWeighting%DoRadialWeighting.AND.(chunkSize.GT.PDM%maxParticleNumber)) THEN - ALLOCATE( particle_positions(1:PDM%maxParticleNumber*DimSend), STAT=allocStat ) - IF (allocStat .NE. 0) & - CALL abort(__STAMP__,'ERROR in SetParticlePosition: cannot allocate particle_positions!') - ELSE - ALLOCATE( particle_positions(1:chunkSize*DimSend), STAT=allocStat ) - IF (allocStat .NE. 0) & - CALL abort(__STAMP__,'ERROR in SetParticlePosition: cannot allocate particle_positions!') - END IF + ALLOCATE( particle_positions(1:chunkSize*DimSend), STAT=allocStat ) + IF (allocStat .NE. 0) & + CALL abort(__STAMP__,'ERROR in SetParticlePosition: cannot allocate particle_positions!') ! Sanity check IF (allocStat .NE. 0) CALL abort(__STAMP__,'ERROR in SetParticlePosition: cannot allocate particle_positions!') @@ -301,26 +298,30 @@ SUBROUTINE SetParticlePosition(FractNbr,iInit,NbrOfParticle) ! Finish emission on local proc ELSE #endif /*USE_MPI*/ - Species(FractNbr)%Init(iInit)%mySumOfMatchedParticles = 0 ParticleIndexNbr = 1 + ALLOCATE(AcceptedParts(0:chunkSize)) + AcceptedParts=-1 + AcceptedParts(0)=0 + DO i = 1,chunkSize + AcceptedParts(i) = SinglePointToElement(particle_positions(DimSend*(i-1)+1:DimSend*(i-1)+DimSend),doHALO=.FALSE.) + IF(AcceptedParts(i).NE.-1) AcceptedParts(0) = AcceptedParts(0) + 1 + END DO + Species(FractNbr)%Init(iInit)%mySumOfMatchedParticles = 0 + CALL IncreaseMaxParticleNumber(AcceptedParts(0)) DO i = 1,chunkSize ! Find a free position in the PDM array - IF ((i.EQ.1).OR.PDM%ParticleInside(ParticleIndexNbr)) THEN - ParticleIndexNbr = PDM%nextFreePosition(Species(FractNbr)%Init(iInit)%mySumOfMatchedParticles + 1 + PDM%CurrentNextFreePosition) - END IF - IF (ParticleIndexNbr.NE.0) THEN + IF(AcceptedParts(i).NE.-1) THEN + ParticleIndexNbr = GetNextFreePosition(Species(FractNbr)%Init(iInit)%mySumOfMatchedParticles+1) PartState(1:DimSend,ParticleIndexNbr) = particle_positions(DimSend*(i-1)+1:DimSend*(i-1)+DimSend) - PDM%ParticleInside( ParticleIndexNbr) = .TRUE. - CALL LocateParticleInElement(ParticleIndexNbr,doHALO=.FALSE.) - IF (PDM%ParticleInside(ParticleIndexNbr)) THEN - Species(FractNbr)%Init(iInit)%mySumOfMatchedParticles = Species(FractNbr)%Init(iInit)%mySumOfMatchedParticles + 1 - PDM%IsNewPart(ParticleIndexNbr) = .TRUE. - PDM%dtFracPush(ParticleIndexNbr) = .FALSE. - END IF - ELSE - CALL ABORT(__STAMP__,'ERROR in SetParticlePosition:ParticleIndexNbr.EQ.0 - maximum nbr of particles reached?') + PDM%ParticleInside(ParticleIndexNbr)=.TRUE. + PEM%GlobalElemID(ParticleIndexNbr) = AcceptedParts(i) + IF(TrackingMethod.EQ.REFMAPPING) CALL GetPositionInRefElem(PartState(1:DimSend,ParticleIndexNbr),PartPosRef(1:3,ParticleIndexNbr),AcceptedParts(i)) + Species(FractNbr)%Init(iInit)%mySumOfMatchedParticles = Species(FractNbr)%Init(iInit)%mySumOfMatchedParticles + 1 + PDM%IsNewPart(ParticleIndexNbr) = .TRUE. + PDM%dtFracPush(ParticleIndexNbr) = .FALSE. END IF END DO + DEALLOCATE(AcceptedParts) #if USE_MPI END IF @@ -363,7 +364,7 @@ SUBROUTINE SetParticleVelocity(FractNbr,iInit,NbrOfParticle) USE MOD_part_emission_tools ,ONLY: CalcVelocity_gyrotroncircle USE MOD_Particle_Boundary_Vars ,ONLY: DoBoundaryParticleOutputHDF5 USE MOD_Particle_Boundary_Tools ,ONLY: StoreBoundaryParticleProperties -USE MOD_part_tools ,ONLY: BuildTransGaussNums, InRotRefFrameCheck +USE MOD_part_tools ,ONLY: BuildTransGaussNums, InRotRefFrameCheck, GetNextFreePosition USE MOD_Particle_Vars ,ONLY: CalcBulkElectronTemp,BulkElectronTemp #if USE_HDG USE MOD_HDG_Vars ,ONLY: UseFPC,FPC,UseEPC,EPC @@ -378,7 +379,7 @@ SUBROUTINE SetParticleVelocity(FractNbr,iInit,NbrOfParticle) INTEGER,INTENT(INOUT) :: NbrOfParticle !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -INTEGER :: i, PositionNbr +INTEGER :: iPart, PositionNbr CHARACTER(30) :: velocityDistribution REAL :: VeloIC, VeloVecIC(3), maxwellfac, VeloVecNorm REAL :: iRanPart(3, NbrOfParticle), Vec3D(3),MPF @@ -401,15 +402,15 @@ SUBROUTINE SetParticleVelocity(FractNbr,iInit,NbrOfParticle) SELECT CASE(TRIM(velocityDistribution)) CASE('constant') - DO i = 1,NbrOfParticle - PositionNbr = PDM%nextFreePosition(i+PDM%CurrentNextFreePosition) + DO iPart = 1,NbrOfParticle + PositionNbr = GetNextFreePosition(iPart) IF (PositionNbr.GT.0) THEN PartState(4:6,PositionNbr) = VeloVecIC(1:3) * VeloIC END IF END DO CASE('gyrotron_circle') - DO i = 1,NbrOfParticle - PositionNbr = PDM%nextFreePosition(i+PDM%CurrentNextFreePosition) + DO iPart = 1,NbrOfParticle + PositionNbr = GetNextFreePosition(iPart) IF (PositionNbr.GT.0) THEN CALL CalcVelocity_gyrotroncircle(FractNbr, Vec3D, iInit, PositionNbr) PartState(4:6,PositionNbr) = Vec3D(1:3) @@ -419,8 +420,8 @@ SUBROUTINE SetParticleVelocity(FractNbr,iInit,NbrOfParticle) ! maxwell_lpn: Maxwell low particle number ! 2D_landmark: Ionization profile from T. Charoy, 2D axial-azimuthal particle-in-cell benchmark for low-temperature partially ! magnetized plasmas (2019) - DO i = 1,NbrOfParticle - PositionNbr = PDM%nextFreePosition(i+PDM%CurrentNextFreePosition) + DO iPart = 1,NbrOfParticle + PositionNbr = GetNextFreePosition(iPart) IF (PositionNbr.GT.0) THEN CALL CalcVelocity_maxwell_lpn(FractNbr, Vec3D, iInit=iInit) PartState(4:6,PositionNbr) = Vec3D(1:3) @@ -430,8 +431,8 @@ SUBROUTINE SetParticleVelocity(FractNbr,iInit,NbrOfParticle) IF(.NOT.CalcBulkElectronTemp) CALL abort(__STAMP__,& 'Velocity distribution 2D_Liu2010_neutralization requires CalcBulkElectronTemp=T') ! Use the global electron temperature if available - DO i = 1,NbrOfParticle - PositionNbr = PDM%nextFreePosition(i+PDM%CurrentNextFreePosition) + DO iPart = 1,NbrOfParticle + PositionNbr = GetNextFreePosition(iPart) IF (PositionNbr.GT.0) THEN CALL CalcVelocity_maxwell_lpn(FractNbr, Vec3D, Temperature=BulkElectronTemp*eV2Kelvin) PartState(4:6,PositionNbr) = Vec3D(1:3) @@ -440,8 +441,8 @@ SUBROUTINE SetParticleVelocity(FractNbr,iInit,NbrOfParticle) END IF END DO CASE('taylorgreenvortex') - DO i = 1,NbrOfParticle - PositionNbr = PDM%nextFreePosition(i+PDM%CurrentNextFreePosition) + DO iPart = 1,NbrOfParticle + PositionNbr = GetNextFreePosition(iPart) IF (PositionNbr.GT.0) THEN CALL CalcVelocity_taylorgreenvortex(FractNbr, Vec3D, iInit=iInit, Element=PEM%GlobalElemID(PositionNbr)) PartState(4:6,PositionNbr) = Vec3D(1:3) @@ -450,17 +451,17 @@ SUBROUTINE SetParticleVelocity(FractNbr,iInit,NbrOfParticle) CASE('maxwell') CALL BuildTransGaussNums(NbrOfParticle, iRanPart) maxwellfac = SQRT(BoltzmannConst*Species(FractNbr)%Init(iInit)%MWTemperatureIC/Species(FractNbr)%MassIC) - DO i = 1,NbrOfParticle - PositionNbr = PDM%nextFreePosition(i+PDM%CurrentNextFreePosition) + DO iPart = 1,NbrOfParticle + PositionNbr = GetNextFreePosition(iPart) IF (PositionNbr.GT.0) THEN - PartState(4:6,PositionNbr) = VeloIC *VeloVecIC(1:3) + iRanPart(1:3,i)*maxwellfac + PartState(4:6,PositionNbr) = VeloIC *VeloVecIC(1:3) + iRanPart(1:3,iPart)*maxwellfac END IF END DO CASE('IMD') ! read IMD particle velocity from *.chkpt file -> velocity space has already been read when particles position was done ! do nothing CASE('photon_SEE_energy') - DO i = 1,NbrOfParticle - PositionNbr = PDM%nextFreePosition(i+PDM%CurrentNextFreePosition) + DO iPart = 1,NbrOfParticle + PositionNbr = GetNextFreePosition(iPart) IF (PositionNbr .NE. 0) THEN CALL CalcVelocity_FromWorkFuncSEE(FractNbr, Vec3D, iInit=iInit) PartState(4:6,PositionNbr) = Vec3D(1:3) @@ -520,8 +521,8 @@ SUBROUTINE SetParticleVelocity(FractNbr,iInit,NbrOfParticle) END SELECT IF(UseRotRefFrame) THEN - DO i = 1,NbrOfParticle - PositionNbr = PDM%nextFreePosition(i+PDM%CurrentNextFreePosition) + DO iPart = 1,NbrOfParticle + PositionNbr = GetNextFreePosition(iPart) IF (PositionNbr.GT.0) THEN PDM%InRotRefFrame(PositionNbr) = InRotRefFrameCheck(PositionNbr) ! Initialize velocity in the rotational frame of reference @@ -547,7 +548,7 @@ SUBROUTINE SetPartPosAndVeloEmissionDistribution(iSpec,iInit,NbrOfParticle) !USE MOD_Globals USE MOD_PreProc USE MOD_Globals ,ONLY: myrank,UNIT_StdOut,MPI_COMM_WORLD,abort -USE MOD_part_tools ,ONLY: InitializeParticleMaxwell,InterpolateEmissionDistribution2D +USE MOD_part_tools ,ONLY: InitializeParticleMaxwell,InterpolateEmissionDistribution2D, GetNextFreePosition USE MOD_Mesh_Vars ,ONLY: nElems,offsetElem USE MOD_Particle_Vars ,ONLY: Species, PDM, PartState, PEM, LastPartPos USE MOD_Particle_Tracking ,ONLY: ParticleInsideCheck @@ -738,7 +739,7 @@ SUBROUTINE SetPartPosAndVeloEmissionDistribution(iSpec,iInit,NbrOfParticle) ! Exclude particles outside of the element IF (InsideFlag) THEN NbrOfParticle = NbrOfParticle + 1 - PositionNbr = PDM%nextFreePosition(NbrOfParticle+PDM%CurrentNextFreePosition) + PositionNbr = GetNextFreePosition(NbrOfParticle) PEM%GlobalElemID(PositionNbr) = GlobalElemID PDM%ParticleInside(PositionNbr) = .TRUE. IF((PositionNbr.GE.PDM%maxParticleNumber).OR.& @@ -775,7 +776,7 @@ SUBROUTINE SetPartPosAndVeloEmissionDistribution(iSpec,iInit,NbrOfParticle) SELECT CASE(TrackingMethod) CASE(REFMAPPING,TRACING) ! Attention: NbrOfParticle+PDM%CurrentNextFreePosition + 1 - PositionNbr = PDM%nextFreePosition(NbrOfParticle+PDM%CurrentNextFreePosition + 1) + PositionNbr = GetNextFreePosition(NbrOfParticle+1) PEM%GlobalElemID(PositionNbr) = GlobalElemID LastPartPos(1:3,PositionNbr) = RandomPos(1:3) InsideFlag = ParticleInsideCheck(RandomPos,PositionNbr,GlobalElemID) @@ -788,7 +789,7 @@ SUBROUTINE SetPartPosAndVeloEmissionDistribution(iSpec,iInit,NbrOfParticle) ! Exclude particles outside of the element IF (InsideFlag) THEN NbrOfParticle = NbrOfParticle + 1 - PositionNbr = PDM%nextFreePosition(NbrOfParticle+PDM%CurrentNextFreePosition) + PositionNbr = GetNextFreePosition(NbrOfParticle) PEM%GlobalElemID(PositionNbr) = GlobalElemID PDM%ParticleInside(PositionNbr) = .TRUE. IF((PositionNbr.GE.PDM%maxParticleNumber).OR.& diff --git a/src/particles/emission/particle_surface_flux.f90 b/src/particles/emission/particle_surface_flux.f90 index 936941611..7974195bd 100644 --- a/src/particles/emission/particle_surface_flux.f90 +++ b/src/particles/emission/particle_surface_flux.f90 @@ -39,7 +39,7 @@ SUBROUTINE ParticleSurfaceflux() USE MOD_DSMC_Vars ,ONLY: useDSMC, CollisMode, RadialWeighting, DSMC USE MOD_Eval_xyz ,ONLY: GetPositionInRefElem USE MOD_Mesh_Vars ,ONLY: SideToElem, offsetElem -USE MOD_Part_Tools ,ONLY: GetParticleWeight +USE MOD_Part_Tools ,ONLY: GetParticleWeight, GetNextFreePosition USE MOD_Part_Emission_Tools ,ONLY: SetParticleChargeAndMass, SetParticleMPF USE MOD_Particle_Analyze_Vars ,ONLY: CalcPartBalance, CalcSurfFluxInfo, nPartIn, PartEkinIn USE MOD_Particle_Analyze_Tools ,ONLY: CalcEkinPart @@ -221,39 +221,34 @@ SUBROUTINE ParticleSurfaceflux() ParticleIndexNbr = 1 DO iPart=1,PartInsSubSide IF ((iPart.EQ.1).OR.PDM%ParticleInside(ParticleIndexNbr)) & - ParticleIndexNbr = PDM%nextFreePosition(iPartTotal + 1 + PDM%CurrentNextFreePosition) - IF (ParticleIndexNbr .ne. 0) THEN - PartState(1:3,ParticleIndexNbr) = particle_positions(3*(iPart-1)+1:3*(iPart-1)+3) - IF (SF%VeloIsNormal.AND.(.NOT.TriaSurfaceFlux)) THEN - PartState(4:5,ParticleIndexNbr) = particle_xis(2*(iPart-1)+1:2*(iPart-1)+2) !use velo as dummy-storage for xi! - END IF - LastPartPos(1:3,ParticleIndexNbr)=PartState(1:3,ParticleIndexNbr) + ParticleIndexNbr = GetNextFreePosition(iPartTotal+1) + PartState(1:3,ParticleIndexNbr) = particle_positions(3*(iPart-1)+1:3*(iPart-1)+3) + IF (SF%VeloIsNormal.AND.(.NOT.TriaSurfaceFlux)) THEN + PartState(4:5,ParticleIndexNbr) = particle_xis(2*(iPart-1)+1:2*(iPart-1)+2) !use velo as dummy-storage for xi! + END IF + LastPartPos(1:3,ParticleIndexNbr)=PartState(1:3,ParticleIndexNbr) #if defined(IMPA) || defined(ROS) - IF(TrackingMethod.EQ.REFMAPPING) CALL GetPositionInRefElem(PartState(1:3,ParticleIndexNbr),PartPosRef(1:3,ParticleIndexNbr),globElemId) + IF(TrackingMethod.EQ.REFMAPPING) CALL GetPositionInRefElem(PartState(1:3,ParticleIndexNbr),PartPosRef(1:3,ParticleIndexNbr),globElemId) #endif /*IMPA*/ - PDM%ParticleInside(ParticleIndexNbr) = .TRUE. - PDM%dtFracPush(ParticleIndexNbr) = .TRUE. - PDM%IsNewPart(ParticleIndexNbr) = .TRUE. - PEM%GlobalElemID(ParticleIndexNbr) = globElemId - PEM%LastGlobalElemID(ParticleIndexNbr) = globElemId !needed when ParticlePush is not executed, e.g. "delay" - iPartTotal = iPartTotal + 1 - IF (UseVarTimeStep) THEN - PartTimeStep(ParticleIndexNbr) = GetParticleTimeStep(PartState(1,ParticleIndexNbr),PartState(2,ParticleIndexNbr), & - PEM%LocalElemID(ParticleIndexNbr)) - END IF - IF (RadialWeighting%DoRadialWeighting) THEN - PartMPF(ParticleIndexNbr) = CalcRadWeightMPF(PartState(2,ParticleIndexNbr), iSpec,ParticleIndexNbr) - END IF - IF(CalcSurfFluxInfo) THEN - SF%SampledMassflow = SF%SampledMassflow + GetParticleWeight(ParticleIndexNbr) - END IF + PDM%ParticleInside(ParticleIndexNbr) = .TRUE. + PDM%dtFracPush(ParticleIndexNbr) = .TRUE. + PDM%IsNewPart(ParticleIndexNbr) = .TRUE. + PEM%GlobalElemID(ParticleIndexNbr) = globElemId + PEM%LastGlobalElemID(ParticleIndexNbr) = globElemId !needed when ParticlePush is not executed, e.g. "delay" + iPartTotal = iPartTotal + 1 + IF (UseVarTimeStep) THEN + PartTimeStep(ParticleIndexNbr) = GetParticleTimeStep(PartState(1,ParticleIndexNbr),PartState(2,ParticleIndexNbr), & + PEM%LocalElemID(ParticleIndexNbr)) + END IF + IF (RadialWeighting%DoRadialWeighting) THEN + PartMPF(ParticleIndexNbr) = CalcRadWeightMPF(PartState(2,ParticleIndexNbr), iSpec,ParticleIndexNbr) + END IF + IF(CalcSurfFluxInfo) THEN + SF%SampledMassflow = SF%SampledMassflow + GetParticleWeight(ParticleIndexNbr) + END IF #ifdef CODE_ANALYZE - CALL AnalyzePartPos(ParticleIndexNbr) + CALL AnalyzePartPos(ParticleIndexNbr) #endif /*CODE_ANALYZE*/ - ELSE - IPWRITE(*,*) 'Total number of particles emitted: ', PartsEmitted, ' Current number of particles: ', PartInsSubSide - CALL abort(__STAMP__,'ERROR in ParticleSurfaceflux: ParticleIndexNbr.EQ.0 - maximum nbr of particles reached?') - END IF END DO !----- 2a.: set velocities if special for each subside CALL SetSurfacefluxVelocities(iSpec,iSF,iSample,jSample,iSide,BCSideID,SideID,ElemID,NbrOfParticle,PartInsSubSide) @@ -263,10 +258,7 @@ SUBROUTINE ParticleSurfaceflux() IF (useDSMC) THEN IF (DSMC%DoAmbipolarDiff) CALL AD_SetSFElectronVelo(iSpec,iSF,iSample,jSample,iSide,BCSideID,SideID,ElemID,NbrOfParticle,PartInsSubSide,particle_xis) DO iPart = 1, NbrOfParticle - PositionNbr = PDM%nextFreePosition(iPart+PDM%CurrentNextFreePosition) - IF (PositionNbr .EQ. 0) THEN - CALL abort(__STAMP__,'ERROR in InitialParticleInserting: No free particle index - maximum nbr of particles reached?') - END IF + PositionNbr = GetNextFreePosition(iPart) END DO END IF @@ -296,14 +288,13 @@ SUBROUTINE ParticleSurfaceflux() ! Compute number of input particles and energy nPartIn(iSpec)=nPartIn(iSpec) + NbrOfParticle DO iPart=1,NbrOfParticle - PositionNbr = PDM%nextFreePosition(iPart+PDM%CurrentNextFreePosition) - IF (PositionNbr.NE.0) PartEkinIn(iSpec) = PartEkinIn(iSpec)+CalcEkinPart(PositionNbr) + PositionNbr = GetNextFreePosition(iPart) + PartEkinIn(iSpec) = PartEkinIn(iSpec)+CalcEkinPart(PositionNbr) END DO ! iPart END IF ! CalcPartBalance ! instead of an UpdateNextfreePosition we update the particleVecLength only - enough ?!? PDM%CurrentNextFreePosition = PDM%CurrentNextFreePosition + NbrOfParticle - PDM%ParticleVecLength = PDM%ParticleVecLength + NbrOfParticle - IF(PDM%ParticleVecLength.GT.PDM%maxParticleNumber) CALL abort(__STAMP__, 'Error ParticleSurfaceflux: Maximum number of particles reached!') + PDM%ParticleVecLength = MIN(PDM%ParticleVecLength + NbrOfParticle,PDM%maxParticleNumber) #if USE_LOADBALANCE CALL LBPauseTime(LB_SURFFLUX,tLBStart) #endif /*USE_LOADBALANCE*/ @@ -532,9 +523,9 @@ SUBROUTINE SetInnerEnergies(iSpec, iSF, NbrOfParticle) ! MODULES USE MOD_Globals USE MOD_DSMC_Vars ,ONLY: SpecDSMC -USE MOD_Particle_Vars ,ONLY: PDM USE MOD_DSMC_PolyAtomicModel ,ONLY: DSMC_SetInternalEnr_Poly USE MOD_part_emission_tools ,ONLY: DSMC_SetInternalEnr_LauxVFD +USE MOD_Part_Tools ,ONLY: GetNextFreePosition ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -547,16 +538,13 @@ SUBROUTINE SetInnerEnergies(iSpec, iSF, NbrOfParticle) INTEGER :: iPart, PositionNbr !=================================================================================================================================== iPart = 1 -DO WHILE (iPart .le. NbrOfParticle) - PositionNbr = PDM%nextFreePosition(iPart+PDM%CurrentNextFreePosition) - IF (PositionNbr .ne. 0) THEN +DO iPart=1,NbrOfParticle + PositionNbr = GetNextFreePosition(iPart) IF (SpecDSMC(iSpec)%PolyatomicMol) THEN CALL DSMC_SetInternalEnr_Poly(iSpec,iSF,PositionNbr,2) ELSE CALL DSMC_SetInternalEnr_LauxVFD(iSpec, iSF, PositionNbr,2) END IF - END IF - iPart = iPart + 1 END DO END SUBROUTINE SetInnerEnergies @@ -1193,7 +1181,7 @@ SUBROUTINE SetSurfacefluxVelocities(iSpec,iSF,iSample,jSample,iSide,BCSideID,Sid USE MOD_Particle_Surfaces_Vars ,ONLY: SurfMeshSubSideData, TriaSurfaceFlux USE MOD_Particle_Surfaces ,ONLY: CalcNormAndTangBezier USE MOD_Particle_Sampling_Vars ,ONLY: AdaptBCMapElemToSample, AdaptBCMacroVal -USE MOD_Part_Tools ,ONLY: InRotRefFrameCheck +USE MOD_Part_Tools ,ONLY: InRotRefFrameCheck, GetNextFreePosition ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -1274,25 +1262,23 @@ SUBROUTINE SetSurfacefluxVelocities(iSpec,iSF,iSample,jSample,iSide,BCSideID,Sid VeloVecIC(1:3) = VeloVecIC(1:3) / VECNORM(VeloVecIC(1:3)) END IF DO i = NbrOfParticle-PartIns+1,NbrOfParticle - PositionNbr = PDM%nextFreePosition(i+PDM%CurrentNextFreePosition) - IF (PositionNbr .NE. 0) THEN - ! In case of side-normal velocities: calc n-vector at particle position, xi was saved in PartState(4:5) - IF (Species(iSpec)%Surfaceflux(iSF)%VeloIsNormal .AND. TriaSurfaceFlux) THEN - vec_nIn(1:3) = SurfMeshSubSideData(iSample,jSample,BCSideID)%vec_nIn(1:3) - vec_t1(1:3) = 0. !dummy - vec_t2(1:3) = 0. !dummy - ELSE IF (Species(iSpec)%Surfaceflux(iSF)%VeloIsNormal) THEN - CALL CalcNormAndTangBezier( nVec=vec_nIn(1:3),xi=PartState(4,PositionNbr),eta=PartState(5,PositionNbr),SideID=SideID ) - vec_nIn(1:3) = -vec_nIn(1:3) - vec_t1(1:3) = 0. !dummy - vec_t2(1:3) = 0. !dummy - ELSE - vec_nIn(1:3) = VeloVecIC(1:3) - END IF !VeloIsNormal - ! Build complete velo-vector - Vec3D(1:3) = vec_nIn(1:3) * Species(iSpec)%Surfaceflux(iSF)%VeloIC - PartState(4:6,PositionNbr) = Vec3D(1:3) - END IF !PositionNbr .NE. 0 + PositionNbr = GetNextFreePosition(i) + ! In case of side-normal velocities: calc n-vector at particle position, xi was saved in PartState(4:5) + IF (Species(iSpec)%Surfaceflux(iSF)%VeloIsNormal .AND. TriaSurfaceFlux) THEN + vec_nIn(1:3) = SurfMeshSubSideData(iSample,jSample,BCSideID)%vec_nIn(1:3) + vec_t1(1:3) = 0. !dummy + vec_t2(1:3) = 0. !dummy + ELSE IF (Species(iSpec)%Surfaceflux(iSF)%VeloIsNormal) THEN + CALL CalcNormAndTangBezier( nVec=vec_nIn(1:3),xi=PartState(4,PositionNbr),eta=PartState(5,PositionNbr),SideID=SideID ) + vec_nIn(1:3) = -vec_nIn(1:3) + vec_t1(1:3) = 0. !dummy + vec_t2(1:3) = 0. !dummy + ELSE + vec_nIn(1:3) = VeloVecIC(1:3) + END IF !VeloIsNormal + ! Build complete velo-vector + Vec3D(1:3) = vec_nIn(1:3) * Species(iSpec)%Surfaceflux(iSF)%VeloIC + PartState(4:6,PositionNbr) = Vec3D(1:3) END DO !i = ...NbrOfParticle CASE('maxwell','maxwell_lpn') !-- determine envelope for most efficient ARM [Garcia and Wagner 2006, JCP217-2] @@ -1316,140 +1302,136 @@ SUBROUTINE SetSurfacefluxVelocities(iSpec,iSF,iSample,jSample,iSide,BCSideID,Sid END IF !low speed / high speed / rayleigh flow DO i = NbrOfParticle-PartIns+1,NbrOfParticle - PositionNbr = PDM%nextFreePosition(i+PDM%CurrentNextFreePosition) - IF (PositionNbr .NE. 0) THEN - !-- 0a.: In case of side-normal velocities: calc n-/t-vectors at particle position, xi was saved in PartState(4:5) - IF (Species(iSpec)%Surfaceflux(iSF)%VeloIsNormal .AND. TriaSurfaceFlux) THEN - vec_nIn(1:3) = SurfMeshSubSideData(iSample,jSample,BCSideID)%vec_nIn(1:3) - vec_t1(1:3) = SurfMeshSubSideData(iSample,jSample,BCSideID)%vec_t1(1:3) - vec_t2(1:3) = SurfMeshSubSideData(iSample,jSample,BCSideID)%vec_t2(1:3) - ELSE IF (Species(iSpec)%Surfaceflux(iSF)%VeloIsNormal) THEN - CALL CalcNormAndTangBezier( nVec=vec_nIn(1:3),tang1=vec_t1(1:3),tang2=vec_t2(1:3) & - ,xi=PartState(4,PositionNbr),eta=PartState(5,PositionNbr),SideID=SideID ) - vec_nIn(1:3) = -vec_nIn(1:3) - END IF !VeloIsNormal - !-- 1.: determine zstar (initial generation of potentially too many RVu is for needed indentities of RVu used multiple times! - SELECT CASE(envelope) - CASE(0) - CALL RANDOM_NUMBER(RandVal1) - zstar = -SQRT(-LOG(RandVal1)) - CASE(1) - DO - CALL RANDOM_NUMBER(RandVal2) - zstar = -SQRT(a*a-LOG(RandVal2(1))) - IF ( -(a-zstar)/zstar .GT. RandVal2(2)) THEN + PositionNbr = GetNextFreePosition(i) + !-- 0a.: In case of side-normal velocities: calc n-/t-vectors at particle position, xi was saved in PartState(4:5) + IF (Species(iSpec)%Surfaceflux(iSF)%VeloIsNormal .AND. TriaSurfaceFlux) THEN + vec_nIn(1:3) = SurfMeshSubSideData(iSample,jSample,BCSideID)%vec_nIn(1:3) + vec_t1(1:3) = SurfMeshSubSideData(iSample,jSample,BCSideID)%vec_t1(1:3) + vec_t2(1:3) = SurfMeshSubSideData(iSample,jSample,BCSideID)%vec_t2(1:3) + ELSE IF (Species(iSpec)%Surfaceflux(iSF)%VeloIsNormal) THEN + CALL CalcNormAndTangBezier( nVec=vec_nIn(1:3),tang1=vec_t1(1:3),tang2=vec_t2(1:3) & + ,xi=PartState(4,PositionNbr),eta=PartState(5,PositionNbr),SideID=SideID ) + vec_nIn(1:3) = -vec_nIn(1:3) + END IF !VeloIsNormal + !-- 1.: determine zstar (initial generation of potentially too many RVu is for needed indentities of RVu used multiple times! + SELECT CASE(envelope) + CASE(0) + CALL RANDOM_NUMBER(RandVal1) + zstar = -SQRT(-LOG(RandVal1)) + CASE(1) + DO + CALL RANDOM_NUMBER(RandVal2) + zstar = -SQRT(a*a-LOG(RandVal2(1))) + IF ( -(a-zstar)/zstar .GT. RandVal2(2)) THEN + EXIT + END IF + END DO + CASE(2) + z = 0.5*(a-SQRT(a*a+2.)) + beta = a-(1.0-a)*(a-z) + DO + CALL RANDOM_NUMBER(RandVal3) + IF (EXP(-(beta*beta))/(EXP(-(beta*beta))+2.0*(a-z)*(a-beta)*EXP(-(z*z))).GT.RandVal3(1)) THEN + zstar=-SQRT(beta*beta-LOG(RandVal3(2))) + IF ( -(a-zstar)/zstar .GT. RandVal3(3)) THEN EXIT END IF - END DO - CASE(2) - z = 0.5*(a-SQRT(a*a+2.)) - beta = a-(1.0-a)*(a-z) - DO - CALL RANDOM_NUMBER(RandVal3) - IF (EXP(-(beta*beta))/(EXP(-(beta*beta))+2.0*(a-z)*(a-beta)*EXP(-(z*z))).GT.RandVal3(1)) THEN - zstar=-SQRT(beta*beta-LOG(RandVal3(2))) - IF ( -(a-zstar)/zstar .GT. RandVal3(3)) THEN - EXIT - END IF - ELSE - zstar=beta+(a-beta)*RandVal3(2) - IF ( (a-zstar)/(a-z)*EXP(z*z-(zstar*zstar)) .GT. RandVal3(3)) THEN - EXIT - END IF + ELSE + zstar=beta+(a-beta)*RandVal3(2) + IF ( (a-zstar)/(a-z)*EXP(z*z-(zstar*zstar)) .GT. RandVal3(3)) THEN + EXIT END IF - END DO - CASE(3) - DO - CALL RANDOM_NUMBER(RandVal3) - u = RandVal3(1) - IF ( a*SQRT(PI)/(a*SQRT(PI)+1+a*a) .GT. u) THEN + END IF + END DO + CASE(3) + DO + CALL RANDOM_NUMBER(RandVal3) + u = RandVal3(1) + IF ( a*SQRT(PI)/(a*SQRT(PI)+1+a*a) .GT. u) THEN ! IF (.NOT.DoZigguratSampling) THEN !polar method - IF (RandN_in_Mem) THEN !reusing second RandN form previous polar method - RandN = RandN_save - RandN_in_Mem=.FALSE. - ELSE - Velosq = 2 - DO WHILE ((Velosq .GE. 1.) .OR. (Velosq .EQ. 0.)) - CALL RANDOM_NUMBER(RandVal2) - Velo1 = 2.*RandVal2(1) - 1. - Velo2 = 2.*RandVal2(2) - 1. - Velosq = Velo1**2 + Velo2**2 - END DO - RandN = Velo1*SQRT(-2*LOG(Velosq)/Velosq) - RandN_save = Velo2*SQRT(-2*LOG(Velosq)/Velosq) - RandN_in_Mem=.TRUE. - END IF + IF (RandN_in_Mem) THEN !reusing second RandN form previous polar method + RandN = RandN_save + RandN_in_Mem=.FALSE. + ELSE + Velosq = 2 + DO WHILE ((Velosq .GE. 1.) .OR. (Velosq .EQ. 0.)) + CALL RANDOM_NUMBER(RandVal2) + Velo1 = 2.*RandVal2(1) - 1. + Velo2 = 2.*RandVal2(2) - 1. + Velosq = Velo1**2 + Velo2**2 + END DO + RandN = Velo1*SQRT(-2*LOG(Velosq)/Velosq) + RandN_save = Velo2*SQRT(-2*LOG(Velosq)/Velosq) + RandN_in_Mem=.TRUE. + END IF ! ELSE !ziggurat method ! RandN=rnor() ! END IF - zstar = -1./SQRT(2.)*ABS(RandN) - EXIT - ELSE IF ( (a*SQRT(PI)+1.)/(a*SQRT(PI)+1+a*a) .GT. u) THEN - zstar = -SQRT(-LOG(RandVal3(2))) + zstar = -1./SQRT(2.)*ABS(RandN) + EXIT + ELSE IF ( (a*SQRT(PI)+1.)/(a*SQRT(PI)+1+a*a) .GT. u) THEN + zstar = -SQRT(-LOG(RandVal3(2))) + EXIT + ELSE + zstar = (1.0-SQRT(RandVal3(2)))*a + IF (EXP(-(zstar*zstar)).GT.RandVal3(3)) THEN EXIT - ELSE - zstar = (1.0-SQRT(RandVal3(2)))*a - IF (EXP(-(zstar*zstar)).GT.RandVal3(3)) THEN - EXIT - END IF END IF - END DO - CASE(4) - DO - CALL RANDOM_NUMBER(RandVal3) - IF (1.0/(2.0*a*SQRT(PI)+1.0).GT.RandVal3(1)) THEN - zstar=-SQRT(-LOG(RandVal3(2))) - ELSE + END IF + END DO + CASE(4) + DO + CALL RANDOM_NUMBER(RandVal3) + IF (1.0/(2.0*a*SQRT(PI)+1.0).GT.RandVal3(1)) THEN + zstar=-SQRT(-LOG(RandVal3(2))) + ELSE ! IF (.NOT.DoZigguratSampling) THEN !polar method - IF (RandN_in_Mem) THEN !reusing second RandN form previous polar method - RandN = RandN_save - RandN_in_Mem=.FALSE. - ELSE - Velosq = 2 - DO WHILE ((Velosq .GE. 1.) .OR. (Velosq .EQ. 0.)) - CALL RANDOM_NUMBER(RandVal2) - Velo1 = 2.*RandVal2(1) - 1. - Velo2 = 2.*RandVal2(2) - 1. - Velosq = Velo1**2 + Velo2**2 - END DO - RandN = Velo1*SQRT(-2*LOG(Velosq)/Velosq) - RandN_save = Velo2*SQRT(-2*LOG(Velosq)/Velosq) - RandN_in_Mem=.TRUE. - END IF + IF (RandN_in_Mem) THEN !reusing second RandN form previous polar method + RandN = RandN_save + RandN_in_Mem=.FALSE. + ELSE + Velosq = 2 + DO WHILE ((Velosq .GE. 1.) .OR. (Velosq .EQ. 0.)) + CALL RANDOM_NUMBER(RandVal2) + Velo1 = 2.*RandVal2(1) - 1. + Velo2 = 2.*RandVal2(2) - 1. + Velosq = Velo1**2 + Velo2**2 + END DO + RandN = Velo1*SQRT(-2*LOG(Velosq)/Velosq) + RandN_save = Velo2*SQRT(-2*LOG(Velosq)/Velosq) + RandN_in_Mem=.TRUE. + END IF ! ELSE !ziggurat method ! RandN=rnor() ! END IF - zstar = 1./SQRT(2.)*RandN - END IF - IF ( (a-zstar)/a .GT. RandVal3(3)) THEN - EXIT - END IF - END DO - CASE DEFAULT - CALL abort(__STAMP__,'ERROR in SurfaceFlux: Wrong envelope in SetSurfacefluxVelocities!') - END SELECT - !-- 2.: sample normal directions and build complete velo-vector - Vec3D(1:3) = vec_nIn(1:3) * SQRT(2.*BoltzmannConst*T/Species(iSpec)%MassIC)*(a-zstar) + zstar = 1./SQRT(2.)*RandN + END IF + IF ( (a-zstar)/a .GT. RandVal3(3)) THEN + EXIT + END IF + END DO + CASE DEFAULT + CALL abort(__STAMP__,'ERROR in SurfaceFlux: Wrong envelope in SetSurfacefluxVelocities!') + END SELECT + !-- 2.: sample normal directions and build complete velo-vector + Vec3D(1:3) = vec_nIn(1:3) * SQRT(2.*BoltzmannConst*T/Species(iSpec)%MassIC)*(a-zstar) ! IF (.NOT.DoZigguratSampling) THEN !polar method - Velosq = 2 - DO WHILE ((Velosq .GE. 1.) .OR. (Velosq .EQ. 0.)) - CALL RANDOM_NUMBER(RandVal2) - Velo1 = 2.*RandVal2(1) - 1. - Velo2 = 2.*RandVal2(2) - 1. - Velosq = Velo1**2 + Velo2**2 - END DO - Velo1 = Velo1*SQRT(-2*LOG(Velosq)/Velosq) - Velo2 = Velo2*SQRT(-2*LOG(Velosq)/Velosq) + Velosq = 2 + DO WHILE ((Velosq .GE. 1.) .OR. (Velosq .EQ. 0.)) + CALL RANDOM_NUMBER(RandVal2) + Velo1 = 2.*RandVal2(1) - 1. + Velo2 = 2.*RandVal2(2) - 1. + Velosq = Velo1**2 + Velo2**2 + END DO + Velo1 = Velo1*SQRT(-2*LOG(Velosq)/Velosq) + Velo2 = Velo2*SQRT(-2*LOG(Velosq)/Velosq) ! ELSE !ziggurat method ! Velo1=rnor() ! Velo2=rnor() ! END IF - Vec3D(1:3) = Vec3D(1:3) + vec_t1(1:3) * ( Velo_t1+Velo1*SQRT(BoltzmannConst*T/Species(iSpec)%MassIC) ) - Vec3D(1:3) = Vec3D(1:3) + vec_t2(1:3) * ( Velo_t2+Velo2*SQRT(BoltzmannConst*T/Species(iSpec)%MassIC) ) - PartState(4:6,PositionNbr) = Vec3D(1:3) - ELSE !PositionNbr .EQ. 0 - CALL abort(__STAMP__,'PositionNbr .EQ. 0!') - END IF !PositionNbr .NE. 0 + Vec3D(1:3) = Vec3D(1:3) + vec_t1(1:3) * ( Velo_t1+Velo1*SQRT(BoltzmannConst*T/Species(iSpec)%MassIC) ) + Vec3D(1:3) = Vec3D(1:3) + vec_t2(1:3) * ( Velo_t2+Velo2*SQRT(BoltzmannConst*T/Species(iSpec)%MassIC) ) + PartState(4:6,PositionNbr) = Vec3D(1:3) END DO !i = ...NbrOfParticle CASE DEFAULT CALL abort(__STAMP__,'ERROR in SurfaceFlux: Wrong velocity distribution!') @@ -1457,14 +1439,12 @@ SUBROUTINE SetSurfacefluxVelocities(iSpec,iSF,iSample,jSample,iSide,BCSideID,Sid IF(UseRotRefFrame) THEN DO i = NbrOfParticle-PartIns+1,NbrOfParticle - PositionNbr = PDM%nextFreePosition(i+PDM%CurrentNextFreePosition) - IF (PositionNbr.GT.0) THEN - ! Detect if particle is within a RotRefDomain - PDM%InRotRefFrame(PositionNbr) = InRotRefFrameCheck(PositionNbr) - ! Initialize velocity in the rotational frame of reference - IF(PDM%InRotRefFrame(PositionNbr)) THEN - PartVeloRotRef(1:3,PositionNbr) = PartState(4:6,PositionNbr) - CROSS(RotRefFrameOmega(1:3),PartState(1:3,PositionNbr)) - END IF + PositionNbr = GetNextFreePosition(i) + ! Detect if particle is within a RotRefDomain + PDM%InRotRefFrame(PositionNbr) = InRotRefFrameCheck(PositionNbr) + ! Initialize velocity in the rotational frame of reference + IF(PDM%InRotRefFrame(PositionNbr)) THEN + PartVeloRotRef(1:3,PositionNbr) = PartState(4:6,PositionNbr) - CROSS(RotRefFrameOmega(1:3),PartState(1:3,PositionNbr)) END IF END DO END IF diff --git a/src/particles/mcc/mcc.f90 b/src/particles/mcc/mcc.f90 index 367d550cf..2e7ce483c 100644 --- a/src/particles/mcc/mcc.f90 +++ b/src/particles/mcc/mcc.f90 @@ -63,7 +63,7 @@ SUBROUTINE MonteCarloCollision(iElem) ! ROUTINES USE MOD_DSMC_Analyze ,ONLY: CalcMeanFreePath USE MOD_DSMC_BGGas ,ONLY: BGGas_AssignParticleProperties -USE MOD_part_tools ,ONLY: GetParticleWeight, CalcVelocity_maxwell_particle +USE MOD_part_tools ,ONLY: GetParticleWeight, CalcVelocity_maxwell_particle, GetNextFreePosition USE MOD_Part_Emission_Tools ,ONLY: CalcVelocity_maxwell_lpn USE MOD_DSMC_Collis ,ONLY: DSMC_perform_collision USE MOD_Mesh_Tools ,ONLY: GetCNElemID @@ -274,7 +274,7 @@ SUBROUTINE MonteCarloCollision(iElem) ! Clone the regular particle (re-using the index of the previous particle if it didn't collide) IF(PartIndex.EQ.0) THEN DSMCSumOfFormedParticles = DSMCSumOfFormedParticles + 1 - PartIndex = PDM%nextFreePosition(DSMCSumOfFormedParticles+PDM%CurrentNextFreePosition) + PartIndex = GetNextFreePosition() IF (PartIndex.EQ.0) THEN CALL Abort(__STAMP__,'ERROR in MCC: MaxParticleNumber should be increased!') END IF @@ -410,7 +410,7 @@ SUBROUTINE MonteCarloCollision(iElem) IF(ChemReac%CollCaseInfo(iCase)%HasXSecReaction) THEN IF(bggPartIndex.EQ.0) THEN DSMCSumOfFormedParticles = DSMCSumOfFormedParticles + 1 - bggPartIndex = PDM%nextFreePosition(DSMCSumOfFormedParticles+PDM%CurrentNextFreePosition) + bggPartIndex = GetNextFreePosition() IF (bggPartIndex.EQ.0) THEN CALL Abort(__STAMP__,'ERROR in MCC: MaxParticleNumber should be increased!') END IF @@ -466,7 +466,7 @@ SUBROUTINE MonteCarloCollision(iElem) ! Creating a new background gas particle IF(bggPartIndex.EQ.0) THEN DSMCSumOfFormedParticles = DSMCSumOfFormedParticles + 1 - bggPartIndex = PDM%nextFreePosition(DSMCSumOfFormedParticles+PDM%CurrentNextFreePosition) + bggPartIndex = GetNextFreePosition() IF (bggPartIndex.EQ.0) THEN CALL Abort(__STAMP__,'ERROR in MCC: MaxParticleNumber should be increased!') END IF @@ -504,7 +504,7 @@ SUBROUTINE MonteCarloCollision(iElem) ELSE ! No collision IF(SplitInProgress) THEN ! Save the index of the first particle that did not collide - IF(SplitRestPart.EQ.0) THEN + IF(SplitRestPart.EQ.0) THEN SplitRestPart = PartIndex ! Reset the PartIndex to use a new particle (unless it is the last particle, keep the index to check whether it can be deleted) IF(iPartSplit.NE.SplitPartNum) PartIndex = 0 diff --git a/src/particles/particle_init.f90 b/src/particles/particle_init.f90 index 0f93b4c62..df1613461 100644 --- a/src/particles/particle_init.f90 +++ b/src/particles/particle_init.f90 @@ -91,8 +91,9 @@ SUBROUTINE DefineParametersParticles() CALL prms%CreateRealOption( 'InitialIonizationChargeAverage' , 'Average charge for each atom/molecule in the cell '//& '(corresponds to the ionization degree)') -CALL prms%CreateIntOption( 'Part-MaxParticleNumber', 'Maximum number of Particles per proc (used for array init)'& - , '1') +CALL prms%CreateIntOption( 'Part-MaxParticleNumber', 'Maximum allowed particles per core, 0=no limit') +CALL prms%CreateRealOption( 'Part-MaxPartNumIncrease', 'How much shall the PDM%MaxParticleNumber be incresed if it is full'& + , '0.1') CALL prms%CreateIntOption( 'Part-NumberOfRandomSeeds' , 'Number of Seeds for Random Number Generator'//& 'Choose nRandomSeeds \n'//& '=-1 Random \n'//& @@ -130,7 +131,7 @@ SUBROUTINE DefineParametersParticles() 'i.e. how deep the merge extends into the mesh starting from \n'//& 'each cell. 0 is the least aggressive merge, 2 the most \n'//& 'aggressive merge.','0') -CALL prms%CreateIntOption( 'Part-MaxNumbCellsMerge' ,'Maximum number of cells to be merged.','4') +CALL prms%CreateIntOption( 'Part-MaxNumbCellsMerge' ,'Maximum number of cells to be merged.','4') CALL prms%SetSection("IMD") ! IMD things @@ -424,9 +425,14 @@ SUBROUTINE InitializeVariables() !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES REAL :: ManualTimeStepParticle ! temporary variable +CHARACTER(32) :: hilf !=================================================================================================================================== ! Read basic particle parameter -PDM%maxParticleNumber = GETINT('Part-maxParticleNumber','1') +WRITE(UNIT=hilf,FMT='(I0)') HUGE(PDM%maxAllowedParticleNumber) +PDM%maxAllowedParticleNumber = GETINT('Part-maxParticleNumber',TRIM(hilf)) +PDM%MaxPartNumIncrease = GETREAL('Part-MaxPartNumIncrease','0.1') +PDM%maxParticleNumber=1 +PDM%ParticleVecLength=0 CALL AllocateParticleArrays() CALL InitializeVariablesRandomNumbers() @@ -686,7 +692,7 @@ SUBROUTINE InitializeVariablesVirtualCellMerge() DoVirtualCellMerge = GETLOGICAL('Part-DoVirtualCellMerge') IF(DoVirtualCellMerge)THEN #if USE_MPI -DoParticleLatencyHiding = .FALSE. +DoParticleLatencyHiding = .FALSE. #endif VirtualCellMergeSpread = GETINT('Part-CellMergeSpread') MaxNumOfMergedCells = GETINT('Part-MaxNumbCellsMerge') @@ -1184,6 +1190,7 @@ SUBROUTINE InitialIonization() USE MOD_part_emission_tools ,ONLY: CalcVelocity_maxwell_lpn USE MOD_DSMC_Vars ,ONLY: useDSMC USE MOD_Eval_xyz ,ONLY: TensorProductInterpolation +USE MOD_Part_Tools ,ONLY: GetNextFreePosition #if USE_LOADBALANCE USE MOD_LoadBalance_Vars ,ONLY: PerformLoadBalance #endif /*USE_LOADBALANCE*/ @@ -1292,9 +1299,7 @@ SUBROUTINE InitialIonization() DO iPart=1,ElemCharge(iElem) ! 1 electron for each charge of each element ! Set the next free position in the particle vector list - PDM%CurrentNextFreePosition = PDM%CurrentNextFreePosition + 1 - ParticleIndexNbr = PDM%nextFreePosition(PDM%CurrentNextFreePosition) - PDM%ParticleVecLength = PDM%ParticleVecLength + 1 + ParticleIndexNbr = GetNextFreePosition() !Set new SpeciesID of new particle (electron) PDM%ParticleInside(ParticleIndexNbr) = .true. diff --git a/src/particles/particle_mpi/particle_mpi.f90 b/src/particles/particle_mpi/particle_mpi.f90 index 98bcbb459..1856d1978 100644 --- a/src/particles/particle_mpi/particle_mpi.f90 +++ b/src/particles/particle_mpi/particle_mpi.f90 @@ -905,6 +905,7 @@ SUBROUTINE MPIParticleRecv(DoMPIUpdateNextFreePos) USE MOD_Particle_Mesh_Vars ,ONLY: IsExchangeElem USE MOD_Particle_MPI_Vars ,ONLY: ExchangeProcToGlobalProc,DoParticleLatencyHiding USE MOD_Eval_xyz ,ONLY: GetPositionInRefElem +USE MOD_Part_Tools ,ONLY: GetNextFreePosition #if defined(LSERK) USE MOD_Particle_Vars ,ONLY: Pt_temp #endif @@ -941,7 +942,7 @@ SUBROUTINE MPIParticleRecv(DoMPIUpdateNextFreePos) ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -INTEGER :: iProc, iPos, nRecv, PartID,jPos, iPart, TempNextFreePosition, ElemID +INTEGER :: iProc, iPos, nRecv, PartID,jPos, iPart, ElemID INTEGER :: recv_status_list(1:MPI_STATUS_SIZE,0:nExchangeProcessors-1) INTEGER :: MessageSize, nRecvParticles #if defined(ROS) || defined(IMPA) @@ -1035,9 +1036,7 @@ SUBROUTINE MPIParticleRecv(DoMPIUpdateNextFreePos) DO iPos=0,MessageSize-1-MsgLengthPoly - MsgLengthElec - MsgLengthAmbi,PartCommSize ! find free position in particle array nRecv = nRecv+1 - PartID = PDM%nextFreePosition(nRecv+PDM%CurrentNextFreePosition) - IF(PartID.EQ.0) CALL ABORT(__STAMP__,& - ' Error in ParticleExchange_parallel. PDM%nextFreePosition=0. Increase Part-MaxParticleNumber! ', nRecv) + PartID = GetNextFreePosition(nRecv) !>> particle position in physical space PartState(1:6,PartID) = PartRecvBuf(iProc)%content(1+iPos: 6+iPos) @@ -1319,21 +1318,19 @@ SUBROUTINE MPIParticleRecv(DoMPIUpdateNextFreePos) END DO ! iProc -TempNextFreePosition = PDM%CurrentNextFreePosition -PDM%ParticleVecLength = PDM%ParticleVecLength + PartMPIExchange%nMPIParticles +PDM%ParticleVecLength = MIN(PDM%ParticleVecLength + PartMPIExchange%nMPIParticles,PDM%maxParticleNumber) PDM%CurrentNextFreePosition = PDM%CurrentNextFreePosition + PartMPIExchange%nMPIParticles -PartMPIExchange%nMPIParticles = 0 IF(PDM%ParticleVecLength.GT.PDM%MaxParticleNumber) CALL ABORT(__STAMP__& ,' ParticleVecLegnth>MaxParticleNumber due to MPI-communication! Increase Part-maxParticleNumber or use more processors.') IF(RadialWeighting%PerformCloning) THEN ! Checking whether received particles have to be cloned or deleted DO iPart = 1,nrecv - PartID = PDM%nextFreePosition(iPart+TempNextFreePosition) + PartID = GetNextFreePosition(iPart-PartMPIExchange%nMPIParticles) IF(ParticleOnProc(PartID)) CALL DSMC_2D_RadialWeighting(PartID,PEM%GlobalElemID(PartID)) END DO END IF - +PartMPIExchange%nMPIParticles = 0 ! deallocate send,receive buffer DO iProc=0,nExchangeProcessors-1 SDEALLOCATE(PartRecvBuf(iProc)%content) diff --git a/src/particles/particle_mpi/particle_mpi_emission.f90 b/src/particles/particle_mpi/particle_mpi_emission.f90 index d5736a67a..776f74afd 100644 --- a/src/particles/particle_mpi/particle_mpi_emission.f90 +++ b/src/particles/particle_mpi/particle_mpi_emission.f90 @@ -586,6 +586,7 @@ SUBROUTINE SendEmissionParticlesToProcs(chunkSize,DimSend,FractNbr,iInit,mySumOf USE MOD_Particle_MPI_Vars ,ONLY: EmissionSendBuf,EmissionRecvBuf USE MOD_Particle_Vars ,ONLY: PDM,PEM,PartState,PartPosRef,Species USE MOD_Particle_Tracking_Vars ,ONLY: TrackingMethod +USE MOD_Part_Tools ,ONLY: GetNextFreePosition #if defined(MEASURE_MPI_WAIT) USE MOD_Particle_MPI_Vars ,ONLY: MPIW8TimePart,MPIW8CountPart #endif /*defined(MEASURE_MPI_WAIT)*/ @@ -911,21 +912,14 @@ SUBROUTINE SendEmissionParticlesToProcs(chunkSize,DimSend,FractNbr,iInit,mySumOf ! Located particle on local proc. ELSE ! Get the next free position in the PDM array - ParticleIndexNbr = PDM%nextFreePosition(mySumOfMatchedParticles + 1 + PDM%CurrentNextFreePosition) - IF (ParticleIndexNbr.NE.0) THEN - ! Fill the PartState manually to avoid a second localization - PartState(1:DimSend,ParticleIndexNbr) = particle_positions(DimSend*(i-1)+1:DimSend*(i-1)+DimSend) - PDM%ParticleInside( ParticleIndexNbr) = .TRUE. - IF (TrackingMethod.EQ.REFMAPPING) THEN - CALL GetPositionInRefElem(PartState(1:3,ParticleIndexNbr),PartPosRef(1:3,ParticleIndexNbr),ElemID) - END IF ! TrackingMethod.EQ.REFMAPPING - PEM%GlobalElemID(ParticleIndexNbr) = ElemID - ELSE - IPWRITE(UNIT_StdOut,'(I0,A,I0,A,I0,A)') " PDM%MaxParticleNumber = ", PDM%MaxParticleNumber," for each processor (",& - PDM%MaxParticleNumber*nProcessors," in total)" - IPWRITE(UNIT_StdOut,'(I0,A)') " Increase value for [Part-maxParticleNumber]!" - CALL ABORT(__STAMP__,'ERROR in ParticleMPIEmission:ParticleIndexNbr.EQ.0 - maximum nbr of particles reached?') - END IF + ParticleIndexNbr = GetNextFreePosition(mySumOfMatchedParticles+1) + ! Fill the PartState manually to avoid a second localization + PartState(1:DimSend,ParticleIndexNbr) = particle_positions(DimSend*(i-1)+1:DimSend*(i-1)+DimSend) + PDM%ParticleInside( ParticleIndexNbr) = .TRUE. + IF (TrackingMethod.EQ.REFMAPPING) THEN + CALL GetPositionInRefElem(PartState(1:3,ParticleIndexNbr),PartPosRef(1:3,ParticleIndexNbr),ElemID) + END IF ! TrackingMethod.EQ.REFMAPPING + PEM%GlobalElemID(ParticleIndexNbr) = ElemID mySumOfMatchedParticles = mySumOfMatchedParticles + 1 END IF ! ElemID.EQ.-1 END IF ! InsideMyBGM(i) @@ -1069,21 +1063,14 @@ SUBROUTINE SendEmissionParticlesToProcs(chunkSize,DimSend,FractNbr,iInit,mySumOf IF (ElemInfo_Shared(ELEM_RANK,ElemID).NE.myRank) CYCLE ! Find a free position in the PDM array - ParticleIndexNbr = PDM%nextFreePosition(mySumOfMatchedParticles + 1 + PDM%CurrentNextFreePosition) - IF (ParticleIndexNbr.NE.0) THEN - ! Fill the PartState manually to avoid a second localization - PartState(1:3,ParticleIndexNbr) = recvPartPos(DimSend*(i-1)+1:DimSend*(i-1)+3) - PDM%ParticleInside( ParticleIndexNbr) = .TRUE. - IF (TrackingMethod.EQ.REFMAPPING) THEN - CALL GetPositionInRefElem(PartState(1:3,ParticleIndexNbr),PartPosRef(1:3,ParticleIndexNbr),ElemID) - END IF ! TrackingMethod.EQ.REFMAPPING - PEM%GlobalElemID(ParticleIndexNbr) = ElemID - ELSE - IPWRITE(UNIT_StdOut,'(I0,A,I0,A,I0,A)') " PDM%MaxParticleNumber = ", PDM%MaxParticleNumber," for each processor (",& - PDM%MaxParticleNumber*nProcessors," in total)" - IPWRITE(UNIT_StdOut,'(I0,A)') " Increase value for [Part-maxParticleNumber]!" - CALL ABORT(__STAMP__,'ERROR in ParticleMPIEmission:ParticleIndexNbr.EQ.0 - maximum nbr of particles reached?') - END IF + ParticleIndexNbr = GetNextFreePosition(mySumOfMatchedParticles+1) + ! Fill the PartState manually to avoid a second localization + PartState(1:3,ParticleIndexNbr) = recvPartPos(DimSend*(i-1)+1:DimSend*(i-1)+3) + PDM%ParticleInside( ParticleIndexNbr) = .TRUE. + IF (TrackingMethod.EQ.REFMAPPING) THEN + CALL GetPositionInRefElem(PartState(1:3,ParticleIndexNbr),PartPosRef(1:3,ParticleIndexNbr),ElemID) + END IF ! TrackingMethod.EQ.REFMAPPING + PEM%GlobalElemID(ParticleIndexNbr) = ElemID mySumOfMatchedParticles = mySumOfMatchedParticles + 1 END DO @@ -1116,21 +1103,14 @@ SUBROUTINE SendEmissionParticlesToProcs(chunkSize,DimSend,FractNbr,iInit,mySumOf DO i = 1,PartMPILocate%nPartsRecv(1,iProc) ! Find a free position in the PDM array - ParticleIndexNbr = PDM%nextFreePosition(mySumOfMatchedParticles + 1 + PDM%CurrentNextFreePosition) - IF (ParticleIndexNbr.NE.0) THEN - ! Fill the PartState manually to avoid a second localization - PartState(1:3,ParticleIndexNbr) = EmissionRecvBuf(iProc)%content(PartCommSize*(i-1)+1:PartCommSize*(i-1)+3) - IF (TrackingMethod.EQ.REFMAPPING) THEN - PartPosRef(1:3,ParticleIndexNbr) = EmissionRecvBuf(iProc)%content(PartCommSize*(i-1)+4:PartCommSize*(i-1)+6) - END IF ! TrackingMethod.EQ.REFMAPPING - PEM%GlobalElemID(ParticleIndexNbr) = INT(EmissionRecvBuf(iProc)%content(PartCommSize*(i)),KIND=4) - PDM%ParticleInside( ParticleIndexNbr) = .TRUE. - ELSE - IPWRITE(UNIT_StdOut,'(I0,A,I0,A,I0,A)') " PDM%MaxParticleNumber = ", PDM%MaxParticleNumber," for each processor (",& - PDM%MaxParticleNumber*nProcessors," in total)" - IPWRITE(UNIT_StdOut,'(I0,A)') " Increase value for [Part-maxParticleNumber]!" - CALL ABORT(__STAMP__,'ERROR in ParticleMPIEmission:ParticleIndexNbr.EQ.0 - maximum nbr of particles reached?') - END IF + ParticleIndexNbr = GetNextFreePosition(mySumOfMatchedParticles+1) + ! Fill the PartState manually to avoid a second localization + PartState(1:3,ParticleIndexNbr) = EmissionRecvBuf(iProc)%content(PartCommSize*(i-1)+1:PartCommSize*(i-1)+3) + IF (TrackingMethod.EQ.REFMAPPING) THEN + PartPosRef(1:3,ParticleIndexNbr) = EmissionRecvBuf(iProc)%content(PartCommSize*(i-1)+4:PartCommSize*(i-1)+6) + END IF ! TrackingMethod.EQ.REFMAPPING + PEM%GlobalElemID(ParticleIndexNbr) = INT(EmissionRecvBuf(iProc)%content(PartCommSize*(i)),KIND=4) + PDM%ParticleInside( ParticleIndexNbr) = .TRUE. mySumOfMatchedParticles = mySumOfMatchedParticles + 1 END DO END DO diff --git a/src/particles/particle_operations.f90 b/src/particles/particle_operations.f90 index e30c4cfb0..461cbad42 100644 --- a/src/particles/particle_operations.f90 +++ b/src/particles/particle_operations.f90 @@ -46,7 +46,7 @@ SUBROUTINE CreateParticle(SpecID,Pos,GlobElemID,Velocity,RotEnergy,VibEnergy,Ele USE MOD_Eval_xyz ,ONLY: GetPositionInRefElem USE MOD_part_tools ,ONLY: CalcRadWeightMPF USE MOD_Particle_TimeStep ,ONLY: GetParticleTimeStep -USE MOD_Part_Tools ,ONLY: InRotRefFrameCheck +USE MOD_Part_Tools ,ONLY: InRotRefFrameCheck, GetNextFreePosition !----------------------------------------------------------------------------------------------------------------------------------! IMPLICIT NONE ! INPUT / OUTPUT VARIABLES @@ -64,15 +64,7 @@ SUBROUTINE CreateParticle(SpecID,Pos,GlobElemID,Velocity,RotEnergy,VibEnergy,Ele INTEGER :: newParticleID !=================================================================================================================================== -! Do not increase the ParticleVecLength for Phantom particles! -PDM%CurrentNextFreePosition = PDM%CurrentNextFreePosition + 1 -newParticleID = PDM%nextFreePosition(PDM%CurrentNextFreePosition) -IF(newParticleID.GT.PDM%ParticleVecLength) PDM%ParticleVecLength = PDM%ParticleVecLength + 1 - -IF(newParticleID.GT.PDM%MaxParticleNumber)THEN - CALL abort(__STAMP__,'CreateParticle: newParticleID.GT.PDM%MaxParticleNumber. '//& - 'Increase Part-maxParticleNumber or use more processors. newParticleID=',IntInfoOpt=newParticleID) -END IF +newParticleID = GetNextFreePosition() PartSpecies(newParticleID) = SpecID LastPartPos(1:3,newParticleID) = Pos(1:3) diff --git a/src/particles/particle_tools.f90 b/src/particles/particle_tools.f90 index 94b31e45a..7cec2b758 100644 --- a/src/particles/particle_tools.f90 +++ b/src/particles/particle_tools.f90 @@ -78,6 +78,7 @@ MODULE MOD_part_tools PUBLIC :: MergeCells,InRotRefFrameCheck PUBLIC :: CalcPartSymmetryPos PUBLIC :: RotateVectorAroundAxis +PUBLIC :: IncreaseMaxParticleNumber, GetNextFreePosition !=================================================================================================================================== CONTAINS @@ -219,7 +220,7 @@ SUBROUTINE UpdateNextFreePosition(WithOutMPIParts) ! Set nextFreePosition for occupied slots to zero PDM%nextFreePosition(counter+1:PDM%maxParticleNumber) = 0 ! If maxParticleNumber are inside, counter is greater than maxParticleNumber -IF (counter+1.GT.PDM%MaxParticleNumber) PDM%nextFreePosition(PDM%MaxParticleNumber) = 0 +! IF (counter+1.GT.PDM%MaxParticleNumber) PDM%nextFreePosition(PDM%MaxParticleNumber) = 0 #if USE_LOADBALANCE CALL LBPauseTime(LB_UNFP,tLBStart) @@ -1038,7 +1039,7 @@ END FUNCTION CalcEElec_particle SUBROUTINE MergeCells() !=================================================================================================================================== -!> Routine for virtual merging of neighbouring cells. +!> Routine for virtual merging of neighbouring cells. !> Currently, the merging is only done via the number of particles within the cells. !=================================================================================================================================== ! MODULES @@ -1062,7 +1063,7 @@ SUBROUTINE MergeCells() !Nullify every value DO iElem = 1, nElems VirtMergedCells(iElem)%isMerged = .FALSE. - VirtMergedCells(iElem)%MasterCell = 0 + VirtMergedCells(iElem)%MasterCell = 0 VirtMergedCells(iElem)%MergedVolume = 0.0 IF (VirtMergedCells(iElem)%NumOfMergedCells.GT.0) THEN DEALLOCATE(VirtMergedCells(iElem)%MergedCellID) @@ -1088,7 +1089,7 @@ SUBROUTINE MergeCells() IF(VirtualCellMergeSpread.GT.1) THEN IF (VirtMergedCells(iElem)%NumOfMergedCells.GT.0) THEN MasterCellID = VirtMergedCells(LocNBElem)%MasterCell-offSetElem - IF(VirtMergedCells(MasterCellID)%NumOfMergedCells.GE.(MaxNumOfMergedCells-1)) CYCLE NBElemLoop + IF(VirtMergedCells(MasterCellID)%NumOfMergedCells.GE.(MaxNumOfMergedCells-1)) CYCLE NBElemLoop ALLOCATE(tempCellID(VirtMergedCells(MasterCellID)%NumOfMergedCells)) tempCellID = VirtMergedCells(MasterCellID)%MergedCellID DEALLOCATE(VirtMergedCells(MasterCellID)%MergedCellID) @@ -1121,9 +1122,9 @@ SUBROUTINE MergeCells() VirtMergedCells(MasterCellID)%MergedCellID(1:VirtMergedCells(MasterCellID)%NumOfMergedCells-1) = & tempCellID(1:VirtMergedCells(MasterCellID)%NumOfMergedCells-1) VirtMergedCells(MasterCellID)%MergedCellID(VirtMergedCells(MasterCellID)%NumOfMergedCells) = iElem - VirtMergedCells(MasterCellID)%MergedVolume=VirtMergedCells(MasterCellID)%MergedVolume+ElemVolume_Shared(CNElemID) + VirtMergedCells(MasterCellID)%MergedVolume=VirtMergedCells(MasterCellID)%MergedVolume+ElemVolume_Shared(CNElemID) VirtMergedCells(iElem)%MasterCell = VirtMergedCells(LocNBElem)%MasterCell - VirtMergedCells(iElem)%isMerged = .TRUE. + VirtMergedCells(iElem)%isMerged = .TRUE. DEALLOCATE(tempCellID) CYCLE ElemLoop END IF @@ -1167,7 +1168,7 @@ SUBROUTINE MergeCells() VirtMergedCells(MasterCellID)%MergedCellID(1:VirtMergedCells(MasterCellID)%NumOfMergedCells-1) = & tempCellID(1:VirtMergedCells(MasterCellID)%NumOfMergedCells-1) VirtMergedCells(MasterCellID)%MergedCellID(VirtMergedCells(MasterCellID)%NumOfMergedCells) = iElem - VirtMergedCells(MasterCellID)%MergedVolume=VirtMergedCells(MasterCellID)%MergedVolume+ElemVolume_Shared(CNElemID) + VirtMergedCells(MasterCellID)%MergedVolume=VirtMergedCells(MasterCellID)%MergedVolume+ElemVolume_Shared(CNElemID) VirtMergedCells(iElem)%MasterCell = MasterCellID + offSetElem VirtMergedCells(iElem)%isMerged = .TRUE. DEALLOCATE(tempCellID) @@ -1188,8 +1189,8 @@ SUBROUTINE MergeCells() ALLOCATE(VirtMergedCells(iElem)%MergedCellID(VirtMergedCells(iElem)%NumOfMergedCells)) VirtMergedCells(iElem)%MergedCellID(VirtMergedCells(iElem)%NumOfMergedCells) = LocNBElem VirtMergedCells(iElem)%MergedVolume = VirtMergedCells(iElem)%MergedVolume + ElemVolume_Shared(CNNbElem) - VirtMergedCells(iElem)%MasterCell = iElem + offSetElem - VirtMergedCells(LocNBElem)%MasterCell = iElem + offSetElem + VirtMergedCells(iElem)%MasterCell = iElem + offSetElem + VirtMergedCells(LocNBElem)%MasterCell = iElem + offSetElem VirtMergedCells(LocNBElem)%isMerged = .TRUE. ELSE IF(VirtMergedCells(iElem)%NumOfMergedCells.GE.(MaxNumOfMergedCells-1)) CYCLE ElemLoop @@ -1202,14 +1203,14 @@ SUBROUTINE MergeCells() tempCellID(1:VirtMergedCells(iElem)%NumOfMergedCells-1) VirtMergedCells(iElem)%MergedCellID(VirtMergedCells(iElem)%NumOfMergedCells) = LocNBElem VirtMergedCells(iElem)%MergedVolume = VirtMergedCells(iElem)%MergedVolume + ElemVolume_Shared(CNNbElem) - VirtMergedCells(LocNBElem)%MasterCell = iElem + offSetElem + VirtMergedCells(LocNBElem)%MasterCell = iElem + offSetElem VirtMergedCells(LocNBElem)%isMerged = .TRUE. DEALLOCATE(tempCellID) END IF nPartMerged = nPartMerged + PEM%pNumber(LocNBElem) IF (nPartMerged.GT.MinPartNumCellMerge) CYCLE ElemLoop END IF - END DO NBElemLoop + END DO NBElemLoop END IF END DO ElemLoop @@ -1608,4 +1609,547 @@ PPURE FUNCTION RotateVectorAroundAxis(VecIn,Axis,Angle) END FUNCTION RotateVectorAroundAxis + +FUNCTION GetNextFreePosition(Offset) +!=================================================================================================================================== +!> Returns the next free position in the particle vector, if no space is available it increses the maximum particle number +!> ATTENTION: If optional argument is used, the PDM%CurrentNextFreePosition will not be updated +!=================================================================================================================================== +! MODULES +USE MOD_Globals +USE MOD_Particle_Vars ,ONLY: PDM +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES +INTEGER,OPTIONAL,INTENT(IN) :: Offset +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +INTEGER :: GetNextFreePosition +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +!=================================================================================================================================== +IF(PRESENT(Offset)) THEN + IF(PDM%CurrentNextFreePosition+Offset.GT.PDM%MaxParticleNumber) CALL IncreaseMaxParticleNumber() + GetNextFreePosition = PDM%nextFreePosition(PDM%CurrentNextFreePosition+Offset) + IF(GetNextFreePosition.EQ.0) THEN + CALL IncreaseMaxParticleNumber() + GetNextFreePosition = PDM%nextFreePosition(PDM%CurrentNextFreePosition+Offset) + END IF +ELSE + PDM%CurrentNextFreePosition = PDM%CurrentNextFreePosition + 1 + IF(PDM%CurrentNextFreePosition.GT.PDM%MaxParticleNumber) CALL IncreaseMaxParticleNumber() + GetNextFreePosition = PDM%nextFreePosition(PDM%CurrentNextFreePosition) + IF(GetNextFreePosition.EQ.0) THEN + CALL IncreaseMaxParticleNumber() + GetNextFreePosition = PDM%nextFreePosition(PDM%CurrentNextFreePosition) + END IF + IF(PDM%ParticleInside(GetNextFreePosition)) CALL ABORT(& + __STAMP__& + ,'This Particle is already in use',IntInfoOpt=PDM%MaxParticleNumber) + IF(GetNextFreePosition.GT.PDM%ParticleVecLength) PDM%ParticleVecLength = PDM%ParticleVecLength + 1 +END IF +IF(GetNextFreePosition.EQ.0) CALL ABORT(& +__STAMP__& +,'This should not happen, PDM%MaxParticleNumber reached',IntInfoOpt=PDM%MaxParticleNumber) + +END FUNCTION GetNextFreePosition + + +SUBROUTINE IncreaseMaxParticleNumber(Amount) +!=================================================================================================================================== +! Increases MaxParticleNumber and increases size of all depended arrays +!=================================================================================================================================== +! MODULES +USE MOD_Globals +USE MOD_Particle_Vars +USE MOD_DSMC_Vars +USE MOD_Particle_MPI_Vars ,ONLY: PartShiftVector, PartTargetProc +USE MOD_PICInterpolation_Vars ,ONLY: FieldAtParticle +#if defined(IMPA) || defined(ROS) +USE MOD_LinearSolver_Vars ,ONLY: PartXK, R_PartXK +#endif +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES +INTEGER,INTENT(IN),OPTIONAL :: Amount +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +INTEGER :: NewSize, i, ii, ALLOCSTAT +REAL,ALLOCATABLE :: Temp1Real(:),Temp2Real(:,:) +INTEGER,ALLOCATABLE :: Temp1Int(:)! ,Temp2Int(:,:) +LOGICAL,ALLOCATABLE :: Temp1Log(:) +TYPE (tAmbipolElecVelo), ALLOCATABLE :: AmbipolElecVelo_New(:) +TYPE (tElectronicDistriPart), ALLOCATABLE :: ElectronicDistriPart_New(:) +TYPE (tPolyatomMolVibQuant), ALLOCATABLE :: VibQuantsPar_New(:) +TYPE (tClonedParticles), ALLOCATABLE :: ClonedParticles_New(:,:) +! REAL :: +!=================================================================================================================================== +IF(PRESENT(Amount)) THEN + NewSize=PDM%MaxParticleNumber+Amount + IPWRITE(*,*) "Increase by amount" + IF(NewSize.GT.PDM%maxAllowedParticleNumber)CALL ABORT(& + __STAMP__& + ,'More Particles needed than allowed in PDM%maxAllowedParticleNumber',IntInfoOpt=NewSize) +ELSE + IF(PDM%MaxParticleNumber.EQ.PDM%maxAllowedParticleNumber)CALL ABORT(& + __STAMP__& + ,'More Particles needed than allowed in PDM%maxAllowedParticleNumber',IntInfoOpt=NewSize) + NewSize=MIN(MAX(CEILING(PDM%MaxParticleNumber*(1+PDM%MaxPartNumIncrease)),PDM%MaxParticleNumber+1),PDM%maxAllowedParticleNumber) + IPWRITE(*,*) "Increase by percent" +END IF + +IPWRITE(*,*) PDM%MaxParticleNumber,NewSize + + + +! __ __ __ __ _____ ________ ___ +! / / / /___ ____/ /___ _/ /____ / _/ | / /_ __/ / | ______________ ___ _______ +! / / / / __ \/ __ / __ `/ __/ _ \ / // |/ / / / / /| | / ___/ ___/ __ `/ / / / ___/ +! / /_/ / /_/ / /_/ / /_/ / /_/ __/ _/ // /| / / / / ___ |/ / / / / /_/ / /_/ (__ ) +! \____/ .___/\__,_/\__,_/\__/\___/ /___/_/ |_/ /_/ /_/ |_/_/ /_/ \__,_/\__, /____/ +! /_/ /____/ + + + +IF(ALLOCATED(PEM%GlobalElemID)) THEN + ALLOCATE(Temp1Int(NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in IncreaseMaxParticleNumber') + Temp1Int(1:PDM%MaxParticleNumber)=PEM%GlobalElemID + CALL MOVE_ALLOC(Temp1Int,PEM%GlobalElemID) +END IF + +IF(ALLOCATED(PEM%pNext)) THEN + ALLOCATE(Temp1Int(NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in IncreaseMaxParticleNumber') + Temp1Int(1:PDM%MaxParticleNumber)=PEM%pNext + CALL MOVE_ALLOC(Temp1Int,PEM%pNext) +END IF + +! IF(ALLOCATED(PEM%GlobalElemID)) THEN +! ALLOCATE(Temp1Int(NewSize),STAT=ALLOCSTAT) +! IF (ALLOCSTAT.NE.0) CALL ABORT(& +! __STAMP__& +! ,'Cannot allocate increased Array in IncreaseMaxParticleNumber') +! Temp1Int(1:PDM%MaxParticleNumber)=PEM%GlobalElemID +! CALL MOVE_ALLOC(Temp1Int,PEM%GlobalElemID) +! END IF + +IF(ALLOCATED(PEM%LastGlobalElemID)) THEN + ALLOCATE(Temp1Int(NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in IncreaseMaxParticleNumber') + Temp1Int(1:PDM%MaxParticleNumber)=PEM%LastGlobalElemID + CALL MOVE_ALLOC(Temp1Int,PEM%LastGlobalElemID) +END IF + +IF(ALLOCATED(PDM%PartInit)) THEN + ALLOCATE(Temp1Int(NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in IncreaseMaxParticleNumber') + Temp1Int(1:PDM%MaxParticleNumber)=PDM%PartInit + CALL MOVE_ALLOC(Temp1Int,PDM%PartInit) +END IF + +#if defined(IMPA) || defined(ROS) +IF(ALLOCATED(PartXK)) THEN + ALLOCATE(Temp2Int(6,NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in IncreaseMaxParticleNumber') + Temp2Int(:,1:PDM%MaxParticleNumber)=PartXK + CALL MOVE_ALLOC(Temp2Int,PartXK) +END IF + +IF(ALLOCATED(R_PartXK)) THEN + ALLOCATE(Temp2Int(6,NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in IncreaseMaxParticleNumber') + Temp2Int(:,1:PDM%MaxParticleNumber)=R_PartXK + CALL MOVE_ALLOC(Temp2Int,R_PartXK) +END IF +#endif + +IF(ALLOCATED(PartSpecies)) THEN + ALLOCATE(Temp1Int(NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in IncreaseMaxParticleNumber') + Temp1Int(1:PDM%MaxParticleNumber)=PartSpecies + CALL MOVE_ALLOC(Temp1Int,PartSpecies) +END IF + +IF(ALLOCATED(InterPlanePartIndx)) THEN + ALLOCATE(Temp1Int(NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in IncreaseMaxParticleNumber') + Temp1Int(1:PDM%MaxParticleNumber)=InterPlanePartIndx + CALL MOVE_ALLOC(Temp1Int,InterPlanePartIndx) +END IF + +IF(ALLOCATED(BGGas%PairingPartner)) THEN + ALLOCATE(Temp1Int(NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in IncreaseMaxParticleNumber') + Temp1Int(1:PDM%MaxParticleNumber)=BGGas%PairingPartner + CALL MOVE_ALLOC(Temp1Int,BGGas%PairingPartner) +END IF + +IF(ALLOCATED(CollInf%OldCollPartner)) THEN + ALLOCATE(Temp1Int(NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in IncreaseMaxParticleNumber') + Temp1Int(1:PDM%MaxParticleNumber)=CollInf%OldCollPartner + CALL MOVE_ALLOC(Temp1Int,CollInf%OldCollPartner) +END IF + +IF(ALLOCATED(PartTargetProc)) THEN + ALLOCATE(Temp1Int(NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in IncreaseMaxParticleNumber') + Temp1Int(1:PDM%MaxParticleNumber)=PartTargetProc + CALL MOVE_ALLOC(Temp1Int,PartTargetProc) +END IF + +! __ __ __ __ ____ _________ __ ___ +! / / / /___ ____/ /___ _/ /____ / __ \/ ____/ | / / / | ______________ ___ _______ +! / / / / __ \/ __ / __ `/ __/ _ \ / /_/ / __/ / /| | / / / /| | / ___/ ___/ __ `/ / / / ___/ +! / /_/ / /_/ / /_/ / /_/ / /_/ __/ / _, _/ /___/ ___ |/ /___ / ___ |/ / / / / /_/ / /_/ (__ ) +! \____/ .___/\__,_/\__,_/\__/\___/ /_/ |_/_____/_/ |_/_____/ /_/ |_/_/ /_/ \__,_/\__, /____/ +! /_/ /____/ + + + +IF(ALLOCATED(PartState)) THEN + ALLOCATE(Temp2Real(6,NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in IncreaseMaxParticleNumber') + Temp2Real(:,1:PDM%MaxParticleNumber)=PartState + CALL MOVE_ALLOC(Temp2Real,PartState) +END IF + +IF(ALLOCATED(PartPosRef)) THEN + ALLOCATE(Temp2Real(3,NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in IncreaseMaxParticleNumber') + Temp2Real(:,1:PDM%MaxParticleNumber)=PartPosRef + CALL MOVE_ALLOC(Temp2Real,PartPosRef) +END IF + +#if (PP_TimeDiscMethod==508) || (PP_TimeDiscMethod==509) +IF(ALLOCATED(velocityAtTime)) THEN + ALLOCATE(Temp2Real(3,NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in IncreaseMaxParticleNumber') + Temp2Real(:,1:PDM%MaxParticleNumber)=velocityAtTime + CALL MOVE_ALLOC(Temp2Real,velocityAtTime) +END IF +#endif + +IF(ALLOCATED(Pt_temp)) THEN + ALLOCATE(Temp2Real(6,NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in IncreaseMaxParticleNumber') + Temp2Real(:,1:PDM%MaxParticleNumber)=Pt_temp + CALL MOVE_ALLOC(Temp2Real,Pt_temp) +END IF + +IF(ALLOCATED(LastPartPos)) THEN + ALLOCATE(Temp2Real(3,NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in IncreaseMaxParticleNumber') + Temp2Real(:,1:PDM%MaxParticleNumber)=LastPartPos + CALL MOVE_ALLOC(Temp2Real,LastPartPos) +END IF + +IF(ALLOCATED(Pt)) THEN + ALLOCATE(Temp2Real(3,NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in IncreaseMaxParticleNumber') + Temp2Real(:,1:PDM%MaxParticleNumber)=Pt + CALL MOVE_ALLOC(Temp2Real,Pt) +END IF + +IF(ALLOCATED(PartTimeStep)) THEN + ALLOCATE(Temp1Real(NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in IncreaseMaxParticleNumber') + Temp1Real(1:PDM%MaxParticleNumber)=PartTimeStep + CALL MOVE_ALLOC(Temp1Real,PartTimeStep) +END IF + +IF(ALLOCATED(PartMPF)) THEN + ALLOCATE(Temp1Real(NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in IncreaseMaxParticleNumber') + Temp1Real(1:PDM%MaxParticleNumber)=PartMPF + CALL MOVE_ALLOC(Temp1Real,PartMPF) +END IF + +IF(ALLOCATED(PartVeloRotRef)) THEN + ALLOCATE(Temp2Real(3,NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in IncreaseMaxParticleNumber') + Temp2Real(:,1:PDM%MaxParticleNumber)=PartVeloRotRef + CALL MOVE_ALLOC(Temp2Real,PartVeloRotRef) +END IF + +IF(ALLOCATED(PartStateIntEn)) THEN + IF (DSMC%ElectronicModel.GT.0) THEN + ALLOCATE(Temp2Real(3,NewSize),STAT=ALLOCSTAT) + ELSE + ALLOCATE(Temp2Real(2,NewSize),STAT=ALLOCSTAT) + END IF + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in IncreaseMaxParticleNumber') + Temp2Real(:,1:PDM%MaxParticleNumber)=PartStateIntEn + CALL MOVE_ALLOC(Temp2Real,PartStateIntEn) +END IF + +IF(ALLOCATED(PartShiftVector)) THEN + ALLOCATE(Temp2Real(3,NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in IncreaseMaxParticleNumber') + Temp2Real(:,1:PDM%MaxParticleNumber)=PartShiftVector + CALL MOVE_ALLOC(Temp2Real,PartShiftVector) +END IF + +IF(ALLOCATED(FieldAtParticle)) THEN + ALLOCATE(Temp2Real(6,NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in IncreaseMaxParticleNumber') + Temp2Real(:,1:PDM%MaxParticleNumber)=FieldAtParticle + CALL MOVE_ALLOC(Temp2Real,FieldAtParticle) +END IF + + + +! __ __ __ __ __ ____ ___________________ __ ___ +! / / / /___ ____/ /___ _/ /____ / / / __ \/ ____/ _/ ____/ | / / / | ______________ ___ _______ +! / / / / __ \/ __ / __ `/ __/ _ \ / / / / / / / __ / // / / /| | / / / /| | / ___/ ___/ __ `/ / / / ___/ +! / /_/ / /_/ / /_/ / /_/ / /_/ __/ / /___/ /_/ / /_/ // // /___/ ___ |/ /___ / ___ |/ / / / / /_/ / /_/ (__ ) +! \____/ .___/\__,_/\__,_/\__/\___/ /_____/\____/\____/___/\____/_/ |_/_____/ /_/ |_/_/ /_/ \__,_/\__, /____/ +! /_/ /____/ + + + +IF(ALLOCATED(PDM%ParticleInside)) THEN + ALLOCATE(Temp1Log(NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in IncreaseMaxParticleNumber') + Temp1Log(1:PDM%MaxParticleNumber)=PDM%ParticleInside + CALL MOVE_ALLOC(Temp1Log,PDM%ParticleInside) + PDM%ParticleInside(PDM%maxParticleNumber+1:NewSize)=.FALSE. +END IF + +IF(ALLOCATED(PDM%IsNewPart)) THEN + ALLOCATE(Temp1Log(NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in IncreaseMaxParticleNumber') + Temp1Log(1:PDM%MaxParticleNumber)=PDM%IsNewPart + CALL MOVE_ALLOC(Temp1Log,PDM%IsNewPart) + PDM%IsNewPart(PDM%maxParticleNumber+1:NewSize)=.FALSE. +END IF + +IF(ALLOCATED(PDM%dtFracPush)) THEN + ALLOCATE(Temp1Log(NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in IncreaseMaxParticleNumber') + Temp1Log(1:PDM%MaxParticleNumber)=PDM%dtFracPush + CALL MOVE_ALLOC(Temp1Log,PDM%dtFracPush) + PDM%dtFracPush(PDM%maxParticleNumber+1:NewSize)=.FALSE. +END IF + +IF(ALLOCATED(PDM%InRotRefFrame)) THEN + ALLOCATE(Temp1Log(NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in IncreaseMaxParticleNumber') + Temp1Log(1:PDM%MaxParticleNumber)=PDM%InRotRefFrame + CALL MOVE_ALLOC(Temp1Log,PDM%InRotRefFrame) + PDM%InRotRefFrame(PDM%maxParticleNumber+1:NewSize)=.FALSE. +END IF + +IF(ALLOCATED(ElecRelaxPart)) THEN + ALLOCATE(Temp1Log(NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in IncreaseMaxParticleNumber') + Temp1Log(1:PDM%MaxParticleNumber)=ElecRelaxPart + DEALLOCATE(ElecRelaxPart) + CALL MOVE_ALLOC(Temp1Log,ElecRelaxPart) +END IF + + + +! __ __ __ __ ________ ______ ___________ ___ +! / / / /___ ____/ /___ _/ /____ /_ __/\ \/ / __ \/ ____/ ___/ / | ______________ ___ _______ +! / / / / __ \/ __ / __ `/ __/ _ \ / / \ / /_/ / __/ \__ \ / /| | / ___/ ___/ __ `/ / / / ___/ +! / /_/ / /_/ / /_/ / /_/ / /_/ __/ / / / / ____/ /___ ___/ / / ___ |/ / / / / /_/ / /_/ (__ ) +! \____/ .___/\__,_/\__,_/\__/\___/ /_/ /_/_/ /_____//____/ /_/ |_/_/ /_/ \__,_/\__, /____/ +! /_/ /____/ + +IF(ALLOCATED(AmbipolElecVelo)) THEN + ALLOCATE(AmbipolElecVelo_New(NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in IncreaseMaxParticleNumber') + DO i=1,PDM%maxParticleNumber + CALL MOVE_ALLOC(AmbipolElecVelo(i)%ElecVelo,AmbipolElecVelo_New(i)%ElecVelo) + END DO + DEALLOCATE(AmbipolElecVelo) + CALL MOVE_ALLOC(AmbipolElecVelo_New,AmbipolElecVelo) +END IF + +IF(ALLOCATED(ElectronicDistriPart)) THEN + ALLOCATE(ElectronicDistriPart_New(NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in IncreaseMaxParticleNumber') + DO i=1,PDM%maxParticleNumber + CALL MOVE_ALLOC(ElectronicDistriPart(i)%DistriFunc,ElectronicDistriPart_New(i)%DistriFunc) + END DO + DEALLOCATE(ElectronicDistriPart) + CALL MOVE_ALLOC(ElectronicDistriPart_New,ElectronicDistriPart) +END IF + +IF(ALLOCATED(VibQuantsPar)) THEN + ALLOCATE(VibQuantsPar_New(NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in IncreaseMaxParticleNumber') + DO i=1,PDM%maxParticleNumber + CALL MOVE_ALLOC(VibQuantsPar(i)%Quants,VibQuantsPar_New(i)%Quants) + END DO + DEALLOCATE(VibQuantsPar) + CALL MOVE_ALLOC(VibQuantsPar_New,VibQuantsPar) +END IF + +IF(ALLOCATED(ClonedParticles)) THEN + SELECT CASE(RadialWeighting%CloneMode) + CASE(1) + ALLOCATE(ClonedParticles_new(1:INT(NewSize/RadialWeighting%CloneInputDelay),0:(RadialWeighting%CloneInputDelay-1)),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& + __STAMP__& + ,'Cannot allocate increased Array in IncreaseMaxParticleNumber') + DO ii=0,RadialWeighting%CloneInputDelay-1 + DO i=1,RadialWeighting%ClonePartNum(ii) + ClonedParticles_new(i,ii)%Species=ClonedParticles(i,ii)%Species + ClonedParticles_new(i,ii)%PartState(1:6)=ClonedParticles(i,ii)%PartState(1:6) + ClonedParticles_new(i,ii)%PartStateIntEn(1:3)=ClonedParticles(i,ii)%PartStateIntEn(1:3) + ClonedParticles_new(i,ii)%Element=ClonedParticles(i,ii)%Element + ClonedParticles_new(i,ii)%LastPartPos(1:3)=ClonedParticles(i,ii)%LastPartPos(1:3) + ClonedParticles_new(i,ii)%WeightingFactor=ClonedParticles(i,ii)%WeightingFactor + CALL MOVE_ALLOC(ClonedParticles(i,ii)%VibQuants,ClonedParticles_new(i,ii)%VibQuants) + CALL MOVE_ALLOC(ClonedParticles(i,ii)%DistriFunc,ClonedParticles_new(i,ii)%DistriFunc) + CALL MOVE_ALLOC(ClonedParticles(i,ii)%AmbiPolVelo,ClonedParticles_new(i,ii)%AmbiPolVelo) + END DO + END DO + DEALLOCATE(ClonedParticles) + CALL MOVE_ALLOC(ClonedParticles_New,ClonedParticles) + CASE(2) + ALLOCATE(ClonedParticles_new(1:INT(NewSize/RadialWeighting%CloneInputDelay),0:RadialWeighting%CloneInputDelay),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& + __STAMP__& + ,'Cannot allocate increased Array in IncreaseMaxParticleNumber') + DO ii=0,RadialWeighting%CloneInputDelay + DO i=1,RadialWeighting%ClonePartNum(ii) + ClonedParticles_new(i,ii)%Species=ClonedParticles(i,ii)%Species + ClonedParticles_new(i,ii)%PartState(1:6)=ClonedParticles(i,ii)%PartState(1:6) + ClonedParticles_new(i,ii)%PartStateIntEn(1:3)=ClonedParticles(i,ii)%PartStateIntEn(1:3) + ClonedParticles_new(i,ii)%Element=ClonedParticles(i,ii)%Element + ClonedParticles_new(i,ii)%LastPartPos(1:3)=ClonedParticles(i,ii)%LastPartPos(1:3) + ClonedParticles_new(i,ii)%WeightingFactor=ClonedParticles(i,ii)%WeightingFactor + CALL MOVE_ALLOC(ClonedParticles(i,ii)%VibQuants,ClonedParticles_new(i,ii)%VibQuants) + CALL MOVE_ALLOC(ClonedParticles(i,ii)%DistriFunc,ClonedParticles_new(i,ii)%DistriFunc) + CALL MOVE_ALLOC(ClonedParticles(i,ii)%AmbiPolVelo,ClonedParticles_new(i,ii)%AmbiPolVelo) + END DO + END DO + DEALLOCATE(ClonedParticles) + CALL MOVE_ALLOC(ClonedParticles_New,ClonedParticles) + CASE DEFAULT + CALL Abort(& + __STAMP__,& + 'ERROR in Radial Weighting of 2D/Axisymmetric: The selected cloning mode is not available! Choose between 1 and 2.'//& + ' CloneMode=1: Delayed insertion of clones; CloneMode=2: Delayed randomized insertion of clones') +END SELECT +END IF + + + + +IF(ALLOCATED(PDM%nextFreePosition)) THEN + + ! WRITE(*,*) "Size:",SIZE(PDM%nextFreePosition) + ! DO i=1,PDM%MaxParticleNumber + ! WRITE(*,*) PDM%nextFreePosition(i) + ! END DO + ! WRITE(*,*) + + ALLOCATE(Temp1Int(NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in IncreaseMaxParticleNumber') + Temp1Int(1:PDM%MaxParticleNumber)=PDM%nextFreePosition + CALL MOVE_ALLOC(Temp1Int,PDM%nextFreePosition) + + PDM%nextFreePosition(PDM%MaxParticleNumber+1:NewSize)=0 + + !Search for first entry where new poition is available + i=1 + DO WHILE(PDM%nextFreePosition(i).NE.0) + i=i+1 + END DO + i=i-1 + ! Fill the free spots with the new entrys + DO ii=1,NewSize-PDM%MaxParticleNumber + PDM%nextFreePosition(i+ii)=ii+PDM%MaxParticleNumber + END DO + + ! WRITE(*,*) "Size:",SIZE(PDM%nextFreePosition) + ! DO i=1,NewSize + ! WRITE(*,*) PDM%nextFreePosition(i) + ! END DO + ! WRITE(*,*) + + +END IF + +! Update NextFreePos + +PDM%MaxParticleNumber=NewSize + +! read(*,*) + +END SUBROUTINE IncreaseMaxParticleNumber + + + END MODULE MOD_part_tools diff --git a/src/particles/particle_vMPF.f90 b/src/particles/particle_vMPF.f90 index e948dbf3d..925597508 100644 --- a/src/particles/particle_vMPF.f90 +++ b/src/particles/particle_vMPF.f90 @@ -265,7 +265,7 @@ SUBROUTINE MergeParticles(iPartIndx_Node_in, nPart, nPartNew, iElem) END IF END IF DOF_rot = SpecDSMC(iSpec)%Xi_Rot - T_rot = 2.*E_rot/(DOF_rot*totalWeight*BoltzmannConst) + T_rot = 2.*E_rot/(DOF_rot*totalWeight*BoltzmannConst) END IF IF(DSMC%ElectronicModel.GT.0.AND.SpecDSMC(iSpec)%InterID.NE.4) THEN T_elec = CalcTelec(E_elec/totalWeight, iSpec) @@ -323,7 +323,7 @@ SUBROUTINE MergeParticles(iPartIndx_Node_in, nPart, nPartNew, iElem) IF(DSMC%ElectronicModel.GT.0.AND.SpecDSMC(iSpec)%InterID.NE.4) THEN Energy_Sum = E_elec IF (E_elec.GT.0.0) THEN - IF (E_elec_new.EQ.0.0) THEN + IF (E_elec_new.EQ.0.0) THEN ! E_elec_new = 0.0 DO iLoop = 1, nPartNew ! temporal continuous energy distribution iPart = iPartIndx_Node(iLoop) @@ -333,7 +333,7 @@ SUBROUTINE MergeParticles(iPartIndx_Node_in, nPart, nPartNew, iElem) partWeight = GetParticleWeight(iPart) E_elec_new = E_elec_new + partWeight * PartStateIntEn(3,iPart) END DO - END IF + END IF alpha = E_elec/E_elec_new DO iLoop = 1, nPartNew ! alpha = E_elec/E_elec_new @@ -371,7 +371,7 @@ SUBROUTINE MergeParticles(iPartIndx_Node_in, nPart, nPartNew, iElem) Energy_Sum = Energy_Sum + E_vib IF (E_vib.GT.0.0) THEN IF (E_vib_new.EQ.0.0) THEN - IF(SpecDSMC(iSpec)%PolyatomicMol) THEN + IF(SpecDSMC(iSpec)%PolyatomicMol) THEN DO iLoop = 1, nPartNew ! temporal continuous energy distribution iPart = iPartIndx_Node(iLoop) PartStateIntEn(1,iPart) = 0.0 @@ -402,7 +402,7 @@ SUBROUTINE MergeParticles(iPartIndx_Node_in, nPart, nPartNew, iElem) END DO END DO END IF - END IF + END IF alpha = E_vib/E_vib_new DO iLoop = 1, nPartNew iPart = iPartIndx_Node(iLoop) @@ -445,7 +445,7 @@ SUBROUTINE MergeParticles(iPartIndx_Node_in, nPart, nPartNew, iElem) Energy_Sum = 0.0 ! 6.3) ensuring rotational excitation - alpha = E_rot/E_rot_new + alpha = E_rot/E_rot_new DO iLoop = 1, nPartNew iPart = iPartIndx_Node(iLoop) partWeight = GetParticleWeight(iPart) @@ -558,6 +558,7 @@ SUBROUTINE SplitParticles(iPartIndx_Node, nPartIn, nPartNew) USE MOD_Particle_Vars ,ONLY: UseVarTimeStep, PartTimeStep USE MOD_DSMC_Vars ,ONLY: PartStateIntEn, CollisMode, SpecDSMC, DSMC, PolyatomMolDSMC, VibQuantsPar USE MOD_Particle_Tracking_Vars,ONLY: TrackingMethod +USE MOD_Part_Tools ,ONLY: GetNextFreePosition !#ifdef CODE_ANALYZE !USE MOD_Globals ,ONLY: unit_stdout,myrank,abort !USE MOD_Particle_Vars ,ONLY: Symmetry @@ -579,13 +580,13 @@ SUBROUTINE SplitParticles(iPartIndx_Node, nPartIn, nPartNew) iNewPart = 0 nPart = nPartIn nSplit = nPartNew - nPart -DO WHILE(iNewPart.LT.nSplit) +DO iNewPart=1,nSplit ! Get a random particle (only from the initially available) CALL RANDOM_NUMBER(iRan) iPart = INT(iRan*nPart) + 1 PartIndx = iPartIndx_Node(iPart) ! Check whether the weighting factor would drop below vMPFSplitLimit (can be below one) - ! If the resulting MPF is less than 1 you go sub-atomic where the concept of time and space become irrelevant... + ! If the resulting MPF is less than 1 you go sub-atomic where the concept of time and space become irrelevant... IF((PartMPF(PartIndx) / 2.).LT.vMPFSplitLimit) THEN ! Skip this particle iPartIndx_Node(iPart) = iPartIndx_Node(nPart) @@ -598,9 +599,7 @@ SUBROUTINE SplitParticles(iPartIndx_Node, nPartIn, nPartNew) IF((PartMPF(PartIndx) / 2.).LT.vMPFSplitLimit) CALL abort(__STAMP__,'Particle split below limit: PartMPF(PartIndx) / 2.=',& RealInfoOpt=PartMPF(PartIndx) / 2.) PartMPF(PartIndx) = PartMPF(PartIndx) / 2. ! split particle - iNewPart = iNewPart + 1 - PositionNbr = PDM%nextFreePosition(iNewPart+PDM%CurrentNextFreePosition) - IF (PositionNbr.EQ.0) CALL Abort(__STAMP__,'ERROR in particle split: MaxParticleNumber reached!') + PositionNbr = GetNextFreePosition() PartState(1:6,PositionNbr) = PartState(1:6,PartIndx) IF(TrackingMethod.EQ.REFMAPPING) PartPosRef(1:3,PositionNbr)=PartPosRef(1:3,PartIndx) PartSpecies(PositionNbr) = PartSpecies(PartIndx) @@ -626,9 +625,6 @@ SUBROUTINE SplitParticles(iPartIndx_Node, nPartIn, nPartNew) PEM%pNumber(LocalElemID) = PEM%pNumber(LocalElemID) + 1 END DO -! Advance particle vector length and the current next free position with newly created particles -PDM%ParticleVecLength = PDM%ParticleVecLength + iNewPart -PDM%CurrentNextFreePosition = PDM%CurrentNextFreePosition + iNewPart END SUBROUTINE SplitParticles diff --git a/src/particles/particle_vars.f90 b/src/particles/particle_vars.f90 index 313c01b56..a754d4883 100644 --- a/src/particles/particle_vars.f90 +++ b/src/particles/particle_vars.f90 @@ -195,8 +195,10 @@ PPURE INTEGER FUNCTION ElemID_INTERFACE(iPart) TYPE tParticleDataManagement INTEGER :: CurrentNextFreePosition ! Index of nextfree index in nextFreePosition-Array INTEGER :: maxParticleNumber ! Maximum Number of all Particles + INTEGER :: maxAllowedParticleNumber ! Maximum Number of all Particles INTEGER :: ParticleVecLength ! Vector Length for Particle Push Calculation INTEGER :: ParticleVecLengthOld ! Vector Length for Particle Push Calculation + REAL :: MaxPartNumIncrease ! How much shall the PDM%MaxParticleNumber be incresed if it is full INTEGER , ALLOCATABLE :: PartInit(:) ! (1:NParts), initial emission condition number ! the calculation area INTEGER ,ALLOCATABLE :: nextFreePosition(:) ! =>NULL() ! next_free_Position(1:maxParticleNumber) @@ -219,9 +221,9 @@ PPURE INTEGER FUNCTION ElemID_INTERFACE(iPart) INTEGER :: MacroValSamplIterNum ! Number of iterations for sampling ! macroscopic values LOGICAL :: SampleElecExcitation ! Sampling the electronic excitation rate per species -INTEGER :: ExcitationLevelCounter ! -REAL, ALLOCATABLE :: ExcitationSampleData(:,:) ! -INTEGER, ALLOCATABLE :: ExcitationLevelMapping(:,:) ! +INTEGER :: ExcitationLevelCounter ! +REAL, ALLOCATABLE :: ExcitationSampleData(:,:) ! +INTEGER, ALLOCATABLE :: ExcitationLevelMapping(:,:) ! INTEGER, ALLOCATABLE :: vMPFMergeThreshold(:) ! Max particle number per cell and (iSpec) INTEGER, ALLOCATABLE :: vMPFSplitThreshold(:) ! Min particle number per cell and (iSpec) @@ -284,7 +286,7 @@ PPURE INTEGER FUNCTION ElemID_INTERFACE(iPart) REAL :: RotRefFrameFreq ! frequency of rotational frame of reference REAL :: RotRefFrameOmega(3) ! angular velocity of rotational frame of reference INTEGER :: nRefFrameRegions ! number of rotational frame of reference regions -REAL, ALLOCATABLE :: RotRefFramRegion(:,:) ! MIN/MAX defintion for multiple rotational frame of reference region +REAL, ALLOCATABLE :: RotRefFramRegion(:,:) ! MIN/MAX defintion for multiple rotational frame of reference region ! (i,RegionNumber), MIN:i=1, MAX:i=2 !=================================================================================================================================== END MODULE MOD_Particle_Vars diff --git a/src/particles/pic/deposition/pic_depo_tools.f90 b/src/particles/pic/deposition/pic_depo_tools.f90 index 10440aa81..1d7f976d7 100644 --- a/src/particles/pic/deposition/pic_depo_tools.f90 +++ b/src/particles/pic/deposition/pic_depo_tools.f90 @@ -54,6 +54,7 @@ SUBROUTINE DepositPhotonSEEHoles(iBC,NbrOfParticle) USE MOD_PICDepo_Vars ,ONLY: DoDeposition USE MOD_Dielectric_Vars ,ONLY: DoDielectricSurfaceCharge USE MOD_Particle_Vars ,ONLY: PEM, PDM, PartSpecies, PartState, Species, usevMPF, PartMPF +USE MOD_Part_Tools ,ONLY: GetNextFreePosition IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------! ! INPUT / OUTPUT VARIABLES @@ -72,7 +73,7 @@ SUBROUTINE DepositPhotonSEEHoles(iBC,NbrOfParticle) IF(DoDeposition.AND.DoDielectricSurfaceCharge.AND.PartBound%Dielectric(iBC))THEN DO iPart = 1, NbrOfParticle ! Get index from next free position array - ParticleIndex = PDM%nextFreePosition(iPart+PDM%CurrentNextFreePosition) + ParticleIndex = GetNextFreePosition(iPart) ! Get charge IF(usevMPF)THEN diff --git a/src/particles/pic/models/pic_models.f90 b/src/particles/pic/models/pic_models.f90 index 69954f8f2..9b86ca374 100644 --- a/src/particles/pic/models/pic_models.f90 +++ b/src/particles/pic/models/pic_models.f90 @@ -70,6 +70,7 @@ SUBROUTINE ADK_Bruhwiler2003() USE MOD_Particle_Vars ,ONLY: PDM, Species, PartSpecies, usevMPF, PartState, PEM, PartMPF USE MOD_DSMC_Vars ,ONLY: DSMC, SpecDSMC USE MOD_PICInterpolation_Vars ,ONLY: FieldAtParticle +USE MOD_Part_Tools ,ONLY: GetNextFreePosition ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -78,7 +79,7 @@ SUBROUTINE ADK_Bruhwiler2003() ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -INTEGER :: iPart, MaxElecQua, ChargedNum, SumOfFormedParticles, ElectronIndex +INTEGER :: iPart, MaxElecQua, ChargedNum, ElectronIndex REAL :: IonizationEnergy_eV, iRan, QuantumTunnelProb, EffQuantNum REAL :: CriticalValue_GV REAL :: E_GV @@ -90,7 +91,6 @@ SUBROUTINE ADK_Bruhwiler2003() REAL(KIND=8) :: b(KK) = (/(ii, ii=1,KK, 1)/) #endif /* CODE_ANALYZE */ !=================================================================================================================================== -SumOfFormedParticles = 0 DO iPart = 1, PDM%ParticleVecLength IF(PDM%ParticleInside(iPart)) THEN @@ -139,12 +139,7 @@ SUBROUTINE ADK_Bruhwiler2003() CALL RANDOM_NUMBER(iRan) IF(QuantumTunnelProb.GT.iRan) THEN !.... Get free particle index for the 3rd particle produced - SumOfFormedParticles = SumOfFormedParticles + 1 - ElectronIndex = PDM%nextFreePosition(SumOfFormedParticles+PDM%CurrentNextFreePosition) - IF (ElectronIndex.EQ.0) THEN - CALL abort(__STAMP__,& - 'New Particle Number greater max Part Num in Field Ionization.') - END IF + ElectronIndex = GetNextFreePosition() !Set new Species of new particle PDM%ParticleInside(ElectronIndex) = .TRUE. PartSpecies(ElectronIndex) = DSMC%ElectronSpecies @@ -162,9 +157,6 @@ SUBROUTINE ADK_Bruhwiler2003() END IF END DO -PDM%ParticleVecLength = PDM%ParticleVecLength + SumOfFormedParticles -PDM%CurrentNextFreePosition = PDM%CurrentNextFreePosition + SumOfFormedParticles - END SUBROUTINE ADK_Bruhwiler2003 @@ -182,6 +174,7 @@ SUBROUTINE ADK_Yu2018() USE MOD_Particle_Vars ,ONLY: PDM, Species, PartSpecies, usevMPF, PartState, PEM, PartMPF USE MOD_DSMC_Vars ,ONLY: DSMC, SpecDSMC USE MOD_PICInterpolation_Vars ,ONLY: FieldAtParticle +USE MOD_Part_Tools ,ONLY: GetNextFreePosition ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -190,7 +183,7 @@ SUBROUTINE ADK_Yu2018() ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -INTEGER :: iPart, MaxElecQua, SumOfFormedParticles, ElectronIndex +INTEGER :: iPart, MaxElecQua, ElectronIndex REAL :: IonizationEnergy_eV, iRan, QuantumTunnelProb REAL :: n #ifdef CODE_ANALYZE @@ -202,7 +195,6 @@ SUBROUTINE ADK_Yu2018() REAL :: E #endif /* CODE_ANALYZE */ !=================================================================================================================================== -SumOfFormedParticles = 0 DO iPart = 1, PDM%ParticleVecLength IF(PDM%ParticleInside(iPart)) THEN @@ -240,8 +232,7 @@ SUBROUTINE ADK_Yu2018() CALL RANDOM_NUMBER(iRan) IF(QuantumTunnelProb.GT.iRan) THEN !.... Get free particle index for the 3rd particle produced - SumOfFormedParticles = SumOfFormedParticles + 1 - ElectronIndex = PDM%nextFreePosition(SumOfFormedParticles+PDM%CurrentNextFreePosition) + ElectronIndex = GetNextFreePosition() IF (ElectronIndex.EQ.0) THEN CALL abort(__STAMP__,& 'New Particle Number greater max Part Num in Field Ionization.') @@ -263,9 +254,6 @@ SUBROUTINE ADK_Yu2018() END IF END DO -PDM%ParticleVecLength = PDM%ParticleVecLength + SumOfFormedParticles -PDM%CurrentNextFreePosition = PDM%CurrentNextFreePosition + SumOfFormedParticles - END SUBROUTINE ADK_Yu2018 diff --git a/src/particles/restart/particle_restart.f90 b/src/particles/restart/particle_restart.f90 index aec9ecfac..78979aeeb 100644 --- a/src/particles/restart/particle_restart.f90 +++ b/src/particles/restart/particle_restart.f90 @@ -84,7 +84,7 @@ SUBROUTINE ParticleRestart() #endif /*USE_LOADBALANCE*/ ! Rotational frame of reference USE MOD_Particle_Vars ,ONLY: UseRotRefFrame, PartVeloRotRef, RotRefFrameOmega -USE MOD_Part_Tools ,ONLY: InRotRefFrameCheck +USE MOD_Part_Tools ,ONLY: InRotRefFrameCheck, IncreaseMaxParticleNumber ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -137,6 +137,7 @@ SUBROUTINE ParticleRestart() LastElemInd = offsetElem+PP_nElems locnPart = PartInt(ELEM_LastPartInd,LastElemInd)-PartInt(ELEM_FirstPartInd,FirstElemInd) offsetnPart = PartInt(ELEM_FirstPartInd,FirstElemInd) + CALL IncreaseMaxParticleNumber(locnPart) DO iLoop = 1_IK,locnPart ! Sanity check: SpecID > 0 @@ -781,7 +782,7 @@ SUBROUTINE ParticleRestart() NbrOfLostParticles = 0 END IF ! NbrOfMissingParticles.GT.0 #endif /*USE_MPI*/ - + CALL IncreaseMaxParticleNumber() CALL UpdateNextFreePosition() ! Read-in the stored cloned particles diff --git a/src/particles/ttm/ttm_init.f90 b/src/particles/ttm/ttm_init.f90 index 4bd85de33..f49532771 100644 --- a/src/particles/ttm/ttm_init.f90 +++ b/src/particles/ttm/ttm_init.f90 @@ -774,6 +774,7 @@ SUBROUTINE InitIMD_TTM_Coupling() USE MOD_part_emission_tools ,ONLY: CalcVelocity_maxwell_lpn USE MOD_DSMC_Vars ,ONLY: useDSMC USE MOD_Eval_xyz ,ONLY: TensorProductInterpolation +USE MOD_Part_Tools ,ONLY: GetNextFreePosition !----------------------------------------------------------------------------------------------------------------------------------! IMPLICIT NONE ! INPUT VARIABLES @@ -867,10 +868,7 @@ SUBROUTINE InitIMD_TTM_Coupling() DO iElem=1,PP_nElems DO iPart=1,ElemCharge(iElem) ! 1 electron for each charge of each element - ! Set the next free position in the particle vector list - PDM%CurrentNextFreePosition = PDM%CurrentNextFreePosition + 1 - ParticleIndexNbr = PDM%nextFreePosition(PDM%CurrentNextFreePosition) - PDM%ParticleVecLength = PDM%ParticleVecLength + 1 + ParticleIndexNbr = GetNextFreePosition() !Set new SpeciesID of new particle (electron) PDM%ParticleInside(ParticleIndexNbr) = .true. diff --git a/src/readIMD/readIMD.f90 b/src/readIMD/readIMD.f90 index 8450ec681..ad75944f5 100644 --- a/src/readIMD/readIMD.f90 +++ b/src/readIMD/readIMD.f90 @@ -238,7 +238,7 @@ subroutine read_IMD_results() PartState = PartState * 1e-10_8 PartState(4:6,:) = PartState(4:6,:) * 10.18e15_8 - ! Free an info object + ! Free an info object call MPI_Info_free(mpiInfo, iError) ! Get minimum and maximum extend of the complete particle distribution in the domain diff --git a/src/timedisc/timedisc_TimeStep_BGK.f90 b/src/timedisc/timedisc_TimeStep_BGK.f90 index 5db0421aa..c1d10e934 100644 --- a/src/timedisc/timedisc_TimeStep_BGK.f90 +++ b/src/timedisc/timedisc_TimeStep_BGK.f90 @@ -151,10 +151,6 @@ SUBROUTINE TimeStep_BGK() (Time.ge.(1-DSMC%TimeFracSamp)*TEnd) .OR. & WriteMacroVolumeValues ) THEN CALL UpdateNextFreePosition(.TRUE.) !postpone UNFP for CollisMode=0 to next IterDisplayStep or when needed for DSMC-Sampling -ELSE IF (PDM%nextFreePosition(PDM%CurrentNextFreePosition+1).GT.PDM%maxParticleNumber .OR. & - PDM%nextFreePosition(PDM%CurrentNextFreePosition+1).EQ.0) THEN - ! gaps in PartState are not filled until next UNFP and array might overflow more easily! - CALL abort(__STAMP__,'maximum nbr of particles reached!') END IF #if USE_MPI diff --git a/src/timedisc/timedisc_TimeStep_DSMC.f90 b/src/timedisc/timedisc_TimeStep_DSMC.f90 index 13d5041af..531463d21 100644 --- a/src/timedisc/timedisc_TimeStep_DSMC.f90 +++ b/src/timedisc/timedisc_TimeStep_DSMC.f90 @@ -193,10 +193,6 @@ SUBROUTINE TimeStep_DSMC() (Time.ge.(1-DSMC%TimeFracSamp)*TEnd) .OR. & WriteMacroVolumeValues.OR.WriteMacroSurfaceValues ) THEN CALL UpdateNextFreePosition() !postpone UNFP for CollisMode=0 to next IterDisplayStep or when needed for DSMC-Sampling -ELSE IF (PDM%nextFreePosition(PDM%CurrentNextFreePosition+1).GT.PDM%maxParticleNumber .OR. & - PDM%nextFreePosition(PDM%CurrentNextFreePosition+1).EQ.0) THEN - ! gaps in PartState are not filled until next UNFP and array might overflow more easily! - CALL abort(__STAMP__,'maximum nbr of particles reached!') END IF IF(DSMC%UseOctree)THEN diff --git a/src/timedisc/timedisc_TimeStep_FPFlow.f90 b/src/timedisc/timedisc_TimeStep_FPFlow.f90 index 315969555..9bc410564 100644 --- a/src/timedisc/timedisc_TimeStep_FPFlow.f90 +++ b/src/timedisc/timedisc_TimeStep_FPFlow.f90 @@ -124,11 +124,6 @@ SUBROUTINE TimeStep_FPFlow() (Time.ge.(1-DSMC%TimeFracSamp)*TEnd) .OR. & WriteMacroVolumeValues ) THEN CALL UpdateNextFreePosition() !postpone UNFP for CollisMode=0 to next IterDisplayStep or when needed for DSMC-Sampling -ELSE IF (PDM%nextFreePosition(PDM%CurrentNextFreePosition+1).GT.PDM%maxParticleNumber .OR. & - PDM%nextFreePosition(PDM%CurrentNextFreePosition+1).EQ.0) THEN - CALL abort(& -__STAMP__,& -'maximum nbr of particles reached!') !gaps in PartState are not filled until next UNFP and array might overflow more easily! END IF IF (CoupledFPDSMC) THEN From c32799a05885691bebb5c793d9f54e097a2c86ac Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Tue, 31 Oct 2023 19:51:32 +0100 Subject: [PATCH 292/495] SEE Model based on a power-law fit with read-in coefficients --- .../boundary/particle_boundary_init.f90 | 10 ++ .../boundary/particle_boundary_vars.f90 | 1 + .../surfacemodel/surfacemodel_SEE.f90 | 101 +++++++++++------- 3 files changed, 75 insertions(+), 37 deletions(-) diff --git a/src/particles/boundary/particle_boundary_init.f90 b/src/particles/boundary/particle_boundary_init.f90 index dfe7b831c..cd5a4dc48 100644 --- a/src/particles/boundary/particle_boundary_init.f90 +++ b/src/particles/boundary/particle_boundary_init.f90 @@ -272,6 +272,8 @@ SUBROUTINE InitializeVariablesPartBoundary() PartBound%UseAdaptedWallTemp = .FALSE. ALLOCATE(PartBound%RadiativeEmissivity(1:nPartBound)) PartBound%RadiativeEmissivity = 1. +ALLOCATE(PartBound%SurfModelSEEPowerFit(1:2, 1:nPartBound)) +PartBound%SurfModelSEEPowerFit = 0 ! Output of wall temperature per default off PartBound%OutputWallTemp = .FALSE. @@ -407,6 +409,14 @@ SUBROUTINE InitializeVariablesPartBoundary() IntInfoOpt=PartBound%SurfaceModel(iPartBound)) END SELECT END IF + ! read-in of surface model specific paramaters + IF (PartBound%SurfaceModel(iPartBound).GT.0)THEN + SELECT CASE (PartBound%SurfaceModel(iPartBound)) + CASE (4) + ! Power-fit coefficients + PartBound%SurfModelSEEPowerFit(1:2,iPartBound) = GETREALARRAY('Part-Boundary'//TRIM(hilf)//'-SurfModelSEEPowerFit',2) + END SELECT + END IF IF (PartBound%NbrOfSpeciesSwaps(iPartBound).GT.0) THEN !read Species to be changed at wall (in, out), out=0: delete PartBound%ProbOfSpeciesSwaps(iPartBound)= GETREAL('Part-Boundary'//TRIM(hilf)//'-ProbOfSpeciesSwaps','1.') diff --git a/src/particles/boundary/particle_boundary_vars.f90 b/src/particles/boundary/particle_boundary_vars.f90 index 84f2f04ca..225a1aacb 100644 --- a/src/particles/boundary/particle_boundary_vars.f90 +++ b/src/particles/boundary/particle_boundary_vars.f90 @@ -238,6 +238,7 @@ MODULE MOD_Particle_Boundary_Vars INTEGER , ALLOCATABLE :: SurfaceModel(:) ! Model used for surface interaction (e.g. SEE models) LOGICAL , ALLOCATABLE :: Reactive(:) ! flag defining if surface is treated reactively LOGICAL , ALLOCATABLE :: Resample(:) ! Resample Equilibrium Distribution with reflection + REAL , ALLOCATABLE :: SurfModelSEEPowerFit(:,:) ! Power-fit coefficients (1=a, 2=b) of the form: a*T(ev)^b ! Radiative-equilibrium BC LOGICAL :: AdaptWallTemp LOGICAL , ALLOCATABLE :: UseAdaptedWallTemp(:) diff --git a/src/particles/surfacemodel/surfacemodel_SEE.f90 b/src/particles/surfacemodel/surfacemodel_SEE.f90 index 938b5d773..5859010cc 100644 --- a/src/particles/surfacemodel/surfacemodel_SEE.f90 +++ b/src/particles/surfacemodel/surfacemodel_SEE.f90 @@ -36,8 +36,8 @@ SUBROUTINE SecondaryElectronEmission(PartID_IN,locBCID,ProductSpec,ProductSpecNb !----------------------------------------------------------------------------------------------------------------------------------! ! MODULES ! !----------------------------------------------------------------------------------------------------------------------------------! -USE MOD_Globals ,ONLY: abort,VECNORM,PARTISELECTRON -USE MOD_Globals_Vars ,ONLY: c,Joule2eV +USE MOD_Globals ,ONLY: abort,PARTISELECTRON,DOTPRODUCT +USE MOD_Globals_Vars ,ONLY: c,c2,Joule2eV USE MOD_Particle_Vars ,ONLY: PartState,Species,PartSpecies,PartMPF,nSpecies USE MOD_Globals_Vars ,ONLY: ElementaryCharge,ElectronMass USE MOD_SurfaceModel_Vars ,ONLY: BulkElectronTempSEE @@ -60,28 +60,59 @@ SUBROUTINE SecondaryElectronEmission(PartID_IN,locBCID,ProductSpec,ProductSpecNb REAL,INTENT(OUT) :: TempErgy !< temperature, energy or velocity used for VeloFromDistribution !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES +INTEGER :: SpecID ! Species index of bombarding particle REAL :: eps_e ! Energy of bombarding electron in eV REAL :: iRan ! Random number REAL :: k_ee ! Coefficient of emission of secondary electron REAL :: k_refl ! Coefficient for reflection of bombarding electron REAL :: W0,W1,W2 -REAL :: v +REAL :: velo2 REAL :: MPF REAL :: SEE_Prob !=================================================================================================================================== +SpecID = PartSpecies(PartID_IN) +! Squared velocity of bombarding particle +velo2=DOTPRODUCT(PartState(4:6,PartID_IN)) ! Sanity check: is the impacting particle faster than c -v=VECNORM(PartState(4:6,PartID_IN)) -IF(v.GT.c) CALL abort(__STAMP__,'SecondaryElectronEmission: Bombading particle is faster than the speed of light: ',RealInfoOpt=v) +IF(velo2.GT.c2) CALL abort(__STAMP__,'SecondaryElectronEmission: Bombarding particle is faster than the speed of light: ',RealInfoOpt=SQRT(velo2)) ! Default 0 ProductSpec = 0 ProductSpecNbr = 0 TempErgy = 0.0 ! Select particle surface modeling SELECT CASE(PartBound%SurfaceModel(locBCID)) +CASE(4) ! 4: SEE-E by power-law: a*T(eV)^b + ProductSpecNbr = 0 ! do not create new particle (default value) + IF(PARTISELECTRON(PartID_IN))THEN ! Bombarding electron + ! Electron energy in [eV] + eps_e = 0.5*Species(SpecID)%MassIC*velo2*Joule2eV ! Incident electron energy [eV] + ! Power Fit + SEE_Prob = PartBound%SurfModelSEEPowerFit(1,locBCID)*eps_e**PartBound%SurfModelSEEPowerFit(2,locBCID) + + ! If the yield is greater than 1.0 (or 2.0 or even higher) store the integer and roll the dice for the remainder + ProductSpecNbr = INT(SEE_Prob) + SEE_Prob = SEE_Prob - REAL(ProductSpecNbr) + + ! Roll the dice + CALL RANDOM_NUMBER(iRan) + IF(iRan.LT.SEE_Prob) ProductSpecNbr = ProductSpecNbr + 1 ! Create one additional electron + + ! If the electron is reflected (ProductSpecNbr=1) or multiple electrons are created (ProductSpecNbr>1) + IF(ProductSpecNbr.GT.0) ProductSpec(2) = SurfModResultSpec(locBCID,SpecID) ! Species of the injected electron + + ! When more than 1 electron is created, give them all part of the impacting energy, otherwise reflect the primary electron + IF(ProductSpecNbr.GT.1) eps_e = eps_e/REAL(ProductSpecNbr) ! [eV] + + ! Velocity of reflected primary or secondary electrons in [m/s] + TempErgy = SQRT(2.*eps_e*ElementaryCharge/ElectronMass) + + ELSE ! Neutral bombarding particle + RETURN ! nothing to do + END IF CASE(5) ! 5: SEE by Levko2015 for copper electrodes ! ! by D. Levko, Breakdown of atmospheric pressure microgaps at high excitation, J. Appl. Phys. 117, 173303 (2015) - ProductSpec(1) = PartSpecies(PartID_IN) ! old particle + ProductSpec(1) = SpecID ! old particle ASSOCIATE (& phi => 4.4 ,& ! eV -> cathode work function phi Ref. [20] Y. P. Raizer, Gas Discharge Physics (Springer, 1991) @@ -93,8 +124,7 @@ SUBROUTINE SecondaryElectronEmission(PartID_IN,locBCID,ProductSpec,ProductSpecNb s => 1.35 ,& ! -> empir. fit. const. copper electrode Ref, [19] R. Cimino et al.,Phys.Rev.Lett. 2004 eps_max => 262 ,& ! eV -> empir. fit. const. copper electrode Ref, [19] R. Cimino et al.,Phys.Rev.Lett. 2004 eps_0 => 150 ,& ! eV -> empir. fit. const. copper electrode Ref, [19] R. Cimino et al.,Phys.Rev.Lett. 2004 - velo2 => PartState(4,PartID_IN)**2 + PartState(5,PartID_IN)**2 + PartState(6,PartID_IN)**2 ,& - mass => Species(PartSpecies(PartID_IN))%MassIC &! mass of bombarding particle + mass => Species(SpecID)%MassIC &! mass of bombarding particle ) ! Electron energy in [eV] eps_e = 0.5*mass*velo2/ElementaryCharge @@ -112,7 +142,7 @@ SUBROUTINE SecondaryElectronEmission(PartID_IN,locBCID,ProductSpec,ProductSpecNb CALL RANDOM_NUMBER(iRan) IF(iRan.LT.k_ee/(k_ee+k_refl))THEN ! SEE !ReflectionIndex = 3 ! SEE + perfect elastic scattering of the bombarding electron - ProductSpec(2) = SurfModResultSpec(locBCID,PartSpecies(PartID_IN)) ! Species of the injected electron + ProductSpec(2) = SurfModResultSpec(locBCID,SpecID) ! Species of the injected electron ProductSpecNbr = 1 TempErgy = SQRT(2.*(eps_e*ElementaryCharge-ElementaryCharge*phi)/ElectronMass) ! Velocity of emitted secondary electron eps_e = 0.5*mass*(TempErgy**2)/ElementaryCharge ! Energy of the injected electron @@ -145,12 +175,12 @@ SUBROUTINE SecondaryElectronEmission(PartID_IN,locBCID,ProductSpec,ProductSpecNb ProductSpec(1) = 0 ! just for sanity check END IF END ASSOCIATE - ELSEIF(Species(PartSpecies(PartID_IN))%ChargeIC.GT.0.0)THEN ! Positive bombarding ion + ELSEIF(Species(SpecID)%ChargeIC.GT.0.0)THEN ! Positive bombarding ion CALL RANDOM_NUMBER(iRan) !IF(iRan.LT.1.)THEN ! SEE-I: gamma=0.02 for the N2^+ ions and copper material IF(iRan.LT.0.02)THEN ! SEE-I: gamma=0.02 for the N2^+ ions and copper material !ReflectionIndex = -2 ! SEE + perfect elastic scattering of the bombarding electron - ProductSpec(2) = SurfModResultSpec(locBCID,PartSpecies(PartID_IN)) ! Species of the injected electron + ProductSpec(2) = SurfModResultSpec(locBCID,SpecID) ! Species of the injected electron ProductSpecNbr = 1 eps_e = I-2.*phi ! Energy of the injected electron TempErgy = SQRT(2.*(eps_e*ElementaryCharge-ElementaryCharge*phi)/ElectronMass) ! Velocity of emitted secondary electron @@ -161,13 +191,13 @@ SUBROUTINE SecondaryElectronEmission(PartID_IN,locBCID,ProductSpec,ProductSpecNb !WRITE (*,*) CHAR(27) // "[0;31m eps_e =", eps_e,CHAR(27),"[m" ELSE ! Removal of the bombarding ion !ReflectionIndex = -1 ! Only perfect elastic scattering of the bombarding electron - ProductSpec(1) = -PartSpecies(PartID_IN) ! Negative value: Remove bombarding particle and sample + ProductSpec(1) = -SpecID ! Negative value: Remove bombarding particle and sample ProductSpecNbr = 0 ! do not create new particle END IF ELSE ! Neutral bombarding particle ! IF(iRan.LT.0.1)THEN ! SEE-N: from svn-trunk PICLas version ! !ReflectionIndex = -2 ! SEE + perfect elastic scattering of the bombarding electron - ! ProductSpec(2) = SurfModelResultSpec(locBCID,PartSpecies(PartID_IN)) ! Species of the injected electron + ! ProductSpec(2) = SurfModelResultSpec(locBCID,SpecID) ! Species of the injected electron ! ProductSpecNbr = 1 ! ELSE ! !ReflectionIndex = -1 ! Only perfect elastic scattering of the bombarding electron @@ -186,12 +216,12 @@ SUBROUTINE SecondaryElectronEmission(PartID_IN,locBCID,ProductSpec,ProductSpecNb CASE(6) ! 6: SEE by Pagonakis2016 (originally from Harrower1956) CALL abort(__STAMP__,'Not implemented yet') CASE(7) ! 7: SEE-I (bombarding electrons are removed, Ar+ on different materials is considered for SEE) - ProductSpec(1) = -PartSpecies(PartID_IN) ! Negative value: Remove bombarding particle and sample + ProductSpec(1) = -SpecID ! Negative value: Remove bombarding particle and sample ProductSpecNbr = 0 ! do not create new particle (default value) IF(PARTISELECTRON(PartID_IN))THEN ! Bombarding electron RETURN ! nothing to do - ELSEIF(Species(PartSpecies(PartID_IN))%ChargeIC.GT.0.0)THEN ! Positive bombarding ion + ELSEIF(Species(SpecID)%ChargeIC.GT.0.0)THEN ! Positive bombarding ion ! SEE-I bombarding e- are removed, Ar+ on different materials is considered for secondary e- emission (the default probability ! is 0.13 probability, see D. Depla, Magnetron sputter deposition: Linking discharge voltage with target properties, 2009) @@ -201,7 +231,7 @@ SUBROUTINE SecondaryElectronEmission(PartID_IN,locBCID,ProductSpec,ProductSpecNb IF(iRan.LT.MOD(SurfModEmissionYield(locBCID), 1.0) ) ProductSpecNbr = ProductSpecNbr + 1 ! Create one additional new particle IF(ProductSpecNbr.GT.0)THEN - ProductSpec(2) = SurfModResultSpec(locBCID,PartSpecies(PartID_IN)) ! Species of the injected electron + ProductSpec(2) = SurfModResultSpec(locBCID,SpecID) ! Species of the injected electron ! Set TempErgy (velocity in m/s or energy in eV might be required here) IF(SurfModEmissionEnergy(locBCID).GE.0.)THEN ! Electron energy in [eV] or [m/2] is required here depending on the chosen distribution function @@ -214,7 +244,7 @@ SUBROUTINE SecondaryElectronEmission(PartID_IN,locBCID,ProductSpec,ProductSpecNb END IF ! SurfModEnergyDistribution(locBCID).EQ. ELSE ! Get velocity of new electron (from impacting ion energy) - TempErgy = CalcEkinPart2(PartState(4:6,PartID_IN),PartSpecies(PartID_IN),1.0) ! [J] + TempErgy = CalcEkinPart2(PartState(4:6,PartID_IN),SpecID,1.0) ! [J] TempErgy = SQRT(2.0 * Tempergy / ElectronMass) ! [m/s] END IF ! SurfModEmissionEnergy END IF ! ProductSpecNbr.GT.0 @@ -232,8 +262,7 @@ SUBROUTINE SecondaryElectronEmission(PartID_IN,locBCID,ProductSpec,ProductSpecNb IF(PARTISELECTRON(PartID_IN))THEN ! Bombarding electron ASSOCIATE( P0 => 0.9 ,& ! Assumption in paper Te0 => BulkElectronTempSEE ,& ! Assumed bulk electron temperature [eV] (note this parameter is read as [K]) - velo2=> PartState(4,PartID_IN)**2 + PartState(5,PartID_IN)**2 + PartState(6,PartID_IN)**2 ,& ! Velocity squared - mass => Species(PartSpecies(PartID_IN))%MassIC ) ! mass of bombarding particle + mass => Species(SpecID)%MassIC ) ! mass of bombarding particle eps_e = 0.5*mass*velo2*Joule2eV ! Incident electron energy [eV] ASSOCIATE( alpha0 => 1.5*Te0 ,& ! Energy normalization parameter alpha2 => 6.0*Te0 ) ! Energy normalization parameter @@ -245,34 +274,34 @@ SUBROUTINE SecondaryElectronEmission(PartID_IN,locBCID,ProductSpec,ProductSpecNb iRan = iRan - W0 IF(iRan.LT.W1)THEN ! 1 SEE !ASSOCIATE( P10 => 1.5*W1/eps_e ) - ProductSpec(2) = SurfModResultSpec(locBCID,PartSpecies(PartID_IN)) ! Species of the injected electron + ProductSpec(2) = SurfModResultSpec(locBCID,SpecID) ! Species of the injected electron ProductSpecNbr = 1 ! Create one new particle - ProductSpec(1) = PartSpecies(PartID_IN) ! Reflect old particle + ProductSpec(1) = SpecID ! Reflect old particle !const = P10 ! Store constant here for usage in VeloFromDistribution() !END ASSOCIATE ELSE ! 2 SEE !ASSOCIATE( P20 => 3.0*W2/(eps_e**2) ) - ProductSpec(2) = SurfModResultSpec(locBCID,PartSpecies(PartID_IN)) ! Species of the injected electron + ProductSpec(2) = SurfModResultSpec(locBCID,SpecID) ! Species of the injected electron ProductSpecNbr = 2 ! Create two new particles - ProductSpec(1) = PartSpecies(PartID_IN) ! Reflect old particle + ProductSpec(1) = SpecID ! Reflect old particle !const = P20 ! Store constant here for usage in VeloFromDistribution() !END ASSOCIATE END IF TempErgy = eps_e ! electron energy ELSE - ProductSpec(1) = -PartSpecies(PartID_IN) ! Negative value: Remove bombarding particle and sample + ProductSpec(1) = -SpecID ! Negative value: Remove bombarding particle and sample END IF END ASSOCIATE END ASSOCIATE END IF CASE(9) ! 9: SEE-I when Ar^+ ion bombards surface with 0.01 probability and fixed SEE electron energy of 6.8 eV - ProductSpec(1) = -PartSpecies(PartID_IN) ! Negative value: Remove bombarding particle and sample - IF(Species(PartSpecies(PartID_IN))%ChargeIC.GT.0.0)THEN ! Bombarding positive ion + ProductSpec(1) = -SpecID ! Negative value: Remove bombarding particle and sample + IF(Species(SpecID)%ChargeIC.GT.0.0)THEN ! Bombarding positive ion CALL RANDOM_NUMBER(iRan) ! 1st random number ASSOCIATE( eps_e => 6.8 )! Ejected electron energy [eV] IF(iRan.LT.0.01)THEN ! SEE-I: gamma=0.01 for the bombarding Ar^+ ions - ProductSpec(2) = SurfModResultSpec(locBCID,PartSpecies(PartID_IN)) ! Species of the injected electron + ProductSpec(2) = SurfModResultSpec(locBCID,SpecID) ! Species of the injected electron ProductSpecNbr = 1 ! Create one new particle TempErgy = SQRT(2.*eps_e*ElementaryCharge/ElectronMass) ! Velocity of emitted secondary electron in [m/s] END IF @@ -282,14 +311,13 @@ SUBROUTINE SecondaryElectronEmission(PartID_IN,locBCID,ProductSpec,ProductSpecNb CASE(10) ! 10: SEE-I (bombarding electrons are removed, Ar+ on copper is considered for SEE) ! by J.G. Theis "Computing the Paschen curve for argon with speed-limited particle-in-cell simulation", 2021 ! Plasmas 28, 063513, doi: 10.1063/5.0051095 - ProductSpec(1) = -PartSpecies(PartID_IN) ! Negative value: Remove bombarding particle and sample + ProductSpec(1) = -SpecID ! Negative value: Remove bombarding particle and sample ProductSpecNbr = 0 ! do not create new particle (default value) IF(PARTISELECTRON(PartID_IN))THEN ! Bombarding electron RETURN ! nothing to do - ELSEIF(Species(PartSpecies(PartID_IN))%ChargeIC.GT.0.0)THEN ! Positive bombarding ion - ASSOCIATE (velo2 => PartState(4,PartID_IN)**2 + PartState(5,PartID_IN)**2 + PartState(6,PartID_IN)**2 ,& - mass => Species(PartSpecies(PartID_IN))%MassIC )! mass of bombarding particle + ELSEIF(Species(SpecID)%ChargeIC.GT.0.0)THEN ! Positive bombarding ion + ASSOCIATE (mass => Species(SpecID)%MassIC )! mass of bombarding particle ! Electron energy in [eV] eps_e = 0.5*mass*velo2/ElementaryCharge IF(eps_e.LT.700) THEN @@ -300,7 +328,7 @@ SUBROUTINE SecondaryElectronEmission(PartID_IN,locBCID,ProductSpec,ProductSpecNb END ASSOCIATE CALL RANDOM_NUMBER(iRan) IF(iRan.LT.SEE_Prob)THEN - ProductSpec(2) = SurfModResultSpec(locBCID,PartSpecies(PartID_IN)) ! Species of the injected electron + ProductSpec(2) = SurfModResultSpec(locBCID,SpecID) ! Species of the injected electron ProductSpecNbr = 1 ! Create one new particle TempErgy = 0.0 ! emit electrons with zero velocity END IF @@ -311,12 +339,11 @@ SUBROUTINE SecondaryElectronEmission(PartID_IN,locBCID,ProductSpec,ProductSpecNb CASE(11) ! 11: SEE-E by e- on quartz (SiO2) by A. Dunaevsky, "Secondary electron emission from dielectric materials of a Hall ! thruster with segmented electrodes", 2003 ! PHYSICS OF PLASMAS, VOLUME 10, NUMBER 6, DOI: 10.1063/1.1568344 - ProductSpec(1) = -PartSpecies(PartID_IN) ! Negative value: Remove bombarding particle and sample + ProductSpec(1) = -SpecID ! Negative value: Remove bombarding particle and sample ProductSpecNbr = 0 ! do not create new particle (default value) IF(PARTISELECTRON(PartID_IN))THEN ! Bombarding electron - ASSOCIATE (velo2 => PartState(4,PartID_IN)**2 + PartState(5,PartID_IN)**2 + PartState(6,PartID_IN)**2 ,& - mass => Species(PartSpecies(PartID_IN))%MassIC )! mass of bombarding particle + ASSOCIATE (mass => Species(SpecID)%MassIC )! mass of bombarding particle ! Electron energy in [eV] eps_e = 0.5*mass*velo2*Joule2eV ! Incident electron energy [eV] @@ -335,7 +362,7 @@ SUBROUTINE SecondaryElectronEmission(PartID_IN,locBCID,ProductSpec,ProductSpecNb IF(iRan.LT.SEE_Prob) ProductSpecNbr = ProductSpecNbr + 1 ! Create one additional electron ! If the electron is reflected (ProductSpecNbr=1) or multiple electrons are created (ProductSpecNbr>1) - IF(ProductSpecNbr.GT.0) ProductSpec(2) = SurfModResultSpec(locBCID,PartSpecies(PartID_IN)) ! Species of the injected electron + IF(ProductSpecNbr.GT.0) ProductSpec(2) = SurfModResultSpec(locBCID,SpecID) ! Species of the injected electron ! When more than 1 electron is created, give them all part of the impacting energy, otherwise reflect the primary electron IF(ProductSpecNbr.GT.1) eps_e = eps_e/REAL(ProductSpecNbr) ! [eV] @@ -343,7 +370,7 @@ SUBROUTINE SecondaryElectronEmission(PartID_IN,locBCID,ProductSpec,ProductSpecNb ! Velocity of reflected primary or secondary electrons in [m/s] TempErgy = SQRT(2.*eps_e*ElementaryCharge/ElectronMass) - ELSEIF(Species(PartSpecies(PartID_IN))%ChargeIC.GT.0.0)THEN ! Positive bombarding ion + ELSEIF(Species(SpecID)%ChargeIC.GT.0.0)THEN ! Positive bombarding ion RETURN ! nothing to do ELSE ! Neutral bombarding particle RETURN ! nothing to do From ef9ca2e0bf2fd84d16853db3f5ab641941636d00 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Wed, 1 Nov 2023 16:01:32 +0100 Subject: [PATCH 293/495] Fixed specular BC when using bilinear tracing instead of tria-tracking in the ray tracing algorithm. Replaces all MPI_COMM_WORLD occurrences with MPI_COMM_PICLAS in radiation and ray tracing models. --- src/globals/globals.f90 | 1 + src/mesh/mesh_tools.f90 | 4 ++-- src/particles/surfacemodel/surfacemodel_analyze.f90 | 4 ++-- src/radiation/radiation_solver/radiation_init.f90 | 2 +- src/radiation/radiative_transfer/radtrans_init.f90 | 6 +++--- .../radiative_transfer/radtrans_output.f90 | 10 +++++----- .../tracking/radtrans_tracking.f90 | 12 +++++++----- .../tracking/radtrans_tracking_output.f90 | 13 +++++++++---- .../tracking/radtrans_tracking_tools.f90 | 2 +- src/radiation/ray_tracing/raytrace.f90 | 2 +- src/radiation/ray_tracing/raytrace_ini.f90 | 5 +++-- 11 files changed, 35 insertions(+), 26 deletions(-) diff --git a/src/globals/globals.f90 b/src/globals/globals.f90 index f4b901b60..065409fbb 100644 --- a/src/globals/globals.f90 +++ b/src/globals/globals.f90 @@ -46,6 +46,7 @@ MODULE MOD_Globals INTEGER :: MPI_COMM_PICLAS ! all nodes #else INTEGER,PARAMETER :: MPI_COMM_PICLAS=-1 ! DUMMY when compiling single (MPI=OFF) +INTEGER,PARAMETER :: MPI_COMM_LEADERS=-1 ! DUMMY when compiling single (MPI=OFF) #endif LOGICAL :: MemoryMonitor !> Flag for turning RAM monitoring ON/OFF. Used for the detection of RAM overflows (e.g. due to memory leaks) diff --git a/src/mesh/mesh_tools.f90 b/src/mesh/mesh_tools.f90 index 612c1dc9d..e21c50e21 100644 --- a/src/mesh/mesh_tools.f90 +++ b/src/mesh/mesh_tools.f90 @@ -562,7 +562,7 @@ SUBROUTINE BuildSideToNonUniqueGlobalSide() INTEGER :: iMortar,nMortars INTEGER :: locMortarSide #if USE_DEBUG -INTEGER :: checkRank +INTEGER :: checkRank ! Only for debugging #endif /*USE_DEBUG*/ !=================================================================================================================================== #if USE_DEBUG @@ -769,4 +769,4 @@ PPURE SUBROUTINE GetCornerNodeMapCGNS(NgeoLoc,CornerNodesCGNS,NodeMapCGNS) END SUBROUTINE GetCornerNodeMapCGNS -END MODULE MOD_Mesh_Tools \ No newline at end of file +END MODULE MOD_Mesh_Tools diff --git a/src/particles/surfacemodel/surfacemodel_analyze.f90 b/src/particles/surfacemodel/surfacemodel_analyze.f90 index 61bc34dec..db71d4de3 100644 --- a/src/particles/surfacemodel/surfacemodel_analyze.f90 +++ b/src/particles/surfacemodel/surfacemodel_analyze.f90 @@ -894,7 +894,7 @@ SUBROUTINE InitBoundaryParticleOutput() END DO ! BCSideID = 1,nBCSides #if USE_MPI IF(MPIroot)THEN - CALL MPI_REDUCE(MPI_IN_PLACE , TotalSurfArea , BPO%NPartBoundaries , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_WORLD , iError) + CALL MPI_REDUCE(MPI_IN_PLACE , TotalSurfArea , BPO%NPartBoundaries , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_PICLAS , iError) WRITE(UNIT_stdOut,'(A)') "Total area used for BoundaryParticleOutput (BPO):" DO iBPO = 1, BPO%NPartBoundaries IF(iBPO.GT.9)THEN @@ -904,7 +904,7 @@ SUBROUTINE InitBoundaryParticleOutput() END IF ! iBPO.GT.9 END DO ! iBPO = 1, BPO%NPartBoundaries ELSE - CALL MPI_REDUCE(TotalSurfArea , 0 , BPO%NPartBoundaries , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_WORLD , iError) + CALL MPI_REDUCE(TotalSurfArea , 0 , BPO%NPartBoundaries , MPI_DOUBLE_PRECISION , MPI_SUM , 0 , MPI_COMM_PICLAS , iError) END IF #endif /*USE_MPI*/ DEALLOCATE(TotalSurfArea) diff --git a/src/radiation/radiation_solver/radiation_init.f90 b/src/radiation/radiation_solver/radiation_init.f90 index 4a6c1c104..269e72080 100644 --- a/src/radiation/radiation_solver/radiation_init.f90 +++ b/src/radiation/radiation_solver/radiation_init.f90 @@ -346,7 +346,7 @@ SUBROUTINE MacroscopicRadiationInput() !=================================================================================================================================== MacroRadiationInputFile = GETSTR('Radiation-MacroInput-Filename') -CALL OpenDataFile(MacroRadiationInputFile,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_WORLD) +CALL OpenDataFile(MacroRadiationInputFile,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_PICLAS) CALL GetDataProps('ElemData',nVar_HDF5,N_HDF5,nElems_HDF5) diff --git a/src/radiation/radiative_transfer/radtrans_init.f90 b/src/radiation/radiative_transfer/radtrans_init.f90 index 0c6fc39bc..e22399696 100644 --- a/src/radiation/radiative_transfer/radtrans_init.f90 +++ b/src/radiation/radiative_transfer/radtrans_init.f90 @@ -301,7 +301,7 @@ SUBROUTINE InitRadiationTransport() IF(.NOT.RadiationInput(iSpec)%DoRadiation) CYCLE MaxSumTemp(1) = MaxSumTemp(1) + SUM(MacroRadInputParameters(firstElem:lastElem,iSpec,4)) END DO - CALL MPI_ALLREDUCE(MaxSumTemp, GlobalMaxTemp, 1, MPI_2DOUBLE_PRECISION, MPI_MAXLOC,MPI_COMM_WORLD,iError) + CALL MPI_ALLREDUCE(MaxSumTemp, GlobalMaxTemp, 1, MPI_2DOUBLE_PRECISION, MPI_MAXLOC,MPI_COMM_PICLAS,iError) DisplRank = NINT(GlobalMaxTemp(2)) ELSE firstElem = INT(REAL( myComputeNodeRank *nComputeNodeElems)/REAL(nComputeNodeProcessors))+1 @@ -463,9 +463,9 @@ SUBROUTINE InitRadiationTransport() END IF END DO #if USE_MPI - CALL MPI_ALLREDUCE(MPI_IN_PLACE,RadTrans%GlobalRadiationPower,1,MPI_DOUBLE_PRECISION,MPI_SUM,MPI_COMM_WORLD,iError) + CALL MPI_ALLREDUCE(MPI_IN_PLACE,RadTrans%GlobalRadiationPower,1,MPI_DOUBLE_PRECISION,MPI_SUM,MPI_COMM_PICLAS,iError) IF (RadialWeighting%DoRadialWeighting) THEN - CALL MPI_ALLREDUCE(MPI_IN_PLACE,RadTrans%ScaledGlobalRadiationPower,1,MPI_DOUBLE_PRECISION,MPI_SUM,MPI_COMM_WORLD,iError) + CALL MPI_ALLREDUCE(MPI_IN_PLACE,RadTrans%ScaledGlobalRadiationPower,1,MPI_DOUBLE_PRECISION,MPI_SUM,MPI_COMM_PICLAS,iError) END IF #endif /*USE_MPI*/ RadTrans%GlobalPhotonNum = RadTrans%NumPhotonsPerCell * nGlobalElems diff --git a/src/radiation/radiative_transfer/radtrans_output.f90 b/src/radiation/radiative_transfer/radtrans_output.f90 index a01e26ba4..c759a3084 100644 --- a/src/radiation/radiative_transfer/radtrans_output.f90 +++ b/src/radiation/radiative_transfer/radtrans_output.f90 @@ -122,7 +122,7 @@ SUBROUTINE WriteRadiationToHDF5() CALL MPI_ExchangeRadiationInfo() #endif /*USE_MPI*/ -CALL OpenDataFile(FileString,create=.false.,single=.FALSE.,readOnly=.FALSE.,communicatorOpt=MPI_COMM_WORLD) +CALL OpenDataFile(FileString,create=.false.,single=.FALSE.,readOnly=.FALSE.,communicatorOpt=MPI_COMM_PICLAS) #if USE_MPI ASSOCIATE( RadiationElemAbsEnergySpec => RadiationElemAbsEnergySpec_Shared,& @@ -206,14 +206,14 @@ SUBROUTINE WriteRadiationToHDF5() IF (RadObservationPointMethod.GT.0) THEN #if USE_MPI IF (myRank.EQ.0) THEN - CALL MPI_REDUCE(MPI_IN_PLACE,RadObservation_Emission,RadiationParameter%WaveLenDiscrCoarse,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_WORLD,IERROR) + CALL MPI_REDUCE(MPI_IN_PLACE,RadObservation_Emission,RadiationParameter%WaveLenDiscrCoarse,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_PICLAS,IERROR) ELSE - CALL MPI_REDUCE(RadObservation_Emission,0 ,RadiationParameter%WaveLenDiscrCoarse,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_WORLD,IERROR) + CALL MPI_REDUCE(RadObservation_Emission,0 ,RadiationParameter%WaveLenDiscrCoarse,MPI_DOUBLE_PRECISION,MPI_SUM,0,MPI_COMM_PICLAS,IERROR) ENDIF IF (myRank.EQ.0) THEN - CALL MPI_REDUCE(MPI_IN_PLACE,RadObservation_EmissionPart,RadiationParameter%WaveLenDiscrCoarse,MPI_INTEGER,MPI_SUM,0,MPI_COMM_WORLD,IERROR) + CALL MPI_REDUCE(MPI_IN_PLACE,RadObservation_EmissionPart,RadiationParameter%WaveLenDiscrCoarse,MPI_INTEGER,MPI_SUM,0,MPI_COMM_PICLAS,IERROR) ELSE - CALL MPI_REDUCE(RadObservation_EmissionPart,0 ,RadiationParameter%WaveLenDiscrCoarse,MPI_INTEGER,MPI_SUM,0,MPI_COMM_WORLD,IERROR) + CALL MPI_REDUCE(RadObservation_EmissionPart,0 ,RadiationParameter%WaveLenDiscrCoarse,MPI_INTEGER,MPI_SUM,0,MPI_COMM_PICLAS,IERROR) ENDIF #endif /*USE_MPI*/ IF (myRank.EQ.0) THEN diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 index 2f8afa691..a0be487ae 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 @@ -249,8 +249,6 @@ SUBROUTINE FinalizePhotonSurfSample() END SUBROUTINE FinalizePhotonSurfSample - - SUBROUTINE PhotonTriaTracking() !=================================================================================================================================== ! Routine for tracking of moving particles and boundary interaction using triangulated sides. @@ -355,7 +353,9 @@ SUBROUTINE PhotonTriaTracking() END DO END DO ELSE ! Regular side + ! Select A) TriaTracking or 2) Tracing on bilinear sides IF(UsePhotonTriaTracking)THEN + ! A) TriaTracking DO TriNum = 1,2 ThroughSide = .FALSE. CALL PhotonThroughSideCheck3DFast(localSideID,ElemID,ThroughSide,TriNum) @@ -368,7 +368,8 @@ SUBROUTINE PhotonTriaTracking() LocalSide = localSideID END IF END DO - ELSE ! Use bilinear tracing algorithm for intersection calculation + ELSE + ! 2) Tracing on bilinear sides (bilinear algorithm for intersection calculation)) PartTrajectory = PhotonProps%PhotonDirection PhotonProps%PhotonPos = PhotonProps%PhotonStartPos + PhotonProps%PhotonDirection !PartTrajectory = PhotonProps%PhotonStartPos - PhotonProps%PhotonLastPos @@ -538,6 +539,9 @@ SUBROUTINE PhotonTriaTracking() END IF ! NrOfThroughSides.EQ.0/.GT.1 END IF ! NrOfThroughSides.NE.1 + ! Dummy flag + IF(.NOT.UsePhotonTriaTracking) TriNum=1 + ! ---------------------------------------------------------------------------- ! 3) In case of a boundary, perform the appropriate boundary interaction IF (SideInfo_Shared(SIDE_BCID,SideID).GT.0) THEN @@ -545,7 +549,6 @@ SUBROUTINE PhotonTriaTracking() iPBC = PartBound%MapToPartBC(SideInfo_Shared(SIDE_BCID,SideID)) BCType = PartBound%TargetBoundCond(iPBC) SELECT CASE(BCType) - CASE(1) !PartBound%OpenBC) IF(NrOfThroughSides.LT.2)THEN CALL PhotonIntersectionWithSide(LocalSide,ElemID,TriNum, IntersectionPos, PhotonLost) @@ -599,7 +602,6 @@ SUBROUTINE PhotonTriaTracking() ELSE ! Diffuse reflection IF (NrOfThroughSides.LT.2) THEN - IF(.NOT.UsePhotonTriaTracking) TriNum=1 CALL DiffusePhotonReflection(LocalSide,ElemID,TriNum, IntersectionPos, .FALSE.) ELSE CALL DiffusePhotonReflection(LocalSide,ElemID,TriNum, IntersectionPos, .TRUE.) diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 index dceba3d90..97d55b963 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 @@ -80,7 +80,7 @@ SUBROUTINE WritePhotonVolSampleToHDF5() REAL :: IntegrationWeight REAL :: Vdm_GaussN_NMax(0:PP_N,0:Ray%NMax) !< for interpolation to Analyze points (from NodeType nodes to Gauss-Lobatto nodes) REAL, ALLOCATABLE :: Vdm_GaussN_Nloc(:,:) !< for interpolation to Analyze points (from NodeType nodes to Gauss-Lobatto nodes) -REAL, PARAMETER :: tolerance=1e-6 +REAL, PARAMETER :: tolerance=1e-2 !=================================================================================================================================== SWRITE(UNIT_stdOut,'(a)',ADVANCE='NO') ' WRITE Radiation TO HDF5 FILE...' @@ -207,16 +207,17 @@ SUBROUTINE WritePhotonVolSampleToHDF5() IPWRITE(UNIT_StdOut,*) "iElem,iGlobalElem = ", iElem,iGlobalElem IPWRITE(UNIT_StdOut,*) "RayElemPassedEnergyLoc1st(iElem) = ", RayElemPassedEnergyLoc1st(iElem) IPWRITE(UNIT_StdOut,*) "SUM(U_N_Ray(iGlobalElem)%U(1,:,:,:)) = ", SUM(U_N_Ray(iGlobalElem)%U(1,:,:,:)) + IPWRITE(UNIT_StdOut,*) "ratio =", SUM(U_N_Ray(iGlobalElem)%U(1,:,:,:))/RayElemPassedEnergyLoc1st(iElem) CALL abort(__STAMP__,'Before: RayElemPassedEnergyLoc1st does not match U_N_Ray%U(1) for tolerance = ',RealInfoOpt=tolerance) END IF END IF ! 2nd energy IF(RayElemPassedEnergyLoc2nd(iElem).GT.0.0)THEN + IF(.NOT.ALMOSTEQUALRELATIVE(RayElemPassedEnergyLoc2nd(iElem), SUM(U_N_Ray(iGlobalElem)%U(2,:,:,:)), tolerance))THEN IPWRITE(UNIT_StdOut,*) "iElem,iGlobalElem = ", iElem,iGlobalElem IPWRITE(UNIT_StdOut,*) "RayElemPassedEnergyLoc2nd(iElem) = ", RayElemPassedEnergyLoc2nd(iElem) IPWRITE(UNIT_StdOut,*) "SUM(U_N_Ray(iGlobalElem)%U(2,:,:,:)) = ", SUM(U_N_Ray(iGlobalElem)%U(2,:,:,:)) - IF(.NOT.ALMOSTEQUALRELATIVE(RayElemPassedEnergyLoc2nd(iElem), SUM(U_N_Ray(iGlobalElem)%U(2,:,:,:)), tolerance))THEN - + IPWRITE(UNIT_StdOut,*) "ratio =", SUM(U_N_Ray(iGlobalElem)%U(2,:,:,:))/RayElemPassedEnergyLoc2nd(iElem) CALL abort(__STAMP__,'Before: RayElemPassedEnergyLoc1st does not match U_N_Ray%U(2) for tolerance = ',RealInfoOpt=tolerance) END IF END IF @@ -226,6 +227,7 @@ SUBROUTINE WritePhotonVolSampleToHDF5() IPWRITE(UNIT_StdOut,*) "iElem,iGlobalElem = ", iElem,iGlobalElem IPWRITE(UNIT_StdOut,*) "ElemVolume(iElem) = ", ElemVolume(iElem) IPWRITE(UNIT_StdOut,*) "SUM(U_N_Ray(iGlobalElem)%U(3,:,:,:)) = ", SUM(U_N_Ray(iGlobalElem)%U(3,:,:,:)) + IPWRITE(UNIT_StdOut,*) "ratio =", SUM(U_N_Ray(iGlobalElem)%U(3,:,:,:))/ElemVolume(iElem) CALL abort(__STAMP__,'Before: ElemVolume(iElem) does not match U_N_Ray%U(3) for tolerance = ',RealInfoOpt=tolerance) END IF END IF @@ -270,6 +272,7 @@ SUBROUTINE WritePhotonVolSampleToHDF5() IPWRITE(UNIT_StdOut,*) "iElem,iGlobalElem = ", iElem,iGlobalElem IPWRITE(UNIT_StdOut,*) "RayElemPassedEnergyLoc1st(iElem) = ", RayElemPassedEnergyLoc1st(iElem) IPWRITE(UNIT_StdOut,*) "SUM(UNMax(1,:,:,:,iElem)) = ", SUM(UNMax(1,:,:,:,iElem)) + IPWRITE(UNIT_StdOut,*) "ratio =", SUM(UNMax(1,:,:,:,iElem))/RayElemPassedEnergyLoc1st(iElem) CALL abort(__STAMP__,'After: RayElemPassedEnergyLoc1st does not match UNMax(1) for tolerance = ',RealInfoOpt=tolerance) END IF END IF @@ -279,6 +282,7 @@ SUBROUTINE WritePhotonVolSampleToHDF5() IPWRITE(UNIT_StdOut,*) "iElem,iGlobalElem = ", iElem,iGlobalElem IPWRITE(UNIT_StdOut,*) "RayElemPassedEnergyLoc2nd(iElem) = ", RayElemPassedEnergyLoc2nd(iElem) IPWRITE(UNIT_StdOut,*) "SUM(UNMax(2,:,:,:,iElem)) = ", SUM(UNMax(2,:,:,:,iElem)) + IPWRITE(UNIT_StdOut,*) "ratio =", SUM(UNMax(1,:,:,:,iElem))/RayElemPassedEnergyLoc2nd(iElem) CALL abort(__STAMP__,'After: RayElemPassedEnergyLoc1st does not match UNMax(2) for tolerance = ',RealInfoOpt=tolerance) END IF END IF @@ -288,6 +292,7 @@ SUBROUTINE WritePhotonVolSampleToHDF5() IPWRITE(UNIT_StdOut,*) "iElem,iGlobalElem = ", iElem,iGlobalElem IPWRITE(UNIT_StdOut,*) "ElemVolume(iElem) = ", ElemVolume(iElem) IPWRITE(UNIT_StdOut,*) "SUM(UNMax(3,:,:,:,iElem)) = ", SUM(UNMax(3,:,:,:,iElem)) + IPWRITE(UNIT_StdOut,*) "ratio =", SUM(UNMax(3,:,:,:,iElem))/ElemVolume(iElem) CALL abort(__STAMP__,'After: ElemVolume(iElem) does not match UNMax(3) for tolerance = ',RealInfoOpt=tolerance) END IF END IF @@ -298,7 +303,7 @@ SUBROUTINE WritePhotonVolSampleToHDF5() ! Write file after last abort to prevent a corrupt output file (which might be used when restarting the simulation) IF(MPIRoot) CALL GenerateFileSkeleton('RadiationVolState',nVarRay,StrVarNames,TRIM(MeshFile),0.,FileNameIn=RadiationVolState,NIn=Ray%NMax,NodeType_in=Ray%NodeType) #if USE_MPI - CALL MPI_BARRIER(MPI_COMM_WORLD,iError) + CALL MPI_BARRIER(MPI_COMM_PICLAS,iError) #endif ! Associate construct for integer KIND=8 possibility diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 index c4b966f0c..5626eab96 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 @@ -791,7 +791,7 @@ SUBROUTINE GetNestestDOFInRefElem(Nloc,SamplePos,GlobalElemID,k,l,m) !END IF ! kOld.eq.k .or. lOld.ne.l .or. mOld.ne.m ! ! IPWRITE(UNIT_StdOut , *) "k , l , m =" , k , l , m -! !IF(myrank.eq.0) read*; CALL MPI_BARRIER(MPI_COMM_WORLD,iError) +! !IF(myrank.eq.0) read*; CALL MPI_BARRIER(MPI_COMM_PICLAS,iError) END SUBROUTINE GetNestestDOFInRefElem diff --git a/src/radiation/ray_tracing/raytrace.f90 b/src/radiation/ray_tracing/raytrace.f90 index 8eddee8a1..5a4e357aa 100644 --- a/src/radiation/ray_tracing/raytrace.f90 +++ b/src/radiation/ray_tracing/raytrace.f90 @@ -383,7 +383,7 @@ SUBROUTINE ReadRayTracingDataFromH5(onlySurfData) IF(onlySurfData) RETURN ! 2. Get local element polynomial -CALL OpenDataFile(RadiationVolState,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_WORLD) +CALL OpenDataFile(RadiationVolState,create=.FALSE.,single=.FALSE.,readOnly=.TRUE.,communicatorOpt=MPI_COMM_PICLAS) CALL DatasetExists(File_ID,'Nloc',ContainerExists) IF(.NOT.ContainerExists) CALL CollectiveStop(__STAMP__,'Nloc container does not exist in '//TRIM(RadiationVolState)) ! Array is stored as REAL value, hence, convert back to integer diff --git a/src/radiation/ray_tracing/raytrace_ini.f90 b/src/radiation/ray_tracing/raytrace_ini.f90 index 19f29c1ac..aaed37286 100644 --- a/src/radiation/ray_tracing/raytrace_ini.f90 +++ b/src/radiation/ray_tracing/raytrace_ini.f90 @@ -216,6 +216,7 @@ SUBROUTINE InitHighOrderRaySampling() USE MOD_ReadInTools ,ONLY: GETREAL USE MOD_Particle_Mesh_Vars ,ONLY: ElemVolume_Shared,ElemBaryNGeo #if USE_MPI +USE MOD_Globals ,ONLY: MPI_COMM_PICLAS USE MPI !USE MOD_Particle_Mesh_Vars ,ONLY: NodeCoords_Shared USE MOD_RayTracing_Vars ,ONLY: N_DG_Ray_Shared,N_DG_Ray_Shared_Win @@ -319,8 +320,8 @@ SUBROUTINE InitHighOrderRaySampling() END IF END DO ! iCNElem = firstElem, lastElem #if USE_MPI - CALL MPI_ALLREDUCE(MPI_IN_PLACE, VolMin, 1, MPI_DOUBLE_PRECISION, MPI_MIN, MPI_COMM_WORLD, IERROR) - CALL MPI_ALLREDUCE(MPI_IN_PLACE, VolMax, 1, MPI_DOUBLE_PRECISION, MPI_MAX, MPI_COMM_WORLD, IERROR) + CALL MPI_ALLREDUCE(MPI_IN_PLACE, VolMin, 1, MPI_DOUBLE_PRECISION, MPI_MIN, MPI_COMM_PICLAS, IERROR) + CALL MPI_ALLREDUCE(MPI_IN_PLACE, VolMax, 1, MPI_DOUBLE_PRECISION, MPI_MAX, MPI_COMM_PICLAS, IERROR) #endif /*USE_MPI*/ ! Loop over all elements again and scale the polynomial degree using NINT. From ea323f1d7d95dd04671c5ab31b5620d9dffcc6f7 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Wed, 1 Nov 2023 18:42:48 +0100 Subject: [PATCH 294/495] Added function description for CalcAbsorptionRayTrace() --- .../radiative_transfer/tracking/radtrans_tracking_tools.f90 | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 index 5626eab96..a8edd9bf3 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 @@ -645,7 +645,11 @@ END SUBROUTINE PhotonIntersectionWithSide !=================================================================================================================================== -!> +!> Calculate the absorbed energy in the (sub-)volume of each element. For higher-order sampling, the ray path between element entry +!> and exit is sampled NbrOfSamples = MAX(30,(Nloc+1)**2) and a nearest neighbour search finds the nearest sub-volume element on +!> which the energy is deposited. The sum of all sub-volume energies must equal the element-constant value, which is also +!> determined. Not that only the energies are conserved and not the density, which is the ratio of energy and (sub-)volume when +!> a change basis is used to switch between point sets (polynomial representations). !=================================================================================================================================== SUBROUTINE CalcAbsorptionRayTrace(IntersectionPos,GlobalElemID,PhotonDir) USE MOD_Globals ,ONLY: VECNORM From 5071cfa0759a8fdfe5a9a66951a2d8cb3216bc3e Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Wed, 1 Nov 2023 19:38:25 +0100 Subject: [PATCH 295/495] Added bilinear/triaTracking reggie for ray tracing --- .../DSMC.ini | 71 ++++ .../Electronic-State-Database.h5 | Bin 0 -> 8624 bytes .../Electrons_ref.csv | 22 ++ .../XSec_Database_H2_Photoionization.h5 | Bin 0 -> 58360 bytes .../analyze.ini | 8 + .../command_line.ini | 2 + .../export.neu | 333 ++++++++++++++++++ .../externals.ini | 6 + .../hopr.ini | 26 ++ .../parameter.ini | 165 +++++++++ .../readme.md | 13 + 11 files changed, 646 insertions(+) create mode 100644 regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/DSMC.ini create mode 100644 regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/Electronic-State-Database.h5 create mode 100644 regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/Electrons_ref.csv create mode 100644 regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/XSec_Database_H2_Photoionization.h5 create mode 100644 regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/analyze.ini create mode 100644 regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/command_line.ini create mode 100644 regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/export.neu create mode 100644 regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/externals.ini create mode 100644 regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/hopr.ini create mode 100644 regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/parameter.ini create mode 100644 regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/readme.md diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/DSMC.ini b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/DSMC.ini new file mode 100644 index 000000000..f0b045264 --- /dev/null +++ b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/DSMC.ini @@ -0,0 +1,71 @@ + +! =============================================================================== ! +! Species1, H2 +! =============================================================================== ! +Part-Species1-SpeciesName = H2 +Part-Species1-InteractionID = 2 +Part-Species1-Tref = 1000 +Part-Species1-dref = 2.68E-10 +Part-Species1-omega = 0.407 +Part-Species1-HeatOfFormation_K = 0.0 +Part-Species1-CharaTempVib = 6332.37 +Part-Species1-Ediss_eV = 4.47 +! =============================================================================== ! +! Species2, H +! =============================================================================== ! +Part-Species2-SpeciesName = H +Part-Species2-InteractionID = 1 +Part-Species2-Tref = 1000 +Part-Species2-dref = 2.581E-10 +Part-Species2-omega = 0.407 +Part-Species2-HeatOfFormation_K = 26159.76 +! =============================================================================== ! +! Species3, e +! =============================================================================== ! +Part-Species3-SpeciesName = electron +Part-Species3-InteractionID = 4 +Part-Species3-Tref = 1000 +Part-Species3-dref = 2.817920E-15 +Part-Species3-omega = 0.407 +! =============================================================================== ! +! Species4, H2Ion +! =============================================================================== ! +Part-Species4-SpeciesName = H2Ion1 +Part-Species4-InteractionID = 20 +Part-Species4-Tref = 1000 +Part-Species4-dref = 3.883E-10 +Part-Species4-omega = 0.407 +Part-Species4-CharaTempVib = 3341.01 +Part-Species4-Ediss_eV = 2.65 +Part-Species4-PreviousState = 1 +! =============================================================================== ! +! Species5, HIon +! =============================================================================== ! +Part-Species5-SpeciesName = HIon1 +Part-Species5-InteractionID = 10 +Part-Species5-Tref = 1000 +Part-Species5-dref = 3.912E-10 +Part-Species5-omega = 0.407 +Part-Species5-PreviousState = 2 + + + +! =============================================================================== ! +! Reactions +! =============================================================================== ! +DSMC-NumOfReactions = 2 + +! ---------------------------------------------------- +! Photo-ionization (electron species should be at the first or second position of the product array) +! ---------------------------------------------------- +! Reaction 1 | H2 + photon --> H2Ion + e +DSMC-Reaction1-ReactionModel = phIon +DSMC-Reaction1-Reactants = (/1,0,0/) +DSMC-Reaction1-Products = (/4,3,0,0/) +DSMC-Reaction1-CrossSection = 4.84E-24 + +! Reaction 2 | H2 + photon --> H + HIon + e +DSMC-Reaction2-ReactionModel = phIon +DSMC-Reaction2-Reactants = (/1,0,0/) +DSMC-Reaction2-Products = (/2,3,5,0/) +DSMC-Reaction2-CrossSection = 8.3E-25 diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/Electronic-State-Database.h5 b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/Electronic-State-Database.h5 new file mode 100644 index 0000000000000000000000000000000000000000..9e335f4b5264750773dc6e7c1b6d652281c6266a GIT binary patch literal 8624 zcmeI14@^~69LIm}!Fyg1^a9f^RB{>Us4*m==GyfB5Rgkw!9Vj40TM80R6J@Gf*{Up zh)stsSByCut#D<=s9>_t$8ooJLhx0 zzw6J(pB$q&z^%lXjzG1N{#` zBJDxMzo*@%4Jj$$wxs@PNxDItuThg}gH_&F5l~YSGxQg3BySx}-=3^XiYlq7d-7ey zr2uN0t4MFs%g6MR=ya8<@rIx-GX%Phscr-3#QHTp^c8B1Y_l7dNyHyn?%>Hj?v<}w z2FVHt6SfEmb0J~e$LQ#Ax9YmxZa5T(y^k%|FgI7eVINGq=zYGfjot#V(-3CqbK|=7 zWE(hO;>&Q4DUpohF;`!32(Hz=7pL4CCrXF#IcNxE-jSl zGCol|Cya3vHjLkt83Qiv7jn0^vH2{DAE{yt_j+HYO z@u94APM7d-_0lS)1HPlyyjmN^{5h4t3dVqNIH82GhzYxZ(|+cVHd@Ipr0-1XB#zS`m=Z5QWIbdNlzLL@;qQmak3KBdbm~4@f}rWeF>Ll=$9@lm*Ng&>V@E zDFeQo*I8UvL;wHNlt$<6HE$lFEMWFvH5%{|i@RqMlmj}`I zndd{e(3q<{Y07-QrsqT6@-^ZF=zKhR=JU%Xu5$Hs)_nN+ZO)(le9c=t=ye{A$5fu_ zedd=B7(s|LW1(00c(nWn@t~8T_m9)v8*e3s^j_HW-dJ5m?vaTd{nBYaI?g{W{{ldR Bf589% literal 0 HcmV?d00001 diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/Electrons_ref.csv b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/Electrons_ref.csv new file mode 100644 index 000000000..8ccf38709 --- /dev/null +++ b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/Electrons_ref.csv @@ -0,0 +1,22 @@ +"electrons" +0.0000000000000000E+000 +0.5099999999999998E+008 +0.3099999999999999E+009 +0.1377999999999999E+010 +0.4912999999999998E+010 +0.1431799999999999E+011 +0.3443899999999998E+011 +0.6904099999999997E+011 +0.1168840000000000E+012 +0.1700699999999999E+012 +0.2176069999999999E+012 +0.2517669999999999E+012 +0.2715039999999999E+012 +0.2806709999999999E+012 +0.2840939999999999E+012 +0.2851209999999999E+012 +0.2853689999999999E+012 +0.2854169999999999E+012 +0.2854169999999999E+012 +0.2854169999999999E+012 +0.2854169999999999E+012 diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/XSec_Database_H2_Photoionization.h5 b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/XSec_Database_H2_Photoionization.h5 new file mode 100644 index 0000000000000000000000000000000000000000..abef529f67ca2b525f34f437cfdf25ce7513f5cd GIT binary patch literal 58360 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 Ivgh>w0gNxUr2qf` literal 0 HcmV?d00001 diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/analyze.ini b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/analyze.ini new file mode 100644 index 000000000..88c8f857e --- /dev/null +++ b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/analyze.ini @@ -0,0 +1,8 @@ +! =================================================================================================================== +! compare column +! =================================================================================================================== +compare_column_file = PartAnalyze.csv ! data file name +compare_column_reference_file = Electrons_ref.csv ! data file name +compare_column_index = 9 ! column index for comparison +compare_column_tolerance_value = 10e9 ! tolerance (depends on machine accuracy and MPI) +compare_column_tolerance_type = absolute ! absolute or relative tolerance diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/command_line.ini b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/command_line.ini new file mode 100644 index 000000000..73e8d46c3 --- /dev/null +++ b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/command_line.ini @@ -0,0 +1,2 @@ +MPI = 1,2,5,8 +cmd_suffix = DSMC.ini diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/export.neu b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/export.neu new file mode 100644 index 000000000..ba1542012 --- /dev/null +++ b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/export.neu @@ -0,0 +1,333 @@ + CONTROL INFO 2.4.6 +** GAMBIT NEUTRAL FILE +/media/nizenkov/storage/boltzplatz/Projects/Zeiss/012-SMT-Dinger-P23006-MEMS-Raytracing/3-TestCases/meshes/2023-08-25-M0X-Debug-Cubit-3to1/export.neu +PROGRAM: Coreform_Cubit VERSION: 2023.4 + + NUMNP NELEM NGRPS NBSETS NDFCD NDFVL + 96 49 2 6 3 3 +ENDOFSECTION + NODAL COORDINATES 2.4.6 + 1 5.00000000000e-01 5.00000000000e-01 0.00000000000e+00 + 2 1.66666666667e-01 5.00000000000e-01 2.86458333333e-02 + 3 1.66666666667e-01 5.00000000000e-01 -1.61458333333e-01 + 4 5.00000000000e-01 5.00000000000e-01 -1.66666666667e-01 + 5 5.00000000000e-01 1.66666666667e-01 2.97241210938e-02 + 6 1.76708380738e-01 1.79483363067e-01 -1.92732493396e-02 + 7 1.70986215705e-01 1.71365536089e-01 -1.75388514517e-01 + 8 5.00000000000e-01 1.66666666667e-01 -1.60156250000e-01 + 9 -1.66666666667e-01 5.00000000000e-01 2.99479166667e-02 + 10 -1.66666666667e-01 5.00000000000e-01 -1.58854166667e-01 + 11 -1.76757698738e-01 1.79371924687e-01 -1.91878832863e-02 + 12 -1.70841566289e-01 1.71382951399e-01 -1.75183210145e-01 + 13 -5.00000000000e-01 5.00000000000e-01 0.00000000000e+00 + 14 -5.00000000000e-01 5.00000000000e-01 -1.66666666667e-01 + 15 -5.00000000000e-01 1.66666666667e-01 2.86458333333e-02 + 16 -5.00000000000e-01 1.66666666667e-01 -1.61458333333e-01 + 17 1.66666666667e-01 5.00000000000e-01 -3.32031250000e-01 + 18 5.00000000000e-01 5.00000000000e-01 -3.33333333333e-01 + 19 1.68050720983e-01 1.68046773869e-01 -3.36720028064e-01 + 20 5.00000000000e-01 1.66666666667e-01 -3.33333333333e-01 + 21 -1.66666666667e-01 5.00000000000e-01 -3.31054687500e-01 + 22 -1.67970039349e-01 1.68135871499e-01 -3.36483981681e-01 + 23 -5.00000000000e-01 5.00000000000e-01 -3.33333333333e-01 + 24 -5.00000000000e-01 1.66666666667e-01 -3.32031250000e-01 + 25 1.66666666667e-01 5.00000000000e-01 -5.00000000000e-01 + 26 5.00000000000e-01 5.00000000000e-01 -5.00000000000e-01 + 27 1.66666666667e-01 1.66666666667e-01 -5.00000000000e-01 + 28 5.00000000000e-01 1.66666666667e-01 -5.00000000000e-01 + 29 -1.66666666667e-01 5.00000000000e-01 -5.00000000000e-01 + 30 -1.66666666667e-01 1.66666666667e-01 -5.00000000000e-01 + 31 -5.00000000000e-01 5.00000000000e-01 -5.00000000000e-01 + 32 -5.00000000000e-01 1.66666666667e-01 -5.00000000000e-01 + 33 5.00000000000e-01 -1.66666666667e-01 2.90527343750e-02 + 34 1.76733273392e-01 -1.79406401063e-01 -1.91723599758e-02 + 35 1.70962160892e-01 -1.71408003494e-01 -1.75207218157e-01 + 36 5.00000000000e-01 -1.66666666667e-01 -1.59830729167e-01 + 37 -1.76629794550e-01 -1.79429072538e-01 -1.90680848152e-02 + 38 -1.70853129197e-01 -1.71364388408e-01 -1.74988002849e-01 + 39 -5.00000000000e-01 -1.66666666667e-01 2.99479166667e-02 + 40 -5.00000000000e-01 -1.66666666667e-01 -1.58854166667e-01 + 41 1.68040989340e-01 -1.68118176892e-01 -3.36635631438e-01 + 42 5.00000000000e-01 -1.66666666667e-01 -3.33333333333e-01 + 43 -1.68055817370e-01 -1.68109323888e-01 -3.36359806400e-01 + 44 -5.00000000000e-01 -1.66666666667e-01 -3.31054687500e-01 + 45 1.66666666667e-01 -1.66666666667e-01 -5.00000000000e-01 + 46 5.00000000000e-01 -1.66666666667e-01 -5.00000000000e-01 + 47 -1.66666666667e-01 -1.66666666667e-01 -5.00000000000e-01 + 48 -5.00000000000e-01 -1.66666666667e-01 -5.00000000000e-01 + 49 5.00000000000e-01 -5.00000000000e-01 0.00000000000e+00 + 50 1.66666666667e-01 -5.00000000000e-01 2.97241210938e-02 + 51 1.66666666667e-01 -5.00000000000e-01 -1.60156250000e-01 + 52 5.00000000000e-01 -5.00000000000e-01 -1.66666666667e-01 + 53 -1.66666666667e-01 -5.00000000000e-01 2.90527343750e-02 + 54 -1.66666666667e-01 -5.00000000000e-01 -1.59830729167e-01 + 55 -5.00000000000e-01 -5.00000000000e-01 0.00000000000e+00 + 56 -5.00000000000e-01 -5.00000000000e-01 -1.66666666667e-01 + 57 1.66666666667e-01 -5.00000000000e-01 -3.31705729167e-01 + 58 5.00000000000e-01 -5.00000000000e-01 -3.33333333333e-01 + 59 -1.66666666667e-01 -5.00000000000e-01 -3.31217447917e-01 + 60 -5.00000000000e-01 -5.00000000000e-01 -3.33333333333e-01 + 61 1.66666666667e-01 -5.00000000000e-01 -5.00000000000e-01 + 62 5.00000000000e-01 -5.00000000000e-01 -5.00000000000e-01 + 63 -1.66666666667e-01 -5.00000000000e-01 -5.00000000000e-01 + 64 -5.00000000000e-01 -5.00000000000e-01 -5.00000000000e-01 + 65 5.00000000000e-01 5.00000000000e-01 5.00000000000e-01 + 66 1.66666666667e-01 5.00000000000e-01 2.50000000000e-01 + 67 1.75224475667e-01 1.87325558653e-01 1.24315387207e-01 + 68 5.00000000000e-01 1.66666666667e-01 2.50000000000e-01 + 69 -1.66666666667e-01 5.00000000000e-01 2.50000000000e-01 + 70 -1.75305352846e-01 1.87236259741e-01 1.24326964392e-01 + 71 -5.00000000000e-01 5.00000000000e-01 5.00000000000e-01 + 72 -5.00000000000e-01 1.66666666667e-01 2.50000000000e-01 + 73 1.75308731395e-01 -1.87246304991e-01 1.24358939826e-01 + 74 5.00000000000e-01 -1.66666666667e-01 2.50000000000e-01 + 75 -1.75182745767e-01 -1.87299782629e-01 1.24378343577e-01 + 76 -5.00000000000e-01 -1.66666666667e-01 2.50000000000e-01 + 77 1.66666666667e-01 -5.00000000000e-01 2.50000000000e-01 + 78 5.00000000000e-01 -5.00000000000e-01 5.00000000000e-01 + 79 -1.66666666667e-01 -5.00000000000e-01 2.50000000000e-01 + 80 -5.00000000000e-01 -5.00000000000e-01 5.00000000000e-01 + 81 1.66666666667e-01 -1.66666666667e-01 -8.30000000000e-01 + 82 5.00000000000e-01 -1.66666666667e-01 -8.30000000000e-01 + 83 5.00000000000e-01 -5.00000000000e-01 -8.30000000000e-01 + 84 1.66666666667e-01 -5.00000000000e-01 -8.30000000000e-01 + 85 -1.66666666667e-01 -1.66666666667e-01 -8.30000000000e-01 + 86 -1.66666666667e-01 -5.00000000000e-01 -8.30000000000e-01 + 87 -5.00000000000e-01 -1.66666666667e-01 -8.30000000000e-01 + 88 -5.00000000000e-01 -5.00000000000e-01 -8.30000000000e-01 + 89 1.66666666667e-01 1.66666666667e-01 -8.30000000000e-01 + 90 5.00000000000e-01 1.66666666667e-01 -8.30000000000e-01 + 91 -1.66666666667e-01 1.66666666667e-01 -8.30000000000e-01 + 92 -5.00000000000e-01 1.66666666667e-01 -8.30000000000e-01 + 93 1.66666666667e-01 5.00000000000e-01 -8.30000000000e-01 + 94 5.00000000000e-01 5.00000000000e-01 -8.30000000000e-01 + 95 -1.66666666667e-01 5.00000000000e-01 -8.30000000000e-01 + 96 -5.00000000000e-01 5.00000000000e-01 -8.30000000000e-01 +ENDOFSECTION + ELEMENTS/CELLS 2.4.6 + 1 4 8 1 2 4 3 5 6 8 + 7 + 2 4 8 2 9 3 10 6 11 7 + 12 + 3 4 8 9 13 10 14 11 15 12 + 16 + 4 4 8 4 3 18 17 8 7 20 + 19 + 5 4 8 3 10 17 21 7 12 19 + 22 + 6 4 8 10 14 21 23 12 16 22 + 24 + 7 4 8 18 17 26 25 20 19 28 + 27 + 8 4 8 17 21 25 29 19 22 27 + 30 + 9 4 8 21 23 29 31 22 24 30 + 32 + 10 4 8 5 6 8 7 33 34 36 + 35 + 11 4 8 6 11 7 12 34 37 35 + 38 + 12 4 8 11 15 12 16 37 39 38 + 40 + 13 4 8 8 7 20 19 36 35 42 + 41 + 14 4 8 7 12 19 22 35 38 41 + 43 + 15 4 8 12 16 22 24 38 40 43 + 44 + 16 4 8 20 19 28 27 42 41 46 + 45 + 17 4 8 19 22 27 30 41 43 45 + 47 + 18 4 8 22 24 30 32 43 44 47 + 48 + 19 4 8 33 34 36 35 49 50 52 + 51 + 20 4 8 34 37 35 38 50 53 51 + 54 + 21 4 8 37 39 38 40 53 55 54 + 56 + 22 4 8 36 35 42 41 52 51 58 + 57 + 23 4 8 35 38 41 43 51 54 57 + 59 + 24 4 8 38 40 43 44 54 56 59 + 60 + 25 4 8 42 41 46 45 58 57 62 + 61 + 26 4 8 41 43 45 47 57 59 61 + 63 + 27 4 8 43 44 47 48 59 60 63 + 64 + 28 4 8 1 2 5 6 65 66 68 + 67 + 29 4 8 2 9 6 11 66 69 67 + 70 + 30 4 8 9 13 11 15 69 71 70 + 72 + 31 4 8 5 6 33 34 68 67 74 + 73 + 32 4 8 6 11 34 37 67 70 73 + 75 + 33 4 8 11 15 37 39 70 72 75 + 76 + 34 4 8 33 34 49 50 74 73 78 + 77 + 35 4 8 34 37 50 53 73 75 77 + 79 + 36 4 8 37 39 53 55 75 76 79 + 80 + 37 4 8 67 70 73 75 68 72 74 + 76 + 38 4 8 68 72 74 76 65 71 78 + 80 + 39 4 8 66 69 67 70 65 71 68 + 72 + 40 4 8 73 75 77 79 74 76 78 + 80 + 41 4 8 45 46 61 62 81 82 84 + 83 + 42 4 8 47 45 63 61 85 81 86 + 84 + 43 4 8 48 47 64 63 87 85 88 + 86 + 44 4 8 27 28 45 46 89 90 81 + 82 + 45 4 8 30 27 47 45 91 89 85 + 81 + 46 4 8 32 30 48 47 92 91 87 + 85 + 47 4 8 25 26 27 28 93 94 89 + 90 + 48 4 8 29 25 30 27 95 93 91 + 89 + 49 4 8 31 29 32 30 96 95 92 + 91 +ENDOFSECTION + ELEMENT GROUP 2.4.6 +GROUP: 1 ELEMENTS: 40 MATERIAL: 0 NFLAGS: 0 + Block 1 + + + 1 2 3 4 5 6 7 8 9 10 + 11 12 13 14 15 16 17 18 19 20 + 21 22 23 24 25 26 27 28 29 30 + 31 32 33 34 35 36 37 38 39 40 +ENDOFSECTION + ELEMENT GROUP 2.4.6 +GROUP: 2 ELEMENTS: 9 MATERIAL: 0 NFLAGS: 0 + Block 2 + + + 41 42 43 44 45 46 47 48 49 +ENDOFSECTION + BOUNDARY CONDITIONS 2.4.6 + BC_TOP 1 1 0 6 + 38 4 6 +ENDOFSECTION + BOUNDARY CONDITIONS 2.4.6 + BC_BOT 1 9 0 6 + 41 4 6 + 42 4 6 + 43 4 6 + 44 4 6 + 45 4 6 + 46 4 6 + 47 4 6 + 48 4 6 + 49 4 6 +ENDOFSECTION + BOUNDARY CONDITIONS 2.4.6 + BC_XPLUS 1 16 0 6 + 34 4 4 + 31 4 4 + 28 4 4 + 38 4 4 + 7 4 4 + 4 4 4 + 1 4 4 + 16 4 4 + 13 4 4 + 10 4 4 + 25 4 4 + 22 4 4 + 19 4 4 + 41 4 2 + 44 4 2 + 47 4 2 +ENDOFSECTION + BOUNDARY CONDITIONS 2.4.6 + BC_XMINUS 1 16 0 6 + 30 4 2 + 33 4 2 + 36 4 2 + 38 4 2 + 3 4 2 + 6 4 2 + 9 4 2 + 12 4 2 + 15 4 2 + 18 4 2 + 21 4 2 + 24 4 2 + 27 4 2 + 49 4 4 + 46 4 4 + 43 4 4 +ENDOFSECTION + BOUNDARY CONDITIONS 2.4.6 + BC_YMINUS 1 16 0 6 + 36 4 3 + 35 4 3 + 34 4 3 + 40 4 3 + 19 4 6 + 20 4 6 + 21 4 6 + 22 4 6 + 23 4 6 + 24 4 6 + 25 4 6 + 26 4 6 + 27 4 6 + 43 4 3 + 42 4 3 + 41 4 3 +ENDOFSECTION + BOUNDARY CONDITIONS 2.4.6 + BC_YPLUS 1 16 0 6 + 28 4 1 + 29 4 1 + 30 4 1 + 39 4 1 + 1 4 5 + 4 4 5 + 7 4 5 + 2 4 5 + 5 4 5 + 8 4 5 + 3 4 5 + 6 4 5 + 9 4 5 + 47 4 1 + 48 4 1 + 49 4 1 +ENDOFSECTION + BOUNDARY CONDITIONS 2.4.6 + cfd_bc 1 1 0 0 51 +ENDOFSECTION + BOUNDARY CONDITIONS 2.4.6 + cfd_bc 2 1 0 0 51 +ENDOFSECTION + BOUNDARY CONDITIONS 2.4.6 + cfd_bc 3 1 0 0 51 +ENDOFSECTION + BOUNDARY CONDITIONS 2.4.6 + cfd_bc 4 1 0 0 51 +ENDOFSECTION + BOUNDARY CONDITIONS 2.4.6 + cfd_bc 5 1 0 0 51 +ENDOFSECTION + BOUNDARY CONDITIONS 2.4.6 + cfd_bc 6 1 0 0 51 +ENDOFSECTION diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/externals.ini b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/externals.ini new file mode 100644 index 000000000..a1a4a4745 --- /dev/null +++ b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/externals.ini @@ -0,0 +1,6 @@ +MPI = 1 +externalbinary = ./hopr/build/bin/hopr!, ./bin/piclas2vtk ! Relative binary path in build directory +externaldirectory = hopr.ini !, parameter.ini ! Directory name, where the files are located for the external tool reggie +externalruntime = pre !, post ! Run after piclas is completed (post: after, pre: before) +cmd_suffix = !, RadTrans_Cylinder_2D_RadiationState.h5 ! Suffix for the binary execution +!nocrosscombination:MPI,externalbinary,externaldirectory,externalruntime,cmd_suffix diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/hopr.ini b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/hopr.ini new file mode 100644 index 000000000..85283bea6 --- /dev/null +++ b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/hopr.ini @@ -0,0 +1,26 @@ +!=============================================================================== ! +! OUTPUT +!=============================================================================== ! +ProjectName = mesh_cubitDebug ! name of the project (used for filenames) +Debugvisu = T +!=============================================================================== ! +! MESH +!=============================================================================== ! +FileName = export.neu ! name of mesh file as exported from grid generator +Mode = 2 ! 1 Cartesian 2 gambit file 3 CGNS +meshscale = 0.001 +!=============================================================================== ! +! BOUNDARY CONDITIONS +!=============================================================================== ! +BoundaryName = BC_TOP +BoundaryType = (/4,0,0,0/) +BoundaryName = BC_BOT +BoundaryType = (/4,0,0,0/) +BoundaryName = BC_XMINUS +BoundaryType = (/4,0,0,0/) +BoundaryName = BC_XPLUS +BoundaryType = (/4,0,0,0/) +BoundaryName = BC_YMINUS +BoundaryType = (/4,0,0,0/) +BoundaryName = BC_YPLUS +BoundaryType = (/4,0,0,0/) diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/parameter.ini b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/parameter.ini new file mode 100644 index 000000000..4caf5438a --- /dev/null +++ b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/parameter.ini @@ -0,0 +1,165 @@ +! =============================================================================== ! +! POSTI +! =============================================================================== ! +VisuParticles = T +TimeStampLength = 21 +! =============================================================================== ! +! VARIABLES +! =============================================================================== ! +CFLscale = 0.2 +IniExactFunc = 0 +N = 1,2,3,4 +RayTracing-NMax = 1,2,3,4 +NVisu = 1,2,3,4 +NodeTypeVisu = VISU_INNER + +DoLoadBalance = T +Load-DeviationThreshold = 0.001 +LoadBalanceMaxSteps = 20 +DoInitialAutoRestart = T +nocrosscombination:N,RayTracing-NMax,NVisu,UsePhotonTriaTracking,RayTracing-nSurfSample,Part-Boundary$-PhotonSpecularReflection +! =============================================================================== ! +! MESH +! =============================================================================== ! +MeshFile = mesh_cubitDebug_mesh.h5 +Logging = F +WriteErrorFiles = F +useCurveds = F +! if boundaries have to be changed (else they are used from Mesh directly): +TrackingMethod = triatracking +! =============================================================================== ! +! OUTPUT / VISUALIZATION +! =============================================================================== ! +ProjectName = photoionization +IterDisplayStep = 10 +Part-AnalyzeStep = 1 + +CalcNumSpec = T +CalcNumDens = T + +!CheckExchangeProcs = F ! deactivate the asymmetric communicator check +! =============================================================================== ! +! CALCULATION +! =============================================================================== ! +ManualTimeStep = 5.0E-9 +tend = 100e-9 +Analyze_dt = 100e-9 + +PIC-DoDeposition = F + +PIC-DoInterpolation = F +Part-LorentzType = 0 + +epsCG = 1e-2 +! =============================================================================== ! +! DSMC +! =============================================================================== ! +UseDSMC = T +Particles-DSMC-CollisMode = 3 +Part-NumberOfRandomSeeds = 0 +Particles-HaloEpsVelo = 3E7 + +Particles-CollXSec-Database = XSec_Database_H2_Photoionization.h5 + +Particles-DSMC-ElectronicModel = 1 +Particles-DSMCElectronicDatabase = Electronic-State-Database.h5 +EpsMergeElectronicState = 1E-2 +Part-Species$-ElecRelaxProb = 1. +! =============================================================================== ! +! PARTICLES +! =============================================================================== ! +Part-nSpecies = 5 +Part-maxParticleNumber = 500000 +Part-nBounds = 6 + +Part-Boundary1-SourceName = BC_TOP +Part-Boundary1-Condition = reflective + +Part-Boundary2-SourceName = BC_BOT +Part-Boundary2-Condition = reflective + +Part-Boundary3-SourceName = BC_XMINUS +Part-Boundary3-Condition = reflective + +Part-Boundary4-SourceName = BC_XPLUS +Part-Boundary4-Condition = reflective + +Part-Boundary5-SourceName = BC_YMINUS +Part-Boundary5-Condition = reflective + +Part-Boundary6-SourceName = BC_YPLUS +Part-Boundary6-Condition = reflective + + +Part-FIBGMdeltas = (/ 1.0 , 1.0 , 1.0 /) +Part-FactorFIBGM = (/ 5 , 5 , 5 /) + +Part-Boundary$-BoundaryParticleOutput = T +Part-Boundary$-PhotonSpecularReflection = T,F,T,F ! F: diffuse with PhotonEnACC, T: perfect mirror +Part-Boundary$-PhotonEnACC = 1.0 +! =============================================================================== ! +! Ray Tracing +! =============================================================================== ! +UseRayTracing = T +UsePhotonTriaTracking = F,T,F,T +RayTracing-nSurfSample= 1,2,5,10 +RayTracing-NumRays = 50000 +!RayTracing-NumRays = 5000000 +RayTracing-RayPosModel = 1 +RayTracing-PartBound = 1 ! -> iBC: 6 +PhotonModeBPO = 1 ! Debugging output: vectors +RayTracing-VolRefineMode = 1 ! Volumetric refinement +RayTracing-VolRefineModeZ = 1000. + +RayTracing-PulseDuration = 15e-9 +RayTracing-WaveLength = 10e-9 +RayTracing-PowerDensity = 1.0 +RayTracing-RepetitionRate = 1000 +RayTracing-RayDirection = (/ 0. , 0.0 , -1.0 /) +!RayTracing-RayDirection = (/ 0. , 0.5 , -1.0 /) +! =============================================================================== ! +! Weighting Factor +! =============================================================================== ! +Part-Species$-MacroParticleFactor = 0.1 ! 0.01 + +! =============================================================================== ! +! Species1 | H2 +! =============================================================================== ! +Part-Species1-MassIC = 3.348E-27 +Part-Species1-ChargeIC = 0.0 + +Part-Species1-nInits = 1 + +Part-Species1-Init1-velocityDistribution = maxwell_lpn +Part-Species1-Init1-SpaceIC = background +Part-Species1-Init1-VeloIC = 0. +Part-Species1-Init1-PartDensity = 10.0e20 +Part-Species1-Init1-VeloVecIC = (/0.,1.,0./) +Part-Species1-Init1-MWTemperatureIC = 300. +Part-Species1-Init1-TempVib = 300. +Part-Species1-Init1-TempRot = 300. +Part-Species1-Init1-TempElec = 300. +! =============================================================================== ! +! Species2 | H +! =============================================================================== ! +Part-Species2-MassIC = 1.674E-27 +Part-Species2-ChargeIC = 0.0 +Part-Species2-TempElec = 300. +! =============================================================================== ! +! Species3 | e +! =============================================================================== ! +Part-Species3-MassIC = 9.11E-31 +Part-Species3-ChargeIC = -1.60217653E-19 +! =============================================================================== ! +! Species4 | H2Ion +! =============================================================================== ! +Part-Species4-MassIC = 3.3470890E-27 +Part-Species4-ChargeIC = 1.60217653E-19 +!Part-Species4-TempVib = 300. +!Part-Species4-TempRot = 300. +!Part-Species4-TempElec = 300. +! =============================================================================== ! +! Species5 | HIon +! =============================================================================== ! +Part-Species5-MassIC = 1.673089E-27 +Part-Species5-ChargeIC = 1.60217653E-19 diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/readme.md b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/readme.md new file mode 100644 index 000000000..b3e6719e3 --- /dev/null +++ b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/readme.md @@ -0,0 +1,13 @@ +# Photoionization in the volume (rectangle) for ray tracing with high-order refinement and bilinear tracking +- **Comparing**: the total number of real electrons in the system with a numerical ref. solution +* convert cubit mesh with hopr to .h5 +* ray tracing + volume ionization reactions +* reference density in Electrons_ref.csv calculated with the old model and 1x1x1 emission region for volume see and 1e-3 J + * the size of the domain in this example is 1mm x 1mm x 1.33 mm, which is much smaller than the other reggies with 1m3 simulation + size, however, the resulting density must be the same as the irradiation is the same, just on a smaller scale + * the MPF is therefore chosen much smaller: MPF=0.01 +* Particle emission due to photoionization of $`H_{2}`$ in a volume only (no surface emission) +* no deposition, no interpolation +* comparison of the number of emitted electrons with the reference solution (1 MPF and MPI=1) +* different MPF and number of MPI ranks are tested to yield the same result +* Note: Because the volume is exactly 1 cubic metre, the calculated electron density is exactly the number of real electrons in the system From 8579adaed1287b48a8ba01e5db10fb86ceda7dfc Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Wed, 1 Nov 2023 19:47:00 +0100 Subject: [PATCH 296/495] removed --- .../parameter.ini | 4 ---- 1 file changed, 4 deletions(-) diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini index 6e10e2b81..e6962d7ed 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini @@ -56,10 +56,6 @@ PIC-DoDeposition = F Part-LorentzType = 0 epsCG = 1e-2 - -! Change boundary conditions from definition in hopr.ini -!BoundaryName = WALL -!BoundaryType = (/5,0/) ! =============================================================================== ! ! DSMC ! =============================================================================== ! From 0a80740dd3600c0147b812cbad3c26ba91c76e98 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Wed, 1 Nov 2023 20:45:27 +0100 Subject: [PATCH 297/495] Added sanity check and updated reggies for ray tracing --- .../parameter.ini | 13 +++++++------ .../tracking/radtrans_tracking_output.f90 | 3 +++ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/parameter.ini b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/parameter.ini index 4caf5438a..2e9c05099 100644 --- a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/parameter.ini +++ b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/parameter.ini @@ -17,7 +17,7 @@ DoLoadBalance = T Load-DeviationThreshold = 0.001 LoadBalanceMaxSteps = 20 DoInitialAutoRestart = T -nocrosscombination:N,RayTracing-NMax,NVisu,UsePhotonTriaTracking,RayTracing-nSurfSample,Part-Boundary$-PhotonSpecularReflection +nocrosscombination:N,RayTracing-NMax,NVisu,UsePhotonTriaTracking,RayTracing-nSurfSample,Part-Boundary$-PhotonSpecularReflection,Part-Boundary$-PhotonEnACC,RayTracing-PowerDensity ! =============================================================================== ! ! MESH ! =============================================================================== ! @@ -74,6 +74,7 @@ Part-nBounds = 6 Part-Boundary1-SourceName = BC_TOP Part-Boundary1-Condition = reflective +Part-Boundary1-PhotonEnACC = 1.0 Part-Boundary2-SourceName = BC_BOT Part-Boundary2-Condition = reflective @@ -95,15 +96,15 @@ Part-FIBGMdeltas = (/ 1.0 , 1.0 , 1.0 /) Part-FactorFIBGM = (/ 5 , 5 , 5 /) Part-Boundary$-BoundaryParticleOutput = T -Part-Boundary$-PhotonSpecularReflection = T,F,T,F ! F: diffuse with PhotonEnACC, T: perfect mirror -Part-Boundary$-PhotonEnACC = 1.0 +Part-Boundary$-PhotonSpecularReflection = T , F , T , F ! F: diffuse with PhotonEnACC , T: perfect mirror +Part-Boundary$-PhotonEnACC = 1e-9 , 1.0 , 1e-9 , 1.0 ! 1: fully absorb, 1e-9: reflect all (double energy in volume) ! =============================================================================== ! ! Ray Tracing ! =============================================================================== ! UseRayTracing = T UsePhotonTriaTracking = F,T,F,T RayTracing-nSurfSample= 1,2,5,10 -RayTracing-NumRays = 50000 +RayTracing-NumRays = 5000 !RayTracing-NumRays = 5000000 RayTracing-RayPosModel = 1 RayTracing-PartBound = 1 ! -> iBC: 6 @@ -113,14 +114,14 @@ RayTracing-VolRefineModeZ = 1000. RayTracing-PulseDuration = 15e-9 RayTracing-WaveLength = 10e-9 -RayTracing-PowerDensity = 1.0 +RayTracing-PowerDensity = 0.5 , 1.0 , 0.5 , 1.0 RayTracing-RepetitionRate = 1000 RayTracing-RayDirection = (/ 0. , 0.0 , -1.0 /) !RayTracing-RayDirection = (/ 0. , 0.5 , -1.0 /) ! =============================================================================== ! ! Weighting Factor ! =============================================================================== ! -Part-Species$-MacroParticleFactor = 0.1 ! 0.01 +Part-Species$-MacroParticleFactor = 0.1 ! =============================================================================== ! ! Species1 | H2 diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 index 97d55b963..248f4b135 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_output.f90 @@ -306,6 +306,9 @@ SUBROUTINE WritePhotonVolSampleToHDF5() CALL MPI_BARRIER(MPI_COMM_PICLAS,iError) #endif + ! Sanity check + IF(ANY(ISNAN(UNMax))) CALL abort(__STAMP__,'Found one or more NaN in the array UNMax!') + ! Associate construct for integer KIND=8 possibility ASSOCIATE (& nVarRay => INT(nVarRay,IK) ,& From a0bb5f4061b42ff0026c787379adced5f8c3a230 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Thu, 2 Nov 2023 14:01:00 +0100 Subject: [PATCH 298/495] Slightly increased tolerance for bilinear ray tracing reggie --- .../analyze.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/analyze.ini b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/analyze.ini index 88c8f857e..2704b1816 100644 --- a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/analyze.ini +++ b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/analyze.ini @@ -4,5 +4,5 @@ compare_column_file = PartAnalyze.csv ! data file name compare_column_reference_file = Electrons_ref.csv ! data file name compare_column_index = 9 ! column index for comparison -compare_column_tolerance_value = 10e9 ! tolerance (depends on machine accuracy and MPI) +compare_column_tolerance_value = 12e9 ! tolerance (depends on machine accuracy and MPI) compare_column_tolerance_type = absolute ! absolute or relative tolerance From 0ce562087e6463ae8f571b625d3f75aaf0daf8e4 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Thu, 2 Nov 2023 14:33:14 +0100 Subject: [PATCH 299/495] Removed obsolete parameters from .ini files --- .../parameter.ini | 6 ------ .../pre-piclas/parameter.ini | 6 ------ .../parameter.ini | 5 ----- .../parameter.ini | 5 ----- 4 files changed, 22 deletions(-) diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini index e6962d7ed..345553605 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/parameter.ini @@ -119,7 +119,6 @@ Part-Boundary6-PhotonEnACC = 1.0 ! Ray Tracing ! =============================================================================== ! UseRayTracing = T -RayTracing-RayPosModel = 1 RayTracing-PartBound = 6 ! -> iBC: 6 PhotonModeBPO = 1 ! Debugging output: vectors DoBoundaryParticleOutputRay = T @@ -158,7 +157,6 @@ Part-Species1-Init1-TempElec = 300. ! =============================================================================== ! Part-Species2-MassIC = 1.674E-27 Part-Species2-ChargeIC = 0.0 -Part-Species2-TempElec = 300. ! =============================================================================== ! ! Species3 | e ! =============================================================================== ! @@ -169,12 +167,8 @@ Part-Species3-ChargeIC = -1.60217653E-19 ! =============================================================================== ! Part-Species4-MassIC = 3.3470890E-27 Part-Species4-ChargeIC = 1.60217653E-19 -!Part-Species4-TempVib = 300. -!Part-Species4-TempRot = 300. -!Part-Species4-TempElec = 300. ! =============================================================================== ! ! Species5 | HIon ! =============================================================================== ! Part-Species5-MassIC = 1.673089E-27 Part-Species5-ChargeIC = 1.60217653E-19 -!Part-Species5-TempElec = 300. diff --git a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/pre-piclas/parameter.ini b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/pre-piclas/parameter.ini index 042b0f010..c623668da 100644 --- a/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/pre-piclas/parameter.ini +++ b/regressioncheck/NIG_Photoionization/surface_emission_rectangle_ray_trace_high-order/pre-piclas/parameter.ini @@ -123,7 +123,6 @@ Part-Boundary6-PhotonEnACC = 1.0 ! Ray Tracing ! =============================================================================== ! UseRayTracing = T -RayTracing-RayPosModel = 1 RayTracing-PartBound = 6 ! -> iBC: 6 PhotonModeBPO = 1 ! Debugging output: vectors DoBoundaryParticleOutputRay = T @@ -162,7 +161,6 @@ Part-Species1-Init1-TempElec = 300. ! =============================================================================== ! Part-Species2-MassIC = 1.674E-27 Part-Species2-ChargeIC = 0.0 -Part-Species2-TempElec = 300. ! =============================================================================== ! ! Species3 | e ! =============================================================================== ! @@ -173,12 +171,8 @@ Part-Species3-ChargeIC = -1.60217653E-19 ! =============================================================================== ! Part-Species4-MassIC = 3.3470890E-27 Part-Species4-ChargeIC = 1.60217653E-19 -!Part-Species4-TempVib = 300. -!Part-Species4-TempRot = 300. -!Part-Species4-TempElec = 300. ! =============================================================================== ! ! Species5 | HIon ! =============================================================================== ! Part-Species5-MassIC = 1.673089E-27 Part-Species5-ChargeIC = 1.60217653E-19 -!Part-Species5-TempElec = 300. diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/parameter.ini b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/parameter.ini index b8f8b9d5b..43f26a9e5 100644 --- a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/parameter.ini +++ b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order/parameter.ini @@ -108,7 +108,6 @@ Part-Boundary$-PhotonEnACC = 1.0 ! =============================================================================== ! UseRayTracing = T RayTracing-NumRays = 20000 -RayTracing-RayPosModel = 1 RayTracing-PartBound = 6 ! -> iBC: 6 PhotonModeBPO = 1 ! Debugging output: vectors RayTracing-VolRefineMode = 3 ! Volumetric refinement @@ -147,7 +146,6 @@ Part-Species1-Init1-TempElec = 300. ! =============================================================================== ! Part-Species2-MassIC = 1.674E-27 Part-Species2-ChargeIC = 0.0 -Part-Species2-TempElec = 300. ! =============================================================================== ! ! Species3 | e ! =============================================================================== ! @@ -158,9 +156,6 @@ Part-Species3-ChargeIC = -1.60217653E-19 ! =============================================================================== ! Part-Species4-MassIC = 3.3470890E-27 Part-Species4-ChargeIC = 1.60217653E-19 -!Part-Species4-TempVib = 300. -!Part-Species4-TempRot = 300. -!Part-Species4-TempElec = 300. ! =============================================================================== ! ! Species5 | HIon ! =============================================================================== ! diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/parameter.ini b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/parameter.ini index 2e9c05099..cdd150aa3 100644 --- a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/parameter.ini +++ b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/parameter.ini @@ -106,7 +106,6 @@ UsePhotonTriaTracking = F,T,F,T RayTracing-nSurfSample= 1,2,5,10 RayTracing-NumRays = 5000 !RayTracing-NumRays = 5000000 -RayTracing-RayPosModel = 1 RayTracing-PartBound = 1 ! -> iBC: 6 PhotonModeBPO = 1 ! Debugging output: vectors RayTracing-VolRefineMode = 1 ! Volumetric refinement @@ -145,7 +144,6 @@ Part-Species1-Init1-TempElec = 300. ! =============================================================================== ! Part-Species2-MassIC = 1.674E-27 Part-Species2-ChargeIC = 0.0 -Part-Species2-TempElec = 300. ! =============================================================================== ! ! Species3 | e ! =============================================================================== ! @@ -156,9 +154,6 @@ Part-Species3-ChargeIC = -1.60217653E-19 ! =============================================================================== ! Part-Species4-MassIC = 3.3470890E-27 Part-Species4-ChargeIC = 1.60217653E-19 -!Part-Species4-TempVib = 300. -!Part-Species4-TempRot = 300. -!Part-Species4-TempElec = 300. ! =============================================================================== ! ! Species5 | HIon ! =============================================================================== ! From f69cf40723d3f77be2c934c7185c6cec522c34d9 Mon Sep 17 00:00:00 2001 From: Raphael Tietz Date: Thu, 2 Nov 2023 14:53:58 +0100 Subject: [PATCH 300/495] Fix Bug in EmissionDistribution and Refmapping --- src/particles/emission/particle_position_and_velocity.f90 | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/particles/emission/particle_position_and_velocity.f90 b/src/particles/emission/particle_position_and_velocity.f90 index cd592a781..1002f6a41 100644 --- a/src/particles/emission/particle_position_and_velocity.f90 +++ b/src/particles/emission/particle_position_and_velocity.f90 @@ -550,7 +550,7 @@ SUBROUTINE SetPartPosAndVeloEmissionDistribution(iSpec,iInit,NbrOfParticle) USE MOD_Globals ,ONLY: myrank,UNIT_StdOut,MPI_COMM_WORLD,abort USE MOD_part_tools ,ONLY: InitializeParticleMaxwell,InterpolateEmissionDistribution2D, GetNextFreePosition USE MOD_Mesh_Vars ,ONLY: nElems,offsetElem -USE MOD_Particle_Vars ,ONLY: Species, PDM, PartState, PEM, LastPartPos +USE MOD_Particle_Vars ,ONLY: Species, PDM, PartState, PEM, LastPartPos, PartPosRef USE MOD_Particle_Tracking ,ONLY: ParticleInsideCheck USE MOD_Mesh_Tools ,ONLY: GetCNElemID USE MOD_Particle_Emission_Vars ,ONLY: EmissionDistributionDim, EmissionDistributionN @@ -560,7 +560,7 @@ SUBROUTINE SetPartPosAndVeloEmissionDistribution(iSpec,iInit,NbrOfParticle) USE MOD_Equation ,ONLY: ExactFunc USE MOD_Mesh_Vars ,ONLY: Elem_xGP,sJ USE MOD_Interpolation_Vars ,ONLY: NodeTypeVISU,NodeType -USE MOD_Eval_xyz ,ONLY: TensorProductInterpolation +USE MOD_Eval_xyz ,ONLY: TensorProductInterpolation, GetPositionInRefElem USE MOD_Mesh_Vars ,ONLY: NGeo,XCL_NGeo,XiCL_NGeo,wBaryCL_NGeo,offsetElem USE MOD_Particle_Mesh_Vars ,ONLY: ElemVolume_Shared,BoundsOfElem_Shared USE MOD_Mesh_Tools ,ONLY: GetCNElemID @@ -745,6 +745,8 @@ SUBROUTINE SetPartPosAndVeloEmissionDistribution(iSpec,iInit,NbrOfParticle) IF((PositionNbr.GE.PDM%maxParticleNumber).OR.& (PositionNbr.EQ.0)) CALL abort(__STAMP__,'Emission: Increase maxParticleNumber!',PositionNbr) PartState(1:3,PositionNbr) = RandomPos(1:3) + IF(TrackingMethod.EQ.REFMAPPING) & + CALL GetPositionInRefElem(PartState(1:3,PositionNbr),PartPosRef(1:3,PositionNbr),GlobalElemID) CALL InitializeParticleMaxwell(PositionNbr,iSpec,iElem,Mode=2,iInit=iInit) END IF END DO ! nPart From 36b4d92ca71f78eba977a653c340a3548b5c06d6 Mon Sep 17 00:00:00 2001 From: Raphael Tietz Date: Thu, 2 Nov 2023 14:55:14 +0100 Subject: [PATCH 301/495] Cleanup, removed now false aborts and included check if amount>0 --- src/particles/emission/particle_emission_tools.f90 | 4 ++-- src/particles/emission/particle_position_and_velocity.f90 | 4 ---- src/particles/particle_tools.f90 | 2 ++ 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/particles/emission/particle_emission_tools.f90 b/src/particles/emission/particle_emission_tools.f90 index aad3bc87f..d8b62e6a3 100644 --- a/src/particles/emission/particle_emission_tools.f90 +++ b/src/particles/emission/particle_emission_tools.f90 @@ -1285,7 +1285,7 @@ SUBROUTINE SetParticlePositionCuboidCylinder(FractNbr,iInit,chunkSize,particle_p !=================================================================================================================================== ! modules USE MOD_Globals -USE MOD_Particle_Vars ,ONLY: Species, Symmetry, PDM +USE MOD_Particle_Vars ,ONLY: Species, Symmetry USE MOD_Part_Tools ,ONLY: CalcPartSymmetryPos, CalcRadWeightMPF USE MOD_DSMC_Vars ,ONLY: RadialWeighting !---------------------------------------------------------------------------------------------------------------------------------- @@ -1369,7 +1369,7 @@ SUBROUTINE SetParticlePositionSphere(FractNbr,iInit,chunkSize,particle_positions !=================================================================================================================================== ! modules USE MOD_Globals -USE MOD_Particle_Vars ,ONLY: Species, Symmetry, PDM +USE MOD_Particle_Vars ,ONLY: Species, Symmetry USE MOD_Part_tools ,ONLY: DICEUNITVECTOR, CalcPartSymmetryPos, CalcRadWeightMPF USE MOD_DSMC_Vars ,ONLY: RadialWeighting !---------------------------------------------------------------------------------------------------------------------------------- diff --git a/src/particles/emission/particle_position_and_velocity.f90 b/src/particles/emission/particle_position_and_velocity.f90 index 1002f6a41..8da058a75 100644 --- a/src/particles/emission/particle_position_and_velocity.f90 +++ b/src/particles/emission/particle_position_and_velocity.f90 @@ -742,8 +742,6 @@ SUBROUTINE SetPartPosAndVeloEmissionDistribution(iSpec,iInit,NbrOfParticle) PositionNbr = GetNextFreePosition(NbrOfParticle) PEM%GlobalElemID(PositionNbr) = GlobalElemID PDM%ParticleInside(PositionNbr) = .TRUE. - IF((PositionNbr.GE.PDM%maxParticleNumber).OR.& - (PositionNbr.EQ.0)) CALL abort(__STAMP__,'Emission: Increase maxParticleNumber!',PositionNbr) PartState(1:3,PositionNbr) = RandomPos(1:3) IF(TrackingMethod.EQ.REFMAPPING) & CALL GetPositionInRefElem(PartState(1:3,PositionNbr),PartPosRef(1:3,PositionNbr),GlobalElemID) @@ -794,8 +792,6 @@ SUBROUTINE SetPartPosAndVeloEmissionDistribution(iSpec,iInit,NbrOfParticle) PositionNbr = GetNextFreePosition(NbrOfParticle) PEM%GlobalElemID(PositionNbr) = GlobalElemID PDM%ParticleInside(PositionNbr) = .TRUE. - IF((PositionNbr.GE.PDM%maxParticleNumber).OR.& - (PositionNbr.EQ.0)) CALL abort(__STAMP__,'Emission: Increase maxParticleNumber!',PositionNbr) PartState(1:3,PositionNbr) = RandomPos(1:3) CALL InitializeParticleMaxwell(PositionNbr,iSpec,iElem,Mode=2,iInit=iInit) END IF diff --git a/src/particles/particle_tools.f90 b/src/particles/particle_tools.f90 index 7cec2b758..479dbccdf 100644 --- a/src/particles/particle_tools.f90 +++ b/src/particles/particle_tools.f90 @@ -1687,6 +1687,7 @@ SUBROUTINE IncreaseMaxParticleNumber(Amount) ! REAL :: !=================================================================================================================================== IF(PRESENT(Amount)) THEN + IF(Amount.EQ.0) RETURN NewSize=PDM%MaxParticleNumber+Amount IPWRITE(*,*) "Increase by amount" IF(NewSize.GT.PDM%maxAllowedParticleNumber)CALL ABORT(& @@ -1847,6 +1848,7 @@ SUBROUTINE IncreaseMaxParticleNumber(Amount) __STAMP__& ,'Cannot allocate increased Array in IncreaseMaxParticleNumber') Temp2Real(:,1:PDM%MaxParticleNumber)=PartPosRef + ! Temp2Real(:,PDM%maxParticleNumber+1:NewSize) = -888. CALL MOVE_ALLOC(Temp2Real,PartPosRef) END IF From ef36cb6e2894fe5f9db89b547bf83d535952d0b9 Mon Sep 17 00:00:00 2001 From: Patrick Kopper Date: Thu, 2 Nov 2023 16:14:06 +0100 Subject: [PATCH 302/495] Fixed git pre-commit hook --- .githooks/pre-commit | 91 ++++++++++++++++++++++++++++++-------------- 1 file changed, 62 insertions(+), 29 deletions(-) diff --git a/.githooks/pre-commit b/.githooks/pre-commit index c0b004790..b5053bec1 100755 --- a/.githooks/pre-commit +++ b/.githooks/pre-commit @@ -17,9 +17,11 @@ #=================================================================================================================================== # Executables, command -v is safe with sh +BN_EXE=$(command -v basename) DU_EXE=$(command -v du) GIT_EXE=$(command -v git) LS_EXE=$(command -v ls) +TR_EXE=$(command -v tr) # Check if override is requested if [ "$GIT_OVERRIDE_LIMITS" = "1" ]; then @@ -41,10 +43,18 @@ NUMBERWARN=100 # Local variables ERROR=0 -FILEWARN=0 FILEERR=0 +FILEWARN=0 FILESUM=0 -EXEWARN=0 +FILESUMERR=0 +FILESUMWARN=0 +EXEERR=0 +TABERR=0 + +EXELINE='' +TABLINE='' +SIZEWARNLINE='' +SIZEDENYLINE='' # Check if file is opened in a terminal if test -t 1; then @@ -64,7 +74,8 @@ CHANGED=$($GIT_EXE diff --staged --name-only) # Check if any changes are present if [ -n "$CHANGED" ]; then # Sort found files by size (-S) in reverse ordering (-r) - SORTED=$($LS_EXE -Shsr "$CHANGED" 2> /dev/null) + CHANGED=$(echo "$CHANGED" | $TR_EXE '\n' ' ') + SORTED=$($LS_EXE --sort=size -r $CHANGED 2> /dev/null) NUMBER=$($GIT_EXE diff --staged --numstat | wc -l) # Check the number of files @@ -82,7 +93,7 @@ if [ -n "$CHANGED" ]; then # -f True if FILE exists and is a regular file. if [ -f "$file" ]; then # -b, --bytes equivalent to '--apparent-size --block-size=1' - LINE=$($DU_EXE -h "$file") + LINE=$($LS_EXE -alhs "$file") FILESIZE=$($DU_EXE -b "$file" | cut -d ' ' -f1) # this is a tab, not a white space # Sum up the total file sizes @@ -91,60 +102,82 @@ if [ -n "$CHANGED" ]; then # Check the file size limit if [ "$FILESIZE" -gt "$SIZESINGLELIMIT" ]; then # Error header - if [ "$FILEERR" -eq 0 ]; then - printf "${RED}The following file(s) exceed the file size limit ($SIZESINGLELIMIT bytes)${NC}\n" - ERROR=1 - FILEERR=1 - fi - printf "$LINE\n" + ERROR=1 + FILEERR=1 + SIZEDENYLINE="$LINE\n$SIZEDENYLINE" # Check the file size warning elif [ "$FILESIZE" -gt "$SIZESINGLEWARN" ]; then - # Error header - if [ "$FILEWARN" -eq 0 ]; then - printf "${YELLOW}The following large file(s) are about to be committed (>$SIZESINGLEWARN bytes)${NC}\n" - FILEWARN=1 - fi - printf "$LINE\n" + # Warning header + FILEWARN=1 + SIZEWARNLINE="$LINE\n$SIZEWARNLINE" fi fi # Check total file size if [ "$FILESUM" -gt "$SIZETOTALLIMIT" ]; then # Error header - printf "${RED}The total file size exceeds the size limit ($SIZETOTALLIMIT bytes)${NC}\n" ERROR=1 + FILESUMERR=1 # Check the file size warning elif [ "$FILESUM" -gt "$SIZETOTALWARN" ]; then # Error header - printf "${YELLOW}Total file size to be committed ($FILESUM bytes)${NC}\n" + FILESUMWARN=1 fi # Check if file is executable if [ -x "$file" ]; then # Error header - if [ "$EXEWARN" -eq 0 ]; then - printf "${RED}The following file(s) are executable, which is not allowed. Remove the execute permission via 'chmod -x filename' and try again.${NC}\n" - EXEWARN=1 - fi - LINE=$($LS_EXE -alFhs "$file") - printf "$LINE\n" ERROR=1 + EXEERR=1 + LINE=$($LS_EXE -alhs "$file") + EXELINE="$LINE\n$EXELINE" fi # Check for tab characters in specific file endings - echo $file - if [ "${file:-4}" = ".txt" ] || [ "${file:-3}" = ".f90" ] || [ "${file:-4}" = ".ini" ]; then + name=$($BN_EXE -- "$file") + ext="${name##*.}" + name="${name%.*}" + if [ "$ext" = "txt" ] || [ "$ext" = "f90" ] || [ "$ext" = "ini" ]; then # -P, --perl-regexp PATTERNS are Perl regular expressions NbrOfLinesWithTabs=$(grep -P '\t' $file | wc -l) - echo "[${NbrOfLinesWithTabs}]" if [ "${NbrOfLinesWithTabs}" -gt 0 ]; then - printf "${RED}Tab characters found in [${file}]. Remove them and then commit again!${NC}\n" + LINE=$($LS_EXE -alhs "$file") ERROR=1 + TABERR=1 + TABLINE="$LINE\n$TABLINE" fi fi done + if [ $FILEERR -ne 0 ]; then + printf "${RED}The following file(s) exceed the file size limit ($SIZESINGLELIMIT bytes)${NC}\n" + printf "$FILEDENYLINE" + fi + + if [ $FILEWARN -ne 0 ]; then + printf "${YELLOW}The following large file(s) are about to be committed (>$SIZESINGLEWARN bytes)${NC}\n" + printf "$FILEWARNLINE" + fi + + if [ $FILESUMERR -ne 0 ]; then + printf "${RED}The total file size exceeds the size limit ($SIZETOTALLIMIT bytes)${NC}\n" + fi + + if [ $FILESUMWARN -ne 0 ]; then + printf "${YELLOW}Total file size to be committed ($FILESUM bytes)${NC}\n" + fi + + if [ "$EXEERR" -ne 0 ]; then + printf "${RED}The following file(s) are executable, which is not allowed. Remove the execute permission via 'chmod -x filename' and try again.${NC}\n" + printf "$EXELINE" + fi + + if [ "$TABERR" -ne 0 ]; then + printf "${RED}The following file(s) contain tabs, which is not allowed. Remove the tab stops and try again.${NC}\n" + printf "$TABLINE" + fi + # Abort if hook encountered any error if [ "$ERROR" -ne 0 ]; then echo '------------------------------------------------------------------------------------------------------------------------------------' @@ -156,4 +189,4 @@ if [ -n "$CHANGED" ]; then else echo 'No staged changes. Exiting ...' exit 0 -fi +fi \ No newline at end of file From 7c9406fb8a584d4958e318c5116bd72ec08b157d Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Thu, 2 Nov 2023 16:45:52 +0100 Subject: [PATCH 303/495] WIP: Added CYCLE to rotational periodic part in IdentifyPartExchangeProcs() and also consider rotational periodic displacement in HaloBoxInProc() --- .../particle_mpi/particle_mpi_halo.f90 | 175 ++++++++++++------ 1 file changed, 118 insertions(+), 57 deletions(-) diff --git a/src/particles/particle_mpi/particle_mpi_halo.f90 b/src/particles/particle_mpi/particle_mpi_halo.f90 index 1656cffc1..9e9fe4034 100644 --- a/src/particles/particle_mpi/particle_mpi_halo.f90 +++ b/src/particles/particle_mpi/particle_mpi_halo.f90 @@ -592,7 +592,7 @@ SUBROUTINE IdentifyPartExchangeProcs IF(PartBound%UseRotPeriodicBC) THEN DO iPartBound = 1, nPartBound IF(PartBound%TargetBoundCond(iPartBound).NE.PartBound%RotPeriodicBC) CYCLE - alpha = PartBound%RotPeriodicAngle(iPartBound) * PartBound%RotPeriodicTol + alpha = PartBound%RotPeriodicAngle(iPartBound) * PartBound%RotPeriodicTol ASSOCIATE(RotBoundMin => PartBound%RotPeriodicMin(iPartBound)-MPI_halo_eps_woshape, & RotBoundMax => PartBound%RotPeriodicMax(iPartBound)+MPI_halo_eps_woshape) IF( (BoundsOfElemCenter(PartBound%RotPeriodicAxis)-BoundsOfElemCenter(4).GE.RotBoundMax).OR. & @@ -602,14 +602,12 @@ SUBROUTINE IdentifyPartExchangeProcs END ASSOCIATE RotBoundsOfElemCenter(1:3) = RotateVectorAroundAxis(BoundsOfElemCenter(1:3),PartBound%RotPeriodicAxis,alpha) ! check if element is within halo_eps of rotationally displaced element - IF (VECNORM( RotBoundsOfElemCenter(1:3) & - - MPISideBoundsOfNbElemCenter(1:3,iSide)) & - .LE. MPI_halo_eps_woshape+BoundsOfElemCenter(4) & !-BoundsOfElemCenter(5) & - + MPISideBoundsOfNbElemCenter(4,iSide) ) THEN + IF ( VECNORM(RotBoundsOfElemCenter(1:3) - MPISideBoundsOfNbElemCenter(1:3,iSide)) & + .LE.(MPI_halo_eps_woshape+BoundsOfElemCenter(4) + MPISideBoundsOfNbElemCenter(4,iSide)) ) THEN ! flag the proc as exchange proc (in halo region) IsExchangeElem(localElem) = .TRUE. CYCLE ElemLoop - END IF + END IF ! VECNORM( RotBoundsOfElemCenter ... END DO ! nPartBound ! End check rot periodic Elems and if iSide is on rot periodic BC END IF ! PartBound%UseRotPeriodicBC @@ -632,60 +630,65 @@ SUBROUTINE IdentifyPartExchangeProcs SELECT CASE(GlobalProcToExchangeProc(EXCHANGE_PROC_TYPE,HaloProc)) ! Proc not previously encountered, check if possibly in range CASE(-1) - IF(PartBound%UseRotPeriodicBC) THEN - GlobalProcToExchangeProc(EXCHANGE_PROC_TYPE,HaloProc) = 0 + firstElem = offsetElemMPI(HaloProc)+1 + lastElem = offsetElemMPI(HaloProc +1) + + SELECT CASE(TrackingMethod) + ! Build mesh min/max on BezierControlPoints for possibly curved elements + CASE(REFMAPPING,TRACING) + firstSide = ElemInfo_Shared(ELEM_FIRSTSIDEIND,firstElem)+1 + lastSide = ElemInfo_Shared(ELEM_LASTSIDEIND ,lastElem) + + xCoordsOrigin(1) = MINVAL(BezierControlPoints3D(1,:,:,firstSide:lastSide)) + xCoordsOrigin(2) = MAXVAL(BezierControlPoints3D(1,:,:,firstSide:lastSide)) + xCoordsOrigin(3) = MINVAL(BezierControlPoints3D(2,:,:,firstSide:lastSide)) + xCoordsOrigin(4) = MAXVAL(BezierControlPoints3D(2,:,:,firstSide:lastSide)) + xCoordsOrigin(5) = MINVAL(BezierControlPoints3D(3,:,:,firstSide:lastSide)) + xCoordsOrigin(6) = MAXVAL(BezierControlPoints3D(3,:,:,firstSide:lastSide)) + + ! TriaTracking does not have curved elements, nodeCoords are sufficient + CASE(TRIATRACKING) + xCoordsOrigin(1) = MINVAL(NodeCoords_Shared(1,ElemInfo_Shared(ELEM_FIRSTNODEIND,firstElem) + 1 & + :ElemInfo_Shared(ELEM_LASTNODEIND ,lastElem))) + xCoordsOrigin(2) = MAXVAL(NodeCoords_Shared(1,ElemInfo_Shared(ELEM_FIRSTNODEIND,firstElem) + 1 & + :ElemInfo_Shared(ELEM_LASTNODEIND ,lastElem))) + xCoordsOrigin(3) = MINVAL(NodeCoords_Shared(2,ElemInfo_Shared(ELEM_FIRSTNODEIND,firstElem) + 1 & + :ElemInfo_Shared(ELEM_LASTNODEIND ,lastElem))) + xCoordsOrigin(4) = MAXVAL(NodeCoords_Shared(2,ElemInfo_Shared(ELEM_FIRSTNODEIND,firstElem) + 1 & + :ElemInfo_Shared(ELEM_LASTNODEIND ,lastElem))) + xCoordsOrigin(5) = MINVAL(NodeCoords_Shared(3,ElemInfo_Shared(ELEM_FIRSTNODEIND,firstElem) + 1 & + :ElemInfo_Shared(ELEM_LASTNODEIND ,lastElem))) + xCoordsOrigin(6) = MAXVAL(NodeCoords_Shared(3,ElemInfo_Shared(ELEM_FIRSTNODEIND,firstElem) + 1 & + :ElemInfo_Shared(ELEM_LASTNODEIND ,lastElem))) + END SELECT + + ! Keep direction to account for accuracy issues + IF (myRank.LT.HaloProc) THEN + ProcInRange = HaloBoxInProc(xCoordsOrigin,xCoordsProc ,MPI_halo_eps,GEO%nPeriodicVectors,GEO%PeriodicVectors) ELSE - firstElem = offsetElemMPI(HaloProc)+1 - lastElem = offsetElemMPI(HaloProc +1) - - SELECT CASE(TrackingMethod) - ! Build mesh min/max on BezierControlPoints for possibly curved elements - CASE(REFMAPPING,TRACING) - firstSide = ElemInfo_Shared(ELEM_FIRSTSIDEIND,firstElem)+1 - lastSide = ElemInfo_Shared(ELEM_LASTSIDEIND ,lastElem) - - xCoordsOrigin(1) = MINVAL(BezierControlPoints3D(1,:,:,firstSide:lastSide)) - xCoordsOrigin(2) = MAXVAL(BezierControlPoints3D(1,:,:,firstSide:lastSide)) - xCoordsOrigin(3) = MINVAL(BezierControlPoints3D(2,:,:,firstSide:lastSide)) - xCoordsOrigin(4) = MAXVAL(BezierControlPoints3D(2,:,:,firstSide:lastSide)) - xCoordsOrigin(5) = MINVAL(BezierControlPoints3D(3,:,:,firstSide:lastSide)) - xCoordsOrigin(6) = MAXVAL(BezierControlPoints3D(3,:,:,firstSide:lastSide)) - - ! TriaTracking does not have curved elements, nodeCoords are sufficient - CASE(TRIATRACKING) - xCoordsOrigin(1) = MINVAL(NodeCoords_Shared(1,ElemInfo_Shared(ELEM_FIRSTNODEIND,firstElem) + 1 & - :ElemInfo_Shared(ELEM_LASTNODEIND ,lastElem))) - xCoordsOrigin(2) = MAXVAL(NodeCoords_Shared(1,ElemInfo_Shared(ELEM_FIRSTNODEIND,firstElem) + 1 & - :ElemInfo_Shared(ELEM_LASTNODEIND ,lastElem))) - xCoordsOrigin(3) = MINVAL(NodeCoords_Shared(2,ElemInfo_Shared(ELEM_FIRSTNODEIND,firstElem) + 1 & - :ElemInfo_Shared(ELEM_LASTNODEIND ,lastElem))) - xCoordsOrigin(4) = MAXVAL(NodeCoords_Shared(2,ElemInfo_Shared(ELEM_FIRSTNODEIND,firstElem) + 1 & - :ElemInfo_Shared(ELEM_LASTNODEIND ,lastElem))) - xCoordsOrigin(5) = MINVAL(NodeCoords_Shared(3,ElemInfo_Shared(ELEM_FIRSTNODEIND,firstElem) + 1 & - :ElemInfo_Shared(ELEM_LASTNODEIND ,lastElem))) - xCoordsOrigin(6) = MAXVAL(NodeCoords_Shared(3,ElemInfo_Shared(ELEM_FIRSTNODEIND,firstElem) + 1 & - :ElemInfo_Shared(ELEM_LASTNODEIND ,lastElem))) - END SELECT - - ! Keep direction to account for accuracy issues - IF (myRank.LT.HaloProc) THEN - ProcInRange = HaloBoxInProc(xCoordsOrigin,xCoordsProc,MPI_halo_eps,GEO%nPeriodicVectors,GEO%PeriodicVectors) - ELSE - ProcInRange = HaloBoxInProc(xCoordsProc,xCoordsOrigin,MPI_halo_eps,GEO%nPeriodicVectors,GEO%PeriodicVectors) - END IF + ProcInRange = HaloBoxInProc(xCoordsProc ,xCoordsOrigin,MPI_halo_eps,GEO%nPeriodicVectors,GEO%PeriodicVectors) + END IF - ! Check if proc is in range - IF (.NOT.ProcInRange) THEN - ! Proc definitely not in range - GlobalProcToExchangeProc(EXCHANGE_PROC_TYPE,HaloProc) = -2 + ! Check if proc is in range + IF (ProcInRange) THEN + ! Check if single-node + rot-periodic BCs + IF ((nLeaderGroupProcs.EQ.1).AND.PartBound%UseRotPeriodicBC) THEN + ! Assume process in range based on bounding box check. Skip exact element check only for single-node + rot-periodic BCs + GlobalProcToExchangeProc(EXCHANGE_PROC_TYPE,HaloProc) = 1 + GlobalProcToExchangeProc(EXCHANGE_PROC_RANK,HaloProc) = nExchangeProcessors + nExchangeProcessors = nExchangeProcessors + 1 CYCLE ELSE - ! Proc possible in range + ! Process possible in range GlobalProcToExchangeProc(EXCHANGE_PROC_TYPE,HaloProc) = 0 - END IF - END IF - ! Proc definitely not in range or already flagged - CASE(-2,1,2) + END IF ! (nLeaderGroupProcs.EQ.1).AND.PartBound%UseRotPeriodicBC + ELSE ! .NOT.ProcInRange + ! Proc definitely not in range + GlobalProcToExchangeProc(EXCHANGE_PROC_TYPE,HaloProc) = -2 + CYCLE + END IF ! ProcInRange + + CASE(-2,1,2) ! Proc definitely not in range or already flagged CYCLE END SELECT END IF @@ -847,6 +850,7 @@ SUBROUTINE IdentifyPartExchangeProcs ! Check rot periodic Elems and if iSide is on rot periodic BC IF(PartBound%UseRotPeriodicBC) THEN DO iPartBound = 1, nPartBound + IF(PartBound%TargetBoundCond(iPartBound).NE.PartBound%RotPeriodicBC) CYCLE alpha = PartBound%RotPeriodicAngle(iPartBound) * PartBound%RotPeriodicTol RotBoundsOfElemCenter(1:3) = RotateVectorAroundAxis(BoundsOfElemCenter(1:3),PartBound%RotPeriodicAxis,alpha) ! check if element is within halo_eps of rotationally displaced element @@ -1539,9 +1543,11 @@ END SUBROUTINE FinalizePartExchangeProcs PPURE FUNCTION HaloBoxInProc(CartNodes,CartProc,halo_eps,nPeriodicVectors,PeriodicVectors) !=================================================================================================================================== -! Check if bounding box is on proc by comparing against the other bounding box extended by halo_eps +! Check if bounding box is on process by comparing against the other bounding box extended by halo_eps !=================================================================================================================================== ! MODULES +USE MOD_Particle_Boundary_Vars ,ONLY: PartBound,nPartBound +USE MOD_part_tools ,ONLY: RotateVectorAroundAxis ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -1557,8 +1563,11 @@ PPURE FUNCTION HaloBoxInProc(CartNodes,CartProc,halo_eps,nPeriodicVectors,Period !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES INTEGER,DIMENSION(2),PARAMETER :: DirPeriodicVector = [-1,1] -INTEGER :: iPeriodicVector,jPeriodicVector,iPeriodicDir,jPeriodicDir,kPeriodicDir +INTEGER :: iPeriodicVector,jPeriodicVector,iPeriodicDir,jPeriodicDir,kPeriodicDir,i,iPartBound REAL,DIMENSION(1:6) :: xCordsPeri +REAL,DIMENSION(1:8,1:3) :: x +REAL,DIMENSION(1:3) :: xRot +REAL :: alpha !=================================================================================================================================== HaloBoxInProc = .FALSE. @@ -1696,6 +1705,58 @@ PPURE FUNCTION HaloBoxInProc(CartNodes,CartProc,halo_eps,nPeriodicVectors,Period END SELECT +! Check rot periodic elements +IF(PartBound%UseRotPeriodicBC) THEN + + ! Define 8 corner nodes of the bounding box + x(1,1:3) = (/CartNodes(1),CartNodes(3),CartNodes(5)/) + x(2,1:3) = (/CartNodes(1),CartNodes(4),CartNodes(5)/) + x(3,1:3) = (/CartNodes(1),CartNodes(3),CartNodes(6)/) + x(4,1:3) = (/CartNodes(1),CartNodes(4),CartNodes(6)/) + x(5,1:3) = (/CartNodes(2),CartNodes(3),CartNodes(5)/) + x(6,1:3) = (/CartNodes(2),CartNodes(4),CartNodes(5)/) + x(7,1:3) = (/CartNodes(2),CartNodes(3),CartNodes(6)/) + x(8,1:3) = (/CartNodes(2),CartNodes(4),CartNodes(6)/) + + ! Loop over all particle boundaries + DO iPartBound = 1, nPartBound + + ! Skip irrelevant boundaries + IF(PartBound%TargetBoundCond(iPartBound).NE.PartBound%RotPeriodicBC) CYCLE + + ! Get rotation angle + alpha = PartBound%RotPeriodicAngle(iPartBound) * PartBound%RotPeriodicTol + + ! Initialize min/max in each spatial direction + xCordsPeri(1) = HUGE(1.0) + xCordsPeri(2) = -HUGE(1.0) + xCordsPeri(3) = HUGE(1.0) + xCordsPeri(4) = -HUGE(1.0) + xCordsPeri(5) = HUGE(1.0) + xCordsPeri(6) = -HUGE(1.0) + + ! Calculate rotated coordinates + DO i = 1, 8 + xRot(1:3) = RotateVectorAroundAxis(x(i,1:3),PartBound%RotPeriodicAxis,alpha) + xCordsPeri(1) = MIN(xCordsPeri(1), xRot(1)) + xCordsPeri(2) = MAX(xCordsPeri(2), xRot(1)) + xCordsPeri(3) = MIN(xCordsPeri(3), xRot(2)) + xCordsPeri(4) = MAX(xCordsPeri(4), xRot(2)) + xCordsPeri(5) = MIN(xCordsPeri(5), xRot(3)) + xCordsPeri(6) = MAX(xCordsPeri(6), xRot(3)) + END DO ! i = 1, 8 + + ! Check whether the bounding boxes intersect + IF ( ((xCordsPeri(1).LE.CartProc(2)+halo_eps).AND.(xCordsPeri(2).GE.CartProc(1)-halo_eps)) & + .AND.((xCordsPeri(3).LE.CartProc(4)+halo_eps).AND.(xCordsPeri(4).GE.CartProc(3)-halo_eps)) & + .AND.((xCordsPeri(5).LE.CartProc(6)+halo_eps).AND.(xCordsPeri(6).GE.CartProc(5)-halo_eps))) THEN + HaloBoxInProc = .TRUE. + RETURN + END IF + + END DO ! nPartBound +END IF ! PartBound%UseRotPeriodicBC + END FUNCTION HaloBoxInProc #endif /*USE_MPI*/ From ececdc1a692480d514ed34d3214837db56bbbe1c Mon Sep 17 00:00:00 2001 From: Julian Beyer Date: Thu, 2 Nov 2023 18:34:07 +0100 Subject: [PATCH 304/495] preparation for coupled reggie --- .gitlab-ci.yml | 15 ++++++++++++++- .../radiative_transfer/radtrans_output.f90 | 2 ++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0c1fcdf2b..a56836a80 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -97,10 +97,12 @@ stages: when: on_failure paths: - build + - build_radiation cache: key: "${CI_COMMIT_REF_SLUG}" paths: - build + - build_radiation policy: pull allow_failure: true rules: @@ -219,10 +221,12 @@ build: when: on_failure paths: - build + - build_radiation cache: key: "${CI_COMMIT_REF_SLUG}" paths: - build + - build_radiation policy: push stage: build script: @@ -230,6 +234,11 @@ build: - git clone git@piclas.boltzplatz.eu:reggie2.0/reggie2.0.git reggie #- cmake .. -DLIBS_BUILD_HDF5=OFF -DPICLAS_BUILD_POSTI=ON -DPOSTI_BUILD_SUPERB=ON -DPICLAS_READIN_CONSTANTS=ON ; $GENERATOR -j all - cmake -GNinja .. -DLIBS_BUILD_HDF5=OFF -DPICLAS_BUILD_POSTI=ON -DPOSTI_BUILD_SUPERB=ON -DPICLAS_READIN_CONSTANTS=ON ; ninja -j0 all + - if [ -n "${DO_WEEKLY}" ]; then + cd ..; + mkdir -p build_radiation ; cd build_radiation; + cmake -GNinja .. -DLIBS_BUILD_HDF5=OFF -DPICLAS_BUILD_POSTI=ON -DPOSTI_BUILD_SUPERB=ON -DPICLAS_READIN_CONSTANTS=ON -DPICLAS_TIMEDISCMETHOD=Radiation -DPICLAS_INTKIND8=ON ; ninja -j0 all + fi build_maxwell: tags: @@ -737,7 +746,11 @@ WEK_DSMC: stage: reggie_weekly script: - cd build - - python ./reggie/reggie.py ../regressioncheck/WEK_DSMC + - python ./reggie/reggie.py ../regressioncheck/WEK_DSMC -s + - cd ../build_radiation + - cp $(find ../build/output_dir -name "70degCone2D_Set1_DSMCState_000.00020000000000000.h5" | head -n 1) ../regressioncheck/WEK_Radiation/Flow_N2_70degCone/. + - cp $(find ../build/output_dir -name "mesh_70degCone2D_Set1_noWake_mesh.h5" | head -n 1) ../regressioncheck/WEK_Radiation/Flow_N2_70degCone/. + - python ./../build/reggie/reggie.py -e ./bin/piclas ../regressioncheck/WEK_Radiation/Flow_N2_70degCone WEK_Reservoir: <<: *defaults_weekly diff --git a/src/radiation/radiative_transfer/radtrans_output.f90 b/src/radiation/radiative_transfer/radtrans_output.f90 index 7626a96f8..999b6968e 100644 --- a/src/radiation/radiative_transfer/radtrans_output.f90 +++ b/src/radiation/radiative_transfer/radtrans_output.f90 @@ -583,6 +583,8 @@ SUBROUTINE WriteSurfSampleToHDF5() CALL WriteAttributeToHDF5(File_ID,'MeshFile',1,StrScalar=(/TRIM(MeshFile)/)) CALL WriteAttributeToHDF5(File_ID,'BC_Surf',nSurfBC,StrArray=SurfBCName) CALL WriteAttributeToHDF5(File_ID,'N',1,IntegerScalar=1) + CALL WriteAttributeToHDF5(File_ID,'Time' ,1,RealScalar=0.) + CALL WriteAttributeToHDF5(File_ID,'DSMC_nSurfSample',1,IntegerScalar=1) NodeTypeTemp='VISU' CALL WriteAttributeToHDF5(File_ID,'NodeType',1,StrScalar=(/NodeTypeTemp/)) From 88394850b8a3439991d7630d2584f58744bbb805 Mon Sep 17 00:00:00 2001 From: Julian Beyer Date: Thu, 2 Nov 2023 19:05:33 +0100 Subject: [PATCH 305/495] coupled radiation reggie, 70 deg cone hot --- .gitlab-ci.yml | 4 +- ...rfState_000.00020000000000000_reference.h5 | Bin 0 -> 20808 bytes .../WEK_DSMC/Flow_N2-N_70degConeHot/DSMC.ini | 24 + .../DSMCSpecies_electronic_state_N2-N.h5 | Bin 0 -> 8392 bytes .../Flow_N2-N_70degConeHot/analyze.ini | 7 + .../Flow_N2-N_70degConeHot/command_line.ini | 2 + .../Flow_N2-N_70degConeHot/externals.ini | 7 + .../mesh_70degCone2D_Set1_noWake_mesh.h5 | Bin 0 -> 203283 bytes .../Flow_N2-N_70degConeHot/parameter.ini | 148 + .../post-vtk-DSMC-conversion/parameter.ini | 1 + .../WEK_DSMC/Flow_N2-N_70degConeHot/readme.md | 6 + ...degCone2D_Set1_reference_RadiationState.h5 | Bin 0 -> 41848 bytes ...one2D_Set1_reference_RadiationSurfState.h5 | Bin 0 -> 6504 bytes .../Flow_N2-N_70degConeHot/N2i.dat | 8677 +++++++++++++++++ .../Flow_N2-N_70degConeHot/Ni_NIST.dat | 1466 +++ .../Flow_N2-N_70degConeHot/analyze.ini | 7 + .../Flow_N2-N_70degConeHot/command_line.ini | 1 + .../Flow_N2-N_70degConeHot/externals.ini | 9 + .../Flow_N2-N_70degConeHot/parameter.ini | 147 + .../Flow_N2-N_70degConeHot/piclas2vtk.ini | 1 + .../Flow_N2-N_70degConeHot/readme.md | 5 + regressioncheck/WEK_Radiation/builds.ini | 17 + 22 files changed, 10527 insertions(+), 2 deletions(-) create mode 100644 regressioncheck/WEK_DSMC/Flow_N2-N_70degConeHot/70degCone2D_Set1_DSMCSurfState_000.00020000000000000_reference.h5 create mode 100644 regressioncheck/WEK_DSMC/Flow_N2-N_70degConeHot/DSMC.ini create mode 100644 regressioncheck/WEK_DSMC/Flow_N2-N_70degConeHot/DSMCSpecies_electronic_state_N2-N.h5 create mode 100644 regressioncheck/WEK_DSMC/Flow_N2-N_70degConeHot/analyze.ini create mode 100644 regressioncheck/WEK_DSMC/Flow_N2-N_70degConeHot/command_line.ini create mode 100644 regressioncheck/WEK_DSMC/Flow_N2-N_70degConeHot/externals.ini create mode 100755 regressioncheck/WEK_DSMC/Flow_N2-N_70degConeHot/mesh_70degCone2D_Set1_noWake_mesh.h5 create mode 100755 regressioncheck/WEK_DSMC/Flow_N2-N_70degConeHot/parameter.ini create mode 100644 regressioncheck/WEK_DSMC/Flow_N2-N_70degConeHot/post-vtk-DSMC-conversion/parameter.ini create mode 100644 regressioncheck/WEK_DSMC/Flow_N2-N_70degConeHot/readme.md create mode 100644 regressioncheck/WEK_Radiation/Flow_N2-N_70degConeHot/70degCone2D_Set1_reference_RadiationState.h5 create mode 100644 regressioncheck/WEK_Radiation/Flow_N2-N_70degConeHot/70degCone2D_Set1_reference_RadiationSurfState.h5 create mode 100755 regressioncheck/WEK_Radiation/Flow_N2-N_70degConeHot/N2i.dat create mode 100755 regressioncheck/WEK_Radiation/Flow_N2-N_70degConeHot/Ni_NIST.dat create mode 100644 regressioncheck/WEK_Radiation/Flow_N2-N_70degConeHot/analyze.ini create mode 100644 regressioncheck/WEK_Radiation/Flow_N2-N_70degConeHot/command_line.ini create mode 100644 regressioncheck/WEK_Radiation/Flow_N2-N_70degConeHot/externals.ini create mode 100755 regressioncheck/WEK_Radiation/Flow_N2-N_70degConeHot/parameter.ini create mode 100644 regressioncheck/WEK_Radiation/Flow_N2-N_70degConeHot/piclas2vtk.ini create mode 100644 regressioncheck/WEK_Radiation/Flow_N2-N_70degConeHot/readme.md create mode 100644 regressioncheck/WEK_Radiation/builds.ini diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a56836a80..46ee36e27 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -748,8 +748,8 @@ WEK_DSMC: - cd build - python ./reggie/reggie.py ../regressioncheck/WEK_DSMC -s - cd ../build_radiation - - cp $(find ../build/output_dir -name "70degCone2D_Set1_DSMCState_000.00020000000000000.h5" | head -n 1) ../regressioncheck/WEK_Radiation/Flow_N2_70degCone/. - - cp $(find ../build/output_dir -name "mesh_70degCone2D_Set1_noWake_mesh.h5" | head -n 1) ../regressioncheck/WEK_Radiation/Flow_N2_70degCone/. + - cp $(find ../build/output_dir -name "70degCone2D_Set1_DSMCState_000.00020000000000000.h5" | head -n 1) ../regressioncheck/WEK_Radiation/Flow_N2-N_70degConeHot/. + - cp $(find ../build/output_dir -name "mesh_70degCone2D_Set1_noWake_mesh.h5" | head -n 1) ../regressioncheck/WEK_Radiation/Flow_N2-N_70degConeHot/. - python ./../build/reggie/reggie.py -e ./bin/piclas ../regressioncheck/WEK_Radiation/Flow_N2_70degCone WEK_Reservoir: diff --git a/regressioncheck/WEK_DSMC/Flow_N2-N_70degConeHot/70degCone2D_Set1_DSMCSurfState_000.00020000000000000_reference.h5 b/regressioncheck/WEK_DSMC/Flow_N2-N_70degConeHot/70degCone2D_Set1_DSMCSurfState_000.00020000000000000_reference.h5 new file mode 100644 index 0000000000000000000000000000000000000000..20dd2dc7b369135e050d599ab0b650e858257844 GIT binary patch literal 20808 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 P*At$IW!`wZn+E>}1n^xg literal 0 HcmV?d00001 diff --git a/regressioncheck/WEK_DSMC/Flow_N2-N_70degConeHot/DSMC.ini b/regressioncheck/WEK_DSMC/Flow_N2-N_70degConeHot/DSMC.ini new file mode 100644 index 000000000..434e170bd --- /dev/null +++ b/regressioncheck/WEK_DSMC/Flow_N2-N_70degConeHot/DSMC.ini @@ -0,0 +1,24 @@ +! ======================================================================= +! Data for air taken from +! Species: G. A. Bird, Nonequilibrium radiation during re-entry at 10 km/s, AIAA-Paper 87-1543 +! Reactions: Iain D. Boyd, Phys. Fluids 19, 096102 (2007) +! ======================================================================= +! =============================================================================== ! +! Species1, N +! =============================================================================== ! +Part-Species1-SpeciesName=N +Part-Species1-InteractionID = 1 +Part-Species1-Tref =273 ! K +Part-Species1-dref = 3.0E-10 ! m +Part-Species1-omega=0.24 +! =============================================================================== ! +! Species2, N2 +! =============================================================================== ! +Part-Species2-SpeciesName=N2 +Part-Species2-InteractionID = 2 +Part-Species2-Tref =273 +Part-Species2-dref = 4.07E-10 +Part-Species2-omega=0.24 +Part-Species2-CharaTempVib=3393.3 +Part-Species2-Ediss_eV=9.759 +Part-Species2-CharaTempRot = 2.87 diff --git a/regressioncheck/WEK_DSMC/Flow_N2-N_70degConeHot/DSMCSpecies_electronic_state_N2-N.h5 b/regressioncheck/WEK_DSMC/Flow_N2-N_70degConeHot/DSMCSpecies_electronic_state_N2-N.h5 new file mode 100644 index 0000000000000000000000000000000000000000..60791be4058e33ed87b0b9e004a19a503c2b4480 GIT binary patch literal 8392 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 E0d5wHI{*Lx literal 0 HcmV?d00001 diff --git a/regressioncheck/WEK_DSMC/Flow_N2-N_70degConeHot/parameter.ini b/regressioncheck/WEK_DSMC/Flow_N2-N_70degConeHot/parameter.ini new file mode 100755 index 000000000..20d17ce0d --- /dev/null +++ b/regressioncheck/WEK_DSMC/Flow_N2-N_70degConeHot/parameter.ini @@ -0,0 +1,148 @@ +! =============================================================================== ! +! EQUATION (linearscalaradvection) +! =============================================================================== ! +IniExactFunc = 0 + +! =============================================================================== ! +! DISCRETIZATION +! =============================================================================== ! +N = 1 ! Polynomial degree +NAnalyze = 1 ! Number of analyze points + +! =============================================================================== ! +! MESH +! =============================================================================== ! +MeshFile = mesh_70degCone2D_Set1_noWake_mesh.h5 +useCurveds = F +TrackingMethod = triatracking +WeightDistributionMethod = 1 +! =============================================================================== ! +! OUTPUT / VISUALIZATION +! =============================================================================== ! +ProjectName = 70degCone2D_Set1 +Logging = F +printRandomSeeds = F +IterDisplayStep = 100 +! =============================================================================== ! +! CALCULATION +! =============================================================================== ! +tend = 2.0E-4 ! End time +Analyze_dt = 2.5E-4 ! Timestep of analyze outputs +CFLscale = 0.2 ! Scaling of theoretical CFL number +DoLoadBalance = T +PartWeightLoadBalance = T +DoInitialAutoRestart = T +InitialAutoRestart-PartWeightLoadBalance = T +LoadBalanceMaxSteps = 2 +CalcSurfaceImpact = T +! =============================================================================== ! +! BOUNDARIES +! =============================================================================== ! +Part-AdaptWallTemp = T +Part-nBounds = 5 +Part-Boundary1-SourceName = IN +Part-Boundary1-Condition = open +Part-Boundary2-SourceName = OUT +Part-Boundary2-Condition = open +Part-Boundary3-SourceName = WALL +Part-Boundary3-Condition = reflective +Part-Boundary3-WallTemp = 300. +Part-Boundary3-TransACC = 1. +Part-Boundary3-MomentumACC = 1. +Part-Boundary3-VibACC = 1. +Part-Boundary3-RotACC = 1. +Part-Boundary3-ElecACC = 1. +Part-Boundary3-UseAdaptedWallTemp = T +Part-Boundary3-RadiativeEmissivity = 1.0 +Part-Boundary4-SourceName = SYMAXIS +Part-Boundary4-Condition = symmetric_axis +Part-Boundary5-SourceName = ROTSYM +Part-Boundary5-Condition = symmetric +Part-FIBGMdeltas = (/0.001,0.001,0.01/) +! =============================================================================== ! +! PARTICLES +! =============================================================================== ! +Part-maxParticleNumber = 500000 +Part-nSpecies = 2 +! =============================================================================== ! +! Species1 - N +! =============================================================================== ! +Part-Species1-MacroParticleFactor=2E11 +Part-Species1-MassIC=2.32600E-26 + +Part-Species1-nInits=1 +Part-Species1-Init1-SpaceIC=cell_local +Part-Species1-Init1-velocityDistribution=maxwell_lpn +Part-Species1-Init1-PartDensity=5.96E+020 +Part-Species1-Init1-VeloIC=11360 +Part-Species1-Init1-VeloVecIC=(/1.,0.,0./) +Part-Species1-Init1-MWTemperatureIC=195 +Part-Species1-Init1-TempElec=195 + +Part-Species1-nSurfaceFluxBCs=1 +Part-Species1-Surfaceflux1-BC=1 +Part-Species1-Surfaceflux1-velocityDistribution=maxwell_lpn +Part-Species1-Surfaceflux1-VeloIC=11360 +Part-Species1-Surfaceflux1-VeloVecIC=(/1.,0.,0./) +Part-Species1-Surfaceflux1-MWTemperatureIC=195 +Part-Species1-Surfaceflux1-TempElec=195 +Part-Species1-Surfaceflux1-PartDensity=5.96E+020 +! =============================================================================== ! +! Species2 - N2 +! =============================================================================== ! +Part-Species2-MacroParticleFactor = 2E11 +Part-Species2-MassIC = 4.652E-26 ! N2 Molecular Mass + +Part-Species2-nInits = 1 +Part-Species2-Init1-SpaceIC = cell_local +Part-Species2-Init1-velocityDistribution = maxwell_lpn +Part-Species2-Init1-PartDensity = 5.96E+020 +Part-Species2-Init1-VeloIC = 11360 +Part-Species2-Init1-VeloVecIC = (/1.,0.,0./) +Part-Species2-Init1-MWTemperatureIC = 195 +Part-Species2-Init1-TempVib = 195 +Part-Species2-Init1-TempRot = 195 +Part-Species2-Init1-TempElec = 195 + +Part-Species2-nSurfaceFluxBCs = 1 +Part-Species2-Surfaceflux1-BC = 1 +Part-Species2-Surfaceflux1-velocityDistribution = maxwell_lpn +Part-Species2-Surfaceflux1-VeloIC = 11360 +Part-Species2-Surfaceflux1-VeloVecIC = (/1.,0.,0./) +Part-Species2-Surfaceflux1-MWTemperatureIC = 195 +Part-Species2-Surfaceflux1-TempVib = 195 +Part-Species2-Surfaceflux1-TempRot = 195 +Part-Species2-Surfaceflux1-TempElec = 195 +Part-Species2-Surfaceflux1-PartDensity = 5.96E+020 +! =============================================================================== ! +! DSMC +! =============================================================================== ! +UseDSMC = T +ManualTimeStep = 2.0000E-07 +Particles-HaloEpsVelo = 8.000E+04 +Particles-NumberForDSMCOutputs = 1 +Part-TimeFracForSampling = 0.5 +Particles-DSMC-CalcSurfaceVal = T +Particles-DSMC-CalcQualityFactors = T +Particles-DSMCReservoirSim = F +Particles-DSMC-CollisMode = 2 !(1:elast coll, 2: elast + rela, 3:chem) +!Particles-DSMC-ElecRelaxProb = 0.01 +Particles-DSMC-ElectronicModel = 1 +Particles-DSMCElectronicDatabase = DSMCSpecies_electronic_state_N2-N.h5 +EpsMergeElectronicState = 3E-2 +Part-NumberOfRandomSeeds = 2 +Particles-RandomSeed1 = 1 +Particles-RandomSeed2 = 2 +Particles-DSMC-UseOctree = T +Particles-DSMC-UseNearestNeighbour = T +Particles-OctreePartNumNode = 40 +Particles-OctreePartNumNodeMin = 28 +Particles-MPIWeight = 1000 +! Symmetry +Particles-Symmetry2D = T +Particles-Symmetry2DAxisymmetric = T +! Radial Weighting +Particles-RadialWeighting = T +Particles-RadialWeighting-PartScaleFactor = 10 !initially 60 +Particles-RadialWeighting-CloneMode = 2 +Particles-RadialWeighting-CloneDelay = 5 diff --git a/regressioncheck/WEK_DSMC/Flow_N2-N_70degConeHot/post-vtk-DSMC-conversion/parameter.ini b/regressioncheck/WEK_DSMC/Flow_N2-N_70degConeHot/post-vtk-DSMC-conversion/parameter.ini new file mode 100644 index 000000000..26b9fd923 --- /dev/null +++ b/regressioncheck/WEK_DSMC/Flow_N2-N_70degConeHot/post-vtk-DSMC-conversion/parameter.ini @@ -0,0 +1 @@ +NVisu = 1 \ No newline at end of file diff --git a/regressioncheck/WEK_DSMC/Flow_N2-N_70degConeHot/readme.md b/regressioncheck/WEK_DSMC/Flow_N2-N_70degConeHot/readme.md new file mode 100644 index 000000000..f8a3451e4 --- /dev/null +++ b/regressioncheck/WEK_DSMC/Flow_N2-N_70degConeHot/readme.md @@ -0,0 +1,6 @@ +# DSMC - Hypersonic flow around a 70° Cone (Axisymmetric) - Radiation pipeline +* Simulation of a hypersonic N2-N flow around a 70° blunted cone +* Test case based on 70degCone-Reggie, however, since the radiation tool chain shall be tested, this one has the FIRE II inflow conditions at 76 km altitude. In addition, N was added as an inflow species +* Comparison of the heat flux with a reference surface state file +* The wake of the heat shield was not included due to strong fluctuations and long sampling duration prohibiting the use of the test case as a regression test +* Additionally, the "Particles-RadialWeighting-PartScaleFactor" is reduced to safe computational time diff --git a/regressioncheck/WEK_Radiation/Flow_N2-N_70degConeHot/70degCone2D_Set1_reference_RadiationState.h5 b/regressioncheck/WEK_Radiation/Flow_N2-N_70degConeHot/70degCone2D_Set1_reference_RadiationState.h5 new file mode 100644 index 0000000000000000000000000000000000000000..8581a018f546795e841e95a0f088817016eb403c GIT binary patch literal 41848 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 Zd;sPCdw0M5F7AJ74AzYwP}%}B@DE0ARUrTX literal 0 HcmV?d00001 diff --git a/regressioncheck/WEK_Radiation/Flow_N2-N_70degConeHot/N2i.dat b/regressioncheck/WEK_Radiation/Flow_N2-N_70degConeHot/N2i.dat new file mode 100755 index 000000000..58e7f09d6 --- /dev/null +++ b/regressioncheck/WEK_Radiation/Flow_N2-N_70degConeHot/N2i.dat @@ -0,0 +1,8677 @@ +c======================================================================== +c +c program: PARADE +c file : N2ihl.dat +c species: Molecular Nitrogen (N2) +c ($Revision: 2.2.4.2 $) +c purpose: PARADE molecule radiation data file +c last mod.: 2010/01/10 Heiko Liebhart +c remarks: Data from various sources as stated in comments VUV transitions mostly based on data from spelsberg and meyer +c +c======================================================================== +c +c Format of the input file: +c +c [Keyword] +c nL nl nc ni nr +c l_1 l_2 .. l_nl c_1 c_2 .. c_nc i_1 i_2 .. i_ni r_1 r_2 .. r_nr +c +c Legend: +c nL : number of lines +c nl : number of logical values per line +c nc : number of strings per line +c ni : number of integers per line +c nr : number of floats per line +c l_(x) : logical value with index x +c c_(x) : string with index +c i_(x) : integer with index x +c r_(x) : float with index x +c +c======================================================================== +[Version] +1 0 0 1 0 +20100110 +c +ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +c +[base] +1 0 1 3 2 +c molek. no. of phase no. of molar ionization +c name atoms ( ) ( ) charges ( ) mass [kg/kmol] energy [cm^-1] + N2 2 1 0 28.01348 125668.22 +c +c remark: +c phase: 1:gaseous, 2:liquid, 3:solid +c +ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +c +[Energy-Levels] + 14 0 1 0 0 + X1Sigma + A3Sigma + B3Pi + Bprime3Sigma + aprime1Sigma + a1Pi + w1Delta + C3Pi + b1Pi + bprime1Sigma + 1c1Pi !c1Pi + 1cprime1Sigma !cprime1Sigma + o1Pi + eprime1Sigma +c +[band-N21p] +1 0 0 3 1 +c 1st-positive band, transitions from B3Pi to A3Sigma +c up level, low level, Type Index, smf + 3 2 2 1. +c +[band-N22p] +1 0 0 3 1 +c 2nd-positive band, transitions from C3Pi to B3Pi +c up level, low level, Type Index, smf + 8 3 6 1. +c +[band-N2bh2] +1 0 0 3 1 +c Birge-Hopfield II band, transitions from bprime1Sigma to X1Sigma +c up level, low level, Type Index, smf + 10 1 1 1. +c +[band-N2bh] +1 0 0 3 1 +c Birge-Hopfield band, transitions from b1Pi to X1Sigma +c up level, low level, Type Index, smf + 9 1 2 1. +c +[band-N2lbh] +1 0 0 3 1 +c Lyman-Birge-Hopfield band, transitions from a1Pi to X1Sigma +c up level, low level, Type Index, smf + 6 1 2 1. +c +[band-N2cy] +1 0 0 3 1 +c Carroll-Yoshino band, transitions from cprime1Sigma to X1Sigma +c up level, low level, Type Index, smf + 12 1 1 1. +c +[band-N2wj] +1 0 0 3 1 +c Worley-Jenkins band, transitions from cPi to X1Sigma +c up level, low level, Type Index, smf + 11 1 2 1. +c +[band-N2w] +1 0 0 3 1 +c Worley band, transitions from o3Pi to X1Sigma +c up level, low level, Type Index, smf + 13 1 2 1. +c +c[band-N2eX] +1 0 0 3 1 +c vuv band, transitions from eprimeSigma to X1Sigma +c up level, low level, Type Index, smf + 14 1 1 1. +ccccccccccccccccccccccccccccccccccccccc +ccccccccccccccccccccccccccccccccccccccc +[X1Sigma] +17 0 0 0 1 +1.0 degen +0 Te +78670. D0 (Roncin et al. phys.ref.let.53 (1984)) +cccc vibrational constants ccccccc +2358.5337387 we (Le Roy et al. j.chem.phys. 125 (2006)) +14.3005660 wexe (Le Roy et al. j.chem.phys. 125 (2006)) +-65.22140e-4 weye (Le Roy et al. j.chem.phys. 125 (2006)) +0.6012e-4 weze (Le Roy et al. j.chem.phys. 125 (2006)) +c -0.071535e-4 weae=Y_50 (Le Roy et al. j.chem.phys. 125 (2006)) +cccc rotational constants cccccccc +1.9982596 B_e (Le Roy et al. j.chem.phys. 125 (2006)) +0.017324317 alpha_e (Le Roy et al. j.chem.phys. 125 (2006)) +c -2.277e-5 gamma_e (Le Roy et al. j.chem.phys. 125 (2006)) +c -0.0535e-5 delta_e=Y_31 (Le Roy et al. j.chem.phys. 125 (2006)) +7.00153700240 mu (Audi et al. Nucl.Phys.A_729 (2003) via Le Roys RKR) +1.0 nuspin (to be validated) +1.0 altnat (to be validated) +5.752E-6 D_e (Le Roy et al. j.chem.phys. 125 (2006)) +9.88e-9 beta_e (Le Roy et al. j.chem.phys. 125 (2006)) +1.097679454e-8 R_equ (Le Roy et al. j.chem.phys. 125(2006)) +0.0 A +0. Lambda +cccccccccccccccccccccccccccccccccccccccc +[A3Sigma] +17 0 0 0 1 +3.0 degen (Laux) +50203.66 Te (Laux) +28960.1 D0 (Laux) +cccc vibrational constants ccccccc +1460.941 we (Laux) +13.980 wexe (Laux) +0.024 weye (Laux) +-2.56E-3 weze (Laux) +cccc rotational constants cccccccc +1.4539 B_e (Laux) +0.0175 alpha_e (Laux) +7.00153700240 mu (FORT4 from Neqair 85) +1.0 nuspin (FORT4 from Neqair 85) +1.0 altnat (FORT4 from Neqair 85) +5.84E-6 D_e (Laux) +3.0E-8 beta_e (Laux) +1.293E-08 R_equ (FORT4 from Neqair 85) +0.0 A (FORT4 from Neqair 85) +0. Lambda (FORT4 from Neqair 85) +cccccccccccccccccccccccccccccccccccccccc +[B3Pi] +17 0 0 0 1 +6.0 degen (FORT4 from Neqair 85) +59619.09 Te (Laux) +38636. D0 (Laux) +cccc vibrational constants ccccccc +1734.025 we +14.412 wexe (Laux) +-0.0033 weye (Laux) +-7.9E-4 weze (Laux) +c 4.2e-5 weae (Laux) +c -1.68e-6 webe (Laux) +cccc rotational constants cccccccc +1.63772 B_e (Laux) +0.01793 alpha_e (Laux) +c -1.04e-4 gamma_e (Laux) +c 4.882e-6 delta_e (Laux) +c -2.12e-7 eta_e (Laux) +7.00153700240 mu (FORT4 from Neqair 85) +1.0 nuspin (FORT4 from Neqair 85) +1.0 altnat (FORT4 from Neqair 85) +5.527E-6 D_e (Laux) +9.5840E-9 beta_e (Laux) +1.212E-08 R_equ (FORT4 from Neqair 85) +00.0 A (FORT4 from Neqair 85) +1. Lambda (FORT4 from Neqair 85) +cccccccccccccccccccccccccccccccccccccccc +[C3Pi] +17 0 0 0 1 +6.0 degen (Laux) +89136.88 T_e (Laux) +8964.9 D0 (Laux) +cccc vibrational constants ccccccc +2047.78 we (Laux) +28.9488 wexe (Laux) +2.24731 weye (Laux) +-0.55145 weze (Laux) +cccc rotational constants cccccccc +1.82677 B_e (Laux) +0.024 alpha_e (Laux) +c 1.9e-3 gamma_e (Laux) +c -6e-4 delta_e (Laux) +7.00153700240 mu (FORT4 from Neqair 85) +1.0 nuspin (FORT4 from Neqair 85) +1.0 altnat (FORT4 from Neqair 85) +5.147E-6 D_e (Laux) +2.137E-6 beta_e (Laux) +c 1.2989e-6 Y_22 (Laux) +c -2.417e-7 Y_32 (Laux) +1.148E-08 R_equ (FORT4 from Neqair 85) +00.0 A (FORT4 from Neqair 85) +1. Lambda (FORT4 from Neqair 85) +cccccccccccccccccccccccccccccccccccccccc +[bprime1Sigma] +17 0 0 0 1 +1.0 degen +104482.3 Te (Spelsberg & Meyer j.chem.phys., vol.115, no.14, (2001)) +23806 D0 (Lofthus j.Phys.Chem.RefDat.6(1977)) +cccc vibrational constants ccccccc +7.462e+02 we (Spelsberg & Meyer j.chem.phys., vol.115, no.14, (2001)) +2.5 wexe (Spelsberg & Meyer j.chem.phys., vol.115, no.14, (2001)) +0. weye +0. weze +cccc rotational constants cccccccc +1.152 B_e (Spelsberg & Meyer j.chem.phys., vol.115, no.14, (2001)) +6.3e-3 alpha_e (Spelsberg & Meyer j.chem.phys., vol.115, no.14, (2001)) +7.00153700240 mu (Audi et al. Nucl.Phys.A_729 (2003) via Le Roys RKR) +1.0 nuspin (FORT4 from Neqair 85) +2.0 altnat (FORT4 from Neqair 85) +0 D_e +0 beta_e +1.441250643E-08 R_equ (calculated at v_00=-0.49977 via Le Roys RKR) +00.0 A +0. Lambda +ccccccccccccccccccccccccccccccccccccccc +[aprime1Sigma] +17 0 0 0 1 +1.0 degen +66977.2 Te (Laher & Gilmore J.Phys.Chem.Ref.Data.20no.4(1991)) +49424. D0 (Lofthus j.Phys.Chem.RefDat.6(1977)) +cccc vibrational constants ccccccc +1530.245 we (Laher & Gilmore J.Phys.Chem.Ref.Data.20no.4(1991)) +12.0747 wexe (Laher & Gilmore J.Phys.Chem.Ref.Data.20no.4(1991)) +0.041292 weye (Laher & Gilmore J.Phys.Chem.Ref.Data.20no.4(1991)) +-2.896E-4 weze (Laher & Gilmore J.Phys.Chem.Ref.Data.20no.4(1991)) +cccc rotational constants cccccccc +1.47988 B_e (Laher & Gilmore J.Phys.Chem.Ref.Data.20no.4(1991)) +0.016574 alpha_e (Laher & Gilmore J.Phys.Chem.Ref.Data.20no.4(1991)) +c 2.41e-5 gamma_e (Laher & Gilmore J.Phys.Chem.Ref.Data.20no.4(1991)) +7.00153700240 mu (Audi et al. Nucl.Phys.A_729 (2003) via Le Roys RKR) +1.0 nuspin +1.0 altnat +5.536274E-6 D_e calculated via Kratzer Relation +3.19261983E-7 beta_e calculated via Pekeris Relation +1.1275518E-08 R_equ (Laher & Gilmore J.Phys.Chem.Ref.Data.20no.4(1991)) +0.0 A +0. Lambda +ccccccccccccccccccccccccccccccccccccccc +[a1Pi] +17 0 0 0 1 +2.0 degen +68107.6 Te (Laher & Gilmore J.Phys.Chem.Ref.Data.20no.4(1991)) +48212 D0 (Lofthus j.Phys.Chem.RefDat.6(1977)) +ccccccc vibrational constants ccccccccccccccccc +1694.208 we (Laher & Gilmore J.Phys.Chem.Ref.Data.20no.4(1991)) +13.9491 wexe (Laher & Gilmore J.Phys.Chem.Ref.Data.20no.4(1991)) +0.0079346 weye (Laher & Gilmore J.Phys.Chem.Ref.Data.20no.4(1991)) +2.911E-4 weze (Laher & Gilmore J.Phys.Chem.Ref.Data.20no.4(1991)) +ccccccc rotational constants cccccccccccccccccc +1.61688 B_e (Laher & Gilmore J.Phys.Chem.Ref.Data.20no.4(1991)) +0.017933 alpha_e (Laher & Gilmore J.Phys.Chem.Ref.Data.20no.4(1991)) +c -2.93e-5 gamma_e (Laher & Gilmore J.Phys.Chem.Ref.Data.20no.4(1991)) +7.00153700240 mu (Audi et al. Nucl.Phys.A_729 (2003) via Le Roys RKR) +1.0 nuspin +1.0 altnat +5.890605E-6 D_e calculated via Kratzer Relation +3.560497E-7 beta_e calculated via Pekeris Relation +1.220281356E-8 R_equ (calculated at v_00=-0,5 via Le Roys RKR code) +0.0 A +1. Lambda +ccccccccccccccccccccccccccccccccccccccc +[Bprime3Sigma] +17 0 0 0 1 +6.0 degen (FORT4 from Neqair 85) +65852.4 Te +41701. D0 (Lofthus j.Phys.Chem.RefDat.6(1977)) +cccc vibrational constants ccccccc +1516.883 we (FORT4 from Neqair 85) +12.1811 wexe (FORT4 from Neqair 85) +0.041858 weye (FORT4 from Neqair 85) +-7.323E-4 weze (FORT4 from Neqair 85) +cccc rotational constants cccccccc +1.47359 B_e (FORT4 from Neqair 85) +0.016861 alpha_e (FORT4 from Neqair 85) +7.00153700240 mu (Audi et al. Nucl.Phys.A_729 (2003) via Le Roys RKR) +1.0 nuspin (to be validated) +1.0 altnat (to be validated) +5.562702E-6 D_e calculated via Kratzer Relation +3.258178E-7 beta_e calculated via Pekeris Relation +1.116E-08 R_equ (Herzberg) +0.0 A (to be validated) +0. Lambda +ccccccccccccccccccccccccccccccccccccccc +[w1Delta] +17 0 0 0 1 +2.0 degen (FORT4 from Neqair 85) +71698.8 Te (wrong! is T_0 from (Lofthus j.Phys.Chem.RefDat.6(1977)) +45465. D0 (Lofthus j.Phys.Chem.RefDat.6(1977)) +cccc vibrational constants ccccccc +1559.236 we (FORT4 from Neqair 85) +11.8874 wexe (FORT4 from Neqair 85) +0.003225 weye (FORT4 from Neqair 85) +0.0E-4 weze (FORT4 from Neqair 85) +cccc rotational constants cccccccc +1.498 B_e (FORT4 from Neqair 85) +0.0166 alpha_e (FORT4 from Neqair 85) +7.00153700240 mu (Audi et al. Nucl.Phys.A_729 (2003) via Le Roys RKR) +1.0 nuspin (to be validated) +1.0 altnat (to be validated) +5.530593E-6 D_e calculated via Kratzer Relation +3.075668E-7 beta_e calculated via Pekeris Relation +1.116E-08 R_equ (Herzberg) +0.0 A (to be validated) +2. Lambda +cccccccccccccccccccccccccccccccccccccc +[b1Pi] +17 0 0 0 1 +2.0 degen +101703.8 Te (Spelsberg & Meyer j.chem.phys., vol.115, no.14, (2001)) +16345 D0 (Lofthus j.Phys.Chem.RefDat.6(1977)) +cccc vibrational constants ccccccc +681.1 we (Spelsberg & Meyer j.chem.phys., vol.115, no.14, (2001)) +-8.8 wexe (Spelsberg & Meyer j.chem.phys., vol.115, no.14, (2001)) +0. weye +0. weze +cccc rotational constants cccccccc +1.437 B_e (Spelsberg & Meyer j.chem.phys., vol.115, no.14, (2001)) +0.0308 alpha_e (Spelsberg & Meyer j.chem.phys., vol.115, no.14, (2001)) +c 0. gamma_e +7.00153700240 mu (Audi et al. Nucl.Phys.A_729 (2003) via Le Roys RKR) +1.0 nuspin (to be valdiated) +2.0 altnat (to be valdiated) +0. D_e +0. beta_e +1.317469042E-08 R_equ (calculated at v_00=-0.51028 via Le Roys RKR code) +00.0 A +1 Lambda +ccccccccccccccccccccccccccccccccccccccc +[1cprime1Sigma] +17 0 0 0 1 +1.0 degen +104839.1 Te (Spelsberg & Meyer j.chem.phys., vol.115, no.14, (2001)) + 19744.96 D0 first ionization energy more reasonable than extapolated D_0 (87946.59) from RKR +cccc vibrational constants ccccccc +2174.8 we (Spelsberg & Meyer j.chem.phys., vol.115, no.14, (2001)) +15.9 wexe (Spelsberg & Meyer j.chem.phys., vol.115, no.14, (2001)) +0. weye +0. weze +cccc rotational constants cccccccc +1.909 B_e (Spelsberg & Meyer j.chem.phys., vol.115, no.14, (2001)) +0.0190 alpha_e (Spelsberg & Meyer j.chem.phys., vol.115, no.14, (2001)) +7.00153700240 mu (Audi et al. Nucl.Phys.A_729 (2003) via Le Roys RKR) +1.0 nuspin (to be valdiated) +2.0 altnat (to be valdiated) +0. D_e +0. beta_e +1.117354525E-08 R_equ (calculated at v_00 via Le Roys RKR) +00.0 A +0 Lambda +ccccccccccccccccccccccccccccccccccccccc +[1c1Pi] +17 0 0 0 1 +2.0 degen +104599.2 Te (Spelsberg & Meyer j.chem.phys., vol.115, no.14, (2001)) +1.9959E+004 D0 first ionization energy more reasonable than extapolated D_0 (47196.90) from RKR +cccc vibrational constants ccccccc +2228.2 we (Spelsberg & Meyer j.chem.phys., vol.115, no.14, (2001)) +17.7 wexe (Spelsberg & Meyer j.chem.phys., vol.115, no.14, (2001)) +0.0e+00 weye +0.0e+00 weze +cccc rotational constants cccccccc +1.931e+00 B_e (Spelsberg & Meyer j.chem.phys., vol.115, no.14, (2001)) +0.0204e+00 alpha_e (Spelsberg & Meyer j.chem.phys., vol.115, no.14, (2001)) +7.00153700240 mu (Audi et al. Nucl.Phys.A_729 (2003) via Le Roys RKR) +1.0 nuspin (to be valdiated) +2.0 altnat (to be valdiated) +0 D_e +0 beta_e +1.103826152E-08 R_equ (calculated at v_00 via Le Roys RKR) +00.0 A +1 Lambda +ccccccccccccccccccccccccccccccccccccccc +[o1Pi] +17 0 0 0 1 +2.0 degen +105969.3 Te (Spelsberg & Meyer j.chem.phys., vol.115, no.14, (2001)) +27764.93 D0 first ionization energy more reasonable than extapolated D_0 (88858.51) from RKR +cccc vibrational constants ccccccc +1905.9 we (Spelsberg & Meyer j.chem.phys., vol.115, no.14, (2001)) +13.1 wexe (Spelsberg & Meyer j.chem.phys., vol.115, no.14, (2001)) +0.0e+00 weye +0.0e+00 weze +cccc rotational constants cccccccc +1.730 B_e (Spelsberg & Meyer j.chem.phys., vol.115, no.14, (2001)) +0.0165 alpha_e (Spelsberg & Meyer j.chem.phys., vol.115, no.14, (2001)) +7.00153700240 mu (Audi et al. Nucl.Phys.A_729 (2003) via Le Roys RKR) +1.0 nuspin (to be valdiated) +2.0 altnat (to be valdiated) +0 D_e +0 beta_e +1.179718810E-08 R_equ (calculated at v_00 via Le Roys RKR) +00.0 A +1 Lambda +ccccccccccccccccccccccccccccccccccccccc +[eprime1Sigma] +17 0 0 0 1 +1.0 degen +115926.7 Te (Spelsberg & Meyer j.chem.phys.,vol.115,no.14,(2001)) +1.76534774E+04 D0 converges A2Pi of N2+ ion, energy (= T0_A2Pi-T0eprimeSigma) more reasonable than extrapolated D_0 (70163) from RKR +cccc vibrational constants ccccccc +2216.2 we (Spelsberg & Meyer j.chem.phys., vol.115, no.14, (2001)) +17.5 wexe (Spelsberg & Meyer j.chem.phys., vol.115, no.14, (2001)) +0 weye +0. weze +cccc rotational constants cccccccc +1.932e+00 B_e (Spelsberg & Meyer j.chem.phys., vol.115, no.14, (2001)) +0.0203e+00 alpha_e (Spelsberg & Meyer j.chem.phys., vol.115, no.14, (2001)) +7.00153700240 mu (Audi et al. Nucl.Phys.A_729 (2003) via Le Roys RKR) +1.0 nuspin (to be valdiated) +2.0 altnat (to be valdiated) +0 D_e +0 beta_e +1.116343880E-08 R_equ (calculated at v_00 via Le Roys RKR) +00.0 A +0 Lambda +cccccccccccccccccccccccccccccccccccccc +[transition-N21p] +293 0 0 0 5 +c from phd thesis of laux +c vu vl sumre2/fcf FCF SRe2 +0 0 3.63E-01 3.98E-01 1.45E-01 +0 1 3.85E-01 3.31E-01 1.27E-01 +0 2 4.03E-01 1.67E-01 6.74E-02 +0 3 4.18E-01 6.74E-02 2.82E-02 +0 4 4.31E-01 2.40E-02 1.04E-02 +0 5 4.42E-01 7.98E-03 3.53E-03 +0 6 4.52E-01 2.56E-03 1.16E-03 +1 0 3.38E-01 4.00E-01 1.35E-01 +1 1 3.07E-01 2.53E-03 7.78E-04 +1 2 3.77E-01 1.58E-01 5.96E-02 +1 3 3.97E-01 1.97E-01 7.82E-02 +1 4 4.13E-01 1.31E-01 5.40E-02 +1 5 4.27E-01 6.56E-02 2.80E-02 +1 6 4.38E-01 2.84E-02 1.24E-02 +1 7 4.48E-01 1.12E-02 5.04E-03 +2 0 3.09E-01 1.63E-01 5.03E-02 +2 1 3.30E-01 2.73E-01 9.00E-02 +2 2 3.66E-01 6.98E-02 2.55E-02 +2 3 3.58E-01 2.17E-02 7.76E-03 +2 4 3.90E-01 1.25E-01 4.86E-02 +2 5 4.08E-01 1.43E-01 5.84E-02 +2 6 4.22E-01 1.01E-01 4.27E-02 +2 7 4.34E-01 5.61E-02 2.44E-02 +2 8 4.44E-01 2.72E-02 1.21E-02 +2 9 4.53E-01 1.22E-02 5.51E-03 +3 0 2.74E-01 3.47E-02 9.53E-03 +3 1 3.02E-01 2.78E-01 8.40E-02 +3 2 3.18E-01 9.42E-02 3.00E-02 +3 3 3.55E-01 1.52E-01 5.39E-02 +3 4 4.16E-01 5.27E-03 2.19E-03 +3 5 3.78E-01 4.22E-02 1.60E-02 +3 6 4.01E-01 1.08E-01 4.33E-02 +3 7 4.17E-01 1.11E-01 4.65E-02 +3 8 4.30E-01 8.00E-02 3.44E-02 +3 9 4.40E-01 4.73E-02 2.08E-02 +3 10 4.49E-01 2.49E-02 1.12E-02 +4 0 2.34E-01 4.16E-03 9.72E-04 +4 1 2.68E-01 9.80E-02 2.63E-02 +4 2 2.95E-01 2.97E-01 8.77E-02 +4 3 2.78E-01 7.27E-03 2.02E-03 +4 4 3.46E-01 1.51E-01 5.21E-02 +4 5 3.79E-01 5.14E-02 1.95E-02 +4 6 3.25E-01 2.16E-03 7.02E-04 +4 7 3.92E-01 5.47E-02 2.15E-02 +4 8 4.11E-01 9.36E-02 3.85E-02 +4 9 4.25E-01 8.95E-02 3.80E-02 +4 10 4.36E-01 6.49E-02 2.83E-02 +4 11 4.45E-01 4.02E-02 1.79E-02 +4 12 4.53E-01 2.26E-02 1.02E-02 +5 0 1.87E-01 2.80E-04 5.23E-05 +5 1 2.28E-01 1.65E-02 3.77E-03 +5 2 2.62E-01 1.70E-01 4.45E-02 +5 3 2.87E-01 2.42E-01 6.97E-02 +5 4 3.61E-01 1.06E-02 3.81E-03 +5 5 3.36E-01 9.51E-02 3.19E-02 +5 6 3.68E-01 9.48E-02 3.49E-02 +5 7 4.14E-01 8.89E-03 3.68E-03 +5 8 3.74E-01 1.38E-02 5.15E-03 +5 9 4.03E-01 5.89E-02 2.38E-02 +5 10 4.19E-01 8.07E-02 3.38E-02 +5 11 4.31E-01 7.35E-02 3.17E-02 +5 12 4.41E-01 5.40E-02 2.38E-02 +5 13 4.49E-01 3.49E-02 1.57E-02 +6 0 1.35E-01 1.01E-05 1.36E-06 +6 1 1.81E-01 1.44E-03 2.62E-04 +6 2 2.22E-01 3.92E-02 8.72E-03 +6 3 2.56E-01 2.30E-01 5.89E-02 +6 4 2.78E-01 1.56E-01 4.33E-02 +6 5 3.29E-01 5.80E-02 1.91E-02 +6 6 3.20E-01 3.53E-02 1.13E-02 +6 7 3.59E-01 1.04E-01 3.75E-02 +6 8 3.90E-01 3.98E-02 1.55E-02 +6 10 3.91E-01 2.43E-02 9.52E-03 +6 11 4.12E-01 5.77E-02 2.38E-02 +6 12 4.25E-01 6.93E-02 2.95E-02 +6 13 4.36E-01 6.15E-02 2.68E-02 +6 14 4.44E-01 4.60E-02 2.05E-02 +6 15 4.52E-01 3.09E-02 1.40E-02 +7 1 1.29E-01 6.38E-05 8.21E-06 +7 2 1.76E-01 4.32E-03 7.61E-04 +7 3 2.16E-01 7.19E-02 1.56E-02 +7 4 2.49E-01 2.66E-01 6.62E-02 +7 5 2.65E-01 7.43E-02 1.97E-02 +7 6 3.16E-01 1.06E-01 3.34E-02 +7 7 2.61E-01 3.04E-03 7.94E-04 +7 8 3.49E-01 8.13E-02 2.84E-02 +7 9 3.78E-01 6.81E-02 2.58E-02 +7 10 4.15E-01 1.12E-02 4.64E-03 +7 11 3.57E-01 3.43E-03 1.23E-03 +7 12 4.02E-01 3.04E-02 1.22E-02 +7 13 4.19E-01 5.38E-02 2.25E-02 +7 14 4.31E-01 5.98E-02 2.57E-02 +7 15 4.40E-01 5.25E-02 2.31E-02 +7 16 4.47E-01 4.01E-02 1.80E-02 +8 2 1.23E-01 2.31E-04 2.83E-05 +8 3 1.70E-01 9.87E-03 1.68E-03 +8 4 2.10E-01 1.12E-01 2.36E-02 +8 5 2.42E-01 2.71E-01 6.56E-02 +8 6 2.39E-01 1.99E-02 4.77E-03 +8 7 3.06E-01 1.28E-01 3.92E-02 +8 8 3.93E-01 4.84E-03 1.90E-03 +8 9 3.37E-01 4.42E-02 1.49E-02 +8 10 3.69E-01 7.74E-02 2.85E-02 +8 11 3.96E-01 3.41E-02 1.35E-02 +8 12 4.78E-01 1.33E-03 6.34E-04 +8 13 3.84E-01 8.93E-03 3.43E-03 +8 14 4.10E-01 3.25E-02 1.33E-02 +8 15 4.24E-01 4.88E-02 2.07E-02 +8 16 4.34E-01 5.19E-02 2.26E-02 +8 17 4.43E-01 4.57E-02 2.02E-02 +8 18 4.50E-01 3.57E-02 1.61E-02 +9 3 1.17E-01 6.27E-04 7.34E-05 +9 4 1.64E-01 1.90E-02 3.12E-03 +9 5 2.04E-01 1.56E-01 3.18E-02 +9 6 2.34E-01 2.49E-01 5.82E-02 +9 7 8.98E-03 1.66E-04 1.49E-06 +9 8 2.96E-01 1.20E-01 3.55E-02 +9 9 3.46E-01 2.97E-02 1.03E-02 +9 10 3.13E-01 1.30E-02 4.07E-03 +9 11 3.59E-01 6.53E-02 2.34E-02 +9 12 3.85E-01 5.36E-02 2.06E-02 +9 13 4.14E-01 1.39E-02 5.78E-03 +9 14 2.00E-01 1.18E-04 2.36E-05 +9 15 3.97E-01 1.31E-02 5.18E-03 +9 16 4.16E-01 3.21E-02 1.34E-02 +9 17 4.29E-01 4.38E-02 1.88E-02 +9 18 4.38E-01 4.55E-02 1.99E-02 +9 19 4.45E-01 4.03E-02 1.79E-02 +9 20 4.52E-01 3.22E-02 1.46E-02 +10 3 5.36E-02 1.71E-05 9.16E-07 +10 4 1.12E-01 1.42E-03 1.59E-04 +10 5 1.59E-01 3.24E-02 5.13E-03 +10 6 1.97E-01 1.98E-01 3.91E-02 +10 7 2.25E-01 2.05E-01 4.62E-02 +10 8 3.23E-01 1.06E-02 3.41E-03 +10 9 2.85E-01 8.89E-02 2.54E-02 +10 10 3.30E-01 5.98E-02 1.98E-02 +10 11 7.87E-02 1.42E-04 1.12E-05 +10 12 3.46E-01 4.06E-02 1.41E-02 +10 13 3.75E-01 5.96E-02 2.23E-02 +10 14 3.98E-01 3.17E-02 1.26E-02 +10 15 4.38E-01 4.49E-03 1.97E-03 +10 16 3.55E-01 1.70E-03 6.03E-04 +10 17 4.05E-01 1.52E-02 6.17E-03 +10 18 4.21E-01 3.04E-02 1.28E-02 +10 19 4.32E-01 3.90E-02 1.68E-02 +10 20 4.40E-01 4.01E-02 1.76E-02 +10 21 4.47E-01 3.59E-02 1.61E-02 +11 4 4.92E-02 4.42E-05 2.18E-06 +11 5 1.06E-01 2.84E-03 3.01E-04 +11 6 1.53E-01 5.05E-02 7.70E-03 +11 7 1.91E-01 2.34E-01 4.47E-02 +11 8 2.15E-01 1.50E-01 3.23E-02 +11 9 2.86E-01 3.97E-02 1.14E-02 +11 10 2.71E-01 5.06E-02 1.37E-02 +11 11 3.18E-01 8.01E-02 2.55E-02 +11 12 3.86E-01 6.97E-03 2.69E-03 +11 13 3.27E-01 1.59E-02 5.20E-03 +11 14 3.64E-01 5.06E-02 1.84E-02 +11 15 3.87E-01 4.46E-02 1.73E-02 +11 16 4.11E-01 1.71E-02 7.04E-03 +11 17 4.87E-01 9.45E-04 4.60E-04 +11 18 3.80E-01 3.51E-03 1.33E-03 +11 19 4.11E-01 1.58E-02 6.49E-03 +11 20 4.24E-01 2.78E-02 1.18E-02 +11 21 4.34E-01 3.44E-02 1.49E-02 +12 5 4.50E-02 1.00E-04 4.50E-06 +12 6 1.00E-01 5.16E-03 5.19E-04 +12 7 1.47E-01 7.33E-02 1.07E-02 +12 8 1.84E-01 2.60E-01 4.78E-02 +12 9 2.03E-01 9.45E-02 1.92E-02 +12 10 2.69E-01 7.40E-02 1.99E-02 +12 11 2.48E-01 1.85E-02 4.57E-03 +12 12 3.08E-01 8.28E-02 2.55E-02 +12 13 3.51E-01 2.62E-02 9.22E-03 +12 14 2.58E-01 1.67E-03 4.31E-04 +12 15 3.51E-01 3.21E-02 1.13E-02 +12 16 3.77E-01 4.66E-02 1.75E-02 +12 17 3.98E-01 3.04E-02 1.21E-02 +12 18 4.23E-01 8.81E-03 3.73E-03 +12 19 7.97E-01 4.50E-05 3.59E-05 +12 20 3.92E-01 4.64E-03 1.82E-03 +12 21 4.14E-01 1.51E-02 6.25E-03 +13 6 4.07E-02 2.05E-04 8.33E-06 +13 7 9.50E-02 8.70E-03 8.27E-04 +13 8 1.40E-01 1.00E-01 1.41E-02 +13 9 1.77E-01 2.73E-01 4.81E-02 +13 10 1.86E-01 4.74E-02 8.82E-03 +13 11 2.57E-01 1.02E-01 2.61E-02 +13 12 1.59E-01 1.67E-03 2.65E-04 +13 13 2.96E-01 6.87E-02 2.03E-02 +13 14 3.35E-01 4.70E-02 1.58E-02 +13 15 4.42E-01 1.90E-03 8.39E-04 +13 16 3.31E-01 1.31E-02 4.33E-03 +13 17 3.65E-01 3.75E-02 1.37E-02 +13 18 3.87E-01 3.75E-02 1.45E-02 +13 19 4.06E-01 2.01E-02 8.14E-03 +13 20 4.35E-01 4.54E-03 1.97E-03 +14 7 3.66E-02 3.87E-04 1.42E-05 +14 8 8.95E-02 1.38E-02 1.24E-03 +14 9 1.34E-01 1.31E-01 1.76E-02 +14 10 1.69E-01 2.71E-01 4.57E-02 +14 11 1.54E-01 1.53E-02 2.35E-03 +14 12 2.46E-01 1.15E-01 2.82E-02 +14 13 3.92E-01 2.63E-03 1.03E-03 +14 14 2.82E-01 4.48E-02 1.26E-02 +14 15 3.23E-01 5.96E-02 1.93E-02 +14 16 3.69E-01 1.39E-02 5.10E-03 +14 17 2.64E-01 1.60E-03 4.21E-04 +14 18 3.50E-01 2.22E-02 7.79E-03 +14 19 3.75E-01 3.54E-02 1.33E-02 +14 20 3.94E-01 2.86E-02 1.13E-02 +14 21 4.12E-01 1.35E-02 5.57E-03 +15 8 3.27E-02 6.86E-04 2.24E-05 +15 9 8.41E-02 2.09E-02 1.76E-03 +15 10 1.28E-01 1.64E-01 2.09E-02 +15 11 1.61E-01 2.54E-01 4.09E-02 +15 12 2.55E-02 8.64E-04 2.20E-05 +15 13 2.35E-01 1.11E-01 2.61E-02 +15 14 3.06E-01 1.77E-02 5.42E-03 +15 15 2.62E-01 2.05E-02 5.37E-03 +15 16 3.11E-01 5.93E-02 1.84E-02 +15 17 3.47E-01 3.02E-02 1.05E-02 +15 18 4.68E-01 1.22E-03 5.72E-04 +15 19 3.25E-01 7.92E-03 2.57E-03 +15 20 3.62E-01 2.55E-02 9.21E-03 +15 21 3.82E-01 3.04E-02 1.16E-02 +16 9 2.90E-02 1.15E-03 3.34E-05 +16 10 7.87E-02 3.02E-02 2.38E-03 +16 11 1.21E-01 1.97E-01 2.38E-02 +16 12 1.52E-01 2.26E-01 3.43E-02 +16 13 3.48E-01 3.60E-03 1.25E-03 +16 14 2.23E-01 9.29E-02 2.07E-02 +16 15 2.81E-01 3.94E-02 1.11E-02 +16 16 2.13E-01 4.23E-03 9.04E-04 +16 17 2.98E-01 4.71E-02 1.40E-02 +16 18 3.32E-01 4.30E-02 1.43E-02 +16 19 3.76E-01 1.03E-02 3.88E-03 +16 20 2.02E-01 4.47E-04 9.02E-05 +16 21 3.43E-01 1.27E-02 4.35E-03 +17 10 2.55E-02 1.84E-03 4.71E-05 +17 11 7.34E-02 4.21E-02 3.09E-03 +17 12 1.15E-01 2.28E-01 2.62E-02 +17 13 1.43E-01 1.88E-01 2.69E-02 +17 14 2.47E-01 1.98E-02 4.90E-03 +17 15 2.09E-01 6.61E-02 1.38E-02 +17 16 2.65E-01 5.94E-02 1.58E-02 +17 17 7.40E-01 2.21E-04 1.64E-04 +17 18 2.81E-01 2.87E-02 8.07E-03 +17 19 3.19E-01 4.64E-02 1.48E-02 +17 20 3.52E-01 2.33E-02 8.20E-03 +17 21 4.31E-01 2.10E-03 9.07E-04 +18 11 2.22E-02 2.83E-03 6.30E-05 +18 12 6.81E-02 5.66E-02 3.86E-03 +18 13 1.08E-01 2.56E-01 2.77E-02 +18 14 1.32E-01 1.46E-01 1.93E-02 +18 15 2.18E-01 4.38E-02 9.55E-03 +18 16 1.90E-01 3.80E-02 7.23E-03 +18 17 2.52E-01 7.09E-02 1.79E-02 +18 18 3.30E-01 7.93E-03 2.62E-03 +18 19 2.55E-01 1.13E-02 2.89E-03 +18 20 3.05E-01 3.96E-02 1.21E-02 +18 21 3.35E-01 3.35E-02 1.12E-02 +19 11 1.33E-02 3.90E-05 5.20E-07 +19 12 1.91E-02 4.19E-03 8.00E-05 +19 13 6.28E-02 7.40E-02 4.65E-03 +19 14 1.01E-01 2.79E-01 2.83E-02 +19 15 1.20E-01 1.03E-01 1.24E-02 +19 16 2.00E-01 6.93E-02 1.39E-02 +19 17 1.62E-01 1.52E-02 2.45E-03 +19 18 2.38E-01 7.08E-02 1.69E-02 +19 19 2.93E-01 2.28E-02 6.68E-03 +19 20 1.68E-01 1.28E-03 2.15E-04 +19 21 2.88E-01 2.59E-02 7.45E-03 +20 12 2.08E-02 5.59E-05 1.16E-06 +20 13 1.61E-02 5.99E-03 9.62E-05 +20 14 5.76E-02 9.41E-02 5.43E-03 +20 15 9.46E-02 2.96E-01 2.80E-02 +20 16 1.06E-01 6.51E-02 6.88E-03 +20 17 1.86E-01 9.05E-02 1.68E-02 +20 18 8.23E-02 2.27E-03 1.87E-04 +20 19 2.24E-01 5.98E-02 1.34E-02 +20 20 2.73E-01 3.84E-02 1.05E-02 +20 21 4.33E-01 1.24E-03 5.37E-04 +21 13 3.23E-02 7.48E-05 2.42E-06 +21 14 1.32E-02 8.27E-03 1.09E-04 +21 15 5.25E-02 1.17E-01 6.13E-03 +21 16 8.77E-02 3.05E-01 2.67E-02 +21 17 8.59E-02 3.44E-02 2.96E-03 +21 18 1.73E-01 1.03E-01 1.79E-02 +21 19 5.64E-01 7.03E-04 3.97E-04 +21 20 2.08E-01 4.19E-02 8.71E-03 +21 21 2.56E-01 4.85E-02 1.24E-02 +[transition-N22p] +83 0 0 0 5 +c from phd thesis of laux +c vu vl sumre2/fcf FCF SRe2 +0 0 3.36E+00 4.52E-01 1.52E+00 +0 1 3.68E+00 3.28E-01 1.21E+00 +0 2 3.93E+00 1.47E-01 5.76E-01 +0 3 4.13E+00 5.20E-02 2.15E-01 +0 4 4.32E+00 1.61E-02 6.95E-02 +0 5 4.48E+00 4.57E-03 2.05E-02 +0 6 4.63E+00 1.23E-03 5.67E-03 +0 7 4.75E+00 3.17E-04 1.51E-03 +0 8 4.84E+00 8.10E-05 3.92E-04 +0 9 4.90E+00 2.08E-05 1.02E-04 +0 10 4.94E+00 5.50E-06 2.72E-05 +0 11 4.98E+00 1.50E-06 7.46E-06 +1 0 2.99E+00 3.94E-01 1.18E+00 +1 1 2.92E+00 2.18E-02 6.38E-02 +1 2 3.59E+00 2.04E-01 7.31E-01 +1 3 3.87E+00 1.98E-01 7.66E-01 +1 4 4.08E+00 1.10E-01 4.49E-01 +1 5 4.27E+00 4.68E-02 2.00E-01 +1 6 4.43E+00 1.71E-02 7.57E-02 +1 7 4.58E+00 5.64E-03 2.58E-02 +1 8 4.70E+00 1.75E-03 8.21E-03 +1 9 4.81E+00 5.20E-04 2.50E-03 +1 10 4.88E+00 1.52E-04 7.43E-04 +1 11 4.94E+00 4.44E-05 2.19E-04 +1 12 4.98E+00 1.31E-05 6.50E-05 +1 13 5.00E+00 3.87E-06 1.93E-05 +1 14 5.06E+00 1.13E-06 5.70E-06 +2 0 2.54E+00 1.33E-01 3.37E-01 +2 1 2.84E+00 3.42E-01 9.71E-01 +2 2 3.83E+00 2.37E-02 9.08E-02 +2 3 3.45E+00 6.41E-02 2.21E-01 +2 4 3.80E+00 1.61E-01 6.11E-01 +2 5 4.03E+00 1.39E-01 5.59E-01 +2 6 4.22E+00 7.91E-02 3.33E-01 +2 7 4.38E+00 3.61E-02 1.58E-01 +2 8 4.53E+00 1.44E-02 6.52E-02 +2 9 4.66E+00 5.24E-03 2.44E-02 +2 10 4.77E+00 1.79E-03 8.54E-03 +2 11 4.85E+00 5.90E-04 2.86E-03 +2 12 4.92E+00 1.90E-04 9.37E-04 +2 13 4.98E+00 6.05E-05 3.02E-04 +2 14 5.03E+00 1.90E-05 9.56E-05 +2 15 5.06E+00 5.84E-06 2.96E-05 +2 16 5.10E+00 1.70E-06 8.66E-06 +3 0 1.90E+00 2.02E-02 3.82E-02 +3 1 2.39E+00 2.53E-01 6.04E-01 +3 2 2.62E+00 2.11E-01 5.51E-01 +3 3 3.54E+00 8.86E-02 3.14E-01 +3 4 2.96E+00 4.98E-03 1.48E-02 +3 5 3.72E+00 9.39E-02 3.49E-01 +3 6 3.97E+00 1.31E-01 5.20E-01 +3 7 4.17E+00 9.88E-02 4.12E-01 +3 8 4.34E+00 5.54E-02 2.40E-01 +3 9 4.48E+00 2.62E-02 1.17E-01 +3 10 4.61E+00 1.10E-02 5.09E-02 +3 11 4.73E+00 4.28E-03 2.02E-02 +3 12 4.83E+00 1.57E-03 7.58E-03 +3 13 4.90E+00 5.56E-04 2.72E-03 +3 14 4.95E+00 1.92E-04 9.52E-04 +3 15 5.02E+00 6.43E-05 3.23E-04 +3 16 5.11E+00 2.05E-05 1.05E-04 +3 17 5.19E+00 6.14E-06 3.18E-05 +3 18 5.23E+00 1.64E-06 8.55E-06 +4 0 7.76E-01 9.58E-04 7.43E-04 +4 1 1.70E+00 5.37E-02 9.12E-02 +4 2 2.21E+00 3.30E-01 7.30E-01 +4 3 2.27E+00 1.20E-01 2.71E-01 +4 4 3.50E+00 1.14E-01 3.99E-01 +4 5 4.25E+00 3.65E-03 1.55E-02 +4 6 3.61E+00 4.05E-02 1.46E-01 +4 7 3.92E+00 1.01E-01 3.95E-01 +4 8 4.12E+00 1.01E-01 4.15E-01 +4 9 4.30E+00 6.80E-02 2.93E-01 +4 10 4.45E+00 3.73E-02 1.66E-01 +4 11 4.57E+00 1.79E-02 8.18E-02 +4 12 4.69E+00 7.80E-03 3.66E-02 +4 13 4.80E+00 3.15E-03 1.51E-02 +4 14 4.90E+00 1.20E-03 5.90E-03 +4 15 4.95E+00 4.47E-04 2.21E-03 +4 16 4.98E+00 1.61E-04 8.03E-04 +4 17 5.05E+00 5.48E-05 2.77E-04 +4 18 5.22E+00 1.67E-05 8.70E-05 +4 19 5.48E+00 4.28E-06 2.35E-05 +[transition-N2bh2] +2186 0 0 0 5 +c data calculated with LEVEL_8.0 +c using Potentialenergyfunctions retrieved via RKR1 2.0 +c with Spectroscopic constants from +c Spelsberg & Meyer j.chem.phys.,vol.115,no.14,(2001) +c documented in ESA report Aerothermochemistry +c +c vu vl sumre2/fcf FCF SRe2 + 0 0 1.468565E+00 2.796400E-07 4.106695E-07 + 0 1 1.453286E+00 3.734672E-06 5.427545E-06 + 0 2 1.423217E+00 2.612273E-05 3.717832E-05 + 0 3 1.381913E+00 1.263369E-04 1.745867E-04 + 0 4 1.331689E+00 4.715912E-04 6.280126E-04 + 0 5 1.274560E+00 1.440062E-03 1.835445E-03 + 0 6 1.212423E+00 3.726890E-03 4.518566E-03 + 0 7 1.146959E+00 8.368146E-03 9.597920E-03 + 0 8 1.079582E+00 1.657006E-02 1.788874E-02 + 0 9 1.011458E+00 2.927922E-02 2.961470E-02 + 0 10 9.435581E-01 4.657204E-02 4.394342E-02 + 0 11 8.766828E-01 6.712035E-02 5.884326E-02 + 0 12 8.114419E-01 8.807772E-02 7.146995E-02 + 0 13 7.482498E-01 1.056154E-01 7.902672E-02 + 0 14 6.873951E-01 1.160273E-01 7.975659E-02 + 0 15 6.291767E-01 1.169808E-01 7.360159E-02 + 0 16 5.740129E-01 1.083472E-01 6.219267E-02 + 0 17 5.224392E-01 9.221513E-02 4.817681E-02 + 0 18 4.750181E-01 7.209790E-02 3.424781E-02 + 0 19 4.322293E-01 5.173154E-02 2.235989E-02 + 0 20 3.943288E-01 3.400860E-02 1.341057E-02 + 0 21 3.611685E-01 2.043615E-02 7.380893E-03 + 0 22 3.322270E-01 1.118954E-02 3.717467E-03 + 0 23 3.071276E-01 5.559659E-03 1.707525E-03 + 0 24 2.861611E-01 2.493683E-03 7.135951E-04 + 0 25 2.697126E-01 1.003067E-03 2.705399E-04 + 0 26 2.568990E-01 3.588395E-04 9.218550E-05 + 0 27 2.461257E-01 1.129688E-04 2.780454E-05 + 0 28 2.385897E-01 3.087403E-05 7.366224E-06 + 0 29 2.385096E-01 7.195323E-06 1.716154E-06 + 0 30 2.424911E-01 1.395895E-06 3.384922E-07 + 0 31 2.332230E-01 2.178929E-07 5.081764E-08 + 0 32 2.354023E-01 2.600801E-08 6.122345E-09 + 0 33 4.045719E-01 2.180890E-09 8.823269E-10 + 0 34 2.631751E-01 1.087849E-10 2.862948E-11 + 0 35 6.762841E+00 1.988100E-12 1.344520E-11 + 0 36 9.693570E+03 1.600000E-15 1.550971E-11 + 0 37 1.503545E+02 3.600000E-15 5.412760E-13 + 0 38 1.889993E+05 1.000000E-16 1.889993E-11 + 1 0 1.473134E+00 4.021509E-06 5.924221E-06 + 1 1 1.463218E+00 4.682364E-05 6.851320E-05 + 1 2 1.437310E+00 2.836742E-04 4.077276E-04 + 1 3 1.399466E+00 1.177569E-03 1.647967E-03 + 1 4 1.352061E+00 3.728922E-03 5.041731E-03 + 1 5 1.297114E+00 9.517220E-03 1.234492E-02 + 1 6 1.236576E+00 2.020410E-02 2.498390E-02 + 1 7 1.172225E+00 3.633287E-02 4.259029E-02 + 1 8 1.105555E+00 5.585728E-02 6.175331E-02 + 1 9 1.037787E+00 7.351288E-02 7.629075E-02 + 1 10 9.699489E-01 8.219616E-02 7.972607E-02 + 1 11 9.029476E-01 7.644500E-02 6.902583E-02 + 1 12 8.375805E-01 5.635529E-02 4.720209E-02 + 1 13 7.745317E-01 2.920150E-02 2.261748E-02 + 1 14 7.148743E-01 6.917395E-03 4.945068E-03 + 1 15 6.401146E-01 2.468154E-04 1.579902E-04 + 1 16 5.963013E-01 1.292929E-02 7.709754E-03 + 1 17 5.446816E-01 3.961509E-02 2.157761E-02 + 1 18 4.962435E-01 6.883569E-02 3.415927E-02 + 1 19 4.518435E-01 8.903159E-02 4.022834E-02 + 1 20 4.118533E-01 9.386801E-02 3.865985E-02 + 1 21 3.764526E-01 8.400753E-02 3.162485E-02 + 1 22 3.456589E-01 6.513063E-02 2.251298E-02 + 1 23 3.192165E-01 4.419885E-02 1.410900E-02 + 1 24 2.966980E-01 2.637083E-02 7.824172E-03 + 1 25 2.779263E-01 1.383820E-02 3.845998E-03 + 1 26 2.630353E-01 6.367906E-03 1.674984E-03 + 1 27 2.518084E-01 2.554083E-03 6.431396E-04 + 1 28 2.435919E-01 8.844658E-04 2.154487E-04 + 1 29 2.386046E-01 2.608742E-04 6.224578E-05 + 1 30 2.379339E-01 6.429730E-05 1.529851E-05 + 1 31 2.409921E-01 1.288796E-05 3.105896E-06 + 1 32 2.468880E-01 2.018531E-06 4.983511E-07 + 1 33 2.595347E-01 2.318904E-07 6.018360E-08 + 1 34 2.897483E-01 1.745305E-08 5.056991E-09 + 1 35 3.857669E-01 6.656400E-10 2.567819E-10 + 1 36 1.804779E-02 4.202500E-12 7.584582E-14 + 1 37 8.307354E-01 3.600000E-13 2.990647E-13 + 1 38 8.994134E+01 3.610000E-14 3.246882E-12 + 1 39 3.731630E+04 1.000000E-16 3.731630E-12 + 1 40 1.396956E+03 1.000000E-16 1.396956E-13 + 2 0 1.476093E+00 2.920019E-05 4.310220E-05 + 2 1 1.471944E+00 2.938982E-04 4.326018E-04 + 2 2 1.450432E+00 1.525888E-03 2.213196E-03 + 2 3 1.416296E+00 5.361536E-03 7.593524E-03 + 2 4 1.371996E+00 1.413307E-02 1.939053E-02 + 2 5 1.319515E+00 2.936130E-02 3.874267E-02 + 2 6 1.260856E+00 4.920218E-02 6.203688E-02 + 2 7 1.197931E+00 6.685744E-02 8.009062E-02 + 2 8 1.132383E+00 7.269265E-02 8.231595E-02 + 2 9 1.065591E+00 6.057477E-02 6.454795E-02 + 2 10 9.989446E-01 3.447579E-02 3.443941E-02 + 2 11 9.355041E-01 8.895238E-03 8.321531E-03 + 2 12 8.085196E-01 1.873485E-04 1.514749E-04 + 2 13 7.910618E-01 1.402085E-02 1.109136E-02 + 2 14 7.317368E-01 3.952207E-02 2.891975E-02 + 2 15 6.731655E-01 5.658561E-02 3.809148E-02 + 2 16 6.165254E-01 5.156053E-02 3.178838E-02 + 2 17 5.616203E-01 2.836624E-02 1.593105E-02 + 2 18 5.046859E-01 5.471500E-03 2.761389E-03 + 2 19 4.944254E-01 1.404986E-03 6.946606E-04 + 2 20 4.345717E-01 2.106269E-02 9.153248E-03 + 2 21 3.948812E-01 5.338934E-02 2.108245E-02 + 2 22 3.612277E-01 8.060505E-02 2.911678E-02 + 2 23 3.324407E-01 9.023768E-02 2.999868E-02 + 2 24 3.080539E-01 8.102194E-02 2.495913E-02 + 2 25 2.876136E-01 6.043249E-02 1.738120E-02 + 2 26 2.708234E-01 3.806395E-02 1.030861E-02 + 2 27 2.577180E-01 2.036999E-02 5.249714E-03 + 2 28 2.481910E-01 9.254005E-03 2.296761E-03 + 2 29 2.417005E-01 3.544962E-03 8.568189E-04 + 2 30 2.384248E-01 1.130563E-03 2.695543E-04 + 2 31 2.396260E-01 2.941839E-04 7.049412E-05 + 2 32 2.444345E-01 6.056793E-05 1.480489E-05 + 2 33 2.515942E-01 9.405017E-06 2.366248E-06 + 2 34 2.736455E-01 1.016044E-06 2.780358E-07 + 2 35 3.155709E-01 6.513214E-08 2.055381E-08 + 2 36 2.770808E-01 1.586429E-09 4.395690E-10 + 2 37 9.982743E+00 4.225000E-13 4.217709E-12 + 2 38 5.572753E-03 3.802500E-12 2.119039E-14 + 2 39 8.848338E+01 4.840000E-14 4.282596E-12 + 2 40 1.252364E+02 8.100000E-15 1.014415E-12 + 2 41 6.742539E+02 1.000000E-16 6.742539E-14 + 3 0 1.477364E+00 1.426610E-04 2.107622E-04 + 3 1 1.479462E+00 1.229013E-03 1.818278E-03 + 3 2 1.462600E+00 5.398058E-03 7.895199E-03 + 3 3 1.432455E+00 1.576993E-02 2.258972E-02 + 3 4 1.391626E+00 3.371513E-02 4.691884E-02 + 3 5 1.342032E+00 5.478333E-02 7.352097E-02 + 3 6 1.285760E+00 6.787802E-02 8.727484E-02 + 3 7 1.225050E+00 6.193826E-02 7.587747E-02 + 3 8 1.162376E+00 3.715557E-02 4.318875E-02 + 3 9 1.103211E+00 9.572934E-03 1.056097E-02 + 3 10 9.454941E-01 3.098846E-04 2.929941E-04 + 3 11 9.446516E-01 1.599052E-02 1.510547E-02 + 3 12 8.829244E-01 4.008476E-02 3.539182E-02 + 3 13 8.197885E-01 4.749909E-02 3.893921E-02 + 3 14 7.582393E-01 3.012815E-02 2.284435E-02 + 3 15 7.002946E-01 6.209282E-03 4.348327E-03 + 3 16 6.349378E-01 1.578972E-03 1.002549E-03 + 3 17 5.850327E-01 2.196363E-02 1.284944E-02 + 3 18 5.342092E-01 4.654307E-02 2.486374E-02 + 3 19 4.858553E-01 4.996800E-02 2.427722E-02 + 3 20 4.398875E-01 2.883248E-02 1.268305E-02 + 3 21 3.893634E-01 4.788651E-03 1.864525E-03 + 3 22 3.986136E-01 2.775644E-03 1.106409E-03 + 3 23 3.507542E-01 2.808751E-02 9.851814E-03 + 3 24 3.218506E-01 6.380633E-02 2.053610E-02 + 3 25 2.987876E-01 8.724187E-02 2.606679E-02 + 3 26 2.800519E-01 8.729474E-02 2.444706E-02 + 3 27 2.650115E-01 6.862860E-02 1.818737E-02 + 3 28 2.535053E-01 4.369122E-02 1.107596E-02 + 3 29 2.455467E-01 2.277680E-02 5.592769E-03 + 3 30 2.408230E-01 9.716335E-03 2.339917E-03 + 3 31 2.392259E-01 3.356642E-03 8.029957E-04 + 3 32 2.418095E-01 9.196814E-04 2.223877E-04 + 3 33 2.491070E-01 1.929577E-04 4.806710E-05 + 3 34 2.601104E-01 2.923478E-05 7.604272E-06 + 3 35 2.833926E-01 2.874212E-06 8.145304E-07 + 3 36 3.434752E-01 1.441341E-07 4.950650E-08 + 3 37 3.968409E-01 1.388308E-09 5.509372E-10 + 3 38 1.505757E-01 9.006010E-11 1.356086E-11 + 3 39 1.228228E-06 1.260250E-11 1.547874E-17 + 3 40 1.245678E+02 3.610000E-14 4.496899E-12 + 3 41 1.067448E+01 5.290000E-14 5.646799E-13 + 3 45 4.513600E+02 1.000000E-16 4.513600E-14 + 3 46 5.587825E+03 1.000000E-16 5.587825E-13 + 4 0 1.476860E+00 5.272994E-04 7.787472E-04 + 4 1 1.485792E+00 3.843156E-03 5.710130E-03 + 4 2 1.473852E+00 1.405261E-02 2.071147E-02 + 4 3 1.448041E+00 3.332886E-02 4.826156E-02 + 4 4 1.411220E+00 5.563097E-02 7.850753E-02 + 4 5 1.365295E+00 6.613762E-02 9.029735E-02 + 4 6 1.312768E+00 5.299952E-02 6.957605E-02 + 4 7 1.258207E+00 2.306770E-02 2.902395E-02 + 4 8 1.239883E+00 1.346939E-03 1.670047E-03 + 4 9 1.091171E+00 7.255811E-03 7.917329E-03 + 4 10 1.038542E+00 3.131037E-02 3.251712E-02 + 4 11 9.757782E-01 4.335243E-02 4.230235E-02 + 4 12 9.124251E-01 2.798953E-02 2.553835E-02 + 4 13 8.549041E-01 4.542871E-03 3.883719E-03 + 4 14 7.685352E-01 3.204789E-03 2.462994E-03 + 4 15 7.162627E-01 2.564044E-02 1.836529E-02 + 4 16 6.594260E-01 4.210064E-02 2.776225E-02 + 4 17 6.039772E-01 3.055900E-02 1.845694E-02 + 4 18 5.472367E-01 6.321387E-03 3.459295E-03 + 4 19 5.229277E-01 2.186057E-03 1.143150E-03 + 4 20 4.663258E-01 2.538078E-02 1.183571E-02 + 4 21 4.229722E-01 4.801756E-02 2.031010E-02 + 4 22 3.842334E-01 4.250738E-02 1.633276E-02 + 4 23 3.468282E-01 1.562012E-02 5.417496E-03 + 4 24 5.664928E-01 9.145671E-07 5.180956E-07 + 4 25 3.173821E-01 1.695576E-02 5.381455E-03 + 4 26 2.920471E-01 5.536622E-02 1.616954E-02 + 4 27 2.740891E-01 8.612015E-02 2.360459E-02 + 4 28 2.604376E-01 9.017362E-02 2.348460E-02 + 4 29 2.504252E-01 7.054760E-02 1.766690E-02 + 4 30 2.439114E-01 4.291511E-02 1.046749E-02 + 4 31 2.407378E-01 2.054426E-02 4.945782E-03 + 4 32 2.409008E-01 7.698992E-03 1.854693E-03 + 4 33 2.452133E-01 2.212013E-03 5.424149E-04 + 4 34 2.545778E-01 4.678768E-04 1.191110E-04 + 4 35 2.697644E-01 6.766576E-05 1.825382E-05 + 4 36 3.003246E-01 5.766242E-06 1.731744E-06 + 4 37 3.819562E-01 1.926595E-07 7.358752E-08 + 4 38 9.706487E+01 5.184000E-13 5.031843E-11 + 4 39 1.870503E-01 5.697769E-10 1.065769E-10 + 4 40 3.496633E-01 1.115560E-11 3.900704E-12 + 4 41 1.160037E+00 1.988100E-12 2.306270E-12 + 4 42 5.773147E+01 1.024000E-13 5.911702E-12 + 4 43 3.398499E+02 4.900000E-15 1.665265E-12 + 4 44 2.106828E+01 9.000000E-16 1.896146E-14 + 4 45 3.716445E+02 9.000000E-16 3.344801E-13 + 4 46 8.552692E+02 9.000000E-16 7.697422E-13 + 5 0 1.474485E+00 1.571809E-03 2.317610E-03 + 5 1 1.490981E+00 9.558171E-03 1.425105E-02 + 5 2 1.484270E+00 2.850741E-02 4.231271E-02 + 5 3 1.463248E+00 5.309070E-02 7.768487E-02 + 5 4 1.431380E+00 6.509617E-02 9.317734E-02 + 5 5 1.391126E+00 4.962425E-02 6.903360E-02 + 5 6 1.349277E+00 1.735016E-02 2.341017E-02 + 5 7 2.030578E+00 1.831686E-05 3.719381E-05 + 5 8 1.184828E+00 1.408808E-02 1.669195E-02 + 5 9 1.131328E+00 3.716082E-02 4.204108E-02 + 5 10 1.069966E+00 3.570953E-02 3.820799E-02 + 5 11 1.010546E+00 1.168472E-02 1.180794E-02 + 5 12 8.652875E-01 2.893210E-04 2.503459E-04 + 5 13 8.619236E-01 1.786988E-02 1.540247E-02 + 5 14 8.025051E-01 3.669246E-02 2.944588E-02 + 5 15 7.427044E-01 2.720239E-02 2.020334E-02 + 5 16 6.858044E-01 4.206766E-03 2.885019E-03 + 5 17 6.255267E-01 4.236827E-03 2.650248E-03 + 5 18 5.738551E-01 2.816515E-02 1.616271E-02 + 5 19 5.234679E-01 3.918116E-02 2.051008E-02 + 5 20 4.737143E-01 2.005734E-02 9.501448E-03 + 5 21 3.819070E-01 4.940422E-04 1.886782E-04 + 5 22 4.127223E-01 1.221343E-02 5.040755E-03 + 5 23 3.719144E-01 4.087910E-02 1.520353E-02 + 5 24 3.393223E-01 4.670883E-02 1.584935E-02 + 5 25 3.091085E-01 2.154759E-02 6.660544E-03 + 5 26 2.225048E-01 3.696245E-04 8.224321E-05 + 5 27 2.912858E-01 1.530743E-02 4.458838E-03 + 5 28 2.702511E-01 5.733201E-02 1.549404E-02 + 5 29 2.571909E-01 9.041030E-02 2.325270E-02 + 5 30 2.483829E-01 9.127647E-02 2.267152E-02 + 5 31 2.432423E-01 6.621049E-02 1.610520E-02 + 5 32 2.415542E-01 3.587761E-02 8.666388E-03 + 5 33 2.433701E-01 1.459328E-02 3.551568E-03 + 5 34 2.495963E-01 4.369121E-03 1.090516E-03 + 5 35 2.615647E-01 9.178737E-04 2.400833E-04 + 5 36 2.812017E-01 1.228393E-04 3.454263E-05 + 5 37 3.229167E-01 8.389481E-06 2.709103E-06 + 5 38 4.967694E-01 1.255214E-07 6.235519E-08 + 5 39 2.150197E-01 5.908997E-09 1.270551E-09 + 5 40 2.658406E-01 1.291684E-09 3.433819E-10 + 5 41 8.830730E-02 3.534400E-12 3.121133E-13 + 5 42 1.767314E-01 1.030410E-11 1.821058E-12 + 5 43 4.926350E+03 2.500000E-15 1.231588E-11 + 5 44 4.585687E+01 1.089000E-13 4.993813E-12 + 5 45 7.584582E+00 4.900000E-15 3.716445E-14 + 5 46 1.708413E+02 8.100000E-15 1.383815E-12 + 6 0 1.470129E+00 3.933333E-03 5.782509E-03 + 6 1 1.495117E+00 1.962338E-02 2.933924E-02 + 6 2 1.494005E+00 4.647162E-02 6.942882E-02 + 6 3 1.478470E+00 6.465695E-02 9.559337E-02 + 6 4 1.453690E+00 5.208510E-02 7.571561E-02 + 6 5 1.427874E+00 1.778956E-02 2.540125E-02 + 6 6 3.469535E-01 8.157821E-06 2.830385E-06 + 6 7 1.268920E+00 1.680794E-02 2.132794E-02 + 6 8 1.221601E+00 3.781513E-02 4.619499E-02 + 6 9 1.164614E+00 2.850086E-02 3.319250E-02 + 6 10 1.118261E+00 4.183339E-03 4.678067E-03 + 6 11 1.002169E+00 4.678278E-03 4.688426E-03 + 6 12 9.529390E-01 2.742635E-02 2.613564E-02 + 6 13 8.922755E-01 3.192244E-02 2.848361E-02 + 6 14 8.337724E-01 1.015310E-02 8.465373E-03 + 6 15 7.405243E-01 8.330560E-04 6.168982E-04 + 6 16 7.017639E-01 2.075142E-02 1.456260E-02 + 6 17 6.464897E-01 3.436072E-02 2.221385E-02 + 6 18 5.914702E-01 1.710782E-02 1.011877E-02 + 6 19 4.654121E-01 5.494812E-05 2.557352E-05 + 6 20 5.026525E-01 1.496809E-02 7.523749E-03 + 6 21 4.555197E-01 3.705754E-02 1.688044E-02 + 6 22 4.117974E-01 2.784508E-02 1.146653E-02 + 6 23 3.566466E-01 3.211028E-03 1.145202E-03 + 6 24 3.701582E-01 7.378166E-03 2.731089E-03 + 6 25 3.310416E-01 3.757423E-02 1.243863E-02 + 6 26 3.039780E-01 4.720344E-02 1.434881E-02 + 6 27 2.789010E-01 2.097929E-02 5.851147E-03 + 6 28 6.098781E-02 3.125458E-05 1.906149E-06 + 6 29 2.705046E-01 2.185547E-02 5.912005E-03 + 6 30 2.555223E-01 6.974738E-02 1.782201E-02 + 6 31 2.474279E-01 9.834460E-02 2.433320E-02 + 6 32 2.434769E-01 8.750586E-02 2.130565E-02 + 6 33 2.432238E-01 5.416804E-02 1.317496E-02 + 6 34 2.467346E-01 2.388913E-02 5.894277E-03 + 6 35 2.549949E-01 7.382473E-03 1.882493E-03 + 6 36 2.700016E-01 1.508473E-03 4.072900E-04 + 6 37 2.959345E-01 1.784164E-04 5.279957E-05 + 6 38 3.588299E-01 8.463968E-06 3.037125E-06 + 6 39 2.615035E+00 4.964612E-09 1.298263E-08 + 6 40 2.915306E-01 3.098656E-08 9.033531E-09 + 6 41 4.189294E-01 8.473921E-10 3.549975E-10 + 6 42 2.099935E-01 1.948816E-10 4.092387E-11 + 6 43 2.893426E-02 1.156000E-11 3.344801E-13 + 6 44 1.007402E+00 3.097600E-12 3.120529E-12 + 6 45 2.559868E+01 2.500000E-13 6.399669E-12 + 6 46 1.253778E+01 1.444000E-13 1.810455E-12 + 7 0 1.463656E+00 8.492738E-03 1.243045E-02 + 7 1 1.498358E+00 3.404789E-02 5.101593E-02 + 7 2 1.503331E+00 6.169772E-02 9.275208E-02 + 7 3 1.494604E+00 5.908031E-02 8.830167E-02 + 7 4 1.484060E+00 2.412316E-02 3.580020E-02 + 7 5 1.822118E+00 1.666707E-04 3.036936E-04 + 7 6 1.338916E+00 1.539895E-02 2.061790E-02 + 7 7 1.305230E+00 3.692225E-02 4.819204E-02 + 7 8 1.256670E+00 2.518758E-02 3.165249E-02 + 7 9 1.239558E+00 1.811728E-03 2.245742E-03 + 7 10 1.094927E+00 8.684676E-03 9.509083E-03 + 7 11 1.044446E+00 3.028187E-02 3.162779E-02 + 7 12 9.847892E-01 2.406543E-02 2.369937E-02 + 7 13 9.385593E-01 2.265212E-03 2.126036E-03 + 7 14 8.397850E-01 7.535889E-03 6.328527E-03 + 7 15 7.853829E-01 2.899306E-02 2.277065E-02 + 7 16 7.274794E-01 2.368106E-02 1.722748E-02 + 7 17 6.722682E-01 2.168846E-03 1.458046E-03 + 7 18 6.144933E-01 7.999150E-03 4.915425E-03 + 7 19 5.628813E-01 3.044368E-02 1.713618E-02 + 7 20 5.122391E-01 2.494067E-02 1.277558E-02 + 7 21 4.486247E-01 2.293059E-03 1.028723E-03 + 7 22 4.450741E-01 8.694436E-03 3.869669E-03 + 7 23 3.988527E-01 3.408865E-02 1.359635E-02 + 7 24 3.608125E-01 2.995667E-02 1.080874E-02 + 7 25 3.133183E-01 3.931241E-03 1.231730E-03 + 7 26 3.325331E-01 7.772210E-03 2.584517E-03 + 7 27 2.987421E-01 3.984993E-02 1.190485E-02 + 7 28 2.767858E-01 4.534724E-02 1.255147E-02 + 7 29 2.544128E-01 1.420001E-02 3.612665E-03 + 7 30 2.996848E-01 1.639638E-03 4.913745E-04 + 7 31 2.561039E-01 3.985048E-02 1.020586E-02 + 7 32 2.476128E-01 9.053305E-02 2.241714E-02 + 7 33 2.446288E-01 1.025467E-01 2.508587E-02 + 7 34 2.457326E-01 7.316818E-02 1.797981E-02 + 7 35 2.509741E-01 3.485436E-02 8.747540E-03 + 7 36 2.615524E-01 1.096123E-02 2.866936E-03 + 7 37 2.803238E-01 2.113858E-03 5.925646E-04 + 7 38 3.155221E-01 2.054375E-04 6.482006E-05 + 7 39 4.387939E-01 4.869966E-06 2.136911E-06 + 7 40 1.262752E-01 1.550469E-07 1.957858E-08 + 7 41 3.726961E-01 5.658689E-08 2.108972E-08 + 7 42 6.730113E-02 2.286144E-10 1.538601E-11 + 7 43 2.424043E-01 6.996025E-10 1.695866E-10 + 7 44 8.706791E-02 9.985600E-12 8.694253E-13 + 7 45 1.688333E-05 1.466890E-11 2.476598E-16 + 7 46 4.682319E+00 1.488400E-12 6.969163E-12 + 8 0 1.454903E+00 1.613907E-02 2.348078E-02 + 8 1 1.500980E+00 5.065117E-02 7.602640E-02 + 8 2 1.512787E+00 6.654082E-02 1.006621E-01 + 8 3 1.514191E+00 3.746422E-02 5.672798E-02 + 8 4 1.580425E+00 2.636423E-03 4.166669E-03 + 8 5 1.385017E+00 1.039443E-02 1.439646E-02 + 8 6 1.376481E+00 3.518174E-02 4.842698E-02 + 8 7 1.340668E+00 2.592624E-02 3.475849E-02 + 8 8 1.348601E+00 1.680773E-03 2.266692E-03 + 8 9 1.179600E+00 9.796520E-03 1.155597E-02 + 8 10 1.134885E+00 3.010574E-02 3.416656E-02 + 8 11 1.078847E+00 1.891163E-02 2.040274E-02 + 8 12 1.112217E+00 2.216061E-04 2.464741E-04 + 8 13 9.295473E-01 1.339915E-02 1.245515E-02 + 8 14 8.731135E-01 2.905793E-02 2.537087E-02 + 8 15 8.154130E-01 1.296160E-02 1.056906E-02 + 8 16 7.127764E-01 3.063085E-04 2.183294E-04 + 8 17 6.880525E-01 1.904527E-02 1.310414E-02 + 8 18 6.339121E-01 2.835626E-02 1.797537E-02 + 8 19 5.783417E-01 7.683247E-03 4.443542E-03 + 8 20 5.460984E-01 2.761036E-03 1.507797E-03 + 8 21 4.913704E-01 2.587659E-02 1.271499E-02 + 8 22 4.448353E-01 2.739675E-02 1.218704E-02 + 8 23 3.877948E-01 3.748795E-03 1.453763E-03 + 8 24 3.955156E-01 7.533657E-03 2.979678E-03 + 8 25 3.520871E-01 3.392530E-02 1.194466E-02 + 8 26 3.195435E-01 2.797709E-02 8.939898E-03 + 8 27 2.657933E-01 1.845867E-03 4.906192E-04 + 8 28 2.991779E-01 1.340413E-02 4.010220E-03 + 8 29 2.738990E-01 4.615341E-02 1.264137E-02 + 8 30 2.563018E-01 3.782168E-02 9.693766E-03 + 8 31 2.257691E-01 3.765153E-03 8.500550E-04 + 8 32 2.617305E-01 1.448212E-02 3.790412E-03 + 8 33 2.490741E-01 7.251367E-02 1.806128E-02 + 8 34 2.466776E-01 1.097653E-01 2.707663E-02 + 8 35 2.490915E-01 9.091730E-02 2.264673E-02 + 8 36 2.561408E-01 4.639992E-02 1.188491E-02 + 8 37 2.693761E-01 1.454148E-02 3.917125E-03 + 8 38 2.932646E-01 2.531436E-03 7.423807E-04 + 8 39 3.451732E-01 1.778625E-04 6.139338E-05 + 8 40 1.013279E+00 5.086542E-07 5.154088E-07 + 8 41 2.503106E-01 7.958424E-07 1.992078E-07 + 8 42 5.892276E-01 2.982874E-08 1.757592E-08 + 8 43 2.887424E-01 8.613696E-09 2.487139E-09 + 8 44 3.992804E-01 3.139984E-10 1.253734E-10 + 8 45 2.535568E-01 2.856100E-10 7.241835E-11 + 8 46 6.906985E+00 2.500000E-13 1.726746E-12 + 9 0 1.443674E+00 2.740097E-02 3.955806E-02 + 9 1 1.503474E+00 6.507321E-02 9.783588E-02 + 9 2 1.523546E+00 5.688185E-02 8.666209E-02 + 9 3 1.548571E+00 1.258640E-02 1.949093E-02 + 9 4 1.380130E+00 3.395618E-03 4.686393E-03 + 9 5 1.428494E+00 3.087901E-02 4.411049E-02 + 9 6 1.410256E+00 2.995393E-02 4.224271E-02 + 9 7 1.418836E+00 3.387246E-03 4.805948E-03 + 9 8 1.252572E+00 7.997739E-03 1.001774E-02 + 9 9 1.221666E+00 2.902571E-02 3.545971E-02 + 9 10 1.171860E+00 1.730172E-02 2.027520E-02 + 9 11 2.252492E+00 4.755016E-06 1.071063E-05 + 9 12 1.018119E+00 1.593106E-02 1.621971E-02 + 9 13 9.626421E-01 2.670280E-02 2.570524E-02 + 9 14 9.090249E-01 6.994454E-03 6.358133E-03 + 9 15 8.158616E-01 3.121724E-03 2.546895E-03 + 9 16 7.690635E-01 2.403172E-02 1.848192E-02 + 9 17 7.128058E-01 2.019796E-02 1.439722E-02 + 9 18 6.593636E-01 6.586270E-04 4.342747E-04 + 9 19 6.032071E-01 1.228958E-02 7.413161E-03 + 9 20 5.519472E-01 2.833988E-02 1.564212E-02 + 9 21 4.992150E-01 1.072992E-02 5.356538E-03 + 9 22 4.955961E-01 1.489543E-03 7.382117E-04 + 9 23 4.303991E-01 2.444497E-02 1.052109E-02 + 9 24 3.879377E-01 2.670147E-02 1.035851E-02 + 9 25 3.299445E-01 2.645685E-03 8.729292E-04 + 9 26 3.500683E-01 1.053510E-02 3.688006E-03 + 9 27 3.142006E-01 3.608256E-02 1.133716E-02 + 9 28 2.860188E-01 2.128640E-02 6.088309E-03 + 9 29 8.300391E-01 1.961728E-05 1.628311E-05 + 9 30 2.734085E-01 2.651290E-02 7.248852E-03 + 9 31 2.556880E-01 5.006389E-02 1.280074E-02 + 9 32 2.397430E-01 2.035011E-02 4.878797E-03 + 9 33 2.982586E-01 1.532245E-03 4.570052E-04 + 9 34 2.521133E-01 5.126788E-02 1.292531E-02 + 9 35 2.496316E-01 1.104024E-01 2.755993E-02 + 9 36 2.532874E-01 1.064232E-01 2.695567E-02 + 9 37 2.623059E-01 5.734220E-02 1.504120E-02 + 9 38 2.787683E-01 1.736477E-02 4.840749E-03 + 9 39 3.101634E-01 2.547269E-03 7.900697E-04 + 9 40 4.031703E-01 9.870482E-05 3.979486E-05 + 9 41 9.600695E-02 1.801662E-06 1.729721E-07 + 9 42 3.330651E-01 1.290087E-06 4.296830E-07 + 9 43 1.039956E-02 6.206288E-09 6.454269E-11 + 9 44 3.946474E-01 2.073024E-08 8.181135E-09 + 9 45 2.174454E-01 1.031694E-09 2.243372E-10 + 9 46 3.384482E-01 3.265249E-10 1.105118E-10 + 10 0 1.429726E+00 4.205144E-02 6.012203E-02 + 10 1 1.506749E+00 7.219252E-02 1.087760E-01 + 10 2 1.538724E+00 3.594589E-02 5.531080E-02 + 10 3 1.955525E+00 1.921218E-04 3.756989E-04 + 10 4 1.457080E+00 2.121115E-02 3.090634E-02 + 10 5 1.458618E+00 3.506756E-02 5.115019E-02 + 10 6 1.466629E+00 8.446196E-03 1.238744E-02 + 10 7 1.295594E+00 4.100134E-03 5.312111E-03 + 10 8 1.300800E+00 2.699132E-02 3.511029E-02 + 10 9 1.260239E+00 1.882225E-02 2.372054E-02 + 10 10 1.593040E+00 5.162063E-05 8.223372E-05 + 10 11 1.104732E+00 1.558790E-02 1.722045E-02 + 10 12 1.052641E+00 2.502793E-02 2.634541E-02 + 10 13 1.005024E+00 4.708946E-03 4.732602E-03 + 10 14 9.032594E-01 5.400386E-03 4.877950E-03 + 10 15 8.543400E-01 2.474757E-02 2.114283E-02 + 10 16 7.982088E-01 1.376684E-02 1.098881E-02 + 10 17 6.978367E-01 2.375396E-04 1.657639E-04 + 10 18 6.749787E-01 1.870710E-02 1.262689E-02 + 10 19 6.216224E-01 2.265804E-02 1.408475E-02 + 10 20 5.613824E-01 1.965720E-03 1.103521E-03 + 10 21 5.307237E-01 9.832378E-03 5.218276E-03 + 10 22 4.809701E-01 2.759894E-02 1.327427E-02 + 10 23 4.306922E-01 1.025648E-02 4.417387E-03 + 10 24 4.396794E-01 2.204779E-03 9.693958E-04 + 10 25 3.783117E-01 2.636070E-02 9.972562E-03 + 10 26 3.404208E-01 2.294708E-02 7.811666E-03 + 10 27 2.311978E-01 3.329910E-04 7.698679E-05 + 10 28 3.117052E-01 1.860437E-02 5.799079E-03 + 10 29 2.840993E-01 3.646143E-02 1.035867E-02 + 10 30 2.555459E-01 9.474548E-03 2.421182E-03 + 10 31 2.828590E-01 6.444540E-03 1.822896E-03 + 10 32 2.556531E-01 4.486730E-02 1.147046E-02 + 10 33 2.425544E-01 3.862281E-02 9.368132E-03 + 10 34 1.890803E-01 1.162125E-03 2.197349E-04 + 10 35 2.572527E-01 3.249351E-02 8.359043E-03 + 10 36 2.534939E-01 1.074366E-01 2.723451E-02 + 10 37 2.583422E-01 1.197854E-01 3.094562E-02 + 10 38 2.695613E-01 6.654046E-02 1.793674E-02 + 10 39 2.902325E-01 1.861191E-02 5.401781E-03 + 10 40 3.344729E-01 2.051877E-03 6.862973E-04 + 10 41 6.471872E-01 1.784361E-05 1.154816E-05 + 10 42 2.423153E-01 1.098187E-05 2.661075E-06 + 10 43 5.017341E-01 6.316911E-07 3.169410E-07 + 10 44 2.201927E-01 1.881998E-07 4.144022E-08 + 10 45 1.019085E+00 4.389062E-09 4.472830E-09 + 10 46 3.719029E-01 8.372250E-09 3.113664E-09 + 11 0 1.412765E+00 5.887305E-02 8.317378E-02 + 11 1 1.512619E+00 6.849221E-02 1.036026E-01 + 11 2 1.570592E+00 1.359995E-02 2.135998E-02 + 11 3 1.450028E+00 6.689004E-03 9.699244E-03 + 11 4 1.485915E+00 3.575562E-02 5.312983E-02 + 11 5 1.494923E+00 1.871581E-02 2.797868E-02 + 11 6 1.140880E+00 3.936272E-04 4.490812E-04 + 11 7 1.364271E+00 2.244160E-02 3.061642E-02 + 11 8 1.339715E+00 2.275272E-02 3.048216E-02 + 11 9 1.396133E+00 7.969504E-04 1.112649E-03 + 11 10 1.185265E+00 1.285158E-02 1.523253E-02 + 11 11 1.141537E+00 2.465763E-02 2.814760E-02 + 11 12 1.099654E+00 4.742359E-03 5.214955E-03 + 11 13 9.882361E-01 5.710864E-03 5.643682E-03 + 11 14 9.413802E-01 2.397055E-02 2.256540E-02 + 11 15 8.874768E-01 1.054932E-02 9.362274E-03 + 11 16 7.900272E-01 1.328415E-03 1.049484E-03 + 11 17 7.535668E-01 2.094612E-02 1.578430E-02 + 11 18 6.986790E-01 1.682439E-02 1.175485E-02 + 11 19 6.530019E-01 9.889138E-06 6.457626E-06 + 11 20 5.920586E-01 1.629415E-02 9.647089E-03 + 11 21 5.410660E-01 2.250112E-02 1.217459E-02 + 11 22 4.754496E-01 1.807275E-03 8.592684E-04 + 11 23 4.670343E-01 1.091537E-02 5.097850E-03 + 11 24 4.198112E-01 2.690928E-02 1.129682E-02 + 11 25 3.695436E-01 6.652626E-03 2.458435E-03 + 11 26 3.803920E-01 5.714353E-03 2.173694E-03 + 11 27 3.345738E-01 2.974482E-02 9.951838E-03 + 11 28 3.002333E-01 1.473813E-02 4.424876E-03 + 11 29 3.403863E-01 1.586940E-03 5.401725E-04 + 11 30 2.821064E-01 3.084250E-02 8.700866E-03 + 11 31 2.598379E-01 2.742152E-02 7.125150E-03 + 11 32 8.449227E-02 7.625027E-05 6.442558E-06 + 11 33 2.574461E-01 2.922178E-02 7.523033E-03 + 11 34 2.441586E-01 4.993945E-02 1.219315E-02 + 11 35 2.241800E-01 8.774187E-03 1.966997E-03 + 11 36 2.654510E-01 1.894922E-02 5.030088E-03 + 11 37 2.582330E-01 1.042973E-01 2.693300E-02 + 11 38 2.642835E-01 1.318458E-01 3.484466E-02 + 11 39 2.781030E-01 7.286042E-02 2.026270E-02 + 11 40 3.047132E-01 1.760837E-02 5.365503E-03 + 11 41 3.769527E-01 1.171189E-03 4.414829E-04 + 11 42 3.372697E-02 8.213612E-06 2.770202E-07 + 11 43 3.217166E-01 1.768859E-05 5.690712E-06 + 11 44 3.223544E-02 6.037340E-08 1.946163E-09 + 11 45 3.464365E-01 3.647918E-07 1.263772E-07 + 11 46 1.218494E-01 2.972521E-08 3.621997E-09 + 12 0 1.392435E+00 7.574348E-02 1.054679E-01 + 12 1 1.525133E+00 5.415064E-02 8.258692E-02 + 12 2 1.782072E+00 8.910380E-04 1.587894E-03 + 12 3 1.495886E+00 2.414575E-02 3.611929E-02 + 12 4 1.509909E+00 3.224272E-02 4.868358E-02 + 12 5 1.613735E+00 2.000058E-03 3.227564E-03 + 12 6 1.398934E+00 1.380234E-02 1.930857E-02 + 12 7 1.402723E+00 2.714222E-02 3.807301E-02 + 12 8 1.416297E+00 4.036487E-03 5.716863E-03 + 12 9 1.251469E+00 8.018533E-03 1.003495E-02 + 12 10 1.225601E+00 2.474356E-02 3.032572E-02 + 12 11 1.188962E+00 6.808186E-03 8.094673E-03 + 12 12 1.065220E+00 4.170348E-03 4.442339E-03 + 12 13 1.028865E+00 2.282131E-02 2.348006E-02 + 12 14 9.768934E-01 1.002603E-02 9.794367E-03 + 12 15 8.700946E-01 1.691861E-03 1.472079E-03 + 12 16 8.361458E-01 2.087173E-02 1.745181E-02 + 12 17 7.818861E-01 1.343910E-02 1.050785E-02 + 12 18 6.948687E-01 3.602620E-04 2.503348E-04 + 12 19 6.623185E-01 1.887383E-02 1.250049E-02 + 12 20 6.094177E-01 1.691348E-02 1.030737E-02 + 12 21 3.125500E-01 3.595423E-06 1.123749E-06 + 12 22 5.194020E-01 1.696312E-02 8.810676E-03 + 12 23 4.702527E-01 2.048428E-02 9.632788E-03 + 12 24 3.714972E-01 4.668141E-04 1.734201E-04 + 12 25 4.100430E-01 1.532592E-02 6.284285E-03 + 12 26 3.673292E-01 2.441598E-02 8.968701E-03 + 12 27 3.005806E-01 1.649322E-03 4.957540E-04 + 12 28 3.323198E-01 1.415107E-02 4.702683E-03 + 12 29 2.988848E-01 2.938068E-02 8.781436E-03 + 12 30 2.562245E-01 3.654500E-03 9.363726E-04 + 12 31 2.844993E-01 1.356336E-02 3.858768E-03 + 12 32 2.598316E-01 3.703008E-02 9.621583E-03 + 12 33 2.330099E-01 7.437539E-03 1.733020E-03 + 12 34 2.633652E-01 1.329095E-02 3.500374E-03 + 12 35 2.458857E-01 5.236821E-02 1.287660E-02 + 12 36 2.319969E-01 1.899701E-02 4.407247E-03 + 12 37 2.780067E-01 1.076779E-02 2.993518E-03 + 12 38 2.638056E-01 1.040549E-01 2.745025E-02 + 12 39 2.711542E-01 1.435519E-01 3.892470E-02 + 12 40 2.882559E-01 7.501214E-02 2.162269E-02 + 12 41 3.243686E-01 1.412296E-02 4.581045E-03 + 12 42 5.003507E-01 3.145331E-04 1.573769E-04 + 12 43 2.302565E-01 8.843728E-05 2.036326E-05 + 12 44 4.561647E-01 9.291706E-06 4.238548E-06 + 12 45 2.262587E-01 2.467947E-06 5.583944E-07 + 12 46 9.304472E-01 5.356910E-08 4.984322E-08 + 13 0 1.368315E+00 9.009225E-02 1.232746E-01 + 13 1 1.555133E+00 3.357198E-02 5.220889E-02 + 13 2 1.379349E+00 3.316829E-03 4.575064E-03 + 13 3 1.518791E+00 3.714127E-02 5.640982E-02 + 13 4 1.541354E+00 1.506454E-02 2.321980E-02 + 13 5 1.378616E+00 3.220308E-03 4.439569E-03 + 13 6 1.440783E+00 2.746775E-02 3.957507E-02 + 13 7 1.453561E+00 1.174791E-02 1.707630E-02 + 13 8 1.262918E+00 2.424811E-03 3.062338E-03 + 13 9 1.301154E+00 2.325823E-02 3.026254E-02 + 13 10 1.269929E+00 1.126341E-02 1.430374E-02 + 13 11 1.114278E+00 1.632680E-03 1.819259E-03 + 13 12 1.113812E+00 2.095711E-02 2.334229E-02 + 13 13 1.066008E+00 1.171495E-02 1.248823E-02 + 13 14 9.393485E-01 1.023459E-03 9.613843E-04 + 13 15 9.206148E-01 1.962805E-02 1.806988E-02 + 13 16 8.678447E-01 1.254733E-02 1.088913E-02 + 13 17 7.627092E-01 6.203731E-04 4.731643E-04 + 13 18 7.389508E-01 1.900642E-02 1.404481E-02 + 13 19 6.850249E-01 1.354791E-02 9.280653E-03 + 13 20 6.338121E-01 3.932622E-04 2.492544E-04 + 13 21 5.811094E-01 1.907812E-02 1.108648E-02 + 13 22 5.297889E-01 1.462888E-02 7.750216E-03 + 13 23 5.550106E-01 3.044365E-04 1.689655E-04 + 13 24 4.549863E-01 1.999400E-02 9.096997E-03 + 13 25 4.079958E-01 1.575520E-02 6.428056E-03 + 13 26 4.827370E-01 3.486148E-04 1.682893E-04 + 13 27 3.604657E-01 2.209496E-02 7.964474E-03 + 13 28 3.219243E-01 1.692286E-02 5.447881E-03 + 13 29 3.912092E-01 6.127001E-04 2.396940E-04 + 13 30 2.963909E-01 2.604905E-02 7.720702E-03 + 13 31 2.685743E-01 1.823478E-02 4.897393E-03 + 13 32 3.196300E-01 1.384057E-03 4.423859E-04 + 13 33 2.600757E-01 3.331238E-02 8.663742E-03 + 13 34 2.406866E-01 2.040473E-02 4.911146E-03 + 13 35 2.840507E-01 3.244545E-03 9.216155E-04 + 13 36 2.480954E-01 4.842392E-02 1.201375E-02 + 13 37 2.360006E-01 2.806969E-02 6.624461E-03 + 13 38 2.951098E-01 6.746267E-03 1.990890E-03 + 13 39 2.701267E-01 1.092506E-01 2.951149E-02 + 13 40 2.790549E-01 1.551426E-01 4.329331E-02 + 13 41 3.006134E-01 7.143635E-02 2.147472E-02 + 13 42 3.551807E-01 8.751094E-03 3.108220E-03 + 13 43 6.858450E-01 4.056478E-06 2.782115E-06 + 13 44 3.097776E-01 1.600005E-04 4.956457E-05 + 13 45 8.305344E-01 1.417297E-07 1.177114E-07 + 13 46 3.479830E-01 4.542482E-06 1.580707E-06 + 14 0 1.339908E+00 9.958646E-02 1.334367E-01 + 14 1 1.643362E+00 1.383343E-02 2.273333E-02 + 14 2 1.460642E+00 1.754342E-02 2.562465E-02 + 14 3 1.540935E+00 3.534489E-02 5.446420E-02 + 14 4 1.663432E+00 1.333391E-03 2.218004E-03 + 14 5 1.461659E+00 1.826797E-02 2.670154E-02 + 14 6 1.475023E+00 2.278398E-02 3.360690E-02 + 14 7 2.143973E+00 1.023541E-04 2.194445E-04 + 14 8 1.356099E+00 1.762339E-02 2.389907E-02 + 14 9 1.343973E+00 1.774207E-02 2.384487E-02 + 14 10 1.313401E-01 4.642948E-06 6.098050E-07 + 14 11 1.192905E+00 1.718967E-02 2.050563E-02 + 14 12 1.151582E+00 1.521735E-02 1.752402E-02 + 14 13 8.695668E-01 9.951878E-05 8.653823E-05 + 14 14 1.005673E+00 1.721971E-02 1.731740E-02 + 14 15 9.540385E-01 1.369658E-02 1.306706E-02 + 14 16 8.097803E-01 2.932595E-04 2.374757E-04 + 14 17 8.184405E-01 1.778528E-02 1.455620E-02 + 14 18 7.664396E-01 1.253897E-02 9.610362E-03 + 14 19 6.904509E-01 6.590162E-04 4.550183E-04 + 14 20 6.501626E-01 1.894125E-02 1.231489E-02 + 14 21 5.971286E-01 1.136560E-02 6.786728E-03 + 14 22 5.673793E-01 1.381131E-03 7.836251E-04 + 14 23 5.091474E-01 2.073770E-02 1.055855E-02 + 14 24 4.574537E-01 9.871637E-03 4.515817E-03 + 14 25 4.573947E-01 2.824785E-03 1.292042E-03 + 14 26 3.983331E-01 2.318429E-02 9.235069E-03 + 14 27 3.506619E-01 7.771025E-03 2.725002E-03 + 14 28 3.645052E-01 5.687187E-03 2.073009E-03 + 14 29 3.188346E-01 2.612824E-02 8.330588E-03 + 14 30 2.755185E-01 4.902407E-03 1.350704E-03 + 14 31 2.986697E-01 1.123381E-02 3.355198E-03 + 14 32 2.689775E-01 2.906288E-02 7.817259E-03 + 14 33 2.160553E-01 1.665931E-03 3.599332E-04 + 14 34 2.621598E-01 2.166045E-02 5.678500E-03 + 14 35 2.432396E-01 3.122950E-02 7.596249E-03 + 14 36 1.041415E+00 1.815433E-05 1.890619E-05 + 14 37 2.508723E-01 4.179329E-02 1.048478E-02 + 14 38 2.386448E-01 3.423316E-02 8.169567E-03 + 14 39 3.120610E-01 5.669342E-03 1.769180E-03 + 14 40 2.770954E-01 1.221105E-01 3.383626E-02 + 14 41 2.881609E-01 1.652229E-01 4.761079E-02 + 14 42 3.164420E-01 6.065702E-02 1.919443E-02 + 14 43 4.231212E-01 3.233366E-03 1.368105E-03 + 14 44 2.097137E-01 4.256538E-04 8.926545E-05 + 14 45 4.153939E-01 9.890382E-05 4.108405E-05 + 14 46 2.226868E-01 2.168001E-05 4.827852E-06 + 15 0 1.306632E+00 1.027568E-01 1.342653E-01 + 15 1 2.171167E+00 1.779221E-03 3.862986E-03 + 15 2 1.487279E+00 3.383163E-02 5.031706E-02 + 15 3 1.574802E+00 2.095464E-02 3.299942E-02 + 15 4 1.431735E+00 3.023592E-03 4.328984E-03 + 15 5 1.493937E+00 2.832952E-02 4.232253E-02 + 15 6 1.529867E+00 6.971597E-03 1.066562E-02 + 15 7 1.368371E+00 7.560946E-03 1.034618E-02 + 15 8 1.398621E+00 2.311774E-02 3.233296E-02 + 15 9 1.447574E+00 2.382990E-03 3.449555E-03 + 15 10 1.259931E+00 1.062831E-02 1.339094E-02 + 15 11 1.232181E+00 1.929602E-02 2.377619E-02 + 15 12 1.276826E+00 5.846835E-04 7.465391E-04 + 15 13 1.085227E+00 1.305804E-02 1.417094E-02 + 15 14 1.040751E+00 1.624951E-02 1.691169E-02 + 15 15 1.572401E+00 8.829991E-06 1.388429E-05 + 15 16 9.004304E-01 1.534485E-02 1.381697E-02 + 15 17 8.488442E-01 1.343920E-02 1.140779E-02 + 15 18 7.349243E-01 3.320380E-04 2.440228E-04 + 15 19 7.247686E-01 1.766164E-02 1.280061E-02 + 15 20 6.717854E-01 1.047136E-02 7.034507E-03 + 15 21 6.230637E-01 1.725045E-03 1.074813E-03 + 15 22 5.701887E-01 1.989383E-02 1.134324E-02 + 15 23 5.170225E-01 7.118032E-03 3.680183E-03 + 15 24 4.982861E-01 4.677338E-03 2.330653E-03 + 15 25 4.448383E-01 2.155689E-02 9.589329E-03 + 15 26 3.853762E-01 3.490111E-03 1.345006E-03 + 15 27 3.935207E-01 9.896778E-03 3.894587E-03 + 15 28 3.492862E-01 2.161175E-02 7.548688E-03 + 15 29 2.490620E-01 5.133863E-04 1.278650E-04 + 15 30 3.166537E-01 1.794375E-02 5.681955E-03 + 15 31 2.835607E-01 1.841935E-02 5.223003E-03 + 15 32 3.469849E-01 8.459337E-04 2.935262E-04 + 15 33 2.687706E-01 2.810497E-02 7.553788E-03 + 15 34 2.416366E-01 1.072573E-02 2.591729E-03 + 15 35 2.688351E-01 9.811277E-03 2.637615E-03 + 15 36 2.448858E-01 3.650361E-02 8.939216E-03 + 15 37 1.899244E-01 1.472763E-03 2.797137E-04 + 15 38 2.540725E-01 3.533886E-02 8.978633E-03 + 15 39 2.402668E-01 3.700999E-02 8.892273E-03 + 15 40 3.205987E-01 7.313888E-03 2.344823E-03 + 15 41 2.846701E-01 1.446022E-01 4.116392E-02 + 15 42 2.988006E-01 1.698625E-01 5.075502E-02 + 15 43 3.389086E-01 4.259473E-02 1.443572E-02 + 15 44 1.109075E+00 1.399454E-04 1.552098E-04 + 15 45 2.963003E-01 9.945981E-04 2.946997E-04 + 15 46 7.862894E+00 3.970764E-07 3.122170E-06 + 16 0 1.267808E+00 9.934532E-02 1.259508E-01 + 16 1 6.298652E-01 1.286029E-03 8.100247E-04 + 16 2 1.509814E+00 4.224835E-02 6.378716E-02 + 16 3 1.670433E+00 5.513210E-03 9.209449E-03 + 16 4 1.503034E+00 1.652471E-02 2.483720E-02 + 16 5 1.522192E+00 2.249020E-02 3.423442E-02 + 16 6 9.199864E-01 8.207074E-05 7.550396E-05 + 16 7 1.425452E+00 2.109330E-02 3.006750E-02 + 16 8 1.451780E+00 1.093605E-02 1.587674E-02 + 16 9 1.263091E+00 2.937336E-03 3.710124E-03 + 16 10 1.306070E+00 2.089110E-02 2.728523E-02 + 16 11 1.291996E+00 4.551521E-03 5.880546E-03 + 16 12 1.155385E+00 7.067894E-03 8.166142E-03 + 16 13 1.122333E+00 1.880857E-02 2.110948E-02 + 16 14 1.118994E+00 1.155925E-03 1.293473E-03 + 16 15 9.819591E-01 1.133282E-02 1.112837E-02 + 16 16 9.331146E-01 1.559395E-02 1.455094E-02 + 16 17 2.398071E+00 1.040563E-06 2.495344E-06 + 16 18 8.011984E-01 1.534426E-02 1.229380E-02 + 16 19 7.513205E-01 1.143248E-02 8.589456E-03 + 16 20 6.824432E-01 1.113393E-03 7.598278E-04 + 16 21 6.384806E-01 1.852841E-02 1.183003E-02 + 16 22 5.840123E-01 6.601567E-03 3.855397E-03 + 16 23 5.505928E-01 4.871116E-03 2.682001E-03 + 16 24 4.990437E-01 1.981939E-02 9.890741E-03 + 16 25 4.333610E-01 2.039990E-03 8.840522E-04 + 16 26 4.350362E-01 1.145824E-02 4.984748E-03 + 16 27 3.872912E-01 1.768434E-02 6.848990E-03 + 16 28 9.842203E-01 1.555695E-05 1.531147E-05 + 16 29 3.444897E-01 1.975674E-02 6.805992E-03 + 16 30 3.041927E-01 1.101149E-02 3.349614E-03 + 16 31 3.269644E-01 4.431618E-03 1.448981E-03 + 16 32 2.829552E-01 2.551875E-02 7.220665E-03 + 16 33 2.328222E-01 2.182446E-03 5.081220E-04 + 16 34 2.703499E-01 1.855620E-02 5.016665E-03 + 16 35 2.461125E-01 2.105280E-02 5.181357E-03 + 16 36 2.925523E-01 2.373686E-03 6.944273E-04 + 16 37 2.465127E-01 3.664608E-02 9.033723E-03 + 16 38 2.140454E-01 4.827459E-03 1.033295E-03 + 16 39 2.573220E-01 3.059999E-02 7.874053E-03 + 16 40 2.403872E-01 3.630015E-02 8.726089E-03 + 16 41 3.206990E-01 1.329952E-02 4.265142E-03 + 16 42 2.929050E-01 1.775816E-01 5.201453E-02 + 16 43 3.116593E-01 1.622638E-01 5.057104E-02 + 16 44 3.789866E-01 2.077159E-02 7.872155E-03 + 16 45 1.735826E-01 1.124539E-03 1.952004E-04 + 16 46 3.808267E-01 7.715201E-04 2.938155E-04 + 17 0 1.222659E+00 9.028184E-02 1.103839E-01 + 17 1 1.056700E+00 1.199084E-02 1.267072E-02 + 17 2 1.543195E+00 3.836349E-02 5.920235E-02 + 17 3 3.323873E-01 5.992989E-05 1.991994E-05 + 17 4 1.533560E+00 2.815115E-02 4.317147E-02 + 17 5 1.565717E+00 8.034958E-03 1.258047E-02 + 17 6 1.443183E+00 8.824925E-03 1.273598E-02 + 17 7 1.460938E+00 2.144256E-02 3.132625E-02 + 17 8 1.866886E+00 2.653432E-04 4.953655E-04 + 17 9 1.350826E+00 1.607457E-02 2.171395E-02 + 17 10 1.355022E+00 1.242423E-02 1.683509E-02 + 17 11 1.170051E+00 1.332473E-03 1.559062E-03 + 17 12 1.201046E+00 1.873862E-02 2.250594E-02 + 17 13 1.169901E+00 5.252694E-03 6.145134E-03 + 17 14 1.051577E+00 5.900440E-03 6.204765E-03 + 17 15 1.017186E+00 1.768884E-02 1.799284E-02 + 17 16 1.001310E+00 9.378637E-04 9.390920E-04 + 17 17 8.810161E-01 1.159169E-02 1.021246E-02 + 17 18 8.303327E-01 1.369465E-02 1.137112E-02 + 17 19 7.080885E-01 1.953775E-04 1.383446E-04 + 17 20 7.106944E-01 1.655137E-02 1.176297E-02 + 17 21 6.591358E-01 7.778113E-03 5.126832E-03 + 17 22 6.122808E-01 3.625477E-03 2.219810E-03 + 17 23 5.593524E-01 1.863019E-02 1.042084E-02 + 17 24 4.979910E-01 2.019338E-03 1.005612E-03 + 17 25 4.837379E-01 1.089718E-02 5.271379E-03 + 17 26 4.344398E-01 1.566562E-02 6.805768E-03 + 17 27 5.466510E-01 1.727161E-04 9.441543E-05 + 17 28 3.799323E-01 1.911174E-02 7.261167E-03 + 17 29 3.327751E-01 7.485112E-03 2.490859E-03 + 17 30 3.478113E-01 6.668196E-03 2.319274E-03 + 17 31 3.044811E-01 2.144057E-02 6.528250E-03 + 17 32 1.627353E-01 1.852052E-04 3.013942E-05 + 17 33 2.825720E-01 2.092362E-02 5.912430E-03 + 17 34 2.524343E-01 1.124708E-02 2.839149E-03 + 17 35 2.772928E-01 7.904074E-03 2.191743E-03 + 17 36 2.478937E-01 2.748896E-02 6.814340E-03 + 17 37 1.339476E+00 1.097504E-05 1.470081E-05 + 17 38 2.483368E-01 3.376530E-02 8.385168E-03 + 17 39 2.214235E-01 7.983964E-03 1.767837E-03 + 17 40 2.599982E-01 2.810322E-02 7.306788E-03 + 17 41 2.375651E-01 3.181502E-02 7.558138E-03 + 17 42 3.188616E-01 2.800639E-02 8.930164E-03 + 17 43 3.019835E-01 2.182036E-01 6.589388E-02 + 17 44 3.283254E-01 1.347168E-01 4.423095E-02 + 17 45 5.221467E-01 3.689224E-03 1.926316E-03 + 17 46 2.827081E-01 4.259255E-03 1.204126E-03 + 18 0 1.170295E+00 7.732650E-02 9.049484E-02 + 18 1 1.123278E+00 2.989050E-02 3.357534E-02 + 18 2 1.612040E+00 2.503981E-02 4.036518E-02 + 18 3 1.378588E+00 7.188864E-03 9.910482E-03 + 18 4 1.564350E+00 2.768131E-02 4.330324E-02 + 18 5 2.309969E+00 5.750219E-05 1.328283E-04 + 18 6 1.487297E+00 2.098640E-02 3.121301E-02 + 18 7 1.503568E+00 9.100042E-03 1.368253E-02 + 18 8 1.346236E+00 5.435141E-03 7.316984E-03 + 18 9 1.394799E+00 1.960412E-02 2.734380E-02 + 18 10 1.561204E+00 7.338833E-04 1.145741E-03 + 18 11 1.268596E+00 1.338339E-02 1.697811E-02 + 18 12 1.242861E+00 1.217293E-02 1.512926E-02 + 18 13 1.084348E+00 1.010636E-03 1.095881E-03 + 18 14 1.094420E+00 1.740420E-02 1.904750E-02 + 18 15 1.063578E+00 4.527252E-03 4.815085E-03 + 18 16 9.556025E-01 6.415755E-03 6.130912E-03 + 18 17 9.132278E-01 1.614396E-02 1.474311E-02 + 18 18 9.140124E-01 2.444726E-04 2.234510E-04 + 18 19 7.843355E-01 1.329864E-02 1.043060E-02 + 18 20 7.358813E-01 1.036469E-02 7.627180E-03 + 18 21 6.714532E-01 1.628286E-03 1.093318E-03 + 18 22 6.269805E-01 1.752977E-02 1.099083E-02 + 18 23 5.689968E-01 3.130688E-03 1.781351E-03 + 18 24 5.388816E-01 8.788419E-03 4.735918E-03 + 18 25 4.884371E-01 1.531909E-02 7.482413E-03 + 18 26 6.239037E-01 7.184732E-05 4.482581E-05 + 18 27 4.236787E-01 1.750916E-02 7.418260E-03 + 18 28 3.709531E-01 6.564020E-03 2.434943E-03 + 18 29 3.801581E-01 6.774167E-03 2.575255E-03 + 18 30 3.331195E-01 1.869291E-02 6.226971E-03 + 18 31 5.929474E+00 3.422250E-07 2.029214E-06 + 18 32 3.029690E-01 2.008219E-02 6.084282E-03 + 18 33 2.638225E-01 6.944974E-03 1.832240E-03 + 18 34 2.860900E-01 1.042542E-02 2.982609E-03 + 18 35 2.556249E-01 2.021478E-02 5.167400E-03 + 18 36 3.106907E-01 1.385434E-03 4.304414E-04 + 18 37 2.492441E-01 2.883635E-02 7.187291E-03 + 18 38 1.850640E-01 1.116141E-03 2.065575E-04 + 18 39 2.503073E-01 2.995963E-02 7.499116E-03 + 18 40 2.242930E-01 9.798470E-03 2.197728E-03 + 18 41 2.612731E-01 2.778063E-02 7.258332E-03 + 18 42 2.278235E-01 2.316966E-02 5.278592E-03 + 18 43 3.187892E-01 5.919694E-02 1.887135E-02 + 18 44 3.122862E-01 2.554069E-01 7.976005E-02 + 18 45 3.534520E-01 8.539920E-02 3.018452E-02 + 18 46 8.177454E-02 1.059761E-03 8.666146E-05 + 19 0 1.109719E+00 6.255933E-02 6.942328E-02 + 19 1 1.129507E+00 4.925908E-02 5.563847E-02 + 19 2 1.810473E+00 9.919682E-03 1.795932E-02 + 19 3 1.452906E+00 2.050827E-02 2.979659E-02 + 19 4 1.614161E+00 1.643191E-02 2.652375E-02 + 19 5 1.467816E+00 5.264658E-03 7.727550E-03 + 19 6 1.518286E+00 2.234731E-02 3.392962E-02 + 19 7 1.803214E+00 2.132482E-04 3.845321E-04 + 19 8 1.413557E+00 1.715923E-02 2.425555E-02 + 19 9 1.450475E+00 8.881032E-03 1.288172E-02 + 19 10 1.270287E+00 4.202574E-03 5.338476E-03 + 19 11 1.312822E+00 1.780135E-02 2.337000E-02 + 19 12 1.380402E+00 7.194535E-04 9.931348E-04 + 19 13 1.171061E+00 1.250904E-02 1.464885E-02 + 19 14 1.131470E+00 1.073403E-02 1.214523E-02 + 19 15 9.986243E-01 1.443985E-03 1.441998E-03 + 19 16 9.932014E-01 1.665625E-02 1.654301E-02 + 19 17 9.598887E-01 2.790709E-03 2.678770E-03 + 19 18 8.620234E-01 8.364410E-03 7.210318E-03 + 19 19 8.122434E-01 1.363465E-02 1.107465E-02 + 19 20 6.828293E-01 1.050668E-04 7.174269E-05 + 19 21 6.964017E-01 1.546940E-02 1.077292E-02 + 19 22 6.466808E-01 5.634834E-03 3.643939E-03 + 19 23 6.014472E-01 5.559835E-03 3.343947E-03 + 19 24 5.485221E-01 1.587409E-02 8.707291E-03 + 19 25 3.884589E-01 5.805221E-05 2.255090E-05 + 19 26 4.727607E-01 1.517838E-02 7.175740E-03 + 19 27 4.213477E-01 7.425722E-03 3.128811E-03 + 19 28 4.227385E-01 5.241919E-03 2.215961E-03 + 19 29 3.693067E-01 1.746502E-02 6.449948E-03 + 19 30 2.673744E-03 9.242755E-06 2.471277E-08 + 19 31 3.299172E-01 1.812149E-02 5.978590E-03 + 19 32 2.853029E-01 5.804652E-03 1.656084E-03 + 19 33 3.054703E-01 1.010056E-02 3.085421E-03 + 19 34 2.693484E-01 1.654831E-02 4.457261E-03 + 19 35 3.083448E-01 2.165547E-03 6.677352E-04 + 19 36 2.566777E-01 2.414860E-02 6.198407E-03 + 19 37 9.527698E-02 1.116532E-04 1.063798E-05 + 19 38 2.507791E-01 2.647422E-02 6.639181E-03 + 19 39 2.113330E-01 3.629327E-03 7.669968E-04 + 19 40 2.522293E-01 2.660986E-02 6.711787E-03 + 19 41 2.246439E-01 9.862816E-03 2.215621E-03 + 19 42 2.601966E-01 2.907307E-02 7.564713E-03 + 19 43 1.960505E-01 1.114230E-02 2.184452E-03 + 19 44 3.211617E-01 1.164739E-01 3.740695E-02 + 19 45 3.245800E-01 2.661881E-01 8.639932E-02 + 19 46 4.096127E-01 2.924645E-02 1.197972E-02 + 20 0 1.039829E+00 4.789081E-02 4.979824E-02 + 20 1 1.111772E+00 6.483554E-02 7.208234E-02 + 20 2 3.449018E+00 8.312721E-04 2.867073E-03 + 20 3 1.495095E+00 3.039098E-02 4.543741E-02 + 20 4 1.761560E+00 4.194920E-03 7.389604E-03 + 20 5 1.520396E+00 1.709715E-02 2.599444E-02 + 20 6 1.556511E+00 1.230189E-02 1.914803E-02 + 20 7 1.433377E+00 4.435042E-03 6.357086E-03 + 20 8 1.450259E+00 1.905302E-02 2.763180E-02 + 20 9 1.923955E+00 1.892055E-04 3.640228E-04 + 20 10 1.345265E+00 1.526353E-02 2.053349E-02 + 20 11 1.372447E+00 7.714971E-03 1.058839E-02 + 20 12 1.214374E+00 4.259121E-03 5.172165E-03 + 20 13 1.210334E+00 1.608779E-02 1.947160E-02 + 20 14 1.270349E+00 3.012415E-04 3.826820E-04 + 20 15 1.066380E+00 1.290253E-02 1.375901E-02 + 20 16 1.030526E+00 8.299082E-03 8.552417E-03 + 20 17 9.224735E-01 2.823805E-03 2.604886E-03 + 20 18 8.937285E-01 1.570714E-02 1.403792E-02 + 20 19 8.613448E-01 8.199838E-04 7.062888E-04 + 20 20 7.681585E-01 1.141328E-02 8.767208E-03 + 20 21 7.198850E-01 9.507248E-03 6.844126E-03 + 20 22 6.591742E-01 2.049911E-03 1.351248E-03 + 20 23 6.153966E-01 1.608705E-02 9.899917E-03 + 20 24 5.492833E-01 1.089046E-03 5.981945E-04 + 20 25 5.285495E-01 1.173897E-02 6.204627E-03 + 20 26 4.765553E-01 9.662420E-03 4.604678E-03 + 20 27 4.712148E-01 2.796615E-03 1.317806E-03 + 20 28 4.138305E-01 1.698703E-02 7.029749E-03 + 20 29 2.891350E-01 3.094697E-04 8.947850E-05 + 20 30 3.644695E-01 1.546498E-02 5.636514E-03 + 20 31 3.160553E-01 6.593073E-03 2.083776E-03 + 20 32 3.321114E-01 7.944442E-03 2.638440E-03 + 20 33 2.908957E-01 1.551683E-02 4.513780E-03 + 20 34 3.343962E-01 1.585206E-03 5.300867E-04 + 20 35 2.701653E-01 2.115662E-02 5.715784E-03 + 20 36 9.483067E-02 8.964094E-05 8.500711E-06 + 20 37 2.576921E-01 2.259455E-02 5.822439E-03 + 20 38 2.121243E-01 2.484225E-03 5.269646E-04 + 20 39 2.526510E-01 2.246389E-02 5.675522E-03 + 20 40 2.192436E-01 6.010757E-03 1.317820E-03 + 20 41 2.538077E-01 2.436485E-02 6.183987E-03 + 20 42 2.227097E-01 8.259572E-03 1.839487E-03 + 20 43 2.553837E-01 3.056804E-02 7.806581E-03 + 20 44 1.883084E-02 8.850685E-04 1.666658E-05 + 20 45 3.257561E-01 2.035248E-01 6.629943E-02 + 20 46 3.407500E-01 2.220604E-01 7.566708E-02 + 21 0 9.594401E-01 3.473310E-02 3.332433E-02 + 21 1 1.079808E+00 7.335483E-02 7.920911E-02 + 21 2 4.291674E-01 2.014806E-03 8.646890E-04 + 21 3 1.544156E+00 3.072742E-02 4.744792E-02 + 21 4 2.112946E-01 7.223555E-05 1.526298E-05 + 21 5 1.553473E+00 2.409499E-02 3.743091E-02 + 21 6 1.668091E+00 1.942850E-03 3.240851E-03 + 21 7 1.487136E+00 1.511330E-02 2.247553E-02 + 21 8 1.488200E+00 9.535812E-03 1.419119E-02 + 21 9 1.337741E+00 4.529800E-03 6.059698E-03 + 21 10 1.389027E+00 1.648828E-02 2.290268E-02 + 21 11 2.562903E+00 3.754687E-05 9.622899E-05 + 21 12 1.273297E+00 1.458955E-02 1.857683E-02 + 21 13 1.262884E+00 5.816550E-03 7.345626E-03 + 21 14 1.137082E+00 5.335693E-03 6.067119E-03 + 21 15 1.101271E+00 1.410147E-02 1.552955E-02 + 21 16 2.289598E+00 1.737889E-07 3.979069E-07 + 21 17 9.679056E-01 1.389614E-02 1.345015E-02 + 21 18 9.321510E-01 5.050618E-03 4.707939E-03 + 21 19 8.420380E-01 5.551667E-03 4.674715E-03 + 21 20 7.946668E-01 1.342680E-02 1.066983E-02 + 21 21 6.402360E-01 3.012780E-05 1.928890E-05 + 21 22 6.818025E-01 1.431654E-02 9.761054E-03 + 21 23 6.338306E-01 4.120490E-03 2.611692E-03 + 21 24 5.902072E-01 7.052294E-03 4.162315E-03 + 21 25 5.376208E-01 1.256915E-02 6.757435E-03 + 21 26 5.457071E-01 5.577018E-04 3.043418E-04 + 21 27 4.625832E-01 1.600784E-02 7.404957E-03 + 21 28 3.960936E-01 1.709952E-03 6.773009E-04 + 21 29 4.066148E-01 1.178551E-02 4.792165E-03 + 21 30 3.562020E-01 8.841699E-03 3.149431E-03 + 21 31 3.700706E-01 4.735395E-03 1.752431E-03 + 21 32 3.185638E-01 1.587777E-02 5.058085E-03 + 21 33 4.036045E-01 4.440519E-04 1.792214E-04 + 21 34 2.907225E-01 1.904850E-02 5.537827E-03 + 21 35 1.985386E-01 5.376500E-04 1.067443E-04 + 21 36 2.709488E-01 1.881856E-02 5.098865E-03 + 21 37 2.275669E-01 3.292611E-03 7.492895E-04 + 21 38 2.594623E-01 1.774792E-02 4.604915E-03 + 21 39 2.262712E-01 6.243942E-03 1.412824E-03 + 21 40 2.547836E-01 1.841083E-02 4.690777E-03 + 21 41 2.222811E-01 7.435946E-03 1.652870E-03 + 21 42 2.547638E-01 2.336646E-02 5.952929E-03 + 21 43 2.182540E-01 5.491942E-03 1.198638E-03 + 21 44 2.436280E-01 2.940658E-02 7.164267E-03 + 21 45 5.232784E-01 6.926141E-03 3.624300E-03 + 21 46 3.323665E-01 3.007396E-01 9.995574E-02 + 22 0 8.673299E-01 2.388004E-02 2.071187E-02 + 22 1 1.037017E+00 7.402048E-02 7.676051E-02 + 22 2 8.607367E-01 1.288252E-02 1.108846E-02 + 22 3 1.631588E+00 2.205807E-02 3.598968E-02 + 22 4 1.332295E+00 5.836398E-03 7.775801E-03 + 22 5 1.592326E+00 2.070980E-02 3.297675E-02 + 22 6 1.329616E+00 9.391301E-04 1.248682E-03 + 22 7 1.520031E+00 1.973186E-02 2.999303E-02 + 22 8 1.605003E+00 7.929051E-04 1.272615E-03 + 22 9 1.406501E+00 1.436130E-02 2.019918E-02 + 22 10 1.445445E+00 6.968007E-03 1.007187E-02 + 22 11 1.273839E+00 5.357185E-03 6.824190E-03 + 22 12 1.317583E+00 1.409000E-02 1.856475E-02 + 22 13 7.932773E-01 6.141606E-05 4.871996E-05 + 22 14 1.180500E+00 1.447483E-02 1.708754E-02 + 22 15 1.147247E+00 3.458454E-03 3.967702E-03 + 22 16 1.036669E+00 7.368758E-03 7.638960E-03 + 22 17 1.001112E+00 1.130443E-02 1.131700E-02 + 22 18 8.636987E-01 6.527974E-04 5.638202E-04 + 22 19 8.734766E-01 1.444429E-02 1.261675E-02 + 22 20 8.319412E-01 1.715367E-03 1.427084E-03 + 22 21 7.524706E-01 9.496666E-03 7.145962E-03 + 22 22 7.033201E-01 8.971805E-03 6.310051E-03 + 22 23 6.467975E-01 2.221640E-03 1.436951E-03 + 22 24 6.033415E-01 1.447902E-02 8.735794E-03 + 22 25 5.115394E-01 2.074337E-04 1.061105E-04 + 22 26 5.186744E-01 1.312948E-02 6.809925E-03 + 22 27 4.619514E-01 4.943064E-03 2.283456E-03 + 22 28 4.534570E-01 6.981476E-03 3.165800E-03 + 22 29 4.033033E-01 1.189740E-02 4.798262E-03 + 22 30 4.271296E-01 1.510673E-03 6.452532E-04 + 22 31 3.541480E-01 1.617243E-02 5.727431E-03 + 22 32 1.210517E-01 5.620141E-05 6.803276E-06 + 22 33 3.168879E-01 1.643048E-02 5.206619E-03 + 22 34 2.601818E-01 2.208603E-03 5.746384E-04 + 22 35 2.913242E-01 1.437559E-02 4.187956E-03 + 22 36 2.504131E-01 5.732740E-03 1.435553E-03 + 22 37 2.735955E-01 1.237339E-02 3.385304E-03 + 22 38 2.393799E-01 8.658863E-03 2.072758E-03 + 22 39 2.625726E-01 1.215132E-02 3.190605E-03 + 22 40 2.314071E-01 9.708571E-03 2.246632E-03 + 22 41 2.569116E-01 1.517471E-02 3.898560E-03 + 22 42 2.227318E-01 7.622851E-03 1.697851E-03 + 22 43 2.550579E-01 2.344018E-02 5.978604E-03 + 22 44 2.123511E-01 2.519491E-03 5.350167E-04 + 22 45 2.147671E-01 2.174282E-02 4.669644E-03 + 22 46 3.940610E-01 5.490886E-02 2.163744E-02 + 23 0 7.623260E-01 1.556150E-02 1.186294E-02 + 23 1 9.846384E-01 6.805742E-02 6.701196E-02 + 23 2 9.566173E-01 2.923462E-02 2.796634E-02 + 23 3 1.853535E+00 1.006040E-02 1.864730E-02 + 23 4 1.438158E+00 1.612101E-02 2.318455E-02 + 23 5 1.661838E+00 1.063941E-02 1.768097E-02 + 23 6 1.486372E+00 8.838548E-03 1.313737E-02 + 23 7 1.557171E+00 1.406448E-02 2.190079E-02 + 23 8 1.418525E+00 2.093465E-03 2.969632E-03 + 23 9 1.443201E+00 1.672741E-02 2.414102E-02 + 23 10 1.980923E+00 1.208300E-04 2.393549E-04 + 23 11 1.338925E+00 1.412570E-02 1.891325E-02 + 23 12 1.391755E+00 4.440066E-03 6.179484E-03 + 23 13 1.224168E+00 6.896105E-03 8.441994E-03 + 23 14 1.220304E+00 1.134488E-02 1.384421E-02 + 23 15 1.069552E+00 7.499371E-04 8.020967E-04 + 23 16 1.073446E+00 1.416377E-02 1.520404E-02 + 23 17 1.065488E+00 1.185148E-03 1.262762E-03 + 23 18 9.410677E-01 1.004500E-02 9.453028E-03 + 23 19 9.066036E-01 7.402539E-03 6.711169E-03 + 23 20 8.193847E-01 3.112000E-03 2.549925E-03 + 23 21 7.773600E-01 1.309355E-02 1.017840E-02 + 23 22 9.645821E-01 2.347667E-06 2.264518E-06 + 23 23 6.671507E-01 1.304327E-02 8.701825E-03 + 23 24 6.199000E-01 3.218506E-03 1.995152E-03 + 23 25 5.786261E-01 7.832291E-03 4.531968E-03 + 23 26 5.265660E-01 9.560602E-03 5.034288E-03 + 23 27 5.152576E-01 2.168210E-03 1.117187E-03 + 23 28 4.525062E-01 1.413263E-02 6.395100E-03 + 23 29 6.800572E+00 1.176147E-07 7.998473E-07 + 23 30 3.960057E-01 1.463729E-02 5.796449E-03 + 23 31 3.273904E-01 1.837531E-03 6.015899E-04 + 23 32 3.518118E-01 1.208741E-02 4.252492E-03 + 23 33 3.013662E-01 5.740741E-03 1.730066E-03 + 23 34 3.187351E-01 8.787326E-03 2.800830E-03 + 23 35 2.771329E-01 9.600970E-03 2.660745E-03 + 23 36 2.973299E-01 6.433306E-03 1.912814E-03 + 23 37 2.572438E-01 1.231340E-02 3.167545E-03 + 23 38 2.812285E-01 5.769381E-03 1.622514E-03 + 23 39 2.433037E-01 1.342662E-02 3.266747E-03 + 23 40 2.676852E-01 7.442551E-03 1.992261E-03 + 23 41 2.338726E-01 1.206562E-02 2.821818E-03 + 23 42 2.585879E-01 1.303605E-02 3.370966E-03 + 23 43 2.207007E-01 6.616059E-03 1.460169E-03 + 23 44 2.551631E-01 2.418757E-02 6.171777E-03 + 23 45 2.266128E-01 5.279605E-04 1.196426E-04 + 23 46 1.188951E-01 7.354915E-03 8.744631E-04 + 24 0 6.434980E-01 9.599926E-03 6.177533E-03 + 24 1 9.229896E-01 5.779688E-02 5.334592E-02 + 24 2 9.777289E-01 4.567077E-02 4.465363E-02 + 24 3 3.086415E+00 1.519334E-03 4.689294E-03 + 24 4 1.499651E+00 2.348039E-02 3.521238E-02 + 24 5 1.909666E+00 1.988232E-03 3.796859E-03 + 24 6 1.529865E+00 1.760199E-02 2.692866E-02 + 24 7 1.631276E+00 4.561049E-03 7.440330E-03 + 24 8 1.484200E+00 1.042792E-02 1.547711E-02 + 24 9 1.478662E+00 9.578302E-03 1.416307E-02 + 24 10 1.332587E+00 3.681260E-03 4.905601E-03 + 24 11 1.381672E+00 1.388154E-02 1.917974E-02 + 24 12 6.908146E-01 7.095990E-05 4.902014E-05 + 24 13 1.272419E+00 1.395012E-02 1.775039E-02 + 24 14 1.302700E+00 2.068661E-03 2.694844E-03 + 24 15 1.148294E+00 8.957538E-03 1.028588E-02 + 24 16 1.108424E+00 7.983303E-03 8.848884E-03 + 24 17 9.997832E-01 2.611153E-03 2.610587E-03 + 24 18 9.730000E-01 1.273883E-02 1.239488E-02 + 24 19 1.658624E+00 8.011957E-06 1.328882E-05 + 24 20 8.518561E-01 1.235463E-02 1.052437E-02 + 24 21 8.083394E-01 2.999168E-03 2.424346E-03 + 24 22 7.366560E-01 7.411538E-03 5.459754E-03 + 24 23 6.866204E-01 8.809362E-03 6.048688E-03 + 24 24 6.346736E-01 2.040364E-03 1.294965E-03 + 24 25 5.906686E-01 1.298148E-02 7.667750E-03 + 24 26 1.920570E-01 2.444063E-06 4.693995E-07 + 24 27 5.088176E-01 1.313676E-02 6.684216E-03 + 24 28 4.419021E-01 2.017216E-03 8.914120E-04 + 24 29 4.421842E-01 1.006590E-02 4.450981E-03 + 24 30 3.902713E-01 6.240477E-03 2.435479E-03 + 24 31 3.949794E-01 6.099415E-03 2.409143E-03 + 24 32 3.432316E-01 1.041709E-02 3.575476E-03 + 24 33 3.642639E-01 3.050375E-03 1.111141E-03 + 24 34 3.059359E-01 1.340064E-02 4.099738E-03 + 24 35 3.463159E-01 1.435311E-03 4.970710E-04 + 24 36 2.793435E-01 1.522215E-02 4.252208E-03 + 24 37 3.364231E-01 9.557199E-04 3.215262E-04 + 24 38 2.594313E-01 1.627847E-02 4.223145E-03 + 24 39 3.073519E-01 1.486774E-03 4.569628E-04 + 24 40 2.452614E-01 1.626066E-02 3.988112E-03 + 24 41 2.756624E-01 4.191066E-03 1.155319E-03 + 24 42 2.350838E-01 1.314783E-02 3.090843E-03 + 24 43 2.593151E-01 1.196045E-02 3.101524E-03 + 24 44 2.145498E-01 4.678600E-03 1.003793E-03 + 24 45 2.565530E-01 2.509750E-02 6.438839E-03 + 24 46 6.413301E+00 2.140076E-06 1.372495E-05 + 25 0 5.105794E-01 5.591362E-03 2.854834E-03 + 25 1 8.519416E-01 4.575019E-02 3.897649E-02 + 25 2 9.681241E-01 5.779051E-02 5.594839E-02 + 25 3 2.443599E-02 7.185675E-04 1.755891E-05 + 25 4 1.569245E+00 2.355133E-02 3.695781E-02 + 25 5 7.760847E-01 3.395750E-04 2.635389E-04 + 25 6 1.564695E+00 1.994606E-02 3.120950E-02 + 25 7 4.970509E+00 1.082206E-05 5.379115E-05 + 25 8 1.517964E+00 1.630966E-02 2.475747E-02 + 25 9 1.551024E+00 1.592009E-03 2.469245E-03 + 25 10 1.399721E+00 1.174446E-02 1.643896E-02 + 25 11 1.436782E+00 5.822690E-03 8.365933E-03 + 25 12 1.273380E+00 5.669171E-03 7.219012E-03 + 25 13 1.316965E+00 1.082017E-02 1.424979E-02 + 25 14 1.108192E+00 9.337027E-04 1.034722E-03 + 25 15 1.184733E+00 1.317148E-02 1.560470E-02 + 25 16 1.215379E+00 3.720416E-04 4.521717E-04 + 25 17 1.045287E+00 1.100816E-02 1.150668E-02 + 25 18 1.010111E+00 4.199438E-03 4.241898E-03 + 25 19 9.114024E-01 5.775705E-03 5.263991E-03 + 25 20 8.809496E-01 9.483279E-03 8.354291E-03 + 25 21 7.895951E-01 1.172026E-03 9.254256E-04 + 25 22 7.595936E-01 1.250474E-02 9.498518E-03 + 25 23 7.189426E-01 1.375619E-04 9.889914E-05 + 25 24 6.524693E-01 1.158528E-02 7.559039E-03 + 25 25 6.046350E-01 2.870756E-03 1.735760E-03 + 25 26 5.667850E-01 7.838779E-03 4.442903E-03 + 25 27 5.151671E-01 7.331555E-03 3.776976E-03 + 25 28 5.008333E-01 3.694996E-03 1.850577E-03 + 25 29 4.422147E-01 1.120620E-02 4.955548E-03 + 25 30 4.634480E-01 9.667448E-04 4.480360E-04 + 25 31 3.863811E-01 1.339449E-02 5.175379E-03 + 25 32 8.069746E-01 2.526339E-05 2.038691E-05 + 25 33 3.415187E-01 1.415828E-02 4.835319E-03 + 25 34 1.915737E-01 1.838679E-04 3.522425E-05 + 25 35 3.057674E-01 1.442832E-02 4.411712E-03 + 25 36 2.110460E-01 4.840013E-04 1.021465E-04 + 25 37 2.801023E-01 1.508290E-02 4.224755E-03 + 25 38 1.705788E-01 3.061398E-04 5.222094E-05 + 25 39 2.608526E-01 1.639444E-02 4.276531E-03 + 25 40 9.377848E-01 1.742152E-05 1.633764E-05 + 25 41 2.465725E-01 1.709304E-02 4.214674E-03 + 25 42 2.872772E-01 2.269995E-03 6.521178E-04 + 25 43 2.354408E-01 1.309741E-02 3.083664E-03 + 25 44 2.587506E-01 1.177293E-02 3.046253E-03 + 25 45 1.969715E-01 2.312096E-03 4.554170E-04 + 25 46 2.628143E-01 2.591328E-02 6.810381E-03 + 26 0 3.649820E-01 3.059659E-03 1.116720E-03 + 26 1 7.711428E-01 3.396561E-02 2.619233E-02 + 26 2 9.411038E-01 6.335875E-02 5.962716E-02 + 26 3 6.576939E-01 8.005353E-03 5.265072E-03 + 26 4 1.687065E+00 1.699713E-02 2.867527E-02 + 26 5 1.351493E+00 5.475908E-03 7.400650E-03 + 26 6 1.608056E+00 1.483907E-02 2.386205E-02 + 26 7 1.410970E+00 3.341010E-03 4.714065E-03 + 26 8 1.552751E+00 1.437970E-02 2.232809E-02 + 26 9 1.363105E+00 6.226013E-04 8.486708E-04 + 26 10 1.435170E+00 1.458268E-02 2.092861E-02 + 26 11 1.820515E+00 1.744851E-04 3.176527E-04 + 26 12 1.331602E+00 1.243629E-02 1.656018E-02 + 26 13 1.402467E+00 2.766100E-03 3.879363E-03 + 26 14 1.222661E+00 7.947125E-03 9.716640E-03 + 26 15 1.227747E+00 7.312892E-03 8.978381E-03 + 26 16 1.104281E+00 2.937887E-03 3.244252E-03 + 26 17 1.076823E+00 1.118513E-02 1.204441E-02 + 26 18 8.773944E-01 1.356920E-04 1.190554E-04 + 26 19 9.450435E-01 1.200230E-02 1.134269E-02 + 26 20 9.415570E-01 9.978441E-04 9.395271E-04 + 26 21 8.286337E-01 9.401643E-03 7.790519E-03 + 26 22 7.858794E-01 4.714146E-03 3.704750E-03 + 26 23 7.202391E-01 5.107125E-03 3.678351E-03 + 26 24 6.699640E-01 8.990726E-03 6.023463E-03 + 26 25 6.233164E-01 1.498289E-03 9.339081E-04 + 26 26 5.774973E-01 1.175711E-02 6.789698E-03 + 26 27 6.983070E-01 2.225707E-05 1.554227E-05 + 26 28 4.987880E-01 1.230977E-02 6.139965E-03 + 26 29 4.102245E-01 6.558409E-04 2.690420E-04 + 26 30 4.326005E-01 1.124944E-02 4.866514E-03 + 26 31 3.711218E-01 2.430629E-03 9.020594E-04 + 26 32 3.820854E-01 9.700593E-03 3.706455E-03 + 26 33 3.273828E-01 4.249844E-03 1.391326E-03 + 26 34 3.420274E-01 8.632543E-03 2.952566E-03 + 26 35 2.900737E-01 5.326145E-03 1.544975E-03 + 26 36 3.080250E-01 8.685712E-03 2.675416E-03 + 26 37 2.623198E-01 5.139684E-03 1.348241E-03 + 26 38 2.824159E-01 1.032457E-02 2.915822E-03 + 26 39 2.358244E-01 3.343835E-03 7.885578E-04 + 26 40 2.626688E-01 1.363043E-02 3.580289E-03 + 26 41 1.794760E-01 5.888941E-04 1.056924E-04 + 26 42 2.476216E-01 1.650450E-02 4.086870E-03 + 26 43 3.016571E-01 1.289600E-03 3.890170E-04 + 26 44 2.350138E-01 1.212549E-02 2.849657E-03 + 26 45 2.567068E-01 1.218849E-02 3.128869E-03 + 26 46 1.119673E-01 3.782453E-04 4.235112E-05 + 27 0 2.124856E-01 1.559709E-03 3.314157E-04 + 27 1 6.801657E-01 2.374774E-02 1.615240E-02 + 27 2 9.019096E-01 6.234771E-02 5.623200E-02 + 27 3 8.245431E-01 2.054704E-02 1.694192E-02 + 27 4 1.968574E+00 8.037495E-03 1.582240E-02 + 27 5 1.460447E+00 1.292368E-02 1.887435E-02 + 27 6 1.687304E+00 6.711745E-03 1.132475E-02 + 27 7 1.491216E+00 1.064407E-02 1.587260E-02 + 27 8 1.607252E+00 7.228365E-03 1.161781E-02 + 27 9 1.471798E+00 6.218310E-03 9.152096E-03 + 27 10 1.467212E+00 9.833396E-03 1.442768E-02 + 27 11 1.311355E+00 2.426328E-03 3.181777E-03 + 27 12 1.372488E+00 1.197902E-02 1.644107E-02 + 27 13 9.131762E-01 1.682878E-04 1.536764E-04 + 27 14 1.265974E+00 1.229517E-02 1.556536E-02 + 27 15 1.372546E+00 6.439734E-04 8.838830E-04 + 27 16 1.148115E+00 9.977295E-03 1.145508E-02 + 27 17 1.116620E+00 3.689529E-03 4.119800E-03 + 27 18 1.013790E+00 5.912973E-03 5.994516E-03 + 27 19 9.748594E-01 7.724642E-03 7.530440E-03 + 27 20 8.729055E-01 2.025759E-03 1.768296E-03 + 27 21 8.549469E-01 1.070486E-02 9.152086E-03 + 27 22 7.016565E-01 8.356190E-05 5.863175E-05 + 27 23 7.409322E-01 1.136646E-02 8.421776E-03 + 27 24 6.891016E-01 6.553759E-04 4.516205E-04 + 27 25 6.376941E-01 9.814805E-03 6.258843E-03 + 27 26 5.889459E-01 3.047073E-03 1.794561E-03 + 27 27 5.549413E-01 7.123186E-03 3.952951E-03 + 27 28 5.035690E-01 6.013753E-03 3.028339E-03 + 27 29 4.897220E-01 4.487901E-03 2.197824E-03 + 27 30 4.317856E-01 8.558740E-03 3.695540E-03 + 27 31 4.364935E-01 2.614495E-03 1.141210E-03 + 27 32 3.767062E-01 1.028306E-02 3.873694E-03 + 27 33 4.002986E-01 1.640194E-03 6.565675E-04 + 27 34 3.321289E-01 1.123050E-02 3.729972E-03 + 27 35 3.684901E-01 1.455423E-03 5.363088E-04 + 27 36 2.956449E-01 1.146189E-02 3.388650E-03 + 27 37 3.257163E-01 2.180846E-03 7.103372E-04 + 27 38 2.686432E-01 1.057165E-02 2.840002E-03 + 27 39 2.903516E-01 4.590067E-03 1.332733E-03 + 27 40 2.458173E-01 7.484598E-03 1.839844E-03 + 27 41 2.655825E-01 9.714172E-03 2.579914E-03 + 27 42 2.127519E-01 2.084236E-03 4.434251E-04 + 27 43 2.484737E-01 1.518785E-02 3.773781E-03 + 27 44 3.133076E-01 8.829474E-04 2.766341E-04 + 27 45 2.337292E-01 1.041394E-02 2.434040E-03 + 27 46 2.526791E-01 1.270790E-02 3.211021E-03 + 28 0 7.127795E-02 7.297746E-04 5.201683E-05 + 28 1 5.786676E-01 1.567266E-02 9.069263E-03 + 28 2 8.529191E-01 5.625216E-02 4.797854E-02 + 28 3 8.775335E-01 3.420696E-02 3.001775E-02 + 28 4 3.331483E+00 1.471832E-03 4.903383E-03 + 28 5 1.534327E+00 1.776397E-02 2.725575E-02 + 28 6 1.996061E+00 9.982352E-04 1.992539E-03 + 28 7 1.530190E+00 1.589958E-02 2.432938E-02 + 28 8 1.792549E+00 1.189570E-03 2.132362E-03 + 28 9 1.508185E+00 1.216808E-02 1.835172E-02 + 28 10 1.514031E+00 2.932482E-03 4.439870E-03 + 28 11 1.384567E+00 8.740962E-03 1.210244E-02 + 28 12 1.422836E+00 5.664125E-03 8.059122E-03 + 28 13 1.264136E+00 4.803972E-03 6.072873E-03 + 28 14 1.308840E+00 8.770624E-03 1.147935E-02 + 28 15 1.130916E+00 1.525770E-03 1.725517E-03 + 28 16 1.182041E+00 1.084779E-02 1.282254E-02 + 28 17 7.512243E-01 2.420335E-05 1.818214E-05 + 28 18 1.045358E+00 1.092087E-02 1.141622E-02 + 28 19 1.031284E+00 8.443586E-04 8.707734E-04 + 28 20 9.158212E-01 8.914034E-03 8.163661E-03 + 28 21 8.887804E-01 3.477941E-03 3.091126E-03 + 28 22 8.032311E-01 5.752473E-03 4.620565E-03 + 28 23 7.632040E-01 6.707309E-03 5.119045E-03 + 28 24 7.028694E-01 2.715516E-03 1.908653E-03 + 28 25 6.531519E-01 9.342116E-03 6.101821E-03 + 28 26 6.138830E-01 7.307366E-04 4.485868E-04 + 28 27 5.640098E-01 1.078886E-02 6.085024E-03 + 28 28 7.239232E-01 1.642616E-05 1.189128E-05 + 28 29 4.885649E-01 1.115584E-02 5.450351E-03 + 28 30 3.610714E-01 2.024405E-04 7.309550E-05 + 28 31 4.236630E-01 1.097625E-02 4.650231E-03 + 28 32 3.370118E-01 6.787447E-04 2.287450E-04 + 28 33 3.726786E-01 1.085684E-02 4.046113E-03 + 28 34 2.924436E-01 8.998110E-04 2.631440E-04 + 28 35 3.314783E-01 1.123526E-02 3.724245E-03 + 28 36 2.367342E-01 5.833177E-04 1.380913E-04 + 28 37 2.967384E-01 1.216441E-02 3.609648E-03 + 28 38 4.825898E-02 2.993250E-05 1.444512E-06 + 28 39 2.706816E-01 1.279529E-02 3.463451E-03 + 28 40 3.263463E-01 8.582099E-04 2.800736E-04 + 28 41 2.495449E-01 1.062133E-02 2.650499E-03 + 28 42 2.703877E-01 6.044671E-03 1.634405E-03 + 28 43 2.226562E-01 3.613997E-03 8.046789E-04 + 28 44 2.490593E-01 1.366888E-02 3.404361E-03 + 28 45 3.139251E-01 8.262474E-04 2.593798E-04 + 28 46 2.315383E-01 8.140325E-03 1.884797E-03 + 29 0 2.165716E-04 3.049951E-04 6.605329E-08 + 29 1 4.666691E-01 9.768545E-03 4.558678E-03 + 29 2 7.952965E-01 4.719228E-02 3.753186E-02 + 29 3 8.878818E-01 4.534323E-02 4.025942E-02 + 29 4 3.936227E-01 2.712457E-04 1.067685E-04 + 29 5 1.620568E+00 1.757990E-02 2.848943E-02 + 29 6 9.466861E-01 3.698187E-04 3.501022E-04 + 29 7 1.563220E+00 1.582016E-02 2.473039E-02 + 29 8 1.096930E+00 3.642319E-04 3.995369E-04 + 29 9 1.540400E+00 1.336415E-02 2.058614E-02 + 29 10 3.764068E+01 5.625910E-08 2.117631E-06 + 29 11 1.419297E+00 1.225099E-02 1.738779E-02 + 29 12 1.603111E+00 5.508151E-04 8.830179E-04 + 29 13 1.319154E+00 1.018283E-02 1.343272E-02 + 29 14 1.388707E+00 2.397785E-03 3.329821E-03 + 29 15 1.213377E+00 7.278579E-03 8.831664E-03 + 29 16 1.226195E+00 5.170418E-03 6.339943E-03 + 29 17 1.103240E+00 3.996121E-03 4.408681E-03 + 29 18 1.074850E+00 7.990653E-03 8.588756E-03 + 29 19 9.668612E-01 1.336089E-03 1.291812E-03 + 29 20 9.430960E-01 9.857799E-03 9.296851E-03 + 29 21 7.055049E-01 6.483470E-05 4.574120E-05 + 29 22 8.282753E-01 1.024853E-02 8.488605E-03 + 29 23 8.155501E-01 3.699264E-04 3.016935E-04 + 29 24 7.211703E-01 9.281556E-03 6.693583E-03 + 29 25 6.684547E-01 1.837356E-03 1.228189E-03 + 29 26 6.226612E-01 7.553607E-03 4.703338E-03 + 29 27 5.735359E-01 3.768877E-03 2.161586E-03 + 29 28 5.433548E-01 5.753160E-03 3.126007E-03 + 29 29 4.920552E-01 5.543218E-03 2.727569E-03 + 29 30 4.802064E-01 4.376959E-03 2.101844E-03 + 29 31 4.215747E-01 6.793478E-03 2.863959E-03 + 29 32 4.238028E-01 3.669944E-03 1.555332E-03 + 29 33 3.668600E-01 7.351474E-03 2.696962E-03 + 29 34 3.773556E-01 3.771571E-03 1.423223E-03 + 29 35 3.219585E-01 7.044414E-03 2.268009E-03 + 29 36 3.369782E-01 4.928537E-03 1.660810E-03 + 29 37 2.827477E-01 5.532240E-03 1.564228E-03 + 29 38 2.999735E-01 7.499359E-03 2.249609E-03 + 29 39 2.469794E-01 2.635348E-03 6.508768E-04 + 29 40 2.726104E-01 1.104173E-02 3.010090E-03 + 29 41 7.567297E-02 5.280929E-05 3.996236E-06 + 29 42 2.516495E-01 1.188665E-02 2.991270E-03 + 29 43 2.783371E-01 3.309824E-03 9.212467E-04 + 29 44 2.269413E-01 4.687385E-03 1.063761E-03 + 29 45 2.492546E-01 1.223636E-02 3.049970E-03 + 29 46 3.033448E-01 1.046603E-03 3.174815E-04 + 30 0 2.251473E-01 1.077336E-04 2.425593E-05 + 30 1 3.451750E-01 5.741243E-03 1.981734E-03 + 30 2 7.296457E-01 3.718050E-02 2.712859E-02 + 30 3 8.765121E-01 5.183179E-02 4.543119E-02 + 30 4 4.529263E-01 4.744661E-03 2.148982E-03 + 30 5 1.759076E+00 1.309753E-02 2.303954E-02 + 30 6 1.390785E+00 3.916333E-03 5.446777E-03 + 30 7 1.601684E+00 1.124476E-02 1.801054E-02 + 30 8 1.417944E+00 4.249366E-03 6.025365E-03 + 30 9 1.581050E+00 9.556998E-03 1.511009E-02 + 30 10 1.445688E+00 2.403982E-03 3.475407E-03 + 30 11 1.447181E+00 1.020952E-02 1.477503E-02 + 30 12 1.236012E+00 8.799393E-04 1.087615E-03 + 30 13 1.357161E+00 1.061628E-02 1.440800E-02 + 30 14 5.367478E-01 3.082959E-05 1.654771E-05 + 30 15 1.252978E+00 1.039355E-02 1.302289E-02 + 30 16 1.398762E+00 3.899855E-04 5.454967E-04 + 30 17 1.139491E+00 9.048815E-03 1.031104E-02 + 30 18 1.119745E+00 1.947297E-03 2.180477E-03 + 30 19 1.010647E+00 6.834843E-03 6.907616E-03 + 30 20 9.725768E-01 4.233502E-03 4.117406E-03 + 30 21 8.820973E-01 4.312349E-03 3.803912E-03 + 30 22 8.534214E-01 6.570130E-03 5.607090E-03 + 30 23 7.729646E-01 2.138339E-03 1.652860E-03 + 30 24 7.400374E-01 8.380436E-03 6.201836E-03 + 30 25 6.854744E-01 7.165521E-04 4.911781E-04 + 30 26 6.359435E-01 9.430265E-03 5.997115E-03 + 30 27 6.241375E-01 9.036917E-05 5.640279E-05 + 30 28 5.503991E-01 9.830772E-03 5.410848E-03 + 30 29 3.227449E-01 1.374481E-05 4.436068E-06 + 30 30 4.783433E-01 9.902135E-03 4.736620E-03 + 30 31 3.307272E-01 1.297856E-04 4.292364E-05 + 30 32 4.151513E-01 9.984414E-03 4.145042E-03 + 30 33 2.700611E-01 1.471566E-04 3.974127E-05 + 30 34 3.645486E-01 1.026947E-02 3.743721E-03 + 30 35 5.608135E-02 1.713033E-05 9.606920E-07 + 30 36 3.233062E-01 1.058268E-02 3.421446E-03 + 30 37 4.425831E-01 2.190912E-04 9.696608E-05 + 30 38 2.879130E-01 1.002336E-02 2.885857E-03 + 30 39 3.165318E-01 2.105077E-03 6.663238E-04 + 30 40 2.591035E-01 6.915787E-03 1.791904E-03 + 30 41 2.764712E-01 7.048360E-03 1.948668E-03 + 30 42 2.172795E-01 1.423373E-03 3.092697E-04 + 30 43 2.533230E-01 1.145199E-02 2.901053E-03 + 30 44 2.916911E-01 1.599518E-03 4.665653E-04 + 30 45 2.288834E-01 5.145834E-03 1.177796E-03 + 30 46 2.489274E-01 1.097657E-02 2.732368E-03 + 31 0 1.989999E+00 2.806796E-05 5.585520E-05 + 31 1 2.177442E-01 3.167868E-03 6.897850E-04 + 31 2 6.563270E-01 2.770962E-02 1.818657E-02 + 31 3 8.517677E-01 5.322103E-02 4.533195E-02 + 31 4 6.897936E-01 1.311134E-02 9.044119E-03 + 31 5 2.050856E+00 6.974435E-03 1.430356E-02 + 31 6 1.498188E+00 8.725174E-03 1.307195E-02 + 31 7 1.662164E+00 5.380074E-03 8.942566E-03 + 31 8 1.481525E+00 9.434381E-03 1.397727E-02 + 31 9 1.655344E+00 4.100046E-03 6.786985E-03 + 31 10 1.491619E+00 7.095623E-03 1.058397E-02 + 31 11 1.477039E+00 5.085501E-03 7.511482E-03 + 31 12 1.352754E+00 5.079269E-03 6.871002E-03 + 31 13 1.398547E+00 6.433840E-03 8.998024E-03 + 31 14 1.234664E+00 2.862001E-03 3.533610E-03 + 31 15 1.290881E+00 7.983553E-03 1.030581E-02 + 31 16 1.107921E+00 1.097814E-03 1.216291E-03 + 31 17 1.170413E+00 9.046494E-03 1.058814E-02 + 31 18 9.349720E-01 1.186899E-04 1.109717E-04 + 31 19 1.037286E+00 9.323801E-03 9.671446E-03 + 31 20 1.090123E+00 1.252400E-04 1.365270E-04 + 31 21 9.106532E-01 8.723696E-03 7.944262E-03 + 31 22 8.994496E-01 9.904087E-04 8.908227E-04 + 31 23 8.003215E-01 7.499158E-03 6.001738E-03 + 31 24 7.644414E-01 2.356562E-03 1.801453E-03 + 31 25 7.005168E-01 6.041417E-03 4.232114E-03 + 31 26 6.490835E-01 3.806949E-03 2.471028E-03 + 31 27 6.076297E-01 4.731412E-03 2.874946E-03 + 31 28 5.585774E-01 5.010488E-03 2.798745E-03 + 31 29 5.327231E-01 3.821150E-03 2.035615E-03 + 31 30 4.810298E-01 5.774164E-03 2.777545E-03 + 31 31 4.726332E-01 3.448880E-03 1.630055E-03 + 31 32 4.122858E-01 5.978992E-03 2.465054E-03 + 31 33 4.153068E-01 3.733886E-03 1.550708E-03 + 31 34 3.575422E-01 5.466269E-03 1.954422E-03 + 31 35 3.664197E-01 4.877968E-03 1.787383E-03 + 31 36 3.106756E-01 3.998408E-03 1.242208E-03 + 31 37 3.254924E-01 7.056092E-03 2.296704E-03 + 31 38 2.596014E-01 1.632812E-03 4.238803E-04 + 31 39 2.900715E-01 9.628879E-03 2.793063E-03 + 31 40 8.060889E+02 3.100262E-09 2.499087E-06 + 31 41 2.629547E-01 9.602099E-03 2.524917E-03 + 31 42 2.860275E-01 3.115176E-03 8.910259E-04 + 31 43 2.337041E-01 3.615194E-03 8.448855E-04 + 31 44 2.549795E-01 9.970376E-03 2.542241E-03 + 31 45 3.146165E-01 6.879127E-04 2.164287E-04 + 31 46 2.294340E-01 5.027177E-03 1.153405E-03 + 32 0 2.254723E+01 3.206893E-06 7.230657E-05 + 32 1 9.487261E-02 1.626743E-03 1.543333E-04 + 32 2 5.756601E-01 1.964247E-02 1.130738E-02 + 32 3 8.176870E-01 5.030464E-02 4.113345E-02 + 32 4 7.794688E-01 2.271553E-02 1.770604E-02 + 32 5 3.025996E+00 2.034940E-03 6.157721E-03 + 32 6 1.575015E+00 1.203516E-02 1.895556E-02 + 32 7 1.823039E+00 1.216041E-03 2.216891E-03 + 32 8 1.516046E+00 1.263700E-02 1.915828E-02 + 32 9 1.966098E+00 5.346292E-04 1.051133E-03 + 32 10 1.522333E+00 1.024427E-02 1.559518E-02 + 32 11 1.532749E+00 9.753079E-04 1.494902E-03 + 32 12 1.391690E+00 8.909614E-03 1.239942E-02 + 32 13 1.477146E+00 1.789353E-03 2.643137E-03 + 32 14 1.294909E+00 7.098233E-03 9.191566E-03 + 32 15 1.347633E+00 3.158578E-03 4.256604E-03 + 32 16 1.192698E+00 5.192324E-03 6.192875E-03 + 32 17 1.208849E+00 4.774896E-03 5.772128E-03 + 32 18 1.088758E+00 3.262738E-03 3.552333E-03 + 32 19 1.063791E+00 6.367035E-03 6.773192E-03 + 32 20 9.630153E-01 1.653693E-03 1.592531E-03 + 32 21 9.342659E-01 7.597423E-03 7.098014E-03 + 32 22 8.202912E-01 5.715643E-04 4.688491E-04 + 32 23 8.215263E-01 8.319664E-03 6.834823E-03 + 32 24 6.791915E-01 7.038757E-05 4.780664E-05 + 32 25 7.163267E-01 8.558555E-03 6.130722E-03 + 32 26 6.442846E-01 2.081942E-05 1.341363E-05 + 32 27 6.182292E-01 8.500550E-03 5.255288E-03 + 32 28 5.464682E-01 1.903843E-04 1.040389E-04 + 32 29 5.367894E-01 8.385865E-03 4.501444E-03 + 32 30 4.562826E-01 3.354630E-04 1.530659E-04 + 32 31 4.684369E-01 8.425968E-03 3.947034E-03 + 32 32 3.577317E-01 2.882871E-04 1.031294E-04 + 32 33 4.072306E-01 8.707282E-03 3.545872E-03 + 32 34 2.182091E-01 6.790156E-05 1.481673E-05 + 32 35 3.573432E-01 9.038820E-03 3.229961E-03 + 32 36 5.202925E-01 9.677896E-05 5.035337E-05 + 32 37 3.161946E-01 8.671480E-03 2.741875E-03 + 32 38 3.481575E-01 1.467563E-03 5.109429E-04 + 32 39 2.787843E-01 6.250542E-03 1.742553E-03 + 32 40 2.952537E-01 5.346834E-03 1.578672E-03 + 32 41 2.360747E-01 1.670755E-03 3.944230E-04 + 32 42 2.654835E-01 9.384925E-03 2.491543E-03 + 32 43 3.199885E-01 6.830544E-04 2.185696E-04 + 32 44 2.398017E-01 5.518771E-03 1.323410E-03 + 32 45 2.567536E-01 8.110524E-03 2.082407E-03 + 32 46 3.534177E-01 2.747896E-04 9.711552E-05 + 33 0 2.705632E+02 2.678477E-07 7.246972E-05 + 33 1 7.759766E-03 7.648709E-04 5.935219E-06 + 33 2 4.881162E-01 1.329890E-02 6.491410E-03 + 33 3 7.765525E-01 4.449319E-02 3.455129E-02 + 33 4 8.147013E-01 3.114596E-02 2.537466E-02 + 33 5 6.448212E+01 1.823213E-05 1.175647E-03 + 33 6 1.660015E+00 1.254805E-02 2.082996E-02 + 33 7 1.566993E-02 9.091612E-06 1.424649E-07 + 33 8 1.542667E+00 1.255480E-02 1.936788E-02 + 33 9 1.017311E+00 2.914248E-04 2.964697E-04 + 33 10 1.553438E+00 1.010012E-02 1.568991E-02 + 33 11 1.290190E+00 9.398508E-05 1.212586E-04 + 33 12 1.417652E+00 9.611685E-03 1.362603E-02 + 33 13 7.194792E+01 7.932672E-08 5.707393E-06 + 33 14 1.330638E+00 8.887114E-03 1.182553E-02 + 33 15 1.628572E+00 2.079840E-04 3.387169E-04 + 33 16 1.229955E+00 8.108541E-03 9.973139E-03 + 33 17 1.302219E+00 8.455336E-04 1.101070E-03 + 33 18 1.121742E+00 6.977583E-03 7.827050E-03 + 33 19 1.102050E+00 1.877271E-03 2.068848E-03 + 33 20 9.969892E-01 5.657353E-03 5.640320E-03 + 33 21 9.610127E-01 3.104996E-03 2.983940E-03 + 33 22 8.734188E-01 4.309433E-03 3.763940E-03 + 33 23 8.446628E-01 4.314397E-03 3.644211E-03 + 33 24 7.686563E-01 3.142796E-03 2.415730E-03 + 33 25 7.334483E-01 5.318258E-03 3.900668E-03 + 33 26 6.796159E-01 2.281713E-03 1.550688E-03 + 33 27 6.293655E-01 6.023775E-03 3.791156E-03 + 33 28 5.945384E-01 1.778167E-03 1.057189E-03 + 33 29 5.436072E-01 6.397591E-03 3.477776E-03 + 33 30 5.259322E-01 1.646487E-03 8.659407E-04 + 33 31 4.704427E-01 6.406009E-03 3.013660E-03 + 33 32 4.695975E-01 1.952446E-03 9.168637E-04 + 33 33 4.043571E-01 5.918077E-03 2.393016E-03 + 33 34 4.101582E-01 2.892533E-03 1.186396E-03 + 33 35 3.500267E-01 4.664759E-03 1.632790E-03 + 33 36 3.593023E-01 4.743208E-03 1.704245E-03 + 33 37 3.001738E-01 2.473405E-03 7.424513E-04 + 33 38 3.182778E-01 7.308726E-03 2.326206E-03 + 33 39 1.997545E-01 2.471508E-04 4.936949E-05 + 33 40 2.829718E-01 8.558145E-03 2.421713E-03 + 33 41 3.192255E-01 1.200459E-03 3.832171E-04 + 33 42 2.522333E-01 4.859156E-03 1.225641E-03 + 33 43 2.687431E-01 6.967026E-03 1.872340E-03 + 33 44 1.056929E+00 9.708752E-07 1.026146E-06 + 33 45 2.430479E-01 6.593274E-03 1.602481E-03 + 33 46 2.586221E-01 6.332149E-03 1.637634E-03 + 34 0 1.653690E+01 3.769267E-06 6.233197E-05 + 34 1 5.943317E-02 3.191754E-04 1.896961E-05 + 34 2 3.945827E-01 8.626628E-03 3.403918E-03 + 34 3 7.298707E-01 3.726637E-02 2.719963E-02 + 34 4 8.237972E-01 3.687260E-02 3.037554E-02 + 34 5 5.480791E-02 1.214886E-03 6.658534E-05 + 34 6 1.778156E+00 1.054247E-02 1.874616E-02 + 34 7 1.386972E+00 1.268403E-03 1.759239E-03 + 34 8 1.567714E+00 9.871597E-03 1.547584E-02 + 34 9 1.363673E+00 2.581725E-03 3.520628E-03 + 34 10 1.592863E+00 7.366401E-03 1.173367E-02 + 34 11 1.461549E+00 1.960438E-03 2.865276E-03 + 34 12 1.439502E+00 7.332851E-03 1.055565E-02 + 34 13 1.271327E+00 1.360025E-03 1.729037E-03 + 34 14 1.362741E+00 7.372927E-03 1.004739E-02 + 34 15 1.129202E+00 6.327207E-04 7.144696E-04 + 34 16 1.261106E+00 7.648470E-03 9.645533E-03 + 34 17 9.380349E-01 1.549400E-04 1.453391E-04 + 34 18 1.148235E+00 7.699783E-03 8.841161E-03 + 34 19 3.775590E+00 8.015621E-07 3.026370E-06 + 34 20 1.019812E+00 7.521220E-03 7.670228E-03 + 34 21 1.043676E+00 1.806742E-04 1.885652E-04 + 34 22 8.966306E-01 7.102252E-03 6.368097E-03 + 34 23 8.912130E-01 5.955596E-04 5.307704E-04 + 34 24 7.892533E-01 6.580850E-03 5.193958E-03 + 34 25 7.585563E-01 1.086436E-03 8.241230E-04 + 34 26 6.921283E-01 6.106196E-03 4.226271E-03 + 34 27 6.389082E-01 1.486699E-03 9.498644E-04 + 34 28 6.003937E-01 5.835114E-03 3.503366E-03 + 34 29 5.467869E-01 1.647564E-03 9.008661E-04 + 34 30 5.236541E-01 5.889158E-03 3.083882E-03 + 34 31 4.655184E-01 1.461143E-03 6.801889E-04 + 34 32 4.594286E-01 6.340059E-03 2.912805E-03 + 34 33 3.819411E-01 9.024725E-04 3.446914E-04 + 34 34 4.002620E-01 7.113654E-03 2.847326E-03 + 34 35 2.753024E-01 1.940070E-04 5.341059E-05 + 34 36 3.511955E-01 7.733373E-03 2.715926E-03 + 34 37 4.672121E-01 1.488776E-04 6.955741E-05 + 34 38 3.102944E-01 6.977887E-03 2.165199E-03 + 34 39 3.318053E-01 2.247182E-03 7.456268E-04 + 34 40 2.693041E-01 3.564373E-03 9.599003E-04 + 34 41 2.866855E-01 6.523562E-03 1.870211E-03 + 34 42 8.669883E-02 4.213983E-05 3.653474E-06 + 34 43 2.575079E-01 7.009795E-03 1.805077E-03 + 34 44 2.746884E-01 3.909017E-03 1.073762E-03 + 34 45 1.964301E-01 5.319306E-04 1.044872E-04 + 34 46 2.451890E-01 6.791576E-03 1.665220E-03 + 35 0 6.448443E+00 7.475084E-06 4.820266E-05 + 35 1 6.715558E-01 1.106420E-04 7.430228E-05 + 35 2 2.968092E-01 5.373251E-03 1.594830E-03 + 35 3 6.788194E-01 2.983237E-02 2.025080E-02 + 35 4 8.182686E-01 3.936971E-02 3.221500E-02 + 35 5 4.310499E-01 4.798329E-03 2.068319E-03 + 35 6 1.970079E+00 7.217464E-03 1.421898E-02 + 35 7 1.515577E+00 3.624022E-03 5.492485E-03 + 35 8 1.595095E+00 6.193769E-03 9.879650E-03 + 35 9 1.437753E+00 5.619966E-03 8.080121E-03 + 35 10 1.655738E+00 3.894993E-03 6.449089E-03 + 35 11 1.496399E+00 4.691977E-03 7.021068E-03 + 35 12 1.460899E+00 3.949791E-03 5.770246E-03 + 35 13 1.342559E+00 4.062580E-03 5.454251E-03 + 35 14 1.400919E+00 4.193245E-03 5.874398E-03 + 35 15 1.245765E+00 3.055280E-03 3.806160E-03 + 35 16 1.295816E+00 4.830577E-03 6.259539E-03 + 35 17 1.146808E+00 2.133256E-03 2.446435E-03 + 35 18 1.176347E+00 5.460879E-03 6.423887E-03 + 35 19 1.054207E+00 1.305824E-03 1.376608E-03 + 35 20 1.041273E+00 6.032112E-03 6.281076E-03 + 35 21 9.334609E-01 6.942666E-04 6.480708E-04 + 35 22 9.162255E-01 6.426695E-03 5.888302E-03 + 35 23 7.957348E-01 3.072045E-04 2.444533E-04 + 35 24 8.067766E-01 6.658896E-03 5.372241E-03 + 35 25 6.942588E-01 1.140120E-04 7.915383E-05 + 35 26 7.052191E-01 6.765308E-03 4.771024E-03 + 35 27 6.771720E-01 4.443649E-05 3.009114E-05 + 35 28 6.091791E-01 6.812984E-03 4.150327E-03 + 35 29 6.385249E-01 4.166573E-05 2.660461E-05 + 35 30 5.285136E-01 6.821957E-03 3.605497E-03 + 35 31 5.652598E-01 1.222301E-04 6.909173E-05 + 35 32 4.601627E-01 6.702576E-03 3.084276E-03 + 35 33 4.902964E-01 4.634927E-04 2.272488E-04 + 35 34 3.975954E-01 6.155648E-03 2.447458E-03 + 35 35 4.122493E-01 1.478182E-03 6.093794E-04 + 35 36 3.449316E-01 4.672478E-03 1.611686E-03 + 35 37 3.551589E-01 3.637606E-03 1.291928E-03 + 35 38 2.945655E-01 2.052655E-03 6.046416E-04 + 35 39 3.132651E-01 6.423240E-03 2.012177E-03 + 35 40 2.367222E-02 1.404653E-05 3.325125E-07 + 35 41 2.773036E-01 6.617209E-03 1.834976E-03 + 35 42 2.973004E-01 2.569395E-03 7.638822E-04 + 35 43 2.362604E-01 1.694210E-03 4.002747E-04 + 35 44 2.608601E-01 6.990910E-03 1.823650E-03 + 35 45 2.883970E-01 1.496062E-03 4.314597E-04 + 35 46 2.220610E-01 1.526108E-03 3.388890E-04 + 36 0 3.595236E+00 9.559969E-06 3.437035E-05 + 36 1 4.500390E+00 2.676231E-05 1.204408E-04 + 36 2 1.982269E-01 3.218294E-03 6.379523E-04 + 36 3 6.244877E-01 2.299669E-02 1.436115E-02 + 36 4 8.038456E-01 3.889888E-02 3.126870E-02 + 36 5 6.067103E-01 9.439102E-03 5.726800E-03 + 36 6 2.339170E+00 3.888926E-03 9.096859E-03 + 36 7 1.587569E+00 5.755404E-03 9.137103E-03 + 36 8 1.630400E+00 2.962811E-03 4.830567E-03 + 36 9 1.473516E+00 7.881510E-03 1.161353E-02 + 36 10 1.799491E+00 1.258321E-03 2.264337E-03 + 36 11 1.521625E+00 6.614113E-03 1.006420E-02 + 36 12 1.487577E+00 1.273050E-03 1.893761E-03 + 36 13 1.374348E+00 6.157681E-03 8.462795E-03 + 36 14 1.468334E+00 1.414370E-03 2.076768E-03 + 36 15 1.287227E+00 5.311594E-03 6.837224E-03 + 36 16 1.349969E+00 1.875670E-03 2.532097E-03 + 36 17 1.190439E+00 4.552903E-03 5.419953E-03 + 36 18 1.215321E+00 2.426620E-03 2.949122E-03 + 36 19 1.091133E+00 3.749975E-03 4.091723E-03 + 36 20 1.065614E+00 3.041704E-03 3.241283E-03 + 36 21 9.714149E-01 3.037557E-03 2.950729E-03 + 36 22 9.362584E-01 3.597369E-03 3.368067E-03 + 36 23 8.517038E-01 2.453851E-03 2.089954E-03 + 36 24 8.248372E-01 4.037513E-03 3.330291E-03 + 36 25 7.521435E-01 2.062341E-03 1.551177E-03 + 36 26 7.190020E-01 4.300397E-03 3.091994E-03 + 36 27 6.684293E-01 1.896045E-03 1.267372E-03 + 36 28 6.177545E-01 4.344214E-03 2.683657E-03 + 36 29 5.849289E-01 2.005221E-03 1.172912E-03 + 36 30 5.332364E-01 4.095884E-03 2.184074E-03 + 36 31 5.135857E-01 2.474981E-03 1.271115E-03 + 36 32 4.603433E-01 3.440807E-03 1.583952E-03 + 36 33 4.534929E-01 3.428435E-03 1.554771E-03 + 36 34 3.896608E-01 2.269651E-03 8.843938E-04 + 36 35 3.952325E-01 4.878507E-03 1.928145E-03 + 36 36 3.177445E-01 7.655603E-04 2.432526E-04 + 36 37 3.464765E-01 6.265983E-03 2.171016E-03 + 36 38 7.594291E-01 1.684610E-05 1.279342E-05 + 36 39 3.061436E-01 5.888469E-03 1.802717E-03 + 36 40 3.267305E-01 2.027386E-03 6.624087E-04 + 36 41 2.621461E-01 2.326912E-03 6.099910E-04 + 36 42 2.815954E-01 5.971189E-03 1.681459E-03 + 36 43 3.890824E-01 1.601789E-04 6.232278E-05 + 36 44 2.498536E-01 4.046723E-03 1.011089E-03 + 36 45 2.646058E-01 5.248130E-03 1.388686E-03 + 37 0 2.294155E+00 1.000198E-05 2.294608E-05 + 37 1 7.087519E+01 2.015548E-06 1.428524E-04 + 37 2 1.054900E-01 1.854888E-03 1.956721E-04 + 37 3 5.680240E-01 1.717866E-02 9.757893E-03 + 37 4 7.838831E-01 3.616512E-02 2.834923E-02 + 37 5 6.924728E-01 1.385609E-02 9.594963E-03 + 37 6 3.282129E+00 1.452604E-03 4.767633E-03 + 37 7 1.651331E+00 6.907452E-03 1.140649E-02 + 37 8 1.691230E+00 9.115937E-04 1.541714E-03 + 37 9 1.496186E+00 8.692206E-03 1.300516E-02 + 37 10 2.761508E+00 8.665469E-05 2.392976E-04 + 37 11 1.545584E+00 7.047920E-03 1.089316E-02 + 37 12 1.575737E+00 8.320505E-05 1.311093E-04 + 37 13 1.395420E+00 6.731950E-03 9.393897E-03 + 37 14 1.816353E+00 1.048148E-04 1.903807E-04 + 37 15 1.315050E+00 6.144870E-03 8.080811E-03 + 37 16 1.536727E+00 2.409660E-04 3.702990E-04 + 37 17 1.217715E+00 5.751343E-03 7.003499E-03 + 37 18 1.313665E+00 4.524103E-04 5.943158E-04 + 37 19 1.113932E+00 5.295585E-03 5.898919E-03 + 37 20 1.106935E+00 7.448091E-04 8.244555E-04 + 37 21 9.914601E-01 4.880540E-03 4.838861E-03 + 37 22 9.638221E-01 1.049164E-03 1.011207E-03 + 37 23 8.723045E-01 4.513737E-03 3.937353E-03 + 37 24 8.490569E-01 1.306053E-03 1.108913E-03 + 37 25 7.693073E-01 4.275449E-03 3.289134E-03 + 37 26 7.359914E-01 1.436900E-03 1.057546E-03 + 37 27 6.775474E-01 4.220063E-03 2.859293E-03 + 37 28 6.245110E-01 1.378565E-03 8.609289E-04 + 37 29 5.892500E-01 4.404523E-03 2.595365E-03 + 37 30 5.330836E-01 1.083495E-03 5.775936E-04 + 37 31 5.140696E-01 4.841954E-03 2.489101E-03 + 37 32 4.472278E-01 5.752337E-04 2.572605E-04 + 37 33 4.507705E-01 5.429059E-03 2.447259E-03 + 37 34 2.900735E-01 7.441133E-05 2.158476E-05 + 37 35 3.917895E-01 5.757686E-03 2.255801E-03 + 37 36 4.644021E-01 2.101155E-04 9.757807E-05 + 37 37 3.416315E-01 4.964327E-03 1.695971E-03 + 37 38 3.565750E-01 1.927933E-03 6.874525E-04 + 37 39 2.949411E-01 2.372131E-03 6.996389E-04 + 37 40 3.103980E-01 4.937508E-03 1.532592E-03 + 37 41 4.070307E-02 1.559974E-05 6.349570E-07 + 37 42 2.735246E-01 5.111918E-03 1.398236E-03 + 37 43 2.903284E-01 2.751566E-03 7.988578E-04 + 37 44 2.131736E-01 5.247907E-04 1.118715E-04 + 37 45 2.553110E-01 5.174851E-03 1.321196E-03 + 37 46 2.706420E-01 2.961112E-03 8.014011E-04 + 38 0 1.554711E+00 9.320687E-06 1.449098E-05 + 38 1 1.188308E+02 1.209054E-06 1.436729E-04 + 38 2 3.137094E-02 1.028867E-03 3.227653E-05 + 38 3 5.107355E-01 1.250202E-02 6.385227E-03 + 38 4 7.606523E-01 3.200197E-02 2.434237E-02 + 38 5 7.372349E-01 1.713931E-02 1.263570E-02 + 38 6 8.502562E+00 2.203461E-04 1.873506E-03 + 38 7 1.719414E+00 6.946766E-03 1.194436E-02 + 38 8 1.950088E+00 7.382659E-05 1.439683E-04 + 38 9 1.512463E+00 8.159361E-03 1.234073E-02 + 38 10 8.824924E-01 1.728331E-04 1.525239E-04 + 38 11 1.571139E+00 6.212841E-03 9.761237E-03 + 38 12 1.426744E+00 1.808912E-04 2.580854E-04 + 38 13 1.411594E+00 5.942356E-03 8.388194E-03 + 38 14 1.083087E+00 1.772288E-04 1.919542E-04 + 38 15 1.338626E+00 5.533009E-03 7.406630E-03 + 38 16 9.043924E-01 8.135535E-05 7.357716E-05 + 38 17 1.240417E+00 5.417640E-03 6.720133E-03 + 38 18 6.122928E-01 1.898676E-05 1.162546E-05 + 38 19 1.133411E+00 5.274572E-03 5.978256E-03 + 38 20 3.865685E+00 5.067019E-07 1.958750E-06 + 38 21 1.007741E+00 5.168766E-03 5.208775E-03 + 38 22 1.142306E+00 2.440923E-05 2.788280E-05 + 38 23 8.877903E-01 5.060072E-03 4.492282E-03 + 38 24 9.548085E-01 6.142139E-05 5.864567E-05 + 38 25 7.827428E-01 4.995525E-03 3.910212E-03 + 38 26 7.928107E-01 7.417378E-05 5.880576E-05 + 38 27 6.870226E-01 4.989368E-03 3.427809E-03 + 38 28 6.102044E-01 4.324141E-05 2.638610E-05 + 38 29 5.954315E-01 5.040761E-03 3.001428E-03 + 38 30 1.362534E-01 6.938723E-07 9.454246E-08 + 38 31 5.174301E-01 5.061681E-03 2.619066E-03 + 38 32 5.607680E-01 9.113089E-05 5.110328E-05 + 38 33 4.512364E-01 4.820805E-03 2.175323E-03 + 38 34 4.677949E-01 6.352038E-04 2.971451E-04 + 38 35 3.889264E-01 3.910581E-03 1.520928E-03 + 38 36 3.965246E-01 2.046549E-03 8.115070E-04 + 38 37 3.322190E-01 2.051348E-03 6.814968E-04 + 38 38 3.441112E-01 4.180167E-03 1.438442E-03 + 38 39 2.281539E-01 1.593013E-04 3.634520E-05 + 38 40 3.040073E-01 5.037434E-03 1.531416E-03 + 38 41 3.314778E-01 1.096184E-03 3.633606E-04 + 38 42 2.609229E-01 2.068031E-03 5.395968E-04 + 38 43 2.789149E-01 4.697183E-03 1.310114E-03 + 38 44 3.423369E-01 2.955686E-04 1.011841E-04 + 38 45 2.435492E-01 2.325414E-03 5.663527E-04 + 38 46 2.594637E-01 4.555721E-03 1.182044E-03 + 39 0 1.083324E+00 8.051690E-06 8.722587E-06 + 39 1 1.809703E+01 7.196665E-06 1.302382E-04 + 39 2 4.071199E-05 5.490680E-04 2.235365E-08 + 39 3 4.541491E-01 8.902643E-03 4.043128E-03 + 39 4 7.358999E-01 2.715867E-02 1.998606E-02 + 39 5 7.605995E-01 1.883805E-02 1.432821E-02 + 39 6 1.353417E+01 3.039526E-05 4.113745E-04 + 39 7 1.797861E+00 6.147430E-03 1.105222E-02 + 39 8 1.354117E+00 7.791699E-05 1.055087E-04 + 39 9 1.524761E+00 6.793945E-03 1.035914E-02 + 39 10 1.245787E+00 9.192290E-04 1.145164E-03 + 39 11 1.600363E+00 4.732042E-03 7.572984E-03 + 39 12 1.475885E+00 9.186143E-04 1.355769E-03 + 39 13 1.424790E+00 4.457636E-03 6.351195E-03 + 39 14 1.264174E+00 9.564107E-04 1.209069E-03 + 39 15 1.361371E+00 4.134685E-03 5.628840E-03 + 39 16 1.175582E+00 7.648593E-04 8.991551E-04 + 39 17 1.262027E+00 4.142153E-03 5.227507E-03 + 39 18 1.085927E+00 5.895500E-04 6.402080E-04 + 39 19 1.152159E+00 4.153212E-03 4.785159E-03 + 39 20 1.017737E+00 4.199815E-04 4.274308E-04 + 39 21 1.022515E+00 4.204795E-03 4.299465E-03 + 39 22 9.091449E-01 3.059592E-04 2.781613E-04 + 39 23 9.012889E-01 4.223993E-03 3.807038E-03 + 39 24 7.911378E-01 2.465415E-04 1.950483E-04 + 39 25 7.948071E-01 4.217718E-03 3.352272E-03 + 39 26 7.115686E-01 2.528100E-04 1.798916E-04 + 39 27 6.962416E-01 4.155297E-03 2.893091E-03 + 39 28 6.553940E-01 3.495718E-04 2.291073E-04 + 39 29 6.014257E-01 3.989884E-03 2.399619E-03 + 39 30 5.781598E-01 6.125699E-04 3.541633E-04 + 39 31 5.206573E-01 3.605295E-03 1.877123E-03 + 39 32 5.067557E-01 1.183838E-03 5.999164E-04 + 39 33 4.511028E-01 2.830710E-03 1.276941E-03 + 39 34 4.466020E-01 2.224882E-03 9.936371E-04 + 39 35 3.812595E-01 1.570088E-03 5.986110E-04 + 39 36 3.883065E-01 3.640719E-03 1.413715E-03 + 39 37 2.884197E-01 2.521849E-04 7.273509E-05 + 39 38 3.395113E-01 4.493874E-03 1.525721E-03 + 39 39 3.879231E-01 3.488341E-04 1.353208E-04 + 39 40 2.975102E-01 3.049216E-03 9.071730E-04 + 39 41 3.109047E-01 2.967455E-03 9.225956E-04 + 39 42 2.042462E-01 1.941001E-04 3.964420E-05 + 39 43 2.722695E-01 4.101280E-03 1.116654E-03 + 39 44 2.893445E-01 1.959039E-03 5.668370E-04 + 39 45 2.018056E-01 2.866263E-04 5.784278E-05 + 39 46 2.518442E-01 3.542655E-03 8.921973E-04 + 40 0 7.651532E-01 6.581893E-06 5.036156E-06 + 40 1 8.617739E+00 1.272848E-05 1.096907E-04 + 40 2 5.599040E-02 2.818477E-04 1.578076E-05 + 40 3 4.000225E-01 6.220942E-03 2.488517E-03 + 40 4 7.111086E-01 2.219707E-02 1.578453E-02 + 40 5 7.719154E-01 1.889161E-02 1.458272E-02 + 40 6 4.400877E-03 4.710489E-04 2.073028E-06 + 40 7 1.890354E+00 4.922093E-03 9.304499E-03 + 40 8 1.544733E+00 4.592432E-04 7.094081E-04 + 40 9 1.534050E+00 5.147544E-03 7.896592E-03 + 40 10 1.341206E+00 1.742112E-03 2.336531E-03 + 40 11 1.635415E+00 3.192018E-03 5.220273E-03 + 40 12 1.496087E+00 1.686236E-03 2.522757E-03 + 40 13 1.435783E+00 2.921164E-03 4.194156E-03 + 40 14 1.312703E+00 1.770053E-03 2.323555E-03 + 40 15 1.385550E+00 2.646263E-03 3.666529E-03 + 40 16 1.231108E+00 1.567509E-03 1.929772E-03 + 40 17 1.284597E+00 2.674223E-03 3.435300E-03 + 40 18 1.140748E+00 1.392878E-03 1.588923E-03 + 40 19 1.171682E+00 2.717764E-03 3.184355E-03 + 40 20 1.056898E+00 1.203548E-03 1.272028E-03 + 40 21 1.036722E+00 2.797527E-03 2.900256E-03 + 40 22 9.439810E-01 1.075201E-03 1.014969E-03 + 40 23 9.138103E-01 2.833030E-03 2.588852E-03 + 40 24 8.297344E-01 1.017893E-03 8.445811E-04 + 40 25 8.062578E-01 2.808191E-03 2.264126E-03 + 40 26 7.364646E-01 1.068811E-03 7.871412E-04 + 40 27 7.051821E-01 2.674241E-03 1.885827E-03 + 40 28 6.575561E-01 1.265246E-03 8.319700E-04 + 40 29 6.065720E-01 2.380334E-03 1.443844E-03 + 40 30 5.756364E-01 1.669643E-03 9.611074E-04 + 40 31 5.224034E-01 1.855266E-03 9.691974E-04 + 40 32 5.036560E-01 2.335372E-03 1.176224E-03 + 40 33 4.471876E-01 1.077372E-03 4.817873E-04 + 40 34 4.430321E-01 3.200294E-03 1.417833E-03 + 40 35 3.481478E-01 2.509680E-04 8.737396E-05 + 40 36 3.855378E-01 3.829414E-03 1.476384E-03 + 40 37 4.934214E-01 8.431647E-05 4.160355E-05 + 40 38 3.356878E-01 3.264927E-03 1.095996E-03 + 40 39 3.491969E-01 1.528432E-03 5.337238E-04 + 40 40 2.848360E-01 1.093069E-03 3.113456E-04 + 40 41 3.041704E-01 3.640625E-03 1.107370E-03 + 40 42 3.867505E-01 1.608981E-04 6.222740E-05 + 40 43 2.645368E-01 2.287281E-03 6.050700E-04 + 40 44 2.790158E-01 3.096560E-03 8.639892E-04 + 40 45 3.779784E-01 1.053265E-04 3.981114E-05 + 40 46 2.417980E-01 1.656191E-03 4.004637E-04 + 41 0 5.459883E-01 5.138292E-06 2.805447E-06 + 41 1 5.621376E+00 1.549863E-05 8.712363E-05 + 41 2 2.762871E-01 1.392421E-04 3.847080E-05 + 41 3 3.502864E-01 4.266956E-03 1.494657E-03 + 41 4 6.876132E-01 1.747199E-02 1.201397E-02 + 41 5 7.763037E-01 1.749452E-02 1.358106E-02 + 41 6 1.435439E-01 1.091868E-03 1.567311E-04 + 41 7 1.998321E+00 3.629140E-03 7.252186E-03 + 41 8 1.601137E+00 8.546279E-04 1.368376E-03 + 41 9 1.540735E+00 3.611071E-03 5.563705E-03 + 41 10 1.385090E+00 2.273077E-03 3.148417E-03 + 41 11 1.678671E+00 1.938248E-03 3.253680E-03 + 41 12 1.510437E+00 2.133621E-03 3.222700E-03 + 41 13 1.444898E+00 1.701035E-03 2.457821E-03 + 41 14 1.337122E+00 2.233699E-03 2.986728E-03 + 41 15 1.413486E+00 1.475156E-03 2.085113E-03 + 41 16 1.258553E+00 2.051121E-03 2.581445E-03 + 41 17 1.310162E+00 1.487954E-03 1.949462E-03 + 41 18 1.166277E+00 1.919083E-03 2.238181E-03 + 41 19 1.193570E+00 1.515109E-03 1.808388E-03 + 41 20 1.075365E+00 1.766834E-03 1.899991E-03 + 41 21 1.051144E+00 1.568915E-03 1.649156E-03 + 41 22 9.594834E-01 1.673953E-03 1.606130E-03 + 41 23 9.260345E-01 1.580770E-03 1.463848E-03 + 41 24 8.450694E-01 1.646775E-03 1.391639E-03 + 41 25 8.177165E-01 1.530208E-03 1.251276E-03 + 41 26 7.477541E-01 1.724771E-03 1.289704E-03 + 41 27 7.140971E-01 1.375538E-03 9.822674E-04 + 41 28 6.624501E-01 1.932337E-03 1.280077E-03 + 41 29 6.103105E-01 1.089011E-03 6.646350E-04 + 41 30 5.779545E-01 2.291869E-03 1.324596E-03 + 41 31 5.205807E-01 6.642723E-04 3.458073E-04 + 41 32 5.044914E-01 2.765739E-03 1.395291E-03 + 41 33 4.276264E-01 1.973758E-04 8.440311E-05 + 41 34 4.424555E-01 3.158694E-03 1.397582E-03 + 41 35 7.334844E-01 1.151408E-05 8.445397E-06 + 41 36 3.837290E-01 2.996111E-03 1.149694E-03 + 41 37 4.020380E-01 6.764957E-04 2.719770E-04 + 41 38 3.302411E-01 1.761369E-03 5.816765E-04 + 41 39 3.407236E-01 2.320908E-03 7.907880E-04 + 41 40 2.392461E-01 1.490812E-04 3.566709E-05 + 41 41 2.999889E-01 3.070681E-03 9.211703E-04 + 41 42 3.224522E-01 8.917564E-04 2.875488E-04 + 41 43 2.505437E-01 8.160364E-04 2.044527E-04 + 41 44 2.736232E-01 2.999824E-03 8.208213E-04 + 41 45 2.974130E-01 7.876667E-04 2.342623E-04 + 41 46 2.194976E-01 4.117024E-04 9.036770E-05 + 42 0 3.959783E-01 3.826953E-06 1.515390E-06 + 42 1 4.255559E+00 1.538153E-05 6.545703E-05 + 42 2 7.771424E-01 6.635047E-05 5.156376E-05 + 42 3 3.069028E-01 2.858794E-03 8.773718E-04 + 42 4 6.666325E-01 1.316057E-02 8.773265E-03 + 42 5 7.768749E-01 1.496505E-02 1.162597E-02 + 42 6 2.961693E-01 1.542512E-03 4.568448E-04 + 42 7 2.119386E+00 2.489762E-03 5.276765E-03 + 42 8 1.634969E+00 1.065135E-03 1.741463E-03 + 42 9 1.545050E+00 2.371767E-03 3.664498E-03 + 42 10 1.409669E+00 2.378979E-03 3.353574E-03 + 42 11 1.732177E+00 1.073238E-03 1.859038E-03 + 42 12 1.521832E+00 2.168858E-03 3.300638E-03 + 42 13 1.452252E+00 8.917367E-04 1.295026E-03 + 42 14 1.352120E+00 2.255524E-03 3.049739E-03 + 42 15 1.447954E+00 7.238903E-04 1.048160E-03 + 42 16 1.275906E+00 2.099410E-03 2.678650E-03 + 42 17 1.341203E+00 7.221995E-04 9.686159E-04 + 42 18 1.182288E+00 2.009901E-03 2.376282E-03 + 42 19 1.219899E+00 7.295887E-04 8.900246E-04 + 42 20 1.087614E+00 1.902134E-03 2.068787E-03 + 42 21 1.066732E+00 7.538814E-04 8.041891E-04 + 42 22 9.697509E-01 1.845717E-03 1.789886E-03 + 42 23 9.387306E-01 7.465824E-04 7.008397E-04 + 42 24 8.549000E-01 1.838092E-03 1.571384E-03 + 42 25 8.300566E-01 6.926771E-04 5.749612E-04 + 42 26 7.555627E-01 1.908640E-03 1.442097E-03 + 42 27 7.236470E-01 5.675063E-04 4.106742E-04 + 42 28 6.670925E-01 2.062580E-03 1.375932E-03 + 42 29 6.116705E-01 3.687272E-04 2.255395E-04 + 42 30 5.807920E-01 2.288268E-03 1.329007E-03 + 42 31 5.076403E-01 1.335779E-04 6.780952E-05 + 42 32 5.059882E-01 2.501385E-03 1.265671E-03 + 42 33 2.577183E+02 6.625476E-10 1.707506E-07 + 42 34 4.425221E-01 2.489350E-03 1.101593E-03 + 42 35 4.673328E-01 2.532217E-04 1.183388E-04 + 42 36 3.816394E-01 1.917716E-03 7.318758E-04 + 42 37 3.890726E-01 1.176074E-03 4.575780E-04 + 42 38 3.206959E-01 7.230350E-04 2.318743E-04 + 42 39 3.370442E-01 2.350986E-03 7.923862E-04 + 42 40 6.594450E-01 1.043684E-05 6.882522E-06 + 42 41 2.962058E-01 2.044371E-03 6.055546E-04 + 42 42 3.102194E-01 1.409509E-03 4.372571E-04 + 42 43 2.117733E-01 1.440718E-04 3.051055E-05 + 42 44 2.694174E-01 2.204259E-03 5.938659E-04 + 42 45 2.842662E-01 1.307394E-03 3.716480E-04 + 42 46 8.963103E-02 1.534117E-05 1.375045E-06 + 43 0 2.963580E-01 2.678492E-06 7.937927E-07 + 43 1 3.527207E+00 1.303181E-05 4.596589E-05 + 43 2 1.679585E+00 3.057581E-05 5.135469E-05 + 43 3 2.716424E-01 1.840995E-03 5.000923E-04 + 43 4 6.492414E-01 9.313325E-03 6.046596E-03 + 43 5 7.756494E-01 1.165415E-02 9.039531E-03 + 43 6 3.899714E-01 1.633154E-03 6.368833E-04 + 43 7 2.244969E+00 1.589191E-03 3.567685E-03 + 43 8 1.658970E+00 1.034668E-03 1.716483E-03 + 43 9 1.547315E+00 1.460290E-03 2.259529E-03 + 43 10 1.424502E+00 2.091049E-03 2.978703E-03 + 43 11 1.795751E+00 5.478680E-04 9.838345E-04 + 43 12 1.530836E+00 1.857996E-03 2.844287E-03 + 43 13 1.457870E+00 4.261566E-04 6.212808E-04 + 43 14 1.361920E+00 1.917540E-03 2.611535E-03 + 43 15 1.491607E+00 3.161273E-04 4.715378E-04 + 43 16 1.287729E+00 1.791392E-03 2.306828E-03 + 43 17 1.380293E+00 3.093022E-04 4.269276E-04 + 43 18 1.193222E+00 1.732942E-03 2.067785E-03 + 43 19 1.253022E+00 3.071239E-04 3.848331E-04 + 43 20 1.096357E+00 1.660673E-03 1.820690E-03 + 43 21 1.084562E+00 3.144717E-04 3.410641E-04 + 43 22 9.770696E-01 1.627751E-03 1.590426E-03 + 43 23 9.528327E-01 3.021332E-04 2.878824E-04 + 43 24 8.618083E-01 1.625222E-03 1.400630E-03 + 43 25 8.445982E-01 2.621744E-04 2.214320E-04 + 43 26 7.612838E-01 1.670537E-03 1.271753E-03 + 43 27 7.352975E-01 1.847512E-04 1.358471E-04 + 43 28 6.709357E-01 1.756235E-03 1.178321E-03 + 43 29 6.079100E-01 8.187300E-05 4.977141E-05 + 43 30 5.832791E-01 1.855726E-03 1.082406E-03 + 43 31 3.795772E-01 3.507904E-06 1.331521E-06 + 43 32 5.073507E-01 1.882571E-03 9.551239E-04 + 43 33 5.312318E-01 7.159326E-05 3.803262E-05 + 43 34 4.425629E-01 1.673599E-03 7.406730E-04 + 43 35 4.480530E-01 4.723894E-04 2.116555E-04 + 43 36 3.788743E-01 1.059257E-03 4.013253E-04 + 43 37 3.845362E-01 1.262783E-03 4.855858E-04 + 43 38 3.026113E-01 2.221349E-04 6.722052E-05 + 43 39 3.348847E-01 1.872441E-03 6.270519E-04 + 43 40 3.842179E-01 1.465196E-04 5.629547E-05 + 43 41 2.921980E-01 1.152122E-03 3.366476E-04 + 43 42 3.051620E-01 1.427639E-03 4.356611E-04 + 43 43 3.213485E-01 4.864226E-07 1.563111E-07 + 43 44 2.655035E-01 1.346640E-03 3.575376E-04 + 43 45 2.787788E-01 1.342074E-03 3.741418E-04 + 43 46 3.919003E-01 4.001613E-05 1.568233E-05 + 44 0 2.342113E-01 1.685661E-06 3.948008E-07 + 44 1 3.120773E+00 9.273852E-06 2.894158E-05 + 44 2 2.967269E+00 1.349894E-05 4.005498E-05 + 44 3 2.458240E-01 1.090853E-03 2.681579E-04 + 44 4 6.362916E-01 5.913373E-03 3.762629E-03 + 44 5 7.739629E-01 7.909406E-03 6.121587E-03 + 44 6 4.446544E-01 1.338101E-03 5.949924E-04 + 44 7 2.358912E+00 9.192490E-04 2.168427E-03 + 44 8 1.675808E+00 7.993071E-04 1.339486E-03 + 44 9 1.548084E+00 8.221421E-04 1.272745E-03 + 44 10 1.433413E+00 1.522896E-03 2.182939E-03 + 44 11 1.863164E+00 2.574828E-04 4.797326E-04 + 44 12 1.537432E+00 1.326206E-03 2.038951E-03 + 44 13 1.461766E+00 1.867106E-04 2.729273E-04 + 44 14 1.368182E+00 1.359550E-03 1.860111E-03 + 44 15 1.543820E+00 1.243662E-04 1.919990E-04 + 44 16 1.295601E+00 1.269592E-03 1.644884E-03 + 44 17 1.427403E+00 1.185340E-04 1.691957E-04 + 44 18 1.200528E+00 1.233494E-03 1.480843E-03 + 44 19 1.293383E+00 1.147776E-04 1.484513E-04 + 44 20 1.102375E+00 1.188382E-03 1.310042E-03 + 44 21 1.104900E+00 1.158015E-04 1.279491E-04 + 44 22 9.820859E-01 1.169278E-03 1.148331E-03 + 44 23 9.688266E-01 1.065796E-04 1.032572E-04 + 44 24 8.665069E-01 1.166236E-03 1.010552E-03 + 44 25 8.626543E-01 8.403719E-05 7.249504E-05 + 44 26 7.652681E-01 1.187867E-03 9.090369E-04 + 44 27 7.518539E-01 4.647681E-05 3.494377E-05 + 44 28 6.737693E-01 1.223477E-03 8.243414E-04 + 44 29 5.856208E-01 8.180344E-06 4.790580E-06 + 44 30 5.851324E-01 1.248040E-03 7.302687E-04 + 44 31 6.335928E-01 1.018548E-05 6.453448E-06 + 44 32 5.083380E-01 1.198008E-03 6.089929E-04 + 44 33 5.089673E-01 1.344148E-04 6.841274E-05 + 44 34 4.424354E-01 9.744405E-04 4.311270E-04 + 44 35 4.421881E-01 4.774168E-04 2.111081E-04 + 44 36 3.756505E-01 5.174606E-04 1.943843E-04 + 44 37 3.825209E-01 9.953034E-04 3.807244E-04 + 44 38 2.671684E-01 4.888876E-05 1.306153E-05 + 44 39 3.334432E-01 1.225180E-03 4.085279E-04 + 44 40 3.600881E-01 2.227929E-04 8.022509E-05 + 44 41 2.881078E-01 5.680095E-04 1.636480E-04 + 44 42 3.025487E-01 1.080118E-03 3.267883E-04 + 44 43 4.320039E-01 2.518243E-05 1.087891E-05 + 44 44 2.618921E-01 7.102401E-04 1.860062E-04 + 44 45 2.758638E-01 1.017743E-03 2.807585E-04 + 44 46 3.210479E-01 1.113010E-04 3.573296E-05 + 45 0 2.002915E-01 8.362737E-07 1.674985E-07 + 45 1 2.909679E+00 4.932308E-06 1.435143E-05 + 45 2 4.266968E+00 5.239109E-06 2.235511E-05 + 45 3 2.300449E-01 5.216528E-04 1.200036E-04 + 45 4 6.282741E-01 2.950458E-03 1.853697E-03 + 45 5 7.726419E-01 4.105444E-03 3.172038E-03 + 45 6 4.734392E-01 7.704338E-04 3.647536E-04 + 45 7 2.440743E+00 4.296496E-04 1.048664E-03 + 45 8 1.686021E+00 4.443925E-04 7.492550E-04 + 45 9 1.548091E+00 3.778106E-04 5.848850E-04 + 45 10 1.438235E+00 8.201975E-04 1.179637E-03 + 45 11 1.919051E+00 1.031709E-04 1.979904E-04 + 45 12 1.541504E+00 7.051038E-04 1.086920E-03 + 45 13 1.464034E+00 7.057344E-05 1.033219E-04 + 45 14 1.371717E+00 7.195474E-04 9.870152E-04 + 45 15 1.593760E+00 4.257145E-05 6.784866E-05 + 45 16 1.300188E+00 6.710250E-04 8.724585E-04 + 45 17 1.473251E+00 3.953002E-05 5.823765E-05 + 45 18 1.204794E+00 6.529420E-04 7.866605E-04 + 45 19 1.333448E+00 3.728385E-05 4.971608E-05 + 45 20 1.105952E+00 6.303077E-04 6.970900E-04 + 45 21 1.124417E+00 3.701627E-05 4.162172E-05 + 45 22 9.850554E-01 6.208778E-04 6.115990E-04 + 45 23 9.844772E-01 3.253311E-05 3.202810E-05 + 45 24 8.692766E-01 6.182225E-04 5.374063E-04 + 45 25 8.824546E-01 2.301044E-05 2.030567E-05 + 45 26 7.676479E-01 6.257372E-04 4.803459E-04 + 45 27 7.755009E-01 9.138287E-06 7.086749E-06 + 45 28 6.755103E-01 6.362002E-04 4.297598E-04 + 45 29 6.194594E-02 9.735769E-09 6.030914E-10 + 45 30 5.862665E-01 6.348883E-04 3.722138E-04 + 45 31 5.925949E-01 1.839029E-05 1.089799E-05 + 45 32 5.089148E-01 5.884612E-04 2.994766E-04 + 45 33 5.033205E-01 1.049137E-04 5.280523E-05 + 45 34 4.422378E-01 4.512515E-04 1.995605E-04 + 45 35 4.399708E-01 2.983330E-04 1.312578E-04 + 45 36 3.728302E-01 2.106797E-04 7.854777E-05 + 45 37 3.815928E-01 5.510033E-04 2.102589E-04 + 45 38 2.046203E-01 7.553867E-06 1.545674E-06 + 45 39 3.325491E-01 6.093043E-04 2.026236E-04 + 45 40 3.526165E-01 1.622128E-04 5.719893E-05 + 45 41 2.847666E-01 2.320440E-04 6.607837E-05 + 45 42 3.011979E-01 5.829038E-04 1.755694E-04 + 45 43 3.693888E-01 3.527160E-05 1.302894E-05 + 45 44 2.591451E-01 3.046128E-04 7.893892E-05 + 45 45 2.743219E-01 5.487583E-04 1.505364E-04 + 45 46 3.063065E-01 9.525662E-05 2.917772E-05 + 46 0 1.876307E-01 1.634504E-07 3.066831E-08 + 46 1 2.832336E+00 9.899852E-07 2.803971E-06 + 46 2 4.955405E+00 9.217152E-07 4.567472E-06 + 46 3 2.237820E-01 1.004764E-04 2.248481E-05 + 46 4 6.250679E-01 5.779923E-04 3.612844E-04 + 46 5 7.720605E-01 8.167861E-04 6.306083E-04 + 46 6 4.840230E-01 1.593942E-04 7.715043E-05 + 46 7 2.476338E+00 8.185418E-05 2.026986E-04 + 46 8 1.690081E+00 9.068372E-05 1.532628E-04 + 46 9 1.547980E+00 7.148872E-05 1.106631E-04 + 46 10 1.440038E+00 1.653945E-04 2.381743E-04 + 46 11 1.945725E+00 1.835231E-05 3.570855E-05 + 46 12 1.543135E+00 1.414394E-04 2.182600E-04 + 46 13 1.464907E+00 1.220783E-05 1.788333E-05 + 46 14 1.373066E+00 1.440626E-04 1.978075E-04 + 46 15 1.620328E+00 6.999252E-06 1.134109E-05 + 46 16 1.301972E+00 1.342461E-04 1.747847E-04 + 46 17 1.498026E+00 6.408594E-06 9.600237E-06 + 46 18 1.206456E+00 1.306796E-04 1.576592E-04 + 46 19 1.355497E+00 5.956919E-06 8.074587E-06 + 46 20 1.107357E+00 1.262180E-04 1.397684E-04 + 46 21 1.135035E+00 5.860563E-06 6.651944E-06 + 46 22 9.862175E-01 1.243573E-04 1.226433E-04 + 46 23 9.932076E-01 5.016570E-06 4.982495E-06 + 46 24 8.703591E-01 1.237173E-04 1.076785E-04 + 46 25 8.946148E-01 3.322235E-06 2.972121E-06 + 46 26 7.685855E-01 1.248887E-04 9.598762E-05 + 46 27 7.948484E-01 1.036670E-06 8.239956E-07 + 46 28 6.762034E-01 1.263100E-04 8.541122E-05 + 46 29 7.623335E-01 8.830407E-08 6.731714E-08 + 46 30 5.867154E-01 1.249365E-04 7.330217E-05 + 46 31 5.858014E-01 5.087641E-06 2.980347E-06 + 46 32 5.091347E-01 1.141566E-04 5.812109E-05 + 46 33 5.017767E-01 2.390623E-05 1.199559E-05 + 46 34 4.421262E-01 8.540440E-05 3.775952E-05 + 46 35 4.392742E-01 6.329682E-05 2.780466E-05 + 46 36 3.714531E-01 3.765136E-05 1.398571E-05 + 46 37 3.812698E-01 1.119072E-04 4.266683E-05 + 46 38 1.469914E-01 6.816319E-07 1.001940E-07 + 46 39 3.321828E-01 1.186764E-04 3.942226E-05 + 46 40 3.503762E-01 3.615400E-05 1.266750E-05 + 46 41 2.831833E-01 4.150478E-05 1.175346E-05 + 46 42 3.006965E-01 1.171683E-04 3.523210E-05 + 46 43 3.572196E-01 9.279030E-06 3.314651E-06 + 46 44 2.578940E-01 5.568025E-05 1.435960E-05 + 46 45 2.737427E-01 1.102187E-04 3.017157E-05 + 46 46 3.022939E-01 2.224669E-05 6.725040E-06 +[transition-N2bh] +1175 0 0 0 5 +c data calculated with LEVEL_8.0 +c using Potentialenergyfunctions retrieved via RKR1 2.0 +c with Spectroscopic constants from +c Spelsberg & Meyer j.chem.phys.,vol.115,no.14,(2001) +c documented in ESA report Aerothermochemistry +c +c vu vl sumre2/fcf FCF SRe2 + 0 0 3.798247E-01 4.919739E-03 1.868638E-03 + 0 1 3.575159E-01 2.147492E-02 7.677626E-03 + 0 2 3.329428E-01 4.858369E-02 1.617559E-02 + 0 3 3.081848E-01 8.004525E-02 2.466873E-02 + 0 4 2.842363E-01 1.087663E-01 3.091533E-02 + 0 5 2.609191E-01 1.274059E-01 3.324262E-02 + 0 6 2.384704E-01 1.321309E-01 3.150931E-02 + 0 7 2.175640E-01 1.239857E-01 2.697484E-02 + 0 8 1.983617E-01 1.063891E-01 2.110352E-02 + 0 9 1.808612E-01 8.400080E-02 1.519249E-02 + 0 10 1.652855E-01 6.148301E-02 1.016225E-02 + 0 11 1.514925E-01 4.184671E-02 6.339464E-03 + 0 12 1.392352E-01 2.650371E-02 3.690249E-03 + 0 13 1.287051E-01 1.567170E-02 2.017028E-03 + 0 14 1.197891E-01 8.648531E-03 1.035999E-03 + 0 15 1.121612E-01 4.444256E-03 4.984731E-04 + 0 16 1.059328E-01 2.131413E-03 2.257866E-04 + 0 17 1.006710E-01 9.501597E-04 9.565349E-05 + 0 18 9.627129E-02 3.918258E-04 3.772157E-05 + 0 19 9.360370E-02 1.501245E-04 1.405221E-05 + 0 20 9.105946E-02 5.270586E-05 4.799367E-06 + 0 21 8.858312E-02 1.689062E-05 1.496224E-06 + 0 22 8.934388E-02 5.005601E-06 4.472198E-07 + 0 23 8.825025E-02 1.295932E-06 1.143663E-07 + 0 24 8.805058E-02 3.074037E-07 2.706708E-08 + 0 25 9.128722E-02 6.654852E-08 6.075030E-09 + 0 26 8.508023E-02 9.976014E-09 8.487616E-10 + 0 27 1.234296E-01 2.156674E-09 2.661973E-10 + 0 28 3.225957E-02 1.779556E-10 5.740770E-12 + 0 29 1.248098E-01 3.841600E-12 4.794694E-13 + 0 30 4.275837E-01 3.329290E-11 1.423550E-11 + 0 31 8.384180E-01 1.989160E-11 1.667748E-11 + 0 32 8.172131E-01 9.548100E-12 7.802833E-12 + 0 33 2.447958E-01 4.356000E-13 1.066330E-13 + 0 34 1.241691E+00 2.592100E-12 3.218587E-12 + 0 35 8.007763E-01 9.363600E-12 7.498149E-12 + 0 36 5.194354E-01 1.190250E-11 6.182580E-12 + 0 37 2.876950E-01 8.352100E-12 2.402858E-12 + 0 38 8.842303E-02 2.958400E-12 2.615907E-13 + 0 39 6.941331E-01 1.156000E-13 8.024179E-14 + 0 40 6.747766E-01 8.281000E-13 5.587825E-13 + 0 41 2.821000E-01 3.240000E-12 9.140041E-13 + 0 42 2.051021E-01 5.062500E-12 1.038329E-12 + 0 43 1.949534E-01 5.244100E-12 1.022355E-12 + 0 44 2.280989E-01 4.040100E-12 9.215422E-13 + 0 45 3.171327E-01 2.340900E-12 7.423758E-13 + 0 46 5.280081E-01 9.604000E-13 5.070990E-13 + 1 0 3.867665E-01 2.032593E-02 7.861391E-03 + 1 1 3.654173E-01 6.737353E-02 2.461945E-02 + 1 2 3.410367E-01 1.049529E-01 3.579281E-02 + 1 3 3.160744E-01 1.070258E-01 3.382810E-02 + 1 4 2.922925E-01 7.767771E-02 2.270461E-02 + 1 5 2.689319E-01 3.578157E-02 9.622805E-03 + 1 6 2.443581E-01 5.669950E-03 1.385498E-03 + 1 7 2.286433E-01 1.777804E-03 4.064829E-04 + 1 8 2.060234E-01 2.181565E-02 4.494536E-03 + 1 9 1.878993E-01 5.317703E-02 9.991926E-03 + 1 10 1.713859E-01 8.068895E-02 1.382895E-02 + 1 11 1.567575E-01 9.467963E-02 1.484174E-02 + 1 12 1.441174E-01 9.323459E-02 1.343672E-02 + 1 13 1.329517E-01 7.977465E-02 1.060617E-02 + 1 14 1.233296E-01 6.066290E-02 7.481529E-03 + 1 15 1.153177E-01 4.157652E-02 4.794510E-03 + 1 16 1.084443E-01 2.578989E-02 2.796766E-03 + 1 17 1.028118E-01 1.457056E-02 1.498025E-03 + 1 18 9.838363E-02 7.520074E-03 7.398522E-04 + 1 19 9.458375E-02 3.528832E-03 3.337701E-04 + 1 20 9.201437E-02 1.511987E-03 1.391246E-04 + 1 21 9.030082E-02 5.886995E-04 5.316004E-05 + 1 22 8.848616E-02 2.056121E-04 1.819382E-05 + 1 23 8.889254E-02 6.532034E-05 5.806491E-06 + 1 24 8.877839E-02 1.826015E-05 1.621107E-06 + 1 25 8.807625E-02 4.445182E-06 3.915149E-07 + 1 26 9.476107E-02 1.000120E-06 9.477245E-08 + 1 27 8.659189E-02 1.634423E-07 1.415278E-08 + 1 28 1.026906E-01 2.730426E-08 2.803891E-09 + 1 29 1.158312E-01 3.810593E-09 4.413855E-10 + 1 30 3.247807E-01 1.664640E-11 5.406430E-12 + 1 31 3.562157E-01 2.709316E-10 9.651008E-11 + 1 32 5.706384E-01 6.209440E-11 3.543345E-11 + 1 33 7.926299E-01 4.536900E-12 3.596083E-12 + 1 34 3.982445E-01 1.592010E-11 6.340092E-12 + 1 35 4.742055E-01 6.416010E-11 3.042507E-11 + 1 36 4.851056E-01 8.519290E-11 4.132755E-11 + 1 37 4.736918E-01 6.177960E-11 2.926449E-11 + 1 38 4.407813E-01 2.304000E-11 1.015560E-11 + 1 39 2.912340E-01 1.276900E-12 3.718767E-13 + 1 40 5.435210E-01 4.928400E-12 2.678689E-12 + 1 41 4.630564E-01 2.171560E-11 1.005555E-11 + 1 42 4.299650E-01 3.528360E-11 1.517071E-11 + 1 43 4.110065E-01 3.721000E-11 1.529355E-11 + 1 44 3.969872E-01 2.937640E-11 1.166205E-11 + 1 45 3.903810E-01 1.764000E-11 6.886321E-12 + 1 46 3.944566E-01 7.562500E-12 2.983078E-12 + 2 0 3.936894E-01 4.397705E-02 1.731330E-02 + 2 1 3.736460E-01 1.058417E-01 3.954731E-02 + 2 2 3.496900E-01 9.883387E-02 3.456121E-02 + 2 3 3.243912E-01 4.195246E-02 1.360901E-02 + 2 4 3.050074E-01 2.931567E-03 8.941496E-04 + 2 5 2.729891E-01 9.101065E-03 2.484491E-03 + 2 6 2.533190E-01 4.322370E-02 1.094939E-02 + 2 7 2.314174E-01 6.632123E-02 1.534789E-02 + 2 8 2.105422E-01 5.839198E-02 1.229397E-02 + 2 9 1.917207E-01 2.973694E-02 5.701188E-03 + 2 10 1.711699E-01 4.648957E-03 7.957616E-04 + 2 11 1.710087E-01 2.236882E-03 3.825264E-04 + 2 12 1.506645E-01 2.322897E-02 3.499780E-03 + 2 13 1.382640E-01 5.445334E-02 7.528937E-03 + 2 14 1.278572E-01 7.959507E-02 1.017680E-02 + 2 15 1.188375E-01 8.876554E-02 1.054867E-02 + 2 16 1.115338E-01 8.198707E-02 9.144332E-03 + 2 17 1.054138E-01 6.489608E-02 6.840945E-03 + 2 18 1.002897E-01 4.490294E-02 4.503301E-03 + 2 19 9.642985E-02 2.757355E-02 2.658914E-03 + 2 20 9.325878E-02 1.504936E-02 1.403485E-03 + 2 21 9.093740E-02 7.330284E-03 6.665970E-04 + 2 22 8.974767E-02 3.197288E-03 2.869492E-04 + 2 23 8.851931E-02 1.232272E-03 1.090799E-04 + 2 24 8.867584E-02 4.222778E-04 3.744584E-05 + 2 25 8.976126E-02 1.272066E-04 1.141822E-05 + 2 26 8.895548E-02 3.245330E-05 2.886899E-06 + 2 27 9.444616E-02 7.407814E-06 6.996396E-07 + 2 28 9.369006E-02 1.312972E-06 1.230124E-07 + 2 29 9.291841E-02 1.858903E-07 1.727263E-08 + 2 30 1.321795E-01 2.919314E-08 3.858734E-09 + 2 31 1.455534E-02 2.637376E-10 3.838789E-12 + 2 32 3.081091E-01 6.456681E-10 1.989362E-10 + 2 33 8.081615E-01 1.489960E-11 1.204128E-11 + 2 34 2.788563E-01 5.083690E-11 1.417619E-11 + 2 35 3.865600E-01 2.289169E-10 8.849011E-11 + 2 36 4.406154E-01 3.136441E-10 1.381964E-10 + 2 37 4.836648E-01 2.374681E-10 1.148550E-10 + 2 38 5.336894E-01 9.428410E-11 5.031843E-11 + 2 39 7.228775E-01 7.128900E-12 5.153321E-12 + 2 40 3.809676E-01 1.482250E-11 5.646892E-12 + 2 41 4.588335E-01 7.499560E-11 3.441049E-11 + 2 42 4.747584E-01 1.267876E-10 6.019348E-11 + 2 43 4.751908E-01 1.378276E-10 6.549440E-11 + 2 44 4.672568E-01 1.113025E-10 5.200685E-11 + 2 45 4.535147E-01 6.872410E-11 3.116739E-11 + 2 46 4.321330E-01 3.091360E-11 1.335879E-11 + 3 0 4.005379E-01 6.714951E-02 2.689593E-02 + 3 1 3.823070E-01 1.106078E-01 4.228613E-02 + 3 2 3.595828E-01 4.611071E-02 1.658062E-02 + 3 3 3.381899E-01 1.431677E-04 4.841787E-05 + 3 4 3.056803E-01 2.480094E-02 7.581158E-03 + 3 5 2.825683E-01 5.861071E-02 1.656153E-02 + 3 6 2.612450E-01 5.197878E-02 1.357920E-02 + 3 7 2.379321E-01 1.656798E-02 3.942053E-03 + 3 8 2.564433E-01 1.002263E-04 2.570237E-05 + 3 9 2.006211E-01 1.909478E-02 3.830815E-03 + 3 10 1.827211E-01 4.899310E-02 8.952075E-03 + 3 11 1.667662E-01 5.726252E-02 9.549455E-03 + 3 12 1.514283E-01 3.683753E-02 5.578246E-03 + 3 13 1.370141E-01 9.583537E-03 1.313079E-03 + 3 14 1.548612E-01 3.440009E-04 5.327238E-05 + 3 15 1.253993E-01 1.747593E-02 2.191469E-03 + 3 16 1.156278E-01 4.919532E-02 5.688344E-03 + 3 17 1.085248E-01 7.667871E-02 8.321541E-03 + 3 18 1.030022E-01 8.726847E-02 8.988842E-03 + 3 19 9.831925E-02 7.945002E-02 7.811467E-03 + 3 20 9.486434E-02 6.075318E-02 5.763311E-03 + 3 21 9.226351E-02 3.981497E-02 3.673469E-03 + 3 22 9.023530E-02 2.257202E-02 2.036793E-03 + 3 23 8.936919E-02 1.119462E-02 1.000454E-03 + 3 24 8.878308E-02 4.822490E-03 4.281555E-04 + 3 25 8.882942E-02 1.801819E-03 1.600545E-04 + 3 26 9.046790E-02 5.846095E-04 5.288840E-05 + 3 27 9.061807E-02 1.581817E-04 1.433412E-05 + 3 28 9.422739E-02 3.655194E-05 3.444194E-06 + 3 29 9.821475E-02 6.811369E-06 6.689769E-07 + 3 30 9.269374E-02 8.926848E-07 8.274630E-08 + 3 31 1.314104E-01 1.263518E-07 1.660394E-08 + 3 32 2.906048E-02 2.706080E-09 7.863998E-11 + 3 33 2.471718E-01 5.230369E-10 1.292800E-10 + 3 34 3.200277E-01 1.252161E-10 4.007262E-11 + 3 35 3.881983E-01 5.631129E-10 2.185995E-10 + 3 36 4.144560E-01 8.288641E-10 3.435277E-10 + 3 37 4.516095E-01 6.340324E-10 2.863350E-10 + 3 38 5.003481E-01 2.650384E-10 1.326115E-10 + 3 39 6.703685E-01 2.683240E-11 1.798760E-11 + 3 40 3.033833E-01 2.916000E-11 8.846657E-12 + 3 41 4.132024E-01 1.798281E-10 7.430540E-11 + 3 42 4.450120E-01 3.193369E-10 1.421088E-10 + 3 43 4.612117E-01 3.564544E-10 1.644009E-10 + 3 44 4.702555E-01 2.944656E-10 1.384741E-10 + 3 45 4.741353E-01 1.874161E-10 8.886060E-11 + 3 46 4.751898E-01 8.836000E-11 4.198777E-11 + 4 0 4.072459E-01 8.234228E-02 3.353356E-02 + 4 1 3.916245E-01 8.554086E-02 3.349989E-02 + 4 2 3.764381E-01 5.807187E-03 2.186046E-03 + 4 3 3.411208E-01 2.385368E-02 8.136985E-03 + 4 4 3.152684E-01 6.065124E-02 1.912142E-02 + 4 5 2.910613E-01 3.762935E-02 1.095245E-02 + 4 6 2.750274E-01 2.797731E-03 7.694525E-04 + 4 7 2.464506E-01 1.144769E-02 2.821289E-03 + 4 8 2.264200E-01 4.421003E-02 1.001003E-02 + 4 9 2.048463E-01 4.737089E-02 9.703750E-03 + 4 10 1.857337E-01 1.937579E-02 3.598737E-03 + 4 11 1.365240E-01 9.502350E-05 1.297299E-05 + 4 12 1.622564E-01 1.498947E-02 2.432138E-03 + 4 13 1.466151E-01 4.436085E-02 6.503969E-03 + 4 14 1.342723E-01 5.345852E-02 7.177998E-03 + 4 15 1.240401E-01 3.354371E-02 4.160764E-03 + 4 16 1.117472E-01 6.839889E-03 7.643383E-04 + 4 17 1.226397E-01 1.608616E-03 1.972802E-04 + 4 18 1.069810E-01 2.426544E-02 2.595942E-03 + 4 19 1.013643E-01 5.891915E-02 5.972301E-03 + 4 20 9.693090E-02 8.332469E-02 8.076738E-03 + 4 21 9.369066E-02 8.651177E-02 8.105346E-03 + 4 22 9.155491E-02 7.167774E-02 6.562449E-03 + 4 23 8.987288E-02 4.894795E-02 4.399093E-03 + 4 24 8.919644E-02 2.821260E-02 2.516463E-03 + 4 25 8.915788E-02 1.379011E-02 1.229497E-03 + 4 26 8.935408E-02 5.691661E-03 5.085731E-04 + 4 27 9.113020E-02 1.995515E-03 1.818517E-04 + 4 28 9.236949E-02 5.756084E-04 5.316865E-05 + 4 29 9.485279E-02 1.355343E-04 1.285581E-05 + 4 30 1.010132E-01 2.575664E-05 2.601760E-06 + 4 31 9.652257E-02 3.272590E-06 3.158787E-07 + 4 32 1.261125E-01 3.761982E-07 4.744329E-08 + 4 33 9.430471E-02 1.344904E-08 1.268308E-09 + 4 34 9.672434E-02 2.143690E-11 2.073470E-12 + 4 35 4.095545E-01 1.142440E-09 4.678914E-10 + 4 36 4.297072E-01 1.601600E-09 6.882192E-10 + 4 37 4.245515E-01 1.396517E-09 5.928933E-10 + 4 38 4.480359E-01 6.155361E-10 2.757822E-10 + 4 39 5.625522E-01 7.123360E-11 4.007262E-11 + 4 40 2.875994E-01 4.515840E-11 1.298753E-11 + 4 41 3.918639E-01 3.319684E-10 1.300864E-10 + 4 42 4.186978E-01 6.260004E-10 2.621050E-10 + 4 43 4.344338E-01 7.295401E-10 3.169369E-10 + 4 44 4.488562E-01 6.220036E-10 2.791902E-10 + 4 45 4.642882E-01 4.072324E-10 1.890732E-10 + 4 46 4.852284E-01 1.993744E-10 9.674212E-11 + 5 0 4.137389E-01 8.740915E-02 3.616456E-02 + 5 1 4.021395E-01 5.071249E-02 2.039349E-02 + 5 2 3.548074E-01 3.077817E-03 1.092032E-03 + 5 3 3.507621E-01 5.960230E-02 2.090623E-02 + 5 4 3.247316E-01 4.252606E-02 1.380956E-02 + 5 5 2.992132E-01 1.279127E-03 3.827315E-04 + 5 6 2.728808E-01 1.810171E-02 4.939610E-03 + 5 7 2.539041E-01 4.782245E-02 1.214232E-02 + 5 8 2.333694E-01 3.144338E-02 7.337924E-03 + 5 9 2.013886E-01 1.764130E-03 3.552757E-04 + 5 10 1.979893E-01 1.147496E-02 2.271919E-03 + 5 11 1.782586E-01 4.068623E-02 7.252672E-03 + 5 12 1.631171E-01 4.206906E-02 6.862182E-03 + 5 13 1.464013E-01 1.403479E-02 2.054712E-03 + 5 14 1.793681E-01 2.628928E-04 4.715460E-05 + 5 15 1.313749E-01 2.068646E-02 2.717681E-03 + 5 16 1.213437E-01 4.841878E-02 5.875314E-03 + 5 17 1.126935E-01 4.825474E-02 5.437998E-03 + 5 18 1.043946E-01 2.158246E-02 2.253091E-03 + 5 19 8.890000E-02 8.081091E-04 7.184090E-05 + 5 20 1.020960E-01 1.043107E-02 1.064970E-03 + 5 21 9.640117E-02 4.481965E-02 4.320667E-03 + 5 22 9.297758E-02 7.805797E-02 7.257641E-03 + 5 23 9.112175E-02 9.007919E-02 8.208173E-03 + 5 24 8.979535E-02 7.820299E-02 7.022265E-03 + 5 25 8.925838E-02 5.409388E-02 4.828332E-03 + 5 26 8.962295E-02 3.059082E-02 2.741640E-03 + 5 27 9.013074E-02 1.415573E-02 1.275866E-03 + 5 28 9.191113E-02 5.399429E-03 4.962677E-04 + 5 29 9.405369E-02 1.663627E-03 1.564703E-04 + 5 30 9.619074E-02 4.019572E-04 3.866456E-05 + 5 31 1.029254E-01 7.619841E-05 7.842755E-06 + 5 32 1.020978E-01 9.471499E-06 9.670188E-07 + 5 33 1.204583E-01 8.533325E-07 1.027910E-07 + 5 34 1.455304E-01 3.865942E-08 5.626123E-09 + 5 35 7.762793E-01 5.067001E-10 3.933408E-10 + 5 36 4.107074E-01 3.193380E-09 1.311545E-09 + 5 37 4.546124E-01 2.227840E-09 1.012804E-09 + 5 38 4.405981E-01 1.145823E-09 5.048472E-10 + 5 39 4.368574E-01 2.039184E-10 8.908326E-11 + 5 40 3.301827E-01 4.678560E-11 1.544780E-11 + 5 41 3.838965E-01 5.466244E-10 2.098472E-10 + 5 42 4.047837E-01 1.069290E-09 4.328311E-10 + 5 43 4.222684E-01 1.251037E-09 5.282734E-10 + 5 44 4.360787E-01 1.090981E-09 4.757536E-10 + 5 45 4.494586E-01 7.452900E-10 3.349770E-10 + 5 46 4.680117E-01 3.888784E-10 1.819997E-10 + 6 0 4.199397E-01 8.437654E-02 3.543306E-02 + 6 1 4.154315E-01 2.228658E-02 9.258549E-03 + 6 2 3.746178E-01 2.383386E-02 8.928590E-03 + 6 3 3.610893E-01 6.423683E-02 2.319523E-02 + 6 4 3.358233E-01 8.070970E-03 2.710420E-03 + 6 5 3.093145E-01 1.490397E-02 4.610015E-03 + 6 6 2.825872E-01 4.598972E-02 1.299611E-02 + 6 7 2.624324E-01 2.477451E-02 6.501632E-03 + 6 8 1.460348E+00 5.917543E-08 8.641670E-08 + 6 9 2.229270E-01 2.356689E-02 5.253696E-03 + 6 10 2.012596E-01 4.303298E-02 8.660799E-03 + 6 11 1.806979E-01 2.027867E-02 3.664313E-03 + 6 12 7.150346E-02 1.038219E-05 7.423623E-07 + 6 13 1.586562E-01 1.900272E-02 3.014900E-03 + 6 14 1.441402E-01 4.345734E-02 6.263950E-03 + 6 15 1.306027E-01 3.155249E-02 4.120841E-03 + 6 16 1.166647E-01 4.357747E-03 5.083952E-04 + 6 17 1.227106E-01 5.861435E-03 7.192601E-04 + 6 18 1.115883E-01 3.586936E-02 4.002601E-03 + 6 19 1.039469E-01 5.194454E-02 5.399473E-03 + 6 20 9.845231E-02 3.322202E-02 3.270785E-03 + 6 21 9.118197E-02 4.993538E-03 4.553206E-04 + 6 22 1.001138E-01 4.730087E-03 4.735471E-04 + 6 23 9.302504E-02 3.765618E-02 3.502967E-03 + 6 24 9.101522E-02 7.668150E-02 6.979184E-03 + 6 25 8.997688E-02 9.325221E-02 8.390543E-03 + 6 26 8.955299E-02 8.131451E-02 7.281957E-03 + 6 27 9.018829E-02 5.464339E-02 4.928194E-03 + 6 28 9.107797E-02 2.883844E-02 2.626547E-03 + 6 29 9.286797E-02 1.207976E-02 1.121823E-03 + 6 30 9.565537E-02 3.980753E-03 3.807804E-04 + 6 31 9.805059E-02 9.912259E-04 9.719029E-05 + 6 32 1.045674E-01 1.848700E-04 1.933137E-05 + 6 33 1.079658E-01 2.224217E-05 2.401394E-06 + 6 34 1.172600E-01 1.574297E-06 1.846021E-07 + 6 35 1.795651E-01 7.617048E-08 1.367756E-08 + 6 36 6.758326E-01 1.763160E-09 1.191601E-09 + 6 37 3.884301E-01 5.011224E-09 1.946510E-09 + 6 38 4.575212E-01 1.842126E-09 8.428118E-10 + 6 39 5.499909E-01 2.643876E-10 1.454108E-10 + 6 40 3.555053E-01 3.757690E-11 1.335879E-11 + 6 41 4.298973E-01 6.451600E-10 2.773525E-10 + 6 42 4.181021E-01 1.533506E-09 6.411618E-10 + 6 43 4.138438E-01 1.998090E-09 8.268972E-10 + 6 44 4.215292E-01 1.797760E-09 7.578083E-10 + 6 45 4.376692E-01 1.223600E-09 5.355323E-10 + 6 46 4.595629E-01 6.426225E-10 2.953254E-10 + 7 0 4.257751E-01 7.662563E-02 3.262529E-02 + 7 1 4.382526E-01 5.970379E-03 2.616534E-03 + 7 2 3.852120E-01 4.543724E-02 1.750297E-02 + 7 3 3.730137E-01 4.182613E-02 1.560172E-02 + 7 4 3.351662E-01 1.786722E-03 5.988490E-04 + 7 5 3.188487E-01 4.476540E-02 1.427339E-02 + 7 6 2.911700E-01 2.940276E-02 8.561201E-03 + 7 7 3.117017E-01 2.475490E-05 7.716145E-06 + 7 8 2.464183E-01 2.424030E-02 5.973256E-03 + 7 9 2.290695E-01 4.024789E-02 9.219565E-03 + 7 10 2.051133E-01 1.031766E-02 2.116290E-03 + 7 11 2.015537E-01 3.749779E-03 7.557820E-04 + 7 12 1.751102E-01 3.215910E-02 5.631386E-03 + 7 13 1.598654E-01 3.548241E-02 5.672411E-03 + 7 14 1.429121E-01 7.291476E-03 1.042040E-03 + 7 15 1.478431E-01 4.517263E-03 6.678462E-04 + 7 16 1.287775E-01 3.294833E-02 4.243002E-03 + 7 17 1.185549E-01 4.038731E-02 4.788114E-03 + 7 18 1.092085E-01 1.388947E-02 1.516848E-03 + 7 19 1.310480E-01 6.760931E-04 8.860066E-05 + 7 20 1.038616E-01 2.560780E-02 2.659668E-03 + 7 21 9.799993E-02 5.111267E-02 5.009038E-03 + 7 22 9.402917E-02 3.929444E-02 3.694823E-03 + 7 23 8.794790E-02 7.883186E-03 6.933097E-04 + 7 24 9.744723E-02 3.451561E-03 3.363451E-04 + 7 25 9.146278E-02 3.835227E-02 3.507805E-03 + 7 26 9.044122E-02 8.140391E-02 7.362268E-03 + 7 27 9.007991E-02 9.719636E-02 8.755439E-03 + 7 28 9.086727E-02 8.065689E-02 7.329071E-03 + 7 29 9.214141E-02 4.956393E-02 4.566891E-03 + 7 30 9.401525E-02 2.306224E-02 2.168203E-03 + 7 31 9.721667E-02 8.145662E-03 7.918941E-04 + 7 32 1.002233E-01 2.094713E-03 2.099390E-04 + 7 33 1.063660E-01 3.817698E-04 4.060731E-05 + 7 34 1.134307E-01 4.382811E-05 4.971454E-06 + 7 35 1.171501E-01 2.513937E-06 2.945080E-07 + 7 36 1.966424E-01 1.192045E-07 2.344065E-08 + 7 37 9.041575E-01 1.595204E-09 1.442315E-09 + 7 38 3.818822E-01 4.342810E-09 1.658442E-09 + 7 39 3.902490E-01 9.138529E-10 3.566302E-10 + 7 40 2.076460E-01 6.241000E-11 1.295919E-11 + 7 41 3.747925E-01 1.071253E-09 4.014976E-10 + 7 42 4.289760E-01 2.042136E-09 8.760275E-10 + 7 43 4.457454E-01 2.526068E-09 1.125983E-09 + 7 44 4.395183E-01 2.460160E-09 1.081285E-09 + 7 45 4.305196E-01 1.886165E-09 8.120309E-10 + 7 46 4.299131E-01 1.098260E-09 4.721562E-10 + 8 0 4.311812E-01 6.703614E-02 2.890472E-02 + 8 1 5.796995E-01 2.429957E-04 1.408645E-04 + 8 2 3.946553E-01 5.566120E-02 2.196699E-02 + 8 3 3.896642E-01 1.578722E-02 6.151716E-03 + 8 4 3.497822E-01 2.193978E-02 7.674144E-03 + 8 5 3.292529E-01 4.732849E-02 1.558304E-02 + 8 6 2.965425E-01 3.006525E-03 8.915624E-04 + 8 7 2.768413E-01 1.794477E-02 4.967854E-03 + 8 8 2.546861E-01 3.847949E-02 9.800193E-03 + 8 9 2.380741E-01 9.850723E-03 2.345202E-03 + 8 10 2.204913E-01 5.855307E-03 1.291044E-03 + 8 11 1.995308E-01 3.549690E-02 7.082724E-03 + 8 12 1.777280E-01 2.506840E-02 4.455356E-03 + 8 13 1.420775E-01 4.232808E-04 6.013867E-05 + 8 14 1.558766E-01 1.707206E-02 2.661134E-03 + 8 15 1.424313E-01 3.854516E-02 5.490036E-03 + 8 16 1.275256E-01 1.809446E-02 2.307507E-03 + 8 17 1.941474E-01 1.032620E-04 2.004804E-05 + 8 18 1.174714E-01 2.249772E-02 2.642838E-03 + 8 19 1.094351E-01 4.219681E-02 4.617811E-03 + 8 20 1.010129E-01 2.086527E-02 2.107662E-03 + 8 21 1.841287E-03 9.873421E-06 1.817980E-08 + 8 22 9.833785E-02 2.073464E-02 2.039000E-03 + 8 23 9.419693E-02 5.062719E-02 4.768926E-03 + 8 24 9.062423E-02 4.036349E-02 3.657910E-03 + 8 25 8.599418E-02 7.180083E-03 6.174453E-04 + 8 26 9.444947E-02 5.557547E-03 5.249074E-04 + 8 27 9.133637E-02 4.789141E-02 4.374227E-03 + 8 28 9.085634E-02 9.224207E-02 8.380777E-03 + 8 29 9.167950E-02 1.002568E-01 9.191491E-03 + 8 30 9.328994E-02 7.367194E-02 6.872851E-03 + 8 31 9.533604E-02 3.860992E-02 3.680917E-03 + 8 32 9.879965E-02 1.467762E-02 1.450143E-03 + 8 33 1.025501E-01 3.906076E-03 4.005684E-04 + 8 34 1.084837E-01 6.958353E-04 7.548680E-05 + 8 35 1.182589E-01 7.564564E-05 8.945767E-06 + 8 36 1.196168E-01 3.710362E-06 4.438217E-07 + 8 37 1.974895E-01 1.619902E-07 3.199136E-08 + 8 38 2.124658E+00 4.161600E-10 8.841977E-10 + 8 39 4.628263E-01 1.306822E-09 6.048318E-10 + 8 40 1.060368E-01 5.867560E-11 6.221772E-12 + 8 41 4.644751E-01 8.185321E-10 3.801878E-10 + 8 42 4.013213E-01 2.974612E-09 1.193775E-09 + 8 43 4.105180E-01 3.951380E-09 1.622113E-09 + 8 44 4.375073E-01 3.437477E-09 1.503921E-09 + 8 45 4.594890E-01 2.388277E-09 1.097387E-09 + 8 46 4.657776E-01 1.398012E-09 6.511627E-10 + 9 0 4.361073E-01 5.741813E-02 2.504047E-02 + 9 1 3.545752E-01 1.130883E-03 4.009830E-04 + 9 2 4.037530E-01 5.361245E-02 2.164619E-02 + 9 3 4.399196E-01 1.639615E-03 7.212989E-04 + 9 4 3.604282E-01 4.380702E-02 1.578929E-02 + 9 5 3.414848E-01 2.537636E-02 8.665641E-03 + 9 6 3.161008E-01 5.295659E-03 1.673962E-03 + 9 7 2.864343E-01 3.879664E-02 1.111269E-02 + 9 8 2.622993E-01 1.549204E-02 4.063551E-03 + 9 9 2.366247E-01 2.806569E-03 6.641036E-04 + 9 10 2.244929E-01 3.316723E-02 7.445807E-03 + 9 11 2.048130E-01 2.305293E-02 4.721540E-03 + 9 12 4.213990E-01 1.874440E-05 7.898870E-06 + 9 13 1.740087E-01 2.276159E-02 3.960714E-03 + 9 14 1.570108E-01 3.282148E-02 5.153328E-03 + 9 15 1.411579E-01 5.986228E-03 8.450033E-04 + 9 16 1.440823E-01 7.173008E-03 1.033503E-03 + 9 17 1.275118E-01 3.460934E-02 4.413099E-03 + 9 18 1.157517E-01 2.540936E-02 2.941176E-03 + 9 19 9.360388E-02 6.818815E-04 6.382675E-05 + 9 20 1.100282E-01 1.640859E-02 1.805407E-03 + 9 21 1.018712E-01 4.133031E-02 4.210368E-03 + 9 22 9.508945E-02 2.356400E-02 2.240687E-03 + 9 23 5.760609E-02 1.001238E-04 5.767743E-06 + 9 24 9.515889E-02 2.138543E-02 2.035013E-03 + 9 25 9.139364E-02 5.186107E-02 4.739772E-03 + 9 26 8.873477E-02 3.669450E-02 3.256078E-03 + 9 27 8.402875E-02 3.175716E-03 2.668514E-04 + 9 28 9.351691E-02 1.385915E-02 1.296065E-03 + 9 29 9.195403E-02 6.751764E-02 6.208519E-03 + 9 30 9.265068E-02 1.062029E-01 9.839773E-03 + 9 31 9.451500E-02 9.680417E-02 9.149446E-03 + 9 32 9.680094E-02 5.814751E-02 5.628733E-03 + 9 33 1.004486E-01 2.397205E-02 2.407959E-03 + 9 34 1.049315E-01 6.631402E-03 6.958428E-04 + 9 35 1.109085E-01 1.162902E-03 1.289757E-04 + 9 36 1.223427E-01 1.198245E-04 1.465965E-05 + 9 37 1.239751E-01 5.315330E-06 6.589684E-07 + 9 38 1.874202E-01 1.944369E-07 3.644140E-08 + 9 39 1.467954E+01 1.346890E-11 1.977173E-10 + 9 40 2.469054E-02 4.303360E-11 1.062523E-12 + 9 41 4.881911E-01 6.723649E-10 3.282425E-10 + 9 42 5.173400E-01 2.173424E-09 1.124399E-09 + 9 43 4.550629E-01 4.107528E-09 1.869184E-09 + 9 44 4.219053E-01 4.823302E-09 2.034977E-09 + 9 45 4.188771E-01 3.837803E-09 1.607567E-09 + 9 46 4.371993E-01 2.211821E-09 9.670066E-10 + 10 0 4.405193E-01 4.867417E-02 2.144191E-02 + 10 1 3.959427E-01 5.003415E-03 1.981066E-03 + 10 2 4.127281E-01 4.388019E-02 1.811059E-02 + 10 3 3.256838E-01 1.253884E-03 4.083698E-04 + 10 4 3.710875E-01 5.080884E-02 1.885452E-02 + 10 5 3.624470E-01 4.730118E-03 1.714417E-03 + 10 6 3.235868E-01 2.756253E-02 8.918872E-03 + 10 7 2.958613E-01 3.071282E-02 9.086735E-03 + 10 8 3.604056E+00 3.498770E-08 1.260977E-07 + 10 9 2.486282E-01 2.545804E-02 6.329586E-03 + 10 10 2.316964E-01 2.666076E-02 6.177202E-03 + 10 11 2.035083E-01 1.504813E-04 3.062418E-05 + 10 12 1.988757E-01 2.209086E-02 4.393336E-03 + 10 13 1.767336E-01 2.964983E-02 5.240122E-03 + 10 14 1.501089E-01 2.516898E-03 3.778089E-04 + 10 15 1.542726E-01 1.239945E-02 1.912896E-03 + 10 16 1.408944E-01 3.398538E-02 4.788350E-03 + 10 17 1.257272E-01 1.199980E-02 1.508702E-03 + 10 18 1.370496E-01 2.602820E-03 3.567153E-04 + 10 19 1.155871E-01 3.000271E-02 3.467928E-03 + 10 20 1.073737E-01 2.872459E-02 3.084264E-03 + 10 21 9.100851E-02 1.685921E-03 1.534332E-04 + 10 22 1.037878E-01 1.451373E-02 1.506348E-03 + 10 23 9.599889E-02 4.068361E-02 3.905581E-03 + 10 24 9.159844E-02 2.217096E-02 2.030826E-03 + 10 25 1.813701E-01 3.532686E-05 6.407236E-06 + 10 26 9.270878E-02 2.736697E-02 2.537159E-03 + 10 27 8.970534E-02 5.342847E-02 4.792819E-03 + 10 28 8.839274E-02 2.709342E-02 2.394862E-03 + 10 29 6.447840E-01 1.829310E-06 1.179510E-06 + 10 30 9.365207E-02 3.440268E-02 3.221882E-03 + 10 31 9.382220E-02 9.579980E-02 8.988149E-03 + 10 32 9.582382E-02 1.143516E-01 1.095761E-02 + 10 33 9.838204E-02 8.055695E-02 7.925358E-03 + 10 34 1.021848E-01 3.644540E-02 3.724167E-03 + 10 35 1.073043E-01 1.056162E-02 1.133308E-03 + 10 36 1.135629E-01 1.844892E-03 2.095114E-04 + 10 37 1.256952E-01 1.813224E-04 2.279135E-05 + 10 38 1.294530E-01 7.583194E-06 9.816673E-07 + 10 39 1.713424E-01 2.129361E-07 3.648498E-08 + 10 40 3.943587E-02 8.071281E-10 3.182980E-11 + 10 41 2.404085E-01 2.061160E-09 4.955203E-10 + 10 42 3.875430E-01 3.645744E-09 1.412883E-09 + 10 43 4.859045E-01 4.120356E-09 2.002100E-09 + 10 44 4.977914E-01 4.367888E-09 2.174297E-09 + 10 45 4.652122E-01 4.097280E-09 1.906105E-09 + 10 46 4.346817E-01 3.048144E-09 1.324972E-09 + 11 0 4.444056E-01 4.115924E-02 1.829139E-02 + 11 1 4.111826E-01 9.468931E-03 3.893459E-03 + 11 2 4.217132E-01 3.165031E-02 1.334735E-02 + 11 3 3.733052E-01 8.882584E-03 3.315914E-03 + 11 4 3.823158E-01 4.256098E-02 1.627174E-02 + 11 5 3.011721E-01 6.028704E-04 1.815678E-04 + 11 6 3.335815E-01 4.251482E-02 1.418216E-02 + 11 7 3.055071E-01 9.169428E-03 2.801325E-03 + 11 8 2.845412E-01 1.286275E-02 3.659982E-03 + 11 9 2.569526E-01 3.160510E-02 8.121010E-03 + 11 10 2.407749E-01 3.297066E-03 7.938507E-04 + 11 11 2.195837E-01 1.434162E-02 3.149186E-03 + 11 12 2.033117E-01 3.097200E-02 6.296968E-03 + 11 13 1.732023E-01 3.311326E-03 5.735291E-04 + 11 14 1.755471E-01 1.231709E-02 2.162229E-03 + 11 15 1.550826E-01 3.072150E-02 4.764369E-03 + 11 16 1.398225E-01 7.223373E-03 1.009990E-03 + 11 17 1.422015E-01 6.662417E-03 9.474055E-04 + 11 18 1.268851E-01 3.193468E-02 4.052034E-03 + 11 19 1.131396E-01 1.542645E-02 1.745343E-03 + 11 20 1.291833E-01 1.074677E-03 1.388303E-04 + 11 21 1.074134E-01 2.774738E-02 2.980442E-03 + 11 22 1.003665E-01 2.876521E-02 2.887063E-03 + 11 23 8.195608E-02 1.395018E-03 1.143302E-04 + 11 24 9.760145E-02 1.624547E-02 1.585582E-03 + 11 25 9.253158E-02 4.075862E-02 3.771460E-03 + 11 26 8.874130E-02 1.654478E-02 1.468206E-03 + 11 27 1.018835E-01 1.913460E-03 1.949501E-04 + 11 28 9.085996E-02 3.829717E-02 3.479679E-03 + 11 29 8.965202E-02 5.076853E-02 4.551502E-03 + 11 30 8.774659E-02 1.184120E-02 1.039025E-03 + 11 31 9.763007E-02 8.093575E-03 7.901763E-04 + 11 32 9.528116E-02 7.160561E-02 6.822665E-03 + 11 33 9.723618E-02 1.222495E-01 1.188708E-02 + 11 34 1.000571E-01 1.041848E-01 1.042443E-02 + 11 35 1.040156E-01 5.257136E-02 5.468242E-03 + 11 36 1.096378E-01 1.613111E-02 1.768580E-03 + 11 37 1.163489E-01 2.846693E-03 3.312096E-04 + 11 38 1.284549E-01 2.699097E-04 3.467122E-05 + 11 39 1.349804E-01 1.097763E-05 1.481764E-06 + 11 40 1.530997E-01 2.297093E-07 3.516843E-08 + 11 41 2.530676E-01 2.553281E-09 6.461526E-10 + 11 42 3.133876E-01 5.218618E-09 1.635450E-09 + 11 43 3.594052E-01 7.390841E-09 2.656307E-09 + 11 44 4.346545E-01 6.135589E-09 2.666861E-09 + 11 45 5.008121E-01 4.269316E-09 2.138125E-09 + 11 46 5.216656E-01 2.820672E-09 1.471448E-09 + 12 0 4.477825E-01 3.492751E-02 1.563992E-02 + 12 1 4.208726E-01 1.332492E-02 5.608094E-03 + 12 2 4.309036E-01 2.044368E-02 8.809257E-03 + 12 3 3.890590E-01 1.800394E-02 7.004594E-03 + 12 4 3.948513E-01 2.734646E-02 1.079779E-02 + 12 5 3.496709E-01 1.023255E-02 3.578024E-03 + 12 6 3.447389E-01 3.866733E-02 1.333013E-02 + 12 7 3.037908E-01 1.237182E-05 3.758445E-06 + 12 8 2.928978E-01 3.106933E-02 9.100137E-03 + 12 9 2.639013E-01 1.426306E-02 3.764040E-03 + 12 10 2.442077E-01 4.090711E-03 9.989834E-04 + 12 11 2.262222E-01 2.966474E-02 6.710825E-03 + 12 12 2.097604E-01 8.967539E-03 1.881034E-03 + 12 13 1.998022E-01 7.126802E-03 1.423951E-03 + 12 14 1.768051E-01 2.963465E-02 5.239558E-03 + 12 15 1.530132E-01 7.522455E-03 1.151035E-03 + 12 16 1.551767E-01 6.401010E-03 9.932874E-04 + 12 17 1.393694E-01 2.956782E-02 4.120850E-03 + 12 18 1.253026E-01 1.043497E-02 1.307529E-03 + 12 19 1.337888E-01 4.105703E-03 5.492972E-04 + 12 20 1.146879E-01 2.958695E-02 3.393265E-03 + 12 21 1.048534E-01 1.626350E-02 1.705283E-03 + 12 22 1.203640E-01 9.700291E-04 1.167566E-04 + 12 23 1.013622E-01 2.802367E-02 2.840542E-03 + 12 24 9.419775E-02 2.602006E-02 2.451031E-03 + 12 25 6.611599E-02 2.959067E-04 1.956417E-05 + 12 26 9.367295E-02 2.175509E-02 2.037863E-03 + 12 27 9.047623E-02 3.919722E-02 3.546417E-03 + 12 28 8.502305E-02 7.748497E-03 6.588009E-04 + 12 29 9.383289E-02 1.002287E-02 9.404749E-04 + 12 30 9.078487E-02 5.095046E-02 4.625531E-03 + 12 31 9.032484E-02 3.717973E-02 3.358254E-03 + 12 32 6.193406E-02 2.192532E-04 1.357924E-05 + 12 33 9.726589E-02 4.073537E-02 3.962162E-03 + 12 34 9.878623E-02 1.174225E-01 1.159973E-02 + 12 35 1.018129E-01 1.264424E-01 1.287347E-02 + 12 36 1.059387E-01 7.266553E-02 7.698090E-03 + 12 37 1.119289E-01 2.393594E-02 2.679123E-03 + 12 38 1.191529E-01 4.336972E-03 5.167628E-04 + 12 39 1.307873E-01 4.037668E-04 5.280757E-05 + 12 40 1.396380E-01 1.633752E-05 2.281340E-06 + 12 41 1.381452E-01 2.601714E-07 3.594143E-08 + 12 42 3.883416E-01 4.506437E-09 1.750037E-09 + 12 43 3.776060E-01 6.816154E-09 2.573821E-09 + 12 44 3.571654E-01 9.347022E-09 3.338433E-09 + 12 45 3.896798E-01 7.389122E-09 2.879391E-09 + 12 46 4.541367E-01 4.196448E-09 1.905761E-09 + 13 0 4.506909E-01 2.984186E-02 1.344945E-02 + 13 1 4.282042E-01 1.616672E-02 6.922657E-03 + 13 2 4.407124E-01 1.180533E-02 5.202754E-03 + 13 3 3.998412E-01 2.464484E-02 9.854022E-03 + 13 4 4.106549E-01 1.317862E-02 5.411863E-03 + 13 5 3.637178E-01 2.322784E-02 8.448380E-03 + 13 6 3.578640E-01 2.324489E-02 8.318510E-03 + 13 7 3.238423E-01 8.381216E-03 2.714192E-03 + 13 8 3.023220E-01 3.264968E-02 9.870717E-03 + 13 9 2.551232E-01 5.671947E-04 1.447045E-04 + 13 10 2.532372E-01 2.104330E-02 5.328946E-03 + 13 11 2.329233E-01 1.892526E-02 4.408135E-03 + 13 12 2.119503E-01 6.936460E-04 1.470184E-04 + 13 13 2.010171E-01 2.600799E-02 5.228050E-03 + 13 14 1.794111E-01 1.302092E-02 2.336097E-03 + 13 15 1.840308E-01 3.065086E-03 5.640703E-04 + 13 16 1.543657E-01 2.642874E-02 4.079693E-03 + 13 17 1.386874E-01 1.075760E-02 1.491944E-03 + 13 18 1.423537E-01 3.737571E-03 5.320572E-04 + 13 19 1.264448E-01 2.779271E-02 3.514243E-03 + 13 20 1.117073E-01 1.130040E-02 1.262337E-03 + 13 21 1.219569E-01 3.369675E-03 4.109551E-04 + 13 22 1.059217E-01 2.852756E-02 3.021689E-03 + 13 23 9.852290E-02 1.459808E-02 1.438245E-03 + 13 24 1.114102E-01 2.007300E-03 2.236337E-04 + 13 25 9.578736E-02 2.984796E-02 2.859058E-03 + 13 26 9.016331E-02 2.064214E-02 1.861164E-03 + 13 27 1.133320E-01 3.849189E-04 4.362361E-05 + 13 28 9.180748E-02 3.037523E-02 2.788673E-03 + 13 29 8.868545E-02 3.209870E-02 2.846687E-03 + 13 30 7.145009E-02 5.421582E-04 3.873725E-05 + 13 31 9.242485E-02 2.793617E-02 2.581996E-03 + 13 32 9.193312E-02 5.507151E-02 5.062896E-03 + 13 33 8.993707E-02 1.318630E-02 1.185937E-03 + 13 34 1.008290E-01 1.348059E-02 1.359234E-03 + 13 35 1.005338E-01 9.893420E-02 9.946235E-03 + 13 36 1.036491E-01 1.437551E-01 1.490008E-02 + 13 37 1.079435E-01 9.670631E-02 1.043882E-02 + 13 38 1.141853E-01 3.481298E-02 3.975131E-03 + 13 39 1.218713E-01 6.598797E-03 8.042038E-04 + 13 40 1.328400E-01 6.172522E-04 8.199578E-05 + 13 41 1.430507E-01 2.528340E-05 3.616809E-06 + 13 42 1.303393E-01 3.306250E-07 4.309343E-08 + 13 43 4.574272E-01 6.312303E-09 2.887419E-09 + 13 44 4.569933E-01 6.275808E-09 2.868002E-09 + 13 45 3.801893E-01 8.368590E-09 3.181648E-09 + 13 46 3.680538E-01 6.920576E-09 2.547144E-09 + 14 0 4.531861E-01 2.569179E-02 1.164316E-02 + 14 1 4.341441E-01 1.799286E-02 7.811493E-03 + 14 2 4.521116E-01 5.946259E-03 2.688373E-03 + 14 3 4.086511E-01 2.755965E-02 1.126228E-02 + 14 4 4.374718E-01 4.047168E-03 1.770522E-03 + 14 5 3.746537E-01 3.161618E-02 1.184512E-02 + 14 6 3.769515E-01 8.335022E-03 3.141899E-03 + 14 7 3.336810E-01 2.284561E-02 7.623147E-03 + 14 8 3.127318E-01 1.953120E-02 6.108027E-03 + 14 9 2.931477E-01 4.804575E-03 1.408450E-03 + 14 10 2.611514E-01 2.720809E-02 7.105431E-03 + 14 11 2.373655E-01 2.593421E-03 6.155887E-04 + 14 12 2.210945E-01 1.438824E-02 3.181160E-03 + 14 13 2.062382E-01 2.167378E-02 4.469960E-03 + 14 14 6.223165E-01 2.633447E-06 1.638838E-06 + 14 15 1.773009E-01 2.151703E-02 3.814989E-03 + 14 16 1.548384E-01 1.507336E-02 2.333934E-03 + 14 17 1.668015E-01 1.176952E-03 1.963173E-04 + 14 18 1.381212E-01 2.387671E-02 3.297878E-03 + 14 19 1.254186E-01 1.207903E-02 1.514936E-03 + 14 20 1.349240E-01 2.896489E-03 3.908059E-04 + 14 21 1.144491E-01 2.606574E-02 2.983200E-03 + 14 22 1.024239E-01 1.038890E-02 1.064071E-03 + 14 23 1.105054E-01 4.057312E-03 4.483550E-04 + 14 24 1.000630E-01 2.847104E-02 2.848897E-03 + 14 25 9.187881E-02 1.059290E-02 9.732634E-04 + 14 26 1.012143E-01 4.924804E-03 4.984607E-04 + 14 27 9.182979E-02 3.180909E-02 2.921022E-03 + 14 28 8.784049E-02 1.252592E-02 1.100283E-03 + 14 29 9.635518E-02 5.129489E-03 4.942528E-04 + 14 30 9.040353E-02 3.809416E-02 3.443846E-03 + 14 31 8.757005E-02 1.791102E-02 1.568469E-03 + 14 32 9.751005E-02 4.232673E-03 4.127282E-04 + 14 33 9.358233E-02 5.059396E-02 4.734701E-03 + 14 34 9.317453E-02 3.796164E-02 3.537057E-03 + 14 35 1.344243E-01 2.923375E-04 3.929727E-05 + 14 36 1.026054E-01 6.929036E-02 7.109567E-03 + 14 37 1.055788E-01 1.517637E-01 1.602302E-02 + 14 38 1.100183E-01 1.240009E-01 1.364237E-02 + 14 39 1.164185E-01 4.990672E-02 5.810065E-03 + 14 40 1.244383E-01 1.011270E-02 1.258407E-03 + 14 41 1.347072E-01 9.768050E-04 1.315827E-04 + 14 42 1.452746E-01 4.125493E-05 5.993292E-06 + 14 43 1.305776E-01 4.915693E-07 6.418793E-08 + 14 44 4.702212E-01 7.970918E-09 3.748095E-09 + 14 45 5.691149E-01 4.507780E-09 2.565444E-09 + 14 46 4.395832E-01 5.568144E-09 2.447663E-09 + 15 0 4.553288E-01 2.227480E-02 1.014236E-02 + 15 1 4.390984E-01 1.895944E-02 8.325059E-03 + 15 2 4.678334E-01 2.438272E-03 1.140705E-03 + 15 3 4.162819E-01 2.719307E-02 1.131998E-02 + 15 4 5.622068E-01 3.053351E-04 1.716615E-04 + 15 5 3.845622E-01 3.296570E-02 1.267736E-02 + 15 6 4.426496E-01 7.787409E-04 3.447093E-04 + 15 7 3.434833E-01 3.170763E-02 1.089104E-02 + 15 8 3.263983E-01 5.585685E-03 1.823158E-03 + 15 9 2.980136E-01 1.808912E-02 5.390805E-03 + 15 10 2.684236E-01 1.744518E-02 4.682698E-03 + 15 11 2.545564E-01 1.840096E-03 4.684083E-04 + 15 12 2.276854E-01 2.364767E-02 5.384229E-03 + 15 13 2.124529E-01 5.021045E-03 1.066735E-03 + 15 14 1.987125E-01 1.036077E-02 2.058815E-03 + 15 15 1.800228E-01 2.184636E-02 3.932842E-03 + 15 16 1.082894E-01 2.071253E-04 2.242947E-05 + 15 17 1.549112E-01 1.752397E-02 2.714660E-03 + 15 18 1.380002E-01 1.595434E-02 2.201703E-03 + 15 19 1.549268E-01 5.504321E-04 8.527667E-05 + 15 20 1.260123E-01 2.226486E-02 2.805646E-03 + 15 21 1.120176E-01 1.146255E-02 1.284007E-03 + 15 22 1.231548E-01 3.025725E-03 3.726326E-04 + 15 23 1.050677E-01 2.496158E-02 2.622656E-03 + 15 24 9.642260E-02 8.048577E-03 7.760647E-04 + 15 25 1.038120E-01 6.392836E-03 6.636531E-04 + 15 26 9.490393E-02 2.783863E-02 2.641996E-03 + 15 27 8.575704E-02 5.388501E-03 4.621019E-04 + 15 28 9.439026E-02 1.074034E-02 1.013783E-03 + 15 29 9.005518E-02 3.118986E-02 2.808808E-03 + 15 30 8.317098E-02 3.615529E-03 3.007071E-04 + 15 31 9.290520E-02 1.700107E-02 1.579487E-03 + 15 32 8.992851E-02 3.754900E-02 3.376726E-03 + 15 33 8.417373E-02 2.807330E-03 2.363034E-04 + 15 34 9.590162E-02 2.666321E-02 2.557045E-03 + 15 35 9.540048E-02 5.748987E-02 5.484561E-03 + 15 36 9.218469E-02 7.255198E-03 6.688182E-04 + 15 37 1.053770E-01 3.533630E-02 3.723634E-03 + 15 38 1.076323E-01 1.457946E-01 1.569221E-02 + 15 39 1.121562E-01 1.524636E-01 1.709973E-02 + 15 40 1.186382E-01 7.063283E-02 8.379753E-03 + 15 41 1.268259E-01 1.569582E-02 1.990637E-03 + 15 42 1.364364E-01 1.614574E-03 2.202866E-04 + 15 43 1.466456E-01 7.191956E-05 1.054669E-05 + 15 44 1.363474E-01 8.672638E-07 1.182492E-07 + 15 45 4.262468E-01 1.031037E-08 4.394762E-09 + 15 46 7.141560E-01 2.785728E-09 1.989445E-09 + 16 0 4.571777E-01 1.940465E-02 8.871373E-03 + 16 1 4.432822E-01 1.923678E-02 8.527321E-03 + 16 2 4.990044E-01 6.624446E-04 3.305628E-04 + 16 3 4.230262E-01 2.461812E-02 1.041411E-02 + 16 4 2.996134E-01 4.318325E-04 1.293828E-04 + 16 5 3.939901E-01 2.878532E-02 1.134113E-02 + 16 6 2.987794E-01 7.783486E-04 2.325546E-04 + 16 7 3.534454E-01 3.119940E-02 1.102728E-02 + 16 8 4.748301E-01 3.031438E-05 1.439418E-05 + 16 9 3.058596E-01 2.659763E-02 8.135142E-03 + 16 10 2.737055E-01 4.787127E-03 1.310263E-03 + 16 11 2.583875E-01 1.249817E-02 3.229370E-03 + 16 12 2.335289E-01 1.709944E-02 3.993212E-03 + 16 13 2.147630E-01 4.450838E-04 9.558755E-05 + 16 14 2.021457E-01 2.122690E-02 4.290928E-03 + 16 15 1.825761E-01 6.552642E-03 1.196356E-03 + 16 16 1.798385E-01 7.594279E-03 1.365744E-03 + 16 17 1.558360E-01 2.048496E-02 3.192295E-03 + 16 18 1.173906E-01 6.259203E-04 7.347716E-05 + 16 19 1.376522E-01 1.502500E-02 2.068223E-03 + 16 20 1.253222E-01 1.576540E-02 1.975756E-03 + 16 21 1.524586E-01 4.915036E-04 7.493392E-05 + 16 22 1.146762E-01 2.103224E-02 2.411898E-03 + 16 23 1.016475E-01 9.673793E-03 9.833170E-04 + 16 24 1.101276E-01 4.027328E-03 4.435200E-04 + 16 25 9.913605E-02 2.420706E-02 2.399793E-03 + 16 26 8.948703E-02 4.623589E-03 4.137513E-04 + 16 27 9.807747E-02 1.048689E-02 1.028527E-03 + 16 28 9.070836E-02 2.513632E-02 2.280075E-03 + 16 29 7.774933E-02 1.001729E-03 7.788374E-05 + 16 30 9.193457E-02 1.944885E-02 1.788022E-03 + 16 31 8.879468E-02 2.438036E-02 2.164846E-03 + 16 32 1.363304E-01 1.398181E-04 1.906146E-05 + 16 33 9.193415E-02 3.242571E-02 2.981030E-03 + 16 34 9.061883E-02 2.312013E-02 2.095119E-03 + 16 35 1.028674E-01 3.714512E-03 3.821024E-04 + 16 36 9.764030E-02 5.625700E-02 5.492951E-03 + 16 37 9.753413E-02 3.127147E-02 3.050036E-03 + 16 38 1.110491E-01 8.209775E-03 9.116881E-04 + 16 39 1.098691E-01 1.225197E-01 1.346113E-02 + 16 40 1.143586E-01 1.777924E-01 2.033209E-02 + 16 41 1.208527E-01 9.849774E-02 1.190372E-02 + 16 42 1.290403E-01 2.474937E-02 3.193665E-03 + 16 43 1.380491E-01 2.805281E-03 3.872664E-04 + 16 44 1.475332E-01 1.357924E-04 2.003388E-05 + 16 45 1.437327E-01 1.808379E-06 2.599232E-07 + 16 46 3.444501E-01 1.527696E-08 5.262150E-09 + 17 0 4.587839E-01 1.693123E-02 7.767775E-03 + 17 1 4.468316E-01 1.896356E-02 8.473519E-03 + 17 2 6.955428E-01 3.732648E-05 2.596216E-05 + 17 3 4.290182E-01 2.091385E-02 8.972421E-03 + 17 4 3.704402E-01 2.522509E-03 9.344389E-04 + 17 5 4.032274E-01 2.193110E-02 8.843222E-03 + 17 6 3.501781E-01 5.053923E-03 1.769773E-03 + 17 7 3.638446E-01 2.408295E-02 8.762452E-03 + 17 8 3.198527E-01 2.929067E-03 9.368701E-04 + 17 9 3.144261E-01 2.526543E-02 7.944113E-03 + 17 10 7.431317E+00 2.398781E-08 1.782610E-07 + 17 11 2.648397E-01 2.046983E-02 5.421222E-03 + 17 12 2.372153E-01 5.395780E-03 1.279961E-03 + 17 13 2.226670E-01 8.492927E-03 1.891094E-03 + 17 14 2.067841E-01 1.730132E-02 3.577638E-03 + 17 15 2.310637E-01 5.251814E-05 1.213504E-05 + 17 16 1.792133E-01 1.865082E-02 3.342474E-03 + 17 17 1.547414E-01 7.136026E-03 1.104238E-03 + 17 18 1.589234E-01 5.515433E-03 8.765315E-04 + 17 19 1.376268E-01 1.903957E-02 2.620355E-03 + 17 20 1.139940E-01 8.940626E-04 1.019178E-04 + 17 21 1.259606E-01 1.383901E-02 1.743170E-03 + 17 22 1.130693E-01 1.437631E-02 1.625520E-03 + 17 23 1.377410E-01 7.200641E-04 9.918237E-05 + 17 24 1.049127E-01 2.011103E-02 2.109903E-03 + 17 25 9.550150E-02 7.229948E-03 6.904709E-04 + 17 26 1.026789E-01 6.160663E-03 6.325700E-04 + 17 27 9.442882E-02 2.250047E-02 2.124693E-03 + 17 28 7.880016E-02 1.381387E-03 1.088535E-04 + 17 29 9.309021E-02 1.582317E-02 1.472983E-03 + 17 30 8.867413E-02 1.935597E-02 1.716374E-03 + 17 31 1.090757E-01 4.953073E-04 5.402600E-05 + 17 32 9.099759E-02 2.758990E-02 2.510614E-03 + 17 33 8.709170E-02 1.162654E-02 1.012575E-03 + 17 34 9.575304E-02 8.964668E-03 8.583942E-04 + 17 35 9.309611E-02 3.914217E-02 3.643984E-03 + 17 36 8.724233E-02 3.384252E-03 2.952500E-04 + 17 37 1.005382E-01 3.273021E-02 3.290636E-03 + 17 38 1.005759E-01 5.773409E-02 5.806658E-03 + 17 39 7.954014E-02 5.095764E-04 4.053178E-05 + 17 40 1.124272E-01 8.288547E-02 9.318580E-03 + 17 41 1.166388E-01 1.924724E-01 2.244976E-02 + 17 42 1.230723E-01 1.343339E-01 1.653278E-02 + 17 43 1.311107E-01 3.962758E-02 5.195599E-03 + 17 44 1.395603E-01 5.141141E-03 7.174989E-04 + 17 45 1.482224E-01 2.809237E-04 4.163918E-05 + 17 46 1.497455E-01 4.431825E-06 6.636459E-07 + 18 0 4.601878E-01 1.473214E-02 6.779549E-03 + 18 1 4.498431E-01 1.822865E-02 8.200032E-03 + 18 2 3.276978E-01 9.471202E-05 3.103692E-05 + 18 3 4.343332E-01 1.689708E-02 7.338961E-03 + 18 4 3.910057E-01 5.055455E-03 1.976712E-03 + 18 5 4.125689E-01 1.485831E-02 6.130075E-03 + 18 6 3.665994E-01 1.005882E-02 3.687556E-03 + 18 7 3.752864E-01 1.504429E-02 5.645916E-03 + 18 8 3.340026E-01 9.440895E-03 3.153284E-03 + 18 9 3.236241E-01 1.749184E-02 5.660781E-03 + 18 10 2.999725E-01 3.486444E-03 1.045837E-03 + 18 11 2.713618E-01 1.951703E-02 5.296176E-03 + 18 12 1.924686E-01 5.583781E-05 1.074703E-05 + 18 13 2.283215E-01 1.602265E-02 3.658316E-03 + 18 14 2.112722E-01 6.529574E-03 1.379517E-03 + 18 15 1.984002E-01 6.123443E-03 1.214892E-03 + 18 16 1.817958E-01 1.666495E-02 3.029618E-03 + 18 17 9.636458E-03 3.473005E-06 3.346747E-08 + 18 18 1.565185E-01 1.572355E-02 2.461026E-03 + 18 19 1.357770E-01 7.401813E-03 1.004996E-03 + 18 20 1.401948E-01 4.194127E-03 5.879950E-04 + 18 21 1.249796E-01 1.775791E-02 2.219377E-03 + 18 22 9.898726E-02 8.246799E-04 8.163280E-05 + 18 23 1.155732E-01 1.313168E-02 1.517671E-03 + 18 24 1.026095E-01 1.231735E-02 1.263877E-03 + 18 25 1.168955E-01 1.235754E-03 1.444540E-04 + 18 26 9.872099E-02 1.945485E-02 1.920602E-03 + 18 27 8.969785E-02 4.333333E-03 3.886907E-04 + 18 28 9.773885E-02 9.307275E-03 9.096824E-04 + 18 29 9.021788E-02 1.892958E-02 1.707786E-03 + 18 30 2.041055E+00 4.125493E-07 8.420357E-07 + 18 31 9.089781E-02 2.097177E-02 1.906288E-03 + 18 32 8.721220E-02 1.060405E-02 9.248024E-04 + 18 33 9.538091E-02 6.732716E-03 6.421726E-04 + 18 34 9.056214E-02 2.861511E-02 2.591446E-03 + 18 35 7.835646E-02 9.134763E-04 7.157677E-05 + 18 36 9.572574E-02 2.827384E-02 2.706534E-03 + 18 37 9.468974E-02 2.522962E-02 2.388986E-03 + 18 38 1.074983E-01 5.813780E-03 6.249715E-04 + 18 39 1.034069E-01 6.551547E-02 6.774749E-03 + 18 40 1.037125E-01 1.908485E-02 1.979338E-03 + 18 41 1.157925E-01 3.634224E-02 4.208160E-03 + 18 42 1.190264E-01 1.858489E-01 2.212093E-02 + 18 43 1.253123E-01 1.764423E-01 2.211039E-02 + 18 44 1.330813E-01 6.409459E-02 8.529788E-03 + 18 45 1.409905E-01 9.943807E-03 1.401982E-03 + 18 46 1.488655E-01 6.427188E-04 9.567865E-05 + 19 0 4.614183E-01 1.271362E-02 5.866299E-03 + 19 1 4.523892E-01 1.708213E-02 7.727769E-03 + 19 2 3.998940E-01 4.848562E-04 1.938911E-04 + 19 3 4.390205E-01 1.308838E-02 5.746067E-03 + 19 4 4.024819E-01 7.096684E-03 2.856287E-03 + 19 5 4.224481E-01 9.004613E-03 3.803982E-03 + 19 6 3.770906E-01 1.356022E-02 5.113432E-03 + 19 7 3.892538E-01 7.510061E-03 2.923320E-03 + 19 8 3.433340E-01 1.492374E-02 5.123829E-03 + 19 9 3.341695E-01 8.916762E-03 2.979710E-03 + 19 10 3.043469E-01 9.829412E-03 2.991551E-03 + 19 11 2.775795E-01 1.275578E-02 3.540743E-03 + 19 12 2.647673E-01 2.344131E-03 6.206492E-04 + 19 13 2.333110E-01 1.598141E-02 3.728638E-03 + 19 14 2.126792E-01 3.910206E-04 8.316194E-05 + 19 15 2.013229E-01 1.317108E-02 2.651640E-03 + 19 16 1.845010E-01 7.233128E-03 1.334520E-03 + 19 17 1.814322E-01 4.399008E-03 7.981218E-04 + 19 18 1.572791E-01 1.507588E-02 2.371122E-03 + 19 19 8.171036E-02 1.083321E-04 8.851853E-06 + 19 20 1.376457E-01 1.316197E-02 1.811689E-03 + 19 21 1.235939E-01 7.474351E-03 9.237843E-04 + 19 22 1.291468E-01 3.508128E-03 4.530636E-04 + 19 23 1.139112E-01 1.613071E-02 1.837468E-03 + 19 24 8.297939E-02 5.873372E-04 4.873688E-05 + 19 25 1.056953E-01 1.251892E-02 1.323192E-03 + 19 26 9.628753E-02 1.012165E-02 9.745887E-04 + 19 27 1.056266E-01 2.185689E-03 2.308668E-04 + 19 28 9.448171E-02 1.831237E-02 1.730184E-03 + 19 29 8.117956E-02 1.699848E-03 1.379929E-04 + 19 30 9.316851E-02 1.272139E-02 1.185233E-03 + 19 31 8.800798E-02 1.364717E-02 1.201060E-03 + 19 32 9.836727E-02 1.857154E-03 1.826832E-04 + 19 33 9.037985E-02 2.302724E-02 2.081199E-03 + 19 34 8.221917E-02 2.361428E-03 1.941547E-04 + 19 35 9.357734E-02 1.812220E-02 1.695827E-03 + 19 36 9.128620E-02 1.883898E-02 1.719739E-03 + 19 37 1.022361E-01 4.418697E-03 4.517505E-04 + 19 38 9.802019E-02 4.047230E-02 3.967102E-03 + 19 39 9.059324E-02 2.937013E-03 2.660736E-04 + 19 40 1.067326E-01 4.300107E-02 4.589616E-03 + 19 41 1.081963E-01 5.423767E-02 5.868316E-03 + 19 42 1.252690E-01 3.456396E-03 4.329791E-04 + 19 43 1.215825E-01 1.476171E-01 1.794766E-02 + 19 44 1.275970E-01 2.166741E-01 2.764696E-02 + 19 45 1.350043E-01 1.033468E-01 1.395226E-02 + 19 46 1.423722E-01 2.021342E-02 2.877829E-03 + 20 0 4.624928E-01 1.080169E-02 4.995703E-03 + 20 1 4.545237E-01 1.554275E-02 7.064548E-03 + 20 2 4.200830E-01 9.561045E-04 4.016433E-04 + 20 3 4.431131E-01 9.759375E-03 4.324507E-03 + 20 4 4.103530E-01 8.219350E-03 3.372835E-03 + 20 5 4.336029E-01 4.860415E-03 2.107490E-03 + 20 6 3.851205E-01 1.480030E-02 5.699900E-03 + 20 7 4.101644E-01 2.783848E-03 1.141835E-03 + 20 8 3.511156E-01 1.720033E-02 6.039305E-03 + 20 9 3.489558E-01 3.035279E-03 1.059178E-03 + 20 10 3.100989E-01 1.420775E-02 4.405809E-03 + 20 11 2.832734E-01 5.736510E-03 1.625001E-03 + 20 12 2.659483E-01 7.252943E-03 1.928908E-03 + 20 13 2.374268E-01 1.065557E-02 2.529917E-03 + 20 14 2.243097E-01 1.033418E-03 2.318057E-04 + 20 15 2.048007E-01 1.397137E-02 2.861346E-03 + 20 16 1.845732E-01 9.127649E-04 1.684720E-04 + 20 17 1.796901E-01 1.057680E-02 1.900546E-03 + 20 18 1.573106E-01 7.354743E-03 1.156979E-03 + 20 19 1.631153E-01 2.760924E-03 4.503491E-04 + 20 20 1.375751E-01 1.336327E-02 1.838453E-03 + 20 21 1.049230E-01 3.500525E-04 3.672855E-05 + 20 22 1.250266E-01 1.113400E-02 1.392047E-03 + 20 23 1.121021E-01 7.129647E-03 7.992486E-04 + 20 24 1.208816E-01 3.007357E-03 3.635342E-04 + 20 25 1.039573E-01 1.419828E-02 1.476015E-03 + 20 26 7.653685E-02 3.711433E-04 2.840614E-05 + 20 27 9.918178E-02 1.204085E-02 1.194233E-03 + 20 28 9.192117E-02 7.786576E-03 7.157512E-04 + 20 29 1.002400E-01 3.533295E-03 3.541777E-04 + 20 30 9.067222E-02 1.610164E-02 1.459972E-03 + 20 31 6.345387E-02 1.969882E-04 1.249967E-05 + 20 32 9.093368E-02 1.549357E-02 1.408887E-03 + 20 33 8.690675E-02 7.470703E-03 6.492545E-04 + 20 34 9.452664E-02 7.161711E-03 6.769724E-04 + 20 35 9.014447E-02 1.938862E-02 1.747777E-03 + 20 36 1.180217E-01 3.146168E-04 3.713160E-05 + 20 37 9.470973E-02 2.706401E-02 2.563225E-03 + 20 38 9.037921E-02 4.488704E-03 4.056855E-04 + 20 39 1.018302E-01 2.428160E-02 2.472600E-03 + 20 40 1.008003E-01 2.783008E-02 2.805279E-03 + 20 41 1.132373E-01 8.353123E-03 9.458853E-04 + 20 42 1.117490E-01 7.464379E-02 8.341369E-03 + 20 43 1.119646E-01 8.896064E-03 9.960444E-04 + 20 44 1.244738E-01 7.914511E-02 9.851489E-03 + 20 45 1.299627E-01 2.347885E-01 3.051376E-02 + 20 46 1.369381E-01 1.616059E-01 2.213001E-02 + 21 0 4.634176E-01 8.936204E-03 4.141194E-03 + 21 1 4.562848E-01 1.360799E-02 6.209116E-03 + 21 2 4.300840E-01 1.332069E-03 5.729016E-04 + 21 3 4.466278E-01 7.005231E-03 3.128731E-03 + 21 4 4.161798E-01 8.334255E-03 3.468548E-03 + 21 5 4.473698E-01 2.304471E-03 1.030951E-03 + 21 6 3.916016E-01 1.399850E-02 5.481835E-03 + 21 7 4.580649E-01 5.985739E-04 2.741857E-04 + 21 8 3.578710E-01 1.632110E-02 5.840848E-03 + 21 9 3.869096E-01 4.369793E-04 1.690715E-04 + 21 10 3.157418E-01 1.495641E-02 4.722363E-03 + 21 11 2.881325E-01 1.503231E-03 4.331296E-04 + 21 12 2.696869E-01 1.035753E-02 2.793290E-03 + 21 13 2.401050E-01 4.960602E-03 1.191065E-03 + 21 14 2.268296E-01 4.325380E-03 9.811242E-04 + 21 15 2.079700E-01 9.967852E-03 2.073015E-03 + 21 16 2.022160E-01 2.703456E-04 5.466820E-05 + 21 17 1.810646E-01 1.186409E-02 2.148166E-03 + 21 18 1.520957E-01 1.497841E-03 2.278152E-04 + 21 19 1.582777E-01 7.574264E-03 1.198837E-03 + 21 20 1.367497E-01 7.371357E-03 1.008031E-03 + 21 21 1.449285E-01 1.379646E-03 1.999500E-04 + 21 22 1.243933E-01 1.174991E-02 1.461610E-03 + 21 23 1.008038E-01 6.537201E-04 6.589747E-05 + 21 24 1.152908E-01 9.074753E-03 1.046236E-03 + 21 25 1.016101E-01 6.544014E-03 6.649381E-04 + 21 26 1.109943E-01 2.401947E-03 2.666024E-04 + 21 27 9.754040E-02 1.234438E-02 1.204076E-03 + 21 28 7.113131E-02 2.039498E-04 1.450722E-05 + 21 29 9.541608E-02 1.136378E-02 1.084287E-03 + 21 30 8.748103E-02 5.480605E-03 4.794490E-04 + 21 31 9.530755E-02 4.860944E-03 4.632846E-04 + 21 32 8.872223E-02 1.309794E-02 1.162078E-03 + 21 33 1.158755E-01 1.803141E-04 2.089400E-05 + 21 34 9.079150E-02 1.647527E-02 1.495814E-03 + 21 35 8.347410E-02 2.281854E-03 1.904757E-04 + 21 36 9.387928E-02 1.361147E-02 1.277835E-03 + 21 37 9.083532E-02 1.119069E-02 1.016510E-03 + 21 38 9.999842E-02 7.030279E-03 7.030168E-04 + 21 39 9.736385E-02 2.504024E-02 2.438014E-03 + 21 40 1.209988E-01 8.205498E-04 9.928553E-05 + 21 41 1.052191E-01 4.133217E-02 4.348936E-03 + 21 42 1.012955E-01 4.234679E-03 4.289540E-04 + 21 43 1.156233E-01 4.951479E-02 5.725063E-03 + 21 44 1.186070E-01 5.364273E-02 6.362402E-03 + 21 45 1.288700E-01 1.260928E-02 1.624958E-03 + 21 46 1.324633E-01 1.980408E-01 2.623313E-02 + 22 0 4.641888E-01 7.061853E-03 3.278033E-03 + 22 1 4.576950E-01 1.125689E-02 5.152224E-03 + 22 2 4.360764E-01 1.494282E-03 6.516209E-04 + 22 3 4.495574E-01 4.805519E-03 2.160357E-03 + 22 4 4.205588E-01 7.527575E-03 3.165788E-03 + 22 5 4.662225E-01 9.377148E-04 4.371838E-04 + 22 6 3.968229E-01 1.176703E-02 4.669429E-03 + 22 7 1.011592E+00 1.308949E-05 1.324122E-05 + 22 8 3.636568E-01 1.338728E-02 4.868376E-03 + 22 9 1.519946E-01 1.917065E-05 2.913834E-06 + 22 10 3.208540E-01 1.280791E-02 4.109469E-03 + 22 11 2.901709E-01 8.079295E-05 2.344376E-05 + 22 12 2.734335E-01 1.037235E-02 2.836147E-03 + 22 13 2.398121E-01 1.503208E-03 3.604874E-04 + 22 14 2.298863E-01 6.421121E-03 1.476128E-03 + 22 15 2.104762E-01 5.274388E-03 1.110133E-03 + 22 16 1.986751E-01 2.118859E-03 4.209646E-04 + 22 17 1.828156E-01 9.036259E-03 1.651969E-03 + 22 18 1.438365E+00 6.264722E-07 9.010960E-07 + 22 19 1.580158E-01 8.901519E-03 1.406581E-03 + 22 20 1.327434E-01 2.273693E-03 3.018179E-04 + 22 21 1.390586E-01 4.576378E-03 6.363848E-04 + 22 22 1.238061E-01 7.287685E-03 9.022596E-04 + 22 23 1.395464E-01 4.552253E-04 6.352505E-05 + 22 24 1.140647E-01 9.702217E-03 1.106681E-03 + 22 25 9.294068E-02 1.028664E-03 9.560478E-05 + 22 26 1.061037E-01 6.697098E-03 7.105866E-04 + 22 27 9.559999E-02 6.018227E-03 5.753424E-04 + 22 28 1.041715E-01 1.711255E-03 1.782640E-04 + 22 29 9.383483E-02 1.043084E-02 9.787760E-04 + 22 30 5.909498E-02 1.075122E-04 6.353433E-06 + 22 31 9.220416E-02 1.003303E-02 9.250874E-04 + 22 32 8.527418E-02 3.636195E-03 3.100735E-04 + 22 33 9.272605E-02 5.746262E-03 5.328282E-04 + 22 34 8.864846E-02 9.729988E-03 8.625484E-04 + 22 35 9.963157E-02 1.429713E-03 1.424446E-04 + 22 36 9.122636E-02 1.486499E-02 1.356079E-03 + 22 37 4.790183E-02 5.046227E-05 2.417235E-06 + 22 38 9.547309E-02 1.760991E-02 1.681272E-03 + 22 39 9.081753E-02 3.192850E-03 2.899668E-04 + 22 40 1.021351E-01 1.784423E-02 1.822522E-03 + 22 41 1.002325E-01 1.298794E-02 1.301814E-03 + 22 42 1.108340E-01 1.438534E-02 1.594385E-03 + 22 43 1.107926E-01 3.578852E-02 3.965103E-03 + 22 44 1.237826E-01 4.546048E-03 5.627218E-04 + 22 45 1.227595E-01 8.065831E-02 9.901576E-03 + 22 46 1.264333E-01 1.056558E-02 1.335841E-03 + 23 0 4.647929E-01 5.113148E-03 2.376555E-03 + 23 1 4.587609E-01 8.440209E-03 3.872038E-03 + 23 2 4.398700E-01 1.370681E-03 6.029215E-04 + 23 3 4.518601E-01 3.064482E-03 1.384717E-03 + 23 4 4.237412E-01 5.934303E-03 2.514609E-03 + 23 5 4.943422E-01 3.178914E-04 1.571471E-04 + 23 6 4.008353E-01 8.687696E-03 3.482335E-03 + 23 7 2.359114E-01 8.165454E-05 1.926324E-05 + 23 8 3.683418E-01 9.530621E-03 3.510526E-03 + 23 9 2.994152E-01 3.649468E-04 1.092706E-04 + 23 10 3.251301E-01 9.210137E-03 2.994492E-03 + 23 11 2.996524E-01 1.013985E-04 3.038429E-05 + 23 12 2.766002E-01 8.119171E-03 2.245764E-03 + 23 13 2.299077E-01 2.187311E-04 5.028796E-05 + 23 14 2.324198E-01 6.151022E-03 1.429619E-03 + 23 15 2.120185E-01 2.150806E-03 4.560106E-04 + 23 16 1.999344E-01 3.281321E-03 6.560490E-04 + 23 17 1.843249E-01 5.278893E-03 9.730317E-04 + 23 18 1.884278E-01 6.003353E-04 1.131199E-04 + 23 19 1.583821E-01 6.960820E-03 1.102469E-03 + 23 20 1.149119E-01 2.712365E-04 3.116831E-05 + 23 21 1.381844E-01 5.464854E-03 7.551576E-04 + 23 22 1.224211E-01 3.083718E-03 3.775122E-04 + 23 23 1.274027E-01 2.062048E-03 2.627104E-04 + 23 24 1.133912E-01 6.455396E-03 7.319850E-04 + 23 25 2.401396E-01 1.812094E-05 4.351556E-06 + 23 26 1.047893E-01 6.935079E-03 7.267224E-04 + 23 27 9.136606E-02 1.533539E-03 1.401134E-04 + 23 28 9.992853E-02 4.183984E-03 4.180993E-04 + 23 29 9.244773E-02 5.359446E-03 4.954687E-04 + 23 30 1.031956E-01 9.443759E-04 9.745546E-05 + 23 31 9.082580E-02 8.128423E-03 7.382705E-04 + 23 32 6.186938E-02 9.837129E-05 6.086170E-06 + 23 33 9.067903E-02 8.011285E-03 7.264556E-04 + 23 34 8.547969E-02 2.364672E-03 2.021314E-04 + 23 35 9.315005E-02 5.725003E-03 5.332843E-04 + 23 36 8.897040E-02 6.491361E-03 5.775390E-04 + 23 37 9.783269E-02 2.879827E-03 2.817412E-04 + 23 38 9.311681E-02 1.135197E-02 1.057059E-03 + 23 39 1.092103E-01 7.354315E-04 8.031667E-05 + 23 40 9.907919E-02 1.689256E-02 1.673701E-03 + 23 41 3.075625E-02 2.151095E-05 6.615962E-07 + 23 42 1.065555E-01 2.363919E-02 2.518887E-03 + 23 43 1.020821E-01 2.499304E-03 2.551342E-04 + 23 44 1.161635E-01 3.106541E-02 3.608665E-03 + 23 45 1.181907E-01 1.644416E-02 1.943547E-03 + 23 46 1.272638E-01 2.984895E-02 3.798692E-03 + 24 0 4.652055E-01 2.976823E-03 1.384834E-03 + 24 1 4.594692E-01 5.030256E-03 2.311248E-03 + 24 2 4.421337E-01 9.238360E-04 4.084590E-04 + 24 3 4.534438E-01 1.621298E-03 7.351673E-04 + 24 4 4.258050E-01 3.629450E-03 1.545438E-03 + 24 5 5.347097E-01 8.618393E-05 4.608339E-05 + 24 6 4.035492E-01 5.055657E-03 2.040206E-03 + 24 7 3.033398E-01 1.722194E-04 5.224101E-05 + 24 8 3.716472E-01 5.360754E-03 1.992309E-03 + 24 9 3.164450E-01 5.033786E-04 1.592916E-04 + 24 10 3.282109E-01 5.155207E-03 1.691995E-03 + 24 11 3.007504E-01 2.857679E-04 8.594480E-05 + 24 12 2.788528E-01 4.745920E-03 1.323413E-03 + 24 13 8.946379E-02 1.722840E-06 1.541318E-07 + 24 14 2.341711E-01 4.007677E-03 9.384823E-04 + 24 15 2.124157E-01 6.750986E-04 1.434015E-04 + 24 16 2.011271E-01 2.652667E-03 5.335233E-04 + 24 17 1.853436E-01 2.372782E-03 4.397800E-04 + 24 18 1.823945E-01 9.228915E-04 1.683303E-04 + 24 19 1.586959E-01 3.847075E-03 6.105149E-04 + 24 20 1.046971E+00 7.771128E-07 8.136145E-07 + 24 21 1.380088E-01 3.790725E-03 5.231534E-04 + 24 22 1.199028E-01 9.333086E-04 1.119063E-04 + 24 23 1.255443E-01 2.166830E-03 2.720330E-04 + 24 24 1.127683E-01 3.003871E-03 3.387413E-04 + 24 25 1.271084E-01 3.856338E-04 4.901727E-05 + 24 26 1.041182E-01 4.245044E-03 4.419862E-04 + 24 27 7.898878E-02 1.664946E-04 1.315121E-05 + 24 28 9.877977E-02 3.591883E-03 3.548054E-04 + 24 29 9.082694E-02 1.820233E-03 1.653262E-04 + 24 30 9.797761E-02 1.731869E-03 1.696844E-04 + 24 31 8.981286E-02 3.968109E-03 3.563872E-04 + 24 32 1.065426E-01 2.311561E-04 2.462798E-05 + 24 33 8.967298E-02 5.175476E-03 4.641003E-04 + 24 34 7.554399E-02 1.716713E-04 1.296874E-05 + 24 35 9.159107E-02 5.091065E-03 4.662961E-04 + 24 36 8.604734E-02 1.518425E-03 1.306564E-04 + 24 37 9.469812E-02 4.159590E-03 3.939053E-04 + 24 38 9.102963E-02 3.847783E-03 3.502622E-04 + 24 39 9.985319E-02 3.008942E-03 3.004524E-04 + 24 40 9.702542E-02 7.125788E-03 6.913826E-04 + 24 41 1.085972E-01 1.929678E-03 2.095577E-04 + 24 42 1.042123E-01 1.199175E-02 1.249688E-03 + 24 43 1.211500E-01 8.294671E-04 1.004899E-04 + 24 44 1.135880E-01 2.007430E-02 2.280199E-03 + 24 45 5.091536E-02 5.387266E-07 2.742946E-08 + 24 46 1.245680E-01 3.287389E-02 4.095035E-03 +[transition-N2cy] +561 0 0 0 5 +c data calculated with LEVEL_8.0 +c using Potentialenergyfunctions retrieved via RKR1 2.0 +c with Spectroscopic constants from +c Spelsberg & Meyer j.chem.phys.,vol.115,no.14,(2001) +c documented in ESA report Aerothermochemistry +c +c vu vl sumre2/fcf FCF SRe2 + 0 0 3.496679E-01 8.556876E-01 2.992065E-01 + 0 1 4.259714E-01 1.360643E-01 5.795952E-02 + 0 2 6.406851E-01 8.007880E-03 5.130530E-03 + 0 3 7.633972E-01 2.361087E-04 1.802447E-04 + 0 4 1.820726E-01 4.012089E-06 7.304915E-07 + 0 5 1.499126E+01 3.458856E-08 5.185262E-07 + 0 6 3.333497E+01 1.585081E-10 5.283862E-09 + 0 7 5.946121E+03 9.985600E-12 5.937558E-08 + 0 8 8.801121E+03 3.534400E-12 3.110668E-08 + 0 9 2.806304E+01 8.065600E-12 2.263452E-10 + 0 10 8.378760E+03 1.060900E-12 8.889027E-09 + 0 11 4.274354E+03 2.190400E-12 9.362545E-09 + 0 12 4.699520E+03 2.025000E-13 9.516527E-10 + 0 13 1.034324E+06 9.000000E-16 9.308918E-10 + 0 14 4.344699E+05 6.400000E-15 2.780607E-09 + 0 15 1.561275E+04 1.024000E-13 1.598746E-09 + 0 16 5.513607E+02 1.681000E-13 9.268374E-11 + 0 17 6.421439E+03 6.250000E-14 4.013399E-10 + 0 18 1.174011E+05 1.000000E-14 1.174011E-09 + 0 19 4.850704E+05 1.600000E-15 7.761127E-10 + 0 20 3.720239E+04 1.600000E-15 5.952382E-11 + 0 21 1.135376E+04 1.440000E-14 1.634942E-10 + 0 22 2.702659E+04 1.960000E-14 5.297212E-10 + 0 23 4.175798E+04 1.000000E-14 4.175798E-10 + 0 24 3.578199E+04 2.500000E-15 8.945498E-11 + 0 25 9.272941E+04 1.000000E-16 9.272941E-12 + 0 26 3.443357E+05 4.000000E-16 1.377343E-10 + 0 27 1.295919E+05 1.600000E-15 2.073470E-10 + 0 28 3.721504E+04 3.600000E-15 1.339741E-10 + 0 29 8.223893E+03 3.600000E-15 2.960602E-11 + 0 30 7.627985E+02 2.500000E-15 1.906996E-12 + 0 31 1.113082E+05 4.000000E-16 4.452329E-11 + 0 33 1.881450E+05 4.000000E-16 7.525802E-11 + 0 34 8.706791E+04 4.000000E-16 3.482716E-11 + 0 35 4.596997E+03 9.000000E-16 4.137297E-12 + 0 36 7.389899E+03 4.000000E-16 2.955959E-12 + 0 37 4.976245E+04 4.000000E-16 1.990498E-11 + 0 38 8.384771E+04 4.000000E-16 3.353909E-11 + 0 39 3.285903E+05 1.000000E-16 3.285903E-11 + 0 40 2.137034E+05 1.000000E-16 2.137034E-11 + 0 42 1.204881E+04 1.000000E-16 1.204881E-12 + 0 43 2.990647E+03 1.000000E-16 2.990647E-13 + 0 44 3.261076E+04 1.000000E-16 3.261076E-12 + 0 45 1.711271E+04 4.000000E-16 6.845086E-12 + 0 46 9.034878E+04 1.000000E-16 9.034878E-12 + 1 0 2.860819E-01 1.296748E-01 3.709762E-02 + 1 1 3.712271E-01 6.040493E-01 2.242395E-01 + 1 2 4.348967E-01 2.417968E-01 1.051566E-01 + 1 3 6.255638E-01 2.347298E-02 1.468385E-02 + 1 4 8.069798E-01 9.839878E-04 7.940583E-04 + 1 5 3.400934E-01 2.193508E-05 7.459975E-06 + 1 6 5.849165E+00 2.484225E-07 1.453064E-06 + 1 7 1.075811E+02 1.195085E-09 1.285685E-07 + 1 8 6.480062E+02 2.975625E-10 1.928224E-07 + 1 9 6.250705E+03 6.812100E-12 4.258043E-08 + 1 10 1.790445E+01 1.915456E-10 3.429519E-09 + 1 11 6.348019E+04 4.900000E-13 3.110529E-08 + 1 12 1.287736E+03 1.705690E-11 2.196478E-08 + 1 13 7.213658E+01 2.722500E-12 1.963918E-10 + 1 14 3.962881E+03 2.340900E-12 9.276708E-09 + 1 15 9.689408E+03 1.144900E-12 1.109340E-08 + 1 16 3.296436E+03 5.625000E-13 1.854245E-09 + 1 17 3.219244E+02 1.664100E-12 5.357144E-10 + 1 18 3.236746E+03 9.801000E-13 3.172335E-09 + 1 19 3.737986E+05 8.100000E-15 3.027768E-09 + 1 20 7.899925E+03 1.225000E-13 9.677409E-10 + 1 21 4.941089E+01 9.000000E-14 4.446980E-12 + 1 22 1.119483E+04 8.410000E-14 9.414851E-10 + 1 23 1.134887E+04 1.600000E-13 1.815820E-09 + 1 24 7.992692E+03 1.444000E-13 1.154145E-09 + 1 25 5.801580E+03 2.250000E-14 1.305356E-10 + 1 26 1.545645E+04 1.000000E-14 1.545645E-10 + 1 27 1.641656E+04 4.410000E-14 7.239704E-10 + 1 28 2.196908E+04 3.610000E-14 7.930836E-10 + 1 29 1.854583E+04 1.960000E-14 3.634983E-10 + 1 30 2.232035E+03 1.440000E-14 3.214131E-11 + 1 31 3.390463E+03 1.210000E-14 4.102460E-11 + 1 32 3.958640E+04 4.900000E-15 1.939734E-10 + 1 33 2.609597E+06 1.000000E-16 2.609597E-10 + 1 34 4.005747E+04 4.900000E-15 1.962816E-10 + 1 35 5.805577E+03 1.440000E-14 8.360030E-11 + 1 36 6.309647E+02 1.690000E-14 1.066330E-11 + 1 37 4.976245E+02 1.000000E-14 4.976245E-12 + 1 38 8.331277E+03 4.900000E-15 4.082326E-11 + 1 39 8.514382E+04 9.000000E-16 7.662944E-11 + 1 40 8.628346E+05 1.000000E-16 8.628346E-11 + 1 42 3.942769E+05 1.000000E-16 3.942769E-11 + 1 43 3.529249E+04 4.000000E-16 1.411700E-11 + 1 44 1.642139E+03 9.000000E-16 1.477926E-12 + 1 45 1.127127E+03 9.000000E-16 1.014415E-12 + 1 46 4.619253E+03 1.600000E-15 7.390804E-12 + 2 0 2.846388E-01 1.330289E-02 3.786519E-03 + 2 1 3.026410E-01 2.187367E-01 6.619868E-02 + 2 2 3.924972E-01 4.018030E-01 1.577066E-01 + 2 3 4.464726E-01 3.179974E-01 1.419771E-01 + 2 4 6.190437E-01 4.553549E-02 2.818846E-02 + 2 5 8.200386E-01 2.551617E-03 2.092424E-03 + 2 6 5.194148E-01 7.174700E-05 3.726646E-05 + 2 7 3.174278E+00 1.078794E-06 3.424392E-06 + 2 8 4.319430E+01 8.903810E-09 3.845938E-07 + 2 9 4.928411E+01 5.995405E-09 2.954782E-07 + 2 10 9.614942E+01 4.297329E-10 4.131857E-08 + 2 11 1.129019E+01 2.355161E-09 2.659021E-08 + 2 12 2.932478E+03 1.102240E-11 3.232295E-08 + 2 13 3.424236E+03 4.161600E-12 1.425030E-08 + 2 14 5.397895E-01 3.733210E-11 2.015148E-11 + 2 15 6.764063E+02 1.747240E-11 1.181844E-08 + 2 16 4.154660E+02 3.856410E-11 1.602207E-08 + 2 17 7.572321E+02 2.528100E-12 1.914359E-09 + 2 18 4.231953E+03 6.889000E-13 2.915392E-09 + 2 19 2.043923E+03 4.161600E-12 8.505991E-09 + 2 20 6.159842E+03 7.056000E-13 4.346384E-09 + 2 21 1.192922E+02 1.795600E-12 2.142010E-10 + 2 22 2.127320E+02 3.240000E-12 6.892517E-10 + 2 23 2.590196E+03 7.921000E-13 2.051694E-09 + 2 24 3.629734E+04 5.760000E-14 2.090727E-09 + 2 25 1.186525E+04 9.000000E-14 1.067873E-09 + 2 26 7.722065E+02 1.444000E-13 1.115066E-10 + 2 27 1.973855E+06 1.000000E-16 1.973855E-10 + 2 28 3.878235E+03 2.704000E-13 1.048675E-09 + 2 29 2.521792E+03 5.625000E-13 1.418508E-09 + 2 30 2.594768E+03 3.249000E-13 8.430403E-10 + 2 31 2.813407E+03 4.840000E-14 1.361689E-10 + 2 32 4.900473E+04 9.000000E-16 4.410425E-11 + 2 33 3.152200E+04 1.210000E-14 3.814162E-10 + 2 34 9.201198E+04 6.400000E-15 5.888766E-10 + 2 35 7.321445E+04 6.400000E-15 4.685725E-10 + 2 36 1.240351E+04 1.690000E-14 2.096193E-10 + 2 37 7.823780E+02 4.410000E-14 3.450287E-11 + 2 38 4.824077E+01 6.760000E-14 3.261076E-12 + 2 39 9.296918E+02 5.760000E-14 5.355025E-11 + 2 40 3.713124E+03 2.890000E-14 1.073093E-10 + 2 41 2.569440E+04 4.900000E-15 1.259026E-10 + 2 42 1.214161E+05 9.000000E-16 1.092745E-10 + 2 43 7.484901E+03 1.000000E-14 7.484901E-11 + 2 44 2.052152E+03 1.960000E-14 4.022219E-11 + 2 45 6.893206E+02 2.250000E-14 1.550971E-11 + 2 46 1.741093E+02 1.690000E-14 2.942447E-12 + 3 0 3.969792E-01 1.214460E-03 4.821153E-04 + 3 1 2.857582E-01 3.601089E-02 1.029041E-02 + 3 2 3.160258E-01 2.717449E-01 8.587839E-02 + 3 3 4.155445E-01 2.461240E-01 1.022755E-01 + 3 4 4.586833E-01 3.663596E-01 1.680430E-01 + 3 5 6.197978E-01 7.307630E-02 4.529253E-02 + 3 6 8.265644E-01 5.281260E-03 4.365302E-03 + 3 7 6.540605E-01 1.844104E-04 1.206156E-04 + 3 8 2.111900E+00 4.018100E-06 8.485828E-06 + 3 9 7.439275E+00 1.112156E-07 8.273633E-07 + 3 10 2.615866E+00 9.317146E-08 2.437241E-07 + 3 11 8.345606E+00 1.879915E-08 1.568903E-07 + 3 12 4.328473E+00 1.435683E-08 6.214316E-08 + 3 13 2.910730E+03 1.474560E-11 4.292046E-08 + 3 14 1.242185E+01 4.351396E-10 5.405237E-09 + 3 15 5.991907E-01 6.400000E-11 3.834821E-11 + 3 16 1.804369E+03 2.433600E-12 4.391112E-09 + 3 17 3.800719E+01 2.452356E-10 9.320717E-09 + 3 18 3.397422E+01 8.262810E-11 2.807226E-09 + 3 19 3.461823E+02 3.686400E-12 1.276166E-09 + 3 20 3.523724E+03 2.528100E-12 8.908326E-09 + 3 21 1.993238E+03 3.312400E-12 6.602401E-09 + 3 22 2.168064E+05 1.600000E-15 3.468903E-10 + 3 23 1.353678E+02 1.281640E-11 1.734928E-09 + 3 24 3.045295E+02 1.421290E-11 4.328247E-09 + 3 25 2.581419E+03 1.144900E-12 2.955466E-09 + 3 26 7.006026E+02 1.020100E-12 7.146848E-10 + 3 27 2.334431E-02 1.060900E-12 2.476598E-14 + 3 28 8.869819E+03 4.410000E-14 3.911590E-10 + 3 29 6.325329E+05 1.600000E-15 1.012053E-09 + 3 30 3.313093E+03 3.969000E-13 1.314967E-09 + 3 31 7.547585E+02 1.368900E-12 1.033189E-09 + 3 32 3.468847E+02 1.123600E-12 3.897597E-10 + 3 33 3.962557E+01 1.369000E-13 5.424741E-12 + 3 34 1.492972E+03 1.444000E-13 2.155852E-10 + 3 35 1.161464E+03 5.929000E-13 6.886321E-10 + 3 36 1.663173E+03 5.329000E-13 8.863047E-10 + 3 37 3.138358E+03 2.116000E-13 6.640766E-10 + 3 38 8.780061E+03 3.240000E-14 2.844740E-10 + 3 39 1.618884E+04 2.500000E-15 4.047209E-11 + 3 40 5.795588E+03 1.600000E-15 9.272941E-12 + 3 41 7.931383E+03 1.210000E-14 9.596973E-11 + 3 42 7.113509E+03 2.560000E-14 1.821058E-10 + 3 43 9.372192E+03 2.250000E-14 2.108743E-10 + 3 44 2.900418E+04 6.400000E-15 1.856268E-10 + 3 45 3.367593E+05 4.000000E-16 1.347037E-10 + 3 46 4.917009E+03 1.690000E-14 8.309744E-11 + 4 0 6.614361E-01 1.091047E-04 7.216579E-05 + 4 1 3.487428E-01 4.548376E-03 1.586213E-03 + 4 2 2.873582E-01 6.430759E-02 1.847931E-02 + 4 3 3.285717E-01 2.937956E-01 9.653293E-02 + 4 4 4.453342E-01 1.329248E-01 5.919597E-02 + 4 5 4.713327E-01 3.893002E-01 1.834899E-01 + 4 6 6.243340E-01 1.049378E-01 6.551622E-02 + 4 7 8.316207E-01 9.629338E-03 8.007957E-03 + 4 8 7.383052E-01 4.281969E-04 3.161400E-04 + 4 9 1.463993E+00 1.623703E-05 2.377091E-05 + 4 10 2.231227E+00 1.498862E-06 3.344300E-06 + 4 11 1.368906E-03 9.628908E-07 1.318107E-09 + 4 12 3.474491E+00 1.894513E-07 6.582468E-07 + 4 13 2.111344E+00 3.611520E-08 7.625160E-08 + 4 14 2.799635E+01 3.384912E-09 9.476518E-08 + 4 15 4.090200E+00 2.949576E-09 1.206436E-08 + 4 16 7.131106E-01 6.250000E-10 4.456941E-10 + 4 17 6.779180E+00 3.232804E-10 2.191576E-09 + 4 18 4.212223E+01 9.196810E-11 3.873901E-09 + 4 19 3.803667E+00 6.240004E-10 2.373490E-09 + 4 20 7.919253E-01 2.981160E-11 2.360856E-11 + 4 21 3.369093E+01 1.136356E-10 3.828489E-09 + 4 22 1.386873E+02 4.121640E-11 5.716192E-09 + 4 23 4.802158E+02 2.656900E-12 1.275885E-09 + 4 24 1.757183E+03 4.096000E-13 7.197422E-10 + 4 25 2.388861E+02 2.016010E-11 4.815967E-09 + 4 26 1.841738E+02 2.683240E-11 4.941826E-09 + 4 27 1.761258E+03 8.281000E-13 1.458497E-09 + 4 28 6.191496E-01 1.004890E-11 6.221772E-12 + 4 29 7.328782E+01 1.369000E-11 1.003310E-09 + 4 30 6.556547E+02 2.822400E-12 1.850520E-09 + 4 31 4.575400E+04 3.610000E-14 1.651719E-09 + 4 32 4.217280E+03 2.304000E-13 9.716613E-10 + 4 33 3.439319E+03 1.024000E-13 3.521862E-10 + 4 34 2.708947E+01 9.216000E-13 2.496566E-11 + 4 35 1.468375E+02 5.625000E-13 8.259610E-11 + 4 36 2.751494E+04 1.690000E-14 4.650024E-10 + 4 37 8.134944E+02 1.102500E-12 8.968776E-10 + 4 38 4.611550E+02 2.280100E-12 1.051480E-09 + 4 39 4.410477E+02 1.876900E-12 8.278025E-10 + 4 40 5.899865E+02 7.056000E-13 4.162945E-10 + 4 41 1.941653E+03 4.840000E-14 9.397601E-11 + 4 42 1.202713E+01 7.290000E-14 8.767777E-13 + 4 43 3.604280E+02 2.601000E-13 9.374731E-11 + 4 44 8.399968E+02 2.916000E-13 2.449431E-10 + 4 45 1.899153E+03 1.849000E-13 3.511533E-10 + 4 46 4.800534E+03 7.840000E-14 3.763619E-10 + 5 0 7.679795E-01 1.003800E-05 7.708977E-06 + 5 1 5.135189E-01 5.231224E-04 2.686332E-04 + 5 2 3.209021E-01 1.058370E-02 3.396333E-03 + 5 3 2.914106E-01 9.456979E-02 2.755864E-02 + 5 4 3.413670E-01 2.898770E-01 9.895446E-02 + 5 5 4.932913E-01 5.700321E-02 2.811919E-02 + 5 6 4.846433E-01 3.891161E-01 1.885825E-01 + 5 7 6.303368E-01 1.406105E-01 8.863199E-02 + 5 8 8.317352E-01 1.658186E-02 1.379172E-02 + 5 9 7.937620E-01 1.024552E-03 8.132503E-04 + 5 10 1.103726E+00 7.804539E-05 8.614070E-05 + 5 11 1.305280E+00 1.465213E-05 1.912514E-05 + 5 12 2.282976E-01 6.405354E-06 1.462327E-06 + 5 13 2.166238E+00 9.190098E-07 1.990794E-06 + 5 14 2.233820E+00 4.264225E-08 9.525511E-08 + 5 15 1.128966E+01 1.369602E-08 1.546234E-07 + 5 16 1.839298E+02 2.924100E-10 5.378291E-08 + 5 17 7.562507E-02 1.122328E-08 8.487616E-10 + 5 18 1.979118E+02 1.568160E-11 3.103574E-09 + 5 19 6.149450E+00 4.844401E-10 2.979040E-09 + 5 20 6.470233E+00 3.519376E-10 2.277118E-09 + 5 21 4.563362E-01 6.838225E-10 3.120529E-10 + 5 22 5.877850E+01 1.444000E-11 8.487616E-10 + 5 23 7.248567E+00 4.190209E-10 3.037301E-09 + 5 24 1.382508E+01 1.157776E-10 1.600634E-09 + 5 25 3.274309E+00 8.236900E-12 2.697016E-11 + 5 26 1.508227E+02 1.672810E-11 2.522977E-09 + 5 27 8.845836E+02 5.198400E-12 4.598419E-09 + 5 28 9.666611E+01 2.590810E-11 2.504435E-09 + 5 29 5.749392E+01 1.742400E-12 1.001774E-10 + 5 30 5.350812E+01 1.681000E-11 8.994716E-10 + 5 31 7.668647E+01 3.648160E-11 2.797645E-09 + 5 32 2.009547E+02 1.459240E-11 2.932412E-09 + 5 33 3.575506E+04 4.410000E-14 1.576798E-09 + 5 34 9.000551E+01 4.080400E-12 3.672585E-10 + 5 35 1.770072E-04 4.284900E-12 7.584582E-16 + 5 36 2.869764E+02 7.396000E-13 2.122477E-10 + 5 37 8.674511E+03 6.760000E-14 5.863970E-10 + 5 38 3.037847E+03 2.916000E-13 8.858363E-10 + 5 39 1.121445E+06 9.000000E-16 1.009301E-09 + 5 40 1.554716E+03 5.929000E-13 9.217913E-10 + 5 41 3.566302E+02 1.849600E-12 6.596231E-10 + 5 42 1.533244E+02 2.190400E-12 3.358417E-10 + 5 43 6.510412E+01 1.345600E-12 8.760411E-11 + 5 44 3.607411E-02 3.364000E-13 1.213533E-14 + 5 45 7.469448E+04 9.000000E-16 6.722503E-11 + 5 46 7.436828E+02 2.916000E-13 2.168579E-10 + 6 0 9.780821E-02 9.577754E-07 9.367829E-08 + 6 1 6.402587E-01 5.927091E-05 3.794872E-05 + 6 2 4.353387E-01 1.509060E-03 6.569522E-04 + 6 3 3.051921E-01 1.962866E-02 5.990513E-03 + 6 4 2.971084E-01 1.233828E-01 3.665806E-02 + 6 5 3.554477E-01 2.637629E-01 9.375394E-02 + 6 6 6.211757E-01 1.317428E-02 8.183540E-03 + 6 7 4.987320E-01 3.651061E-01 1.820901E-01 + 6 8 6.373361E-01 1.811156E-01 1.154315E-01 + 6 9 8.245098E-01 2.891317E-02 2.383919E-02 + 6 10 8.218771E-01 2.804254E-03 2.304752E-03 + 6 11 9.374493E-01 4.042488E-04 3.789628E-04 + 6 12 1.037549E+00 1.020318E-04 1.058631E-04 + 6 13 5.114449E-01 3.250094E-05 1.662244E-05 + 6 14 1.644824E+00 3.959543E-06 6.512751E-06 + 6 15 2.173240E+00 1.669621E-07 3.628488E-07 + 6 16 3.034173E+01 2.605082E-09 7.904267E-08 + 6 17 7.966196E+00 2.745318E-08 2.186974E-07 + 6 18 6.219221E-02 3.178019E-08 1.976480E-09 + 6 19 2.266997E+00 2.989902E-09 6.778101E-09 + 6 20 7.830940E+00 7.123561E-10 5.578418E-09 + 6 21 4.211953E+00 5.400976E-10 2.274866E-09 + 6 22 2.425634E+00 5.726449E-10 1.389027E-09 + 6 23 2.850113E-03 3.367225E-10 9.596973E-13 + 6 24 6.360236E+00 1.739761E-10 1.106529E-09 + 6 25 2.424000E+00 6.395841E-10 1.550352E-09 + 6 26 1.550992E+00 1.223236E-10 1.897229E-10 + 6 27 1.818936E+01 3.036010E-11 5.522308E-10 + 6 28 3.206637E+01 7.259040E-11 2.327711E-09 + 6 29 6.300528E+02 3.422500E-12 2.156356E-09 + 6 30 3.686609E+01 1.122250E-11 4.137297E-10 + 6 31 5.644525E+01 4.326400E-12 2.442047E-10 + 6 32 2.742062E+02 7.236100E-12 1.984184E-09 + 6 33 9.287177E+01 3.340840E-11 3.102697E-09 + 6 34 9.435516E+01 2.430490E-11 2.293293E-09 + 6 35 3.605622E+02 2.073600E-12 7.476618E-10 + 6 36 2.272557E+00 4.080400E-12 9.272941E-12 + 6 37 2.281885E+01 1.346890E-11 3.073449E-10 + 6 38 8.631257E+01 1.082410E-11 9.342559E-10 + 6 39 3.901391E+02 3.276100E-12 1.278135E-09 + 6 40 1.351607E+04 9.000000E-14 1.216447E-09 + 6 41 2.727396E+03 3.364000E-13 9.174961E-10 + 6 42 1.131348E+03 5.041000E-13 5.703126E-10 + 6 43 2.314659E+03 1.225000E-13 2.835457E-10 + 6 44 3.742798E+03 2.560000E-14 9.581563E-11 + 6 45 2.950770E+01 3.249000E-13 9.587052E-12 + 6 46 1.602736E+01 5.476000E-13 8.776585E-12 + 7 0 1.954091E+00 9.646615E-08 1.885036E-07 + 7 1 3.350369E-01 6.964796E-06 2.333464E-06 + 7 2 5.694118E-01 2.092385E-04 1.191429E-04 + 7 3 3.822035E-01 3.434805E-03 1.312795E-03 + 7 4 2.961240E-01 3.193392E-02 9.456401E-03 + 7 5 3.042692E-01 1.473015E-01 4.481931E-02 + 7 6 3.732986E-01 2.170224E-01 8.101417E-02 + 7 7 1.122296E-01 2.634931E-04 2.957173E-05 + 7 8 5.139748E-01 3.082083E-01 1.584113E-01 + 7 9 6.447351E-01 2.266042E-01 1.460997E-01 + 7 10 8.099518E-01 5.342940E-02 4.327524E-02 + 7 11 8.274977E-01 8.766403E-03 7.254178E-03 + 7 12 8.778275E-01 2.022345E-03 1.775270E-03 + 7 13 9.553147E-01 5.944458E-04 5.678829E-04 + 7 14 7.350665E-01 1.704983E-04 1.253276E-04 + 7 15 1.273385E+00 2.713472E-05 3.455294E-05 + 7 16 1.356616E+00 3.481769E-06 4.723426E-06 + 7 17 3.595703E-01 9.079803E-07 3.264827E-07 + 7 18 2.539032E+00 4.012842E-07 1.018873E-06 + 7 19 2.934114E-01 9.857088E-08 2.892183E-08 + 7 20 1.393087E+00 1.597601E-09 2.225596E-09 + 7 21 1.326407E+01 1.957178E-09 2.596014E-08 + 7 22 3.802719E-01 4.487660E-09 1.706531E-09 + 7 23 1.826328E+03 1.488400E-12 2.718307E-09 + 7 24 7.572464E-01 3.783025E-10 2.864682E-10 + 7 25 2.901522E+00 6.368040E-11 1.847701E-10 + 7 26 3.426274E+00 4.214809E-10 1.444109E-09 + 7 27 1.937194E+00 5.148361E-10 9.973374E-10 + 7 28 1.013789E+00 3.696640E-11 3.747613E-11 + 7 29 5.698363E+00 8.445610E-11 4.812615E-10 + 7 30 9.978049E+00 1.227664E-10 1.224969E-09 + 7 31 3.868498E+01 1.797760E-11 6.954630E-10 + 7 32 9.821187E-01 3.422500E-12 3.361301E-12 + 7 33 1.043408E+02 6.002500E-12 6.263057E-10 + 7 34 2.880246E+03 6.084000E-13 1.752342E-09 + 7 35 1.301290E+02 1.444000E-11 1.879062E-09 + 7 36 5.809846E+01 1.697440E-11 9.861865E-10 + 7 37 4.036278E+01 3.572100E-12 1.441799E-10 + 7 38 5.097108E+01 1.345600E-12 6.858668E-11 + 7 39 5.307831E+01 1.128960E-11 5.992328E-10 + 7 40 7.254646E+01 1.592010E-11 1.154947E-09 + 7 41 1.260113E+02 1.056250E-11 1.330994E-09 + 7 42 3.306502E+02 3.348900E-12 1.107314E-09 + 7 43 3.971998E+03 1.764000E-13 7.006604E-10 + 7 44 9.804179E+02 3.364000E-13 3.298126E-10 + 7 45 8.859768E+01 1.123600E-12 9.954836E-11 + 7 46 6.648010E+00 1.254400E-12 8.339264E-12 + 8 0 1.303657E+01 1.097256E-08 1.430446E-07 + 8 1 3.321887E-02 9.051810E-07 3.006909E-08 + 8 2 4.894242E-01 3.077354E-05 1.506131E-05 + 8 3 4.963371E-01 5.909532E-04 2.933120E-04 + 8 4 3.414981E-01 6.919162E-03 2.362881E-03 + 8 5 2.918524E-01 4.797164E-02 1.400064E-02 + 8 6 3.147932E-01 1.615816E-01 5.086479E-02 + 8 7 4.006640E-01 1.497186E-01 5.998686E-02 + 8 8 3.399111E-01 2.694744E-02 9.159735E-03 + 8 9 5.294401E-01 2.016233E-01 1.067475E-01 + 8 10 6.516958E-01 2.615298E-01 1.704378E-01 + 8 11 7.944570E-01 1.006021E-01 7.992405E-02 + 8 12 8.279795E-01 2.816196E-02 2.331753E-02 + 8 13 8.655765E-01 9.451373E-03 8.180886E-03 + 8 14 9.315728E-01 3.378882E-03 3.147674E-03 + 8 15 8.715015E-01 1.111324E-03 9.685201E-04 + 8 16 1.089861E+00 2.792993E-04 3.043974E-04 + 8 17 1.143167E+00 6.960632E-05 7.957161E-05 + 8 18 8.937139E-01 2.218928E-05 1.983087E-05 + 8 19 1.448675E+00 6.944753E-06 1.006069E-05 + 8 20 9.013972E-01 1.697444E-06 1.530071E-06 + 8 21 1.140954E+00 2.375588E-07 2.710436E-07 + 8 22 2.086922E+00 1.389277E-07 2.899312E-07 + 8 23 2.324791E-01 4.678136E-08 1.087569E-08 + 8 24 1.004652E+01 1.796912E-09 1.805271E-08 + 8 25 5.040472E-01 9.486400E-10 4.781594E-10 + 8 26 8.686981E-02 1.449325E-09 1.259026E-10 + 8 27 1.153324E+01 2.241009E-10 2.584610E-09 + 8 28 4.093107E+00 3.415104E-10 1.397839E-09 + 8 29 2.205081E+00 3.334276E-10 7.352349E-10 + 8 30 4.785119E-03 7.452900E-12 3.566302E-14 + 8 31 2.244835E+00 1.592644E-10 3.575223E-10 + 8 32 5.606768E+00 1.413721E-10 7.926405E-10 + 8 33 2.782436E+01 1.428840E-11 3.975656E-10 + 8 34 3.576513E-02 5.428900E-12 1.941653E-13 + 8 35 4.189407E+01 1.162810E-11 4.871484E-10 + 8 36 2.020567E+03 5.625000E-13 1.136569E-09 + 8 37 2.045062E+02 4.884100E-12 9.988290E-10 + 8 38 3.568589E+01 1.030410E-11 3.677110E-10 + 8 39 2.204496E+00 3.960100E-12 8.730025E-12 + 8 40 1.044319E+03 1.296000E-13 1.353438E-10 + 8 41 7.510640E+01 6.350400E-12 4.769557E-10 + 8 42 5.466683E+01 1.346890E-11 7.363021E-10 + 8 43 5.946313E+01 1.332250E-11 7.921975E-10 + 8 44 8.545536E+01 7.840000E-12 6.699700E-10 + 8 45 1.837628E+02 2.496400E-12 4.587455E-10 + 8 46 1.553296E+03 1.600000E-13 2.485274E-10 + 9 0 1.020448E+01 1.654862E-09 1.688701E-08 + 9 1 1.585664E+00 1.421139E-07 2.253450E-07 + 9 2 1.342137E-01 5.224653E-06 7.012201E-07 + 9 3 5.287446E-01 1.106498E-04 5.850547E-05 + 9 4 4.207031E-01 1.500513E-03 6.312706E-04 + 9 5 3.122809E-01 1.304625E-02 4.074095E-03 + 9 6 2.933254E-01 6.718172E-02 1.970610E-02 + 9 7 3.324804E-01 1.559371E-01 5.184603E-02 + 9 8 4.549720E-01 6.588655E-02 2.997653E-02 + 9 9 4.313499E-01 1.015073E-01 4.378516E-02 + 9 10 5.342563E-01 5.764894E-02 3.079931E-02 + 9 11 6.572675E-01 2.253194E-01 1.480951E-01 + 9 12 7.855751E-01 1.618784E-01 1.271677E-01 + 9 13 8.318933E-01 7.861874E-02 6.540240E-02 + 9 14 8.709880E-01 3.897691E-02 3.394842E-02 + 9 15 9.295426E-01 1.877896E-02 1.745584E-02 + 9 16 9.381111E-01 8.312365E-03 7.797921E-03 + 9 17 1.035628E+00 3.243590E-03 3.359151E-03 + 9 18 1.088985E+00 1.244823E-03 1.355594E-03 + 9 19 1.056224E+00 5.011433E-04 5.293197E-04 + 9 20 1.190818E+00 1.931116E-04 2.299607E-04 + 9 21 1.133012E+00 6.974221E-05 7.901878E-05 + 9 22 1.188131E+00 2.393000E-05 2.843198E-05 + 9 23 1.342505E+00 9.567515E-06 1.284444E-05 + 9 24 1.094792E+00 3.379310E-06 3.699642E-06 + 9 25 1.471325E+00 1.004525E-06 1.477983E-06 + 9 26 1.202131E+00 3.922642E-07 4.715530E-07 + 9 27 1.138205E+00 1.420838E-07 1.617204E-07 + 9 28 2.024630E+00 3.881688E-08 7.858982E-08 + 9 29 5.896054E-01 1.012438E-08 5.969392E-09 + 9 30 1.574832E+00 6.998996E-09 1.102224E-08 + 9 31 1.801530E+00 8.248384E-10 1.485971E-09 + 9 32 5.681083E-01 1.092025E-10 6.203885E-11 + 9 33 1.757667E+00 5.832225E-10 1.025111E-09 + 9 34 1.248968E+01 2.143690E-11 2.677401E-10 + 9 35 1.853646E+01 2.097640E-11 3.888282E-10 + 9 36 1.097140E-02 2.134440E-11 2.341779E-13 + 9 37 2.010022E+01 1.253160E-11 2.518879E-10 + 9 38 1.829523E+02 4.665600E-12 8.535825E-10 + 9 39 9.285557E+02 9.025000E-13 8.380215E-10 + 9 40 7.088036E+01 4.752400E-12 3.368518E-10 + 9 41 1.995664E+00 3.724900E-12 7.433649E-12 + 9 42 6.147847E+02 2.025000E-13 1.244939E-10 + 9 43 2.607138E+02 1.512900E-12 3.944340E-10 + 9 44 8.440803E+01 6.250000E-12 5.275502E-10 + 9 45 5.243106E+01 9.241600E-12 4.845469E-10 + 9 46 4.227262E+01 8.468100E-12 3.579688E-10 + 10 0 3.796737E+00 3.857296E-10 1.464514E-09 + 10 1 3.388964E+00 2.917947E-08 9.888817E-08 + 10 2 2.318483E-02 1.077672E-06 2.498565E-08 + 10 3 3.913089E-01 2.387251E-05 9.341525E-06 + 10 4 4.843175E-01 3.523850E-04 1.706662E-04 + 10 5 3.545925E-01 3.486651E-03 1.236340E-03 + 10 6 2.948165E-01 2.251765E-02 6.638575E-03 + 10 7 3.038933E-01 8.008483E-02 2.433724E-02 + 10 8 3.683210E-01 1.086591E-01 4.002143E-02 + 10 9 9.196290E-01 1.812076E-03 1.666438E-03 + 10 10 4.924348E-01 1.513750E-01 7.454230E-02 + 10 11 7.157504E-01 7.553447E-03 5.406383E-03 + 10 12 6.417815E-01 5.943518E-02 3.814440E-02 + 10 13 7.859745E-01 1.295086E-01 1.017904E-01 + 10 14 8.430024E-01 1.265369E-01 1.066709E-01 + 10 15 8.858426E-01 1.046064E-01 9.266484E-02 + 10 16 9.405895E-01 7.756784E-02 7.295950E-02 + 10 17 9.725960E-01 5.207222E-02 5.064524E-02 + 10 18 1.030769E+00 3.188115E-02 3.286209E-02 + 10 19 1.079321E+00 1.869123E-02 2.017384E-02 + 10 20 1.101271E+00 1.079358E-02 1.188665E-02 + 10 21 1.152442E+00 6.045742E-03 6.967367E-03 + 10 22 1.175650E+00 3.294652E-03 3.873357E-03 + 10 23 1.206726E+00 1.759936E-03 2.123760E-03 + 10 24 1.247082E+00 9.420793E-04 1.174850E-03 + 10 25 1.244398E+00 4.922417E-04 6.125444E-04 + 10 26 1.284835E+00 2.512330E-04 3.227928E-04 + 10 27 1.293430E+00 1.290219E-04 1.668807E-04 + 10 28 1.299274E+00 6.486112E-05 8.427239E-05 + 10 29 1.331838E+00 3.180881E-05 4.236418E-05 + 10 30 1.295768E+00 1.545685E-05 2.002850E-05 + 10 31 1.343378E+00 7.503874E-06 1.008054E-05 + 10 32 1.331968E+00 3.437390E-06 4.578494E-06 + 10 33 1.288288E+00 1.574925E-06 2.028956E-06 + 10 34 1.355305E+00 7.284452E-07 9.872651E-07 + 10 35 1.285027E+00 2.945341E-07 3.784844E-07 + 10 36 1.321019E+00 1.318416E-07 1.741653E-07 + 10 37 1.250402E+00 5.257849E-08 6.574424E-08 + 10 38 1.281156E+00 1.888700E-08 2.419719E-08 + 10 39 1.485689E+00 8.046090E-09 1.195398E-08 + 10 40 5.397940E-01 2.426548E-09 1.309836E-09 + 10 41 3.710496E+00 8.003241E-10 2.969599E-09 + 10 42 7.220289E-06 3.087049E-10 2.228939E-15 + 10 43 5.610429E+00 4.678560E-11 2.624873E-10 + 10 44 3.797417E+00 2.199610E-11 8.352837E-11 + 10 45 2.393382E+01 6.400900E-12 1.531980E-10 + 10 46 8.323086E+02 5.329000E-13 4.435372E-10 + 11 0 4.837218E+01 8.500840E-11 4.112042E-09 + 11 1 2.713127E+00 5.371424E-09 1.457336E-08 + 11 2 2.858356E-01 1.887034E-07 5.393813E-08 + 11 3 2.310504E-01 4.208857E-06 9.724584E-07 + 11 4 4.965457E-01 6.413527E-05 3.184609E-05 + 11 5 3.901918E-01 6.770295E-04 2.641714E-04 + 11 6 3.052028E-01 4.826720E-03 1.473128E-03 + 11 7 2.952022E-01 2.090348E-02 6.170753E-03 + 11 8 3.370055E-01 4.138879E-02 1.394825E-02 + 11 9 4.736619E-01 1.419364E-02 6.722987E-03 + 11 10 4.350921E-01 2.882219E-02 1.254031E-02 + 11 11 5.308046E-01 1.617816E-02 8.587444E-03 + 11 12 6.561893E-01 5.216118E-02 3.422761E-02 + 11 13 8.122817E-01 1.895612E-02 1.539771E-02 + 11 14 1.017667E+00 2.278116E-04 2.318365E-04 + 11 15 8.645876E-01 6.411184E-03 5.543030E-03 + 11 16 9.081343E-01 2.392901E-02 2.173075E-02 + 11 17 9.655421E-01 4.401067E-02 4.249416E-02 + 11 18 1.001209E+00 6.026607E-02 6.033892E-02 + 11 19 1.047009E+00 6.923748E-02 7.249228E-02 + 11 20 1.091935E+00 7.182544E-02 7.842871E-02 + 11 21 1.124939E+00 7.021423E-02 7.898672E-02 + 11 22 1.161561E+00 6.567611E-02 7.628679E-02 + 11 23 1.191743E+00 5.948256E-02 7.088792E-02 + 11 24 1.218796E+00 5.263032E-02 6.414561E-02 + 11 25 1.244733E+00 4.589185E-02 5.712309E-02 + 11 26 1.263810E+00 3.951064E-02 4.993395E-02 + 11 27 1.282235E+00 3.366685E-02 4.316882E-02 + 11 28 1.296365E+00 2.850228E-02 3.694934E-02 + 11 29 1.306783E+00 2.397824E-02 3.133437E-02 + 11 30 1.315419E+00 2.005813E-02 2.638485E-02 + 11 31 1.319438E+00 1.669933E-02 2.203372E-02 + 11 32 1.321871E+00 1.384106E-02 1.829609E-02 + 11 33 1.321103E+00 1.141042E-02 1.507433E-02 + 11 34 1.317376E+00 9.359378E-03 1.232982E-02 + 11 35 1.312078E+00 7.635114E-03 1.001786E-02 + 11 36 1.303663E+00 6.184569E-03 8.062592E-03 + 11 37 1.293803E+00 4.975588E-03 6.437429E-03 + 11 38 1.281612E+00 3.967995E-03 5.085431E-03 + 11 39 1.267721E+00 3.133094E-03 3.971888E-03 + 11 40 1.252771E+00 2.446412E-03 3.064793E-03 + 11 41 1.235016E+00 1.883991E-03 2.326759E-03 + 11 42 1.218254E+00 1.428338E-03 1.740079E-03 + 11 43 1.197712E+00 1.062706E-03 1.272815E-03 + 11 44 1.178753E+00 7.730029E-04 9.111798E-04 + 11 45 1.157718E+00 5.474449E-04 6.337869E-04 + 11 46 1.135769E+00 3.751667E-04 4.261026E-04 +[transition-N2lbh] + 2040 0 0 0 5 +c data calculated with LEVEL_8.0 +c using Potentialenergyfunctions retrieved via RKR1 2.0 +c with Spectroscopic constants from +c Spelsberg & Meyer j.chem.phys.,vol.115,no.14,(2001) +c documented in ESA report Aerothermochemistry +c +c vu vl sumre2/fcf FCF SRe2 + 0 0 3.457441E-05 4.281404E-02 1.480270E-06 + 0 1 3.457445E-05 1.514844E-01 5.237491E-06 + 0 2 3.457438E-05 2.482599E-01 8.583432E-06 + 0 3 3.457445E-05 2.501098E-01 8.647408E-06 + 0 4 3.457444E-05 1.733836E-01 5.994640E-06 + 0 5 3.457446E-05 8.773359E-02 3.033341E-06 + 0 6 3.457431E-05 3.354738E-02 1.159877E-06 + 0 7 3.457449E-05 9.901502E-03 3.423394E-07 + 0 8 3.457453E-05 2.284490E-03 7.898517E-08 + 0 9 3.457363E-05 4.147031E-04 1.433779E-08 + 0 10 3.457692E-05 5.931649E-05 2.050981E-09 + 0 11 3.457291E-05 6.663832E-06 2.303881E-10 + 0 12 3.454563E-05 5.833293E-07 2.015148E-11 + 0 13 3.455463E-05 3.924757E-08 1.356185E-12 + 0 14 3.497840E-05 1.986485E-09 6.948406E-14 + 0 15 3.578410E-05 7.310250E-11 2.615907E-15 + 0 16 3.347478E-05 1.849600E-12 6.191496E-17 + 0 17 0.000000E+00 2.890000E-14 0.000000E+00 + 0 18 0.000000E+00 1.000000E-16 0.000000E+00 + 1 0 3.457437E-05 1.154141E-01 3.990371E-06 + 1 1 3.457442E-05 1.932129E-01 6.680223E-06 + 1 2 3.457434E-05 8.086595E-02 2.795887E-06 + 1 3 3.457423E-05 4.199721E-04 1.452021E-08 + 1 4 3.457434E-05 8.840941E-02 3.056697E-06 + 1 5 3.457445E-05 1.866727E-01 6.454107E-06 + 1 6 3.457444E-05 1.754951E-01 6.067646E-06 + 1 7 3.457447E-05 1.023570E-01 3.538938E-06 + 1 8 3.457441E-05 4.150672E-02 1.435070E-06 + 1 9 3.457434E-05 1.233979E-02 4.266401E-07 + 1 10 3.457468E-05 2.764404E-03 9.557838E-08 + 1 11 3.457360E-05 4.730329E-04 1.635445E-08 + 1 12 3.457397E-05 6.209487E-05 2.146866E-09 + 1 13 3.456772E-05 6.233261E-06 2.154696E-10 + 1 14 3.455369E-05 4.733990E-07 1.635768E-11 + 1 15 3.456178E-05 2.666362E-08 9.215422E-13 + 1 16 3.454459E-05 1.075840E-09 3.716445E-14 + 1 17 3.384707E-05 2.926810E-11 9.906393E-16 + 1 18 3.251153E-05 4.761000E-13 1.547874E-17 + 1 19 0.000000E+00 3.600000E-15 0.000000E+00 + 2 0 3.457435E-05 1.703516E-01 5.889798E-06 + 2 1 3.457437E-05 9.742025E-02 3.368244E-06 + 2 2 3.457444E-05 3.153209E-03 1.090204E-07 + 2 3 3.457440E-05 1.075887E-01 3.719814E-06 + 2 4 3.457445E-05 8.583076E-02 2.967551E-06 + 2 5 3.457382E-05 7.095687E-04 2.453250E-08 + 2 6 3.457438E-05 6.661477E-02 2.303164E-06 + 2 7 3.457442E-05 1.664327E-01 5.754315E-06 + 2 8 3.457437E-05 1.614633E-01 5.582493E-06 + 2 9 3.457436E-05 9.245262E-02 3.196490E-06 + 2 10 3.457448E-05 3.572184E-02 1.235064E-06 + 2 11 3.457423E-05 9.890659E-03 3.419619E-07 + 2 12 3.457418E-05 2.021906E-03 6.990575E-08 + 2 13 3.457374E-05 3.093180E-04 1.069428E-08 + 2 14 3.457322E-05 3.549490E-05 1.227173E-09 + 2 15 3.458334E-05 3.032613E-06 1.048779E-10 + 2 16 3.453380E-05 1.893729E-07 6.539768E-12 + 2 17 3.480684E-05 8.346650E-09 2.905205E-13 + 2 18 3.368985E-05 2.430481E-10 8.188253E-15 + 2 19 3.414093E-05 4.080400E-12 1.393087E-16 + 2 20 0.000000E+00 2.560000E-14 0.000000E+00 + 3 0 3.457440E-05 1.829223E-01 6.324430E-06 + 3 1 3.457453E-05 1.256506E-02 4.344310E-07 + 3 2 3.457438E-05 7.503137E-02 2.594163E-06 + 3 3 3.457438E-05 6.948376E-02 2.402358E-06 + 3 4 3.457459E-05 3.702850E-03 1.280245E-07 + 3 5 3.457447E-05 9.582641E-02 3.313147E-06 + 3 6 3.457438E-05 6.488540E-02 2.243372E-06 + 3 7 3.457568E-05 3.179981E-04 1.099500E-08 + 3 8 3.457435E-05 8.205911E-02 2.837140E-06 + 3 9 3.457442E-05 1.659439E-01 5.737415E-06 + 3 10 3.457437E-05 1.421119E-01 4.913429E-06 + 3 11 3.457447E-05 7.273135E-02 2.514648E-06 + 3 12 3.457431E-05 2.504588E-02 8.659438E-07 + 3 13 3.457415E-05 6.124333E-03 2.117436E-07 + 3 14 3.457466E-05 1.090845E-03 3.771561E-08 + 3 15 3.457452E-05 1.428047E-04 4.937402E-09 + 3 16 3.457867E-05 1.368919E-05 4.733538E-10 + 3 17 3.459155E-05 9.447062E-07 3.267885E-11 + 3 18 3.455930E-05 4.529235E-08 1.565272E-12 + 3 19 3.453669E-05 1.405500E-09 4.854133E-14 + 3 20 3.146072E-05 2.410810E-11 7.584582E-16 + 3 21 1.130660E-04 1.369000E-13 1.547874E-17 + 3 22 0.000000E+00 1.000000E-16 0.000000E+00 + 4 0 3.457444E-05 1.602409E-01 5.540240E-06 + 4 1 3.457431E-05 6.007056E-03 2.076898E-07 + 4 2 3.457444E-05 9.659855E-02 3.339841E-06 + 4 3 3.457450E-05 6.225025E-04 2.152272E-08 + 4 4 3.457446E-05 7.754821E-02 2.681188E-06 + 4 5 3.457434E-05 3.691650E-02 1.276364E-06 + 4 6 3.457433E-05 1.773575E-02 6.132015E-07 + 4 7 3.457440E-05 9.734834E-02 3.365760E-06 + 4 8 3.457442E-05 3.426530E-02 1.184703E-06 + 4 9 3.457442E-05 1.105854E-02 3.823427E-07 + 4 10 3.457435E-05 1.137978E-01 3.934485E-06 + 4 11 3.457443E-05 1.643499E-01 5.682306E-06 + 4 12 3.457444E-05 1.153035E-01 3.986552E-06 + 4 13 3.457431E-05 4.997805E-02 1.727956E-06 + 4 14 3.457451E-05 1.467657E-02 5.074352E-07 + 4 15 3.457456E-05 3.045476E-03 1.052960E-07 + 4 16 3.457541E-05 4.543655E-04 1.570987E-08 + 4 17 3.457240E-05 4.877053E-05 1.686114E-09 + 4 18 3.456425E-05 3.709283E-06 1.282086E-10 + 4 19 3.456637E-05 1.927034E-07 6.661059E-12 + 4 20 3.459421E-05 6.336160E-09 2.191944E-13 + 4 21 3.594156E-05 1.102500E-10 3.962557E-15 + 4 22 2.826651E-05 5.476000E-13 1.547874E-17 + 4 23 0.000000E+00 2.500000E-15 0.000000E+00 + 4 24 0.000000E+00 1.000000E-16 0.000000E+00 + 5 0 3.457443E-05 1.217879E-01 4.210747E-06 + 5 1 3.457442E-05 4.609400E-02 1.593673E-06 + 5 2 3.457446E-05 4.717849E-02 1.631171E-06 + 5 3 3.457452E-05 3.355306E-02 1.160081E-06 + 5 4 3.457441E-05 5.668917E-02 1.959995E-06 + 5 5 3.457448E-05 8.594946E-03 2.971658E-07 + 5 6 3.457439E-05 7.891979E-02 2.728604E-06 + 5 7 3.457434E-05 7.182479E-03 2.483295E-07 + 5 8 3.457436E-05 4.895681E-02 1.692650E-06 + 5 9 3.457446E-05 8.444887E-02 2.919774E-06 + 5 10 3.457432E-05 6.237927E-03 2.156721E-07 + 5 11 3.457449E-05 4.436703E-02 1.533967E-06 + 5 12 3.457437E-05 1.459007E-01 5.044424E-06 + 5 13 3.457442E-05 1.491297E-01 5.156073E-06 + 5 14 3.457440E-05 8.297426E-02 2.868785E-06 + 5 15 3.457432E-05 2.947184E-02 1.018969E-06 + 5 16 3.457415E-05 7.140504E-03 2.468769E-07 + 5 17 3.457505E-05 1.213989E-03 4.197372E-08 + 5 18 3.457279E-05 1.457049E-04 5.037426E-09 + 5 19 3.457876E-05 1.218338E-05 4.212862E-10 + 5 20 3.454742E-05 6.833668E-07 2.360856E-11 + 5 21 3.460714E-05 2.366059E-08 8.188253E-13 + 5 22 3.380540E-05 4.120900E-10 1.393087E-14 + 5 23 3.720627E-05 1.664100E-12 6.191496E-17 + 5 24 0.000000E+00 1.960000E-14 0.000000E+00 + 5 25 0.000000E+00 9.000000E-16 0.000000E+00 + 6 0 3.457436E-05 8.342444E-02 2.884346E-06 + 6 1 3.457447E-05 8.448969E-02 2.921186E-06 + 6 2 3.457422E-05 4.812062E-03 1.663733E-07 + 6 3 3.457446E-05 7.261485E-02 2.510619E-06 + 6 4 3.457441E-05 2.826475E-03 9.772371E-08 + 6 5 3.457436E-05 6.360264E-02 2.199021E-06 + 6 6 3.457428E-05 1.435037E-02 4.961538E-07 + 6 7 3.457448E-05 4.160566E-02 1.438494E-06 + 6 8 3.457449E-05 5.379131E-02 1.859807E-06 + 6 9 3.457443E-05 2.809070E-03 9.712199E-08 + 6 10 3.457435E-05 8.106812E-02 2.802878E-06 + 6 11 3.457445E-05 4.798826E-02 1.659168E-06 + 6 12 3.457414E-05 3.214474E-03 1.111377E-07 + 6 13 3.457438E-05 9.583287E-02 3.313362E-06 + 6 14 3.457446E-05 1.603271E-01 5.543223E-06 + 6 15 3.457443E-05 1.181210E-01 4.083965E-06 + 6 16 3.457436E-05 5.130812E-02 1.773945E-06 + 6 17 3.457443E-05 1.457206E-02 5.038208E-07 + 6 18 3.457443E-05 2.825620E-03 9.769419E-08 + 6 19 3.457370E-05 3.788847E-04 1.309945E-08 + 6 20 3.457525E-05 3.475527E-05 1.201672E-09 + 6 21 3.456679E-05 2.096965E-06 7.248533E-11 + 6 22 3.458415E-05 7.597190E-08 2.627423E-12 + 6 23 3.457699E-05 1.305377E-09 4.513600E-14 + 6 24 3.778989E-05 3.686400E-12 1.393087E-16 + 6 25 1.263571E-04 1.225000E-13 1.547874E-17 + 6 26 0.000000E+00 4.900000E-15 0.000000E+00 + 6 27 0.000000E+00 1.000000E-16 0.000000E+00 + 6 28 0.000000E+00 1.000000E-16 0.000000E+00 + 6 29 0.000000E+00 1.000000E-16 0.000000E+00 + 6 30 0.000000E+00 1.000000E-16 0.000000E+00 + 7 0 3.457433E-05 5.284080E-02 1.826935E-06 + 7 1 3.457444E-05 9.921551E-02 3.430321E-06 + 7 2 3.457431E-05 5.455192E-03 1.886095E-07 + 7 3 3.457431E-05 5.676423E-02 1.962584E-06 + 7 4 3.457443E-05 1.702179E-02 5.885187E-07 + 7 5 3.457433E-05 4.675873E-02 1.616652E-06 + 7 6 3.457440E-05 1.318965E-02 4.560241E-07 + 7 7 3.457439E-05 5.682534E-02 1.964701E-06 + 7 8 3.457380E-05 1.421748E-03 4.915522E-08 + 7 9 3.457435E-05 6.836206E-02 2.363574E-06 + 7 10 3.457445E-05 1.334793E-02 4.614975E-07 + 7 11 3.457452E-05 3.590363E-02 1.241351E-06 + 7 12 3.457440E-05 8.254001E-02 2.853772E-06 + 7 13 3.457431E-05 8.554467E-03 2.957648E-07 + 7 14 3.457431E-05 3.992938E-02 1.380531E-06 + 7 15 3.457445E-05 1.428531E-01 4.939067E-06 + 7 16 3.457435E-05 1.465558E-01 5.067070E-06 + 7 17 3.457437E-05 7.911808E-02 2.735458E-06 + 7 18 3.457426E-05 2.649823E-02 9.161568E-07 + 7 19 3.457421E-05 5.870946E-03 2.029833E-07 + 7 20 3.457451E-05 8.791865E-04 3.039745E-08 + 7 21 3.457350E-05 8.830267E-05 3.052933E-09 + 7 22 3.457102E-05 5.709567E-06 1.973855E-10 + 7 23 3.459614E-05 2.148693E-07 7.433649E-12 + 7 24 3.433163E-05 3.571258E-09 1.226071E-13 + 7 25 4.409191E-05 5.616900E-12 2.476598E-16 + 7 26 2.544172E-05 6.084000E-13 1.547874E-17 + 7 27 0.000000E+00 1.690000E-14 0.000000E+00 + 7 28 0.000000E+00 9.000000E-16 0.000000E+00 + 7 29 0.000000E+00 1.000000E-16 0.000000E+00 + 7 30 0.000000E+00 1.000000E-16 0.000000E+00 + 7 31 0.000000E+00 1.000000E-16 0.000000E+00 + 7 34 0.000000E+00 1.000000E-16 0.000000E+00 + 7 35 0.000000E+00 1.000000E-16 0.000000E+00 + 7 36 0.000000E+00 1.000000E-16 0.000000E+00 + 7 37 0.000000E+00 1.000000E-16 0.000000E+00 + 7 38 0.000000E+00 1.000000E-16 0.000000E+00 + 8 0 3.457450E-05 3.151826E-02 1.089728E-06 + 8 1 3.457447E-05 9.212508E-02 3.185176E-06 + 8 2 3.457451E-05 3.298581E-02 1.140468E-06 + 8 3 3.457436E-05 1.858177E-02 6.424529E-07 + 8 4 3.457438E-05 5.317439E-02 1.838471E-06 + 8 5 3.457456E-05 4.152184E-03 1.435599E-07 + 8 6 3.457437E-05 5.455990E-02 1.886374E-06 + 8 7 3.457461E-05 4.331888E-03 1.497733E-07 + 8 8 3.457432E-05 5.125303E-02 1.772038E-06 + 8 9 3.457424E-05 1.602499E-02 5.540517E-07 + 8 10 3.457445E-05 3.394647E-02 1.173681E-06 + 8 11 3.457436E-05 5.134176E-02 1.775109E-06 + 8 12 3.457405E-05 2.212502E-03 7.649515E-08 + 8 13 3.457439E-05 7.692952E-02 2.659791E-06 + 8 14 3.457432E-05 4.379773E-02 1.514277E-06 + 8 15 3.457425E-05 4.933493E-03 1.705719E-07 + 8 16 3.457434E-05 1.023137E-01 3.537429E-06 + 8 17 3.457444E-05 1.594801E-01 5.513935E-06 + 8 18 3.457439E-05 1.095544E-01 3.787776E-06 + 8 19 3.457450E-05 4.363410E-02 1.508627E-06 + 8 20 3.457453E-05 1.107794E-02 3.830144E-07 + 8 21 3.457481E-05 1.852979E-03 6.406638E-08 + 8 22 3.457589E-05 2.034106E-04 7.033104E-09 + 8 23 3.457357E-05 1.404001E-05 4.854133E-10 + 8 24 3.459187E-05 5.443931E-07 1.883157E-11 + 8 25 3.451881E-05 8.539608E-09 2.947771E-13 + 8 26 3.517807E-05 3.960100E-12 1.393087E-16 + 8 27 2.359204E-05 2.624400E-12 6.191496E-17 + 8 28 0.000000E+00 4.840000E-14 0.000000E+00 + 8 29 0.000000E+00 3.600000E-15 0.000000E+00 + 8 30 0.000000E+00 4.000000E-16 0.000000E+00 + 8 31 0.000000E+00 4.000000E-16 0.000000E+00 + 8 32 0.000000E+00 1.000000E-16 0.000000E+00 + 8 34 0.000000E+00 1.000000E-16 0.000000E+00 + 8 35 0.000000E+00 1.000000E-16 0.000000E+00 + 8 36 0.000000E+00 1.000000E-16 0.000000E+00 + 8 37 0.000000E+00 1.000000E-16 0.000000E+00 + 8 38 0.000000E+00 1.000000E-16 0.000000E+00 + 8 39 0.000000E+00 1.000000E-16 0.000000E+00 + 9 0 3.457433E-05 1.794577E-02 6.204629E-07 + 9 1 3.457441E-05 7.372660E-02 2.549053E-06 + 9 2 3.457432E-05 6.034194E-02 2.086282E-06 + 9 3 3.457418E-05 1.718994E-04 5.943279E-09 + 9 4 3.457448E-05 5.482072E-02 1.895398E-06 + 9 5 3.457441E-05 9.263914E-03 3.202944E-07 + 9 6 3.457441E-05 3.936943E-02 1.361175E-06 + 9 7 3.457444E-05 1.649207E-02 5.702042E-07 + 9 8 3.457446E-05 3.775829E-02 1.305472E-06 + 9 9 3.457436E-05 1.304391E-02 4.509848E-07 + 9 10 3.457435E-05 4.955615E-02 1.713372E-06 + 9 11 3.457393E-05 2.154481E-03 7.448889E-08 + 9 12 3.457449E-05 6.416794E-02 2.218574E-06 + 9 13 3.457419E-05 9.235658E-03 3.193154E-07 + 9 14 3.457448E-05 4.063609E-02 1.404972E-06 + 9 15 3.457443E-05 7.569510E-02 2.617115E-06 + 9 16 3.457472E-05 3.515535E-03 1.215486E-07 + 9 17 3.457435E-05 5.392072E-02 1.864274E-06 + 9 18 3.457435E-05 1.517282E-01 5.245904E-06 + 9 19 3.457436E-05 1.373619E-01 4.749198E-06 + 9 20 3.457442E-05 6.581306E-02 2.275448E-06 + 9 21 3.457428E-05 1.922353E-02 6.646398E-07 + 9 22 3.457405E-05 3.593791E-03 1.242519E-07 + 9 23 3.457492E-05 4.304770E-04 1.488371E-08 + 9 24 3.457800E-05 3.158597E-05 1.092180E-09 + 9 25 3.457283E-05 1.250125E-06 4.322037E-11 + 9 26 3.456914E-05 1.791047E-08 6.191496E-13 + 9 27 8.774796E-05 1.764000E-13 1.547874E-17 + 9 28 4.105810E-05 9.424900E-12 3.869685E-16 + 9 29 0.000000E+00 8.410000E-14 0.000000E+00 + 9 30 0.000000E+00 1.690000E-14 0.000000E+00 + 9 31 0.000000E+00 4.000000E-16 0.000000E+00 + 9 32 0.000000E+00 1.000000E-16 0.000000E+00 + 9 34 0.000000E+00 1.000000E-16 0.000000E+00 + 9 35 0.000000E+00 4.000000E-16 0.000000E+00 + 9 36 0.000000E+00 4.000000E-16 0.000000E+00 + 9 37 0.000000E+00 4.000000E-16 0.000000E+00 + 9 38 0.000000E+00 4.000000E-16 0.000000E+00 + 9 39 0.000000E+00 1.000000E-16 0.000000E+00 + 10 0 3.457436E-05 9.855653E-03 3.407529E-07 + 10 1 3.457434E-05 5.323248E-02 1.840478E-06 + 10 2 3.457440E-05 7.335572E-02 2.536230E-06 + 10 3 3.457463E-05 9.416853E-03 3.255842E-07 + 10 4 3.457426E-05 2.810399E-02 9.716748E-07 + 10 5 3.457441E-05 3.914883E-02 1.353547E-06 + 10 6 3.457444E-05 4.894723E-03 1.692323E-07 + 10 7 3.457439E-05 4.762961E-02 1.646765E-06 + 10 8 3.457477E-05 6.994972E-04 2.418495E-08 + 10 9 3.457447E-05 4.974354E-02 1.719857E-06 + 10 10 3.457500E-05 1.219078E-03 4.214962E-08 + 10 11 3.457446E-05 5.054785E-02 1.747665E-06 + 10 12 3.457428E-05 9.140840E-03 3.160380E-07 + 10 13 3.457437E-05 3.973515E-02 1.373818E-06 + 10 14 3.457429E-05 4.062849E-02 1.404701E-06 + 10 15 3.457454E-05 7.210705E-03 2.493068E-07 + 10 16 3.457440E-05 8.001527E-02 2.766480E-06 + 10 17 3.457441E-05 2.888862E-02 9.988072E-07 + 10 18 3.457430E-05 1.564172E-02 5.408015E-07 + 10 19 3.457440E-05 1.242743E-01 4.296709E-06 + 10 20 3.457440E-05 1.565821E-01 5.413732E-06 + 10 21 3.457443E-05 9.167084E-02 3.169467E-06 + 10 22 3.457444E-05 3.097190E-02 1.070836E-06 + 10 23 3.457438E-05 6.478529E-03 2.239911E-07 + 10 24 3.457448E-05 8.454335E-04 2.923042E-08 + 10 25 3.457475E-05 6.564370E-05 2.269615E-09 + 10 26 3.456244E-05 2.622780E-06 9.064969E-11 + 10 27 3.466452E-05 3.279359E-08 1.136774E-12 + 10 28 3.318136E-05 4.664890E-11 1.547874E-15 + 10 29 3.422560E-05 2.894440E-11 9.906393E-16 + 10 30 0.000000E+00 7.840000E-14 0.000000E+00 + 10 31 0.000000E+00 5.760000E-14 0.000000E+00 + 10 32 0.000000E+00 1.000000E-16 0.000000E+00 + 10 33 0.000000E+00 1.000000E-16 0.000000E+00 + 10 34 0.000000E+00 1.000000E-16 0.000000E+00 + 10 35 0.000000E+00 9.000000E-16 0.000000E+00 + 10 36 0.000000E+00 9.000000E-16 0.000000E+00 + 10 37 0.000000E+00 9.000000E-16 0.000000E+00 + 10 38 0.000000E+00 9.000000E-16 0.000000E+00 + 10 39 0.000000E+00 4.000000E-16 0.000000E+00 + 11 0 3.457446E-05 5.263652E-03 1.819879E-07 + 11 1 3.457450E-05 3.566190E-02 1.232992E-06 + 11 2 3.457433E-05 7.151800E-02 2.472687E-06 + 11 3 3.457434E-05 3.149655E-02 1.088972E-06 + 11 4 3.457446E-05 4.660811E-03 1.611450E-07 + 11 5 3.457442E-05 4.911852E-02 1.698244E-06 + 11 6 3.457422E-05 5.064348E-03 1.750959E-07 + 11 7 3.457434E-05 3.395373E-02 1.173928E-06 + 11 8 3.457450E-05 1.825968E-02 6.313194E-07 + 11 9 3.457453E-05 2.396526E-02 8.285876E-07 + 11 10 3.457430E-05 2.430992E-02 8.404984E-07 + 11 11 3.457427E-05 2.485355E-02 8.592934E-07 + 11 12 3.457454E-05 2.126362E-02 7.351798E-07 + 11 13 3.457451E-05 3.803150E-02 1.314920E-06 + 11 14 3.457433E-05 8.214689E-03 2.840174E-07 + 11 15 3.457446E-05 6.083579E-02 2.103365E-06 + 11 16 3.457416E-05 1.798522E-03 6.218240E-08 + 11 17 3.457442E-05 5.597579E-02 1.935331E-06 + 11 18 3.457431E-05 6.100649E-02 2.109257E-06 + 11 19 3.457284E-05 1.199770E-04 4.147945E-09 + 11 20 3.457446E-05 8.444030E-02 2.919478E-06 + 11 21 3.457440E-05 1.622788E-01 5.610694E-06 + 11 22 3.457445E-05 1.186075E-01 4.100790E-06 + 11 23 3.457439E-05 4.667448E-02 1.613742E-06 + 11 24 3.457427E-05 1.094140E-02 3.782908E-07 + 11 25 3.457468E-05 1.553078E-03 5.369718E-08 + 11 26 3.457519E-05 1.269566E-04 4.389548E-09 + 11 27 3.458311E-05 5.053009E-06 1.747488E-10 + 11 28 3.451795E-05 5.153354E-08 1.778832E-12 + 11 29 3.437879E-05 4.052169E-10 1.393087E-14 + 11 30 3.464039E-05 7.551610E-11 2.615907E-15 + 11 31 0.000000E+00 1.000000E-16 0.000000E+00 + 11 32 7.995217E-05 1.936000E-13 1.547874E-17 + 11 33 0.000000E+00 1.000000E-16 0.000000E+00 + 11 34 0.000000E+00 1.000000E-16 0.000000E+00 + 11 35 0.000000E+00 9.000000E-16 0.000000E+00 + 11 36 0.000000E+00 2.500000E-15 0.000000E+00 + 11 37 0.000000E+00 2.500000E-15 0.000000E+00 + 11 38 0.000000E+00 1.600000E-15 0.000000E+00 + 11 39 0.000000E+00 1.600000E-15 0.000000E+00 + 12 0 3.457415E-05 2.751866E-03 9.514343E-08 + 12 1 3.457438E-05 2.258801E-02 7.809666E-07 + 12 2 3.457436E-05 6.054849E-02 2.093425E-06 + 12 3 3.457444E-05 5.055119E-02 1.747779E-06 + 12 4 3.457370E-05 1.092113E-03 3.775841E-08 + 12 5 3.457432E-05 3.296729E-02 1.139822E-06 + 12 6 3.457438E-05 2.882273E-02 9.965280E-07 + 12 7 3.457415E-05 5.481343E-03 1.895127E-07 + 12 8 3.457445E-05 4.193005E-02 1.449708E-06 + 12 9 3.455622E-05 9.044771E-07 3.125531E-11 + 12 10 3.457448E-05 4.311463E-02 1.490666E-06 + 12 11 3.457396E-05 1.077780E-03 3.726312E-08 + 12 12 3.457443E-05 4.518800E-02 1.562350E-06 + 12 13 3.457361E-05 5.226729E-04 1.807069E-08 + 12 14 3.457430E-05 5.113739E-02 1.768039E-06 + 12 15 3.457433E-05 1.298042E-03 4.487893E-08 + 12 16 3.457450E-05 5.138250E-02 1.776524E-06 + 12 17 3.457450E-05 2.306589E-02 7.974915E-07 + 12 18 3.457453E-05 2.236562E-02 7.732809E-07 + 12 19 3.457446E-05 7.929301E-02 2.741513E-06 + 12 20 3.457422E-05 9.409433E-03 3.253238E-07 + 12 21 3.457441E-05 4.356352E-02 1.506183E-06 + 12 22 3.457440E-05 1.522022E-01 5.262299E-06 + 12 23 3.457438E-05 1.431160E-01 4.948147E-06 + 12 24 3.457440E-05 6.618163E-02 2.288190E-06 + 12 25 3.457435E-05 1.742328E-02 6.023988E-07 + 12 26 3.457437E-05 2.685633E-03 9.285405E-08 + 12 27 3.457409E-05 2.297804E-04 7.944448E-09 + 12 28 3.457277E-05 8.961761E-06 3.098329E-10 + 12 29 3.449482E-05 6.685844E-08 2.306270E-12 + 12 30 3.484300E-05 1.935120E-09 6.742539E-14 + 12 31 3.415873E-05 1.635841E-10 5.587825E-15 + 12 32 1.645099E-05 9.409000E-13 1.547874E-17 + 12 33 2.480170E-05 6.241000E-13 1.547874E-17 + 12 34 0.000000E+00 9.000000E-16 0.000000E+00 + 12 35 0.000000E+00 4.900000E-15 0.000000E+00 + 12 36 0.000000E+00 9.000000E-16 0.000000E+00 + 12 37 0.000000E+00 6.400000E-15 0.000000E+00 + 12 38 0.000000E+00 6.400000E-15 0.000000E+00 + 12 39 0.000000E+00 2.500000E-15 0.000000E+00 + 13 0 3.457465E-05 1.415966E-03 4.895655E-08 + 13 1 3.457458E-05 1.371008E-02 4.740202E-07 + 13 2 3.457441E-05 4.646335E-02 1.606443E-06 + 13 3 3.457432E-05 5.924770E-02 2.048449E-06 + 13 4 3.457444E-05 1.375514E-02 4.755762E-07 + 13 5 3.457444E-05 1.091225E-02 3.772849E-07 + 13 6 3.457450E-05 4.242909E-02 1.466964E-06 + 13 7 3.457446E-05 2.549596E-03 8.815090E-08 + 13 8 3.457434E-05 3.005267E-02 1.039051E-06 + 13 9 3.457438E-05 1.865480E-02 6.449782E-07 + 13 10 3.457454E-05 1.499062E-02 5.182939E-07 + 13 11 3.457445E-05 3.040296E-02 1.051165E-06 + 13 12 3.457421E-05 8.707034E-03 3.010388E-07 + 13 13 3.457429E-05 3.564999E-02 1.232573E-06 + 13 14 3.457444E-05 9.805343E-03 3.390142E-07 + 13 15 3.457429E-05 3.508551E-02 1.213056E-06 + 13 16 3.457455E-05 2.090221E-02 7.226844E-07 + 13 17 3.457430E-05 2.339460E-02 8.088520E-07 + 13 18 3.457432E-05 4.934343E-02 1.706016E-06 + 13 19 3.457402E-05 1.664303E-03 5.754164E-08 + 13 20 3.457442E-05 7.389416E-02 2.554848E-06 + 13 21 3.457449E-05 3.491381E-02 1.207127E-06 + 13 22 3.457460E-05 1.301999E-02 4.501609E-07 + 13 23 3.457435E-05 1.277598E-01 4.417212E-06 + 13 24 3.457445E-05 1.614473E-01 5.581953E-06 + 13 25 3.457436E-05 8.872677E-02 3.067671E-06 + 13 26 3.457437E-05 2.630159E-02 9.093610E-07 + 13 27 3.457467E-05 4.394373E-03 1.519340E-07 + 13 28 3.457542E-05 3.908363E-04 1.351333E-08 + 13 29 3.457007E-05 1.462917E-05 5.057315E-10 + 13 30 3.457058E-05 6.533647E-08 2.258720E-12 + 13 31 3.455693E-05 6.776582E-09 2.341779E-13 + 13 32 3.536263E-05 2.735716E-10 9.674212E-15 + 13 33 3.596896E-05 1.075840E-11 3.869685E-16 + 13 34 3.778989E-05 1.638400E-12 6.191496E-17 + 13 35 0.000000E+00 6.400000E-15 0.000000E+00 + 13 36 0.000000E+00 5.290000E-14 0.000000E+00 + 13 37 0.000000E+00 9.000000E-16 0.000000E+00 + 13 38 0.000000E+00 2.500000E-15 0.000000E+00 + 13 39 0.000000E+00 1.440000E-14 0.000000E+00 + 14 0 3.457467E-05 7.203212E-04 2.490487E-08 + 14 1 3.457440E-05 8.054992E-03 2.784966E-07 + 14 2 3.457439E-05 3.318529E-02 1.147361E-06 + 14 3 3.457444E-05 5.785386E-02 2.000265E-06 + 14 4 3.457435E-05 3.113635E-02 1.076519E-06 + 14 5 3.457310E-05 2.576879E-04 8.909069E-09 + 14 6 3.457451E-05 3.461065E-02 1.196646E-06 + 14 7 3.457435E-05 2.088299E-02 7.220156E-07 + 14 8 3.457447E-05 6.154580E-03 2.127913E-07 + 14 9 3.457450E-05 3.710941E-02 1.283040E-06 + 14 10 3.457447E-05 3.467670E-04 1.198928E-08 + 14 11 3.457448E-05 3.548021E-02 1.226710E-06 + 14 12 3.457415E-05 6.057285E-03 2.094254E-07 + 14 13 3.457436E-05 3.144312E-02 1.087126E-06 + 14 14 3.457428E-05 1.062719E-02 3.674276E-07 + 14 15 3.457444E-05 3.311775E-02 1.145028E-06 + 14 16 3.457459E-05 9.380666E-03 3.243327E-07 + 14 17 3.457439E-05 4.346249E-02 1.502689E-06 + 14 18 3.457467E-05 2.275152E-03 7.866263E-08 + 14 19 3.457442E-05 5.866721E-02 2.028385E-06 + 14 20 3.457427E-05 4.728779E-03 1.634941E-07 + 14 21 3.457443E-05 4.946790E-02 1.710325E-06 + 14 22 3.457438E-05 6.218139E-02 2.149883E-06 + 14 23 3.457497E-05 2.315020E-04 8.004174E-09 + 14 24 3.457437E-05 9.387770E-02 3.245762E-06 + 14 25 3.457443E-05 1.704573E-01 5.893465E-06 + 14 26 3.457435E-05 1.129358E-01 3.904684E-06 + 14 27 3.457429E-05 3.781362E-02 1.307379E-06 + 14 28 3.457465E-05 6.833373E-03 2.362615E-07 + 14 29 3.457367E-05 6.266646E-04 2.166610E-08 + 14 30 3.457259E-05 2.191307E-05 7.575917E-10 + 14 31 3.452487E-05 3.641609E-08 1.257261E-12 + 14 32 3.470744E-05 1.892550E-08 6.568558E-13 + 14 33 3.536921E-05 2.958400E-10 1.046363E-14 + 14 34 3.720627E-05 5.990760E-11 2.228939E-15 + 14 35 2.610683E-05 2.371600E-12 6.191496E-17 + 14 36 3.899909E-05 3.969000E-13 1.547874E-17 + 14 37 7.643822E-05 2.025000E-13 1.547874E-17 + 14 38 0.000000E+00 3.610000E-14 0.000000E+00 + 14 39 0.000000E+00 1.600000E-15 0.000000E+00 + 15 0 3.457329E-05 3.636763E-04 1.257349E-08 + 15 1 3.457445E-05 4.616882E-03 1.596261E-07 + 15 2 3.457451E-05 2.245860E-02 7.764948E-07 + 15 3 3.457441E-05 5.005721E-02 1.730698E-06 + 15 4 3.457437E-05 4.421594E-02 1.528738E-06 + 15 5 3.457440E-05 4.255102E-03 1.471176E-07 + 15 6 3.457423E-05 1.655513E-02 5.723809E-07 + 15 7 3.457452E-05 3.563889E-02 1.232197E-06 + 15 8 3.457501E-05 1.007201E-03 3.482399E-08 + 15 9 3.457449E-05 2.730244E-02 9.439678E-07 + 15 10 3.457443E-05 1.797800E-02 6.215790E-07 + 15 11 3.457454E-05 9.573482E-03 3.309988E-07 + 15 12 3.457440E-05 3.194887E-02 1.104613E-06 + 15 13 3.457456E-05 1.628711E-03 5.631196E-08 + 15 14 3.457440E-05 3.801752E-02 1.314433E-06 + 15 15 3.457302E-05 1.136563E-04 3.929440E-09 + 15 16 3.457431E-05 4.200204E-02 1.452192E-06 + 15 17 3.457335E-05 2.325524E-04 8.040117E-09 + 15 18 3.457437E-05 4.650755E-02 1.607969E-06 + 15 19 3.457451E-05 3.895942E-03 1.347003E-07 + 15 20 3.457449E-05 4.506144E-02 1.557976E-06 + 15 21 3.457455E-05 2.564091E-02 8.865229E-07 + 15 22 3.457435E-05 2.055438E-02 7.106542E-07 + 15 23 3.457432E-05 7.788167E-02 2.692706E-06 + 15 24 3.457411E-05 6.274376E-03 2.169310E-07 + 15 25 3.457436E-05 5.773271E-02 1.996071E-06 + 15 26 3.457444E-05 1.683912E-01 5.822030E-06 + 15 27 3.457444E-05 1.369854E-01 4.736192E-06 + 15 28 3.457442E-05 5.199292E-02 1.797625E-06 + 15 29 3.457428E-05 1.013650E-02 3.504622E-07 + 15 30 3.457449E-05 9.492130E-04 3.281855E-08 + 15 31 3.457245E-05 2.992134E-05 1.034454E-09 + 15 32 3.446005E-05 1.034909E-09 3.566302E-14 + 15 33 3.454446E-05 4.333891E-08 1.497119E-12 + 15 34 3.367257E-05 1.034289E-10 3.482716E-15 + 15 35 3.301083E-05 2.067844E-10 6.826124E-15 + 15 36 8.371411E-05 1.849000E-13 1.547874E-17 + 15 37 4.497309E-05 3.097600E-12 1.393087E-16 + 15 38 0.000000E+00 7.840000E-14 0.000000E+00 + 15 39 4.026727E-05 3.844000E-13 1.547874E-17 + 16 0 3.457514E-05 1.828358E-04 6.321574E-09 + 16 1 3.457479E-05 2.597772E-03 8.981741E-08 + 16 2 3.457425E-05 1.458830E-02 5.043794E-07 + 16 3 3.457444E-05 3.974440E-02 1.374140E-06 + 16 4 3.457430E-05 4.957739E-02 1.714103E-06 + 16 5 3.457433E-05 1.672235E-02 5.781639E-07 + 16 6 3.457439E-05 2.960719E-03 1.023650E-07 + 16 7 3.457433E-05 3.408060E-02 1.178314E-06 + 16 8 3.457442E-05 1.455204E-02 5.031284E-07 + 16 9 3.457443E-05 7.040274E-03 2.434134E-07 + 16 10 3.457440E-05 3.295433E-02 1.139376E-06 + 16 11 3.457387E-05 8.095726E-04 2.799006E-08 + 16 12 3.457439E-05 2.880342E-02 9.958604E-07 + 16 13 3.457450E-05 1.100286E-02 3.804184E-07 + 16 14 3.457435E-05 1.879490E-02 6.498215E-07 + 16 15 3.457427E-05 2.159130E-02 7.465036E-07 + 16 16 3.457447E-05 1.308884E-02 4.525397E-07 + 16 17 3.457452E-05 2.779706E-02 9.610699E-07 + 16 18 3.457451E-05 1.367597E-02 4.728399E-07 + 16 19 3.457432E-05 2.863543E-02 9.900504E-07 + 16 20 3.457433E-05 2.329337E-02 8.053528E-07 + 16 21 3.457431E-05 2.022022E-02 6.991000E-07 + 16 22 3.457435E-05 4.804001E-02 1.660952E-06 + 16 23 3.457479E-05 2.318433E-03 8.015934E-08 + 16 24 3.457432E-05 7.550402E-02 2.610500E-06 + 16 25 3.457452E-05 2.597889E-02 8.982076E-07 + 16 26 3.457438E-05 2.676741E-02 9.254667E-07 + 16 27 3.457442E-05 1.553591E-01 5.371450E-06 + 16 28 3.457442E-05 1.588892E-01 5.493500E-06 + 16 29 3.457438E-05 6.864010E-02 2.373189E-06 + 16 30 3.457454E-05 1.439181E-02 4.975904E-07 + 16 31 3.457450E-05 1.360185E-03 4.702773E-08 + 16 32 3.457156E-05 3.681626E-05 1.272795E-09 + 16 33 3.461566E-05 6.355441E-08 2.199978E-12 + 16 34 3.462140E-05 8.189899E-08 2.835457E-12 + 16 35 3.611563E-05 9.643240E-11 3.482716E-15 + 16 36 3.483805E-05 4.549689E-10 1.585023E-14 + 16 37 3.468827E-05 1.115560E-11 3.869685E-16 + 16 38 3.691952E-05 6.708100E-12 2.476598E-16 + 16 39 2.193699E-05 7.056000E-13 1.547874E-17 + 17 0 3.457246E-05 9.179748E-05 3.173664E-09 + 17 1 3.457433E-05 1.442235E-03 4.986430E-08 + 17 2 3.457463E-05 9.183402E-03 3.175127E-07 + 17 3 3.457449E-05 2.961223E-02 1.023828E-06 + 17 4 3.457450E-05 4.799874E-02 1.659533E-06 + 17 5 3.457439E-05 2.988629E-02 1.033300E-06 + 17 6 3.457394E-05 4.076983E-04 1.409573E-08 + 17 7 3.457430E-05 2.090700E-02 7.228449E-07 + 17 8 3.457450E-05 2.899783E-02 1.002585E-06 + 17 9 3.457409E-05 1.833484E-04 6.339104E-09 + 17 10 3.457454E-05 2.539700E-02 8.780897E-07 + 17 11 3.457423E-05 1.651951E-02 5.711493E-07 + 17 12 3.457462E-05 6.510189E-03 2.250873E-07 + 17 13 3.457433E-05 3.079656E-02 1.064771E-06 + 17 14 3.456203E-05 1.673401E-06 5.783614E-11 + 17 15 3.457441E-05 3.310122E-02 1.144455E-06 + 17 16 3.457427E-05 2.966630E-03 1.025691E-07 + 17 17 3.457432E-05 3.159021E-02 1.092210E-06 + 17 18 3.457465E-05 6.945001E-03 2.401209E-07 + 17 19 3.457432E-05 3.331468E-02 1.151832E-06 + 17 20 3.457419E-05 7.162223E-03 2.476281E-07 + 17 21 3.457434E-05 4.203273E-02 1.453254E-06 + 17 22 3.457401E-05 2.353865E-03 8.138257E-08 + 17 23 3.457447E-05 5.690020E-02 1.967294E-06 + 17 24 3.457446E-05 2.367293E-03 8.184789E-08 + 17 25 3.457443E-05 5.730478E-02 1.981280E-06 + 17 26 3.457436E-05 5.031960E-02 1.739768E-06 + 17 27 3.457429E-05 6.669394E-03 2.305896E-07 + 17 28 3.457446E-05 1.333393E-01 4.610134E-06 + 17 29 3.457440E-05 1.768479E-01 6.114409E-06 + 17 30 3.457440E-05 8.734375E-02 3.019858E-06 + 17 31 3.457437E-05 1.961978E-02 6.783414E-07 + 17 32 3.457458E-05 1.845395E-03 6.380376E-08 + 17 33 3.457425E-05 3.998880E-05 1.382583E-09 + 17 34 3.459189E-05 4.728763E-07 1.635768E-11 + 17 35 3.463067E-05 1.269782E-07 4.397340E-12 + 17 36 3.458465E-05 2.193049E-09 7.584582E-14 + 17 37 3.385045E-05 6.260004E-10 2.119039E-14 + 17 38 3.701474E-05 9.409000E-11 3.482716E-15 + 17 39 2.577105E-05 2.402500E-12 6.191496E-17 + 18 0 3.457535E-05 4.614852E-05 1.595601E-09 + 18 1 3.457419E-05 7.934261E-04 2.743207E-08 + 18 2 3.457416E-05 5.644727E-03 1.951617E-07 + 18 3 3.457454E-05 2.102622E-02 7.269718E-07 + 18 4 3.457443E-05 4.201452E-02 1.452628E-06 + 18 5 3.457431E-05 3.880575E-02 1.341682E-06 + 18 6 3.457441E-05 7.145427E-03 2.470489E-07 + 18 7 3.457455E-05 7.161243E-03 2.475968E-07 + 18 8 3.457443E-05 3.196487E-02 1.105167E-06 + 18 9 3.457442E-05 9.424831E-03 3.258581E-07 + 18 10 3.457432E-05 8.197962E-03 2.834390E-07 + 18 11 3.457434E-05 2.926680E-02 1.011880E-06 + 18 12 3.457401E-05 1.019584E-03 3.525112E-08 + 18 13 3.457441E-05 2.369431E-02 8.192170E-07 + 18 14 3.457448E-05 1.418071E-02 4.902906E-07 + 18 15 3.457451E-05 1.019526E-02 3.524961E-07 + 18 16 3.457444E-05 2.713314E-02 9.381132E-07 + 18 17 3.457426E-05 2.500991E-03 8.646991E-08 + 18 18 3.457434E-05 3.436628E-02 1.188191E-06 + 18 19 3.457368E-05 3.496216E-04 1.208770E-08 + 18 20 3.457434E-05 3.925595E-02 1.357248E-06 + 18 21 3.457404E-05 2.382142E-04 8.236028E-09 + 18 22 3.457431E-05 4.471011E-02 1.545821E-06 + 18 23 3.457419E-05 2.443376E-03 8.447775E-08 + 18 24 3.457448E-05 4.753258E-02 1.643414E-06 + 18 25 3.457431E-05 1.783659E-02 6.166878E-07 + 18 26 3.457443E-05 3.210739E-02 1.110095E-06 + 18 27 3.457439E-05 6.995898E-02 2.418789E-06 + 18 28 3.442842E-05 1.080144E-08 3.718767E-13 + 18 29 3.457437E-05 1.057035E-01 3.654632E-06 + 18 30 3.457443E-05 1.895639E-01 6.554062E-06 + 18 31 3.457440E-05 1.075492E-01 3.718448E-06 + 18 32 3.457426E-05 2.575955E-02 8.906172E-07 + 18 33 3.457473E-05 2.370271E-03 8.195148E-08 + 18 34 3.457556E-05 3.680388E-05 1.272515E-09 + 18 35 3.459077E-05 1.659923E-06 5.741801E-11 + 18 36 3.458972E-05 1.563016E-07 5.406430E-12 + 18 37 3.451493E-05 1.063580E-08 3.670938E-13 + 18 38 3.457819E-05 4.583881E-10 1.585023E-14 + 18 39 3.574228E-05 2.927521E-10 1.046363E-14 + 19 0 3.457430E-05 2.328593E-05 8.050948E-10 + 19 1 3.457492E-05 4.341218E-04 1.500973E-08 + 19 2 3.457425E-05 3.408423E-03 1.178437E-07 + 19 3 3.457456E-05 1.439004E-02 4.975293E-07 + 19 4 3.457436E-05 3.418243E-02 1.181836E-06 + 19 5 3.457430E-05 4.203333E-02 1.453273E-06 + 19 6 3.457456E-05 1.781717E-02 6.160207E-07 + 19 7 3.457400E-05 3.561290E-04 1.231281E-08 + 19 8 3.457452E-05 2.374494E-02 8.209699E-07 + 19 9 3.457442E-05 2.257411E-02 7.804868E-07 + 19 10 3.457679E-05 2.318750E-05 8.017493E-10 + 19 11 3.457426E-05 2.405751E-02 8.317708E-07 + 19 12 3.457447E-05 1.449558E-02 5.011769E-07 + 19 13 3.457455E-05 4.930538E-03 1.704711E-07 + 19 14 3.457451E-05 2.845327E-02 9.837578E-07 + 19 15 3.457508E-05 6.203572E-04 2.144890E-08 + 19 16 3.457447E-05 2.614787E-02 9.040488E-07 + 19 17 3.457421E-05 9.186463E-03 3.176147E-07 + 19 18 3.457434E-05 1.793716E-02 6.201654E-07 + 19 19 3.457442E-05 1.943779E-02 6.720504E-07 + 19 20 3.457424E-05 1.223954E-02 4.231728E-07 + 19 21 3.457436E-05 2.676962E-02 9.255424E-07 + 19 22 3.457447E-05 1.145621E-02 3.960923E-07 + 19 23 3.457445E-05 3.026660E-02 1.046451E-06 + 19 24 3.457440E-05 1.779064E-02 6.151008E-07 + 19 25 3.457453E-05 2.685626E-02 9.285426E-07 + 19 26 3.457429E-05 3.839929E-02 1.327628E-06 + 19 27 3.457454E-05 1.056279E-02 3.652036E-07 + 19 28 3.457443E-05 7.844637E-02 2.712238E-06 + 19 29 3.457432E-05 5.876055E-03 2.031606E-07 + 19 30 3.457441E-05 7.643105E-02 2.642559E-06 + 19 31 3.457435E-05 1.964342E-01 6.791583E-06 + 19 32 3.457442E-05 1.286498E-01 4.447992E-06 + 19 33 3.457451E-05 3.266046E-02 1.129219E-06 + 19 34 3.457437E-05 2.877002E-03 9.947051E-08 + 19 35 3.457360E-05 2.610495E-05 9.025420E-10 + 19 36 3.458096E-05 4.188490E-06 1.448420E-10 + 19 37 3.456008E-05 1.359766E-07 4.699361E-12 + 19 38 3.446601E-05 3.177663E-08 1.095214E-12 + 19 39 3.251153E-05 3.047040E-11 9.906393E-16 + 20 0 3.456900E-05 1.182053E-05 4.086239E-10 + 20 1 3.457495E-05 2.370116E-04 8.194663E-09 + 20 2 3.457452E-05 2.032008E-03 7.025570E-08 + 20 3 3.457423E-05 9.575270E-03 3.310576E-07 + 20 4 3.457431E-05 2.632877E-02 9.102992E-07 + 20 5 3.457437E-05 4.043469E-02 1.398004E-06 + 20 6 3.457450E-05 2.755819E-02 9.528107E-07 + 20 7 3.457460E-05 1.800430E-03 6.224913E-08 + 20 8 3.457436E-05 1.168946E-02 4.041554E-07 + 20 9 3.457429E-05 2.857842E-02 9.880784E-07 + 20 10 3.457416E-05 5.341068E-03 1.846629E-07 + 20 11 3.457435E-05 9.639772E-03 3.332889E-07 + 20 12 3.457444E-05 2.583356E-02 8.931810E-07 + 20 13 3.457405E-05 9.057831E-04 3.131659E-08 + 20 14 3.457451E-05 2.012678E-02 6.958734E-07 + 20 15 3.457428E-05 1.548180E-02 5.352722E-07 + 20 16 3.457414E-05 5.280510E-03 1.825691E-07 + 20 17 3.457445E-05 2.781117E-02 9.615560E-07 + 20 18 3.457815E-05 2.716494E-07 9.393134E-12 + 20 19 3.457439E-05 3.025898E-02 1.046186E-06 + 20 20 3.457419E-05 3.199161E-03 1.106084E-07 + 20 21 3.457429E-05 2.859312E-02 9.885868E-07 + 20 22 3.457458E-05 8.265770E-03 2.857856E-07 + 20 23 3.457442E-05 2.902228E-02 1.003429E-06 + 20 24 3.457434E-05 1.066874E-02 3.688646E-07 + 20 25 3.457439E-05 3.583787E-02 1.239072E-06 + 20 26 3.457441E-05 7.582559E-03 2.621625E-07 + 20 27 3.457438E-05 5.259829E-02 1.818553E-06 + 20 28 3.457385E-05 3.902458E-04 1.349230E-08 + 20 29 3.457442E-05 7.391964E-02 2.555729E-06 + 20 30 3.457448E-05 2.067208E-02 7.147262E-07 + 20 31 3.457437E-05 4.927441E-02 1.703632E-06 + 20 32 3.457440E-05 1.975945E-01 6.831711E-06 + 20 33 3.457444E-05 1.500768E-01 5.188821E-06 + 20 34 3.457437E-05 4.007464E-02 1.385556E-06 + 20 35 3.457403E-05 3.284895E-03 1.135720E-07 + 20 36 3.456862E-05 1.064586E-05 3.680129E-10 + 20 37 3.457187E-05 8.507197E-06 2.941097E-10 + 20 38 3.461653E-05 5.291380E-08 1.831692E-12 + 20 39 3.454673E-05 6.990736E-08 2.415070E-12 + 21 0 3.457408E-05 6.049731E-06 2.091638E-10 + 21 1 3.457318E-05 1.294946E-04 4.477040E-09 + 21 2 3.457487E-05 1.201207E-03 4.153157E-08 + 21 3 3.457466E-05 6.237761E-03 2.156685E-07 + 21 4 3.457456E-05 1.945264E-02 6.725665E-07 + 21 5 3.457445E-05 3.577197E-02 1.236796E-06 + 21 6 3.457445E-05 3.371265E-02 1.165596E-06 + 21 7 3.457449E-05 8.701720E-03 3.008575E-07 + 21 8 3.457469E-05 2.762926E-03 9.552730E-08 + 21 9 3.457454E-05 2.494775E-02 8.625569E-07 + 21 10 3.457427E-05 1.644356E-02 5.685239E-07 + 21 11 3.457417E-05 5.596101E-04 1.934805E-08 + 21 12 3.457442E-05 2.301455E-02 7.957147E-07 + 21 13 3.457425E-05 1.205474E-02 4.167834E-07 + 21 14 3.457468E-05 4.307955E-03 1.489462E-07 + 21 15 3.457439E-05 2.580758E-02 8.922814E-07 + 21 16 3.457474E-05 1.624331E-03 5.616082E-08 + 21 17 3.457435E-05 1.998681E-02 6.910311E-07 + 21 18 3.457449E-05 1.402687E-02 4.849718E-07 + 21 19 3.457415E-05 8.171489E-03 2.825223E-07 + 21 20 3.457437E-05 2.606664E-02 9.012379E-07 + 21 21 3.457493E-05 1.442210E-03 4.986430E-08 + 21 22 3.457447E-05 3.288070E-02 1.136833E-06 + 21 23 3.453689E-05 3.876308E-09 1.338756E-13 + 21 24 3.457435E-05 3.745194E-02 1.294876E-06 + 21 25 3.457431E-05 2.453703E-04 8.483509E-09 + 21 26 3.457434E-05 4.385709E-02 1.516330E-06 + 21 27 3.457495E-05 1.083910E-06 3.747613E-11 + 21 28 3.457439E-05 5.368072E-02 1.855978E-06 + 21 29 3.457431E-05 3.663249E-03 1.266543E-07 + 21 30 3.457434E-05 5.894384E-02 2.037944E-06 + 21 31 3.457446E-05 3.935769E-02 1.360771E-06 + 21 32 3.457450E-05 2.709563E-02 9.368180E-07 + 21 33 3.457445E-05 1.938438E-01 6.702043E-06 + 21 34 3.457444E-05 1.713829E-01 5.925466E-06 + 21 35 3.457436E-05 4.765361E-02 1.647593E-06 + 21 36 3.457474E-05 3.497229E-03 1.209158E-07 + 21 37 3.455390E-05 1.311092E-07 4.530333E-12 + 21 38 3.457182E-05 1.441425E-05 4.983268E-10 + 21 39 3.431518E-05 5.557702E-09 1.907136E-13 + 22 0 3.456537E-05 3.128158E-06 1.081259E-10 + 22 1 3.457707E-05 7.099141E-05 2.454675E-09 + 22 2 3.457518E-05 7.066920E-04 2.443400E-08 + 22 3 3.457429E-05 4.000737E-03 1.383226E-07 + 22 4 3.457423E-05 1.392241E-02 4.813565E-07 + 22 5 3.457434E-05 2.975415E-02 1.028730E-06 + 22 6 3.457434E-05 3.573641E-02 1.235563E-06 + 22 7 3.457430E-05 1.721515E-02 5.952018E-07 + 22 8 3.457057E-05 1.063653E-05 3.677110E-10 + 22 9 3.457438E-05 1.574679E-02 5.444357E-07 + 22 10 3.457428E-05 2.413810E-02 8.345575E-07 + 22 11 3.457429E-05 2.316856E-03 8.010365E-08 + 22 12 3.457446E-05 1.132026E-02 3.913919E-07 + 22 13 3.457449E-05 2.244216E-02 7.759264E-07 + 22 14 3.457393E-05 5.585381E-04 1.931086E-08 + 22 15 3.457442E-05 1.785495E-02 6.173244E-07 + 22 16 3.457443E-05 1.530955E-02 5.293190E-07 + 22 17 3.457421E-05 2.821585E-03 9.755405E-08 + 22 18 3.457439E-05 2.589085E-02 8.951602E-07 + 22 19 3.457474E-05 1.243033E-03 4.297753E-08 + 22 20 3.457444E-05 2.248773E-02 7.775005E-07 + 22 21 3.457420E-05 1.068233E-02 3.693331E-07 + 22 22 3.457441E-05 1.391855E-02 4.812255E-07 + 22 23 3.457452E-05 2.167441E-02 7.493821E-07 + 22 24 3.457461E-05 7.545389E-03 2.608789E-07 + 22 25 3.457442E-05 3.035960E-02 1.049665E-06 + 22 26 3.457431E-05 5.012377E-03 1.732995E-07 + 22 27 3.457432E-05 3.718389E-02 1.285608E-06 + 22 28 3.457421E-05 6.511670E-03 2.251358E-07 + 22 29 3.457438E-05 4.212299E-02 1.456376E-06 + 22 30 3.457443E-05 1.690832E-02 5.845956E-07 + 22 31 3.457452E-05 3.889546E-02 1.344792E-06 + 22 32 3.457449E-05 5.696402E-02 1.969502E-06 + 22 33 3.457436E-05 1.149079E-02 3.972867E-07 + 22 34 3.457444E-05 1.864780E-01 6.447372E-06 + 22 35 3.457441E-05 1.923052E-01 6.648839E-06 + 22 36 3.457436E-05 5.494475E-02 1.899680E-06 + 22 37 3.457467E-05 3.417060E-03 1.181437E-07 + 22 38 3.456886E-05 1.366337E-05 4.723272E-10 + 22 39 3.457489E-05 2.031323E-05 7.023276E-10 + 23 0 3.456022E-05 1.637325E-06 5.658631E-11 + 23 1 3.457612E-05 3.914492E-05 1.353480E-09 + 23 2 3.457375E-05 4.151105E-04 1.435193E-08 + 23 3 3.457440E-05 2.538194E-03 8.775652E-08 + 23 4 3.457440E-05 9.726670E-03 3.362937E-07 + 23 5 3.457442E-05 2.362453E-02 8.168044E-07 + 23 6 3.457450E-05 3.437058E-02 1.188346E-06 + 23 7 3.457433E-05 2.439907E-02 8.435816E-07 + 23 8 3.457483E-05 2.823240E-03 9.761305E-08 + 23 9 3.457446E-05 6.557814E-03 2.267329E-07 + 23 10 3.457448E-05 2.442008E-02 8.443116E-07 + 23 11 3.457434E-05 1.078099E-02 3.727457E-07 + 23 12 3.457388E-05 1.843823E-03 6.374812E-08 + 23 13 3.457434E-05 2.198215E-02 7.600185E-07 + 23 14 3.457451E-05 9.325427E-03 3.224221E-07 + 23 15 3.457426E-05 4.372718E-03 1.511835E-07 + 23 16 3.457455E-05 2.325566E-02 8.040540E-07 + 23 17 3.457415E-05 2.202624E-03 7.615385E-08 + 23 18 3.457428E-05 1.553129E-02 5.369833E-07 + 23 19 3.457425E-05 1.638990E-02 5.666684E-07 + 23 20 3.457449E-05 3.030583E-03 1.047809E-07 + 23 21 3.457438E-05 2.639673E-02 9.126505E-07 + 23 22 3.457557E-05 3.509800E-04 1.213533E-08 + 23 23 3.457447E-05 2.660187E-02 9.197454E-07 + 23 24 3.457421E-05 6.097333E-03 2.108105E-07 + 23 25 3.457444E-05 2.244139E-02 7.758986E-07 + 23 26 3.457437E-05 1.423642E-02 4.922154E-07 + 23 27 3.457441E-05 1.953980E-02 6.755770E-07 + 23 28 3.457452E-05 2.101536E-02 7.265961E-07 + 23 29 3.457442E-05 2.147790E-02 7.425860E-07 + 23 30 3.457437E-05 2.423669E-02 8.379683E-07 + 23 31 3.457436E-05 3.342587E-02 1.155678E-06 + 23 32 3.457439E-05 1.974744E-02 6.827555E-07 + 23 33 3.457442E-05 6.974425E-02 2.411367E-06 + 23 34 3.457420E-05 2.735950E-03 9.459328E-08 + 23 35 3.457436E-05 1.770761E-01 6.122291E-06 + 23 36 3.457442E-05 2.127843E-01 7.356895E-06 + 23 37 3.457443E-05 6.138100E-02 2.122213E-06 + 23 38 3.457473E-05 2.975490E-03 1.028767E-07 + 23 39 3.457247E-05 7.914931E-05 2.736388E-09 + 24 0 3.456069E-05 8.690714E-07 3.003570E-11 + 24 1 3.457129E-05 2.175756E-05 7.521869E-10 + 24 2 3.457578E-05 2.441456E-04 8.441526E-09 + 24 3 3.457390E-05 1.599227E-03 5.529152E-08 + 24 4 3.457415E-05 6.674120E-03 2.307521E-07 + 24 5 3.457440E-05 1.810509E-02 6.259727E-07 + 24 6 3.457449E-05 3.082225E-02 1.065664E-06 + 24 7 3.457450E-05 2.881240E-02 9.961746E-07 + 24 8 3.457423E-05 8.779102E-03 3.035307E-07 + 24 9 3.457415E-05 1.057137E-03 3.654963E-08 + 24 10 3.457455E-05 1.868342E-02 6.459707E-07 + 24 11 3.457443E-05 1.889001E-02 6.531113E-07 + 24 12 3.457474E-05 4.863525E-04 1.681551E-08 + 24 13 3.457447E-05 1.310140E-02 4.529739E-07 + 24 14 3.457454E-05 1.889952E-02 6.534420E-07 + 24 15 3.457523E-05 1.696035E-04 5.864079E-09 + 24 16 3.457444E-05 1.657708E-02 5.731431E-07 + 24 17 3.457436E-05 1.409293E-02 4.872540E-07 + 24 18 3.457455E-05 1.760230E-03 6.085918E-08 + 24 19 3.457443E-05 2.317378E-02 8.012201E-07 + 24 20 3.457440E-05 3.143602E-03 1.086881E-07 + 24 21 3.457446E-05 1.552288E-02 5.366951E-07 + 24 22 3.457428E-05 1.611539E-02 5.571779E-07 + 24 23 3.457421E-05 4.545811E-03 1.571678E-07 + 24 24 3.457453E-05 2.675154E-02 9.249218E-07 + 24 25 3.457213E-05 5.034413E-05 1.740504E-09 + 24 26 3.457439E-05 3.101341E-02 1.072270E-06 + 24 27 3.457462E-05 1.796399E-03 6.210982E-08 + 24 28 3.457432E-05 3.227435E-02 1.115864E-06 + 24 29 3.457448E-05 5.772167E-03 1.995697E-07 + 24 30 3.457441E-05 3.550775E-02 1.227660E-06 + 24 31 3.457435E-05 8.279580E-03 2.862611E-07 + 24 32 3.457443E-05 4.642699E-02 1.605187E-06 + 24 33 3.457459E-05 6.130751E-03 2.119682E-07 + 24 34 3.457443E-05 7.577354E-02 2.619827E-06 + 24 35 3.457078E-05 4.386469E-06 1.516437E-10 + 24 36 3.457442E-05 1.673041E-01 5.784442E-06 + 24 37 3.457444E-05 2.329423E-01 8.053851E-06 + 24 38 3.457439E-05 6.626912E-02 2.291215E-06 + 24 39 3.457486E-05 2.176468E-03 7.525106E-08 + 25 0 3.457222E-05 4.685539E-07 1.619895E-11 + 25 1 3.457113E-05 1.221412E-05 4.222558E-10 + 25 2 3.457397E-05 1.441373E-04 4.983400E-09 + 25 3 3.457370E-05 1.004099E-03 3.471541E-08 + 25 4 3.457454E-05 4.520540E-03 1.562956E-07 + 25 5 3.457436E-05 1.350598E-02 4.669606E-07 + 25 6 3.457431E-05 2.623787E-02 9.071563E-07 + 25 7 3.457431E-05 3.026975E-02 1.046556E-06 + 25 8 3.457450E-05 1.533155E-02 5.300806E-07 + 25 9 3.457512E-05 1.940402E-04 6.708962E-09 + 25 10 3.457421E-05 1.075604E-02 3.718815E-07 + 25 11 3.457433E-05 2.212942E-02 7.651101E-07 + 25 12 3.457468E-05 5.896220E-03 2.038599E-07 + 25 13 3.457474E-05 3.871732E-03 1.338641E-07 + 25 14 3.457446E-05 2.064266E-02 7.137088E-07 + 25 15 3.457460E-05 6.467182E-03 2.236002E-07 + 25 16 3.457466E-05 5.015642E-03 1.734141E-07 + 25 17 3.457433E-05 2.086269E-02 7.213137E-07 + 25 18 3.457401E-05 2.154166E-03 7.447815E-08 + 25 19 3.457427E-05 1.275442E-02 4.409746E-07 + 25 20 3.457451E-05 1.673126E-02 5.784751E-07 + 25 21 3.457516E-05 9.226260E-04 3.189994E-08 + 25 22 3.457449E-05 2.355809E-02 8.145091E-07 + 25 23 3.457466E-05 3.160332E-03 1.092674E-07 + 25 24 3.457436E-05 1.726326E-02 5.968663E-07 + 25 25 3.457440E-05 1.481523E-02 5.122277E-07 + 25 26 3.457433E-05 7.540451E-03 2.607061E-07 + 25 27 3.457442E-05 2.627964E-02 9.086033E-07 + 25 28 3.457460E-05 1.562166E-03 5.401125E-08 + 25 29 3.457435E-05 3.426612E-02 1.184729E-06 + 25 30 3.458681E-05 2.173944E-06 7.518977E-11 + 25 31 3.457439E-05 4.101474E-02 1.418059E-06 + 25 32 3.457544E-05 4.036109E-04 1.395502E-08 + 25 33 3.457436E-05 5.155818E-02 1.782591E-06 + 25 34 3.457545E-05 2.500165E-04 8.644434E-09 + 25 35 3.457432E-05 7.495491E-02 2.591515E-06 + 25 36 3.457468E-05 1.744427E-03 6.031300E-08 + 25 37 3.457442E-05 1.587771E-01 5.489628E-06 + 25 38 3.457436E-05 2.530052E-01 8.747493E-06 + 25 39 3.457439E-05 6.878178E-02 2.378088E-06 + 26 0 3.461085E-05 2.569577E-07 8.893527E-12 + 26 1 3.456611E-05 6.937377E-06 2.397981E-10 + 26 2 3.457382E-05 8.560654E-05 2.959745E-09 + 26 3 3.457532E-05 6.300898E-04 2.178556E-08 + 26 4 3.457401E-05 3.035121E-03 1.049363E-07 + 26 5 3.457420E-05 9.872443E-03 3.413318E-07 + 26 6 3.457444E-05 2.147201E-02 7.423826E-07 + 26 7 3.457436E-05 2.931625E-02 1.013591E-06 + 26 8 3.457449E-05 2.070210E-02 7.157643E-07 + 26 9 3.457429E-05 2.977352E-03 1.029398E-07 + 26 10 3.457464E-05 4.103169E-03 1.418656E-07 + 26 11 3.457439E-05 1.994141E-02 6.894621E-07 + 26 12 3.457426E-05 1.321661E-02 4.569545E-07 + 26 13 3.457220E-05 2.437831E-05 8.428118E-10 + 26 14 3.457426E-05 1.471675E-02 5.088207E-07 + 26 15 3.457446E-05 1.507384E-02 5.211699E-07 + 26 16 3.457761E-05 1.707439E-06 5.903915E-11 + 26 17 3.457456E-05 1.597524E-02 5.523370E-07 + 26 18 3.457451E-05 1.213854E-02 4.196840E-07 + 26 19 3.457466E-05 1.465693E-03 5.067584E-08 + 26 20 3.457431E-05 2.060374E-02 7.123600E-07 + 26 21 3.457474E-05 4.331695E-03 1.497672E-07 + 26 22 3.457430E-05 1.075309E-02 3.717808E-07 + 26 23 3.457449E-05 1.825643E-02 6.312068E-07 + 26 24 3.457396E-05 7.652272E-04 2.645694E-08 + 26 25 3.457441E-05 2.462697E-02 8.514629E-07 + 26 26 3.457444E-05 2.556765E-03 8.839871E-08 + 26 27 3.457424E-05 2.028463E-02 7.013255E-07 + 26 28 3.457440E-05 1.283581E-02 4.437903E-07 + 26 29 3.457432E-05 1.203767E-02 4.161943E-07 + 26 30 3.457451E-05 2.483229E-02 8.585641E-07 + 26 31 3.457452E-05 5.558435E-03 1.921802E-07 + 26 32 3.457443E-05 3.584314E-02 1.239256E-06 + 26 33 3.457469E-05 2.346489E-03 8.112911E-08 + 26 34 3.457449E-05 4.796359E-02 1.658316E-06 + 26 35 3.457435E-05 1.802260E-03 6.231197E-08 + 26 36 3.457439E-05 6.857697E-02 2.371007E-06 + 26 37 3.457443E-05 6.096563E-03 2.107852E-07 + 26 38 3.457439E-05 1.530083E-01 5.290169E-06 + 26 39 3.457442E-05 2.731559E-01 9.444208E-06 + 27 0 3.455434E-05 1.435046E-07 4.958707E-12 + 27 1 3.456575E-05 3.992723E-06 1.380115E-10 + 27 2 3.457287E-05 5.124913E-05 1.771830E-09 + 27 3 3.457430E-05 3.961847E-04 1.369781E-08 + 27 4 3.457478E-05 2.027170E-03 7.008895E-08 + 27 5 3.457448E-05 7.109260E-03 2.457990E-07 + 27 6 3.457449E-05 1.705198E-02 5.895635E-07 + 27 7 3.457436E-05 2.675736E-02 9.251186E-07 + 27 8 3.457439E-05 2.406407E-02 8.320005E-07 + 27 9 3.457433E-05 7.654409E-03 2.646461E-07 + 27 10 3.457410E-05 5.359345E-04 1.852946E-08 + 27 11 3.457455E-05 1.437351E-02 4.969578E-07 + 27 12 3.457452E-05 1.820853E-02 6.295513E-07 + 27 13 3.457418E-05 2.223712E-03 7.688302E-08 + 27 14 3.457420E-05 6.496453E-03 2.246097E-07 + 27 15 3.457428E-05 1.866802E-02 6.454332E-07 + 27 16 3.457456E-05 3.723648E-03 1.287435E-07 + 27 17 3.457436E-05 6.191502E-03 2.140673E-07 + 27 18 3.457440E-05 1.849048E-02 6.392970E-07 + 27 19 3.457426E-05 1.588952E-03 5.493684E-08 + 27 20 3.457438E-05 1.133083E-02 3.917562E-07 + 27 21 3.457440E-05 1.576795E-02 5.451675E-07 + 27 22 3.457347E-05 2.613932E-04 9.037271E-09 + 27 23 3.457428E-05 2.010641E-02 6.951647E-07 + 27 24 3.457444E-05 5.960245E-03 2.060721E-07 + 27 25 3.457441E-05 1.003446E-02 3.469356E-07 + 27 26 3.457440E-05 1.934575E-02 6.688675E-07 + 27 27 3.457389E-05 9.190053E-04 3.177358E-08 + 27 28 3.457443E-05 2.627551E-02 9.084608E-07 + 27 29 3.457445E-05 1.791704E-03 6.194716E-08 + 27 30 3.457441E-05 2.407090E-02 8.322373E-07 + 27 31 3.457448E-05 1.087020E-02 3.758315E-07 + 27 32 3.457425E-05 1.753090E-02 6.061177E-07 + 27 33 3.457449E-05 2.343072E-02 8.101050E-07 + 27 34 3.457457E-05 1.153638E-02 3.988654E-07 + 27 35 3.457437E-05 3.782056E-02 1.307622E-06 + 27 36 3.457434E-05 8.669830E-03 2.997536E-07 + 27 37 3.457439E-05 5.865657E-02 2.028015E-06 + 27 38 3.457457E-05 1.124957E-02 3.889491E-07 + 27 39 3.457444E-05 1.514574E-01 5.236554E-06 + 28 0 3.454666E-05 8.169307E-08 2.822223E-12 + 28 1 3.457097E-05 2.331607E-06 8.060591E-11 + 28 2 3.457187E-05 3.097780E-05 1.070960E-09 + 28 3 3.457564E-05 2.501633E-04 8.649556E-09 + 28 4 3.457480E-05 1.350960E-03 4.670918E-08 + 28 5 3.457423E-05 5.065680E-03 1.751420E-07 + 28 6 3.457456E-05 1.323665E-02 4.576515E-07 + 28 7 3.457450E-05 2.336030E-02 8.076706E-07 + 28 8 3.457451E-05 2.533820E-02 8.760558E-07 + 28 9 3.457450E-05 1.259028E-02 4.353027E-07 + 28 10 3.457382E-05 2.297213E-04 7.942344E-09 + 28 11 3.457433E-05 8.116860E-03 2.806350E-07 + 28 12 3.457438E-05 1.912008E-02 6.610651E-07 + 28 13 3.457465E-05 7.709700E-03 2.665602E-07 + 28 14 3.457451E-05 1.030366E-03 3.562439E-08 + 28 15 3.457432E-05 1.575640E-02 5.447667E-07 + 28 16 3.457449E-05 1.096542E-02 3.791237E-07 + 28 17 3.457479E-05 3.535246E-04 1.222304E-08 + 28 18 3.457450E-05 1.569355E-02 5.425968E-07 + 28 19 3.457449E-05 9.646041E-03 3.335069E-07 + 28 20 3.457439E-05 1.684271E-03 5.823264E-08 + 28 21 3.457437E-05 1.847284E-02 6.386869E-07 + 28 22 3.457433E-05 4.490655E-03 1.552614E-07 + 28 23 3.457427E-05 8.027664E-03 2.775506E-07 + 28 24 3.457429E-05 1.807941E-02 6.250828E-07 + 28 25 3.456389E-05 1.577762E-06 5.453360E-11 + 28 26 3.457443E-05 1.996710E-02 6.903510E-07 + 28 27 3.457458E-05 7.189008E-03 2.485570E-07 + 28 28 3.457450E-05 1.001541E-02 3.462777E-07 + 28 29 3.457429E-05 2.052622E-02 7.096795E-07 + 28 30 3.457406E-05 1.173889E-03 4.058610E-08 + 28 31 3.457443E-05 2.845379E-02 9.837734E-07 + 28 32 3.457458E-05 1.312924E-03 4.539381E-08 + 28 33 3.457446E-05 2.811034E-02 9.718998E-07 + 28 34 3.457462E-05 1.012495E-02 3.500664E-07 + 28 35 3.457439E-05 2.302127E-02 7.959464E-07 + 28 36 3.457443E-05 2.490262E-02 8.609937E-07 + 28 37 3.457436E-05 1.796261E-02 6.210456E-07 + 28 38 3.457441E-05 4.729752E-02 1.635284E-06 + 28 39 3.457451E-05 1.567880E-02 5.420868E-07 + 29 0 3.467808E-05 4.743684E-08 1.645019E-12 + 29 1 3.459182E-05 1.382929E-06 4.783804E-11 + 29 2 3.457300E-05 1.893329E-05 6.545806E-10 + 29 3 3.457263E-05 1.589319E-04 5.494694E-09 + 29 4 3.457370E-05 9.006445E-04 3.113861E-08 + 29 5 3.457476E-05 3.584739E-03 1.239415E-07 + 29 6 3.457433E-05 1.010122E-02 3.492428E-07 + 29 7 3.457450E-05 1.971786E-02 6.817351E-07 + 29 8 3.457428E-05 2.487844E-02 8.601543E-07 + 29 9 3.457435E-05 1.667928E-02 5.766751E-07 + 29 10 3.457418E-05 2.353205E-03 8.136013E-08 + 29 11 3.457401E-05 3.191387E-03 1.103390E-07 + 29 12 3.457443E-05 1.645996E-02 5.690936E-07 + 29 13 3.457437E-05 1.308551E-02 4.524233E-07 + 29 14 3.457575E-05 2.404174E-04 8.312614E-09 + 29 15 3.457424E-05 9.339721E-03 3.229137E-07 + 29 16 3.457429E-05 1.579440E-02 5.460800E-07 + 29 17 3.457384E-05 1.460353E-03 5.049002E-08 + 29 18 3.457462E-05 7.812271E-03 2.701063E-07 + 29 19 3.457431E-05 1.589647E-02 5.496094E-07 + 29 20 3.457492E-05 7.836394E-04 2.709427E-08 + 29 21 3.457438E-05 1.090738E-02 3.771157E-07 + 29 22 3.457443E-05 1.399822E-02 4.839805E-07 + 29 23 3.457300E-05 1.260765E-04 4.358843E-09 + 29 24 3.457444E-05 1.725144E-02 5.964590E-07 + 29 25 3.457449E-05 7.375161E-03 2.549925E-07 + 29 26 3.457440E-05 5.791820E-03 2.002487E-07 + 29 27 3.457452E-05 1.985111E-02 6.863426E-07 + 29 28 3.457364E-05 1.057090E-04 3.654746E-09 + 29 29 3.457453E-05 2.013398E-02 6.961228E-07 + 29 30 3.457441E-05 8.550235E-03 2.956193E-07 + 29 31 3.457427E-05 9.991116E-03 3.454355E-07 + 29 32 3.457437E-05 2.248757E-02 7.774936E-07 + 29 33 3.457474E-05 1.149374E-03 3.973930E-08 + 29 34 3.457442E-05 3.141151E-02 1.086035E-06 + 29 35 3.457459E-05 1.609916E-03 5.566218E-08 + 29 36 3.457437E-05 3.195201E-02 1.104721E-06 + 29 37 3.457420E-05 1.295350E-02 4.478567E-07 + 29 38 3.457441E-05 2.698875E-02 9.331203E-07 + 29 39 3.457441E-05 3.622394E-02 1.252422E-06 + 30 0 3.469986E-05 2.810317E-08 9.751761E-13 + 30 1 3.458806E-05 8.338247E-07 2.884037E-11 + 30 2 3.456899E-05 1.171494E-05 4.049737E-10 + 30 3 3.457288E-05 1.017589E-04 3.518097E-09 + 30 4 3.457422E-05 6.019790E-04 2.081295E-08 + 30 5 3.457418E-05 2.527098E-03 8.737233E-08 + 30 6 3.457439E-05 7.613358E-03 2.632272E-07 + 30 7 3.457449E-05 1.622095E-02 5.608313E-07 + 30 8 3.457452E-05 2.320245E-02 8.022135E-07 + 30 9 3.457427E-05 1.939760E-02 6.706577E-07 + 30 10 3.457415E-05 5.742269E-03 1.985341E-07 + 30 11 3.457526E-05 5.160607E-04 1.784294E-08 + 30 12 3.457437E-05 1.186780E-02 4.103216E-07 + 30 13 3.457442E-05 1.613707E-02 5.579300E-07 + 30 14 3.457423E-05 3.168727E-03 1.095563E-07 + 30 15 3.457413E-05 3.369251E-03 1.164889E-07 + 30 16 3.457453E-05 1.571048E-02 5.431823E-07 + 30 17 3.457465E-05 6.797138E-03 2.350087E-07 + 30 18 3.457478E-05 1.487078E-03 5.141539E-08 + 30 19 3.457457E-05 1.530187E-02 5.290557E-07 + 30 20 3.457421E-05 6.799543E-03 2.350888E-07 + 30 21 3.457422E-05 2.404437E-03 8.313153E-08 + 30 22 3.457430E-05 1.668034E-02 5.767110E-07 + 30 23 3.457410E-05 3.764967E-03 1.301704E-07 + 30 24 3.457416E-05 6.816997E-03 2.356920E-07 + 30 25 3.457448E-05 1.671397E-02 5.778768E-07 + 30 26 3.457574E-05 1.628554E-04 5.630846E-09 + 30 27 3.457436E-05 1.570820E-02 5.431011E-07 + 30 28 3.457439E-05 1.018962E-02 3.523000E-07 + 30 29 3.457430E-05 4.054409E-03 1.401784E-07 + 30 30 3.457447E-05 2.157506E-02 7.459462E-07 + 30 31 3.457482E-05 5.362953E-04 1.854231E-08 + 30 32 3.457440E-05 2.010046E-02 6.949613E-07 + 30 33 3.457446E-05 1.098772E-02 3.798944E-07 + 30 34 3.457437E-05 8.921828E-03 3.084666E-07 + 30 35 3.457430E-05 2.632553E-02 9.101866E-07 + 30 36 3.457447E-05 4.135220E-04 1.429730E-08 + 30 37 3.457444E-05 3.542230E-02 1.224706E-06 + 30 38 3.457432E-05 4.513553E-03 1.560530E-07 + 30 39 3.457445E-05 3.388092E-02 1.171414E-06 + 31 0 3.464570E-05 1.698852E-08 5.885791E-13 + 31 1 3.459248E-05 5.113394E-07 1.768850E-11 + 31 2 3.458156E-05 7.345401E-06 2.540154E-10 + 31 3 3.457485E-05 6.575199E-05 2.273365E-09 + 31 4 3.457520E-05 4.041515E-04 1.397362E-08 + 31 5 3.457490E-05 1.779353E-03 6.152096E-08 + 31 6 3.457467E-05 5.689068E-03 1.966977E-07 + 31 7 3.457437E-05 1.308689E-02 4.524709E-07 + 31 8 3.457439E-05 2.081745E-02 7.197508E-07 + 31 9 3.457430E-05 2.067180E-02 7.147129E-07 + 31 10 3.457426E-05 9.355499E-03 3.234595E-07 + 31 11 3.457357E-05 7.583675E-05 2.621947E-09 + 31 12 3.457454E-05 7.053956E-03 2.438873E-07 + 31 13 3.457441E-05 1.627012E-02 5.625297E-07 + 31 14 3.457438E-05 7.582914E-03 2.621746E-07 + 31 15 3.457333E-05 2.847862E-04 9.846008E-09 + 31 16 3.457439E-05 1.174580E-02 4.061037E-07 + 31 17 3.457459E-05 1.196267E-02 4.136044E-07 + 31 18 3.457395E-05 1.501760E-04 5.192176E-09 + 31 19 3.457434E-05 9.630317E-03 3.329619E-07 + 31 20 3.457460E-05 1.283998E-02 4.439370E-07 + 31 21 3.457321E-05 1.290532E-04 4.461785E-09 + 31 22 3.457435E-05 1.113878E-02 3.851162E-07 + 31 23 3.457431E-05 1.165304E-02 4.028958E-07 + 31 24 3.457472E-05 2.007164E-04 6.939711E-09 + 31 25 3.457447E-05 1.527247E-02 5.280374E-07 + 31 26 3.457432E-05 7.352575E-03 2.542103E-07 + 31 27 3.457470E-05 3.753334E-03 1.297704E-07 + 31 28 3.457449E-05 1.834659E-02 6.343239E-07 + 31 29 3.457436E-05 1.188827E-03 4.110293E-08 + 31 30 3.457447E-05 1.382191E-02 4.778852E-07 + 31 31 3.457428E-05 1.341301E-02 4.637453E-07 + 31 32 3.457452E-05 2.291276E-03 7.921975E-08 + 31 33 3.457454E-05 2.333614E-02 8.068364E-07 + 31 34 3.457390E-05 1.899048E-03 6.565751E-08 + 31 35 3.457439E-05 1.865626E-02 6.450287E-07 + 31 36 3.457427E-05 1.621424E-02 5.605956E-07 + 31 37 3.457416E-05 5.454031E-03 1.885685E-07 + 31 38 3.457451E-05 3.306607E-02 1.143243E-06 + 31 39 3.457357E-05 4.831573E-04 1.670447E-08 + 32 0 3.458938E-05 1.047552E-08 3.623418E-13 + 32 1 3.455967E-05 3.190442E-07 1.102606E-11 + 32 2 3.457473E-05 4.670699E-06 1.614881E-10 + 32 3 3.457470E-05 4.292595E-05 1.484152E-09 + 32 4 3.457388E-05 2.729828E-04 9.438073E-09 + 32 5 3.457450E-05 1.254106E-03 4.336009E-08 + 32 6 3.457463E-05 4.228057E-03 1.461835E-07 + 32 7 3.457455E-05 1.040617E-02 3.597886E-07 + 32 8 3.457439E-05 1.813482E-02 6.270004E-07 + 32 9 3.457434E-05 2.069891E-02 7.156512E-07 + 32 10 3.457454E-05 1.247686E-02 4.313816E-07 + 32 11 3.457419E-05 1.314249E-03 4.543909E-08 + 32 12 3.457414E-05 3.208634E-03 1.109358E-07 + 32 13 3.457433E-05 1.407198E-02 4.865293E-07 + 32 14 3.457437E-05 1.143362E-02 3.953102E-07 + 32 15 3.457532E-05 4.627339E-04 1.599917E-08 + 32 16 3.457414E-05 6.503585E-03 2.248559E-07 + 32 17 3.457435E-05 1.411836E-02 4.881332E-07 + 32 18 3.457417E-05 3.084182E-03 1.066330E-07 + 32 19 3.457466E-05 3.491461E-03 1.207161E-07 + 32 20 3.457426E-05 1.429769E-02 4.943320E-07 + 32 21 3.457404E-05 3.889900E-03 1.344896E-07 + 32 22 3.457477E-05 3.698843E-03 1.278866E-07 + 32 23 3.457440E-05 1.490463E-02 5.153185E-07 + 32 24 3.457445E-05 2.477209E-03 8.564815E-08 + 32 25 3.457446E-05 6.679857E-03 2.309524E-07 + 32 26 3.457435E-05 1.480190E-02 5.117660E-07 + 32 27 3.457511E-05 2.675174E-04 9.249445E-09 + 32 28 3.457442E-05 1.280761E-02 4.428158E-07 + 32 29 3.457461E-05 1.105060E-02 3.820703E-07 + 32 30 3.457489E-05 1.492031E-03 5.158681E-08 + 32 31 3.457451E-05 1.910854E-02 6.606685E-07 + 32 32 3.457441E-05 3.398414E-03 1.174982E-07 + 32 33 3.457425E-05 1.094448E-02 3.783973E-07 + 32 34 3.457423E-05 1.766601E-02 6.107885E-07 + 32 35 3.457470E-05 4.609304E-04 1.593653E-08 + 32 36 3.457426E-05 2.418596E-02 8.362117E-07 + 32 37 3.457440E-05 6.299791E-03 2.178115E-07 + 32 38 3.457429E-05 1.333718E-02 4.611234E-07 + 32 39 3.457427E-05 2.651392E-02 9.166992E-07 + 33 0 3.439658E-05 6.588569E-09 2.266242E-13 + 33 1 3.461032E-05 2.025630E-07 7.010770E-12 + 33 2 3.456178E-05 3.013557E-06 1.041539E-10 + 33 3 3.457132E-05 2.834061E-05 9.797723E-10 + 33 4 3.457318E-05 1.857529E-04 6.422070E-09 + 33 5 3.457415E-05 8.864321E-04 3.064764E-08 + 33 6 3.457403E-05 3.133439E-03 1.083356E-07 + 33 7 3.457437E-05 8.188018E-03 2.830956E-07 + 33 8 3.457450E-05 1.544609E-02 5.340409E-07 + 33 9 3.457441E-05 1.979201E-02 6.842972E-07 + 33 10 3.457446E-05 1.473664E-02 5.095113E-07 + 33 11 3.457437E-05 3.502174E-03 1.210855E-07 + 33 12 3.457363E-05 8.623866E-04 2.981583E-08 + 33 13 3.457419E-05 1.062957E-02 3.675087E-07 + 33 14 3.457449E-05 1.356213E-02 4.689037E-07 + 33 15 3.457420E-05 2.887073E-03 9.981825E-08 + 33 16 3.457404E-05 2.282220E-03 7.890558E-08 + 33 17 3.457441E-05 1.285825E-02 4.445664E-07 + 33 18 3.457443E-05 7.502595E-03 2.593980E-07 + 33 19 3.457321E-05 2.512827E-04 8.687651E-09 + 33 20 3.457418E-05 1.114406E-02 3.852969E-07 + 33 21 3.457419E-05 9.233086E-03 3.192265E-07 + 33 22 3.457487E-05 8.642305E-05 2.988066E-09 + 33 23 3.457425E-05 1.161121E-02 4.014487E-07 + 33 24 3.457441E-05 8.824000E-03 3.050846E-07 + 33 25 3.457401E-05 5.575884E-04 1.927807E-08 + 33 26 3.457422E-05 1.397472E-02 4.831652E-07 + 33 27 3.457416E-05 6.233941E-03 2.155333E-07 + 33 28 3.457450E-05 3.067528E-03 1.060583E-07 + 33 29 3.457453E-05 1.629687E-02 5.634566E-07 + 33 30 3.457410E-05 2.034205E-03 7.033081E-08 + 33 31 3.457435E-05 9.521101E-03 3.291859E-07 + 33 32 3.457457E-05 1.488707E-02 5.147142E-07 + 33 33 3.457605E-05 1.036481E-04 3.583741E-09 + 33 34 3.457442E-05 1.836367E-02 6.349132E-07 + 33 35 3.457429E-05 7.840639E-03 2.710845E-07 + 33 36 3.457457E-05 6.178205E-03 2.136088E-07 + 33 37 3.457452E-05 2.274769E-02 7.864906E-07 + 33 38 3.457384E-05 6.813024E-04 2.355524E-08 + 33 39 3.457434E-05 2.034045E-02 7.032576E-07 + 34 0 3.449210E-05 4.222400E-09 1.456395E-13 + 34 1 3.462080E-05 1.308558E-07 4.530333E-12 + 34 2 3.458711E-05 1.973604E-06 6.826124E-11 + 34 3 3.457839E-05 1.893616E-05 6.547819E-10 + 34 4 3.457390E-05 1.274745E-04 4.407291E-09 + 34 5 3.457505E-05 6.293224E-04 2.175885E-08 + 34 6 3.457392E-05 2.320811E-03 8.023956E-08 + 34 7 3.457430E-05 6.396193E-03 2.211439E-07 + 34 8 3.457434E-05 1.293289E-02 4.471461E-07 + 34 9 3.457443E-05 1.827600E-02 6.318822E-07 + 34 10 3.457446E-05 1.603946E-02 5.545555E-07 + 34 11 3.457426E-05 5.980232E-03 2.067621E-07 + 34 12 3.457011E-05 1.491721E-05 5.156894E-10 + 34 13 3.457429E-05 6.990983E-03 2.417083E-07 + 34 14 3.457447E-05 1.373755E-02 4.749687E-07 + 34 15 3.457445E-05 6.107326E-03 2.111575E-07 + 34 16 3.457524E-05 2.064411E-04 7.137753E-09 + 34 17 3.457426E-05 9.417342E-03 3.255976E-07 + 34 18 3.457423E-05 1.084811E-02 3.750649E-07 + 34 19 3.457394E-05 5.950760E-04 2.057412E-08 + 34 20 3.457470E-05 6.091815E-03 2.106227E-07 + 34 21 3.457455E-05 1.221265E-02 4.222468E-07 + 34 22 3.457446E-05 1.417334E-03 4.900357E-08 + 34 23 3.457427E-05 5.536248E-03 1.914118E-07 + 34 24 3.457431E-05 1.272751E-02 4.400450E-07 + 34 25 3.457405E-05 1.068658E-03 3.694785E-08 + 34 26 3.457444E-05 7.302378E-03 2.524756E-07 + 34 27 3.457434E-05 1.251852E-02 4.328195E-07 + 34 28 3.457240E-05 1.291323E-04 4.464414E-09 + 34 29 3.457461E-05 1.122161E-02 3.879830E-07 + 34 30 3.457428E-05 1.034655E-02 3.577243E-07 + 34 31 3.457363E-05 6.473010E-04 2.237954E-08 + 34 32 3.457451E-05 1.602164E-02 5.539405E-07 + 34 33 3.457469E-05 5.651882E-03 1.954120E-07 + 34 34 3.457465E-05 5.255567E-03 1.817094E-07 + 34 35 3.457440E-05 1.841213E-02 6.365883E-07 + 34 36 3.457480E-05 9.203202E-04 3.181989E-08 + 34 37 3.457437E-05 1.412646E-02 4.884136E-07 + 34 38 3.457440E-05 1.585141E-02 5.480529E-07 + 34 39 3.457464E-05 6.355219E-04 2.197294E-08 + 35 0 3.416695E-05 2.756250E-09 9.417265E-14 + 35 1 3.453325E-05 8.598970E-08 2.969503E-12 + 35 2 3.457426E-05 1.312170E-06 4.536732E-11 + 35 3 3.456902E-05 1.281132E-05 4.428746E-10 + 35 4 3.457284E-05 8.830436E-05 3.052933E-09 + 35 5 3.457450E-05 4.493425E-04 1.553579E-08 + 35 6 3.457424E-05 1.721053E-03 5.950411E-08 + 35 7 3.457431E-05 4.973797E-03 1.719656E-07 + 35 8 3.457433E-05 1.069073E-02 3.696249E-07 + 35 9 3.457427E-05 1.643120E-02 5.680968E-07 + 35 10 3.457448E-05 1.646594E-02 5.693014E-07 + 35 11 3.457439E-05 8.270076E-03 2.859328E-07 + 35 12 3.457320E-05 3.538428E-04 1.223348E-08 + 35 13 3.457457E-05 3.889089E-03 1.344636E-07 + 35 14 3.457444E-05 1.234957E-02 4.269794E-07 + 35 15 3.457441E-05 8.924600E-03 3.085627E-07 + 35 16 3.457502E-05 2.651377E-04 9.167143E-09 + 35 17 3.457430E-05 5.469435E-03 1.891019E-07 + 35 18 3.457425E-05 1.191191E-02 4.118452E-07 + 35 19 3.457413E-05 3.262375E-03 1.127938E-07 + 35 20 3.457459E-05 1.935691E-03 6.692574E-08 + 35 21 3.457430E-05 1.161350E-02 4.015285E-07 + 35 22 3.457456E-05 5.337584E-03 1.845446E-07 + 35 23 3.457500E-05 1.062077E-03 3.672133E-08 + 35 24 3.457441E-05 1.175725E-02 4.064999E-07 + 35 25 3.457446E-05 5.664099E-03 1.958332E-07 + 35 26 3.457447E-05 1.445534E-03 4.997858E-08 + 35 27 3.457426E-05 1.292273E-02 4.467937E-07 + 35 28 3.457408E-05 4.407055E-03 1.523698E-07 + 35 29 3.457435E-05 3.260979E-03 1.127462E-07 + 35 30 3.457434E-05 1.427046E-02 4.933920E-07 + 35 31 3.457433E-05 2.043557E-03 7.065462E-08 + 35 32 3.457417E-05 7.228292E-03 2.499122E-07 + 35 33 3.457424E-05 1.418383E-02 4.903953E-07 + 35 34 3.457441E-05 1.364645E-04 4.718178E-09 + 35 35 3.457432E-05 1.305676E-02 4.514288E-07 + 35 36 3.457453E-05 1.155854E-02 3.996311E-07 + 35 37 3.457495E-05 8.635723E-04 2.985797E-08 + 35 38 3.457452E-05 1.886900E-02 6.523866E-07 + 35 39 3.457457E-05 7.538308E-03 2.606338E-07 + 36 0 3.462669E-05 1.830984E-09 6.340092E-14 + 36 1 3.452465E-05 5.746088E-08 1.983817E-12 + 36 2 3.459810E-05 8.856692E-07 3.064247E-11 + 36 3 3.456836E-05 8.779547E-06 3.034945E-10 + 36 4 3.457446E-05 6.178856E-05 2.136306E-09 + 36 5 3.457525E-05 3.230090E-04 1.116812E-08 + 36 6 3.457375E-05 1.279807E-03 4.424773E-08 + 36 7 3.457447E-05 3.858699E-03 1.334125E-07 + 36 8 3.457447E-05 8.754858E-03 3.026946E-07 + 36 9 3.457424E-05 1.447200E-02 5.003584E-07 + 36 10 3.457424E-05 1.618513E-02 5.595886E-07 + 36 11 3.457436E-05 1.009206E-02 3.489267E-07 + 36 12 3.457438E-05 1.452823E-03 5.023045E-08 + 36 13 3.457391E-05 1.684624E-03 5.824404E-08 + 36 14 3.457429E-05 1.004241E-02 3.472091E-07 + 36 15 3.457423E-05 1.067099E-02 3.689411E-07 + 36 16 3.457464E-05 1.779480E-03 6.152487E-08 + 36 17 3.457431E-05 2.291481E-03 7.922639E-08 + 36 18 3.457442E-05 1.079918E-02 3.733753E-07 + 36 19 3.457455E-05 6.437846E-03 2.225856E-07 + 36 20 3.457673E-05 8.547557E-05 2.955466E-09 + 36 21 3.457439E-05 8.498225E-03 2.938209E-07 + 36 22 3.457437E-05 8.876003E-03 3.068822E-07 + 36 23 3.457305E-05 7.748999E-05 2.679065E-09 + 36 24 3.457416E-05 7.569218E-03 2.616994E-07 + 36 25 3.457439E-05 9.806153E-03 3.390417E-07 + 36 26 3.457613E-05 1.125645E-04 3.892043E-09 + 36 27 3.457422E-05 8.343905E-03 2.884840E-07 + 36 28 3.457428E-05 9.792142E-03 3.385562E-07 + 36 29 3.457825E-05 5.086828E-07 1.758936E-11 + 36 30 3.457421E-05 1.056138E-02 3.651512E-07 + 36 31 3.457465E-05 8.641863E-03 2.987894E-07 + 36 32 3.457385E-05 5.145629E-04 1.779042E-08 + 36 33 3.457427E-05 1.355318E-02 4.685912E-07 + 36 34 3.457457E-05 6.281821E-03 2.171913E-07 + 36 35 3.457425E-05 2.608532E-03 9.018803E-08 + 36 36 3.457423E-05 1.617986E-02 5.594062E-07 + 36 37 3.457430E-05 3.518673E-03 1.216556E-07 + 36 38 3.457438E-05 6.302343E-03 2.178996E-07 + 36 39 3.457438E-05 1.787858E-02 6.181408E-07 + 37 0 3.517140E-05 1.236226E-09 4.347978E-14 + 37 1 3.451641E-05 3.902600E-08 1.347037E-12 + 37 2 3.456121E-05 6.068098E-07 2.097208E-11 + 37 3 3.457708E-05 6.095368E-06 2.107601E-10 + 37 4 3.457367E-05 4.369342E-05 1.510642E-09 + 37 5 3.457371E-05 2.339603E-04 8.088874E-09 + 37 6 3.457449E-05 9.554899E-04 3.303558E-08 + 37 7 3.457430E-05 2.992046E-03 1.034479E-07 + 37 8 3.457416E-05 7.122422E-03 2.462517E-07 + 37 9 3.457453E-05 1.254646E-02 4.337881E-07 + 37 10 3.457443E-05 1.539145E-02 5.321508E-07 + 37 11 3.457460E-05 1.133261E-02 3.918202E-07 + 37 12 3.457434E-05 2.905210E-03 1.004457E-07 + 37 13 3.457521E-05 4.350945E-04 1.504349E-08 + 37 14 3.457460E-05 7.442175E-03 2.573102E-07 + 37 15 3.457429E-05 1.118560E-02 3.867341E-07 + 37 16 3.457406E-05 3.895909E-03 1.346974E-07 + 37 17 3.457396E-05 4.722133E-04 1.632629E-08 + 37 18 3.457458E-05 8.344675E-03 2.885136E-07 + 37 19 3.457418E-05 8.753554E-03 3.026470E-07 + 37 20 3.457444E-05 4.865633E-04 1.682265E-08 + 37 21 3.457466E-05 4.722103E-03 1.632651E-07 + 37 22 3.457419E-05 1.031665E-02 3.566897E-07 + 37 23 3.457469E-05 1.913729E-03 6.616658E-08 + 37 24 3.457460E-05 3.136385E-03 1.084393E-07 + 37 25 3.457459E-05 1.088803E-02 3.764492E-07 + 37 26 3.457443E-05 2.604146E-03 9.003685E-08 + 37 27 3.457472E-05 3.050633E-03 1.054748E-07 + 37 28 3.457419E-05 1.154211E-02 3.990592E-07 + 37 29 3.457469E-05 2.317796E-03 8.013706E-08 + 37 30 3.457432E-05 4.145834E-03 1.433394E-07 + 37 31 3.457423E-05 1.222593E-02 4.227020E-07 + 37 32 3.457441E-05 1.367157E-03 4.726864E-08 + 37 33 3.457441E-05 6.383762E-03 2.207148E-07 + 37 34 3.457460E-05 1.249358E-02 4.319606E-07 + 37 35 3.457537E-05 4.030205E-04 1.393458E-08 + 37 36 3.457438E-05 9.433031E-03 3.261411E-07 + 37 37 3.457437E-05 1.223624E-02 4.230602E-07 + 37 38 3.458105E-05 8.555742E-06 2.958666E-10 + 37 39 3.457423E-05 1.247742E-02 4.313971E-07 + 38 0 3.533932E-05 8.479744E-10 2.996684E-14 + 38 1 3.451091E-05 2.692225E-08 9.291114E-13 + 38 2 3.459093E-05 4.219022E-07 1.459399E-11 + 38 3 3.458281E-05 4.287426E-06 1.482712E-10 + 38 4 3.457620E-05 3.123513E-05 1.079992E-09 + 38 5 3.457266E-05 1.708557E-04 5.906938E-09 + 38 6 3.457489E-05 7.169087E-04 2.478704E-08 + 38 7 3.457473E-05 2.322240E-03 8.029083E-08 + 38 8 3.457460E-05 5.769200E-03 1.994678E-07 + 38 9 3.457453E-05 1.074637E-02 3.715505E-07 + 38 10 3.457422E-05 1.426668E-02 4.932593E-07 + 38 11 3.457426E-05 1.199413E-02 4.146881E-07 + 38 12 3.457413E-05 4.391780E-03 1.518420E-07 + 38 13 3.456968E-05 6.667912E-06 2.305075E-10 + 38 14 3.457438E-05 5.014736E-03 1.733814E-07 + 38 15 3.457433E-05 1.064857E-02 3.681673E-07 + 38 16 3.457430E-05 5.909135E-03 2.043042E-07 + 38 17 3.456745E-05 5.722956E-06 1.978280E-10 + 38 18 3.457465E-05 5.512715E-03 1.906002E-07 + 38 19 3.457434E-05 9.630973E-03 3.329846E-07 + 38 20 3.457441E-05 2.255425E-03 7.797998E-08 + 38 21 3.457479E-05 1.753768E-03 6.063615E-08 + 38 22 3.457441E-05 9.511034E-03 3.288384E-07 + 38 23 3.457440E-05 4.782285E-03 1.653447E-07 + 38 24 3.457504E-05 4.922980E-04 1.702123E-08 + 38 25 3.457462E-05 8.999668E-03 3.111601E-07 + 38 26 3.457417E-05 6.161878E-03 2.130418E-07 + 38 27 3.457578E-05 2.314965E-04 8.004174E-09 + 38 28 3.457430E-05 9.242317E-03 3.195467E-07 + 38 29 3.457447E-05 6.590796E-03 2.278733E-07 + 38 30 3.457378E-05 3.361411E-04 1.162167E-08 + 38 31 3.457437E-05 1.029160E-02 3.558255E-07 + 38 32 3.457456E-05 6.288507E-03 2.174224E-07 + 38 33 3.457386E-05 8.038336E-04 2.779163E-08 + 38 34 3.457455E-05 1.183452E-02 4.091732E-07 + 38 35 3.457424E-05 5.557981E-03 1.921630E-07 + 38 36 3.457442E-05 1.667342E-03 5.764739E-08 + 38 37 3.457435E-05 1.348096E-02 4.660953E-07 + 38 38 3.457435E-05 5.026213E-03 1.737780E-07 + 38 39 3.457396E-05 2.446303E-03 8.457841E-08 + 39 0 3.397254E-05 5.904900E-10 2.006045E-14 + 39 1 3.450158E-05 1.885404E-08 6.504940E-13 + 39 2 3.455105E-05 2.975702E-07 1.028137E-11 + 39 3 3.456835E-05 3.054945E-06 1.056044E-10 + 39 4 3.457212E-05 2.257609E-05 7.805031E-10 + 39 5 3.457302E-05 1.258512E-04 4.351054E-09 + 39 6 3.457533E-05 5.409769E-04 1.870446E-08 + 39 7 3.457448E-05 1.806175E-03 6.244757E-08 + 39 8 3.457426E-05 4.661112E-03 1.611545E-07 + 39 9 3.457431E-05 9.120500E-03 3.153350E-07 + 39 10 3.457457E-05 1.296158E-02 4.481411E-07 + 39 11 3.457457E-05 1.214707E-02 4.199797E-07 + 39 12 3.457446E-05 5.699605E-03 1.970608E-07 + 39 13 3.457436E-05 1.783085E-04 6.164901E-09 + 39 14 3.457416E-05 3.029434E-03 1.047401E-07 + 39 15 3.457421E-05 9.396588E-03 3.248796E-07 + 39 16 3.457428E-05 7.390499E-03 2.555212E-07 + 39 17 3.457462E-05 5.399614E-04 1.866896E-08 + 39 18 3.457452E-05 3.030433E-03 1.047758E-07 + 39 19 3.457455E-05 9.152799E-03 3.164539E-07 + 39 20 3.457459E-05 4.366573E-03 1.509725E-07 + 39 21 3.457323E-05 2.315543E-04 8.005582E-09 + 39 22 3.457462E-05 7.274579E-03 2.515158E-07 + 39 23 3.457452E-05 7.110945E-03 2.458575E-07 + 39 24 3.457431E-05 8.845158E-05 3.058152E-09 + 39 25 3.457443E-05 5.708807E-03 1.973788E-07 + 39 26 3.457448E-05 8.489076E-03 2.935054E-07 + 39 27 3.457517E-05 4.547394E-04 1.572269E-08 + 39 28 3.457441E-05 5.181457E-03 1.791458E-07 + 39 29 3.457451E-05 9.278577E-03 3.208022E-07 + 39 30 3.457496E-05 5.921241E-04 2.047267E-08 + 39 31 3.457413E-05 5.535973E-03 1.914014E-07 + 39 32 3.457440E-05 9.840634E-03 3.402340E-07 + 39 33 3.457375E-05 4.743998E-04 1.640178E-08 + 39 34 3.457435E-05 6.475625E-03 2.238906E-07 + 39 35 3.457432E-05 1.034490E-02 3.576679E-07 + 39 36 3.457396E-05 3.197345E-04 1.105449E-08 + 39 37 3.457414E-05 7.506020E-03 2.595142E-07 + 39 38 3.457439E-05 1.114301E-02 3.852627E-07 + 39 39 3.457485E-05 3.670362E-04 1.269022E-08 + 40 0 3.567365E-05 4.169764E-10 1.487507E-14 + 40 1 3.458883E-05 1.339343E-08 4.632632E-13 + 40 2 3.453084E-05 2.127977E-07 7.348083E-12 + 40 3 3.457351E-05 2.204483E-06 7.621671E-11 + 40 4 3.456915E-05 1.649773E-05 5.703126E-10 + 40 5 3.457233E-05 9.352399E-05 3.233342E-09 + 40 6 3.457352E-05 4.107622E-04 1.420150E-08 + 40 7 3.457462E-05 1.408977E-03 4.871484E-08 + 40 8 3.457408E-05 3.761440E-03 1.300483E-07 + 40 9 3.457420E-05 7.687491E-03 2.657888E-07 + 40 10 3.457419E-05 1.159061E-02 4.007361E-07 + 40 11 3.457453E-05 1.189239E-02 4.111739E-07 + 40 12 3.457437E-05 6.712287E-03 2.320731E-07 + 40 13 3.457353E-05 7.167577E-04 2.478085E-08 + 40 14 3.457392E-05 1.585343E-03 5.481150E-08 + 40 15 3.457430E-05 7.783037E-03 2.690930E-07 + 40 16 3.457442E-05 8.179048E-03 2.827858E-07 + 40 17 3.457451E-05 1.616208E-03 5.587960E-08 + 40 18 3.457453E-05 1.271701E-03 4.396845E-08 + 40 19 3.457442E-05 7.756587E-03 2.681795E-07 + 40 20 3.457426E-05 6.069664E-03 2.098542E-07 + 40 21 3.457253E-05 7.810494E-05 2.700286E-09 + 40 22 3.457462E-05 4.640803E-03 1.604540E-07 + 40 23 3.457454E-05 8.132250E-03 2.811688E-07 + 40 24 3.457379E-05 1.272396E-03 4.399155E-08 + 40 25 3.457455E-05 2.631455E-03 9.098138E-08 + 40 26 3.457439E-05 8.767279E-03 3.031233E-07 + 40 27 3.457416E-05 2.504747E-03 8.659954E-08 + 40 28 3.457491E-05 1.761729E-03 6.091160E-08 + 40 29 3.457436E-05 9.161685E-03 3.167594E-07 + 40 30 3.457428E-05 3.251364E-03 1.124135E-07 + 40 31 3.457407E-05 1.537272E-03 5.314974E-08 + 40 32 3.457443E-05 9.727188E-03 3.363120E-07 + 40 33 3.457442E-05 3.620275E-03 1.251689E-07 + 40 34 3.457494E-05 1.608397E-03 5.561022E-08 + 40 35 3.457449E-05 1.048045E-02 3.623560E-07 + 40 36 3.457415E-05 3.984518E-03 1.377613E-07 + 40 37 3.457395E-05 1.606404E-03 5.553973E-08 + 40 38 3.457421E-05 1.125707E-02 3.892043E-07 + 40 39 3.457419E-05 5.015332E-03 1.734010E-07 + 41 0 3.504248E-05 2.985984E-10 1.046363E-14 + 41 1 3.467838E-05 9.645204E-09 3.344801E-13 + 41 2 3.458870E-05 1.541976E-07 5.333494E-12 + 41 3 3.458917E-05 1.610386E-06 5.570193E-11 + 41 4 3.456985E-05 1.218652E-05 4.212862E-10 + 41 5 3.457478E-05 7.011935E-05 2.424361E-09 + 41 6 3.457407E-05 3.139215E-04 1.085354E-08 + 41 7 3.457399E-05 1.103055E-03 3.813701E-08 + 41 8 3.457456E-05 3.034998E-03 1.049337E-07 + 41 9 3.457465E-05 6.446420E-03 2.228827E-07 + 41 10 3.457417E-05 1.023404E-02 3.538335E-07 + 41 11 3.457446E-05 1.133635E-02 3.919483E-07 + 41 12 3.457430E-05 7.387734E-03 2.554257E-07 + 41 13 3.457419E-05 1.419865E-03 4.909070E-08 + 41 14 3.457504E-05 6.624446E-04 2.290405E-08 + 41 15 3.457433E-05 6.098357E-03 2.108466E-07 + 41 16 3.457457E-05 8.306948E-03 2.872091E-07 + 41 17 3.457464E-05 2.827594E-03 9.776307E-08 + 41 18 3.457459E-05 3.041777E-04 1.051682E-08 + 41 19 3.457424E-05 5.954908E-03 2.058864E-07 + 41 20 3.457466E-05 7.010279E-03 2.423780E-07 + 41 21 3.457468E-05 8.349170E-04 2.886699E-08 + 41 22 3.457420E-05 2.385120E-03 8.246361E-08 + 41 23 3.457425E-05 7.833896E-03 2.708511E-07 + 41 24 3.457446E-05 3.048587E-03 1.054033E-07 + 41 25 3.457506E-05 6.808593E-04 2.354075E-08 + 41 26 3.457437E-05 7.389099E-03 2.554735E-07 + 41 27 3.457445E-05 4.803309E-03 1.660718E-07 + 41 28 3.457296E-05 1.383211E-04 4.782171E-09 + 41 29 3.457456E-05 6.991264E-03 2.417199E-07 + 41 30 3.457469E-05 5.973639E-03 2.065367E-07 + 41 31 3.456864E-05 1.517741E-05 5.246625E-10 + 41 32 3.457426E-05 6.924908E-03 2.394235E-07 + 41 33 3.457447E-05 6.851563E-03 2.368892E-07 + 41 34 3.457378E-05 8.050935E-07 2.783512E-11 + 41 35 3.457415E-05 7.013967E-03 2.425020E-07 + 41 36 3.457414E-05 7.811196E-03 2.700654E-07 + 41 37 3.457434E-05 5.589835E-05 1.932649E-09 + 41 38 3.457431E-05 6.746988E-03 2.332725E-07 + 41 39 3.457462E-05 9.281769E-03 3.209137E-07 + 42 0 3.462228E-05 2.163841E-10 7.491710E-15 + 42 1 3.437469E-05 7.035854E-09 2.418553E-13 + 42 2 3.461283E-05 1.131448E-07 3.916260E-12 + 42 3 3.459536E-05 1.190216E-06 4.117594E-11 + 42 4 3.456683E-05 9.096015E-06 3.144204E-10 + 42 5 3.457720E-05 5.303015E-05 1.833634E-09 + 42 6 3.457461E-05 2.414848E-04 8.349242E-09 + 42 7 3.457493E-05 8.669185E-04 2.997365E-08 + 42 8 3.457399E-05 2.450208E-03 8.471348E-08 + 42 9 3.457435E-05 5.384843E-03 1.861775E-07 + 42 10 3.457418E-05 8.943506E-03 3.092143E-07 + 42 11 3.457424E-05 1.057581E-02 3.656507E-07 + 42 12 3.457446E-05 7.733848E-03 2.673936E-07 + 42 13 3.457455E-05 2.134736E-03 7.380753E-08 + 42 14 3.457489E-05 1.735490E-04 6.000437E-09 + 42 15 3.457407E-05 4.540779E-03 1.569932E-07 + 42 16 3.457443E-05 7.912579E-03 2.735729E-07 + 42 17 3.457469E-05 3.890411E-03 1.345098E-07 + 42 18 3.458217E-05 1.573570E-06 5.441744E-11 + 42 19 3.457471E-05 4.164592E-03 1.439896E-07 + 42 20 3.457464E-05 7.162697E-03 2.476477E-07 + 42 21 3.457461E-05 1.971177E-03 6.815267E-08 + 42 22 3.457399E-05 8.763850E-04 3.030012E-08 + 42 23 3.457435E-05 6.629443E-03 2.292087E-07 + 42 24 3.457456E-05 4.612776E-03 1.594847E-07 + 42 25 3.456734E-05 7.689695E-06 2.658123E-10 + 42 26 3.457430E-05 5.239820E-03 1.811631E-07 + 42 27 3.457469E-05 6.303668E-03 2.179474E-07 + 42 28 3.457408E-05 2.211008E-04 7.644357E-09 + 42 29 3.457436E-05 4.188851E-03 1.448268E-07 + 42 30 3.457452E-05 7.344961E-03 2.539485E-07 + 42 31 3.457496E-05 6.900052E-04 2.385690E-08 + 42 32 3.457462E-05 3.540663E-03 1.224171E-07 + 42 33 3.457461E-05 8.140442E-03 2.814526E-07 + 42 34 3.457502E-05 1.230786E-03 4.255445E-08 + 42 35 3.457442E-05 3.004639E-03 1.038837E-07 + 42 36 3.457416E-05 8.898007E-03 3.076412E-07 + 42 37 3.457398E-05 2.085655E-03 7.210939E-08 + 42 38 3.457461E-05 2.135598E-03 7.383747E-08 + 42 39 3.457458E-05 9.480473E-03 3.277834E-07 + 43 0 3.525262E-05 1.585081E-10 5.587825E-15 + 43 1 3.476919E-05 5.192644E-09 1.805440E-13 + 43 2 3.455291E-05 8.398984E-08 2.902093E-12 + 43 3 3.455319E-05 8.893433E-07 3.072965E-11 + 43 4 3.456819E-05 6.856123E-06 2.370038E-10 + 43 5 3.457416E-05 4.043866E-05 1.398133E-09 + 43 6 3.457315E-05 1.869405E-04 6.463122E-09 + 43 7 3.457505E-05 6.840056E-04 2.364953E-08 + 43 8 3.457433E-05 1.979877E-03 6.845292E-08 + 43 9 3.457469E-05 4.484424E-03 1.550475E-07 + 43 10 3.457417E-05 7.748513E-03 2.678984E-07 + 43 11 3.457424E-05 9.691377E-03 3.350719E-07 + 43 12 3.457441E-05 7.787498E-03 2.692482E-07 + 43 13 3.457438E-05 2.759435E-03 9.540574E-08 + 43 14 3.458214E-05 5.370806E-06 1.857340E-10 + 43 15 3.457441E-05 3.219382E-03 1.113082E-07 + 43 16 3.457418E-05 7.169703E-03 2.478866E-07 + 43 17 3.457462E-05 4.652297E-03 1.608514E-07 + 43 18 3.457479E-05 1.545994E-04 5.345241E-09 + 43 19 3.457444E-05 2.643903E-03 9.141148E-08 + 43 20 3.457432E-05 6.694547E-03 2.314594E-07 + 43 21 3.457415E-05 3.067708E-03 1.060634E-07 + 43 22 3.457548E-05 1.419863E-04 4.909245E-09 + 43 23 3.457465E-05 5.032528E-03 1.739979E-07 + 43 24 3.457457E-05 5.547558E-03 1.918044E-07 + 43 25 3.457450E-05 2.881968E-04 9.964259E-09 + 43 26 3.457462E-05 3.121637E-03 1.079294E-07 + 43 27 3.457417E-05 6.684725E-03 2.311188E-07 + 43 28 3.457380E-05 1.290359E-03 4.461262E-08 + 43 29 3.457427E-05 1.863680E-03 6.443537E-08 + 43 30 3.457443E-05 7.144405E-03 2.470137E-07 + 43 31 3.457410E-05 2.373899E-03 8.207542E-08 + 43 32 3.457470E-05 1.101477E-03 3.808325E-08 + 43 33 3.457429E-05 7.353270E-03 2.542341E-07 + 43 34 3.457467E-05 3.484585E-03 1.204784E-07 + 43 35 3.457358E-05 5.473415E-04 1.892355E-08 + 43 36 3.457416E-05 7.324982E-03 2.532551E-07 + 43 37 3.457430E-05 4.920806E-03 1.701334E-07 + 43 38 3.457401E-05 8.050881E-05 2.783512E-09 + 43 39 3.457436E-05 6.573122E-03 2.272615E-07 + 44 0 3.372229E-05 1.175056E-10 3.962557E-15 + 44 1 3.455909E-05 3.873818E-09 1.338756E-13 + 44 2 3.454746E-05 6.300602E-08 2.176698E-12 + 44 3 3.455055E-05 6.711869E-07 2.318988E-11 + 44 4 3.457911E-05 5.214281E-06 1.803052E-10 + 44 5 3.457558E-05 3.107137E-05 1.074311E-09 + 44 6 3.457278E-05 1.455596E-04 5.032401E-09 + 44 7 3.457456E-05 5.416428E-04 1.872706E-08 + 44 8 3.457446E-05 1.601235E-03 5.536185E-08 + 44 9 3.457455E-05 3.724629E-03 1.287774E-07 + 44 10 3.457432E-05 6.662505E-03 2.303516E-07 + 44 11 3.457456E-05 8.745571E-03 3.023743E-07 + 44 12 3.457424E-05 7.598686E-03 2.627188E-07 + 44 13 3.457467E-05 3.235932E-03 1.118813E-07 + 44 14 3.457728E-05 4.576495E-05 1.582427E-09 + 44 15 3.457483E-05 2.172913E-03 7.512808E-08 + 44 16 3.457463E-05 6.241678E-03 2.158037E-07 + 44 17 3.457446E-05 5.066789E-03 1.751815E-07 + 44 18 3.457423E-05 5.504349E-04 1.903086E-08 + 44 19 3.457432E-05 1.501271E-03 5.190542E-08 + 44 20 3.457439E-05 5.841423E-03 2.019636E-07 + 44 21 3.457450E-05 3.878589E-03 1.341003E-07 + 44 22 3.457427E-05 1.110302E-05 3.838789E-10 + 44 23 3.457414E-05 3.456966E-03 1.195216E-07 + 44 24 3.457457E-05 5.780898E-03 1.998721E-07 + 44 25 3.457441E-05 1.050310E-03 3.631384E-08 + 44 26 3.457499E-05 1.502072E-03 5.193411E-08 + 44 27 3.457412E-05 6.135968E-03 2.121457E-07 + 44 28 3.457395E-05 2.581219E-03 8.924293E-08 + 44 29 3.457491E-05 4.865271E-04 1.682163E-08 + 44 30 3.457453E-05 5.874686E-03 2.031145E-07 + 44 31 3.457405E-05 3.968160E-03 1.371953E-07 + 44 32 3.457671E-05 7.018267E-05 2.426686E-09 + 44 33 3.457417E-05 5.397055E-03 1.865987E-07 + 44 34 3.457452E-05 5.241239E-03 1.812133E-07 + 44 35 3.457860E-05 2.588968E-05 8.952288E-10 + 44 36 3.457414E-05 4.617832E-03 1.596576E-07 + 44 37 3.457427E-05 6.567715E-03 2.270740E-07 + 44 38 3.457444E-05 5.151007E-04 1.780932E-08 + 44 39 3.457469E-05 3.114905E-03 1.076969E-07 + 45 0 3.455513E-05 8.779690E-11 3.033833E-15 + 45 1 3.480138E-05 2.918160E-09 1.015560E-13 + 45 2 3.448149E-05 4.770730E-08 1.645019E-12 + 45 3 3.455388E-05 5.109533E-07 1.765542E-11 + 45 4 3.457780E-05 3.996681E-06 1.381964E-10 + 45 5 3.457003E-05 2.403088E-05 8.307482E-10 + 45 6 3.457246E-05 1.139008E-04 3.937830E-09 + 45 7 3.457488E-05 4.301721E-04 1.487315E-08 + 45 8 3.457474E-05 1.295569E-03 4.479396E-08 + 45 9 3.457429E-05 3.084989E-03 1.066613E-07 + 45 10 3.457417E-05 5.687940E-03 1.966558E-07 + 45 11 3.457415E-05 7.783896E-03 2.691216E-07 + 45 12 3.457457E-05 7.219906E-03 2.496251E-07 + 45 13 3.457452E-05 3.539717E-03 1.223840E-07 + 45 14 3.457328E-05 1.986823E-04 6.869099E-09 + 45 15 3.457494E-05 1.392736E-03 4.815377E-08 + 45 16 3.457408E-05 5.258564E-03 1.818100E-07 + 45 17 3.457471E-05 5.157167E-03 1.783076E-07 + 45 18 3.457509E-05 1.015924E-03 3.512565E-08 + 45 19 3.457406E-05 7.367321E-04 2.547182E-08 + 45 20 3.457439E-05 4.823557E-03 1.667715E-07 + 45 21 3.457418E-05 4.314519E-03 1.491710E-07 + 45 22 3.457551E-05 2.471678E-04 8.545952E-09 + 45 23 3.457479E-05 2.146980E-03 7.423141E-08 + 45 24 3.457414E-05 5.449784E-03 1.884216E-07 + 45 25 3.457397E-05 1.888387E-03 6.528906E-08 + 45 26 3.457418E-05 5.148919E-04 1.780197E-08 + 45 27 3.457457E-05 5.051734E-03 1.746615E-07 + 45 28 3.457473E-05 3.585223E-03 1.239581E-07 + 45 29 3.456961E-05 1.139177E-05 3.938091E-10 + 45 30 3.457467E-05 4.208149E-03 1.454954E-07 + 45 31 3.457442E-05 4.890234E-03 1.690770E-07 + 45 32 3.457498E-05 1.561665E-04 5.399454E-09 + 45 33 3.457466E-05 3.274796E-03 1.132249E-07 + 45 34 3.457430E-05 5.882421E-03 2.033806E-07 + 45 35 3.457392E-05 7.679699E-04 2.655173E-08 + 45 36 3.457403E-05 2.178893E-03 7.533311E-08 + 45 37 3.457437E-05 6.559131E-03 2.267778E-07 + 45 38 3.457400E-05 2.082721E-03 7.200800E-08 + 45 39 3.457424E-05 8.149032E-04 2.817466E-08 + 46 0 3.363948E-05 6.625960E-11 2.228939E-15 + 46 1 3.424742E-05 2.214644E-09 7.584582E-14 + 46 2 3.454659E-05 3.639319E-08 1.257261E-12 + 46 3 3.454543E-05 3.917133E-07 1.353190E-11 + 46 4 3.457504E-05 3.082482E-06 1.065769E-10 + 46 5 3.457937E-05 1.868029E-05 6.459526E-10 + 46 6 3.457386E-05 8.944979E-05 3.092625E-09 + 46 7 3.457456E-05 3.422456E-04 1.183299E-08 + 46 8 3.457502E-05 1.047691E-03 3.622393E-08 + 46 9 3.457435E-05 2.546362E-03 8.803880E-08 + 46 10 3.457445E-05 4.820203E-03 1.666559E-07 + 46 11 3.457462E-05 6.837252E-03 2.363954E-07 + 46 12 3.457444E-05 6.699781E-03 2.316412E-07 + 46 13 3.457475E-05 3.669361E-03 1.268672E-07 + 46 14 3.457460E-05 3.901052E-04 1.348773E-08 + 46 15 3.457482E-05 8.434807E-04 2.916320E-08 + 46 16 3.457451E-05 4.310700E-03 1.490403E-07 + 46 17 3.457415E-05 4.983072E-03 1.722855E-07 + 46 18 3.457401E-05 1.432203E-03 4.951701E-08 + 46 19 3.457315E-05 2.887080E-04 9.981546E-09 + 46 20 3.457421E-05 3.806041E-03 1.315909E-07 + 46 21 3.457419E-05 4.393370E-03 1.518972E-07 + 46 22 3.457496E-05 6.338305E-04 2.191466E-08 + 46 23 3.457384E-05 1.191661E-03 4.120029E-08 + 46 24 3.457446E-05 4.767205E-03 1.648235E-07 + 46 25 3.457399E-05 2.547942E-03 8.809250E-08 + 46 26 3.457221E-05 7.558355E-05 2.613091E-09 + 46 27 3.457449E-05 3.808570E-03 1.316794E-07 + 46 28 3.457461E-05 4.097774E-03 1.416789E-07 + 46 29 3.457361E-05 1.400710E-04 4.842761E-09 + 46 30 3.457397E-05 2.654546E-03 9.177822E-08 + 46 31 3.457458E-05 5.046407E-03 1.744774E-07 + 46 32 3.457478E-05 8.059762E-04 2.786645E-08 + 46 33 3.457412E-05 1.606879E-03 5.555642E-08 + 46 34 3.457433E-05 5.514257E-03 1.906517E-07 + 46 35 3.457488E-05 1.895963E-03 6.555271E-08 + 46 36 3.457456E-05 6.581210E-04 2.275425E-08 + 46 37 3.457446E-05 5.404680E-03 1.868639E-07 + 46 38 3.457408E-05 3.536021E-03 1.222547E-07 + 46 39 3.457541E-05 1.545197E-05 5.342584E-10 + 47 0 3.736409E-05 5.012640E-11 1.872928E-15 + 47 1 3.408006E-05 1.690032E-09 5.759639E-14 + 47 2 3.466336E-05 2.790904E-08 9.674212E-13 + 47 3 3.457823E-05 3.017305E-07 1.043331E-11 + 47 4 3.457350E-05 2.386932E-06 8.252461E-11 + 47 5 3.457841E-05 1.456430E-05 5.036103E-10 + 47 6 3.457700E-05 7.036156E-05 2.432892E-09 + 47 7 3.457475E-05 2.722688E-04 9.413627E-09 + 47 8 3.457384E-05 8.453713E-04 2.922773E-08 + 47 9 3.457424E-05 2.091510E-03 7.231238E-08 + 47 10 3.457450E-05 4.050467E-03 1.400429E-07 + 47 11 3.457433E-05 5.924777E-03 2.048452E-07 + 47 12 3.457468E-05 6.079812E-03 2.102076E-07 + 47 13 3.457424E-05 3.637627E-03 1.257682E-07 + 47 14 3.457401E-05 5.682884E-04 1.964801E-08 + 47 15 3.457336E-05 4.787287E-04 1.655126E-08 + 47 16 3.457435E-05 3.451911E-03 1.193476E-07 + 47 17 3.457455E-05 4.615595E-03 1.595821E-07 + 47 18 3.457470E-05 1.731706E-03 5.987321E-08 + 47 19 3.457444E-05 7.201525E-05 2.489887E-09 + 47 20 3.457481E-05 2.890618E-03 9.994259E-08 + 47 21 3.457419E-05 4.188524E-03 1.448148E-07 + 47 22 3.457415E-05 1.013692E-03 3.504754E-08 + 47 23 3.457404E-05 5.746539E-04 1.986811E-08 + 47 24 3.457403E-05 3.933842E-03 1.360088E-07 + 47 25 3.457404E-05 2.921632E-03 1.010126E-07 + 47 26 3.457271E-05 7.416363E-06 2.564038E-10 + 47 27 3.457415E-05 2.663642E-03 9.209314E-08 + 47 28 3.457464E-05 4.134086E-03 1.429345E-07 + 47 29 3.457391E-05 5.402212E-04 1.867756E-08 + 47 30 3.457381E-05 1.468241E-03 5.076267E-08 + 47 31 3.457415E-05 4.622106E-03 1.598054E-07 + 47 32 3.457435E-05 1.539149E-03 5.321507E-08 + 47 33 3.457407E-05 5.825397E-04 2.014077E-08 + 47 34 3.457429E-05 4.554376E-03 1.574643E-07 + 47 35 3.457480E-05 2.803652E-03 9.693571E-08 + 47 36 3.457295E-05 5.333921E-05 1.844094E-09 + 47 37 3.457450E-05 3.842670E-03 1.328584E-07 + 47 38 3.457471E-05 4.279978E-03 1.479790E-07 + 47 39 3.457354E-05 2.440569E-04 8.437912E-09 + 48 0 3.282794E-05 3.819240E-11 1.253778E-15 + 48 1 3.490469E-05 1.293122E-09 4.513600E-14 + 48 2 3.461819E-05 2.144467E-08 7.423758E-13 + 48 3 3.456730E-05 2.327773E-07 8.046484E-12 + 48 4 3.458297E-05 1.849899E-06 6.397501E-11 + 48 5 3.457426E-05 1.135414E-05 3.925609E-10 + 48 6 3.457264E-05 5.527253E-05 1.910917E-09 + 48 7 3.457550E-05 2.159683E-04 7.467212E-09 + 48 8 3.457372E-05 6.787922E-04 2.346837E-08 + 48 9 3.457420E-05 1.705270E-03 5.895834E-08 + 48 10 3.457405E-05 3.367627E-03 1.164325E-07 + 48 11 3.457454E-05 5.056496E-03 1.748260E-07 + 48 12 3.457438E-05 5.393190E-03 1.864662E-07 + 48 13 3.457448E-05 3.464647E-03 1.197884E-07 + 48 14 3.457431E-05 7.009585E-04 2.423515E-08 + 48 15 3.457340E-05 2.514299E-04 8.692786E-09 + 48 16 3.457462E-05 2.707084E-03 9.359643E-08 + 48 17 3.457473E-05 4.121609E-03 1.425035E-07 + 48 18 3.457471E-05 1.886952E-03 6.524081E-08 + 48 19 3.458551E-05 2.839865E-06 9.821819E-11 + 48 20 3.457393E-05 2.124893E-03 7.346590E-08 + 48 21 3.457450E-05 3.789433E-03 1.310177E-07 + 48 22 3.457501E-05 1.293921E-03 4.473735E-08 + 48 23 3.457387E-05 2.261249E-04 7.818012E-09 + 48 24 3.457436E-05 3.097259E-03 1.070857E-07 + 48 25 3.457443E-05 3.005739E-03 1.039217E-07 + 48 26 3.457492E-05 1.302200E-04 4.502348E-09 + 48 27 3.457460E-05 1.742922E-03 6.026084E-08 + 48 28 3.457404E-05 3.817626E-03 1.319908E-07 + 48 29 3.457494E-05 9.596185E-04 3.317875E-08 + 48 30 3.457401E-05 6.959070E-04 2.406030E-08 + 48 31 3.457451E-05 3.881756E-03 1.342098E-07 + 48 32 3.457390E-05 2.072784E-03 7.166424E-08 + 48 33 3.457376E-05 1.123168E-04 3.883212E-09 + 48 34 3.457466E-05 3.417061E-03 1.181437E-07 + 48 35 3.457439E-05 3.247082E-03 1.122659E-07 + 48 36 3.457152E-05 5.169279E-05 1.787098E-09 + 48 37 3.457423E-05 2.409754E-03 8.331540E-08 + 48 38 3.457409E-05 4.281106E-03 1.480153E-07 + 48 39 3.457445E-05 8.637027E-04 2.986205E-08 + 49 0 3.422560E-05 2.894440E-11 9.906393E-16 + 49 1 3.465736E-05 9.865881E-10 3.419254E-14 + 49 2 3.472400E-05 1.643268E-08 5.706083E-13 + 49 3 3.453693E-05 1.790136E-07 6.182580E-12 + 49 4 3.456983E-05 1.428240E-06 4.937402E-11 + 49 5 3.457379E-05 8.809914E-06 3.045921E-10 + 49 6 3.457318E-05 4.316490E-05 1.492348E-09 + 49 7 3.457558E-05 1.700552E-04 5.879756E-09 + 49 8 3.457509E-05 5.400474E-04 1.867219E-08 + 49 9 3.457463E-05 1.374431E-03 4.752045E-08 + 49 10 3.457430E-05 2.759511E-03 9.540817E-08 + 49 11 3.457473E-05 4.235531E-03 1.464423E-07 + 49 12 3.457433E-05 4.664757E-03 1.612809E-07 + 49 13 3.457452E-05 3.173071E-03 1.097074E-07 + 49 14 3.457454E-05 7.712973E-04 2.666725E-08 + 49 15 3.457421E-05 1.198697E-04 4.144398E-09 + 49 16 3.457400E-05 2.080584E-03 7.193412E-08 + 49 17 3.457413E-05 3.555699E-03 1.229352E-07 + 49 18 3.457387E-05 1.897418E-03 6.560107E-08 + 49 19 3.457929E-05 1.185845E-05 4.100567E-10 + 49 20 3.457496E-05 1.517933E-03 5.248247E-08 + 49 21 3.457412E-05 3.277527E-03 1.133176E-07 + 49 22 3.457428E-05 1.434573E-03 4.959934E-08 + 49 23 3.457200E-05 6.179296E-05 2.136306E-09 + 49 24 3.457401E-05 2.344720E-03 8.106637E-08 + 49 25 3.457480E-05 2.851327E-03 9.858406E-08 + 49 26 3.457536E-05 3.045678E-04 1.053054E-08 + 49 27 3.457404E-05 1.073389E-03 3.711138E-08 + 49 28 3.457418E-05 3.294321E-03 1.138984E-07 + 49 29 3.457443E-05 1.254440E-03 4.337156E-08 + 49 30 3.457553E-05 2.670548E-04 9.233560E-09 + 49 31 3.457414E-05 3.049945E-03 1.054492E-07 + 49 32 3.457434E-05 2.307201E-03 7.976995E-08 + 49 33 3.538923E-05 5.987809E-10 2.119039E-14 + 49 34 3.457456E-05 2.375433E-03 8.212953E-08 + 49 35 3.457441E-05 3.238392E-03 1.119655E-07 + 49 36 3.457496E-05 3.069346E-04 1.061225E-08 + 49 37 3.457487E-05 1.345160E-03 4.650873E-08 + 49 38 3.457408E-05 3.776310E-03 1.305624E-07 + 49 39 3.457452E-05 1.420457E-03 4.911162E-08 + 50 0 3.492688E-05 2.171560E-11 7.584582E-16 + 50 1 3.488670E-05 7.458361E-10 2.601976E-14 + 50 2 3.462989E-05 1.246572E-08 4.316866E-13 + 50 3 3.462739E-05 1.362053E-07 4.716434E-12 + 50 4 3.459386E-05 1.090291E-06 3.771737E-11 + 50 5 3.457602E-05 6.753346E-06 2.335038E-10 + 50 6 3.457314E-05 3.326682E-05 1.150138E-09 + 50 7 3.457250E-05 1.319606E-04 4.562207E-09 + 50 8 3.457403E-05 4.226939E-04 1.461423E-08 + 50 9 3.457505E-05 1.087432E-03 3.759803E-08 + 50 10 3.457419E-05 2.213437E-03 7.652780E-08 + 50 11 3.457433E-05 3.459623E-03 1.196141E-07 + 50 12 3.457413E-05 3.911369E-03 1.352322E-07 + 50 13 3.457462E-05 2.784709E-03 9.628026E-08 + 50 14 3.457504E-05 7.737783E-04 2.675341E-08 + 50 15 3.457367E-05 5.036088E-05 1.741161E-09 + 50 16 3.457454E-05 1.563650E-03 5.406247E-08 + 50 17 3.457458E-05 2.957208E-03 1.022442E-07 + 50 18 3.457419E-05 1.777810E-03 6.146633E-08 + 50 19 3.457240E-05 4.877053E-05 1.686114E-09 + 50 20 3.457503E-05 1.055588E-03 3.649700E-08 + 50 21 3.457434E-05 2.714910E-03 9.386624E-08 + 50 22 3.457415E-05 1.431337E-03 4.948725E-08 + 50 23 3.457173E-05 5.987760E-06 2.070072E-10 + 50 24 3.457461E-05 1.713438E-03 5.924144E-08 + 50 25 3.457460E-05 2.526394E-03 8.734908E-08 + 50 26 3.457416E-05 4.428461E-04 1.531103E-08 + 50 27 3.457489E-05 6.250690E-04 2.161169E-08 + 50 28 3.457407E-05 2.685170E-03 9.283727E-08 + 50 29 3.457458E-05 1.370616E-03 4.738846E-08 + 50 30 3.457299E-05 7.173463E-05 2.480081E-09 + 50 31 3.457473E-05 2.269534E-03 7.846854E-08 + 50 32 3.457486E-05 2.258574E-03 7.808988E-08 + 50 33 3.457631E-05 5.597524E-05 1.935417E-09 + 50 34 3.457395E-05 1.551160E-03 5.362973E-08 + 50 35 3.457426E-05 2.904423E-03 1.004183E-07 + 50 36 3.457424E-05 5.711273E-04 1.974629E-08 + 50 37 3.457409E-05 6.687463E-04 2.312129E-08 + 50 38 3.457438E-05 3.039292E-03 1.050816E-07 + 50 39 3.457486E-05 1.708554E-03 5.907303E-08 + 51 0 3.482716E-05 1.600000E-11 5.572346E-16 + 51 1 3.439343E-05 5.513104E-10 1.896146E-14 + 51 2 3.474749E-05 9.237132E-09 3.209671E-13 + 51 3 3.451401E-05 1.011876E-07 3.492391E-12 + 51 4 3.457874E-05 8.121975E-07 2.808476E-11 + 51 5 3.457824E-05 5.047706E-06 1.745408E-10 + 51 6 3.457746E-05 2.497281E-05 8.634964E-10 + 51 7 3.457324E-05 9.960938E-05 3.443819E-09 + 51 8 3.457385E-05 3.212927E-04 1.110833E-08 + 51 9 3.457474E-05 8.337945E-04 2.882823E-08 + 51 10 3.457384E-05 1.716025E-03 5.932957E-08 + 51 11 3.457430E-05 2.721542E-03 9.409540E-08 + 51 12 3.457474E-05 3.141771E-03 1.086259E-07 + 51 13 3.457447E-05 2.317875E-03 8.013929E-08 + 51 14 3.457382E-05 7.102817E-04 2.455715E-08 + 51 15 3.457296E-05 1.778663E-05 6.149364E-10 + 51 16 3.457445E-05 1.139831E-03 3.940902E-08 + 51 17 3.457445E-05 2.349942E-03 8.124794E-08 + 51 18 3.457465E-05 1.548811E-03 5.354958E-08 + 51 19 3.457315E-05 8.161930E-05 2.821836E-09 + 51 20 3.457457E-05 7.123721E-04 2.462996E-08 + 51 21 3.457429E-05 2.141187E-03 7.403002E-08 + 51 22 3.457411E-05 1.299207E-03 4.491895E-08 + 51 23 3.457996E-05 1.644960E-06 5.688265E-11 + 51 24 3.457498E-05 1.206078E-03 4.170012E-08 + 51 25 3.457410E-05 2.092437E-03 7.234412E-08 + 51 26 3.457397E-05 5.021606E-04 1.736168E-08 + 51 27 3.457424E-05 3.454000E-04 1.194194E-08 + 51 28 3.457466E-05 2.069328E-03 7.154633E-08 + 51 29 3.457403E-05 1.310183E-03 4.529831E-08 + 51 30 3.457410E-05 7.766310E-06 2.685132E-10 + 51 31 3.457413E-05 1.605913E-03 5.552304E-08 + 51 32 3.457461E-05 1.992265E-03 6.888180E-08 + 51 33 3.457403E-05 1.455867E-04 5.033517E-09 + 51 34 3.457434E-05 9.595522E-04 3.317589E-08 + 51 35 3.457394E-05 2.385203E-03 8.246587E-08 + 51 36 3.457462E-05 7.158755E-04 2.475113E-08 + 51 37 3.457519E-05 2.944491E-04 1.018064E-08 + 51 38 3.457429E-05 2.268416E-03 7.842887E-08 + 51 39 3.457471E-05 1.699061E-03 5.874454E-08 + 52 0 3.448149E-05 1.122250E-11 3.869685E-16 + 52 1 3.361100E-05 3.873024E-10 1.301762E-14 + 52 2 3.483292E-05 6.506036E-09 2.266242E-13 + 52 3 3.450988E-05 7.140653E-08 2.464231E-12 + 52 4 3.459533E-05 5.743518E-07 1.986989E-11 + 52 5 3.456648E-05 3.578756E-06 1.237050E-10 + 52 6 3.457252E-05 1.776429E-05 6.141562E-10 + 52 7 3.457270E-05 7.115834E-05 2.460136E-09 + 52 8 3.457434E-05 2.307534E-04 7.978148E-09 + 52 9 3.457477E-05 6.028562E-04 2.084362E-08 + 52 10 3.457460E-05 1.251308E-03 4.326347E-08 + 52 11 3.457484E-05 2.006793E-03 6.938454E-08 + 52 12 3.457419E-05 2.353724E-03 8.137808E-08 + 52 13 3.457481E-05 1.783481E-03 6.166352E-08 + 52 14 3.457432E-05 5.861585E-04 2.026603E-08 + 52 15 3.457138E-05 4.887637E-06 1.689724E-10 + 52 16 3.457423E-05 7.877812E-04 2.723693E-08 + 52 17 3.457406E-05 1.741385E-03 6.020677E-08 + 52 18 3.457447E-05 1.229257E-03 4.250090E-08 + 52 19 3.457479E-05 9.345263E-05 3.231105E-09 + 52 20 3.457456E-05 4.588661E-04 1.586509E-08 + 52 21 3.457407E-05 1.573158E-03 5.439045E-08 + 52 22 3.457501E-05 1.058852E-03 3.660983E-08 + 52 23 3.457143E-05 1.181510E-05 4.084649E-10 + 52 24 3.457520E-05 8.041818E-04 2.780475E-08 + 52 25 3.457424E-05 1.591568E-03 5.502725E-08 + 52 26 3.457451E-05 4.702306E-04 1.625799E-08 + 52 27 3.457501E-05 1.807436E-04 6.249211E-09 + 52 28 3.457390E-05 1.483609E-03 5.129413E-08 + 52 29 3.457422E-05 1.099539E-03 3.801571E-08 + 52 30 3.460280E-05 6.712689E-07 2.322778E-11 + 52 31 3.457507E-05 1.068146E-03 3.693122E-08 + 52 32 3.457471E-05 1.576049E-03 5.449143E-08 + 52 33 3.457460E-05 1.943414E-04 6.719278E-09 + 52 34 3.457451E-05 5.607765E-04 1.938857E-08 + 52 35 3.457446E-05 1.782539E-03 6.163030E-08 + 52 36 3.457418E-05 7.012444E-04 2.424495E-08 + 52 37 3.457334E-05 1.138265E-04 3.935362E-09 + 52 38 3.457496E-05 1.563472E-03 5.405698E-08 + 52 39 3.457453E-05 1.444260E-03 4.993461E-08 + 53 0 3.607888E-05 6.864400E-12 2.476598E-16 + 53 1 3.439216E-05 2.380849E-10 8.188253E-15 + 53 2 3.484183E-05 4.009422E-09 1.396956E-13 + 53 3 3.462947E-05 4.407060E-08 1.526142E-12 + 53 4 3.453823E-05 3.549896E-07 1.226071E-11 + 53 5 3.458070E-05 2.215960E-06 7.662944E-11 + 53 6 3.458063E-05 1.102532E-05 3.812625E-10 + 53 7 3.457481E-05 4.429555E-05 1.531510E-09 + 53 8 3.457517E-05 1.441805E-04 4.985066E-09 + 53 9 3.457549E-05 3.784484E-04 1.308504E-08 + 53 10 3.457396E-05 7.901929E-04 2.732010E-08 + 53 11 3.457493E-05 1.277180E-03 4.415839E-08 + 53 12 3.457428E-05 1.514576E-03 5.236536E-08 + 53 13 3.457426E-05 1.168890E-03 4.041349E-08 + 53 14 3.457347E-05 4.024786E-04 1.391508E-08 + 53 15 3.456058E-05 9.209857E-07 3.182980E-11 + 53 16 3.457355E-05 4.774679E-04 1.650776E-08 + 53 17 3.457435E-05 1.110434E-03 3.839252E-08 + 53 18 3.457401E-05 8.216845E-04 2.840892E-08 + 53 19 3.457255E-05 7.727922E-05 2.671740E-09 + 53 20 3.457342E-05 2.628886E-04 9.088958E-09 + 53 21 3.457422E-05 9.956631E-04 3.442427E-08 + 53 22 3.457401E-05 7.193296E-04 2.487011E-08 + 53 23 3.457091E-05 1.654041E-05 5.718169E-10 + 53 24 3.457334E-05 4.727454E-04 1.634439E-08 + 53 25 3.457463E-05 1.030577E-03 3.563182E-08 + 53 26 3.457491E-05 3.476353E-04 1.201946E-08 + 53 27 3.457266E-05 8.583244E-05 2.967456E-09 + 53 28 3.457513E-05 9.195808E-04 3.179463E-08 + 53 29 3.457425E-05 7.588300E-04 2.623598E-08 + 53 30 3.457647E-05 6.138502E-06 2.122477E-10 + 53 31 3.457516E-05 6.244286E-04 2.158972E-08 + 53 32 3.457429E-05 1.044380E-03 3.610870E-08 + 53 33 3.457327E-05 1.717284E-04 5.937215E-09 + 53 34 3.457513E-05 2.938300E-04 1.015921E-08 + 53 35 3.457387E-05 1.133353E-03 3.918441E-08 + 53 36 3.457526E-05 5.288459E-04 1.828499E-08 + 53 37 3.457559E-05 3.785855E-05 1.308982E-09 + 53 38 3.457440E-05 9.345946E-04 3.231305E-08 + 53 39 3.457453E-05 9.978087E-04 3.449877E-08 +[transition-N2eX] +234 0 0 0 5 +c data calculated with LEVEL_8.0 +c using Potentialenergyfunctions retrieved via RKR1 2.0 +c with Spectroscopic constants from +c Spelsberg & Meyer j.chem.phys.,vol.115,no.14,(2001) +c documented in ESA report Aerothermochemistry +c +c vu vl sumre2/fcf FCF SRe2 + 0 0 4.515609E-02 9.162920E-01 4.137616E-02 + 0 1 5.483774E-02 8.120364E-02 4.453024E-03 + 0 2 1.312636E-01 2.455786E-03 3.223554E-04 + 0 3 1.374769E-01 4.785388E-05 6.578803E-06 + 0 4 2.687472E-01 6.867603E-07 1.845649E-07 + 0 5 3.565410E+01 9.582452E-09 3.416537E-07 + 0 6 4.446553E-02 3.489265E-09 1.551520E-10 + 0 7 8.753117E+00 5.742608E-09 5.026572E-08 + 0 8 1.519591E+01 2.827049E-09 4.295959E-08 + 0 9 8.310269E-03 1.748912E-09 1.453393E-11 + 0 10 7.661258E+04 1.156000E-13 8.856415E-09 + 0 11 8.951459E+01 9.584410E-11 8.579445E-09 + 0 12 1.825136E+01 6.400000E-11 1.168087E-09 + 0 13 4.540188E+01 1.689210E-11 7.669332E-10 + 0 14 5.954531E+01 5.026810E-11 2.993230E-09 + 0 15 2.203731E+02 7.840000E-12 1.727725E-09 + 0 16 8.494162E+00 1.095610E-11 9.306289E-11 + 0 17 6.742539E+02 5.329000E-13 3.593099E-10 + 0 18 1.284866E+02 8.179600E-12 1.050969E-09 + 0 19 6.400925E+02 1.232100E-12 7.886579E-10 + 0 20 2.757148E+01 4.202500E-12 1.158691E-10 + 0 21 2.384053E+01 3.610000E-12 8.606433E-11 + 0 22 3.112122E+03 1.521000E-13 4.733538E-10 + 0 23 2.673921E+02 1.822500E-12 4.873221E-10 + 0 24 1.790981E+03 9.000000E-14 1.611883E-10 + 0 25 6.048345E-03 7.396000E-13 4.473356E-15 + 0 26 1.981692E+02 5.329000E-13 1.056044E-10 + 0 27 2.795683E+03 7.840000E-14 2.191816E-10 + 0 28 2.099379E+02 8.649000E-13 1.815753E-10 + 0 29 1.480245E+02 4.356000E-13 6.447949E-11 + 0 30 9.520044E+01 1.000000E-14 9.520044E-13 + 0 31 7.360471E+01 3.844000E-13 2.829365E-11 + 0 32 2.688817E+02 3.136000E-13 8.432130E-11 + 0 33 5.857962E+03 1.690000E-14 9.899956E-11 + 0 34 8.064030E+02 7.840000E-14 6.322200E-11 + 0 35 1.165129E+02 1.521000E-13 1.772161E-11 + 0 36 1.403967E-03 4.410000E-14 6.191496E-17 + 0 37 1.967744E+03 6.400000E-15 1.259356E-11 + 0 38 3.977171E+02 8.410000E-14 3.344801E-11 + 0 39 4.140298E+02 1.024000E-13 4.239666E-11 + 0 40 9.763530E+02 3.610000E-14 3.524634E-11 + 0 42 2.375671E+02 2.890000E-14 6.865688E-12 + 0 43 7.665055E+00 7.290000E-14 5.587825E-13 + 0 44 9.998332E+00 7.290000E-14 7.288784E-13 + 0 45 8.680919E+01 4.840000E-14 4.201565E-12 + 0 46 4.669231E+02 1.690000E-14 7.891000E-12 + 1 0 3.691023E-02 7.838753E-02 2.893302E-03 + 1 1 4.927703E-02 7.554287E-01 3.722528E-02 + 1 2 5.694655E-02 1.579768E-01 8.996235E-03 + 1 3 1.177761E-01 7.971743E-03 9.388808E-04 + 1 4 1.747030E-01 2.282420E-04 3.987456E-05 + 1 5 1.159285E-02 5.535480E-06 6.417198E-08 + 1 6 1.626403E+00 5.135729E-07 8.352765E-07 + 1 7 2.869631E-01 3.670300E-07 1.053241E-07 + 1 8 1.329285E-01 3.575920E-07 4.753417E-08 + 1 9 1.105511E+00 1.161651E-07 1.284218E-07 + 1 10 3.245422E-01 1.596180E-08 5.180277E-09 + 1 11 7.503981E+00 4.785872E-09 3.591309E-08 + 1 12 5.773110E+00 2.840890E-09 1.640077E-08 + 1 13 2.093879E-01 5.602689E-10 1.173135E-10 + 1 14 2.825465E+00 1.837837E-09 5.192743E-09 + 1 15 1.911620E+05 5.290000E-14 1.011247E-08 + 1 16 3.128594E+00 1.032337E-09 3.229763E-09 + 1 17 8.677625E+00 2.672890E-11 2.319434E-10 + 1 18 9.788008E+00 3.602404E-10 3.526036E-09 + 1 19 9.474317E+01 3.564090E-11 3.376732E-09 + 1 20 6.981157E+00 1.331716E-10 9.296918E-10 + 1 21 4.093321E-02 4.928040E-11 2.017205E-12 + 1 22 1.403247E+01 4.928040E-11 6.915259E-10 + 1 23 1.600009E+01 9.292960E-11 1.486882E-09 + 1 24 5.035602E+03 2.401000E-13 1.209048E-09 + 1 25 5.828389E+00 4.858090E-11 2.831484E-10 + 1 26 1.519668E+00 2.756250E-11 4.188586E-11 + 1 27 3.652912E+02 1.587600E-12 5.799364E-10 + 1 28 3.843046E+01 2.237290E-11 8.598008E-10 + 1 29 7.231281E+01 7.128900E-12 5.155108E-10 + 1 30 3.607064E+01 2.624400E-12 9.466378E-11 + 1 31 7.657946E-01 1.436410E-11 1.099995E-11 + 1 32 2.456778E+01 6.200100E-12 1.523227E-10 + 1 33 8.572228E+02 3.025000E-13 2.593099E-10 + 1 34 3.040072E+01 7.728400E-12 2.349489E-10 + 1 35 1.562803E+01 8.468100E-12 1.323398E-10 + 1 36 2.145931E+01 1.768900E-12 3.795938E-11 + 1 37 6.855265E-01 4.489000E-13 3.077328E-13 + 1 38 5.126934E+00 3.686400E-12 1.889993E-11 + 1 39 1.532511E+01 4.040100E-12 6.191496E-11 + 1 40 6.510230E+01 1.440000E-12 9.374731E-11 + 1 41 2.661545E+04 3.600000E-15 9.581563E-11 + 1 42 9.505930E+01 7.569000E-13 7.195038E-11 + 1 43 2.234571E+01 1.742400E-12 3.893516E-11 + 1 44 7.947141E+00 1.612900E-12 1.281794E-11 + 1 45 1.182567E+00 7.921000E-13 9.367114E-13 + 1 46 1.261529E+01 1.296000E-13 1.634942E-12 + 2 0 5.527229E-02 4.958931E-03 2.740915E-04 + 2 1 3.941056E-02 1.469951E-01 5.793159E-03 + 2 2 5.292858E-02 6.012937E-01 3.182562E-02 + 2 3 6.002297E-02 2.283870E-01 1.370847E-02 + 2 4 1.111438E-01 1.748721E-02 1.943594E-03 + 2 5 1.711611E-01 7.838158E-04 1.341588E-04 + 2 6 3.227238E-02 5.204742E-05 1.679694E-06 + 2 7 2.354455E-01 1.947113E-05 4.584388E-06 + 2 8 1.437745E-01 1.364032E-05 1.961129E-06 + 2 9 2.362939E-02 7.616054E-06 1.799627E-07 + 2 10 3.402599E-01 1.334233E-06 4.539859E-07 + 2 11 1.009267E+00 1.864590E-08 1.881870E-08 + 2 12 1.261942E+00 3.699083E-08 4.668027E-08 + 2 13 2.836744E+00 9.698310E-09 2.751162E-08 + 2 14 7.330574E-02 5.956040E-08 4.366119E-09 + 2 15 5.354656E+00 1.124932E-09 6.023622E-09 + 2 16 6.379845E-01 1.088475E-08 6.944301E-09 + 2 17 1.135111E+01 2.238016E-10 2.540397E-09 + 2 18 2.386586E-02 7.849960E-09 1.873460E-10 + 2 19 2.591852E+02 2.510010E-11 6.505575E-09 + 2 20 2.000591E+00 3.411728E-09 6.825474E-09 + 2 21 1.210458E+00 7.011904E-10 8.487616E-10 + 2 22 8.810288E-01 8.702500E-10 7.667153E-10 + 2 23 2.706401E+00 9.455625E-10 2.559072E-09 + 2 24 3.873707E+01 4.956160E-11 1.919871E-09 + 2 25 8.799223E-01 8.105409E-10 7.132130E-10 + 2 26 5.279822E-01 1.827904E-10 9.651008E-11 + 2 27 2.780649E-01 1.664100E-10 4.627278E-11 + 2 28 1.113045E+00 4.708900E-10 5.241219E-10 + 2 29 1.362732E+01 8.118010E-11 1.106267E-09 + 2 30 1.417498E+01 7.310250E-11 1.036226E-09 + 2 31 1.641449E+00 2.277081E-10 3.737713E-10 + 2 32 4.628035E-03 6.839290E-11 3.165247E-13 + 2 33 2.307713E+01 1.108890E-11 2.559000E-10 + 2 34 5.867813E+00 1.038361E-10 6.092908E-10 + 2 35 7.703380E+00 7.726410E-11 5.951947E-10 + 2 36 8.065827E+01 3.880900E-12 3.130267E-10 + 2 37 2.918272E+00 2.470090E-11 7.208393E-11 + 2 38 1.133509E-05 6.691240E-11 7.584582E-16 + 2 39 7.529210E-01 4.774810E-11 3.595055E-11 + 2 40 1.115501E+01 7.728400E-12 8.621039E-11 + 2 41 3.354214E+01 3.204100E-12 1.074724E-10 + 2 42 4.065988E+00 2.450250E-11 9.962688E-11 + 2 43 2.152499E+00 3.576040E-11 7.697422E-11 + 2 44 1.939521E+00 2.652250E-11 5.144094E-11 + 2 45 2.860775E+00 1.030410E-11 2.947771E-11 + 2 46 1.424096E+01 9.604000E-13 1.367701E-11 + 3 0 1.393205E-01 3.299614E-04 4.597037E-05 + 3 1 4.942223E-02 1.475527E-02 7.292382E-04 + 3 2 4.089883E-02 2.030048E-01 8.302659E-03 + 3 3 5.673177E-02 4.472045E-01 2.537070E-02 + 3 4 6.327629E-02 2.934484E-01 1.856832E-02 + 3 5 1.065617E-01 3.593989E-02 3.829815E-03 + 3 6 1.448653E-01 3.516568E-03 5.094286E-04 + 3 7 8.333193E-02 8.339857E-04 6.949764E-05 + 3 8 1.287648E-01 5.139384E-04 6.617716E-05 + 3 9 1.198487E-01 3.009705E-04 3.607091E-05 + 3 10 9.059819E-02 1.205633E-04 1.092281E-05 + 3 11 2.176953E-01 2.225509E-05 4.844828E-06 + 3 12 2.218881E-01 3.332414E-06 7.394228E-07 + 3 13 8.584951E-02 2.085540E-06 1.790426E-07 + 3 14 2.016645E-01 2.575223E-06 5.193310E-07 + 3 15 1.471556E-01 7.766368E-07 1.142865E-07 + 3 16 4.941753E-01 5.433561E-10 2.685132E-10 + 3 17 2.284742E+00 9.333492E-09 2.132462E-08 + 3 18 4.777228E-02 1.278349E-07 6.106963E-09 + 3 19 8.167408E-02 1.795332E-08 1.466321E-09 + 3 20 1.680814E-01 1.522756E-08 2.559470E-09 + 3 21 1.396637E+00 2.219352E-09 3.099630E-09 + 3 22 2.576550E-01 1.871698E-08 4.822522E-09 + 3 23 3.847501E-02 4.381116E-09 1.685635E-10 + 3 24 3.038658E+00 1.402503E-09 4.261725E-09 + 3 25 8.073524E-01 7.209708E-09 5.820775E-09 + 3 26 3.169548E+00 3.802500E-10 1.205221E-09 + 3 27 2.066600E-02 2.026800E-09 4.188586E-11 + 3 28 2.989334E-01 2.745760E-09 8.207992E-10 + 3 29 2.434070E+01 3.445690E-11 8.387050E-10 + 3 30 4.323379E-01 1.316964E-09 5.693734E-10 + 3 31 2.559010E-01 1.658933E-09 4.245225E-10 + 3 32 2.362372E+00 1.440000E-10 3.401816E-10 + 3 33 3.453769E-01 4.004001E-10 1.382889E-10 + 3 34 6.909262E-04 1.045229E-09 7.221761E-13 + 3 35 5.316884E-01 4.644025E-10 2.469174E-10 + 3 36 2.866317E+05 2.500000E-15 7.165792E-10 + 3 37 3.016980E+00 2.961841E-10 8.935815E-10 + 3 38 1.262252E+00 4.853209E-10 6.125971E-10 + 3 39 8.741279E-01 2.301289E-10 2.011621E-10 + 3 40 6.486558E-01 7.617600E-12 4.941201E-12 + 3 41 8.340036E-01 7.276090E-11 6.068285E-11 + 3 42 9.322309E-01 2.131600E-10 1.987143E-10 + 3 43 1.258939E+00 2.166784E-10 2.727850E-10 + 3 44 2.307916E+00 1.094116E-10 2.525127E-10 + 3 45 9.877415E+00 1.823290E-11 1.800939E-10 + 3 46 3.572907E+01 2.924100E-12 1.044754E-10 + 4 0 2.532975E-01 2.499370E-05 6.330843E-06 + 4 1 9.092531E-02 1.276038E-03 1.160242E-04 + 4 2 4.427269E-02 2.689426E-02 1.190681E-03 + 4 3 4.312783E-02 2.161911E-01 9.323855E-03 + 4 4 6.278890E-02 2.118205E-01 1.329997E-02 + 4 5 6.750034E-02 3.216949E-01 2.171451E-02 + 4 6 9.818474E-02 1.000681E-01 9.825159E-03 + 4 7 1.141949E-01 3.721569E-02 4.249841E-03 + 4 8 1.032914E-01 2.427041E-02 2.506923E-03 + 4 9 1.158628E-01 1.966124E-02 2.278006E-03 + 4 10 1.236476E-01 1.427559E-02 1.765143E-03 + 4 11 1.295725E-01 9.102906E-03 1.179486E-03 + 4 12 1.508760E-01 5.489128E-03 8.281775E-04 + 4 13 1.568857E-01 3.691773E-03 5.791862E-04 + 4 14 1.621692E-01 2.689832E-03 4.362078E-04 + 4 15 1.801793E-01 1.863050E-03 3.356829E-04 + 4 16 1.937224E-01 1.191887E-03 2.308951E-04 + 4 17 2.082744E-01 7.937855E-04 1.653252E-04 + 4 18 2.201425E-01 5.794357E-04 1.275584E-04 + 4 19 2.297089E-01 3.975394E-04 9.131836E-05 + 4 20 2.505701E-01 2.540881E-04 6.366687E-05 + 4 21 2.628116E-01 1.764934E-04 4.638450E-05 + 4 22 2.594276E-01 1.274648E-04 3.306788E-05 + 4 23 2.861019E-01 8.233838E-05 2.355717E-05 + 4 24 2.984022E-01 5.373462E-05 1.603453E-05 + 4 25 2.833963E-01 3.945988E-05 1.118278E-05 + 4 26 3.157094E-01 2.577065E-05 8.136035E-06 + 4 27 3.122557E-01 1.600104E-05 4.996416E-06 + 4 28 3.110562E-01 1.177320E-05 3.662127E-06 + 4 29 3.252506E-01 7.606895E-06 2.474147E-06 + 4 30 3.189756E-01 4.506535E-06 1.437475E-06 + 4 31 3.353383E-01 3.345497E-06 1.121873E-06 + 4 32 3.025556E-01 2.055496E-06 6.219017E-07 + 4 33 3.613888E-01 1.157109E-06 4.181663E-07 + 4 34 2.968567E-01 8.955215E-07 2.658416E-07 + 4 35 3.234674E-01 4.718591E-07 1.526310E-07 + 4 36 3.663692E-01 2.706913E-07 9.917293E-08 + 4 37 2.340838E-01 2.146284E-07 5.024103E-08 + 4 38 4.757676E-01 7.991364E-08 3.802032E-08 + 4 39 1.909384E-01 6.393818E-08 1.220825E-08 + 4 40 3.966611E-01 3.542300E-08 1.405093E-08 + 4 41 2.669554E-01 1.033069E-08 2.757833E-09 + 4 42 2.280197E-01 1.467490E-08 3.346166E-09 + 4 43 6.788500E-01 1.644303E-09 1.116235E-09 + 4 44 7.173358E-02 2.832368E-09 2.031759E-10 + 4 45 9.075928E-01 8.726116E-10 7.919760E-10 + 4 46 1.935295E+00 3.745440E-11 7.248533E-11 +[transition-N2wj] +529 0 0 0 5 +c data calculated with LEVEL_8.0 +c using Potentialenergyfunctions retrieved via RKR1 2.0 +c with Spectroscopic constants from +c Spelsberg & Meyer j.chem.phys.,vol.115,no.14,(2001) +c documented in ESA report Aerothermochemistry +c +c vu vl sumre2/fcf FCF SRe2 + 0 0 8.194854E-02 9.136243E-01 7.487018E-02 + 0 1 6.323174E-02 8.391669E-02 5.306198E-03 + 0 2 4.506548E-02 2.414603E-03 1.088152E-04 + 0 3 4.773977E-02 4.380189E-05 2.091092E-06 + 0 4 5.971556E-02 6.010281E-07 3.589073E-08 + 0 5 4.203869E-01 2.571504E-09 1.081027E-09 + 0 6 2.776015E+00 8.880400E-12 2.465212E-11 + 0 7 1.952137E-01 1.151329E-10 2.247552E-11 + 0 8 4.445592E-01 2.611210E-11 1.160837E-11 + 0 9 4.699709E-02 6.938890E-11 3.261076E-12 + 0 10 1.489587E+00 1.043290E-11 1.554072E-11 + 0 11 5.422760E+00 3.422500E-12 1.855940E-11 + 0 12 4.644558E+00 8.100000E-13 3.762092E-12 + 0 13 1.598259E+00 5.625000E-13 8.990207E-13 + 0 14 3.251610E+00 1.742400E-12 5.665606E-12 + 0 15 5.704455E+00 9.801000E-13 5.590936E-12 + 0 16 3.174374E+00 4.900000E-13 1.555443E-12 + 0 17 9.922790E-01 2.209000E-13 2.191944E-13 + 0 18 4.703626E+02 6.400000E-15 3.010321E-12 + 0 19 3.390463E+01 9.000000E-14 3.051417E-12 + 0 20 2.476598E+00 1.936000E-13 4.794694E-13 + 0 21 2.371596E+00 1.225000E-13 2.905205E-13 + 0 22 3.137902E+01 4.410000E-14 1.383815E-12 + 0 23 1.331860E+02 8.100000E-15 1.078806E-12 + 0 25 3.275301E+00 1.000000E-14 3.275301E-14 + 0 26 1.005261E+01 2.890000E-14 2.905205E-13 + 0 27 9.906393E+00 3.610000E-14 3.576208E-13 + 0 28 1.008408E+01 1.960000E-14 1.976480E-13 + 0 29 1.207772E+01 3.600000E-15 4.347978E-14 + 0 30 7.584582E+00 1.000000E-16 7.584582E-16 + 0 31 1.941653E+01 2.500000E-15 4.854133E-14 + 0 32 2.336342E+01 4.900000E-15 1.144808E-13 + 0 33 2.047063E+01 6.400000E-15 1.310121E-13 + 0 34 1.776896E+01 4.900000E-15 8.706791E-14 + 0 35 6.879440E+00 3.600000E-15 2.476598E-14 + 0 36 3.869685E-02 1.600000E-15 6.191496E-17 + 0 37 5.885791E+01 4.000000E-16 2.354316E-14 + 0 39 1.896146E+02 4.000000E-16 7.584582E-14 + 0 40 3.839695E+01 1.600000E-15 6.143512E-14 + 0 41 1.367701E+01 2.500000E-15 3.419254E-14 + 0 42 4.185451E+00 2.500000E-15 1.046363E-14 + 0 43 2.228939E-01 2.500000E-15 5.572346E-16 + 0 44 1.170580E+00 1.600000E-15 1.872928E-15 + 0 45 9.906393E+00 9.000000E-16 8.915754E-15 + 0 46 3.962557E+01 4.000000E-16 1.585023E-14 + 1 0 1.017799E-01 8.041328E-02 8.184457E-03 + 1 1 8.057512E-02 7.483913E-01 6.030172E-02 + 1 2 6.289410E-02 1.631315E-01 1.026001E-02 + 1 3 4.582113E-02 7.855316E-03 3.599395E-04 + 1 4 4.947763E-02 2.049307E-04 1.013948E-05 + 1 5 6.766424E-02 3.644052E-06 2.465720E-07 + 1 6 2.012243E-01 3.501389E-08 7.045647E-09 + 1 7 1.409053E+00 1.960000E-10 2.761744E-10 + 1 8 1.779283E-04 3.206957E-09 5.706083E-13 + 1 9 1.252304E-01 3.214890E-11 4.026020E-12 + 1 10 1.724895E-01 7.963684E-10 1.373652E-10 + 1 11 7.560252E-01 9.525760E-11 7.201714E-11 + 1 12 2.019769E+03 1.690000E-14 3.413410E-11 + 1 13 1.405620E+01 1.156000E-13 1.624896E-12 + 1 14 4.785962E+00 4.972900E-12 2.380011E-11 + 1 15 1.316328E+00 2.631690E-11 3.464167E-11 + 1 16 4.308566E-01 1.489960E-11 6.419591E-12 + 1 17 7.923019E-02 1.512900E-12 1.198674E-13 + 1 18 4.731093E+02 4.900000E-15 2.318235E-12 + 1 19 7.127342E+01 5.760000E-14 4.105349E-12 + 1 20 5.844129E+00 6.889000E-13 4.026020E-12 + 1 21 5.799868E-01 1.960000E-12 1.136774E-12 + 1 22 1.452643E-01 1.638400E-12 2.380011E-13 + 1 23 8.989264E+00 3.364000E-13 3.023989E-12 + 1 24 2.676543E+02 1.440000E-14 3.854222E-12 + 1 25 6.585580E+00 1.936000E-13 1.274968E-12 + 1 26 1.685398E-01 2.116000E-13 3.566302E-14 + 1 27 8.432579E+00 1.764000E-13 1.487507E-12 + 1 28 1.446402E+01 1.521000E-13 2.199978E-12 + 1 29 8.912862E+00 1.156000E-13 1.030327E-12 + 1 30 1.393087E+00 3.610000E-14 5.029043E-14 + 1 31 2.081031E+02 9.000000E-16 1.872928E-13 + 1 32 1.001436E+01 5.290000E-14 5.297599E-13 + 1 33 4.402842E+00 1.089000E-13 4.794694E-13 + 1 34 2.324230E+00 1.024000E-13 2.380011E-13 + 1 35 1.206321E+00 5.760000E-14 6.948406E-14 + 1 36 4.039127E-01 1.690000E-14 6.826124E-15 + 1 37 2.476598E+00 1.600000E-15 3.962557E-15 + 1 38 3.962557E+01 9.000000E-16 3.566302E-14 + 1 39 2.483478E+01 3.600000E-15 8.940520E-14 + 1 40 1.724637E+01 8.100000E-15 1.396956E-13 + 1 41 1.578986E+01 1.000000E-14 1.578986E-13 + 1 42 1.036180E+01 1.210000E-14 1.253778E-13 + 1 43 4.825282E+00 1.440000E-14 6.948406E-14 + 1 44 1.657888E+00 1.210000E-14 2.006045E-14 + 1 45 1.151311E-02 1.210000E-14 1.393087E-16 + 1 46 1.194347E+00 8.100000E-15 9.674212E-15 + 2 0 1.215428E-01 5.508273E-03 6.694911E-04 + 2 1 9.934707E-02 1.496657E-01 1.486885E-02 + 2 2 7.927735E-02 5.923283E-01 4.695822E-02 + 2 3 6.265262E-02 2.350182E-01 1.472451E-02 + 2 4 4.671321E-02 1.686572E-02 7.878520E-04 + 2 5 5.099715E-02 5.997062E-04 3.058331E-05 + 2 6 7.351349E-02 1.370540E-05 1.007532E-06 + 2 7 1.305278E-01 3.226694E-07 4.211732E-08 + 2 8 1.456957E-01 1.394052E-08 2.031074E-09 + 2 9 3.438716E-02 4.381486E-08 1.506669E-09 + 2 10 1.524650E-01 3.968064E-10 6.049910E-11 + 2 11 2.755540E-01 2.620416E-09 7.220662E-10 + 2 12 1.858427E-01 8.311689E-10 1.544667E-10 + 2 13 2.412853E-02 9.312250E-11 2.246909E-12 + 2 14 1.307609E-05 1.183744E-10 1.547874E-15 + 2 15 1.300078E+00 1.391290E-11 1.808785E-11 + 2 16 1.541188E+00 5.959840E-11 9.185233E-11 + 2 17 3.047463E-01 9.120250E-11 2.779363E-11 + 2 18 3.443253E-01 1.239040E-11 4.266328E-12 + 2 19 3.272967E+00 5.953600E-12 1.948594E-11 + 2 20 7.312513E-01 1.156000E-11 8.453265E-12 + 2 21 3.378501E-01 3.960100E-12 1.337920E-12 + 2 22 9.521716E-04 2.340900E-12 2.228939E-15 + 2 23 1.736370E-01 3.459600E-12 6.007144E-13 + 2 24 7.691671E-01 2.073600E-12 1.594945E-12 + 2 25 4.316866E+03 4.000000E-16 1.726746E-12 + 2 26 6.100110E-01 1.822500E-12 1.111745E-12 + 2 27 8.871533E-02 3.132900E-12 2.779363E-13 + 2 28 6.102759E-02 1.664100E-12 1.015560E-13 + 2 29 5.367874E+00 2.916000E-13 1.565272E-12 + 2 30 1.847475E+03 1.600000E-15 2.955959E-12 + 2 31 9.022210E+01 1.960000E-14 1.768353E-12 + 2 32 1.756258E+00 3.610000E-14 6.340092E-14 + 2 33 1.026335E+01 7.840000E-14 8.046468E-13 + 2 34 1.103768E+01 2.025000E-13 2.235130E-12 + 2 35 5.350426E+00 3.364000E-13 1.799883E-12 + 2 36 1.330834E+00 3.481000E-13 4.632632E-13 + 2 37 2.310618E-02 1.936000E-13 4.473356E-15 + 2 38 7.913119E+00 4.000000E-14 3.165247E-13 + 2 39 1.377651E+02 3.600000E-15 4.959543E-13 + 2 40 4.947930E+00 6.760000E-14 3.344801E-13 + 2 41 8.755833E-01 1.369000E-13 1.198674E-13 + 2 42 1.393188E-01 1.521000E-13 2.119039E-14 + 2 43 8.086852E-03 1.225000E-13 9.906393E-16 + 2 44 1.974329E-04 7.840000E-14 1.547874E-17 + 2 45 1.393087E-02 4.000000E-14 5.572346E-16 + 2 46 1.795167E-01 1.690000E-14 3.033833E-15 + 3 0 1.325508E-01 4.121135E-04 5.462597E-05 + 3 1 1.190377E-01 1.617041E-02 1.924888E-03 + 3 2 9.684500E-02 2.059162E-01 1.994195E-02 + 3 3 7.811634E-02 4.487359E-01 3.505360E-02 + 3 4 6.250986E-02 2.973062E-01 1.858457E-02 + 3 5 4.772819E-02 2.998053E-02 1.430917E-03 + 3 6 5.264748E-02 1.429975E-03 7.528458E-05 + 3 7 7.521668E-02 4.529425E-05 3.406883E-06 + 3 8 9.909151E-02 2.731153E-06 2.706341E-07 + 3 9 7.804047E-02 3.480292E-07 2.716036E-08 + 3 10 6.584114E-02 3.371544E-07 2.219863E-08 + 3 11 2.874841E-01 5.103674E-09 1.467225E-09 + 3 12 7.367151E-01 1.199237E-09 8.834959E-10 + 3 13 2.931522E-01 3.330444E-09 9.763271E-10 + 3 14 2.499018E+00 6.006250E-11 1.500973E-10 + 3 15 9.799266E-02 1.722250E-09 1.687679E-10 + 3 16 6.420151E-04 2.917264E-10 1.872928E-13 + 3 17 4.347978E+00 9.000000E-12 3.913180E-11 + 3 18 1.374725E+00 7.344490E-11 1.009665E-10 + 3 19 3.823884E-03 7.708840E-11 2.947771E-13 + 3 20 2.045885E+01 2.280100E-12 4.664822E-11 + 3 21 3.227353E-01 8.445610E-11 2.725696E-11 + 3 22 3.899624E-02 6.037290E-11 2.354316E-12 + 3 23 1.957280E-03 6.200100E-12 1.213533E-14 + 3 24 4.548863E+00 1.444000E-13 6.568558E-13 + 3 25 9.850907E+01 4.840000E-14 4.767839E-12 + 3 26 1.737102E+02 3.240000E-14 5.628209E-12 + 3 27 1.115241E+00 5.776000E-13 6.441632E-13 + 3 28 1.350068E-01 5.152900E-12 6.956765E-13 + 3 29 1.276524E-01 8.008900E-12 1.022355E-12 + 3 30 8.076593E-03 3.880900E-12 3.134445E-14 + 3 31 3.545751E-01 1.369000E-13 4.854133E-14 + 3 32 1.927082E-01 9.025000E-13 1.739191E-13 + 3 33 8.280542E-01 2.160900E-12 1.789342E-12 + 3 34 1.300360E+00 1.638400E-12 2.130509E-12 + 3 35 3.367593E-01 6.400000E-13 2.155260E-13 + 3 36 5.795665E+00 1.764000E-13 1.022355E-12 + 3 37 7.155047E+01 5.760000E-14 4.121307E-12 + 3 38 7.942466E+01 5.290000E-14 4.201565E-12 + 3 39 2.840029E+01 4.840000E-14 1.374574E-12 + 3 40 2.021713E-01 1.960000E-14 3.962557E-15 + 3 41 1.300644E+03 9.000000E-16 1.170580E-12 + 3 42 4.214087E+01 5.760000E-14 2.427314E-12 + 3 43 1.118339E+01 1.936000E-13 2.165104E-12 + 3 44 3.015501E+00 3.364000E-13 1.014415E-12 + 3 45 4.137414E-01 3.969000E-13 1.642139E-13 + 3 46 4.402842E-02 3.600000E-13 1.585023E-14 + 4 0 1.328419E-01 3.733186E-05 4.959233E-06 + 4 1 1.306538E-01 1.638704E-03 2.141029E-04 + 4 2 1.164104E-01 3.142344E-02 3.658015E-03 + 4 3 9.429868E-02 2.476310E-01 2.335127E-02 + 4 4 7.716753E-02 3.194337E-01 2.464991E-02 + 4 5 6.249564E-02 3.482509E-01 2.176416E-02 + 4 6 4.888170E-02 4.823030E-02 2.357579E-03 + 4 7 5.449062E-02 3.168608E-03 1.726594E-04 + 4 8 7.395984E-02 1.603047E-04 1.185611E-05 + 4 9 8.627078E-02 2.040708E-05 1.760535E-06 + 4 10 8.158570E-02 3.761738E-06 3.069040E-07 + 4 11 8.938980E-02 1.568631E-06 1.402196E-07 + 4 12 3.583055E-01 1.277578E-08 4.577633E-09 + 4 13 1.966999E-01 7.177041E-10 1.411723E-10 + 4 14 2.576653E+00 1.207562E-09 3.111469E-09 + 4 15 2.415150E-03 8.076964E-10 1.950708E-12 + 4 16 4.262378E-01 4.037332E-09 1.720863E-09 + 4 17 1.283908E-02 2.945233E-09 3.781408E-11 + 4 18 9.140232E-01 6.177960E-11 5.646799E-11 + 4 19 2.101592E+00 4.914010E-11 1.032724E-10 + 4 20 1.424448E+01 6.656400E-12 9.481695E-11 + 4 21 4.269596E+00 1.391290E-11 5.940247E-11 + 4 22 3.138531E+00 4.651240E-11 1.459806E-10 + 4 23 2.557793E-02 1.830609E-10 4.682319E-12 + 4 24 1.581377E-01 8.630410E-11 1.364793E-11 + 4 25 2.295604E+00 2.209000E-13 5.070990E-13 + 4 26 1.287483E-01 2.171560E-11 2.795847E-12 + 4 27 1.081875E-01 1.874890E-11 2.028396E-12 + 4 28 6.472173E+00 3.724900E-12 2.410820E-11 + 4 29 2.139492E+01 5.476000E-13 1.171586E-11 + 4 30 1.523321E+00 1.537600E-12 2.342258E-12 + 4 31 5.525540E+00 3.920400E-12 2.166233E-11 + 4 32 4.027900E+00 2.822400E-12 1.136834E-11 + 4 33 8.696971E-01 7.290000E-14 6.340092E-14 + 4 34 3.419254E+00 1.960000E-12 6.701737E-12 + 4 35 6.709395E-01 5.953600E-12 3.994505E-12 + 4 36 2.319395E-02 6.150400E-12 1.426521E-13 + 4 37 1.700261E+00 3.062500E-12 5.207048E-12 + 4 38 1.000843E+01 5.329000E-13 5.333494E-12 + 4 39 2.021713E+01 1.960000E-14 3.962557E-13 + 4 40 5.745122E+00 4.225000E-13 2.427314E-12 + 4 41 1.437687E+01 6.400000E-13 9.201198E-12 + 4 42 2.044557E+01 5.041000E-13 1.030661E-11 + 4 43 1.688520E+01 2.916000E-13 4.923725E-12 + 4 44 2.637899E+00 1.521000E-13 4.012244E-13 + 4 45 9.578932E+00 9.000000E-14 8.621039E-13 + 4 46 5.785609E+01 7.290000E-14 4.217709E-12 + 5 0 1.231949E-01 4.063732E-06 5.006311E-07 + 5 1 1.319585E-01 1.867462E-04 2.464275E-05 + 5 2 1.288942E-01 4.089704E-03 5.271391E-04 + 5 3 1.135752E-01 5.058872E-02 5.745623E-03 + 5 4 9.163421E-02 2.734364E-01 2.505613E-02 + 5 5 7.655475E-02 2.038742E-01 1.560754E-02 + 5 6 6.265899E-02 3.854063E-01 2.414917E-02 + 5 7 5.031337E-02 7.443676E-02 3.745164E-03 + 5 8 5.656080E-02 7.188276E-03 4.065746E-04 + 5 9 7.286706E-02 6.339508E-04 4.619413E-05 + 5 10 8.327277E-02 1.241281E-04 1.033649E-05 + 5 11 8.660147E-02 2.478586E-05 2.146492E-06 + 5 12 9.112813E-02 5.889455E-06 5.366951E-07 + 5 13 5.493532E-02 8.452393E-08 4.643349E-09 + 5 14 1.125630E+01 4.782969E-10 5.383854E-09 + 5 15 5.185606E-02 1.305763E-08 6.771174E-10 + 5 16 8.649303E-01 4.552201E-09 3.937336E-09 + 5 17 1.543766E+00 2.372664E-09 3.662838E-09 + 5 18 3.325191E-01 6.634103E-09 2.205966E-09 + 5 19 3.122050E-01 1.399508E-09 4.369334E-10 + 5 20 1.253390E+00 1.993744E-10 2.498938E-10 + 5 21 1.213720E+00 3.448449E-10 4.185451E-10 + 5 22 9.303103E+00 1.505440E-11 1.400526E-10 + 5 23 4.861519E+03 7.290000E-14 3.544047E-10 + 5 24 6.575118E+00 6.368040E-11 4.187061E-10 + 5 25 5.423291E-02 1.471369E-10 7.979662E-12 + 5 26 5.259333E+00 4.369210E-11 2.297913E-10 + 5 27 4.051897E+00 7.562500E-12 3.064247E-11 + 5 28 7.560476E-01 6.625960E-11 5.009541E-11 + 5 29 7.277030E-01 5.431690E-11 3.952657E-11 + 5 30 1.196309E+00 1.162810E-11 1.391081E-11 + 5 31 8.540861E+03 1.000000E-14 8.540861E-11 + 5 32 2.028940E+01 9.604000E-13 1.948594E-11 + 5 33 8.844457E+01 2.704000E-13 2.391541E-11 + 5 34 1.054373E+05 9.000000E-16 9.489359E-11 + 5 35 1.811715E+03 2.560000E-14 4.637989E-11 + 5 36 1.704922E-01 1.020100E-12 1.739191E-13 + 5 37 1.043184E+01 3.648100E-12 3.805640E-11 + 5 38 9.400620E+00 5.382400E-12 5.059789E-11 + 5 39 3.422803E+00 4.202500E-12 1.438433E-11 + 5 40 5.564322E-01 1.562500E-12 8.694253E-13 + 5 41 2.690590E+02 6.760000E-14 1.818839E-11 + 5 42 6.520555E+01 3.721000E-13 2.426299E-11 + 5 43 7.369428E+00 1.440000E-12 1.061198E-11 + 5 44 1.113807E-01 2.102500E-12 2.341779E-13 + 5 45 2.215430E+00 2.044900E-12 4.530333E-12 + 5 46 9.355054E+00 1.537600E-12 1.438433E-11 + 6 0 1.049067E-01 5.207066E-07 5.462560E-08 + 6 1 1.257318E-01 2.516327E-05 3.163824E-06 + 6 2 1.316398E-01 5.731739E-04 7.545248E-05 + 6 3 1.268392E-01 8.293288E-03 1.051914E-03 + 6 4 1.102878E-01 7.312013E-02 8.064262E-03 + 6 5 8.865098E-02 2.817061E-01 2.497352E-02 + 6 6 7.683283E-02 1.016390E-01 7.809214E-03 + 6 7 6.311974E-02 4.000621E-01 2.525182E-02 + 6 8 5.225527E-02 1.139162E-01 5.952721E-03 + 6 9 5.891976E-02 1.728466E-02 1.018408E-03 + 6 10 7.250538E-02 2.575461E-03 1.867348E-04 + 6 11 8.116850E-02 6.367462E-04 5.168373E-05 + 6 12 8.200229E-02 1.377020E-04 1.129188E-05 + 6 13 7.219643E-02 2.744628E-05 1.981524E-06 + 6 14 2.122814E-02 1.762814E-06 3.742126E-08 + 6 15 2.282832E-04 2.796929E-07 6.384920E-11 + 6 16 1.025712E-01 2.122813E-07 2.177394E-08 + 6 17 1.289968E+00 1.585585E-08 2.045353E-08 + 6 18 4.883556E-02 2.623488E-09 1.281195E-10 + 6 19 2.623638E+00 3.858894E-09 1.012434E-08 + 6 20 1.377666E-01 4.799718E-09 6.612409E-10 + 6 21 2.255298E+02 1.444000E-11 3.256650E-09 + 6 22 3.910672E-01 9.859600E-10 3.855767E-10 + 6 23 2.610282E+00 4.782969E-10 1.248490E-09 + 6 24 2.822699E+01 1.361610E-11 3.843416E-10 + 6 25 2.467528E+03 2.916000E-13 7.195311E-10 + 6 26 2.926449E+01 3.600000E-11 1.053522E-09 + 6 27 7.938502E-02 5.898240E-11 4.682319E-12 + 6 28 1.962382E+02 3.920400E-12 7.693321E-10 + 6 29 1.048030E+01 3.237610E-11 3.393114E-10 + 6 30 5.703277E-01 8.686240E-11 4.954003E-11 + 6 31 6.229542E+00 5.670090E-11 3.532206E-10 + 6 32 9.207972E+00 8.761600E-12 8.067657E-11 + 6 33 5.702621E+01 1.060900E-12 6.049910E-11 + 6 34 2.776668E+01 7.672900E-12 2.130509E-10 + 6 35 8.620507E+00 6.502500E-12 5.605485E-11 + 6 36 1.154042E+01 2.433600E-12 2.808476E-11 + 6 37 2.622137E+02 6.724000E-13 1.763125E-10 + 6 38 3.040915E+02 4.624000E-13 1.406119E-10 + 6 39 1.393894E+01 9.216000E-13 1.284613E-11 + 6 40 1.978960E+01 1.612900E-12 3.191865E-11 + 6 41 6.974675E+01 1.742400E-12 1.215267E-10 + 6 42 1.134088E+02 1.060900E-12 1.203154E-10 + 6 43 1.925001E+02 2.401000E-13 4.621927E-11 + 6 44 5.972345E+01 1.960000E-14 1.170580E-12 + 6 45 2.985195E+01 5.041000E-13 1.504837E-11 + 6 46 3.799171E+01 1.232100E-12 4.680958E-11 + 7 0 8.845032E-02 8.192761E-08 7.246523E-09 + 7 1 1.153002E-01 4.060830E-06 4.682143E-07 + 7 2 1.277653E-01 9.551212E-05 1.220314E-05 + 7 3 1.311474E-01 1.424093E-03 1.867662E-04 + 7 4 1.239693E-01 1.517418E-02 1.881132E-03 + 7 5 1.062466E-01 9.865800E-02 1.048208E-02 + 7 6 8.508744E-02 2.684180E-01 2.283900E-02 + 7 7 8.245729E-02 2.318315E-02 1.911620E-03 + 7 8 6.419922E-02 3.682095E-01 2.363876E-02 + 7 9 5.474923E-02 1.690564E-01 9.255707E-03 + 7 10 6.112820E-02 4.189254E-02 2.560816E-03 + 7 11 7.147805E-02 9.884613E-03 7.065329E-04 + 7 12 7.671250E-02 2.999195E-03 2.300758E-04 + 7 13 7.347323E-02 7.818254E-04 5.744324E-05 + 7 14 6.196279E-02 1.804715E-04 1.118252E-05 + 7 15 4.395230E-02 2.902235E-05 1.275599E-06 + 7 16 5.694000E-02 6.644950E-06 3.783634E-07 + 7 17 1.217727E-01 2.357945E-06 2.871332E-07 + 7 18 1.525825E-01 2.752471E-07 4.199791E-08 + 7 19 2.007344E-02 5.769604E-08 1.158158E-09 + 7 20 5.588348E-01 3.164062E-09 1.768188E-09 + 7 21 8.699843E-01 1.490841E-08 1.297008E-08 + 7 22 1.606901E+01 2.916000E-11 4.685725E-10 + 7 23 8.046762E+00 6.195121E-10 4.985066E-09 + 7 24 1.492631E-01 1.643492E-09 2.453127E-10 + 7 25 1.258320E+01 1.507984E-10 1.897526E-09 + 7 26 4.878495E+02 1.299600E-12 6.340092E-10 + 7 27 1.506093E+02 4.080400E-12 6.145462E-10 + 7 28 1.036218E+02 1.383840E-11 1.433960E-09 + 7 29 2.209389E+00 1.608010E-11 3.552719E-11 + 7 30 4.448753E+02 1.716100E-12 7.634506E-10 + 7 31 1.648647E+01 5.198410E-11 8.570343E-10 + 7 32 2.585246E-01 8.154090E-11 2.108033E-11 + 7 33 8.830493E+00 3.981610E-11 3.515958E-10 + 7 34 2.023451E+02 2.371600E-12 4.798815E-10 + 7 35 9.431240E+00 5.856400E-12 5.523311E-11 + 7 36 5.358559E+00 1.705690E-11 9.140041E-11 + 7 37 1.903683E+01 1.428840E-11 2.720058E-10 + 7 38 2.094955E+01 5.904900E-12 1.237050E-10 + 7 39 1.635887E-01 1.144900E-12 1.872928E-13 + 7 40 1.423220E+03 7.290000E-14 1.037528E-10 + 7 41 5.020224E+04 3.600000E-15 1.807280E-10 + 7 42 2.549925E+03 4.000000E-14 1.019970E-10 + 7 43 5.379731E+01 1.764000E-13 9.489845E-12 + 7 44 6.167705E+01 2.704000E-13 1.667748E-11 + 7 45 4.340350E+02 1.849000E-13 8.025307E-11 + 7 46 2.871374E+03 4.000000E-14 1.148550E-10 + 8 0 9.391826E-02 1.723444E-08 1.618628E-09 + 8 1 1.060705E-01 8.248817E-07 8.749565E-08 + 8 2 1.212552E-01 1.927895E-05 2.337672E-06 + 8 3 1.287884E-01 2.924110E-04 3.765916E-05 + 8 4 1.300823E-01 3.204569E-03 4.168575E-04 + 8 5 1.198298E-01 2.622153E-02 3.142122E-03 + 8 6 1.010429E-01 1.256515E-01 1.269620E-02 + 8 7 8.092943E-02 2.212410E-01 1.790491E-02 + 8 8 3.725699E-02 3.221317E-03 1.200166E-04 + 8 9 6.658527E-02 2.553281E-01 1.700109E-02 + 8 10 5.741994E-02 2.193716E-01 1.259630E-02 + 8 11 6.250814E-02 9.203353E-02 5.752845E-03 + 8 12 6.945658E-02 3.365181E-02 2.337340E-03 + 8 13 7.212159E-02 1.324837E-02 9.554933E-04 + 8 14 6.923174E-02 4.559732E-03 3.156782E-04 + 8 15 6.362376E-02 1.409677E-03 8.968897E-05 + 8 16 6.013250E-02 3.833447E-04 2.305147E-05 + 8 17 6.765059E-02 1.131994E-04 7.658005E-06 + 8 18 7.858770E-02 3.670736E-05 2.884747E-06 + 8 19 6.499063E-02 8.351522E-06 5.427707E-07 + 8 20 3.546175E-02 2.316575E-06 8.214982E-08 + 8 21 6.573027E-02 5.757016E-07 3.784102E-08 + 8 22 1.799085E-01 2.168765E-07 3.901792E-08 + 8 23 7.699784E-03 2.925810E-08 2.252811E-10 + 8 24 1.466954E-01 5.036741E-09 7.388665E-10 + 8 25 4.530839E-01 8.554400E-09 3.875861E-09 + 8 26 5.009398E+01 3.802500E-12 1.904824E-10 + 8 27 6.484775E+00 1.633284E-10 1.059148E-09 + 8 28 1.072007E+00 1.394761E-10 1.495194E-10 + 8 29 2.004012E+03 2.601000E-13 5.212436E-10 + 8 30 8.982583E+02 7.056000E-13 6.338111E-10 + 8 31 1.306754E+00 3.240000E-12 4.233884E-12 + 8 32 3.576208E+01 1.156000E-11 4.134096E-10 + 8 33 9.790807E+00 4.970250E-11 4.866276E-10 + 8 34 7.833800E-01 5.670090E-11 4.441835E-11 + 8 35 5.378325E+00 1.989160E-11 1.069835E-10 + 8 36 6.973182E+03 4.000000E-14 2.789273E-10 + 8 37 1.210488E+01 1.017610E-11 1.231804E-10 + 8 38 1.878079E-03 2.143690E-11 4.026020E-14 + 8 39 3.737030E+00 1.831840E-11 6.845641E-11 + 8 40 1.265215E+01 8.584900E-12 1.086174E-10 + 8 41 2.426852E+01 1.960000E-12 4.756631E-11 + 8 42 1.348370E+01 5.760000E-14 7.766612E-13 + 8 43 1.272008E+02 1.521000E-13 1.934725E-11 + 8 44 1.613453E+02 3.136000E-13 5.059789E-11 + 8 45 2.247662E+02 2.209000E-13 4.965086E-11 + 8 46 3.204486E+02 7.840000E-14 2.512317E-11 + 9 0 1.339584E-01 5.185440E-09 6.946332E-10 + 9 1 1.054135E-01 2.193049E-07 2.311770E-08 + 9 2 1.143528E-01 4.846030E-06 5.541572E-07 + 9 3 1.245023E-01 7.288310E-05 9.074112E-06 + 9 4 1.295712E-01 7.938436E-04 1.028593E-04 + 9 5 1.274128E-01 6.892304E-03 8.781674E-04 + 9 6 1.142030E-01 4.269850E-02 4.876298E-03 + 9 7 9.384459E-02 1.468252E-01 1.377875E-02 + 9 8 7.728011E-02 1.230294E-01 9.507723E-03 + 9 9 6.072133E-02 8.008936E-02 4.863132E-03 + 9 10 7.352444E-02 7.631863E-02 5.611284E-03 + 9 11 5.968289E-02 1.916320E-01 1.143715E-02 + 9 12 6.295187E-02 1.507827E-01 9.492054E-03 + 9 13 6.759832E-02 8.909772E-02 6.022856E-03 + 9 14 6.949782E-02 4.966310E-02 3.451477E-03 + 9 15 6.817663E-02 2.424149E-02 1.652703E-03 + 9 16 6.560318E-02 1.067947E-02 7.006073E-04 + 9 17 6.425873E-02 4.342929E-03 2.790711E-04 + 9 18 6.620513E-02 1.741880E-03 1.153214E-04 + 9 19 6.837353E-02 6.981163E-04 4.773268E-05 + 9 20 6.456962E-02 2.513110E-04 1.622705E-05 + 9 21 5.939347E-02 9.285481E-05 5.514970E-06 + 9 22 6.600904E-02 3.324768E-05 2.194647E-06 + 9 23 7.646069E-02 1.209036E-05 9.244376E-07 + 9 24 5.355608E-02 3.907303E-06 2.092598E-07 + 9 25 4.791001E-02 1.301219E-06 6.234143E-08 + 9 26 1.048493E-01 5.087684E-07 5.334403E-08 + 9 27 6.648057E-02 1.214174E-07 8.071898E-09 + 9 28 5.947036E-03 4.758942E-08 2.830160E-10 + 9 29 1.856207E-01 1.577034E-08 2.927301E-09 + 9 30 2.725895E-01 3.220562E-09 8.778916E-10 + 9 31 3.641344E-01 1.283072E-09 4.672108E-10 + 9 32 9.321696E-01 3.748096E-10 3.493861E-10 + 9 33 2.382167E+00 1.000000E-10 2.382167E-10 + 9 34 1.256058E+04 4.840000E-14 6.079320E-10 + 9 35 4.103537E+00 7.744000E-11 3.177779E-10 + 9 36 1.965944E-01 1.944810E-11 3.823388E-12 + 9 37 3.163667E+01 7.840000E-12 2.480315E-10 + 9 38 1.407986E+02 2.250000E-12 3.167968E-10 + 9 39 6.409895E+00 1.369000E-11 8.775147E-11 + 9 40 1.793534E-01 2.218410E-11 3.978795E-12 + 9 41 5.775576E+00 1.722250E-11 9.946986E-11 + 9 42 1.677312E+01 8.294400E-12 1.391230E-10 + 9 43 3.368381E+01 2.102500E-12 7.082020E-11 + 9 44 8.574136E+01 7.840000E-14 6.722123E-12 + 9 45 3.819406E+01 2.304000E-13 8.799911E-12 + 9 46 6.371821E+01 6.889000E-13 4.389548E-11 + 10 0 1.909451E-01 2.090318E-09 3.991361E-10 + 10 1 1.139274E-01 7.419086E-08 8.452374E-09 + 10 2 1.100356E-01 1.511178E-06 1.662835E-07 + 10 3 1.202810E-01 2.153508E-05 2.590261E-06 + 10 4 1.264585E-01 2.350708E-04 2.972670E-05 + 10 5 1.299821E-01 1.997514E-03 2.596411E-04 + 10 6 1.218272E-01 1.393665E-02 1.697863E-03 + 10 7 1.060530E-01 6.225032E-02 6.601836E-03 + 10 8 8.447824E-02 1.343780E-01 1.135201E-02 + 10 9 8.363843E-02 1.186954E-02 9.927495E-04 + 10 10 6.489507E-02 1.639520E-01 1.063968E-02 + 10 11 3.184718E-02 5.655469E-03 1.801107E-04 + 10 12 6.123345E-02 4.127719E-02 2.527545E-03 + 10 13 6.261589E-02 1.051621E-01 6.584819E-03 + 10 14 6.624964E-02 1.223797E-01 8.107608E-03 + 10 15 6.799978E-02 1.124495E-01 7.646542E-03 + 10 16 6.756235E-02 8.597226E-02 5.808488E-03 + 10 17 6.625636E-02 5.778698E-02 3.828755E-03 + 10 18 6.542483E-02 3.550499E-02 2.322908E-03 + 10 19 6.564502E-02 2.069342E-02 1.358420E-03 + 10 20 6.590703E-02 1.166433E-02 7.687612E-04 + 10 21 6.491418E-02 6.238866E-03 4.049909E-04 + 10 22 6.395808E-02 3.271719E-03 2.092528E-04 + 10 23 6.472278E-02 1.674391E-03 1.083712E-04 + 10 24 6.544495E-02 8.416637E-04 5.508263E-05 + 10 25 6.315030E-02 4.117064E-04 2.599938E-05 + 10 26 6.319041E-02 1.984982E-04 1.254318E-05 + 10 27 6.636330E-02 9.530309E-05 6.324627E-06 + 10 28 6.316539E-02 4.366117E-05 2.757875E-06 + 10 29 6.095981E-02 2.019523E-05 1.231097E-06 + 10 30 6.816980E-02 9.086185E-06 6.194035E-07 + 10 31 6.408818E-02 3.931734E-06 2.519777E-07 + 10 32 5.573454E-02 1.710655E-06 9.534256E-08 + 10 33 7.543576E-02 7.112224E-07 5.365160E-08 + 10 34 6.328938E-02 2.882723E-07 1.824458E-08 + 10 35 4.270271E-02 1.115293E-07 4.762602E-09 + 10 36 1.127563E-01 4.480419E-08 5.051957E-09 + 10 37 3.428318E-02 1.435683E-08 4.921979E-10 + 10 38 3.608766E-02 5.789688E-09 2.089363E-10 + 10 39 3.093763E-01 1.752260E-09 5.421076E-10 + 10 40 1.377762E-01 4.280761E-10 5.897870E-11 + 10 41 4.851864E-01 2.640625E-10 1.281195E-10 + 10 42 1.478002E-01 4.796100E-12 7.088644E-13 + 10 43 4.828282E-01 4.225000E-11 2.039949E-11 + 10 44 7.843369E+01 9.216000E-13 7.228449E-11 + 10 45 1.872928E+01 3.204100E-12 6.001047E-11 + 10 46 1.992138E+04 1.600000E-15 3.187421E-11 + 11 0 2.289408E-01 8.094025E-10 1.853053E-10 + 11 1 1.239820E-01 2.504306E-08 3.104889E-09 + 11 2 1.091703E-01 4.718316E-07 5.150999E-08 + 11 3 1.169302E-01 6.347779E-06 7.422470E-07 + 11 4 1.241940E-01 6.860527E-05 8.520360E-06 + 11 5 1.294226E-01 5.715250E-04 7.396827E-05 + 11 6 1.256272E-01 4.097865E-03 5.148032E-04 + 11 7 1.130494E-01 2.076169E-02 2.347097E-03 + 11 8 9.227523E-02 6.091419E-02 5.620871E-03 + 11 9 7.712424E-02 4.062340E-02 3.133049E-03 + 11 10 6.163196E-02 3.474323E-02 2.141293E-03 + 11 11 7.379735E-02 3.228345E-02 2.382433E-03 + 11 12 5.884898E-02 6.465888E-02 3.805110E-03 + 11 13 6.285048E-02 2.519716E-02 1.583654E-03 + 11 14 8.719308E-02 7.531995E-04 6.567378E-05 + 11 15 6.162290E-02 7.755189E-03 4.778972E-04 + 11 16 6.661758E-02 3.361111E-02 2.239091E-03 + 11 17 6.716177E-02 6.197894E-02 4.162616E-03 + 11 18 6.639886E-02 8.119924E-02 5.391537E-03 + 11 19 6.562046E-02 8.811882E-02 5.782397E-03 + 11 20 6.535259E-02 8.530229E-02 5.574726E-03 + 11 21 6.530724E-02 7.680531E-02 5.015943E-03 + 11 22 6.494884E-02 6.513286E-02 4.230304E-03 + 11 23 6.451142E-02 5.306932E-02 3.423577E-03 + 11 24 6.441833E-02 4.191512E-02 2.700102E-03 + 11 25 6.444592E-02 3.232291E-02 2.083080E-03 + 11 26 6.410821E-02 2.442536E-02 1.565866E-03 + 11 27 6.394566E-02 1.816296E-02 1.161442E-03 + 11 28 6.412289E-02 1.334019E-02 8.554118E-04 + 11 29 6.391527E-02 9.663785E-03 6.176634E-04 + 11 30 6.371203E-02 6.931828E-03 4.416408E-04 + 11 31 6.395442E-02 4.919499E-03 3.146237E-04 + 11 32 6.382691E-02 3.452421E-03 2.203574E-04 + 11 33 6.357171E-02 2.398627E-03 1.524848E-04 + 11 34 6.393212E-02 1.646678E-03 1.052756E-04 + 11 35 6.374116E-02 1.116465E-03 7.116476E-05 + 11 36 6.348186E-02 7.464458E-04 4.738576E-05 + 11 37 6.405873E-02 4.915931E-04 3.149083E-05 + 11 38 6.350104E-02 3.177271E-04 2.017600E-05 + 11 39 6.359454E-02 2.014816E-04 1.281313E-05 + 11 40 6.417423E-02 1.246959E-04 8.002261E-06 + 11 41 6.302785E-02 7.509037E-05 4.732785E-06 + 11 42 6.429684E-02 4.387433E-05 2.820981E-06 + 11 43 6.351449E-02 2.460993E-05 1.563087E-06 + 11 44 6.320156E-02 1.326744E-05 8.385230E-07 + 11 45 6.504181E-02 6.742799E-06 4.385639E-07 + 11 46 6.155438E-02 3.232696E-06 1.989866E-07 +[transition-N2w] +1029 0 0 0 5 +c data calculated with LEVEL_8.0 +c using Potentialenergyfunctions retrieved via RKR1 2.0 +c with Spectroscopic constants from +c Spelsberg & Meyer j.chem.phys.,vol.115,no.14,(2001) +c documented in ESA report Aerothermochemistry +c +c vu vl sumre2/fcf FCF SRe2 + 0 0 2.207753E-01 2.256952E-01 4.982793E-02 + 0 1 2.321624E-01 3.655446E-01 8.486570E-02 + 0 2 2.443701E-01 2.625461E-01 6.415842E-02 + 0 3 2.578391E-01 1.100882E-01 2.838504E-02 + 0 4 2.731753E-01 2.986416E-02 8.158151E-03 + 0 5 2.909516E-01 5.496836E-03 1.599313E-03 + 0 6 3.116252E-01 6.995290E-04 2.179909E-04 + 0 7 3.358465E-01 6.154795E-05 2.067066E-05 + 0 8 3.666131E-01 3.693930E-06 1.354243E-06 + 0 9 4.150070E-01 1.442101E-07 5.984819E-08 + 0 10 4.884997E-01 3.477461E-09 1.698739E-09 + 0 11 7.185181E-01 6.336160E-11 4.552646E-11 + 0 12 9.534705E+00 4.356000E-13 4.153317E-12 + 0 13 1.805440E-01 1.000000E-12 1.805440E-13 + 0 14 3.442102E-01 3.249000E-13 1.118339E-13 + 0 15 3.467926E+00 2.250000E-14 7.802833E-14 + 0 16 1.023492E+00 4.410000E-14 4.513600E-14 + 0 17 4.541505E+00 5.760000E-14 2.615907E-13 + 0 18 3.228005E+02 9.000000E-16 2.905205E-13 + 0 19 3.106497E+01 3.240000E-14 1.006505E-12 + 0 20 8.086852E-01 1.960000E-14 1.585023E-14 + 0 21 2.034003E+02 6.400000E-15 1.301762E-12 + 0 22 4.739246E+02 9.000000E-16 4.265322E-13 + 0 23 2.862019E+02 9.000000E-16 2.575817E-13 + 0 24 9.588410E+01 8.100000E-15 7.766612E-13 + 0 25 8.248620E+00 1.000000E-14 8.248620E-14 + 0 26 6.191496E+01 2.500000E-15 1.547874E-13 + 0 28 8.706791E+00 1.600000E-15 1.393087E-14 + 0 29 1.674180E+01 2.500000E-15 4.185451E-14 + 0 30 2.011617E+01 2.500000E-15 5.029043E-14 + 0 31 1.170580E+00 1.600000E-15 1.872928E-15 + 0 32 2.821000E+01 4.000000E-16 1.128400E-14 + 0 34 1.393087E+00 4.000000E-16 5.572346E-16 + 0 35 4.402842E+00 9.000000E-16 3.962557E-15 + 0 36 6.879440E+00 9.000000E-16 6.191496E-15 + 0 37 1.719860E+00 9.000000E-16 1.547874E-15 + 0 38 3.869685E+00 1.000000E-16 3.869685E-16 + 0 40 2.228939E+01 1.000000E-16 2.228939E-15 + 0 41 3.869685E+00 1.000000E-16 3.869685E-16 + 0 42 3.482716E-01 4.000000E-16 1.393087E-16 + 0 43 2.476598E+00 4.000000E-16 9.906393E-16 + 0 44 3.134445E+00 4.000000E-16 1.253778E-15 + 0 45 5.572346E+00 1.000000E-16 5.572346E-16 + 0 46 1.393087E+00 1.000000E-16 1.393087E-16 + 1 0 2.117985E-01 3.044831E-01 6.448906E-02 + 1 1 2.214314E-01 5.353452E-02 1.185422E-02 + 1 2 2.362032E-01 6.473235E-02 1.528999E-02 + 1 3 2.475384E-01 2.481796E-01 6.143399E-02 + 1 4 2.608900E-01 2.125058E-01 5.544065E-02 + 1 5 2.762469E-01 8.976891E-02 2.479839E-02 + 1 6 2.941248E-01 2.268450E-02 6.672074E-03 + 1 7 3.150899E-01 3.687141E-03 1.161781E-03 + 1 8 3.400695E-01 3.948606E-04 1.342800E-04 + 1 9 3.719308E-01 2.788157E-05 1.037001E-05 + 1 10 4.241312E-01 1.257650E-06 5.334086E-07 + 1 11 5.387668E-01 3.465927E-08 1.867326E-08 + 1 12 7.404615E-01 9.437184E-10 6.987871E-10 + 1 13 1.019743E+00 4.858090E-11 4.954003E-11 + 1 14 6.178830E-04 2.106810E-11 1.301762E-14 + 1 15 1.039572E+00 8.065600E-12 8.384771E-12 + 1 16 1.101244E-01 1.322500E-12 1.456395E-13 + 1 17 1.118339E+03 1.000000E-14 1.118339E-11 + 1 18 3.044250E+00 5.290000E-14 1.610408E-13 + 1 19 7.754065E+02 8.100000E-15 6.280793E-12 + 1 20 3.862695E-01 4.761000E-13 1.839029E-13 + 1 21 1.169139E+01 3.025000E-13 3.536644E-12 + 1 22 1.078806E+02 2.500000E-15 2.697016E-13 + 1 23 6.888180E+01 4.410000E-14 3.037687E-12 + 1 24 3.806523E+01 4.840000E-14 1.842357E-12 + 1 25 1.683392E+01 4.410000E-14 7.423758E-13 + 1 26 8.256205E+01 4.410000E-14 3.640987E-12 + 1 27 5.219789E+01 1.210000E-14 6.315945E-13 + 1 28 2.215567E+02 3.600000E-15 7.976040E-13 + 1 29 6.157146E+01 3.240000E-14 1.994915E-12 + 1 30 9.177345E+00 4.000000E-14 3.670938E-13 + 1 31 1.253778E+01 1.690000E-14 2.118885E-13 + 1 32 2.915513E+02 2.500000E-15 7.288784E-13 + 1 33 5.759639E+02 4.000000E-16 2.303856E-13 + 1 34 4.682319E+00 3.600000E-15 1.685635E-14 + 1 35 3.367593E+01 6.400000E-15 2.155260E-13 + 1 36 1.724637E+01 8.100000E-15 1.396956E-13 + 1 37 3.229515E-01 8.100000E-15 2.615907E-15 + 1 38 1.099622E+01 4.900000E-15 5.388149E-14 + 1 39 1.128400E+02 9.000000E-16 1.015560E-13 + 1 41 4.740364E-01 1.600000E-15 7.584582E-16 + 1 42 5.267071E+00 3.600000E-15 1.896146E-14 + 1 43 9.906393E+00 4.900000E-15 4.854133E-14 + 1 44 9.211430E+00 4.900000E-15 4.513600E-14 + 1 45 5.572346E+00 3.600000E-15 2.006045E-14 + 1 46 1.896146E+00 1.600000E-15 3.033833E-15 + 2 0 2.034845E-01 2.321090E-01 4.723057E-02 + 2 1 2.151711E-01 2.584836E-02 5.561820E-03 + 2 2 2.246900E-01 1.682134E-01 3.779586E-02 + 2 3 2.293113E-01 6.726221E-03 1.542399E-03 + 2 4 2.514910E-01 1.099007E-01 2.763905E-02 + 2 5 2.641574E-01 2.345099E-01 6.194752E-02 + 2 6 2.794570E-01 1.564193E-01 4.371248E-02 + 2 7 2.974513E-01 5.372160E-02 1.597956E-02 + 2 8 3.187186E-01 1.100942E-02 3.508906E-03 + 2 9 3.446009E-01 1.418905E-03 4.889561E-04 + 2 10 3.787961E-01 1.168384E-04 4.425792E-05 + 2 11 4.357629E-01 6.111328E-06 2.663090E-06 + 2 12 5.586194E-01 2.063340E-07 1.152622E-07 + 2 13 5.655490E-01 9.131714E-09 5.164431E-09 + 2 14 1.224092E-01 1.153282E-09 1.411723E-10 + 2 15 5.430281E-02 1.968409E-10 1.068901E-11 + 2 16 2.372705E-01 2.756250E-11 6.539768E-12 + 2 17 2.140099E+00 2.097640E-11 4.489158E-11 + 2 18 5.024326E-01 1.464100E-12 7.356116E-13 + 2 19 1.526531E+01 2.528100E-12 3.859223E-11 + 2 20 4.513600E+00 4.000000E-14 1.805440E-13 + 2 21 6.683471E+01 4.624000E-13 3.090437E-11 + 2 22 1.941988E+00 1.144900E-12 2.223382E-12 + 2 23 5.051124E+02 2.560000E-14 1.293088E-11 + 2 24 8.243241E+00 7.056000E-13 5.816431E-12 + 2 25 3.750231E+00 8.100000E-13 3.037687E-12 + 2 26 4.595629E+01 1.521000E-13 6.989951E-12 + 2 27 7.491710E+01 4.000000E-16 2.996684E-14 + 2 28 8.198477E+02 8.100000E-15 6.640766E-12 + 2 29 1.364215E+02 2.560000E-14 3.492391E-12 + 2 30 6.231251E+00 8.410000E-14 5.240482E-13 + 2 31 3.949533E+01 1.444000E-13 5.703126E-12 + 2 32 3.702790E+01 9.000000E-14 3.332511E-12 + 2 33 3.229515E-01 8.100000E-15 2.615907E-15 + 2 34 1.393087E+02 1.690000E-14 2.354316E-12 + 2 35 4.194464E+01 6.760000E-14 2.835457E-12 + 2 36 7.584582E+00 7.290000E-14 5.529161E-13 + 2 37 4.026020E+00 4.000000E-14 1.610408E-13 + 2 38 8.915754E+01 1.210000E-14 1.078806E-12 + 2 39 5.759639E+02 1.600000E-15 9.215422E-13 + 2 40 1.772161E+03 1.000000E-16 1.772161E-13 + 2 41 1.426521E+01 2.500000E-15 3.566302E-14 + 2 42 6.733568E+01 4.900000E-15 3.299448E-13 + 2 43 5.139706E+01 8.100000E-15 4.163162E-13 + 2 44 1.842098E+01 1.210000E-14 2.228939E-13 + 2 45 2.706861E+00 1.210000E-14 3.275301E-14 + 2 46 7.995217E-01 1.210000E-14 9.674212E-15 + 3 0 1.956576E-01 1.322109E-01 2.586806E-02 + 3 1 2.058627E-01 1.334409E-01 2.747049E-02 + 3 2 2.144408E-01 2.642544E-02 5.666692E-03 + 3 3 2.278709E-01 1.020251E-01 2.324854E-02 + 3 4 2.374466E-01 8.283157E-02 1.966808E-02 + 3 5 2.599653E-01 1.420692E-02 3.693305E-03 + 3 6 2.678151E-01 1.816702E-01 4.865402E-02 + 3 7 2.828472E-01 2.033418E-01 5.751467E-02 + 3 8 3.009744E-01 9.523568E-02 2.866350E-02 + 3 9 3.226525E-01 2.445561E-02 7.890666E-03 + 3 10 3.496064E-01 3.770768E-03 1.318285E-03 + 3 11 3.863980E-01 3.617581E-04 1.397826E-04 + 3 12 4.434077E-01 2.232553E-05 9.899312E-06 + 3 13 5.112837E-01 1.005407E-06 5.140483E-07 + 3 14 3.558653E-01 6.973296E-08 2.481554E-08 + 3 15 1.079493E-01 1.088058E-08 1.174550E-09 + 3 16 1.745721E-01 7.879249E-10 1.375497E-10 + 3 17 1.370663E+02 1.742400E-12 2.388243E-10 + 3 18 6.205841E-02 8.390560E-11 5.207048E-12 + 3 19 1.039944E+05 9.000000E-16 9.359500E-11 + 3 20 1.458314E-01 3.352410E-11 4.888867E-12 + 3 21 1.152249E+01 4.622500E-12 5.326273E-11 + 3 22 4.926853E+00 4.489000E-13 2.211664E-12 + 3 23 1.255171E+05 4.000000E-16 5.020686E-11 + 3 24 2.119864E+01 1.369000E-13 2.902093E-12 + 3 25 4.172164E+01 6.241000E-13 2.603848E-11 + 3 26 7.131876E+00 2.722500E-12 1.941653E-11 + 3 27 1.093080E+00 1.166400E-12 1.274968E-12 + 3 28 8.152052E+02 1.960000E-14 1.597802E-11 + 3 29 4.422519E+00 7.056000E-13 3.120529E-12 + 3 30 5.906376E+00 6.241000E-13 3.686169E-12 + 3 31 4.425640E+01 1.936000E-13 8.568040E-12 + 3 32 1.446402E+01 4.410000E-14 6.378634E-13 + 3 33 1.903893E+02 1.960000E-14 3.731630E-12 + 3 34 2.185809E+03 3.600000E-15 7.868911E-12 + 3 35 1.722988E+02 1.210000E-14 2.084816E-12 + 3 36 5.742485E+00 1.089000E-13 6.253566E-13 + 3 37 2.562523E+01 2.025000E-13 5.189108E-12 + 3 38 2.816143E+01 1.849000E-13 5.207048E-12 + 3 39 1.494959E+01 8.410000E-14 1.257261E-12 + 3 40 2.002804E+01 6.400000E-15 1.281794E-13 + 3 41 1.983817E+02 1.000000E-14 1.983817E-12 + 3 42 6.611142E+01 4.410000E-14 2.915513E-12 + 3 43 2.709604E+01 6.760000E-14 1.831692E-12 + 3 44 6.824514E+00 6.250000E-14 4.265322E-13 + 3 45 1.137214E-01 4.410000E-14 5.015112E-15 + 3 46 1.433960E+01 2.560000E-14 3.670938E-13 + 4 0 1.881898E-01 6.285032E-02 1.182779E-02 + 4 1 1.979226E-01 1.623535E-01 3.213344E-02 + 4 2 2.092858E-01 1.640332E-02 3.432982E-03 + 4 3 2.177302E-01 1.014670E-01 2.209242E-02 + 4 4 2.332178E-01 1.596904E-02 3.724263E-03 + 4 5 2.411144E-01 1.271879E-01 3.066683E-02 + 4 6 2.413742E-01 5.924450E-03 1.430009E-03 + 4 7 2.723608E-01 9.884915E-02 2.692263E-02 + 4 8 2.865286E-01 2.149158E-01 6.157952E-02 + 4 9 3.047685E-01 1.397603E-01 4.259454E-02 + 4 10 3.269547E-01 4.500221E-02 1.471369E-02 + 4 11 3.548353E-01 8.305069E-03 2.946932E-03 + 4 12 3.920490E-01 9.368846E-04 3.673046E-04 + 4 13 4.386592E-01 7.021954E-05 3.080245E-05 + 4 14 4.513965E-01 4.391162E-06 1.982155E-06 + 4 15 3.202917E-01 4.074141E-07 1.304914E-07 + 4 16 2.311560E-01 5.541787E-08 1.281017E-08 + 4 17 9.662856E-01 1.671174E-09 1.614832E-09 + 4 18 1.982403E+00 8.836000E-11 1.751651E-10 + 4 19 2.227607E+00 3.906250E-11 8.701592E-11 + 4 20 2.046059E+00 3.260410E-11 6.670990E-11 + 4 21 1.441783E+00 5.343610E-11 7.704328E-11 + 4 22 3.834777E-01 4.475610E-11 1.716297E-11 + 4 23 1.132515E+02 3.721000E-13 4.214087E-11 + 4 24 3.489908E-01 1.043290E-11 3.640987E-12 + 4 25 1.887763E+01 1.904400E-12 3.595055E-11 + 4 26 4.361293E+01 1.960000E-14 8.548134E-13 + 4 27 4.595074E+01 5.476000E-13 2.516263E-11 + 4 28 1.382530E+01 1.488400E-12 2.057758E-11 + 4 29 2.444949E+00 1.521000E-13 3.718767E-13 + 4 30 1.915736E+01 9.216000E-13 1.765542E-11 + 4 31 3.986646E+00 2.560000E-12 1.020581E-11 + 4 32 9.341585E-02 1.464100E-12 1.367701E-13 + 4 33 6.262458E+01 1.225000E-13 7.671511E-12 + 4 34 5.137747E+01 1.024000E-13 5.261053E-12 + 4 35 2.046775E-04 3.025000E-13 6.191496E-17 + 4 36 1.592415E+01 2.401000E-13 3.823388E-12 + 4 37 3.907713E+01 1.296000E-13 5.064396E-12 + 4 38 1.100865E+01 9.000000E-14 9.907786E-13 + 4 39 7.070526E+00 8.410000E-14 5.946313E-13 + 4 40 5.414905E+01 7.290000E-14 3.947466E-12 + 4 41 1.450420E+02 3.240000E-14 4.699361E-12 + 4 42 2.303856E+03 9.000000E-16 2.073470E-12 + 4 43 4.208480E+00 1.960000E-14 8.248620E-14 + 4 44 7.976487E+00 7.840000E-14 6.253566E-13 + 4 45 1.715572E+01 1.296000E-13 2.223382E-12 + 4 46 1.943432E+01 1.521000E-13 2.955959E-12 + 5 0 1.810128E-01 2.645319E-02 4.788368E-03 + 5 1 1.905039E-01 1.224359E-01 2.332452E-02 + 5 2 2.003931E-01 9.086720E-02 1.820916E-02 + 5 3 2.073214E-01 8.930159E-03 1.851413E-03 + 5 4 2.205789E-01 1.051479E-01 2.319341E-02 + 5 5 2.237334E-01 4.785735E-03 1.070729E-03 + 5 6 2.448109E-01 1.011022E-01 2.475093E-02 + 5 7 2.531048E-01 5.035211E-02 1.274436E-02 + 5 8 2.799470E-01 3.037468E-02 8.503300E-03 + 5 9 2.907032E-01 1.899374E-01 5.521540E-02 + 5 10 3.088711E-01 1.783322E-01 5.508167E-02 + 5 11 3.313844E-01 7.268598E-02 2.408700E-02 + 5 12 3.593988E-01 1.618642E-02 5.817381E-03 + 5 13 3.944790E-01 2.185350E-03 8.620747E-04 + 5 14 4.291325E-01 2.042041E-04 8.763063E-05 + 5 15 4.223112E-01 1.726801E-05 7.292475E-06 + 5 16 3.435256E-01 1.859487E-06 6.387812E-07 + 5 17 3.288904E-01 2.061160E-07 6.778957E-08 + 5 18 1.168758E+00 4.277160E-09 4.998965E-09 + 5 19 5.561195E-01 1.168561E-10 6.498596E-11 + 5 20 7.040470E-01 9.447840E-11 6.651724E-11 + 5 21 1.269289E-03 1.054729E-10 1.338756E-13 + 5 22 2.007450E+01 5.616900E-12 1.127564E-10 + 5 23 7.349492E-02 7.708840E-11 5.665606E-12 + 5 24 7.217389E+00 5.712100E-12 4.122645E-11 + 5 25 7.225242E-01 2.125210E-11 1.535516E-11 + 5 26 3.857871E-01 2.209000E-11 8.522037E-12 + 5 27 1.000571E+01 1.562500E-12 1.563391E-11 + 5 28 9.189907E-01 5.041000E-13 4.632632E-13 + 5 29 8.052476E+01 2.209000E-13 1.778792E-11 + 5 30 5.070990E+03 1.600000E-15 8.113584E-12 + 5 31 1.222138E+01 1.225000E-13 1.497119E-12 + 5 32 1.022645E+01 1.368900E-12 1.399899E-11 + 5 33 3.848654E+00 2.160900E-12 8.316557E-12 + 5 34 5.798487E-03 8.649000E-13 5.015112E-15 + 5 35 5.240482E+03 9.000000E-16 4.716434E-12 + 5 36 9.127384E+00 6.561000E-13 5.988477E-12 + 5 37 9.924320E-01 1.188100E-12 1.179108E-12 + 5 38 4.754939E-01 8.649000E-13 4.112546E-13 + 5 39 8.727911E+00 3.025000E-13 2.640193E-12 + 5 40 6.256841E+01 3.610000E-14 2.258720E-12 + 5 41 2.264636E+02 1.600000E-15 3.623418E-13 + 5 42 1.023936E+01 2.250000E-14 2.303856E-13 + 5 43 4.740364E+01 3.240000E-14 1.535878E-12 + 5 44 5.997519E+01 3.610000E-14 2.165104E-12 + 5 45 3.394828E+01 4.410000E-14 1.497119E-12 + 5 46 8.960991E+00 5.290000E-14 4.740364E-13 + 6 0 1.741303E-01 1.025147E-02 1.785092E-03 + 6 1 1.834613E-01 7.162486E-02 1.314039E-02 + 6 2 1.929263E-01 1.222781E-01 2.359067E-02 + 6 3 2.037984E-01 1.774576E-02 3.616556E-03 + 6 4 2.112739E-01 5.813951E-02 1.228336E-02 + 6 5 2.238829E-01 5.216995E-02 1.167996E-02 + 6 6 2.320048E-01 4.597920E-02 1.066740E-02 + 6 7 2.495648E-01 4.399813E-02 1.098038E-02 + 6 8 2.578557E-01 9.580501E-02 2.470387E-02 + 6 9 3.400642E-01 7.100573E-04 2.414651E-04 + 6 10 2.955926E-01 1.381325E-01 4.083093E-02 + 6 11 3.131499E-01 2.021774E-01 6.331183E-02 + 6 12 3.356233E-01 1.065009E-01 3.574419E-02 + 6 13 3.630836E-01 2.906216E-02 1.055199E-02 + 6 14 3.951108E-01 4.790622E-03 1.892826E-03 + 6 15 4.210451E-01 5.648888E-04 2.378436E-04 + 6 16 4.107202E-01 6.144208E-05 2.523550E-05 + 6 17 3.651245E-01 7.303993E-06 2.666867E-06 + 6 18 3.834942E-01 7.377092E-07 2.829072E-07 + 6 19 8.504152E-01 2.282214E-08 1.940830E-08 + 6 20 1.258876E+00 2.869636E-10 3.612515E-10 + 6 21 2.282092E-05 1.196468E-09 2.730450E-14 + 6 22 3.525888E-01 1.050625E-10 3.704386E-11 + 6 23 4.991585E+00 1.953640E-11 9.751761E-11 + 6 24 1.251095E+00 3.433960E-11 4.296211E-11 + 6 25 9.107743E-01 2.480040E-11 2.258757E-11 + 6 26 6.440565E+00 8.584900E-12 5.529161E-11 + 6 27 1.215743E-02 3.943840E-11 4.794694E-13 + 6 28 1.864596E+00 1.169640E-11 2.180906E-11 + 6 29 2.392824E+01 3.600000E-13 8.614166E-12 + 6 30 9.437265E-01 4.452100E-12 4.201565E-12 + 6 31 8.132143E+00 2.102500E-12 1.709783E-11 + 6 32 9.951474E+00 3.025000E-13 3.010321E-12 + 6 33 2.695023E+01 1.681000E-13 4.530333E-12 + 6 34 2.950145E+01 5.184000E-13 1.529355E-11 + 6 35 1.103400E+01 6.241000E-13 6.886321E-12 + 6 36 3.553430E-01 1.089000E-13 3.869685E-14 + 6 37 3.761955E+01 1.521000E-13 5.721933E-12 + 6 38 8.170402E+00 9.604000E-13 7.846854E-12 + 6 39 1.985144E+00 1.368900E-12 2.717463E-12 + 6 40 4.125945E-03 9.604000E-13 3.962557E-15 + 6 41 5.736471E+00 3.249000E-13 1.863780E-12 + 6 42 1.887820E+02 1.690000E-14 3.190416E-12 + 6 43 4.473356E+01 4.410000E-14 1.972750E-12 + 6 44 2.147772E+00 1.600000E-13 3.436435E-13 + 6 45 3.336092E-01 2.209000E-13 7.369428E-14 + 6 46 3.973564E+00 2.025000E-13 8.046468E-13 + 7 0 1.676166E-01 3.777388E-03 6.331530E-04 + 7 1 1.767665E-01 3.596233E-02 6.356935E-03 + 7 2 1.860012E-01 1.024275E-01 1.905164E-02 + 7 3 1.956360E-01 7.192566E-02 1.407125E-02 + 7 4 1.979412E-01 1.706523E-03 3.377912E-04 + 7 5 2.141678E-01 8.619618E-02 1.846045E-02 + 7 6 2.302833E-01 6.814471E-03 1.569259E-03 + 7 7 2.359026E-01 8.231937E-02 1.941936E-02 + 7 8 2.628873E-01 4.622606E-03 1.215224E-03 + 7 9 2.623060E-01 1.087742E-01 2.853213E-02 + 7 10 2.635119E-01 1.251177E-02 3.297000E-03 + 7 11 3.016241E-01 7.575554E-02 2.284970E-02 + 7 12 3.175129E-01 2.031437E-01 6.450074E-02 + 7 13 3.396291E-01 1.433500E-01 4.868583E-02 + 7 14 3.661197E-01 4.895409E-02 1.792305E-02 + 7 15 3.948767E-01 1.003010E-02 3.960653E-03 + 7 16 4.147633E-01 1.496143E-03 6.205453E-04 + 7 17 4.064417E-01 2.025473E-04 8.232365E-05 + 7 18 3.828174E-01 2.687583E-05 1.028853E-05 + 7 19 4.111561E-01 2.835048E-06 1.165647E-06 + 7 20 5.946437E-01 1.520610E-07 9.042212E-08 + 7 21 3.680141E-01 1.032256E-08 3.798847E-09 + 7 22 8.509266E-02 5.208509E-09 4.432059E-10 + 7 23 2.292641E+00 9.682560E-11 2.219863E-10 + 7 24 3.935087E-01 8.100000E-11 3.187421E-11 + 7 25 2.542645E+03 3.240000E-14 8.238171E-11 + 7 26 5.264490E-04 3.398890E-11 1.789342E-14 + 7 27 2.837742E+03 2.250000E-14 6.384920E-11 + 7 28 9.302487E-01 3.214890E-11 2.990647E-11 + 7 29 1.396956E-01 2.704000E-11 3.777370E-12 + 7 30 4.163162E+01 6.400000E-13 2.664424E-11 + 7 31 7.433295E-01 6.553600E-12 4.871484E-12 + 7 32 6.233831E-01 8.584900E-12 5.351681E-12 + 7 33 5.902761E+00 2.371600E-12 1.399899E-11 + 7 34 2.922509E+01 7.290000E-14 2.130509E-12 + 7 35 3.009080E+02 1.210000E-14 3.640987E-12 + 7 36 2.627418E+03 4.900000E-15 1.287435E-11 + 7 37 1.685635E+02 4.410000E-14 7.433649E-12 + 7 39 1.753806E+01 2.025000E-13 3.551458E-12 + 7 40 1.109179E+01 7.396000E-13 8.203484E-12 + 7 41 5.776479E+00 1.020100E-12 5.892586E-12 + 7 42 1.623529E+00 7.744000E-13 1.257261E-12 + 7 43 3.238393E-01 3.136000E-13 1.015560E-13 + 7 44 6.338035E+01 2.890000E-14 1.831692E-12 + 7 45 1.089409E+02 2.890000E-14 3.148391E-12 + 7 46 1.608868E+01 1.681000E-13 2.704507E-12 + 8 0 1.616000E-01 1.362327E-03 2.201521E-04 + 8 1 1.704614E-01 1.647519E-02 2.808383E-03 + 8 2 1.795031E-01 6.712073E-02 1.204838E-02 + 8 3 1.887272E-01 9.569826E-02 1.806087E-02 + 8 4 1.993214E-01 1.856208E-02 3.699820E-03 + 8 5 2.053997E-01 3.191744E-02 6.555833E-03 + 8 6 2.172890E-01 6.703710E-02 1.456643E-02 + 8 7 2.210119E-01 4.646439E-03 1.026918E-03 + 8 8 2.396427E-01 8.007350E-02 1.918903E-02 + 8 9 2.378445E-01 5.718313E-03 1.360070E-03 + 8 10 2.676449E-01 8.346095E-02 2.233790E-02 + 8 11 2.757514E-01 5.108938E-02 1.408797E-02 + 8 12 3.111273E-01 2.305949E-02 7.174435E-03 + 8 13 3.219421E-01 1.755203E-01 5.650736E-02 + 8 14 3.433808E-01 1.762433E-01 6.051855E-02 + 8 15 3.686080E-01 7.742628E-02 2.853994E-02 + 8 16 3.942917E-01 2.005812E-02 7.908752E-03 + 8 17 4.104531E-01 3.791285E-03 1.556145E-03 + 8 18 4.057558E-01 6.309853E-04 2.560259E-04 + 8 19 3.945717E-01 9.593536E-05 3.785338E-05 + 8 20 4.177179E-01 1.156265E-05 4.829927E-06 + 8 21 4.862590E-01 9.580690E-07 4.658697E-07 + 8 22 3.574818E-01 9.868394E-08 3.527771E-08 + 8 23 2.202346E-01 2.098152E-08 4.620857E-09 + 8 24 2.244593E+00 3.211264E-10 7.207981E-10 + 8 25 2.679531E-01 4.900000E-11 1.312970E-11 + 8 26 7.584647E-01 7.022440E-11 5.326273E-11 + 8 27 7.514004E-01 1.831840E-11 1.376445E-11 + 8 28 3.694666E+00 9.363600E-12 3.459537E-11 + 8 29 5.602153E+00 9.734400E-12 5.453360E-11 + 8 30 5.957451E-02 3.237610E-11 1.928790E-12 + 8 31 2.299834E+00 7.952400E-12 1.828920E-11 + 8 32 9.151593E+00 2.190400E-12 2.004565E-11 + 8 33 3.226817E-02 1.274490E-11 4.112546E-13 + 8 34 9.027295E-01 8.643600E-12 7.802833E-12 + 8 35 7.088575E+00 1.345600E-12 9.538386E-12 + 8 36 1.078655E+01 5.290000E-14 5.706083E-13 + 8 37 8.414724E+00 4.489000E-13 3.777370E-12 + 8 38 4.235397E+01 2.304000E-13 9.758355E-12 + 8 39 1.407052E+02 4.000000E-14 5.628209E-12 + 8 40 1.057783E+01 2.250000E-14 2.380011E-13 + 8 41 1.841139E+01 1.024000E-13 1.885326E-12 + 8 42 1.796067E+01 3.249000E-13 5.835423E-12 + 8 43 1.151473E+01 5.184000E-13 5.969237E-12 + 8 44 5.783601E+00 5.041000E-13 2.915513E-12 + 8 45 1.376552E+00 3.136000E-13 4.316866E-13 + 8 46 1.016397E+00 1.024000E-13 1.040790E-13 + 9 0 1.562411E-01 4.935600E-04 7.711436E-05 + 9 1 1.646413E-01 7.185688E-03 1.183061E-03 + 9 2 1.734265E-01 3.817204E-02 6.620043E-03 + 9 3 1.823873E-01 8.450596E-02 1.541281E-02 + 9 4 1.918236E-01 5.737075E-02 1.100506E-02 + 9 5 1.714758E-01 1.163022E-04 1.994302E-05 + 9 6 2.087322E-01 6.359659E-02 1.327465E-02 + 9 7 2.213338E-01 2.530135E-02 5.600043E-03 + 9 8 2.285428E-01 3.513676E-02 8.030252E-03 + 9 9 2.441988E-01 4.483727E-02 1.094921E-02 + 9 10 2.497739E-01 3.738057E-02 9.336692E-03 + 9 11 2.755239E-01 3.821997E-02 1.053051E-02 + 9 12 2.831975E-01 9.015479E-02 2.553161E-02 + 9 13 4.653147E-01 1.160989E-04 5.402253E-05 + 9 14 3.263295E-01 1.209882E-01 3.948204E-02 + 9 15 3.468258E-01 1.934158E-01 6.708159E-02 + 9 16 3.707109E-01 1.136441E-01 4.212911E-02 + 9 17 3.937665E-01 3.796556E-02 1.494957E-02 + 9 18 4.076418E-01 9.137867E-03 3.724977E-03 + 9 19 4.060797E-01 1.871104E-03 7.598174E-04 + 9 20 4.015996E-01 3.349013E-04 1.344962E-04 + 9 21 4.175171E-01 4.837356E-05 2.019679E-05 + 9 22 4.426099E-01 5.536844E-06 2.450662E-06 + 9 23 3.754756E-01 6.878878E-07 2.582850E-07 + 9 24 3.270083E-01 1.023488E-07 3.346890E-08 + 9 25 9.756018E-01 3.739322E-09 3.648090E-09 + 9 26 8.554651E-01 9.006010E-11 7.704328E-11 + 9 27 1.507747E-02 3.549456E-10 5.351681E-12 + 9 28 2.144034E+01 2.433600E-12 5.217722E-11 + 9 29 5.061770E-01 1.656490E-11 8.384771E-12 + 9 30 3.986646E+04 1.600000E-15 6.378634E-11 + 9 31 1.077752E+00 2.162250E-11 2.330369E-11 + 9 32 2.203884E-01 1.713960E-11 3.777370E-12 + 9 33 3.313386E+02 9.000000E-14 2.982047E-11 + 9 34 1.543586E+00 9.241600E-12 1.426521E-11 + 9 35 7.307437E-03 1.459240E-11 1.066330E-13 + 9 36 1.582627E+00 6.150400E-12 9.733790E-12 + 9 37 2.541413E+01 3.481000E-13 8.846657E-12 + 9 38 1.069486E+00 4.900000E-13 5.240482E-13 + 9 39 2.569174E+00 1.166400E-12 2.996684E-12 + 9 40 1.164706E+01 7.396000E-13 8.614166E-12 + 9 41 2.673715E+01 2.401000E-13 6.419591E-12 + 9 42 1.669231E+01 6.760000E-14 1.128400E-12 + 9 43 7.774190E+00 5.290000E-14 4.112546E-13 + 9 44 3.315904E+01 1.089000E-13 3.611020E-12 + 9 45 3.073361E+01 1.936000E-13 5.950028E-12 + 9 46 2.118885E+01 2.500000E-13 5.297212E-12 + 10 0 1.517061E-01 1.839089E-04 2.790009E-05 + 10 1 1.594312E-01 3.082219E-03 4.914020E-04 + 10 2 1.678211E-01 2.002504E-02 3.360625E-03 + 10 3 1.765247E-01 6.027314E-02 1.063970E-02 + 10 4 1.855207E-01 7.487999E-02 1.389179E-02 + 10 5 1.960942E-01 1.604220E-02 3.145783E-03 + 10 6 2.003536E-01 1.916746E-02 3.840270E-03 + 10 7 2.121710E-01 6.320148E-02 1.340952E-02 + 10 8 2.375878E-01 6.408968E-04 1.522693E-04 + 10 9 2.327582E-01 6.205430E-02 1.444364E-02 + 10 10 2.536370E-01 8.628502E-03 2.188507E-03 + 10 11 2.560295E-01 6.850258E-02 1.753869E-02 + 10 12 3.004454E-01 4.201010E-03 1.262174E-03 + 10 13 2.903375E-01 1.018002E-01 2.955641E-02 + 10 14 3.003614E-01 1.740901E-02 5.228995E-03 + 10 15 3.303980E-01 5.465003E-02 1.805626E-02 + 10 16 3.498683E-01 1.804393E-01 6.312998E-02 + 10 17 3.725153E-01 1.507964E-01 5.617396E-02 + 10 18 3.934165E-01 6.672111E-02 2.624919E-02 + 10 19 4.058808E-01 2.067236E-02 8.390516E-03 + 10 20 4.066730E-01 5.258498E-03 2.138489E-03 + 10 21 4.055264E-01 1.134881E-03 4.602244E-04 + 10 22 4.153608E-01 2.007747E-04 8.339395E-05 + 10 23 4.247237E-01 2.978474E-05 1.265029E-05 + 10 24 3.925375E-01 4.335890E-06 1.701999E-06 + 10 25 3.796202E-01 6.128385E-07 2.326458E-07 + 10 26 5.672296E-01 4.505855E-08 2.555854E-08 + 10 27 3.636721E-01 4.156381E-09 1.511560E-09 + 10 28 8.061162E-02 1.547636E-09 1.247574E-10 + 10 29 8.219240E+01 1.322500E-12 1.086994E-10 + 10 30 1.104012E-01 5.664400E-12 6.253566E-13 + 10 31 4.737687E+00 8.584900E-12 4.067257E-11 + 10 32 6.448622E+00 6.400900E-12 4.127698E-11 + 10 33 3.032518E-02 1.823290E-11 5.529161E-13 + 10 34 4.985478E+00 3.763600E-12 1.876334E-11 + 10 35 9.111944E+00 2.924100E-12 2.664424E-11 + 10 36 3.711844E-01 1.451610E-11 5.388149E-12 + 10 37 1.182247E-01 1.274490E-11 1.506762E-12 + 10 38 2.589838E+00 3.534400E-12 9.153523E-12 + 10 39 3.864113E+03 1.600000E-15 6.182580E-12 + 10 40 2.488148E-01 1.254400E-12 3.121133E-13 + 10 41 9.144221E-01 2.073600E-12 1.896146E-12 + 10 42 3.882488E+00 1.464100E-12 5.684350E-12 + 10 43 8.324122E+00 6.084000E-13 5.064396E-12 + 10 44 9.671931E+00 1.764000E-13 1.706129E-12 + 10 45 1.267081E-01 4.410000E-14 5.587825E-15 + 10 46 4.473356E+01 2.250000E-14 1.006505E-12 + 11 0 1.481249E-01 7.188700E-05 1.064825E-05 + 11 1 1.549492E-01 1.333617E-03 2.066429E-04 + 11 2 1.627643E-01 1.009337E-02 1.642840E-03 + 11 3 1.711407E-01 3.808160E-02 6.517311E-03 + 11 4 1.798310E-01 6.921581E-02 1.244715E-02 + 11 5 1.891651E-01 4.298048E-02 8.130408E-03 + 11 6 1.162087E-01 1.619555E-05 1.882065E-06 + 11 7 2.044891E-01 4.743491E-02 9.699921E-03 + 11 8 2.162814E-01 3.299106E-02 7.135351E-03 + 11 9 2.222713E-01 1.122571E-02 2.495153E-03 + 11 10 2.371455E-01 5.723483E-02 1.357298E-02 + 11 11 2.270362E-01 1.998783E-03 4.537960E-04 + 11 12 2.626179E-01 6.948966E-02 1.824923E-02 + 11 13 2.550815E-01 6.258213E-03 1.596354E-03 + 11 14 2.983277E-01 7.319538E-02 2.183621E-02 + 11 15 3.118765E-01 6.314419E-02 1.969319E-02 + 11 16 3.314927E-01 6.597598E-03 2.187056E-03 + 11 17 3.521000E-01 1.292293E-01 4.550163E-02 + 11 18 3.740026E-01 1.725561E-01 6.453642E-02 + 11 19 3.932831E-01 1.054835E-01 4.148488E-02 + 11 20 4.048282E-01 4.292356E-02 1.737667E-02 + 11 21 4.071504E-01 1.379050E-02 5.614806E-03 + 11 22 4.075921E-01 3.667430E-03 1.494815E-03 + 11 23 4.135526E-01 8.049448E-04 3.328870E-04 + 11 24 4.171279E-01 1.507240E-04 6.287118E-05 + 11 25 4.017984E-01 2.609350E-05 1.048433E-05 + 11 26 3.990966E-01 4.092448E-06 1.633282E-06 + 11 27 4.565748E-01 4.655196E-07 2.125446E-07 + 11 28 3.679379E-01 5.714490E-08 2.102577E-08 + 11 29 2.596640E-01 9.932116E-09 2.579013E-09 + 11 30 2.193142E+00 2.102500E-10 4.611080E-10 + 11 31 1.138824E-01 2.218410E-11 2.526378E-12 + 11 32 3.356811E-01 3.636090E-11 1.220567E-11 + 11 33 5.173436E+02 1.024000E-13 5.297599E-11 + 11 34 9.958824E-01 9.922500E-12 9.881643E-12 + 11 35 7.924052E-01 7.728400E-12 6.124024E-12 + 11 36 6.259299E+02 4.840000E-14 3.029500E-11 + 11 37 2.336404E+00 8.761600E-12 2.047063E-11 + 11 38 1.017770E-01 1.489960E-11 1.516437E-12 + 11 39 3.989559E-01 8.643600E-12 3.448416E-12 + 11 40 7.272984E+00 1.368900E-12 9.955987E-12 + 11 41 3.052706E+01 2.116000E-13 6.459526E-12 + 11 42 3.597299E-01 2.044900E-12 7.356116E-13 + 11 43 2.599264E-01 2.856100E-12 7.423758E-13 + 11 44 1.740984E+00 2.160900E-12 3.762092E-12 + 11 45 4.277945E+00 1.102500E-12 4.716434E-12 + 11 46 7.550224E+00 3.969000E-13 2.996684E-12 + 12 0 1.455490E-01 2.990362E-05 4.352442E-06 + 12 1 1.512704E-01 5.935027E-04 8.977938E-05 + 12 2 1.583343E-01 5.032088E-03 7.967521E-04 + 12 3 1.662720E-01 2.249751E-02 3.740705E-03 + 12 4 1.746674E-01 5.333566E-02 9.316002E-03 + 12 5 1.835000E-01 5.649052E-02 1.036601E-02 + 12 6 1.944995E-01 1.051586E-02 2.045330E-03 + 12 7 1.967032E-01 1.487156E-02 2.925283E-03 + 12 8 2.085561E-01 5.293538E-02 1.104000E-02 + 12 9 2.234610E-01 4.068383E-03 9.091250E-04 + 12 10 2.278854E-01 3.925491E-02 8.945622E-03 + 12 11 2.432085E-01 2.548385E-02 6.197890E-03 + 12 12 2.470908E-01 2.721617E-02 6.724866E-03 + 12 13 2.717823E-01 3.713702E-02 1.009319E-02 + 12 14 2.761480E-01 4.087275E-02 1.128693E-02 + 12 15 3.096641E-01 2.354795E-02 7.291956E-03 + 12 16 3.196382E-01 9.860720E-02 3.151863E-02 + 12 17 3.470334E-01 8.130715E-03 2.821630E-03 + 12 18 3.517595E-01 5.441995E-02 1.914274E-02 + 12 19 3.749157E-01 1.559451E-01 5.846627E-02 + 12 20 3.932687E-01 1.424038E-01 5.600298E-02 + 12 21 4.042290E-01 7.886610E-02 3.187996E-02 + 12 22 4.074827E-01 3.281311E-02 1.337077E-02 + 12 23 4.086194E-01 1.100037E-02 4.494964E-03 + 12 24 4.122368E-01 3.033827E-03 1.250655E-03 + 12 25 4.136926E-01 7.136255E-04 2.952216E-04 + 12 26 4.061793E-01 1.501113E-04 6.097208E-05 + 12 27 4.046402E-01 2.799119E-05 1.132636E-05 + 12 28 4.217517E-01 4.297827E-06 1.812616E-06 + 12 29 3.869854E-01 6.359903E-07 2.461190E-07 + 12 30 3.558316E-01 9.496259E-08 3.379069E-08 + 12 31 6.255971E-01 6.855840E-09 4.288993E-09 + 12 32 2.421419E-01 9.235521E-10 2.236307E-10 + 12 33 4.336936E-02 1.907161E-10 8.271235E-12 + 12 34 3.576208E+03 1.690000E-14 6.043792E-11 + 12 35 1.906389E+01 8.464000E-13 1.613567E-11 + 12 36 4.033752E-02 8.179600E-12 3.299448E-13 + 12 37 2.267401E+01 9.409000E-13 2.133398E-11 + 12 38 9.906393E+00 2.788900E-12 2.762794E-11 + 12 39 8.427314E-01 1.128960E-11 9.514100E-12 + 12 40 6.599823E-05 1.149210E-11 7.584582E-16 + 12 41 1.131073E+00 4.796100E-12 5.424741E-12 + 12 42 2.956933E+01 3.136000E-13 9.272941E-12 + 12 43 8.823269E+00 6.400000E-13 5.646892E-12 + 12 44 4.012558E-01 2.528100E-12 1.014415E-12 + 12 45 4.306607E-02 3.312400E-12 1.426521E-13 + 12 46 6.533819E-01 2.722500E-12 1.778832E-12 + 13 0 1.439149E-01 1.333798E-05 1.919534E-06 + 13 1 1.484001E-01 2.754202E-04 4.087239E-05 + 13 2 1.545835E-01 2.533982E-03 3.917117E-04 + 13 3 1.619649E-01 1.287316E-02 2.085001E-03 + 13 4 1.700214E-01 3.707602E-02 6.303716E-03 + 13 5 1.785038E-01 5.505006E-02 9.826645E-03 + 13 6 1.879224E-01 2.812288E-02 5.284921E-03 + 13 7 1.734442E-01 3.455457E-04 5.993290E-05 + 13 8 2.017809E-01 3.858488E-02 7.785693E-03 + 13 9 2.132548E-01 2.951076E-02 6.293313E-03 + 13 10 2.176025E-01 4.516486E-03 9.827989E-04 + 13 11 2.328893E-01 4.909210E-02 1.143302E-02 + 13 12 2.703703E-01 9.759170E-04 2.638590E-04 + 13 13 2.554041E-01 5.267826E-02 1.345424E-02 + 13 14 2.994420E-01 3.715216E-03 1.112492E-03 + 13 15 2.872575E-01 6.928545E-02 1.990277E-02 + 13 16 2.097315E-01 1.531169E-04 3.211343E-05 + 13 17 3.264144E-01 8.203608E-02 2.677776E-02 + 13 18 3.483983E-01 5.722968E-02 1.993872E-02 + 13 19 3.206261E-01 2.735478E-03 8.770658E-04 + 13 20 3.741526E-01 9.135426E-02 3.418043E-02 + 13 21 3.931335E-01 1.495461E-01 5.879159E-02 + 13 22 4.038815E-01 1.206789E-01 4.873995E-02 + 13 23 4.076629E-01 6.766405E-02 2.758412E-02 + 13 24 4.090714E-01 2.943561E-02 1.204127E-02 + 13 25 4.113211E-01 1.038552E-02 4.271785E-03 + 13 26 4.118640E-01 3.094915E-03 1.274684E-03 + 13 27 4.077609E-01 8.074975E-04 3.292659E-04 + 13 28 4.059568E-01 1.850373E-04 7.511713E-05 + 13 29 4.099485E-01 3.647556E-05 1.495310E-05 + 13 30 3.956527E-01 6.571635E-06 2.600085E-06 + 13 31 3.863963E-01 1.086202E-06 4.197043E-07 + 13 32 4.419336E-01 1.333710E-07 5.894114E-08 + 13 33 3.341727E-01 1.834670E-08 6.130968E-09 + 13 34 2.936663E-01 2.351280E-09 6.904917E-10 + 13 35 2.236467E+00 7.744000E-11 1.731920E-10 + 13 36 4.822804E-01 1.568160E-11 7.562928E-12 + 13 37 3.063287E-01 8.702500E-12 2.665826E-12 + 13 38 5.164445E+00 2.044900E-12 1.056077E-11 + 13 39 1.619885E+02 1.600000E-13 2.591816E-11 + 13 40 3.308753E+00 5.712100E-12 1.889993E-11 + 13 41 3.534175E-01 1.004890E-11 3.551458E-12 + 13 42 7.528711E-02 7.344100E-12 5.529161E-13 + 13 43 2.713141E+00 2.250000E-12 6.104567E-12 + 13 44 3.900704E+02 2.250000E-14 8.776585E-12 + 13 45 6.990846E+00 8.649000E-13 6.046383E-12 + 13 46 8.427314E-01 2.433600E-12 2.050871E-12 + 14 0 1.430459E-01 6.382596E-06 9.130039E-07 + 14 1 1.462698E-01 1.343543E-04 1.965197E-05 + 14 2 1.515204E-01 1.307701E-03 1.981434E-04 + 14 3 1.582550E-01 7.307735E-03 1.156485E-03 + 14 4 1.659055E-01 2.434492E-02 4.038957E-03 + 14 5 1.740776E-01 4.572119E-02 7.959033E-03 + 14 6 1.829009E-01 3.864104E-02 7.067479E-03 + 14 7 1.958640E-01 4.056592E-03 7.945404E-04 + 14 8 1.950984E-01 1.566213E-02 3.055658E-03 + 14 9 2.066843E-01 4.168595E-02 8.615832E-03 + 14 10 2.210270E-01 3.528510E-03 7.798960E-04 + 14 11 2.251573E-01 2.802148E-02 6.309242E-03 + 14 12 2.392477E-01 2.680528E-02 6.413102E-03 + 14 13 2.407543E-01 1.097276E-02 2.641739E-03 + 14 14 2.648965E-01 4.328382E-02 1.146573E-02 + 14 15 2.607761E-01 8.828153E-03 2.302171E-03 + 14 16 2.985189E-01 5.111412E-02 1.525853E-02 + 14 17 3.096522E-01 3.105487E-02 9.616207E-03 + 14 18 3.314445E-01 2.357750E-02 7.814631E-03 + 14 19 3.518074E-01 9.320053E-02 3.278864E-02 + 14 20 3.845135E-01 2.077106E-02 7.986755E-03 + 14 21 3.631030E-01 1.652657E-02 6.000846E-03 + 14 22 3.920881E-01 9.974698E-02 3.910960E-02 + 14 23 4.035560E-01 1.376856E-01 5.556383E-02 + 14 24 4.076980E-01 1.119811E-01 4.565445E-02 + 14 25 4.091636E-01 6.611068E-02 2.705008E-02 + 14 26 4.105890E-01 3.070478E-02 1.260704E-02 + 14 27 4.106648E-01 1.181973E-02 4.853948E-03 + 14 28 4.079840E-01 3.910868E-03 1.595571E-03 + 14 29 4.058413E-01 1.126646E-03 4.572396E-04 + 14 30 4.055137E-01 2.825206E-04 1.145660E-04 + 14 31 3.985080E-01 6.330462E-05 2.522740E-05 + 14 32 3.934525E-01 1.268442E-05 4.990719E-06 + 14 33 4.042455E-01 2.139082E-06 8.647141E-07 + 14 34 3.725298E-01 3.401572E-07 1.267187E-07 + 14 35 3.692478E-01 4.704995E-08 1.737309E-08 + 14 36 5.272753E-01 4.427572E-09 2.334549E-09 + 14 37 1.293863E-01 5.943844E-10 7.690520E-11 + 14 38 6.367489E-01 5.535360E-11 3.524634E-11 + 14 39 4.827498E+02 1.690000E-14 8.158472E-12 + 14 40 2.592007E+01 7.056000E-13 1.828920E-11 + 14 41 1.213434E+01 1.876900E-12 2.277494E-11 + 14 42 1.530595E+00 6.200100E-12 9.489845E-12 + 14 43 6.853890E-02 7.236100E-12 4.959543E-13 + 14 44 4.486201E-01 4.202500E-12 1.885326E-12 + 14 45 6.549733E+00 1.020100E-12 6.681383E-12 + 14 46 5.127178E+03 1.600000E-15 8.203484E-12 + 15 0 1.426914E-01 3.259722E-06 4.651342E-07 + 15 1 1.447555E-01 6.907172E-05 9.998513E-06 + 15 2 1.491067E-01 6.976777E-04 1.040284E-04 + 15 3 1.551512E-01 4.181271E-03 6.487293E-04 + 15 4 1.623350E-01 1.554085E-02 2.522823E-03 + 15 5 1.701998E-01 3.462565E-02 5.893280E-03 + 15 6 1.786346E-01 4.006025E-02 7.156148E-03 + 15 7 1.886035E-01 1.368801E-02 2.581607E-03 + 15 8 1.855567E-01 2.510123E-03 4.657702E-04 + 15 9 2.009846E-01 3.368347E-02 6.769860E-03 + 15 10 2.123664E-01 1.930804E-02 4.100378E-03 + 15 11 2.168294E-01 4.725414E-03 1.024609E-03 + 15 12 2.311112E-01 3.818252E-02 8.824408E-03 + 15 13 2.591846E-01 1.636337E-03 4.241133E-04 + 15 14 2.522135E-01 3.710570E-02 9.358558E-03 + 15 15 2.832954E-01 9.179148E-03 2.600410E-03 + 15 16 2.813528E-01 4.304754E-02 1.211155E-02 + 15 17 3.178146E-01 7.153328E-03 2.273432E-03 + 15 18 3.211222E-01 6.726872E-02 2.160148E-02 + 15 19 3.544790E-01 2.549400E-03 9.037088E-04 + 15 20 3.530719E-01 5.404523E-02 1.908185E-02 + 15 21 3.778411E-01 7.541412E-02 2.849455E-02 + 15 22 4.180974E-01 8.147212E-03 3.406328E-03 + 15 23 3.846774E-01 2.046768E-02 7.873453E-03 + 15 24 4.027031E-01 9.124962E-02 3.674650E-02 + 15 25 4.075061E-01 1.287265E-01 5.245682E-02 + 15 26 4.089701E-01 1.124403E-01 4.598471E-02 + 15 27 4.098765E-01 7.234278E-02 2.965161E-02 + 15 28 4.096435E-01 3.723871E-02 1.525460E-02 + 15 29 4.075300E-01 1.608880E-02 6.556667E-03 + 15 30 4.051942E-01 5.972767E-03 2.420131E-03 + 15 31 4.033164E-01 1.926025E-03 7.767974E-04 + 15 32 3.987965E-01 5.484435E-04 2.187174E-04 + 15 33 3.946028E-01 1.384355E-04 5.462701E-05 + 15 34 3.944635E-01 3.044700E-05 1.201023E-05 + 15 35 3.833854E-01 6.009558E-06 2.303977E-06 + 15 36 3.803739E-01 1.034513E-06 3.935016E-07 + 15 37 3.995501E-01 1.471413E-07 5.879032E-08 + 15 38 3.203335E-01 2.001659E-08 6.411984E-09 + 15 39 4.346289E-01 2.034912E-09 8.844317E-10 + 15 40 5.665915E-01 1.354896E-10 7.676726E-11 + 15 41 1.118339E-01 1.936000E-11 2.165104E-12 + 15 42 1.707920E+01 1.368900E-12 2.337972E-11 + 15 43 5.080403E+00 2.402500E-12 1.220567E-11 + 15 44 6.218445E-01 5.290000E-12 3.289557E-12 + 15 45 2.092853E-03 4.622500E-12 9.674212E-15 + 15 46 1.013180E+00 2.371600E-12 2.402858E-12 + 16 0 1.426023E-01 1.760796E-06 2.510937E-07 + 16 1 1.437109E-01 3.733467E-05 5.365397E-06 + 16 2 1.472662E-01 3.860820E-04 5.685684E-05 + 16 3 1.526312E-01 2.433412E-03 3.714148E-04 + 16 4 1.593168E-01 9.817051E-03 1.564021E-03 + 16 5 1.668647E-01 2.482673E-02 4.142706E-03 + 16 6 1.749833E-01 3.560091E-02 6.229566E-03 + 16 7 1.840978E-01 2.080362E-02 3.829899E-03 + 16 8 2.279905E-01 1.222800E-04 2.787869E-05 + 16 9 1.957554E-01 1.910428E-02 3.739766E-03 + 16 10 2.068979E-01 2.853143E-02 5.903093E-03 + 16 11 2.282926E-01 4.640694E-04 1.059436E-04 + 16 12 2.249010E-01 2.513416E-02 5.652699E-03 + 16 13 2.389770E-01 1.731042E-02 4.136793E-03 + 16 14 2.403333E-01 9.444621E-03 2.269857E-03 + 16 15 2.637790E-01 3.287265E-02 8.671116E-03 + 16 16 2.540028E-01 4.316536E-03 1.096412E-03 + 16 17 2.957287E-01 4.301450E-02 1.272062E-02 + 16 18 3.035948E-01 1.104945E-02 3.354554E-03 + 16 19 3.295961E-01 3.632244E-02 1.197173E-02 + 16 20 3.508345E-01 4.862440E-02 1.705912E-02 + 16 21 2.861122E-01 6.750654E-04 1.931445E-04 + 16 22 3.753866E-01 5.907996E-02 2.217782E-02 + 16 23 3.970937E-01 6.248894E-02 2.481396E-02 + 16 24 4.215742E-01 8.284103E-03 3.492365E-03 + 16 25 3.967394E-01 1.240158E-02 4.920195E-03 + 16 26 4.066679E-01 7.184202E-02 2.921584E-02 + 16 27 4.083914E-01 1.178342E-01 4.812247E-02 + 16 28 4.090256E-01 1.175102E-01 4.806467E-02 + 16 29 4.085843E-01 8.649395E-02 3.534007E-02 + 16 30 4.066601E-01 5.116883E-02 2.080832E-02 + 16 31 4.042144E-01 2.538159E-02 1.025960E-02 + 16 32 4.017318E-01 1.079920E-02 4.338382E-03 + 16 33 3.980023E-01 4.011487E-03 1.596581E-03 + 16 34 3.940667E-01 1.311828E-03 5.169478E-04 + 16 35 3.911571E-01 3.767827E-04 1.473812E-04 + 16 36 3.852167E-01 9.585252E-05 3.692399E-05 + 16 37 3.811461E-01 2.138341E-05 8.150203E-06 + 16 38 3.805931E-01 4.112743E-06 1.565282E-06 + 16 39 3.630682E-01 6.959063E-07 2.526615E-07 + 16 40 3.785042E-01 9.690146E-08 3.667761E-08 + 16 41 3.711811E-01 1.105652E-08 4.103973E-09 + 16 42 2.486750E-01 1.126945E-09 2.802430E-10 + 16 43 1.122663E+00 7.123360E-11 7.997136E-11 + 16 44 6.539768E+00 9.604000E-13 6.280793E-12 + 16 45 1.696563E+00 4.243600E-12 7.199533E-12 + 16 46 2.470845E-01 3.459600E-12 8.548134E-13 + 17 0 1.425850E-01 9.942483E-07 1.417648E-07 + 17 1 1.430000E-01 2.106590E-05 3.012424E-06 + 17 2 1.459034E-01 2.210711E-04 3.225503E-05 + 17 3 1.506468E-01 1.443916E-03 2.175212E-04 + 17 4 1.568433E-01 6.189534E-03 9.707866E-04 + 17 5 1.640676E-01 1.719845E-02 2.821708E-03 + 17 6 1.719121E-01 2.873031E-02 4.939088E-03 + 17 7 1.805828E-01 2.305308E-02 4.162990E-03 + 17 8 1.937387E-01 2.775819E-03 5.377836E-04 + 17 9 1.905596E-01 7.936868E-03 1.512446E-03 + 17 10 2.024229E-01 2.690467E-02 5.446120E-03 + 17 11 2.144565E-01 6.630307E-03 1.421913E-03 + 17 12 2.193023E-01 9.337471E-03 2.047729E-03 + 17 13 2.321917E-01 2.572875E-02 5.974003E-03 + 17 14 7.234092E+00 8.775814E-08 6.348505E-07 + 17 15 2.536789E-01 2.972037E-02 7.539431E-03 + 17 16 2.911493E-01 3.658338E-03 1.065123E-03 + 17 17 2.823673E-01 3.315314E-02 9.361365E-03 + 17 18 3.194096E-01 4.510913E-03 1.440829E-03 + 17 19 3.207245E-01 4.682220E-02 1.501703E-02 + 17 20 3.814734E-01 2.378662E-04 9.073961E-05 + 17 21 3.535175E-01 4.691480E-02 1.658520E-02 + 17 22 3.806309E-01 3.479954E-02 1.324578E-02 + 17 23 3.123178E-01 1.013023E-03 3.163850E-04 + 17 24 3.922200E-01 4.635524E-02 1.818145E-02 + 17 25 4.060300E-01 5.991682E-02 2.432803E-02 + 17 26 4.132443E-01 1.827762E-02 7.553121E-03 + 17 27 3.938417E-01 1.523502E-03 6.000188E-04 + 17 28 4.066195E-01 4.088935E-02 1.662640E-02 + 17 29 4.077320E-01 9.456024E-02 3.855524E-02 + 17 30 4.073023E-01 1.184284E-01 4.823617E-02 + 17 31 4.054396E-01 1.060238E-01 4.298627E-02 + 17 32 4.029121E-01 7.513243E-02 3.027177E-02 + 17 33 4.001608E-01 4.425676E-02 1.770982E-02 + 17 34 3.966685E-01 2.231221E-02 8.850551E-03 + 17 35 3.928310E-01 9.786397E-03 3.844400E-03 + 17 36 3.891909E-01 3.758943E-03 1.462946E-03 + 17 37 3.845495E-01 1.271939E-03 4.891237E-04 + 17 38 3.801831E-01 3.782811E-04 1.438161E-04 + 17 39 3.764573E-01 9.817441E-05 3.695847E-05 + 17 40 3.695324E-01 2.218043E-05 8.196387E-06 + 17 41 3.679262E-01 4.261913E-06 1.568069E-06 + 17 42 3.618174E-01 6.871415E-07 2.486197E-07 + 17 43 3.456193E-01 9.138529E-08 3.158452E-08 + 17 44 3.967801E-01 9.289104E-09 3.685732E-09 + 17 45 2.197019E-01 6.990736E-10 1.535878E-10 + 17 46 7.338266E-01 5.372890E-11 3.942769E-11 + 18 0 1.425326E-01 5.777672E-07 8.235067E-08 + 18 1 1.425142E-01 1.224419E-05 1.744971E-06 + 18 2 1.449217E-01 1.296991E-04 1.879622E-05 + 18 3 1.491365E-01 8.683300E-04 1.294997E-04 + 18 4 1.548910E-01 3.889821E-03 6.024981E-04 + 18 5 1.618021E-01 1.158243E-02 1.874061E-03 + 18 6 1.694102E-01 2.158996E-02 3.657559E-03 + 18 7 1.777798E-01 2.128237E-02 3.783577E-03 + 18 8 1.883449E-01 5.697265E-03 1.073051E-03 + 18 9 1.842796E-01 2.263269E-03 4.170743E-04 + 18 10 1.987007E-01 1.985734E-02 3.945669E-03 + 18 11 2.098195E-01 1.200805E-02 2.519522E-03 + 18 12 2.123759E-01 1.532483E-03 3.254624E-04 + 18 13 2.274671E-01 2.188956E-02 4.979155E-03 + 18 14 2.449686E-01 4.166295E-03 1.020611E-03 + 18 15 2.457885E-01 1.452574E-02 3.570260E-03 + 18 16 2.696197E-01 1.522346E-02 4.104544E-03 + 18 17 2.679201E-01 9.807521E-03 2.627632E-03 + 18 18 3.005371E-01 2.240922E-02 6.734801E-03 + 18 19 3.095522E-01 1.507750E-02 4.667272E-03 + 18 20 3.306643E-01 1.691027E-02 5.591621E-03 + 18 21 3.517878E-01 3.651450E-02 1.284535E-02 + 18 22 1.647977E-01 6.221108E-05 1.025225E-05 + 18 23 3.756858E-01 3.815481E-02 1.433422E-02 + 18 24 3.990627E-01 3.431075E-02 1.369214E-02 + 18 25 4.793508E-01 5.227511E-04 2.505811E-04 + 18 26 4.010793E-01 2.287667E-02 9.175357E-03 + 18 27 4.081861E-01 5.483308E-02 2.238210E-02 + 18 28 4.102337E-01 3.877108E-02 1.590520E-02 + 18 29 4.153239E-01 4.978342E-03 2.067625E-03 + 18 30 4.027761E-01 7.525509E-03 3.031095E-03 + 18 31 4.053014E-01 4.985837E-02 2.020767E-02 + 18 32 4.037494E-01 9.615107E-02 3.882093E-02 + 18 33 4.012060E-01 1.161910E-01 4.661651E-02 + 18 34 3.983364E-01 1.056435E-01 4.208166E-02 + 18 35 3.949083E-01 7.803729E-02 3.081757E-02 + 18 36 3.911120E-01 4.869502E-02 1.904521E-02 + 18 37 3.872675E-01 2.619472E-02 1.014436E-02 + 18 38 3.829835E-01 1.229717E-02 4.709612E-03 + 18 39 3.786231E-01 5.060824E-03 1.916145E-03 + 18 40 3.743603E-01 1.824072E-03 6.828604E-04 + 18 41 3.693729E-01 5.738717E-04 2.119727E-04 + 18 42 3.652100E-01 1.558233E-04 5.690823E-05 + 18 43 3.603491E-01 3.602460E-05 1.298143E-05 + 18 44 3.544620E-01 6.948232E-06 2.462885E-06 + 18 45 3.543714E-01 1.080498E-06 3.828976E-07 + 18 46 3.366336E-01 1.304799E-07 4.392391E-08 + 19 0 1.424131E-01 3.367829E-07 4.796230E-08 + 19 1 1.421830E-01 7.148458E-06 1.016389E-06 + 19 2 1.442392E-01 7.618863E-05 1.098938E-05 + 19 3 1.480381E-01 5.186769E-04 7.678394E-05 + 19 4 1.534272E-01 2.396443E-03 3.676796E-04 + 19 5 1.600603E-01 7.495975E-03 1.199808E-03 + 19 6 1.674728E-01 1.509431E-02 2.527886E-03 + 19 7 1.756194E-01 1.705993E-02 2.996054E-03 + 19 8 1.852869E-01 6.775613E-03 1.255432E-03 + 19 9 1.718985E-01 3.284971E-04 5.646817E-05 + 19 10 1.956889E-01 1.246284E-02 2.438839E-03 + 19 11 2.066090E-01 1.278386E-02 2.641261E-03 + 19 12 5.113919E-01 7.063562E-07 3.612249E-07 + 19 13 2.239156E-01 1.382134E-02 3.094814E-03 + 19 14 2.377134E-01 8.424347E-03 2.002580E-03 + 19 15 2.382288E-01 4.346381E-03 1.035433E-03 + 19 16 2.612662E-01 1.766230E-02 4.614561E-03 + 19 17 2.302009E-01 6.200135E-04 1.427277E-04 + 19 18 2.913550E-01 2.373201E-02 6.914442E-03 + 19 19 2.789010E-01 6.533330E-04 1.822152E-04 + 19 20 3.260564E-01 2.739765E-02 8.933180E-03 + 19 21 3.508425E-01 7.699652E-03 2.701365E-03 + 19 22 3.515345E-01 1.511116E-02 5.312095E-03 + 19 23 3.791102E-01 3.096526E-02 1.173925E-02 + 19 24 4.467444E-01 1.228354E-03 5.487602E-04 + 19 25 3.898293E-01 1.777870E-02 6.930657E-03 + 19 26 4.058866E-01 3.586814E-02 1.455840E-02 + 19 27 4.134313E-01 1.263111E-02 5.222094E-03 + 19 28 3.949351E-01 1.205677E-03 4.761642E-04 + 19 29 4.069929E-01 2.758840E-02 1.122828E-02 + 19 30 4.081879E-01 4.867106E-02 1.986694E-02 + 19 31 4.083127E-01 3.347124E-02 1.366673E-02 + 19 32 4.085202E-01 5.702724E-03 2.329678E-03 + 19 33 3.990301E-01 3.865654E-03 1.542512E-03 + 19 34 3.986116E-01 3.670489E-02 1.463099E-02 + 19 35 3.959947E-01 8.179681E-02 3.239111E-02 + 19 36 3.926544E-01 1.117817E-01 4.389157E-02 + 19 37 3.888897E-01 1.147216E-01 4.461404E-02 + 19 38 3.849979E-01 9.566354E-02 3.683027E-02 + 19 39 3.808348E-01 6.739575E-02 2.566665E-02 + 19 40 3.765384E-01 4.093300E-02 1.541284E-02 + 19 41 3.722229E-01 2.163767E-02 8.054036E-03 + 19 42 3.676842E-01 9.986247E-03 3.671785E-03 + 19 43 3.632647E-01 4.010355E-03 1.456820E-03 + 19 44 3.587442E-01 1.389860E-03 4.986040E-04 + 19 45 3.540903E-01 4.097932E-04 1.451038E-04 + 19 46 3.500525E-01 1.005349E-04 3.519250E-05 + 20 0 1.422701E-01 1.860887E-07 2.647486E-08 + 20 1 1.419656E-01 3.958946E-06 5.620340E-07 + 20 2 1.437929E-01 4.236578E-05 6.091898E-06 + 20 3 1.472986E-01 2.915170E-04 4.294004E-05 + 20 4 1.524180E-01 1.374513E-03 2.095006E-04 + 20 5 1.588337E-01 4.442676E-03 7.056467E-04 + 20 6 1.660985E-01 9.415681E-03 1.563931E-03 + 20 7 1.740860E-01 1.161615E-02 2.022208E-03 + 20 8 1.833369E-01 5.738044E-03 1.051995E-03 + 20 9 2.716008E-02 1.375507E-06 3.735887E-08 + 20 10 1.934263E-01 6.785056E-03 1.312408E-03 + 20 11 2.043840E-01 9.855271E-03 2.014260E-03 + 20 12 2.207888E-01 4.324882E-04 9.548856E-05 + 20 13 2.213373E-01 7.100963E-03 1.571708E-03 + 20 14 2.341332E-01 8.180197E-03 1.915256E-03 + 20 15 2.278099E-01 7.390400E-04 1.683606E-04 + 20 16 2.562530E-01 1.267770E-02 3.248697E-03 + 20 17 3.275934E-01 2.810169E-04 9.205930E-05 + 20 18 2.848717E-01 1.481840E-02 4.221344E-03 + 20 19 3.289824E-01 8.314001E-04 2.735160E-04 + 20 20 3.214464E-01 1.902518E-02 6.115575E-03 + 20 21 3.898334E-01 8.051652E-05 3.138803E-05 + 20 22 3.536551E-01 1.943922E-02 6.874779E-03 + 20 23 3.835952E-01 9.724252E-03 3.730176E-03 + 20 24 3.592285E-01 3.290589E-03 1.182073E-03 + 20 25 3.948489E-01 2.237226E-02 8.833665E-03 + 20 26 4.112430E-01 1.149175E-02 4.725900E-03 + 20 27 3.669680E-01 2.889568E-04 1.060379E-04 + 20 28 4.067552E-01 1.683010E-02 6.845731E-03 + 20 29 4.091340E-01 2.685358E-02 1.098671E-02 + 20 30 4.110580E-01 1.141134E-02 4.690724E-03 + 20 31 3.545936E-01 3.849073E-05 1.364857E-05 + 20 32 4.041619E-01 1.465563E-02 5.923249E-03 + 20 33 4.031201E-01 3.693653E-02 1.488986E-02 + 20 34 4.007762E-01 3.873760E-02 1.552511E-02 + 20 35 3.984087E-01 1.868063E-02 7.442523E-03 + 20 36 3.986963E-01 9.988419E-04 3.982346E-04 + 20 37 3.889535E-01 8.237134E-03 3.203862E-03 + 20 38 3.858658E-01 4.168679E-02 1.608551E-02 + 20 39 3.821283E-01 8.380512E-02 3.202431E-02 + 20 40 3.780692E-01 1.137386E-01 4.300106E-02 + 20 41 3.738489E-01 1.204154E-01 4.501716E-02 + 20 42 3.695874E-01 1.055989E-01 3.902802E-02 + 20 43 3.652252E-01 7.897596E-02 2.884401E-02 + 20 44 3.608845E-01 5.105226E-02 1.842397E-02 + 20 45 3.565503E-01 2.863606E-02 1.021020E-02 + 20 46 3.522296E-01 1.388760E-02 4.891626E-03 + 21 0 1.421585E-01 8.117371E-08 1.153953E-08 + 21 1 1.418414E-01 1.730330E-06 2.454324E-07 + 21 2 1.435445E-01 1.856024E-05 2.664220E-06 + 21 3 1.468780E-01 1.284670E-04 1.886898E-05 + 21 4 1.518350E-01 6.126432E-04 9.302069E-05 + 21 5 1.581146E-01 2.017185E-03 3.189464E-04 + 21 6 1.652880E-01 4.400430E-03 7.273383E-04 + 21 7 1.731802E-01 5.698776E-03 9.869153E-04 + 21 8 1.822340E-01 3.148568E-03 5.737762E-04 + 21 9 2.296359E-01 2.269322E-05 5.211179E-06 + 21 10 1.920144E-01 2.844474E-03 5.461799E-04 + 21 11 2.030745E-01 5.077725E-03 1.031157E-03 + 21 12 2.167509E-01 5.085697E-04 1.102329E-04 + 21 13 2.197467E-01 2.785566E-03 6.121189E-04 + 21 14 2.322543E-01 4.611515E-03 1.071044E-03 + 21 15 2.042757E-01 5.579702E-05 1.139797E-05 + 21 16 2.534487E-01 5.984257E-03 1.516702E-03 + 21 17 2.916833E-01 6.905144E-04 2.014115E-04 + 21 18 2.807935E-01 6.203231E-03 1.741827E-03 + 21 19 3.141591E-01 1.525930E-03 4.793847E-04 + 21 20 3.182580E-01 8.086203E-03 2.573499E-03 + 21 21 3.251923E-01 4.049895E-04 1.316995E-04 + 21 22 3.533941E-01 1.054948E-02 3.728125E-03 + 21 23 3.930625E-01 1.681221E-03 6.608251E-04 + 21 24 3.712191E-01 4.881234E-03 1.812008E-03 + 21 25 3.970684E-01 1.055485E-02 4.190998E-03 + 21 26 4.227498E-01 1.559932E-03 6.594611E-04 + 21 27 3.985541E-01 2.966727E-03 1.182401E-03 + 21 28 4.082144E-01 1.176286E-02 4.801770E-03 + 21 29 4.106013E-01 8.327203E-03 3.419160E-03 + 21 30 4.226701E-01 3.335905E-04 1.409987E-04 + 21 31 4.045815E-01 4.511668E-03 1.825337E-03 + 21 32 4.057372E-01 1.492348E-02 6.055010E-03 + 21 33 4.043641E-01 1.529271E-02 6.183825E-03 + 21 34 4.025955E-01 5.351281E-03 2.154402E-03 + 21 35 3.835409E-01 8.127563E-05 3.117253E-05 + 21 36 3.937342E-01 8.834797E-03 3.478562E-03 + 21 37 3.908644E-01 2.406821E-02 9.407407E-03 + 21 38 3.872742E-01 3.066921E-02 1.187739E-02 + 21 39 3.836089E-01 2.206734E-02 8.465228E-03 + 21 40 3.800111E-01 6.590418E-03 2.504432E-03 + 21 41 3.696429E-01 1.806726E-04 6.678434E-05 + 21 42 3.700873E-01 1.397202E-02 5.170868E-03 + 21 43 3.661616E-01 4.678574E-02 1.713114E-02 + 21 44 3.619776E-01 8.659863E-02 3.134677E-02 + 21 45 3.577797E-01 1.181042E-01 4.225527E-02 + 21 46 3.536152E-01 1.306567E-01 4.620219E-02 + diff --git a/regressioncheck/WEK_Radiation/Flow_N2-N_70degConeHot/Ni_NIST.dat b/regressioncheck/WEK_Radiation/Flow_N2-N_70degConeHot/Ni_NIST.dat new file mode 100755 index 000000000..1551da276 --- /dev/null +++ b/regressioncheck/WEK_Radiation/Flow_N2-N_70degConeHot/Ni_NIST.dat @@ -0,0 +1,1466 @@ +366 +4 0 1 2 0.0 +6 19224 2 2 0.0 +4 19233 3 2 0.0 +2 28839 4 2 0.0 +4 28839 5 2 0.0 +2 83284 6 3 0.0 +4 83318 7 3 0.0 +6 83365 8 3 0.0 +2 86137 9 3 0.0 +4 86221 10 3 0.0 +6 88107 11 2 0.0 +4 88151 12 2 0.0 +2 88171 13 2 0.0 +2 93582 14 3 0.0 +2 94771 15 3 0.0 +4 94793 16 3 0.0 +6 94831 17 3 0.0 +8 94882 18 3 0.0 +2 95475 19 3 0.0 +4 95494 20 3 0.0 +6 95532 21 3 0.0 +4 96751 22 3 0.0 +4 96788 23 3 0.0 +6 96864 24 3 0.0 +2 97770 25 3 0.0 +4 97806 26 3 0.0 +6 99663 27 3 0.0 +4 99664 28 3 0.0 +2 103620 29 4 0.0 +4 103670 30 4 0.0 +6 103740 31 4 0.0 +2 104140 32 4 0.0 +4 104220 33 4 0.0 +4 104620 34 3 0.0 +2 104650 35 3 0.0 +4 104660 36 3 0.0 +6 104680 37 3 0.0 +8 104720 38 3 0.0 +10 104770 39 3 0.0 +6 104810 40 3 0.0 +6 104830 41 3 0.0 +4 104860 42 3 0.0 +8 104880 43 3 0.0 +2 104890 44 3 0.0 +2 104980 45 3 0.0 +4 105000 46 3 0.0 +6 105010 47 3 0.0 +8 105020 48 3 0.0 +4 105120 49 3 0.0 +6 105140 50 3 0.0 +2 106480 51 4 0.0 +2 106760 52 4 0.0 +4 106780 53 4 0.0 +6 106810 54 4 0.0 +8 106870 55 4 0.0 +2 106980 56 4 0.0 +4 107000 57 4 0.0 +6 107040 58 4 0.0 +4 107180 59 4 0.0 +6 107250 60 4 0.0 +4 107450 61 4 0.0 +2 107590 62 4 0.0 +4 107630 63 4 0.0 +2 109810 64 5 0.0 +4 109860 65 5 0.0 +6 109930 66 5 0.0 +2 110040 67 5 0.0 +4 110100 68 5 0.0 +4 110190 69 4 0.0 +6 110210 70 4 0.0 +4 110220 71 4 0.0 +2 110250 72 4 0.0 +8 110250 73 4 0.0 +6 110290 74 4 0.0 +6 110300 75 4 0.0 +10 110300 76 4 0.0 +4 110320 77 4 0.0 +6 110350 78 4 0.0 +8 110350 79 4 0.0 +2 110350 80 4 0.0 +8 110360 81 4 0.0 +6 110390 82 4 0.0 +8 110390 83 4 0.0 +2 110390 84 4 0.0 +4 110400 85 4 0.0 +6 110400 86 4 0.0 +10 110400 87 4 0.0 +8 110400 88 4 0.0 +8 110400 89 4 0.0 +4 110400 90 4 0.0 +6 110400 91 4 0.0 +4 110450 92 4 0.0 +2 110460 93 4 0.0 +4 110460 94 4 0.0 +6 110470 95 4 0.0 +12 110470 96 4 0.0 +10 110470 97 4 0.0 +4 110490 98 4 0.0 +6 110490 99 4 0.0 +8 110500 100 4 0.0 +6 110500 101 4 0.0 +10 110500 102 4 0.0 +8 110500 103 4 0.0 +4 110520 104 3 0.0 +6 110540 105 3 0.0 +6 110710 106 3 0.0 +8 110720 107 3 0.0 +2 111060 108 5 0.0 +2 111140 109 5 0.0 +4 111170 110 5 0.0 +2 111200 111 5 0.0 +6 111200 112 5 0.0 +4 111210 113 5 0.0 +8 111260 114 5 0.0 +2 111270 115 5 0.0 +4 111290 116 5 0.0 +6 111330 117 5 0.0 +4 111500 118 5 0.0 +4 111850 119 5 0.0 +6 111910 120 5 0.0 +2 112290 121 3 0.0 +4 112320 122 3 0.0 +2 112570 123 6 0.0 +4 112610 124 6 0.0 +6 112680 125 6 0.0 +2 112690 126 6 0.0 +4 112740 127 6 0.0 +4 112760 128 5 0.0 +6 112760 129 5 0.0 +8 112800 130 5 0.0 +4 112800 131 5 0.0 +2 112810 132 5 0.0 +6 112810 133 5 0.0 +6 112820 134 5 0.0 +8 112830 135 5 0.0 +6 112830 136 5 0.0 +4 112840 137 5 0.0 +10 112860 138 5 0.0 +8 112870 139 5 0.0 +2 112870 140 5 0.0 +10 112880 141 5 0.0 +8 112880 142 5 0.0 +4 112880 143 5 0.0 +6 112880 144 5 0.0 +8 112890 145 5 0.0 +2 112900 146 5 0.0 +4 112910 147 5 0.0 +6 112910 148 5 0.0 +8 112910 149 5 0.0 +4 112930 150 5 0.0 +6 112950 151 5 0.0 +2 112950 152 5 0.0 +4 112950 153 5 0.0 +12 112950 154 5 0.0 +10 112950 155 5 0.0 +6 112960 156 5 0.0 +4 112960 157 5 0.0 +8 112970 158 5 0.0 +10 112970 159 5 0.0 +8 112970 160 5 0.0 +6 113310 161 6 0.0 +4 113350 162 6 0.0 +8 113370 163 6 0.0 +6 113400 164 6 0.0 +2 114030 165 7 0.0 +4 114070 166 7 0.0 +2 114110 167 7 0.0 +4 114120 168 6 0.0 +6 114130 169 6 0.0 +6 114150 170 7 0.0 +4 114170 171 6 0.0 +6 114170 172 6 0.0 +8 114170 173 6 0.0 +8 114180 174 6 0.0 +6 114180 175 6 0.0 +2 114180 176 6 0.0 +6 114190 177 6 0.0 +4 114200 178 6 0.0 +4 114210 179 7 0.0 +8 114220 180 6 0.0 +6 114220 181 6 0.0 +10 114220 182 6 0.0 +8 114220 183 6 0.0 +6 114220 184 6 0.0 +4 114220 185 6 0.0 +10 114250 186 6 0.0 +2 114250 187 6 0.0 +8 114260 188 6 0.0 +2 114270 189 6 0.0 +4 114270 190 6 0.0 +6 114270 191 6 0.0 +8 114270 192 6 0.0 +4 114280 193 6 0.0 +6 114290 194 6 0.0 +2 114300 195 6 0.0 +4 114300 196 6 0.0 +10 114300 197 6 0.0 +12 114300 198 6 0.0 +4 114300 199 6 0.0 +6 114300 200 6 0.0 +6 114310 201 6 0.0 +8 114310 202 6 0.0 +10 114310 203 6 0.0 +8 114310 204 6 0.0 +8 114550 205 7 0.0 +2 114890 206 8 0.0 +4 114940 207 8 0.0 +4 114950 208 7 0.0 +6 114960 209 7 0.0 +2 114960 210 8 0.0 +4 114990 211 7 0.0 +6 115000 212 7 0.0 +8 115000 213 7 0.0 +2 115010 214 7 0.0 +6 115010 215 7 0.0 +4 115020 216 7 0.0 +6 115020 217 8 0.0 +4 115030 218 8 0.0 +10 115080 219 7 0.0 +8 115090 220 7 0.0 +2 115090 221 7 0.0 +8 115090 222 7 0.0 +4 115090 223 7 0.0 +6 115090 224 7 0.0 +4 115100 225 7 0.0 +6 115110 226 7 0.0 +2 115450 227 9 0.0 +4 115480 228 9 0.0 +2 115480 229 9 0.0 +4 115500 230 9 0.0 +6 115500 231 8 0.0 +2 115530 232 8 0.0 +4 115540 233 8 0.0 +8 115540 234 8 0.0 +6 115540 235 8 0.0 +6 115580 236 9 0.0 +4 115600 237 8 0.0 +10 115610 238 8 0.0 +2 115620 239 8 0.0 +4 115620 240 8 0.0 +6 115620 241 8 0.0 +8 115620 242 8 0.0 +2 115620 243 8 0.0 +4 115630 244 8 0.0 +6 115630 245 8 0.0 +8 115630 246 8 0.0 +6 115630 247 8 0.0 +2 115830 248 10 0.0 +2 115840 249 10 0.0 +4 115840 250 10 0.0 +4 115880 251 10 0.0 +8 115890 252 9 0.0 +2 115890 253 9 0.0 +6 115890 254 9 0.0 +4 115890 255 9 0.0 +4 115890 256 9 0.0 +2 115890 257 9 0.0 +8 115900 258 9 0.0 +6 115900 259 9 0.0 +6 115960 260 10 0.0 +4 115970 261 9 0.0 +4 115990 262 9 0.0 +6 115990 263 9 0.0 +2 115990 264 9 0.0 +6 115990 265 9 0.0 +2 116110 266 11 0.0 +4 116110 267 11 0.0 +6 116120 268 11 0.0 +4 116120 269 11 0.0 +2 116120 270 11 0.0 +2 116160 271 10 0.0 +4 116160 272 10 0.0 +6 116160 273 10 0.0 +8 116160 274 10 0.0 +4 116160 275 10 0.0 +2 116160 276 10 0.0 +6 116160 277 10 0.0 +8 116160 278 10 0.0 +4 116240 279 10 0.0 +6 116240 280 10 0.0 +2 116260 281 10 0.0 +6 116260 282 10 0.0 +4 116260 283 10 0.0 +2 116280 284 3 0.0 +2 116300 285 12 0.0 +4 116300 286 12 0.0 +4 116310 287 12 0.0 +2 116310 288 12 0.0 +6 116310 289 12 0.0 +4 116350 290 11 0.0 +2 116350 291 11 0.0 +8 116360 292 11 0.0 +6 116360 293 11 0.0 +8 116370 294 11 0.0 +4 116370 295 11 0.0 +6 116370 296 11 0.0 +2 116370 297 11 0.0 +6 116440 298 11 0.0 +4 116440 299 11 0.0 +2 116440 300 11 0.0 +6 116440 301 11 0.0 +4 116440 302 11 0.0 +4 116470 303 13 0.0 +2 116470 304 13 0.0 +2 116500 305 12 0.0 +4 116500 306 12 0.0 +4 116580 307 12 0.0 +6 116580 308 12 0.0 +2 116580 309 12 0.0 +6 116620 310 12 0.0 +4 116620 311 12 0.0 +4 119210 312 4 0.0 +6 119210 313 4 0.0 +8 119810 314 3 0.0 +10 120150 315 3 0.0 +8 120150 316 3 0.0 +6 120150 317 3 0.0 +4 120160 318 3 0.0 +4 120310 319 3 0.0 +2 120310 320 3 0.0 +2 120570 321 3 0.0 +6 121200 322 2 0.0 +6 122250 323 4 0.0 +8 122250 324 4 0.0 +12 125690 325 4 0.0 +10 125690 326 4 0.0 +6 131000 327 3 0.0 +4 142080 328 3 0.0 +6 142080 329 3 0.0 +8 142080 330 3 0.0 +2 144360 331 3 0.0 +4 144360 332 3 0.0 +6 144360 333 3 0.0 +6 154440 334 4 0.0 +2 154440 335 4 0.0 +4 154440 336 4 0.0 +2 158320 337 5 0.0 +4 158320 338 5 0.0 +6 158320 339 5 0.0 +4 160240 340 6 0.0 +6 160240 341 6 0.0 +2 160240 342 6 0.0 +2 161330 343 7 0.0 +6 161330 344 7 0.0 +4 161330 345 7 0.0 +6 162000 346 8 0.0 +4 162000 347 8 0.0 +2 162000 348 8 0.0 +6 162440 349 9 0.0 +4 162440 350 9 0.0 +2 162440 351 9 0.0 +6 162770 352 10 0.0 +4 162770 353 10 0.0 +2 162770 354 10 0.0 +2 163000 355 11 0.0 +6 163000 356 11 0.0 +4 163000 357 11 0.0 +4 163160 358 12 0.0 +6 163160 359 12 0.0 +2 163160 360 12 0.0 +2 163300 361 13 0.0 +4 163300 362 13 0.0 +6 163300 363 13 0.0 +2 163400 364 14 0.0 +4 163400 365 14 0.0 +6 163400 366 14 0.0 + +1097 +865.23 1 236 4 6 3740000 0 0 +865.84 1 230 4 4 3740000 0 0 +866.18 1 227 4 2 3730000 0 0 +869.4 1 217 4 6 5560000 0 0 +870.03 1 207 4 4 5550000 0 0 +870.37 1 206 4 2 5540000 0 0 +875.28 1 187 4 2 34000000 0 0 +875.66 1 178 4 4 33900000 0 0 +875.72 1 177 4 6 33900000 0 0 +876.07 1 170 4 6 8810000 0 0 +876.65 1 166 4 4 8790000 0 0 +876.99 1 165 4 2 8780000 0 0 +885.97 1 140 4 2 55800000 0 0 +886.23 1 137 4 4 55800000 0 0 +886.33 1 134 4 6 55800000 0 0 +887.46 1 125 4 6 15100000 0 0 +888.02 1 124 4 4 15100000 0 0 +888.37 1 123 4 2 15100000 0 0 +906.21 1 80 4 2 99900000 0 0 +906.43 1 77 4 4 99900000 0 0 +906.62 1 75 4 6 99800000 0 0 +909.7 1 66 4 6 29300000 0 0 +910.28 1 65 4 4 29200000 0 0 +910.64 1 64 4 2 29200000 0 0 +952.3 1 47 4 6 9190000 0 0 +952.41 1 46 4 4 12500000 0 0 +952.52 1 45 4 2 8820000 0 0 +953.41 1 44 4 2 193000000 0 0 +953.65 1 42 4 4 183000000 0 0 +953.97 1 41 4 6 170000000 0 0 +954.1 1 40 4 6 33000000 0 0 +963.99 1 31 4 6 70700000 0 0 +964.63 1 30 4 4 67600000 0 0 +965.04 1 29 4 2 57600000 0 0 +980.62 2 322 6 6 333000000 0 0 +980.71 3 322 4 6 22900000 0 0 +989.26 2 319 6 4 99500000 0 0 +989.34 3 320 4 2 112000000 0 0 +989.35 3 319 4 4 10900000 0 0 +990.77 2 318 6 4 24900000 0 0 +990.83 2 317 6 6 235000000 0 0 +990.86 3 318 4 4 226000000 0 0 +990.91 3 317 4 6 16500000 0 0 +1000.1 2 313 6 6 37200000 0 0 +1000.1 2 312 6 4 3920000 0 0 +1000.2 3 312 4 4 36200000 0 0 +1000.2 3 313 4 6 2720000 0 0 +1067.6 2 145 6 8 35300000 0 0 +1068.5 2 133 6 6 2340000 0 0 +1068.6 3 133 4 6 32800000 0 0 +1082.7 5 322 4 6 126000000 0 0 +1090.2 4 321 2 2 65500000 0 0 +1090.2 5 321 4 2 131000000 0 0 +1093.2 4 320 2 2 78800000 0 0 +1093.2 5 320 4 2 38500000 0 0 +1093.2 4 319 2 4 19900000 0 0 +1093.3 5 319 4 4 99600000 0 0 +1095.1 4 318 2 4 1150000 0 0 +1095.2 5 317 4 6 1400000 0 0 +1097.2 2 81 6 8 63500000 0 0 +1098.2 2 74 6 6 4230000 0 0 +1098.3 3 74 4 6 59100000 0 0 +1100.4 2 68 6 4 36000000 0 0 +1100.5 3 68 4 4 4000000 0 0 +1101.3 3 67 4 2 39900000 0 0 +1106.5 4 312 2 4 3040000 0 0 +1106.6 5 313 4 6 3520000 0 0 +1106.6 5 312 4 4 739000 0 0 +1134.2 1 13 4 2 158000000 0 0 +1134.4 1 12 4 4 154000000 0 0 +1135 1 11 4 6 150000000 0 0 +1163.9 2 50 6 6 75200000 0 0 +1164 3 50 4 6 1270000 0 0 +1164.2 2 49 6 4 5170000 0 0 +1164.3 3 49 4 4 69400000 0 0 +1167.4 2 43 6 8 129000000 0 0 +1168.3 3 41 4 6 23600000 0 0 +1168.4 2 40 6 6 4240000 0 0 +1168.5 3 40 4 6 124000000 0 0 +1170.7 3 35 4 2 53100000 0 0 +1171.1 2 34 6 4 56000000 0 0 +1171.2 3 34 4 4 2840000 0 0 +1176.5 2 33 6 4 92200000 0 0 +1176.6 3 33 4 4 10200000 0 0 +1177.7 3 32 4 2 102000000 0 0 +1189 5 151 4 6 24800000 0 0 +1189.2 4 150 2 4 20700000 0 0 +1189.2 5 150 4 4 4130000 0 0 +1190.9 4 132 2 2 14600000 0 0 +1190.9 5 132 4 2 7300000 0 0 +1191 4 131 2 4 3650000 0 0 +1191 5 131 4 4 18200000 0 0 +1199.5 1 8 4 6 401000000 0 0 +1200.2 1 7 4 4 399000000 0 0 +1200.7 1 6 4 2 398000000 0 0 +1225 5 95 4 6 44100000 0 0 +1225.4 4 92 2 4 36700000 0 0 +1225.4 5 92 4 4 7340000 0 0 +1228.4 4 72 2 2 27000000 0 0 +1228.4 5 72 4 2 13500000 0 0 +1228.8 4 71 2 4 6760000 0 0 +1228.8 5 71 4 4 33800000 0 0 +1243.2 2 28 6 4 33400000 0 0 +1243.2 2 27 6 6 321000000 0 0 +1243.3 3 28 4 4 309000000 0 0 +1243.3 3 27 4 6 23500000 0 0 +1310.5 5 50 4 6 84200000 0 0 +1310.9 4 49 2 4 66800000 0 0 +1311 5 49 4 4 18900000 0 0 +1316 5 41 4 6 40400 0 0 +1316.3 5 40 4 6 1420000 0 0 +1319 4 35 2 2 56200000 0 0 +1319 5 35 4 2 27600000 0 0 +1319.7 4 34 2 4 20200000 0 0 +1319.7 5 34 4 4 63300000 0 0 +1326.6 4 33 2 4 1790000 0 0 +1326.6 5 33 4 4 8950000 0 0 +1327.9 4 32 2 2 7140000 0 0 +1327.9 5 32 4 2 3570000 0 0 +1411.9 4 28 2 4 42500000 0 0 +1411.9 5 28 4 4 9590000 0 0 +1411.9 5 27 4 6 51000000 0 0 +1492.6 2 10 6 4 313000000 0 0 +1492.8 3 10 4 4 35100000 0 0 +1494.7 3 9 4 2 372000000 0 0 +1742.7 4 10 2 4 23400000 0 0 +1742.7 5 10 4 4 116000000 0 0 +1745.2 4 9 2 2 92200000 0 0 +1745.3 5 9 4 2 44500000 0 0 +3467.5 1 5 4 4 0.00621 0 0 +3467.5 1 5 4 4 1.66E-07 0 0 +3467.5 1 4 4 2 0.00252 0 0 +3467.5 1 4 4 2 1.14E-08 0 0 +3819.4 9 122 2 4 895000 0 0 +3823.1 9 121 2 2 3700000 0 0 +3831.5 10 122 4 4 4670000 0 0 +3835.3 10 121 4 2 1890000 0 0 +3888.7 9 119 2 4 2090000 0 0 +3893.3 10 120 4 6 2500000 0 0 +3901.3 10 119 4 4 414000 0 0 +4012.3 9 108 2 2 575000 0 0 +4025.7 10 108 4 2 1140000 0 0 +4096.2 23 322 4 6 80500 0 0 +4101.1 9 104 2 4 3480000 0 0 +4109.1 24 322 6 6 1230000 0 0 +4111.1 10 105 4 6 3900000 0 0 +4115.1 10 104 4 4 662000 0 0 +4138.8 6 61 2 4 280000 0 0 +4144.6 7 61 4 4 609000 0 0 +4152.7 8 61 6 4 1010000 0 0 +4251.1 23 320 4 2 2590000 0 0 +4251.4 23 319 4 4 224000 0 0 +4265.2 24 319 6 4 2260000 0 0 +4274.5 26 322 4 6 828000 0 0 +4279.3 23 318 4 4 5010000 0 0 +4280.4 23 317 4 6 361000 0 0 +4293.4 24 318 6 4 557000 0 0 +4294.4 24 317 6 6 5210000 0 0 +4357.5 24 314 6 8 5100000 0 0 +4386.8 25 321 2 2 884000 0 0 +4393.6 26 321 4 2 1760000 0 0 +4436.4 25 320 2 2 2990000 0 0 +4436.7 25 319 2 4 751000 0 0 +4443.4 26 320 4 2 1410000 0 0 +4443.7 26 319 4 4 3810000 0 0 +4467.1 25 318 2 4 20400 0 0 +4475.4 26 317 4 6 27600 0 0 +4653.1 9 63 2 4 240000 0 0 +4661.8 9 62 2 2 672000 0 0 +4664.2 25 312 2 4 1510000 0 0 +4671.2 10 63 4 4 749000 0 0 +4672 26 313 4 6 1800000 0 0 +4672 26 312 4 4 302000 0 0 +4679.9 10 62 4 2 269000 0 0 +4916.3 9 51 2 2 808000 0 0 +4936.5 10 51 4 2 1760000 0 0 +5199.3 1 3 4 4 1.9E-05 0 0 +5199.3 1 3 4 4 3.6E-06 0 0 +5201.3 14 132 2 2 1870000 0 0 +5201.7 1 2 4 6 2.45E-07 0 0 +5201.7 1 2 4 6 5.52E-06 0 0 +5203.1 14 131 2 4 1870000 0 0 +5282.7 11 58 6 6 245000 0 0 +5311.9 22 236 4 6 94000 0 0 +5330.1 11 55 6 8 205000 0 0 +5334.9 22 230 4 4 92800 0 0 +5345.5 11 54 6 6 61000 0 0 +5348 22 227 4 2 92100 0 0 +5355.9 11 53 6 4 10100 0 0 +5358.1 12 54 4 6 141000 0 0 +5368.5 12 53 4 4 107000 0 0 +5374.1 13 53 2 4 83400 0 0 +5374.2 12 52 4 2 33300 0 0 +5379.8 13 52 2 2 166000 0 0 +5473.3 22 217 4 6 139000 0 0 +5498.1 22 207 4 4 137000 0 0 +5511.7 22 206 4 2 136000 0 0 +5513.2 15 147 2 4 129000 0 0 +5514.6 15 146 2 2 257000 0 0 +5519.6 16 148 4 6 120000 0 0 +5520.1 16 147 4 4 205000 0 0 +5521.5 16 146 4 2 256000 0 0 +5530.9 17 149 6 8 72600 0 0 +5531.1 17 148 6 6 292000 0 0 +5531.5 17 147 6 4 178000 0 0 +5546.5 18 149 8 8 433000 0 0 +5546.7 18 148 8 6 95900 0 0 +5558.9 15 128 2 4 994000 0 0 +5561.9 18 138 8 10 1420000 0 0 +5565.8 17 130 6 8 1210000 0 0 +5565.8 16 129 4 6 1060000 0 0 +5565.9 16 128 4 4 396000 0 0 +5577.4 17 129 6 6 342000 0 0 +5577.5 17 128 6 4 28100 0 0 +5581.6 18 130 8 8 200000 0 0 +5593.3 18 129 8 6 13500 0 0 +5714.7 22 187 4 2 89400 0 0 +5730.9 22 178 4 4 88700 0 0 +5733.7 22 177 4 6 88500 0 0 +5736 19 147 2 4 447000 0 0 +5737.5 19 146 2 2 894000 0 0 +5741.5 20 148 4 6 749000 0 0 +5742 20 147 4 4 571000 0 0 +5743.6 20 146 4 2 178000 0 0 +5748.6 22 170 4 6 221000 0 0 +5754.1 21 149 6 8 1060000 0 0 +5754.2 21 148 6 6 319000 0 0 +5754.8 21 147 6 4 53100 0 0 +5773.6 22 166 4 4 218000 0 0 +5788.4 22 165 4 2 216000 0 0 +6001.1 14 72 2 2 3640000 0 0 +6010.1 14 71 2 4 3580000 0 0 +6188.8 23 151 4 6 9020 0 0 +6196 23 150 4 4 121000 0 0 +6203.7 22 140 4 2 280000 0 0 +6216.1 22 137 4 4 278000 0 0 +6218.2 24 151 6 6 125000 0 0 +6221.4 22 134 4 6 277000 0 0 +6225.5 24 150 6 4 13300 0 0 +6239.4 24 145 6 8 281000 0 0 +6240.3 23 133 4 6 262000 0 0 +6270.2 24 133 6 6 18500 0 0 +6277.2 22 125 4 6 375000 0 0 +6305.7 22 124 4 4 370000 0 0 +6323.3 22 123 4 2 367000 0 0 +6400.2 15 85 2 4 395000 0 0 +6404.1 15 84 2 2 789000 0 0 +6407 16 86 4 6 368000 0 0 +6409.4 16 85 4 4 630000 0 0 +6413.4 16 84 4 2 786000 0 0 +6421.6 17 89 6 8 223000 0 0 +6422.4 17 86 6 6 897000 0 0 +6424.8 17 85 6 4 547000 0 0 +6442.7 18 89 8 8 1330000 0 0 +6443.5 18 86 8 6 294000 0 0 +6483.5 15 69 2 4 3430000 0 0 +6484.5 18 76 8 10 4900000 0 0 +6485.5 16 70 4 6 3670000 0 0 +6486.6 17 73 6 8 4200000 0 0 +6493 16 69 4 4 1370000 0 0 +6501.3 17 70 6 6 1180000 0 0 +6508.1 18 73 8 8 691000 0 0 +6508.8 17 69 6 4 97000 0 0 +6522.9 18 70 8 6 46600 0 0 +6597.7 25 150 2 4 90800 0 0 +6605 26 151 4 6 109000 0 0 +6608 16 66 4 6 88700 0 0 +6613.2 26 150 4 4 18000 0 0 +6624.4 17 66 6 6 793000 0 0 +6628.8 15 65 2 4 220000 0 0 +6638.8 16 65 4 4 1400000 0 0 +6646.8 18 66 8 6 3490000 0 0 +6648.3 15 64 2 2 2180000 0 0 +6650.1 25 132 2 2 137000 0 0 +6653 25 131 2 4 34200 0 0 +6655.3 17 65 6 4 2740000 0 0 +6658.3 16 64 4 2 2170000 0 0 +6665.9 26 132 4 2 67900 0 0 +6668.8 26 131 4 4 170000 0 0 +6702.3 19 85 2 4 1500000 0 0 +6706.7 19 84 2 2 2990000 0 0 +6708 20 86 4 6 2510000 0 0 +6710.6 20 85 4 4 1910000 0 0 +6715 20 84 4 2 596000 0 0 +6722.8 19 80 2 2 195000 0 0 +6724.5 21 89 6 8 3560000 0 0 +6725.3 21 86 6 6 1070000 0 0 +6728 21 85 6 4 178000 0 0 +6731.1 20 80 4 2 973000 0 0 +6735.2 19 77 2 4 485000 0 0 +6743.5 20 77 4 4 155000 0 0 +6753.9 20 75 4 6 347000 0 0 +6761.1 21 77 6 4 518000 0 0 +6771.5 21 75 6 6 802000 0 0 +6928.6 20 66 4 6 775000 0 0 +6947.1 21 66 6 6 1830000 0 0 +6953.5 19 65 2 4 1030000 0 0 +6962.4 20 65 4 4 467000 0 0 +6975 19 64 2 2 383000 0 0 +6981.1 21 65 6 4 983000 0 0 +6984 20 64 4 2 2040000 0 0 +7308.6 23 95 4 6 40300 0 0 +7321 23 92 4 4 541000 0 0 +7349.6 24 95 6 6 555000 0 0 +7353.4 22 80 4 2 1320000 0 0 +7362.2 24 92 6 4 59100 0 0 +7368.2 22 77 4 4 1310000 0 0 +7380.5 22 75 4 6 1300000 0 0 +7408.2 23 74 4 6 1520000 0 0 +7408.3 24 81 6 8 1630000 0 0 +7425.7 6 22 2 4 5950000 0 0 +7430.8 23 72 4 2 906000 0 0 +7444.3 7 22 4 4 12400000 0 0 +7444.7 23 71 4 4 90100 0 0 +7450.3 24 74 6 6 107000 0 0 +7470.4 8 22 6 4 19300000 0 0 +7487.2 24 71 6 4 797000 0 0 +7509.7 23 68 4 4 230000 0 0 +7548.3 23 67 4 2 2850000 0 0 +7553 24 68 6 4 1790000 0 0 +7589.7 22 66 4 6 701000 0 0 +7630.3 22 65 4 4 690000 0 0 +7656.2 22 64 4 2 683000 0 0 +7705.6 62 321 2 2 693000 0 0 +7729.3 63 321 4 2 1370000 0 0 +7888.4 25 92 2 4 686000 0 0 +7896.1 26 95 4 6 821000 0 0 +7901.2 27 122 6 4 28200000 0 0 +7901.5 28 122 4 4 3280000 0 0 +7910.6 26 92 4 4 136000 0 0 +7917.6 28 121 4 2 31300000 0 0 +8107.9 25 68 2 4 236000 0 0 +8131.4 26 68 4 4 1170000 0 0 +8152.9 25 67 2 2 929000 0 0 +8168.5 27 120 6 6 13200000 0 0 +8168.8 28 120 4 6 939000 0 0 +8176.7 26 67 4 2 460000 0 0 +8187.1 7 21 4 6 8580000 0 0 +8190.3 6 20 2 4 12700000 0 0 +8202.6 6 19 2 2 4950000 0 0 +8203.7 27 119 6 4 1390000 0 0 +8204 28 119 4 4 12500000 0 0 +8213 7 20 4 4 4840000 0 0 +8218.6 8 21 6 6 22300000 0 0 +8225.4 7 19 4 2 26400000 0 0 +8244.7 8 20 6 4 13600000 0 0 +8570.1 9 26 2 4 4920000 0 0 +8596.4 9 25 2 2 20900000 0 0 +8631.6 10 26 4 4 26600000 0 0 +8658.1 27 113 6 4 5460000 0 0 +8658.3 10 25 4 2 10500000 0 0 +8658.5 28 113 4 4 606000 0 0 +8669.3 28 111 4 2 6040000 0 0 +8682.7 8 18 6 8 24600000 0 0 +8685.8 7 17 4 6 18000000 0 0 +8688.5 6 16 2 4 10900000 0 0 +8705.6 6 15 2 2 21000000 0 0 +8714.1 7 16 4 4 12800000 0 0 +8721.2 8 17 6 6 6750000 0 0 +8731.3 7 15 4 2 3760000 0 0 +8749.8 8 16 6 4 1040000 0 0 +9031.4 14 35 2 2 30200000 0 0 +9048.4 27 107 6 8 28000000 0 0 +9052 27 106 6 6 1880000 0 0 +9052.4 28 106 4 6 26000000 0 0 +9063 14 34 2 4 29500000 0 0 +9190 27 105 6 6 24400000 0 0 +9190.4 28 105 4 6 1760000 0 0 +9210.1 27 104 6 4 2700000 0 0 +9210.5 28 104 4 4 23300000 0 0 +9363.8 104 322 4 6 951000 0 0 +9384.7 105 322 6 6 13600000 0 0 +9389.4 9 23 2 4 22400000 0 0 +9395.4 10 24 4 6 26300000 0 0 +9398.4 14 33 2 4 28200 0 0 +9463.3 10 23 4 4 3980000 0 0 +9466.8 14 32 2 2 436000 0 0 +9533.1 106 322 6 6 13100 0 0 +9537.1 107 322 8 6 289000 0 0 +9779.6 15 46 2 4 1180000 0 0 +9789.5 16 47 4 6 1130000 0 0 +9791 15 45 2 2 2990000 0 0 +9801.2 16 46 4 4 2750000 0 0 +9812.7 16 45 4 2 5300000 0 0 +9816.7 17 48 6 8 656000 0 0 +9825.4 17 47 6 6 4950000 0 0 +9837.3 17 46 6 4 4500000 0 0 +9866 18 48 8 8 9620000 0 0 +9874.9 18 47 8 6 2970000 0 0 +9886.1 15 44 2 2 2930000 0 0 +9908.2 16 44 4 2 311000 0 0 +9911.9 15 42 2 4 758000 0 0 +9934.2 16 42 4 4 3640000 0 0 +9949.8 17 43 6 8 1080000 0 0 +9968.5 16 41 4 6 760000 0 0 +9971.2 17 42 6 4 450000 0 0 +9983.2 16 40 4 6 810000 0 0 +10000 18 43 8 8 920000 0 0 +10006 17 41 6 6 2280000 0 0 +10021 17 40 6 6 2260000 0 0 +10057 18 41 8 6 1390000 0 0 +10108 15 36 2 4 27000000 0 0 +10112 16 37 4 6 29300000 0 0 +10115 17 38 6 8 33000000 0 0 +10117 18 39 8 10 38200000 0 0 +10131 16 36 4 4 9890000 0 0 +10150 17 37 6 6 7440000 0 0 +10168 18 38 8 8 3980000 0 0 +10170 17 36 6 4 495000 0 0 +10203 18 37 8 6 281000 0 0 +10214 104 320 4 2 9100000 0 0 +10216 104 319 4 4 848000 0 0 +10241 105 319 6 4 8000000 0 0 +10379 104 318 4 4 20100000 0 0 +10385 104 317 4 6 1470000 0 0 +10401 2 5 6 4 0.000978 0 0 +10401 2 5 6 4 0.0529 0 0 +10401 2 4 6 2 0.0303 0 0 +10405 105 318 6 4 2220000 0 0 +10410 3 5 4 4 0.00175 0 0 +10410 3 5 4 4 0.0226 0 0 +10410 3 4 4 2 0.00109 0 0 +10410 3 4 4 2 0.0452 0 0 +10411 105 317 6 6 20600000 0 0 +10503 19 46 2 4 6170000 0 0 +10510 20 47 4 6 12500000 0 0 +10516 19 45 2 2 18100000 0 0 +10523 20 46 4 4 15400000 0 0 +10537 20 45 4 2 7280000 0 0 +10542 21 48 6 8 23900000 0 0 +10553 21 47 6 6 11500000 0 0 +10566 21 46 6 4 3300000 0 0 +10588 106 318 6 4 2070000 0 0 +10594 106 317 6 6 104000 0 0 +10599 107 317 8 6 1980000 0 0 +10626 19 44 2 2 3390000 0 0 +10647 20 44 4 2 4010000 0 0 +10656 19 42 2 4 5550000 0 0 +10676 111 321 2 2 2260000 0 0 +10677 20 42 4 4 257000 0 0 +10692 113 321 4 2 4490000 0 0 +10716 20 41 4 6 4180000 0 0 +10721 21 42 6 4 2290000 0 0 +10733 20 40 4 6 1030000 0 0 +10761 21 41 6 6 2370000 0 0 +10790 105 314 6 8 21600000 0 0 +10986 106 314 6 8 371000 0 0 +10992 107 314 8 8 10200000 0 0 +11183 16 31 4 6 201000 0 0 +11230 17 31 6 6 2090000 0 0 +11241 15 30 2 4 600000 0 0 +11260 122 322 4 6 2920000 0 0 +11269 16 30 4 4 4130000 0 0 +11295 18 31 8 6 10800000 0 0 +11297 15 29 2 2 6920000 0 0 +11317 17 30 6 4 9020000 0 0 +11326 16 29 4 2 7360000 0 0 +11509 104 312 4 4 109000 0 0 +11509 104 313 4 6 13100 0 0 +11540 105 313 6 6 116000 0 0 +11540 105 312 6 4 13700 0 0 +11569 11 22 6 4 2080000 0 0 +11628 12 22 4 4 1320000 0 0 +11655 13 22 2 4 639000 0 0 +11766 106 312 6 4 11600000 0 0 +11766 106 313 6 6 552000 0 0 +11772 107 313 8 6 11000000 0 0 +11967 23 50 4 6 54900 0 0 +12002 23 49 4 4 5040000 0 0 +12078 24 50 6 6 6120000 0 0 +12089 121 321 2 2 5220000 0 0 +12113 24 49 6 4 753000 0 0 +12127 122 321 4 2 10300000 0 0 +12133 20 31 4 6 2950000 0 0 +12190 21 31 6 6 7110000 0 0 +12207 19 30 2 4 4080000 0 0 +12232 32 122 2 4 55400 0 0 +12235 20 30 4 4 1520000 0 0 +12271 32 121 2 2 219000 0 0 +12274 19 29 2 2 1430000 0 0 +12292 22 44 4 2 13800000 0 0 +12293 21 30 6 4 3760000 0 0 +12299 61 236 4 6 32800 0 0 +12302 20 29 4 2 7410000 0 0 +12332 22 42 4 4 12700000 0 0 +12348 33 122 4 4 290000 0 0 +12385 22 41 4 6 12800000 0 0 +12388 33 121 4 2 127000 0 0 +12423 61 230 4 4 31900 0 0 +12465 23 40 4 6 21600000 0 0 +12473 24 43 6 8 22800000 0 0 +12473 121 320 2 2 10700000 0 0 +12476 121 319 2 4 2670000 0 0 +12494 61 227 4 2 31300 0 0 +12513 122 320 4 2 5210000 0 0 +12516 122 319 4 4 13200000 0 0 +12555 27 63 6 4 164000 0 0 +12556 28 63 4 4 18200 0 0 +12584 24 40 6 6 929000 0 0 +12619 28 62 4 2 179000 0 0 +12692 29 118 2 4 82800 0 0 +12712 23 35 4 2 2450000 0 0 +12720 121 318 2 4 140000 0 0 +12762 122 318 4 4 20600 0 0 +12765 30 118 4 4 163000 0 0 +12771 122 317 4 6 169000 0 0 +12775 23 34 4 4 547000 0 0 +12877 31 118 6 4 238000 0 0 +12901 24 34 6 4 2590000 0 0 +12973 32 119 2 4 854000 0 0 +12980 34 122 4 4 35700 0 0 +13014 33 120 4 6 1020000 0 0 +13023 34 121 4 2 35300 0 0 +13045 35 122 2 4 14100 0 0 +13049 29 116 2 4 91700 0 0 +13055 30 117 4 6 65900 0 0 +13073 29 115 2 2 36500 0 0 +13089 35 121 2 2 47100 0 0 +13104 33 119 4 4 166000 0 0 +13126 30 116 4 4 28800 0 0 +13150 30 115 4 2 179000 0 0 +13173 31 117 6 6 150000 0 0 +13176 27 60 6 6 426000 0 0 +13177 28 60 4 6 30400 0 0 +13200 61 217 4 6 49200 0 0 +13245 31 116 6 4 94700 0 0 +13258 29 110 2 4 25400 0 0 +13268 30 112 4 6 42500 0 0 +13288 31 114 6 8 60500 0 0 +13296 29 109 2 2 50300 0 0 +13299 27 59 6 4 44400 0 0 +13300 28 59 4 4 399000 0 0 +13337 30 110 4 4 31900 0 0 +13345 61 207 4 4 47600 0 0 +13375 30 109 4 2 9880 0 0 +13390 31 112 6 6 17700 0 0 +13426 61 206 4 2 46700 0 0 +13433 9 14 2 2 3440000 0 0 +13452 23 33 4 4 491000 0 0 +13460 31 110 6 4 2910 0 0 +13468 11 21 6 6 536000 0 0 +13538 11 20 6 4 314000 0 0 +13548 12 21 4 6 199000 0 0 +13585 10 14 4 2 6390000 0 0 +13591 24 33 6 4 5360000 0 0 +13592 23 32 4 2 6630000 0 0 +13606 25 49 2 4 11200000 0 0 +13619 12 20 4 4 112000 0 0 +13628 26 50 4 6 13900000 0 0 +13653 12 19 4 2 587000 0 0 +13655 13 20 2 4 284000 0 0 +13672 26 49 4 4 3020000 0 0 +13690 13 19 2 2 108000 0 0 +13717 34 120 4 6 98400 0 0 +13817 34 119 4 4 16000 0 0 +13891 35 119 2 4 79000 0 0 +14094 40 120 6 6 20200 0 0 +14147 32 113 2 4 15300 0 0 +14176 32 111 2 2 61000 0 0 +14199 40 119 6 4 416000 0 0 +14236 43 120 8 6 393000 0 0 +14303 33 113 4 4 74200 0 0 +14317 22 31 4 6 1330000 0 0 +14332 33 111 4 2 29500 0 0 +14459 22 30 4 4 1180000 0 0 +14459 32 108 2 2 65000 0 0 +14459 121 312 2 4 5230000 0 0 +14513 122 313 4 6 6200000 0 0 +14513 122 312 4 4 1040000 0 0 +14527 25 35 2 2 2310000 0 0 +14553 22 29 4 2 1100000 0 0 +14602 26 35 4 2 1140000 0 0 +14609 25 34 2 4 706000 0 0 +14621 33 108 4 2 126000 0 0 +14685 26 34 4 4 1750000 0 0 +14698 61 187 4 2 180000 0 0 +14761 11 18 6 8 996000 0 0 +14805 61 178 4 4 176000 0 0 +14824 61 177 4 6 176000 0 0 +14873 11 17 6 6 280000 0 0 +14923 61 170 4 6 78300 0 0 +14956 11 16 6 4 44600 0 0 +14971 12 17 4 6 667000 0 0 +14978 41 118 6 4 182000 0 0 +15055 12 16 4 4 485000 0 0 +15057 42 118 4 4 119000 0 0 +15093 61 166 4 4 75700 0 0 +15099 13 16 2 4 387000 0 0 +15106 12 15 4 2 147000 0 0 +15117 44 118 2 4 59000 0 0 +15151 13 15 2 2 751000 0 0 +15157 34 113 4 4 41800 0 0 +15190 34 111 4 2 16600 0 0 +15195 61 165 4 2 74200 0 0 +15203 37 114 6 8 623 0 0 +15246 35 113 2 4 8210 0 0 +15279 35 111 2 2 32600 0 0 +15281 38 114 8 8 12100 0 0 +15291 36 112 4 6 1130 0 0 +15335 37 112 6 6 20400 0 0 +15381 41 117 6 6 43000 0 0 +15382 36 110 4 4 23200 0 0 +15396 39 114 10 8 103000 0 0 +15415 38 112 8 6 94200 0 0 +15427 37 110 6 4 92500 0 0 +15433 36 109 4 2 115000 0 0 +15463 42 117 4 6 18100 0 0 +15479 41 116 6 4 27100 0 0 +15500 25 33 2 4 1120000 0 0 +15562 42 116 4 4 7910 0 0 +15587 26 33 4 4 5050000 0 0 +15596 42 115 4 2 49100 0 0 +15626 44 116 2 4 24400 0 0 +15660 44 115 2 2 9700 0 0 +15683 32 104 2 4 86600 0 0 +15687 25 32 2 2 3590000 0 0 +15775 26 32 4 2 1680000 0 0 +15796 46 117 4 6 1940 0 0 +15798 51 132 2 2 1290000 0 0 +15815 51 131 2 4 1280000 0 0 +15815 33 105 4 6 91700 0 0 +15827 47 117 6 6 17300 0 0 +15850 48 117 8 6 76800 0 0 +15870 45 116 2 4 4780 0 0 +15874 33 104 4 4 13200 0 0 +15900 46 116 4 4 30400 0 0 +15905 45 115 2 2 47500 0 0 +15931 47 116 6 4 59500 0 0 +15935 46 115 4 2 47200 0 0 +16259 52 147 2 4 108000 0 0 +16271 52 146 2 2 215000 0 0 +16307 53 148 4 6 99600 0 0 +16311 53 147 4 4 171000 0 0 +16324 53 146 4 2 213000 0 0 +16362 52 140 2 2 76800 0 0 +16403 54 149 6 8 59800 0 0 +16404 54 148 6 6 240000 0 0 +16408 54 147 6 4 147000 0 0 +16411 49 113 4 4 10900 0 0 +16415 53 140 4 2 76000 0 0 +16449 52 137 2 4 7560 0 0 +16450 49 111 4 2 109000 0 0 +16476 50 113 6 4 97200 0 0 +16503 53 137 4 4 47900 0 0 +16540 53 134 4 6 2970 0 0 +16550 55 149 8 8 350000 0 0 +16551 55 148 8 6 77600 0 0 +16601 54 137 6 4 92600 0 0 +16639 54 134 6 6 26300 0 0 +16663 52 128 2 4 985000 0 0 +16687 55 138 8 10 1400000 0 0 +16713 54 130 6 8 1200000 0 0 +16717 53 129 4 6 1050000 0 0 +16718 53 128 4 4 390000 0 0 +16790 55 134 8 6 114000 0 0 +16818 54 129 6 6 333000 0 0 +16819 54 128 6 4 27400 0 0 +16865 34 105 4 6 41600 0 0 +16866 55 130 8 8 193000 0 0 +16867 56 147 2 4 444000 0 0 +16880 56 146 2 2 886000 0 0 +16907 57 148 4 6 741000 0 0 +16912 57 147 4 4 564000 0 0 +16925 57 146 4 2 176000 0 0 +16933 34 104 4 4 11300 0 0 +16973 55 129 8 6 12900 0 0 +16979 56 140 2 2 60100 0 0 +17023 57 140 4 2 298000 0 0 +17024 58 149 6 8 1040000 0 0 +17025 58 148 6 6 311000 0 0 +17030 58 147 6 4 51800 0 0 +17044 35 104 2 4 29300 0 0 +17072 56 137 2 4 148000 0 0 +17117 57 137 4 4 46900 0 0 +17157 57 134 4 6 105000 0 0 +17239 58 137 6 4 155000 0 0 +17279 58 134 6 6 239000 0 0 +17352 59 151 4 6 19100 0 0 +17409 59 150 4 4 255000 0 0 +17566 60 151 6 6 257000 0 0 +17624 60 150 6 4 27300 0 0 +17736 60 145 6 8 923000 0 0 +17763 59 133 4 6 858000 0 0 +17778 59 132 4 2 352000 0 0 +17799 59 131 4 4 35100 0 0 +17988 60 133 6 6 59000 0 0 +18025 60 131 6 4 304000 0 0 +18433 49 105 4 6 6220 0 0 +18434 61 140 4 2 504000 0 0 +18514 49 104 4 4 59400 0 0 +18515 50 105 6 6 69200 0 0 +18545 61 137 4 4 495000 0 0 +18591 61 134 4 6 491000 0 0 +18732 62 150 2 4 431000 0 0 +18806 63 151 4 6 511000 0 0 +18872 63 150 4 4 84200 0 0 +19099 61 125 4 6 137000 0 0 +19365 61 124 4 4 131000 0 0 +19532 61 123 4 2 128000 0 0 +19686 111 284 2 2 7610 0 0 +19742 113 284 4 2 15100 0 0 +24538 118 236 4 6 16600 0 0 +25037 118 230 4 4 15700 0 0 +25097 121 284 2 2 29900 0 0 +25260 122 284 4 2 58600 0 0 +25328 118 227 4 2 15100 0 0 +26157 29 61 2 4 729000 0 0 +26466 30 61 4 4 1410000 0 0 +26544 51 72 2 2 4120000 0 0 +26721 51 71 2 4 4040000 0 0 +26953 31 61 6 4 2000000 0 0 +27497 52 85 2 4 395000 0 0 +27571 52 84 2 2 783000 0 0 +27601 53 86 4 6 364000 0 0 +27646 53 85 4 4 622000 0 0 +27720 53 84 4 2 771000 0 0 +27845 52 80 2 2 234000 0 0 +27865 54 89 6 8 216000 0 0 +27879 54 86 6 6 869000 0 0 +27925 54 85 6 4 528000 0 0 +27998 53 80 4 2 230000 0 0 +28058 52 77 2 4 22900 0 0 +28214 53 77 4 4 144000 0 0 +28292 55 89 8 8 1240000 0 0 +28307 55 86 8 6 275000 0 0 +28396 53 75 4 6 8840 0 0 +28410 118 217 4 6 25400 0 0 +28504 54 77 6 4 275000 0 0 +28690 54 75 6 6 77100 0 0 +28707 32 63 2 4 769000 0 0 +29039 32 62 2 2 2970000 0 0 +29089 118 207 4 4 23700 0 0 +29104 52 69 2 4 3990000 0 0 +29115 55 76 8 10 5700000 0 0 +29120 53 70 4 6 4270000 0 0 +29130 54 73 6 8 4880000 0 0 +29143 55 75 8 6 327000 0 0 +29271 53 69 4 4 1570000 0 0 +29283 56 85 2 4 1810000 0 0 +29354 33 63 4 4 3600000 0 0 +29366 57 86 4 6 3010000 0 0 +29366 56 84 2 2 3580000 0 0 +29417 57 85 4 4 2280000 0 0 +29430 54 70 6 6 1340000 0 0 +29476 118 206 4 2 22800 0 0 +29501 57 84 4 2 707000 0 0 +29584 54 69 6 4 109000 0 0 +29598 55 73 8 8 773000 0 0 +29643 29 57 2 4 1720000 0 0 +29674 30 58 4 6 1240000 0 0 +29678 56 80 2 2 289000 0 0 +29701 33 62 4 2 1390000 0 0 +29708 58 89 6 8 4150000 0 0 +29724 58 86 6 6 1240000 0 0 +29776 58 85 6 4 206000 0 0 +29780 29 56 2 2 679000 0 0 +29815 57 80 4 2 1420000 0 0 +29906 55 70 8 6 50800 0 0 +29920 56 77 2 4 705000 0 0 +30040 30 57 4 4 529000 0 0 +30060 57 77 4 4 222000 0 0 +30181 30 56 4 2 3260000 0 0 +30267 57 75 4 6 490000 0 0 +30288 31 58 6 6 2710000 0 0 +30419 59 95 4 6 86800 0 0 +30435 58 77 6 4 723000 0 0 +30635 59 92 4 4 1150000 0 0 +30648 58 75 6 6 1100000 0 0 +30670 31 57 6 4 1680000 0 0 +31084 60 95 6 6 1140000 0 0 +31309 60 92 6 4 119000 0 0 +31687 29 53 2 4 1310000 0 0 +31763 53 66 4 6 58900 0 0 +31773 30 54 4 6 2180000 0 0 +31886 29 52 2 2 2570000 0 0 +31917 31 55 6 8 3070000 0 0 +32132 54 66 6 6 512000 0 0 +32142 30 53 4 4 1600000 0 0 +32161 60 81 6 8 4720000 0 0 +32222 59 74 4 6 4380000 0 0 +32281 52 65 2 4 140000 0 0 +32346 30 52 4 2 492000 0 0 +32478 31 54 6 6 874000 0 0 +32487 53 65 4 4 881000 0 0 +32654 59 72 4 2 1000000 0 0 +32701 55 66 8 6 2160000 0 0 +32749 52 64 2 2 1340000 0 0 +32864 31 53 6 4 141000 0 0 +32872 54 65 6 4 1670000 0 0 +32917 32 59 2 4 2120000 0 0 +32924 59 71 4 4 97900 0 0 +32961 53 64 4 2 1320000 0 0 +32968 60 74 6 6 292000 0 0 +32987 33 60 4 6 2530000 0 0 +33192 34 63 4 4 20200 0 0 +33622 35 63 2 4 3880 0 0 +33636 34 62 4 2 7750 0 0 +33704 60 71 6 4 821000 0 0 +33771 33 59 4 4 393000 0 0 +34078 35 62 2 2 14900 0 0 +34122 57 66 4 6 699000 0 0 +34234 59 68 4 4 203000 0 0 +34431 61 80 4 2 2640000 0 0 +34607 58 66 6 6 1560000 0 0 +34757 61 77 4 4 2560000 0 0 +34768 23 28 4 4 12200 0 0 +34770 56 65 2 4 917000 0 0 +34774 23 27 4 6 995 0 0 +34959 57 65 4 4 289000 0 0 +34983 62 92 2 4 2650000 0 0 +35034 61 75 4 6 2500000 0 0 +35052 59 67 4 2 1890000 0 0 +35079 60 68 6 4 1700000 0 0 +35187 63 95 4 6 3130000 0 0 +35314 56 64 2 2 350000 0 0 +35468 58 65 6 4 934000 0 0 +35477 63 92 4 4 509000 0 0 +35509 57 64 4 2 1720000 0 0 +35716 24 28 6 4 1360 0 0 +35722 24 27 6 6 11900 0 0 +36388 118 187 4 2 195000 0 0 +37056 118 178 4 4 184000 0 0 +37172 118 177 4 6 183000 0 0 +37640 62 72 2 2 273000 0 0 +37805 118 170 4 6 42600 0 0 +37913 34 60 4 6 257000 0 0 +37999 62 71 2 4 66500 0 0 +38160 41 61 6 4 949000 0 0 +38213 63 72 4 2 131000 0 0 +38583 63 71 4 4 317000 0 0 +38671 42 61 4 4 608000 0 0 +38914 118 166 4 4 39000 0 0 +38951 34 59 4 4 39500 0 0 +39070 44 61 2 4 295000 0 0 +39545 35 59 2 4 189000 0 0 +39599 118 165 4 2 37000 0 0 +39756 62 68 2 4 414000 0 0 +39866 49 63 4 4 97400 0 0 +40248 50 63 6 4 852000 0 0 +40306 61 66 4 6 302000 0 0 +40395 63 68 4 4 1970000 0 0 +40509 49 62 4 2 929000 0 0 +40862 62 67 2 2 1520000 0 0 +40938 40 60 6 6 46900 0 0 +41241 104 151 4 6 20500 0 0 +41478 61 65 4 4 277000 0 0 +41538 63 67 4 2 725000 0 0 +41563 104 150 4 4 271000 0 0 +41650 105 151 6 6 279000 0 0 +41978 105 150 6 4 29200 0 0 +42151 40 59 6 4 902000 0 0 +42163 43 60 8 6 858000 0 0 +42255 61 64 4 2 262000 0 0 +42619 105 145 6 8 1310000 0 0 +42864 32 51 2 2 268000 0 0 +43640 104 133 4 6 1140000 0 0 +43735 104 132 4 2 265000 0 0 +43781 67 122 2 4 63400 0 0 +43860 104 131 4 4 26200 0 0 +44098 105 133 6 6 79000 0 0 +44281 67 121 2 2 245000 0 0 +44323 105 131 6 4 229000 0 0 +44323 33 51 4 2 485000 0 0 +45127 68 122 4 4 290000 0 0 +45209 41 58 6 6 88500 0 0 +45658 68 121 4 2 112000 0 0 +45755 37 55 6 8 4210 0 0 +45928 42 58 4 6 36200 0 0 +46063 41 57 6 4 53800 0 0 +46475 38 55 8 8 79000 0 0 +46505 36 54 4 6 7370 0 0 +46810 42 57 4 4 15200 0 0 +46877 49 60 4 6 9200 0 0 +46918 37 54 6 6 131000 0 0 +47153 42 56 4 2 92800 0 0 +47299 36 53 4 4 147000 0 0 +47395 44 57 2 4 45700 0 0 +47407 50 60 6 6 125000 0 0 +47554 39 55 10 8 647000 0 0 +47626 71 122 4 4 3230 0 0 +47676 38 54 8 6 587000 0 0 +47726 37 53 6 4 576000 0 0 +47742 36 52 4 2 716000 0 0 +47747 44 56 2 2 17900 0 0 +48202 72 122 2 4 623 0 0 +48218 71 121 4 2 1240 0 0 +48475 49 59 4 4 112000 0 0 +48808 72 121 2 2 2400 0 0 +48935 41 55 6 8 48800 0 0 +49000 46 58 4 6 12500 0 0 +49042 50 59 6 4 12100 0 0 +49297 47 58 6 6 111000 0 0 +49518 48 58 8 6 485000 0 0 +49710 45 57 2 4 29900 0 0 +50006 46 57 4 4 188000 0 0 +50097 45 56 2 2 293000 0 0 +50268 41 54 6 6 13500 0 0 +50315 47 57 6 4 364000 0 0 +50398 46 56 4 2 287000 0 0 +51158 42 54 4 6 29900 0 0 +51197 41 53 6 4 2130 0 0 +52121 42 53 4 4 21600 0 0 +52659 42 52 4 2 6530 0 0 +52806 25 28 2 4 2340 0 0 +52848 44 53 2 4 16200 0 0 +53397 92 122 4 4 12400 0 0 +53401 44 52 2 2 31300 0 0 +53696 34 51 4 2 688000 0 0 +53761 47 55 6 8 14200 0 0 +53819 26 28 4 4 492 0 0 +53833 26 27 4 6 2570 0 0 +54024 48 55 8 8 84300 0 0 +54067 95 122 6 4 108000 0 0 +54143 92 121 4 2 119000 0 0 +54831 35 51 2 2 323000 0 0 +55000 46 54 4 6 21700 0 0 +55025 67 119 2 4 552000 0 0 +55374 47 54 6 6 52300 0 0 +55501 68 120 4 6 645000 0 0 +55653 48 54 8 6 17100 0 0 +55742 45 53 2 4 22400 0 0 +56115 46 53 4 4 35100 0 0 +56358 45 52 2 2 43300 0 0 +56504 47 53 6 4 30100 0 0 +56641 109 147 2 4 114000 0 0 +56739 46 52 4 2 42400 0 0 +56788 109 146 2 2 226000 0 0 +57168 68 119 4 4 98400 0 0 +57252 108 132 2 2 1090000 0 0 +57291 110 148 4 6 103000 0 0 +57342 110 147 4 4 176000 0 0 +57467 108 131 2 4 1070000 0 0 +57493 110 146 4 2 218000 0 0 +57719 113 151 4 6 1150000 0 0 +57863 111 150 2 4 951000 0 0 +57914 109 140 2 2 70900 0 0 +58350 113 150 4 4 186000 0 0 +58580 112 149 6 8 58800 0 0 +58596 112 148 6 6 236000 0 0 +58647 110 140 4 2 68300 0 0 +58649 112 147 6 4 144000 0 0 +59016 109 137 2 4 6700 0 0 +59202 64 118 2 4 164000 0 0 +59330 71 120 4 6 169000 0 0 +59778 110 137 4 4 41300 0 0 +60266 110 134 4 6 2520 0 0 +60598 114 149 8 8 319000 0 0 +60615 114 148 8 6 70700 0 0 +60796 65 118 4 4 302000 0 0 +61069 115 147 2 4 500000 0 0 +61199 112 137 6 4 75700 0 0 +61239 71 119 4 4 25600 0 0 +61241 115 146 2 2 993000 0 0 +61539 116 148 4 6 822000 0 0 +61598 116 147 4 4 624000 0 0 +61712 112 134 6 6 21100 0 0 +61755 74 120 6 6 21800 0 0 +61772 116 146 4 2 193000 0 0 +61866 109 128 2 4 1060000 0 0 +62161 111 132 2 2 78200 0 0 +62194 72 119 2 4 122000 0 0 +62415 111 131 2 4 19300 0 0 +62482 114 138 8 10 1470000 0 0 +62552 115 140 2 2 74200 0 0 +62689 110 129 4 6 1090000 0 0 +62704 110 128 4 4 408000 0 0 +62724 113 132 4 2 38100 0 0 +62747 112 130 6 8 1250000 0 0 +62982 113 131 4 4 94000 0 0 +63106 116 140 4 2 362000 0 0 +63120 117 149 6 8 1090000 0 0 +63138 117 148 6 6 326000 0 0 +63200 117 147 6 4 54200 0 0 +63504 66 118 6 4 398000 0 0 +63826 74 119 6 4 415000 0 0 +63840 115 137 2 4 175000 0 0 +63956 114 134 8 6 84200 0 0 +64255 112 129 6 6 329000 0 0 +64269 112 128 6 4 27000 0 0 +64417 116 137 4 4 54400 0 0 +64803 81 120 8 6 377000 0 0 +64985 116 134 4 6 119000 0 0 +65068 114 130 8 8 186000 0 0 +66172 117 137 6 4 169000 0 0 +66691 114 129 8 6 11700 0 0 +66771 117 134 6 6 256000 0 0 +67870 64 116 2 4 457000 0 0 +68014 65 117 4 6 327000 0 0 +68523 64 115 2 2 178000 0 0 +68560 92 120 4 6 4620 0 0 +69669 95 120 6 6 61700 0 0 +69973 65 116 4 4 134000 0 0 +70668 65 115 4 2 810000 0 0 +71122 92 119 4 4 55900 0 0 +71422 66 117 6 6 659000 0 0 +72316 95 119 6 4 5910 0 0 +73051 118 140 4 2 726000 0 0 +73584 66 116 6 4 387000 0 0 +73914 64 110 2 4 311000 0 0 +74212 65 112 4 6 516000 0 0 +74814 118 137 4 4 676000 0 0 +74951 66 114 6 8 715000 0 0 +75113 64 109 2 2 592000 0 0 +75581 118 134 4 6 656000 0 0 +76415 65 110 4 4 360000 0 0 +77697 65 109 4 2 107000 0 0 +78287 66 112 6 6 188000 0 0 +80743 66 110 6 4 28600 0 0 +83237 75 118 6 4 404000 0 0 +84744 118 125 4 6 99300 0 0 +84843 77 118 4 4 255000 0 0 +84922 67 113 2 4 88200 0 0 +85975 67 111 2 2 340000 0 0 +86854 80 118 2 4 119000 0 0 +90136 68 113 4 4 369000 0 0 +90233 118 124 4 4 82300 0 0 +91323 68 111 4 2 142000 0 0 +91512 119 151 4 6 10200 0 0 +93110 119 150 4 4 130000 0 0 +93976 118 123 4 2 72800 0 0 +95376 70 114 6 8 2040 0 0 +96135 120 151 6 6 123000 0 0 +97388 75 117 6 6 37200 0 0 +97543 67 108 2 2 35500 0 0 +97900 120 150 6 4 12500 0 0 +98660 73 114 8 8 36200 0 0 +99072 69 112 4 6 3340 0 0 +99594 77 117 4 6 14900 0 0 +100690 71 113 4 4 825 0 0 +100850 70 112 6 6 57900 0 0 +101450 75 116 6 4 21200 0 0 +101460 120 145 6 8 452000 0 0 +102170 71 111 4 2 316 0 0 +103040 69 110 4 4 62400 0 0 +103300 72 113 2 4 153 0 0 +103850 77 116 4 4 5850 0 0 +104070 75 114 6 8 22400 0 0 +104230 119 133 4 6 389000 0 0 +104420 76 114 10 8 268000 0 0 +104490 68 108 4 2 57700 0 0 +104520 73 112 8 6 244000 0 0 +104770 119 132 4 2 150000 0 0 +104860 72 111 2 2 585 0 0 +104960 70 110 6 4 237000 0 0 +105380 69 109 4 2 292000 0 0 +105390 77 115 4 2 35000 0 0 +105490 119 131 4 4 14700 0 0 +106880 80 116 2 4 16800 0 0 +107370 85 117 4 6 5130 0 0 +108060 86 117 6 6 45300 0 0 +108270 89 117 8 6 200000 0 0 +108510 80 115 2 2 6410 0 0 +110260 120 133 6 6 23500 0 0 +110610 75 112 6 6 5580 0 0 +111130 84 116 2 4 11600 0 0 +111680 120 131 6 4 111000 0 0 +112340 85 116 4 4 71700 0 0 +112890 84 115 2 2 110000 0 0 +113090 86 116 6 4 138000 0 0 +113470 77 112 4 6 12100 0 0 +114140 85 115 4 2 107000 0 0 +115580 75 110 6 4 816 0 0 +116340 86 114 6 8 6100 0 0 +116600 89 114 8 8 36500 0 0 +118700 77 110 4 4 8030 0 0 +118930 71 108 4 2 289000 0 0 +121830 77 109 4 2 2320 0 0 +122590 72 108 2 2 132000 0 0 +122680 80 110 2 4 5690 0 0 +123680 85 112 4 6 8320 0 0 +124590 86 112 6 6 20000 0 0 +124880 89 112 8 6 6580 0 0 +126020 80 109 2 2 10500 0 0 +128310 84 110 2 4 7980 0 0 +129920 85 110 4 4 12300 0 0 +130510 92 113 4 4 11800 0 0 +130920 86 110 6 4 10500 0 0 +131970 84 109 2 2 14700 0 0 +133010 92 111 4 2 111000 0 0 +133670 85 109 4 2 14100 0 0 +134580 95 113 6 4 96600 0 0 +157970 121 150 2 4 60600 0 0 +159740 122 151 4 6 70300 0 0 +164680 122 150 4 4 10700 0 0 +194720 121 132 2 2 899 0 0 +197230 121 131 2 4 216 0 0 +205020 122 132 4 2 385 0 0 +206040 67 104 2 4 13700 0 0 +207800 122 131 4 4 924 0 0 +226750 68 105 4 6 12400 0 0 +239680 68 104 4 4 1740 0 0 +307940 71 105 4 6 1660 0 0 +332290 71 104 4 4 221 0 0 +362490 72 104 2 4 850 0 0 +386780 74 105 6 6 180 0 0 +425990 74 104 6 4 2840 0 0 +548280 81 105 8 6 1270 0 0 diff --git a/regressioncheck/WEK_Radiation/Flow_N2-N_70degConeHot/analyze.ini b/regressioncheck/WEK_Radiation/Flow_N2-N_70degConeHot/analyze.ini new file mode 100644 index 000000000..a11221d00 --- /dev/null +++ b/regressioncheck/WEK_Radiation/Flow_N2-N_70degConeHot/analyze.ini @@ -0,0 +1,7 @@ +! hdf5 diff +h5diff_file = 70degCone2D_Set1_RadiationState.h5, 70degCone2D_Set1_RadiationSurfState.h5 +h5diff_reference_file = 70degCone2D_Set1_reference_RadiationState.h5, 70degCone2D_Set1_reference_RadiationSurfState.h5 +h5diff_data_set = ElemData, SurfaceData +h5diff_tolerance_value = 15E-2, 15E-2 +h5diff_tolerance_type = relative, relative +h5diff_max_differences = 5, 5 diff --git a/regressioncheck/WEK_Radiation/Flow_N2-N_70degConeHot/command_line.ini b/regressioncheck/WEK_Radiation/Flow_N2-N_70degConeHot/command_line.ini new file mode 100644 index 000000000..757f4f75e --- /dev/null +++ b/regressioncheck/WEK_Radiation/Flow_N2-N_70degConeHot/command_line.ini @@ -0,0 +1 @@ +MPI=6 diff --git a/regressioncheck/WEK_Radiation/Flow_N2-N_70degConeHot/externals.ini b/regressioncheck/WEK_Radiation/Flow_N2-N_70degConeHot/externals.ini new file mode 100644 index 000000000..5ad6aeb28 --- /dev/null +++ b/regressioncheck/WEK_Radiation/Flow_N2-N_70degConeHot/externals.ini @@ -0,0 +1,9 @@ +! --- Externals Tool Reggie +MPI = 1, 1 ! Single execution +externalbinary = ./bin/piclas2vtk, ./bin/piclas2vtk ! Relative binary path in build directory +externaldirectory = piclas2vtk.ini, piclas2vtk.ini ! Directory name, where the files are located for the external tool reggie +externalruntime = post, post ! Run after piclas is completed (post: after, pre: before) +cmd_suffix = 70degCone2D_Set1_RadiationState.h5, 70degCone2D_Set1_RadiationSurfState.h5 ! Suffix for the binary execution +nocrosscombination:MPI,externalbinary,externaldirectory,externalruntime,cmd_suffix + + diff --git a/regressioncheck/WEK_Radiation/Flow_N2-N_70degConeHot/parameter.ini b/regressioncheck/WEK_Radiation/Flow_N2-N_70degConeHot/parameter.ini new file mode 100755 index 000000000..a5cb09af2 --- /dev/null +++ b/regressioncheck/WEK_Radiation/Flow_N2-N_70degConeHot/parameter.ini @@ -0,0 +1,147 @@ +! =============================================================================== ! +! EQUATION (linearscalaradvection) +! =============================================================================== ! +IniExactFunc = 0 + +! =============================================================================== ! +! DISCRETIZATION +! =============================================================================== ! +N = 1 ! Polynomial degree +NAnalyze = 1 ! Number of analyze points + +! =============================================================================== ! +! MESH +! =============================================================================== ! +MeshFile = mesh_70degCone2D_Set1_noWake_mesh.h5 +useCurveds = F +TrackingMethod = triatracking +WeightDistributionMethod = 1 +! =============================================================================== ! +! OUTPUT / VISUALIZATION +! =============================================================================== ! +ProjectName = 70degCone2D_Set1 +Logging = F +printRandomSeeds = F +IterDisplayStep = 100 +! =============================================================================== ! +! CALCULATION +! =============================================================================== ! +tend = 2.0E-3 ! End time +Analyze_dt = 4.0E-3 ! Timestep of analyze outputs +CFLscale = 0.2 ! Scaling of theoretical CFL number +PartWeightLoadBalance = T +DoInitialAutoRestart = T +InitialAutoRestart-PartWeightLoadBalance = T +LoadBalanceMaxSteps = 2 +CalcSurfaceImpact = T +! =============================================================================== ! +! BOUNDARIES +! =============================================================================== ! +Part-nBounds = 5 +Part-Boundary1-SourceName = IN +Part-Boundary1-Condition = open +Part-Boundary2-SourceName = OUT +Part-Boundary2-Condition = open +Part-Boundary3-SourceName = WALL +Part-Boundary3-Condition = reflective +Part-Boundary3-PhotonSpecularReflection = false +Part-Boundary3-PhotonEnACC = 0.5 +Part-Boundary3-WallTemp = 300. +Part-Boundary3-TransACC = 1. +Part-Boundary3-MomentumACC = 1. +Part-Boundary3-VibACC = 1. +Part-Boundary3-RotACC = 1. +Part-Boundary4-SourceName = SYMAXIS +Part-Boundary4-Condition = symmetric_axis +Part-Boundary5-SourceName = ROTSYM +Part-Boundary5-Condition = symmetric +Part-FIBGMdeltas = (/0.001,0.001,0.01/) +! =============================================================================== ! +! PARTICLES +! =============================================================================== ! +Part-maxParticleNumber = 1 +Part-nSpecies = 2 +! =============================================================================== ! +! Species1 - N +! =============================================================================== ! +Part-Species1-MassIC = 2.32600E-26 ! N Molecular Mass +Part-Species1-MacroParticleFactor = 2.5E10 + +Part-Species1-SpeciesName = N +Part-Species1-InteractionID = 1 +Part-Species1-Tref = 273 ! K +Part-Species1-dref = 3.0E-10 ! m +Part-Species1-omega = 0.24 + +Part-Species1-DoRadiation = T +Part-Species1-RadiationIonizationEn = 117345 ! Ionization Energy, cm-1 +Part-Species1-RadiationMass_u = 14.0067 ! Mass, u +Part-Species1-RadiationRadius_A = 0.7 ! Radius, A +Part-Species1-Starkex = 0.33 ! Stark Index +Part-Species1-NuclCharge = 1 ! Charge (1:neutral particles, 2:ions) +Radiation-Species1-SpectraFileName = Ni_NIST.dat +! =============================================================================== ! +! Species2 - N2 +! =============================================================================== ! +Part-Species2-MacroParticleFactor = 2.5E10 +Part-Species2-MassIC = 4.65200E-26 ! N2 Molecular Mass + +Part-Species2-SpeciesName = N2 +Part-Species2-InteractionID = 2 +Part-Species2-Tref = 273 +Part-Species2-dref = 4.07E-10 +Part-Species2-omega = 0.24 +Part-Species2-CharaTempVib = 3393.3 +Part-Species2-Ediss_eV = 9.759 +Part-Species2-CharaTempRot = 2.87 + +Part-Species2-DoRadiation = T +Part-Species2-RadiationIonizationEn = 125668.22 ! Ionization Energy, cm-1 +Radiation-Species2-SpectraFileName = N2i.dat +! =============================================================================== ! +! DSMC +! =============================================================================== ! +UseDSMC = true +Particles-DSMCReservoirSim = true +Particles-DSMC-CollisMode = 2 !(1:elast coll, 2: elast + rela, 3:chem) +Part-NumberOfRandomSeeds = 2 +Particles-RandomSeed1 = 1 +Particles-RandomSeed2 = 2 +Particles-DSMC-CalcQualityFactors = T +Particles-ManualTimeStep = 5E-2 +Particles-HaloEpsVelo=1E20 +! =============================================================================== ! +! Radiation +! =============================================================================== ! +Radiation-RadType = 1 ! 1:particle radiation, 2:black body radiation, 3:rad solver +Radiation-bb-atoms = t ! atomic line radiation (t,f) +Radiation-bb-molecules = t ! molecular band radiation (t,f) +Radiation-bf = f ! bound-free radiation (t,f) +Radiation-ff = f ! free-free radiation (t,f) +Radiation-MinWaveLen = 300 ! minimum wavelength, nm +Radiation-MaxWaveLen = 900 ! maximum Wavelength, nm +Radiation-WaveLenDiscr = 60000 ! number of discretization points +Radiation-WaveLenReductionFactor = 1 !Spectral binning factor for radiative transfer + +Radiation-MacroRadInput= t +Radiation-MacroInput-Filename=70degCone2D_Set1_DSMCState_000.00020000000000000.h5 +Radiation-UseElectronicExcitation = t +! =============================================================================== ! +! Radiative Transfer +! =============================================================================== ! +Radiation-NumPhotonsPerCell = 2000 +Radiation-AbsorptionModel = 1 ! 1:analytical 2:MC +Radiation-DirectionModel = 2 ! 1:random 2:spiral(random or center) +Radiation-PhotonPosModel = 2 ! 1:random 2:Halton +Radiation-AdaptivePhotonNumEmission = T ! true:photons have same energy, false:PhotonNum per cell is equal +Radiation-PhotonWaveLengthModel = 1 ! Absorption models: 1:Acceptance Rejection 2:Bisection +! =============================================================================== ! +! 2D/Axisymmetric Simulation +! =============================================================================== ! +Particles-Symmetry2D = T +Particles-Symmetry2DAxisymmetric = T +Particles-RadialWeighting = T +Particles-RadialWeighting-PartScaleFactor = 10000 +Particles-RadialWeighting-CloneMode = 2 +Particles-RadialWeighting-CloneDelay = 6 +Particles-RadialWeighting-CellLocalWeighting = F diff --git a/regressioncheck/WEK_Radiation/Flow_N2-N_70degConeHot/piclas2vtk.ini b/regressioncheck/WEK_Radiation/Flow_N2-N_70degConeHot/piclas2vtk.ini new file mode 100644 index 000000000..26b9fd923 --- /dev/null +++ b/regressioncheck/WEK_Radiation/Flow_N2-N_70degConeHot/piclas2vtk.ini @@ -0,0 +1 @@ +NVisu = 1 \ No newline at end of file diff --git a/regressioncheck/WEK_Radiation/Flow_N2-N_70degConeHot/readme.md b/regressioncheck/WEK_Radiation/Flow_N2-N_70degConeHot/readme.md new file mode 100644 index 000000000..65cce6e05 --- /dev/null +++ b/regressioncheck/WEK_Radiation/Flow_N2-N_70degConeHot/readme.md @@ -0,0 +1,5 @@ +# Radiation - Hypersonic flow around a 70° Cone (Axisymmetric) - Radiation pipeline +* Simulation of a the radiation of a hypersonic N2-N flow around a 70° blunted cone +* Read-in of a DSMC-State file to calculate the radiation +* Radiation of N2 and N (bound-bound transitions) +* Comparison of the radiation and the heat flux with a a reference state and a reference surface state file diff --git a/regressioncheck/WEK_Radiation/builds.ini b/regressioncheck/WEK_Radiation/builds.ini new file mode 100644 index 000000000..4b565029a --- /dev/null +++ b/regressioncheck/WEK_Radiation/builds.ini @@ -0,0 +1,17 @@ +! relative binary path in build directory +binary=./bin/piclas + +! fixed compiler flags +CMAKE_BUILD_TYPE = RELEASE +LIBS_BUILD_HDF5 = OFF +PICLAS_POLYNOMIAL_DEGREE = N +PICLAS_EQNSYSNAME = maxwell +PICLAS_TIMEDISCMETHOD = Radiation +LIBS_USE_MPI = ON +PICLAS_NODETYPE = GAUSS +PICLAS_INTKIND8 = ON,OFF + +!PICLAS_MEASURE_MPI_WAIT = ON + +! exclude combinations +!EXCLUDE:PICLAS_EQNSYSNAME=poisson,PICLAS_TIMEDISCMETHOD=DSMC From 86c354916f20302af8d6db64cde8099a996e13f3 Mon Sep 17 00:00:00 2001 From: Raphael Tietz Date: Fri, 3 Nov 2023 11:11:54 +0100 Subject: [PATCH 306/495] Removed unnecessary variables etc. --- src/particles/particle_tools.f90 | 5 ++++- src/particles/particle_vars.f90 | 2 +- src/particles/pic/deposition/pic_depo_tools.f90 | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/particles/particle_tools.f90 b/src/particles/particle_tools.f90 index 479dbccdf..415b14397 100644 --- a/src/particles/particle_tools.f90 +++ b/src/particles/particle_tools.f90 @@ -1678,7 +1678,10 @@ SUBROUTINE IncreaseMaxParticleNumber(Amount) ! LOCAL VARIABLES INTEGER :: NewSize, i, ii, ALLOCSTAT REAL,ALLOCATABLE :: Temp1Real(:),Temp2Real(:,:) -INTEGER,ALLOCATABLE :: Temp1Int(:)! ,Temp2Int(:,:) +INTEGER,ALLOCATABLE :: Temp1Int(:) +#if defined(IMPA) || defined(ROS) +INTEGER,ALLOCATABLE :: Temp2Int(:,:) +#endif LOGICAL,ALLOCATABLE :: Temp1Log(:) TYPE (tAmbipolElecVelo), ALLOCATABLE :: AmbipolElecVelo_New(:) TYPE (tElectronicDistriPart), ALLOCATABLE :: ElectronicDistriPart_New(:) diff --git a/src/particles/particle_vars.f90 b/src/particles/particle_vars.f90 index a754d4883..3c96c5f38 100644 --- a/src/particles/particle_vars.f90 +++ b/src/particles/particle_vars.f90 @@ -195,7 +195,7 @@ PPURE INTEGER FUNCTION ElemID_INTERFACE(iPart) TYPE tParticleDataManagement INTEGER :: CurrentNextFreePosition ! Index of nextfree index in nextFreePosition-Array INTEGER :: maxParticleNumber ! Maximum Number of all Particles - INTEGER :: maxAllowedParticleNumber ! Maximum Number of all Particles + INTEGER :: maxAllowedParticleNumber ! Maximum allowed number of PDM%maxParticleNumber INTEGER :: ParticleVecLength ! Vector Length for Particle Push Calculation INTEGER :: ParticleVecLengthOld ! Vector Length for Particle Push Calculation REAL :: MaxPartNumIncrease ! How much shall the PDM%MaxParticleNumber be incresed if it is full diff --git a/src/particles/pic/deposition/pic_depo_tools.f90 b/src/particles/pic/deposition/pic_depo_tools.f90 index 1d7f976d7..3c7a88a3f 100644 --- a/src/particles/pic/deposition/pic_depo_tools.f90 +++ b/src/particles/pic/deposition/pic_depo_tools.f90 @@ -53,7 +53,7 @@ SUBROUTINE DepositPhotonSEEHoles(iBC,NbrOfParticle) USE MOD_Particle_Boundary_Vars ,ONLY: PartBound USE MOD_PICDepo_Vars ,ONLY: DoDeposition USE MOD_Dielectric_Vars ,ONLY: DoDielectricSurfaceCharge -USE MOD_Particle_Vars ,ONLY: PEM, PDM, PartSpecies, PartState, Species, usevMPF, PartMPF +USE MOD_Particle_Vars ,ONLY: PEM, PartSpecies, PartState, Species, usevMPF, PartMPF USE MOD_Part_Tools ,ONLY: GetNextFreePosition IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------! From fba0a1633ce77635852b2aa6cc618c596733e96d Mon Sep 17 00:00:00 2001 From: Raphael Tietz Date: Fri, 3 Nov 2023 11:12:40 +0100 Subject: [PATCH 307/495] Included a routine to reduce the PDM%maxParticleNumber. It is checked once a time step --- src/particles/particle_init.f90 | 3 + src/particles/particle_tools.f90 | 752 ++++++++++++++++++++++++++++++- src/particles/particle_vars.f90 | 1 + src/timedisc/timedisc.f90 | 4 +- 4 files changed, 758 insertions(+), 2 deletions(-) diff --git a/src/particles/particle_init.f90 b/src/particles/particle_init.f90 index df1613461..58587de89 100644 --- a/src/particles/particle_init.f90 +++ b/src/particles/particle_init.f90 @@ -94,6 +94,8 @@ SUBROUTINE DefineParametersParticles() CALL prms%CreateIntOption( 'Part-MaxParticleNumber', 'Maximum allowed particles per core, 0=no limit') CALL prms%CreateRealOption( 'Part-MaxPartNumIncrease', 'How much shall the PDM%MaxParticleNumber be incresed if it is full'& , '0.1') +CALL prms%CreateLogicalOption( 'Part-RearrangePartIDs', 'Rearrange PartIDs in the process of reducing maxPartNum to allow lower memory usage'& + , '.TRUE.') CALL prms%CreateIntOption( 'Part-NumberOfRandomSeeds' , 'Number of Seeds for Random Number Generator'//& 'Choose nRandomSeeds \n'//& '=-1 Random \n'//& @@ -431,6 +433,7 @@ SUBROUTINE InitializeVariables() WRITE(UNIT=hilf,FMT='(I0)') HUGE(PDM%maxAllowedParticleNumber) PDM%maxAllowedParticleNumber = GETINT('Part-maxParticleNumber',TRIM(hilf)) PDM%MaxPartNumIncrease = GETREAL('Part-MaxPartNumIncrease','0.1') +PDM%RearrangePartIDs = GETLOGICAL('Part-RearrangePartIDs','.TRUE.') PDM%maxParticleNumber=1 PDM%ParticleVecLength=0 CALL AllocateParticleArrays() diff --git a/src/particles/particle_tools.f90 b/src/particles/particle_tools.f90 index 415b14397..e9b059297 100644 --- a/src/particles/particle_tools.f90 +++ b/src/particles/particle_tools.f90 @@ -78,7 +78,7 @@ MODULE MOD_part_tools PUBLIC :: MergeCells,InRotRefFrameCheck PUBLIC :: CalcPartSymmetryPos PUBLIC :: RotateVectorAroundAxis -PUBLIC :: IncreaseMaxParticleNumber, GetNextFreePosition +PUBLIC :: IncreaseMaxParticleNumber, GetNextFreePosition, ReduceMaxParticleNumber !=================================================================================================================================== CONTAINS @@ -2156,5 +2156,755 @@ SUBROUTINE IncreaseMaxParticleNumber(Amount) END SUBROUTINE IncreaseMaxParticleNumber +SUBROUTINE ReduceMaxParticleNumber() +!=================================================================================================================================== +! Reduces MaxParticleNumber and increases size of all depended arrays +!=================================================================================================================================== +! MODULES +USE MOD_Globals +USE MOD_Particle_Vars +USE MOD_DSMC_Vars +USE MOD_Particle_MPI_Vars ,ONLY: PartShiftVector, PartTargetProc +USE MOD_PICInterpolation_Vars ,ONLY: FieldAtParticle +#if defined(IMPA) || defined(ROS) +USE MOD_LinearSolver_Vars ,ONLY: PartXK, R_PartXK +#endif +USE MOD_MCC_Vars ,ONLY: UseMCC +USE MOD_DSMC_Vars ,ONLY: BGGas +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES + +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +INTEGER :: NewSize, i, ii, ALLOCSTAT, nPart +REAL,ALLOCATABLE :: Temp1Real(:),Temp2Real(:,:) +INTEGER,ALLOCATABLE :: Temp1Int(:) +#if defined(IMPA) || defined(ROS) +INTEGER,ALLOCATABLE :: Temp2Int(:,:) +#endif +LOGICAL,ALLOCATABLE :: Temp1Log(:) +TYPE (tAmbipolElecVelo), ALLOCATABLE :: AmbipolElecVelo_New(:) +TYPE (tElectronicDistriPart), ALLOCATABLE :: ElectronicDistriPart_New(:) +TYPE (tPolyatomMolVibQuant), ALLOCATABLE :: VibQuantsPar_New(:) +TYPE (tClonedParticles), ALLOCATABLE :: ClonedParticles_New(:,:) +! REAL :: +!=================================================================================================================================== + +IF(useDSMC.OR.usevMPF) THEN + nPart=SUM(PEM%pNumber) +ELSE + nPart=0 + DO i=1,PDM%ParticleVecLength + IF(PDM%ParticleInside(i)) nPart = nPart + 1 + END DO +END IF + +IF(BGGas%NumberOfSpecies.GT.0.AND..NOT.UseMCC) nPart=nPart*2 + +! Reduce Arrays only for at least PDM%maxParticleNumber*PDM%MaxPartNumIncrease free spots +IF (nPart.GE.PDM%maxParticleNumber/(1.+PDM%MaxPartNumIncrease)**2) RETURN + +! Maintain nPart*PDM%MaxPartNumIncrease free spots +Newsize=MAX(CEILING(nPart*(1.+PDM%MaxPartNumIncrease)),1) +IF (Newsize.EQ.PDM%maxParticleNumber) RETURN + +IPWRITE(*,*) "Decrease",PDM%maxParticleNumber,nPart,NewSize +IF(.NOT.PDM%RearrangePartIDs) THEN + ! Search for highest occupied particle index and set Newsize to this Value + i=PDM%maxParticleNumber + DO WHILE(.NOT.PDM%ParticleInside(i).OR.i.EQ.NewSize) + i=i-1 + END DO + NewSize=i +ELSE + ! Rearrange particles with IDs>NewSize to lower IDs + DO i=NewSize+1,PDM%maxParticleNumber + IF(PDM%ParticleInside(i)) THEN + PDM%CurrentNextFreePosition = PDM%CurrentNextFreePosition + 1 + ii = PDM%nextFreePosition(PDM%CurrentNextFreePosition) + IF(ii.EQ.0.OR.ii.GT.NewSize) THEN + CALL UpdateNextFreePosition() + PDM%CurrentNextFreePosition = PDM%CurrentNextFreePosition + 1 + ii = PDM%nextFreePosition(PDM%CurrentNextFreePosition) + IF(ii.EQ.0.OR.ii.GT.NewSize) CALL ABORT(& + __STAMP__& + ,'This should not happen') + END IF + IF(PDM%ParticleVecLength.LT.ii) PDM%ParticleVecLength = ii + CALL ChangePartID(i,ii) + END IF + END DO +END IF + + + +! __ __ __ __ _____ ________ ___ +! / / / /___ ____/ /___ _/ /____ / _/ | / /_ __/ / | ______________ ___ _______ +! / / / / __ \/ __ / __ `/ __/ _ \ / // |/ / / / / /| | / ___/ ___/ __ `/ / / / ___/ +! / /_/ / /_/ / /_/ / /_/ / /_/ __/ _/ // /| / / / / ___ |/ / / / / /_/ / /_/ (__ ) +! \____/ .___/\__,_/\__,_/\__/\___/ /___/_/ |_/ /_/ /_/ |_/_/ /_/ \__,_/\__, /____/ +! /_/ /____/ + + + +IF(ALLOCATED(PEM%GlobalElemID)) THEN + ALLOCATE(Temp1Int(NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in ReduceMaxParticleNumber') + Temp1Int=PEM%GlobalElemID(1:NewSize) + CALL MOVE_ALLOC(Temp1Int,PEM%GlobalElemID) +END IF + +IF(ALLOCATED(PEM%pNext)) THEN + ALLOCATE(Temp1Int(NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in ReduceMaxParticleNumber') + Temp1Int=PEM%pNext(1:NewSize) + CALL MOVE_ALLOC(Temp1Int,PEM%pNext) +END IF + +IF(ALLOCATED(PEM%LastGlobalElemID)) THEN + ALLOCATE(Temp1Int(NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in ReduceMaxParticleNumber') + Temp1Int=PEM%LastGlobalElemID(1:NewSize) + CALL MOVE_ALLOC(Temp1Int,PEM%LastGlobalElemID) +END IF + +IF(ALLOCATED(PDM%PartInit)) THEN + ALLOCATE(Temp1Int(NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in ReduceMaxParticleNumber') + Temp1Int=PDM%PartInit(1:NewSize) + CALL MOVE_ALLOC(Temp1Int,PDM%PartInit) +END IF + +#if defined(IMPA) || defined(ROS) +IF(ALLOCATED(PartXK)) THEN + ALLOCATE(Temp2Int(6,NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in ReduceMaxParticleNumber') + Temp2Int=PartXK(:,1:NewSize) + CALL MOVE_ALLOC(Temp2Int,PartXK) +END IF + +IF(ALLOCATED(R_PartXK)) THEN + ALLOCATE(Temp2Int(6,NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in ReduceMaxParticleNumber') + Temp2Int=R_PartXK(:,1:NewSize) + CALL MOVE_ALLOC(Temp2Int,R_PartXK) +END IF +#endif + +IF(ALLOCATED(PartSpecies)) THEN + ALLOCATE(Temp1Int(NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in ReduceMaxParticleNumber') + Temp1Int=PartSpecies(1:NewSize) + CALL MOVE_ALLOC(Temp1Int,PartSpecies) +END IF + +IF(ALLOCATED(InterPlanePartIndx)) THEN + ALLOCATE(Temp1Int(NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in ReduceMaxParticleNumber') + Temp1Int=InterPlanePartIndx(1:NewSize) + CALL MOVE_ALLOC(Temp1Int,InterPlanePartIndx) +END IF + +IF(ALLOCATED(BGGas%PairingPartner)) THEN + ALLOCATE(Temp1Int(NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in ReduceMaxParticleNumber') + Temp1Int=BGGas%PairingPartner(1:NewSize) + CALL MOVE_ALLOC(Temp1Int,BGGas%PairingPartner) +END IF + +IF(ALLOCATED(CollInf%OldCollPartner)) THEN + ALLOCATE(Temp1Int(NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in ReduceMaxParticleNumber') + Temp1Int=CollInf%OldCollPartner(1:NewSize) + CALL MOVE_ALLOC(Temp1Int,CollInf%OldCollPartner) +END IF + +IF(ALLOCATED(PartTargetProc)) THEN + ALLOCATE(Temp1Int(NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in ReduceMaxParticleNumber') + Temp1Int=PartTargetProc(1:NewSize) + CALL MOVE_ALLOC(Temp1Int,PartTargetProc) +END IF + +! __ __ __ __ ____ _________ __ ___ +! / / / /___ ____/ /___ _/ /____ / __ \/ ____/ | / / / | ______________ ___ _______ +! / / / / __ \/ __ / __ `/ __/ _ \ / /_/ / __/ / /| | / / / /| | / ___/ ___/ __ `/ / / / ___/ +! / /_/ / /_/ / /_/ / /_/ / /_/ __/ / _, _/ /___/ ___ |/ /___ / ___ |/ / / / / /_/ / /_/ (__ ) +! \____/ .___/\__,_/\__,_/\__/\___/ /_/ |_/_____/_/ |_/_____/ /_/ |_/_/ /_/ \__,_/\__, /____/ +! /_/ /____/ + + + +IF(ALLOCATED(PartState)) THEN + ALLOCATE(Temp2Real(6,NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in ReduceMaxParticleNumber') + Temp2Real=PartState(:,1:NewSize) + CALL MOVE_ALLOC(Temp2Real,PartState) +END IF + +IF(ALLOCATED(PartPosRef)) THEN + ALLOCATE(Temp2Real(3,NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in ReduceMaxParticleNumber') + Temp2Real=PartPosRef(:,1:NewSize) + CALL MOVE_ALLOC(Temp2Real,PartPosRef) +END IF + +#if (PP_TimeDiscMethod==508) || (PP_TimeDiscMethod==509) +IF(ALLOCATED(velocityAtTime)) THEN + ALLOCATE(Temp2Real(3,NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in ReduceMaxParticleNumber') + Temp2Real=velocityAtTime(:,1:NewSize) + CALL MOVE_ALLOC(Temp2Real,velocityAtTime) +END IF +#endif + +IF(ALLOCATED(Pt_temp)) THEN + ALLOCATE(Temp2Real(6,NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in ReduceMaxParticleNumber') + Temp2Real=Pt_temp(:,1:NewSize) + CALL MOVE_ALLOC(Temp2Real,Pt_temp) +END IF + +IF(ALLOCATED(LastPartPos)) THEN + ALLOCATE(Temp2Real(3,NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in ReduceMaxParticleNumber') + Temp2Real=LastPartPos(:,1:NewSize) + CALL MOVE_ALLOC(Temp2Real,LastPartPos) +END IF + +IF(ALLOCATED(Pt)) THEN + ALLOCATE(Temp2Real(3,NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in ReduceMaxParticleNumber') + Temp2Real=Pt(:,1:NewSize) + CALL MOVE_ALLOC(Temp2Real,Pt) +END IF + +IF(ALLOCATED(PartTimeStep)) THEN + ALLOCATE(Temp1Real(NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in ReduceMaxParticleNumber') + Temp1Real=PartTimeStep(1:NewSize) + CALL MOVE_ALLOC(Temp1Real,PartTimeStep) +END IF + +IF(ALLOCATED(PartMPF)) THEN + ALLOCATE(Temp1Real(NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in ReduceMaxParticleNumber') + Temp1Real=PartMPF(1:NewSize) + CALL MOVE_ALLOC(Temp1Real,PartMPF) +END IF + +IF(ALLOCATED(PartVeloRotRef)) THEN + ALLOCATE(Temp2Real(3,NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in ReduceMaxParticleNumber') + Temp2Real=PartVeloRotRef(:,1:NewSize) + CALL MOVE_ALLOC(Temp2Real,PartVeloRotRef) +END IF + +IF(ALLOCATED(PartStateIntEn)) THEN + IF (DSMC%ElectronicModel.GT.0) THEN + ALLOCATE(Temp2Real(3,NewSize),STAT=ALLOCSTAT) + ELSE + ALLOCATE(Temp2Real(2,NewSize),STAT=ALLOCSTAT) + END IF + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in ReduceMaxParticleNumber') + Temp2Real=PartStateIntEn(:,1:NewSize) + CALL MOVE_ALLOC(Temp2Real,PartStateIntEn) +END IF + +IF(ALLOCATED(PartShiftVector)) THEN + ALLOCATE(Temp2Real(3,NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in ReduceMaxParticleNumber') + Temp2Real=PartShiftVector(:,1:NewSize) + CALL MOVE_ALLOC(Temp2Real,PartShiftVector) +END IF + +IF(ALLOCATED(FieldAtParticle)) THEN + ALLOCATE(Temp2Real(6,NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in ReduceMaxParticleNumber') + Temp2Real=FieldAtParticle(:,1:NewSize) + CALL MOVE_ALLOC(Temp2Real,FieldAtParticle) +END IF + + + +! __ __ __ __ __ ____ ___________________ __ ___ +! / / / /___ ____/ /___ _/ /____ / / / __ \/ ____/ _/ ____/ | / / / | ______________ ___ _______ +! / / / / __ \/ __ / __ `/ __/ _ \ / / / / / / / __ / // / / /| | / / / /| | / ___/ ___/ __ `/ / / / ___/ +! / /_/ / /_/ / /_/ / /_/ / /_/ __/ / /___/ /_/ / /_/ // // /___/ ___ |/ /___ / ___ |/ / / / / /_/ / /_/ (__ ) +! \____/ .___/\__,_/\__,_/\__/\___/ /_____/\____/\____/___/\____/_/ |_/_____/ /_/ |_/_/ /_/ \__,_/\__, /____/ +! /_/ /____/ + + + +IF(ALLOCATED(PDM%ParticleInside)) THEN + ALLOCATE(Temp1Log(NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in ReduceMaxParticleNumber') + Temp1Log=PDM%ParticleInside(1:NewSize) + CALL MOVE_ALLOC(Temp1Log,PDM%ParticleInside) + PDM%ParticleInside(PDM%maxParticleNumber+1:NewSize)=.FALSE. +END IF + +IF(ALLOCATED(PDM%IsNewPart)) THEN + ALLOCATE(Temp1Log(NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in ReduceMaxParticleNumber') + Temp1Log=PDM%IsNewPart(1:NewSize) + CALL MOVE_ALLOC(Temp1Log,PDM%IsNewPart) + PDM%IsNewPart(PDM%maxParticleNumber+1:NewSize)=.FALSE. +END IF + +IF(ALLOCATED(PDM%dtFracPush)) THEN + ALLOCATE(Temp1Log(NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in ReduceMaxParticleNumber') + Temp1Log=PDM%dtFracPush(1:NewSize) + CALL MOVE_ALLOC(Temp1Log,PDM%dtFracPush) + PDM%dtFracPush(PDM%maxParticleNumber+1:NewSize)=.FALSE. +END IF + +IF(ALLOCATED(PDM%InRotRefFrame)) THEN + ALLOCATE(Temp1Log(NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in ReduceMaxParticleNumber') + Temp1Log=PDM%InRotRefFrame(1:NewSize) + CALL MOVE_ALLOC(Temp1Log,PDM%InRotRefFrame) + PDM%InRotRefFrame(PDM%maxParticleNumber+1:NewSize)=.FALSE. +END IF + +IF(ALLOCATED(ElecRelaxPart)) THEN + ALLOCATE(Temp1Log(NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in ReduceMaxParticleNumber') + Temp1Log=ElecRelaxPart(1:NewSize) + DEALLOCATE(ElecRelaxPart) + CALL MOVE_ALLOC(Temp1Log,ElecRelaxPart) +END IF + + + +! __ __ __ __ ________ ______ ___________ ___ +! / / / /___ ____/ /___ _/ /____ /_ __/\ \/ / __ \/ ____/ ___/ / | ______________ ___ _______ +! / / / / __ \/ __ / __ `/ __/ _ \ / / \ / /_/ / __/ \__ \ / /| | / ___/ ___/ __ `/ / / / ___/ +! / /_/ / /_/ / /_/ / /_/ / /_/ __/ / / / / ____/ /___ ___/ / / ___ |/ / / / / /_/ / /_/ (__ ) +! \____/ .___/\__,_/\__,_/\__/\___/ /_/ /_/_/ /_____//____/ /_/ |_/_/ /_/ \__,_/\__, /____/ +! /_/ /____/ + +IF(ALLOCATED(AmbipolElecVelo)) THEN + ALLOCATE(AmbipolElecVelo_New(NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in ReduceMaxParticleNumber') + DO i=1,NewSize + CALL MOVE_ALLOC(AmbipolElecVelo(i)%ElecVelo,AmbipolElecVelo_New(i)%ElecVelo) + END DO + DO i=NewSize+1,PDM%maxParticleNumber + SDEALLOCATE(AmbipolElecVelo(i)%ElecVelo) + END DO + DEALLOCATE(AmbipolElecVelo) + CALL MOVE_ALLOC(AmbipolElecVelo_New,AmbipolElecVelo) +END IF + +IF(ALLOCATED(ElectronicDistriPart)) THEN + ALLOCATE(ElectronicDistriPart_New(NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in ReduceMaxParticleNumber') + DO i=1,NewSize + CALL MOVE_ALLOC(ElectronicDistriPart(i)%DistriFunc,ElectronicDistriPart_New(i)%DistriFunc) + END DO + DO i=NewSize+1,PDM%maxParticleNumber + SDEALLOCATE(ElectronicDistriPart(i)%DistriFunc) + END DO + DEALLOCATE(ElectronicDistriPart) + CALL MOVE_ALLOC(ElectronicDistriPart_New,ElectronicDistriPart) +END IF + +IF(ALLOCATED(VibQuantsPar)) THEN + ALLOCATE(VibQuantsPar_New(NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in ReduceMaxParticleNumber') + DO i=1,NewSize + CALL MOVE_ALLOC(VibQuantsPar(i)%Quants,VibQuantsPar_New(i)%Quants) + END DO + DO i=NewSize+1,PDM%maxParticleNumber + SDEALLOCATE(VibQuantsPar(i)%Quants) + END DO + DEALLOCATE(VibQuantsPar) + CALL MOVE_ALLOC(VibQuantsPar_New,VibQuantsPar) +END IF + +IF(ALLOCATED(ClonedParticles)) THEN + SELECT CASE(RadialWeighting%CloneMode) + CASE(1) + ALLOCATE(ClonedParticles_new(1:INT(NewSize/RadialWeighting%CloneInputDelay),0:(RadialWeighting%CloneInputDelay-1)),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& + __STAMP__& + ,'Cannot allocate increased Array in ReduceMaxParticleNumber') + DO ii=0,RadialWeighting%CloneInputDelay-1 + DO i=1,RadialWeighting%ClonePartNum(ii) + IF(i.LE.INT(NewSize/RadialWeighting%CloneInputDelay)) THEN + ClonedParticles_new(i,ii)%Species=ClonedParticles(i,ii)%Species + ClonedParticles_new(i,ii)%PartState(1:6)=ClonedParticles(i,ii)%PartState(1:6) + ClonedParticles_new(i,ii)%PartStateIntEn(1:3)=ClonedParticles(i,ii)%PartStateIntEn(1:3) + ClonedParticles_new(i,ii)%Element=ClonedParticles(i,ii)%Element + ClonedParticles_new(i,ii)%LastPartPos(1:3)=ClonedParticles(i,ii)%LastPartPos(1:3) + ClonedParticles_new(i,ii)%WeightingFactor=ClonedParticles(i,ii)%WeightingFactor + CALL MOVE_ALLOC(ClonedParticles(i,ii)%VibQuants,ClonedParticles_new(i,ii)%VibQuants) + CALL MOVE_ALLOC(ClonedParticles(i,ii)%DistriFunc,ClonedParticles_new(i,ii)%DistriFunc) + CALL MOVE_ALLOC(ClonedParticles(i,ii)%AmbiPolVelo,ClonedParticles_new(i,ii)%AmbiPolVelo) + ELSE + SDEALLOCATE(ClonedParticles(i,ii)%VibQuants) + SDEALLOCATE(ClonedParticles(i,ii)%DistriFunc) + SDEALLOCATE(ClonedParticles(i,ii)%AmbiPolVelo) + END IF + END DO + IF(RadialWeighting%ClonePartNum(ii).GT.INT(NewSize/RadialWeighting%CloneInputDelay)) & + RadialWeighting%ClonePartNum(ii)=INT(NewSize/RadialWeighting%CloneInputDelay) + END DO + DEALLOCATE(ClonedParticles) + CALL MOVE_ALLOC(ClonedParticles_New,ClonedParticles) + CASE(2) + ALLOCATE(ClonedParticles_new(1:INT(NewSize/RadialWeighting%CloneInputDelay),0:RadialWeighting%CloneInputDelay),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& + __STAMP__& + ,'Cannot allocate increased Array in ReduceMaxParticleNumber') + DO ii=0,RadialWeighting%CloneInputDelay + DO i=1,RadialWeighting%ClonePartNum(ii) + IF(i.LE.INT(NewSize/RadialWeighting%CloneInputDelay)) THEN + ClonedParticles_new(i,ii)%Species=ClonedParticles(i,ii)%Species + ClonedParticles_new(i,ii)%PartState(1:6)=ClonedParticles(i,ii)%PartState(1:6) + ClonedParticles_new(i,ii)%PartStateIntEn(1:3)=ClonedParticles(i,ii)%PartStateIntEn(1:3) + ClonedParticles_new(i,ii)%Element=ClonedParticles(i,ii)%Element + ClonedParticles_new(i,ii)%LastPartPos(1:3)=ClonedParticles(i,ii)%LastPartPos(1:3) + ClonedParticles_new(i,ii)%WeightingFactor=ClonedParticles(i,ii)%WeightingFactor + CALL MOVE_ALLOC(ClonedParticles(i,ii)%VibQuants,ClonedParticles_new(i,ii)%VibQuants) + CALL MOVE_ALLOC(ClonedParticles(i,ii)%DistriFunc,ClonedParticles_new(i,ii)%DistriFunc) + CALL MOVE_ALLOC(ClonedParticles(i,ii)%AmbiPolVelo,ClonedParticles_new(i,ii)%AmbiPolVelo) + ELSE + SDEALLOCATE(ClonedParticles(i,ii)%VibQuants) + SDEALLOCATE(ClonedParticles(i,ii)%DistriFunc) + SDEALLOCATE(ClonedParticles(i,ii)%AmbiPolVelo) + END IF + END DO + IF(RadialWeighting%ClonePartNum(ii).GT.INT(NewSize/RadialWeighting%CloneInputDelay)) & + RadialWeighting%ClonePartNum(ii)=INT(NewSize/RadialWeighting%CloneInputDelay) + END DO + DEALLOCATE(ClonedParticles) + CALL MOVE_ALLOC(ClonedParticles_New,ClonedParticles) + CASE DEFAULT + CALL Abort(& + __STAMP__,& + 'ERROR in Radial Weighting of 2D/Axisymmetric: The selected cloning mode is not available! Choose between 1 and 2.'//& + ' CloneMode=1: Delayed insertion of clones; CloneMode=2: Delayed randomized insertion of clones') +END SELECT +END IF + + + + +IF(ALLOCATED(PDM%nextFreePosition)) THEN + ALLOCATE(Temp1Int(NewSize),STAT=ALLOCSTAT) + IF (ALLOCSTAT.NE.0) CALL ABORT(& +__STAMP__& +,'Cannot allocate increased Array in ReduceMaxParticleNumber') + Temp1Int=PDM%nextFreePosition(1:NewSize) + CALL MOVE_ALLOC(Temp1Int,PDM%nextFreePosition) + + !Set all NextFreePositions to zero which points to a partID>NewSize + DO i=1,NewSize + IF(PDM%nextFreePosition(i).GT.NewSize) PDM%nextFreePosition(i)=0 + END DO +END IF + +! Update NextFreePos + +IF(PDM%ParticleVecLength.GT.NewSize) PDM%ParticleVecLength = NewSize +PDM%MaxParticleNumber=NewSize + +! read(*,*) + +END SUBROUTINE ReduceMaxParticleNumber + + +SUBROUTINE ChangePartID(OldID,NewID) +!=================================================================================================================================== +! Change PartID from OldID to NewID +!=================================================================================================================================== +! MODULES +USE MOD_Globals +USE MOD_Particle_Vars +USE MOD_DSMC_Vars +USE MOD_Particle_MPI_Vars ,ONLY: PartShiftVector, PartTargetProc +USE MOD_PICInterpolation_Vars ,ONLY: FieldAtParticle +#if defined(IMPA) || defined(ROS) +USE MOD_LinearSolver_Vars ,ONLY: PartXK, R_PartXK +#endif +! IMPLICIT VARIABLE HANDLING +IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES +INTEGER,INTENT(IN) :: OldID +INTEGER,INTENT(IN) :: NewID +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES +INTEGER :: i,TempPartID +!=================================================================================================================================== + + + +! __ __ __ __ _____ ________ ___ +! / / / /___ ____/ /___ _/ /____ / _/ | / /_ __/ / | ______________ ___ _______ +! / / / / __ \/ __ / __ `/ __/ _ \ / // |/ / / / / /| | / ___/ ___/ __ `/ / / / ___/ +! / /_/ / /_/ / /_/ / /_/ / /_/ __/ _/ // /| / / / / ___ |/ / / / / /_/ / /_/ (__ ) +! \____/ .___/\__,_/\__,_/\__/\___/ /___/_/ |_/ /_/ /_/ |_/_/ /_/ \__,_/\__, /____/ +! /_/ /____/ + + + +IF(ALLOCATED(PEM%GlobalElemID)) THEN + PEM%GlobalElemID(NewID)=PEM%GlobalElemID(OldID) +END IF + +IF(ALLOCATED(PEM%pNext)) THEN + PEM%pNext(NewID)=PEM%pNext(OldID) + ! Update pNext onto this particle + TempPartID = PEM%pStart(PEM%LocalElemID(OldID)) + IF (TempPartID.EQ.OldID) THEN + PEM%pStart(PEM%LocalElemID(OldID)) = NewID + ELSE + DO i=1,PEM%pNumber(PEM%LocalElemID(OldID)) + IF(PEM%pNext(TempPartID).EQ.OldID) THEN + PEM%pNext(TempPartID) = NewID + EXIT + END IF + TempPartID = PEM%pNext(TempPartID) + END DO + END IF +END IF + +IF(ALLOCATED(PEM%LastGlobalElemID)) THEN + PEM%LastGlobalElemID(NewID)=PEM%LastGlobalElemID(OldID) +END IF + +IF(ALLOCATED(PDM%PartInit)) THEN + PDM%PartInit(NewID)=PDM%PartInit(OldID) +END IF + +#if defined(IMPA) || defined(ROS) +IF(ALLOCATED(PartXK)) THEN + PartXK(:,NewID)=PartXK(:,OldID) +END IF + +IF(ALLOCATED(R_PartXK)) THEN + R_PartXK(:,NewID)=R_PartXK(:,OldID) +END IF +#endif + +IF(ALLOCATED(PartSpecies)) THEN + PartSpecies(NewID)=PartSpecies(OldID) +END IF + +IF(ALLOCATED(InterPlanePartIndx)) THEN + InterPlanePartIndx(NewID)=InterPlanePartIndx(OldID) +END IF + +IF(ALLOCATED(BGGas%PairingPartner)) THEN + BGGas%PairingPartner(NewID)=BGGas%PairingPartner(OldID) +END IF + +IF(ALLOCATED(CollInf%OldCollPartner)) THEN + CollInf%OldCollPartner(NewID)=CollInf%OldCollPartner(OldID) +END IF + +IF(ALLOCATED(PartTargetProc)) THEN + PartTargetProc(NewID)=PartTargetProc(OldID) +END IF + +! __ __ __ __ ____ _________ __ ___ +! / / / /___ ____/ /___ _/ /____ / __ \/ ____/ | / / / | ______________ ___ _______ +! / / / / __ \/ __ / __ `/ __/ _ \ / /_/ / __/ / /| | / / / /| | / ___/ ___/ __ `/ / / / ___/ +! / /_/ / /_/ / /_/ / /_/ / /_/ __/ / _, _/ /___/ ___ |/ /___ / ___ |/ / / / / /_/ / /_/ (__ ) +! \____/ .___/\__,_/\__,_/\__/\___/ /_/ |_/_____/_/ |_/_____/ /_/ |_/_/ /_/ \__,_/\__, /____/ +! /_/ /____/ + + + +IF(ALLOCATED(PartState)) THEN + PartState(:,NewID)=PartState(:,OldID) +END IF + +IF(ALLOCATED(PartPosRef)) THEN + PartPosRef(:,NewID)=PartPosRef(:,OldID) +END IF + +#if (PP_TimeDiscMethod==508) || (PP_TimeDiscMethod==509) +IF(ALLOCATED(velocityAtTime)) THEN + velocityAtTime(:,NewID)=velocityAtTime(:,OldID) +END IF +#endif + +IF(ALLOCATED(Pt_temp)) THEN + Pt_temp(:,NewID)=Pt_temp(:,OldID) +END IF + +IF(ALLOCATED(LastPartPos)) THEN + LastPartPos(:,NewID)=LastPartPos(:,OldID) +END IF + +IF(ALLOCATED(Pt)) THEN + Pt(:,NewID)=Pt(:,OldID) +END IF + +IF(ALLOCATED(PartTimeStep)) THEN + PartTimeStep(NewID)=PartTimeStep(OldID) +END IF + +IF(ALLOCATED(PartMPF)) THEN + PartMPF(NewID)=PartMPF(OldID) +END IF + +IF(ALLOCATED(PartVeloRotRef)) THEN + PartVeloRotRef(:,NewID)=PartVeloRotRef(:,OldID) +END IF + +IF(ALLOCATED(PartStateIntEn)) THEN + PartStateIntEn(:,NewID)=PartStateIntEn(:,OldID) +END IF + +IF(ALLOCATED(PartShiftVector)) THEN + PartShiftVector(:,NewID)=PartShiftVector(:,OldID) +END IF + +IF(ALLOCATED(FieldAtParticle)) THEN + FieldAtParticle(:,NewID)=FieldAtParticle(:,OldID) +END IF + + + +! __ __ __ __ __ ____ ___________________ __ ___ +! / / / /___ ____/ /___ _/ /____ / / / __ \/ ____/ _/ ____/ | / / / | ______________ ___ _______ +! / / / / __ \/ __ / __ `/ __/ _ \ / / / / / / / __ / // / / /| | / / / /| | / ___/ ___/ __ `/ / / / ___/ +! / /_/ / /_/ / /_/ / /_/ / /_/ __/ / /___/ /_/ / /_/ // // /___/ ___ |/ /___ / ___ |/ / / / / /_/ / /_/ (__ ) +! \____/ .___/\__,_/\__,_/\__/\___/ /_____/\____/\____/___/\____/_/ |_/_____/ /_/ |_/_/ /_/ \__,_/\__, /____/ +! /_/ /____/ + + + +IF(ALLOCATED(PDM%ParticleInside)) THEN + PDM%ParticleInside(NewID)=PDM%ParticleInside(OldID) + PDM%ParticleInside(OldID)=.FALSE. +END IF + +IF(ALLOCATED(PDM%IsNewPart)) THEN + PDM%IsNewPart(NewID)=PDM%IsNewPart(OldID) +END IF + +IF(ALLOCATED(PDM%dtFracPush)) THEN + PDM%dtFracPush(NewID)=PDM%dtFracPush(OldID) +END IF + +IF(ALLOCATED(PDM%InRotRefFrame)) THEN + PDM%InRotRefFrame(NewID)=PDM%InRotRefFrame(OldID) +END IF + +IF(ALLOCATED(ElecRelaxPart)) THEN + ElecRelaxPart(NewID)=ElecRelaxPart(OldID) +END IF + + + +! __ __ __ __ ________ ______ ___________ ___ +! / / / /___ ____/ /___ _/ /____ /_ __/\ \/ / __ \/ ____/ ___/ / | ______________ ___ _______ +! / / / / __ \/ __ / __ `/ __/ _ \ / / \ / /_/ / __/ \__ \ / /| | / ___/ ___/ __ `/ / / / ___/ +! / /_/ / /_/ / /_/ / /_/ / /_/ __/ / / / / ____/ /___ ___/ / / ___ |/ / / / / /_/ / /_/ (__ ) +! \____/ .___/\__,_/\__,_/\__/\___/ /_/ /_/_/ /_____//____/ /_/ |_/_/ /_/ \__,_/\__, /____/ +! /_/ /____/ + +IF(ALLOCATED(AmbipolElecVelo)) THEN + IF(ALLOCATED(AmbipolElecVelo(OldID)%ElecVelo)) THEN + IF(ALLOCATED(AmbipolElecVelo(NewID)%ElecVelo)) DEALLOCATE(AmbipolElecVelo(NewID)%ElecVelo) + CALL MOVE_ALLOC(AmbipolElecVelo(OldID)%ElecVelo,AmbipolElecVelo(NewID)%ElecVelo) + ELSE + IF(ALLOCATED(AmbipolElecVelo(NewID)%ElecVelo)) DEALLOCATE(AmbipolElecVelo(NewID)%ElecVelo) + END IF +END IF + +IF(ALLOCATED(ElectronicDistriPart)) THEN + IF(ALLOCATED(ElectronicDistriPart(OldID)%DistriFunc)) THEN + IF(ALLOCATED(ElectronicDistriPart(NewID)%DistriFunc)) DEALLOCATE(ElectronicDistriPart(NewID)%DistriFunc) + CALL MOVE_ALLOC(ElectronicDistriPart(OldID)%DistriFunc,ElectronicDistriPart(NewID)%DistriFunc) + ELSE + IF(ALLOCATED(ElectronicDistriPart(NewID)%DistriFunc)) DEALLOCATE(ElectronicDistriPart(NewID)%DistriFunc) + END IF +END IF + +IF(ALLOCATED(VibQuantsPar)) THEN + IF(ALLOCATED(VibQuantsPar(OldID)%Quants)) THEN + IF(ALLOCATED(VibQuantsPar(NewID)%Quants)) DEALLOCATE(VibQuantsPar(NewID)%Quants) + CALL MOVE_ALLOC(VibQuantsPar(OldID)%Quants,VibQuantsPar(NewID)%Quants) + ELSE + IF(ALLOCATED(VibQuantsPar(NewID)%Quants)) DEALLOCATE(VibQuantsPar(NewID)%Quants) + END IF +END IF + + +END SUBROUTINE ChangePartID + + END MODULE MOD_part_tools diff --git a/src/particles/particle_vars.f90 b/src/particles/particle_vars.f90 index 3c96c5f38..00f864ecc 100644 --- a/src/particles/particle_vars.f90 +++ b/src/particles/particle_vars.f90 @@ -196,6 +196,7 @@ PPURE INTEGER FUNCTION ElemID_INTERFACE(iPart) INTEGER :: CurrentNextFreePosition ! Index of nextfree index in nextFreePosition-Array INTEGER :: maxParticleNumber ! Maximum Number of all Particles INTEGER :: maxAllowedParticleNumber ! Maximum allowed number of PDM%maxParticleNumber + LOGICAL :: RearrangePartIDs ! Rearrange PartIDs during shrinking maxPartNum INTEGER :: ParticleVecLength ! Vector Length for Particle Push Calculation INTEGER :: ParticleVecLengthOld ! Vector Length for Particle Push Calculation REAL :: MaxPartNumIncrease ! How much shall the PDM%MaxParticleNumber be incresed if it is full diff --git a/src/timedisc/timedisc.f90 b/src/timedisc/timedisc.f90 index 734a97a2e..9ac776374 100644 --- a/src/timedisc/timedisc.f90 +++ b/src/timedisc/timedisc.f90 @@ -123,6 +123,7 @@ SUBROUTINE TimeDisc() #endif /*defined(MEASURE_MPI_WAIT)*/ #if defined(PARTICLES) USE MOD_Particle_Analyze_Vars ,ONLY: CalcPointsPerDebyeLength,CalcPICTimeStep +USE MOD_Part_Tools ,ONLY: ReduceMaxParticleNumber #endif ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -233,7 +234,7 @@ SUBROUTINE TimeDisc() tTracking=0 tLocalization=0 END IF -IF(CalcEMFieldOutput) CALL WriteElectroMagneticPICFieldToHDF5() ! Write magnetic field to file +IF(CalcEMFieldOutput) CALL WriteElectroMagneticPICFieldToHDF5() ! Write magnetic field to file #endif /*PARTICLES*/ ! No computation needed if tEnd=tStart! @@ -342,6 +343,7 @@ SUBROUTINE TimeDisc() #endif /*defined(PARTICLES) && USE_HDG*/ CALL PerformAnalyze(time,FirstOrLastIter=finalIter,OutPutHDF5=.FALSE.) ! analyze routines are not called here in last iter #ifdef PARTICLES + CALL ReduceMaxParticleNumber() ! sampling of near adaptive boundary element values IF(UseAdaptive.OR.(nPorousBC.GT.0)) CALL AdaptiveBCSampling() #endif /*PARICLES*/ From ed70a87c54360d00a5df392dda6a3f82652a532a Mon Sep 17 00:00:00 2001 From: Marcel Pfeiffer Date: Fri, 3 Nov 2023 15:12:16 +0100 Subject: [PATCH 308/495] some changes for bilinear raytracing --- .../tracking/radtrans_tracking.f90 | 556 ++++++++---------- src/radiation/ray_tracing/raytrace.f90 | 3 - 2 files changed, 231 insertions(+), 328 deletions(-) diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 index a0be487ae..31952e913 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 @@ -298,7 +298,8 @@ SUBROUTINE PhotonTriaTracking() LOGICAL :: ThroughSide, Done LOGICAL :: oldElemIsMortar, isMortarSideTemp(1:6), doCheckSide REAL :: minRatio, intersecDist, intersecDistVec(3) -REAL :: IntersectionPos(1:3), IntersectionPosTemp(1:3), PartTrajectory(1:3),lengthPartTrajectory +REAL :: IntersectionPos(1:3), IntersectionPosTemp(1:3) +REAL :: DistTemp(1:6) LOGICAL :: PhotonLost LOGICAL :: foundHit REAL :: alpha,xi,eta @@ -308,13 +309,12 @@ SUBROUTINE PhotonTriaTracking() SideID = 0 DoneLastElem(:,:) = 0 -! Set initial starting position -PhotonProps%PhotonStartPos = PhotonProps%PhotonPos ! 1) Loop tracking until Photon is considered "done" (either absorbed or deleted) DO WHILE (.NOT.Done) oldElemIsMortar = .FALSE. NrOfThroughSides = 0 LocSidesTemp(:) = 0 + DistTemp = 0.0 TriNumTemp(:) = 0 GlobSideTemp = 0 isMortarSideTemp = .FALSE. @@ -370,38 +370,18 @@ SUBROUTINE PhotonTriaTracking() END DO ELSE ! 2) Tracing on bilinear sides (bilinear algorithm for intersection calculation)) - PartTrajectory = PhotonProps%PhotonDirection - PhotonProps%PhotonPos = PhotonProps%PhotonStartPos + PhotonProps%PhotonDirection - !PartTrajectory = PhotonProps%PhotonStartPos - PhotonProps%PhotonLastPos - lengthPartTrajectory=SQRT(DOT_PRODUCT(PartTrajectory,PartTrajectory)) - PartTrajectory = PartTrajectory/lengthPartTrajectory SideID = GetGlobalNonUniqueSideID(ElemID,localSideID) - ! INPUT VARIABLES - ! PartTrajectory - ! lengthPartTrajectory - ! PartID,SideID - ! ElemCheck_Opt - ! alpha2 - !----------------------------------------------------------------------------------------------------------------------------------- - ! OUTPUT VARIABLES - !alpha,xitild,etatild - !isHit + ThroughSide = .FALSE. !CALL ComputeBiLinearIntersection(foundHit,PartTrajectory,lengthPartTrajectory,locAlpha,xi,eta,iPart,SideID,alpha2=currentIntersect%alpha) - CALL PhotonComputeBiLinearIntersection(foundHit,PartTrajectory,lengthPartTrajectory,alpha,xi,eta,-1,SideID,LastPartPos_IN=PhotonProps%PhotonStartPos) - IF(foundHit)THEN - IntersectionPos = PhotonProps%PhotonStartPos + alpha * PartTrajectory - IF(VECNORM(IntersectionPos-PhotonProps%PhotonStartPos).LE.1e-16)THEN - foundHit=.FALSE. - CYCLE LocSideLoop - END IF ! VECNORM(IntersectionPos-PhotonProps%PhotonStartPos).LE.1e-16 + CALL PhotonComputeBiLinearIntersection(ThroughSide,SideID, intersecDist) + IF(ThroughSide)THEN NrOfThroughSides = NrOfThroughSides + 1 - PhotonProps%PhotonLastPos = IntersectionPos - PhotonLost = .FALSE. + LocSidesTemp(NrOfThroughSides) = localSideID + GlobSideTemp(NrOfThroughSides) = TempSideID + DistTemp(NrOfThroughSides) = intersecDist + SideID = TempSideID LocalSide = localSideID - TriNum=1 - EXIT LocSideLoop - ELSE - PhotonLost = .TRUE. + IntersectionPos(1:3) = PhotonProps%PhotonLastPos(1:3) + intersecDist*PhotonProps%PhotonDirection(1:3) END IF ! foundHit END IF ! UsePhotonTriaTracking END IF ! Mortar or regular side @@ -432,109 +412,123 @@ SUBROUTINE PhotonTriaTracking() Done = .TRUE. EXIT ELSE IF (NrOfThroughSides.GT.1) THEN - ! Use the slower search method if particle appears to have crossed more than one side (possible for irregular hexagons - ! and in the case of mortar elements) - SecondNrOfThroughSides = 0 - minRatio = 1E90 - oldElemIsMortar = .FALSE. - DO ind2 = 1, NrOfThroughSides - doCheckSide = .TRUE. - ! Check if this side was already treated - DO indSide = 2, 6 - IF((DoneLastElem(1,indSide).EQ.ElemID).AND. & - (DoneLastElem(4,indSide).EQ.GlobSideTemp(ind2)).AND. & - (DoneLastElem(3,indSide).EQ.TriNumTemp(ind2))) THEN - doCheckSide = .FALSE. - END IF - END DO - IF (doCheckSide) THEN - IF (isMortarSideTemp(ind2)) THEN ! Mortar side - NbElemID = SideInfo_Shared(SIDE_ELEMID,GlobSideTemp(ind2)) - ! Get the determinant between the old and new particle position and the nodes of the triangle which was crossed - CALL PhotonIntersectionWithSide(LocSidesTemp(ind2),NbElemID,TriNumTemp(ind2), IntersectionPosTemp, PhotonLost, .TRUE.) - IF(PhotonLost)THEN - ASSOCIATE( LastPhotPos => PhotonProps%PhotonLastPos(1:3), & - Pos => PhotonProps%PhotonPos(1:3), & - Dir => PhotonProps%PhotonDirection(1:3) ) - CALL StoreLostPhotonProperties(LastPhotPos,Pos,Dir,ElemID) - NbrOfLostParticles=NbrOfLostParticles+1 - IF(DisplayLostParticles)THEN - IPWRITE(*,*) 'Error in Photon TriaTracking! PhotonIntersectionWithSide() cannot determine intersection'& - //' because photon is parallel to side. NbElemID:', NbElemID - IPWRITE(*,*) 'LastPos: ', PhotonProps%PhotonLastPos(1:3) - IPWRITE(*,*) 'Pos: ', PhotonProps%PhotonPos(1:3) - IPWRITE(*,*) 'Direction:', PhotonProps%PhotonDirection(1:3) - IPWRITE(*,*) 'Photon deleted!' - END IF ! DisplayLostParticles - END ASSOCIATE - Done = .TRUE. - EXIT - END IF ! PhotonLost - intersecDistVec(1:3) = IntersectionPosTemp(1:3) - PhotonProps%PhotonLastPos(1:3) - intersecDist = DOT_PRODUCT(intersecDistVec, intersecDistVec) - ! If the particle is inside the neighboring mortar element, it moved through this side - ! Ratio is always negative since detM(=detLastPartPos) is negative or zero, i.e. maximum abs is wanted - ! The closer the intersected side is to the last particle position the greater the absolute ratio will be - IF (intersecDist.LT.minRatio) THEN - IntersectionPos = IntersectionPosTemp - minRatio = intersecDist - SecondNrOfThroughSides = SecondNrOfThroughSides + 1 - SideID = GlobSideTemp(ind2) - LocalSide = LocSidesTemp(ind2) - TriNum = TriNumTemp(ind2) - oldElemIsMortar = .TRUE. - END IF - ELSE ! Regular side - CALL PhotonIntersectionWithSide(LocSidesTemp(ind2),ElemID,TriNumTemp(ind2), IntersectionPosTemp, PhotonLost) - IF(PhotonLost)THEN - ASSOCIATE( LastPhotPos => PhotonProps%PhotonLastPos(1:3), & - Pos => PhotonProps%PhotonPos(1:3), & - Dir => PhotonProps%PhotonDirection(1:3) ) - CALL StoreLostPhotonProperties(LastPhotPos,Pos,Dir,ElemID) - NbrOfLostParticles=NbrOfLostParticles+1 - IF(DisplayLostParticles)THEN - IPWRITE(*,*) 'Error in Photon TriaTracking! PhotonIntersectionWithSide() cannot determine intersection'& - //' because photon is parallel to side. ElemID:', ElemID - IPWRITE(*,*) 'LastPos: ', PhotonProps%PhotonLastPos(1:3) - IPWRITE(*,*) 'Pos: ', PhotonProps%PhotonPos(1:3) - IPWRITE(*,*) 'Direction:', PhotonProps%PhotonDirection(1:3) - IPWRITE(*,*) 'Photon deleted!' - END IF ! DisplayLostParticles - END ASSOCIATE - Done = .TRUE. - EXIT - END IF ! PhotonLost - intersecDistVec(1:3) = IntersectionPosTemp(1:3) - PhotonProps%PhotonLastPos(1:3) - intersecDist = DOT_PRODUCT(intersecDistVec, intersecDistVec) - IF (intersecDist.LT.minRatio) THEN - IntersectionPos = IntersectionPosTemp - minRatio = intersecDist - SecondNrOfThroughSides = SecondNrOfThroughSides + 1 - SideID = GlobSideTemp(ind2) - LocalSide = LocSidesTemp(ind2) - TriNum = TriNumTemp(ind2) - oldElemIsMortar = .FALSE. + IF(UsePhotonTriaTracking)THEN + ! Use the slower search method if particle appears to have crossed more than one side (possible for irregular hexagons + ! and in the case of mortar elements) + SecondNrOfThroughSides = 0 + minRatio = 1E90 + oldElemIsMortar = .FALSE. + DO ind2 = 1, NrOfThroughSides + doCheckSide = .TRUE. + ! Check if this side was already treated + DO indSide = 2, 6 + IF((DoneLastElem(1,indSide).EQ.ElemID).AND. & + (DoneLastElem(4,indSide).EQ.GlobSideTemp(ind2)).AND. & + (DoneLastElem(3,indSide).EQ.TriNumTemp(ind2))) THEN + doCheckSide = .FALSE. END IF - END IF ! isMortarSideTemp = T/F - END IF ! doCheckSide - END DO ! ind2 = 1, NrOfThroughSides - ! Particle that went through multiple sides first, but did not cross any sides during the second check -> Deleted! - IF (SecondNrOfThroughSides.EQ.0) THEN - ASSOCIATE( LastPhotPos => PhotonProps%PhotonLastPos(1:3), & - Pos => PhotonProps%PhotonPos(1:3), & - Dir => PhotonProps%PhotonDirection(1:3) ) - CALL StoreLostPhotonProperties(LastPhotPos,Pos,Dir,ElemID) - NbrOfLostParticles=NbrOfLostParticles+1 - IF(DisplayLostParticles)THEN - IPWRITE(*,*) 'Error in Photon TriaTracking! Photon lost on second check. Element:', ElemID - IPWRITE(*,*) 'LastPos: ', PhotonProps%PhotonLastPos(1:3) - IPWRITE(*,*) 'Pos: ', PhotonProps%PhotonPos(1:3) - IPWRITE(*,*) 'Direction:', PhotonProps%PhotonDirection(1:3) - IPWRITE(*,*) 'Photon deleted!' - END IF ! DisplayLostParticles - END ASSOCIATE - Done = .TRUE. - EXIT + END DO + IF (doCheckSide) THEN + IF (isMortarSideTemp(ind2)) THEN ! Mortar side + NbElemID = SideInfo_Shared(SIDE_ELEMID,GlobSideTemp(ind2)) + ! Get the determinant between the old and new particle position and the nodes of the triangle which was crossed + CALL PhotonIntersectionWithSide(LocSidesTemp(ind2),NbElemID,TriNumTemp(ind2), IntersectionPosTemp, PhotonLost, .TRUE.) + IF(PhotonLost)THEN + ASSOCIATE( LastPhotPos => PhotonProps%PhotonLastPos(1:3), & + Pos => PhotonProps%PhotonPos(1:3), & + Dir => PhotonProps%PhotonDirection(1:3) ) + CALL StoreLostPhotonProperties(LastPhotPos,Pos,Dir,ElemID) + NbrOfLostParticles=NbrOfLostParticles+1 + IF(DisplayLostParticles)THEN + IPWRITE(*,*) 'Error in Photon TriaTracking! PhotonIntersectionWithSide() cannot determine intersection'& + //' because photon is parallel to side. NbElemID:', NbElemID + IPWRITE(*,*) 'LastPos: ', PhotonProps%PhotonLastPos(1:3) + IPWRITE(*,*) 'Pos: ', PhotonProps%PhotonPos(1:3) + IPWRITE(*,*) 'Direction:', PhotonProps%PhotonDirection(1:3) + IPWRITE(*,*) 'Photon deleted!' + END IF ! DisplayLostParticles + END ASSOCIATE + Done = .TRUE. + EXIT + END IF ! PhotonLost + intersecDistVec(1:3) = IntersectionPosTemp(1:3) - PhotonProps%PhotonLastPos(1:3) + intersecDist = DOT_PRODUCT(intersecDistVec, intersecDistVec) + ! If the particle is inside the neighboring mortar element, it moved through this side + ! Ratio is always negative since detM(=detLastPartPos) is negative or zero, i.e. maximum abs is wanted + ! The closer the intersected side is to the last particle position the greater the absolute ratio will be + IF (intersecDist.LT.minRatio) THEN + IntersectionPos = IntersectionPosTemp + minRatio = intersecDist + SecondNrOfThroughSides = SecondNrOfThroughSides + 1 + SideID = GlobSideTemp(ind2) + LocalSide = LocSidesTemp(ind2) + TriNum = TriNumTemp(ind2) + oldElemIsMortar = .TRUE. + END IF + ELSE ! Regular side + CALL PhotonIntersectionWithSide(LocSidesTemp(ind2),ElemID,TriNumTemp(ind2), IntersectionPosTemp, PhotonLost) + IF(PhotonLost)THEN + ASSOCIATE( LastPhotPos => PhotonProps%PhotonLastPos(1:3), & + Pos => PhotonProps%PhotonPos(1:3), & + Dir => PhotonProps%PhotonDirection(1:3) ) + CALL StoreLostPhotonProperties(LastPhotPos,Pos,Dir,ElemID) + NbrOfLostParticles=NbrOfLostParticles+1 + IF(DisplayLostParticles)THEN + IPWRITE(*,*) 'Error in Photon TriaTracking! PhotonIntersectionWithSide() cannot determine intersection'& + //' because photon is parallel to side. ElemID:', ElemID + IPWRITE(*,*) 'LastPos: ', PhotonProps%PhotonLastPos(1:3) + IPWRITE(*,*) 'Pos: ', PhotonProps%PhotonPos(1:3) + IPWRITE(*,*) 'Direction:', PhotonProps%PhotonDirection(1:3) + IPWRITE(*,*) 'Photon deleted!' + END IF ! DisplayLostParticles + END ASSOCIATE + Done = .TRUE. + EXIT + END IF ! PhotonLost + intersecDistVec(1:3) = IntersectionPosTemp(1:3) - PhotonProps%PhotonLastPos(1:3) + intersecDist = DOT_PRODUCT(intersecDistVec, intersecDistVec) + IF (intersecDist.LT.minRatio) THEN + IntersectionPos = IntersectionPosTemp + minRatio = intersecDist + SecondNrOfThroughSides = SecondNrOfThroughSides + 1 + SideID = GlobSideTemp(ind2) + LocalSide = LocSidesTemp(ind2) + TriNum = TriNumTemp(ind2) + oldElemIsMortar = .FALSE. + END IF + END IF ! isMortarSideTemp = T/F + END IF ! doCheckSide + END DO ! ind2 = 1, NrOfThroughSides + ! Particle that went through multiple sides first, but did not cross any sides during the second check -> Deleted! + IF (SecondNrOfThroughSides.EQ.0) THEN + ASSOCIATE( LastPhotPos => PhotonProps%PhotonLastPos(1:3), & + Pos => PhotonProps%PhotonPos(1:3), & + Dir => PhotonProps%PhotonDirection(1:3) ) + CALL StoreLostPhotonProperties(LastPhotPos,Pos,Dir,ElemID) + NbrOfLostParticles=NbrOfLostParticles+1 + IF(DisplayLostParticles)THEN + IPWRITE(*,*) 'Error in Photon TriaTracking! Photon lost on second check. Element:', ElemID + IPWRITE(*,*) 'LastPos: ', PhotonProps%PhotonLastPos(1:3) + IPWRITE(*,*) 'Pos: ', PhotonProps%PhotonPos(1:3) + IPWRITE(*,*) 'Direction:', PhotonProps%PhotonDirection(1:3) + IPWRITE(*,*) 'Photon deleted!' + END IF ! DisplayLostParticles + END ASSOCIATE + Done = .TRUE. + EXIT + END IF + ELSE + ind2 = MINLOC(DistTemp(1:NrOfThroughSides),1) + IF (DistTemp(ind2).LE.0.0) THEN + print*, 'NrOfThroughSides', NrOfThroughSides, DistTemp(1:NrOfThroughSides) + CALL abort(__STAMP__,' ERROR: Side Distance is negative!') + END IF + SideID = GlobSideTemp(ind2) + LocalSide = LocSidesTemp(ind2) + TriNum = 1 + intersecDist = DistTemp(ind2) + oldElemIsMortar = .FALSE. + IntersectionPos(1:3) = PhotonProps%PhotonLastPos(1:3) + intersecDist*PhotonProps%PhotonDirection(1:3) END IF END IF ! NrOfThroughSides.EQ.0/.GT.1 END IF ! NrOfThroughSides.NE.1 @@ -550,27 +544,29 @@ SUBROUTINE PhotonTriaTracking() BCType = PartBound%TargetBoundCond(iPBC) SELECT CASE(BCType) CASE(1) !PartBound%OpenBC) - IF(NrOfThroughSides.LT.2)THEN - CALL PhotonIntersectionWithSide(LocalSide,ElemID,TriNum, IntersectionPos, PhotonLost) - IF(PhotonLost)THEN - ASSOCIATE( LastPhotPos => PhotonProps%PhotonLastPos(1:3), & - Pos => PhotonProps%PhotonPos(1:3), & - Dir => PhotonProps%PhotonDirection(1:3) ) - CALL StoreLostPhotonProperties(LastPhotPos,Pos,Dir,ElemID) - NbrOfLostParticles=NbrOfLostParticles+1 - IF(DisplayLostParticles)THEN - IPWRITE(*,*) 'Error in open BC Photon TriaTracking! PhotonIntersectionWithSide() cannot determine intersection'& - //' because photon is parallel to side. ElemID:', ElemID - IPWRITE(*,*) 'LastPos: ', PhotonProps%PhotonLastPos(1:3) - IPWRITE(*,*) 'Pos: ', PhotonProps%PhotonPos(1:3) - IPWRITE(*,*) 'Direction:', PhotonProps%PhotonDirection(1:3) - IPWRITE(*,*) 'Photon deleted!' - END IF ! DisplayLostParticles - END ASSOCIATE - Done = .TRUE. - EXIT - END IF ! PhotonLost - END IF ! NrOfThroughSides.LT.2 + IF(UsePhotonTriaTracking)THEN + IF(NrOfThroughSides.LT.2)THEN + CALL PhotonIntersectionWithSide(LocalSide,ElemID,TriNum, IntersectionPos, PhotonLost) + IF(PhotonLost)THEN + ASSOCIATE( LastPhotPos => PhotonProps%PhotonLastPos(1:3), & + Pos => PhotonProps%PhotonPos(1:3), & + Dir => PhotonProps%PhotonDirection(1:3) ) + CALL StoreLostPhotonProperties(LastPhotPos,Pos,Dir,ElemID) + NbrOfLostParticles=NbrOfLostParticles+1 + IF(DisplayLostParticles)THEN + IPWRITE(*,*) 'Error in open BC Photon TriaTracking! PhotonIntersectionWithSide() cannot determine intersection'& + //' because photon is parallel to side. ElemID:', ElemID + IPWRITE(*,*) 'LastPos: ', PhotonProps%PhotonLastPos(1:3) + IPWRITE(*,*) 'Pos: ', PhotonProps%PhotonPos(1:3) + IPWRITE(*,*) 'Direction:', PhotonProps%PhotonDirection(1:3) + IPWRITE(*,*) 'Photon deleted!' + END IF ! DisplayLostParticles + END ASSOCIATE + Done = .TRUE. + EXIT + END IF ! PhotonLost + END IF ! NrOfThroughSides.LT.2 + END IF CALL CalcAbsoprtion(IntersectionPos(1:3),ElemID, DONE) IF (RadObservationPointMethod.EQ.1) THEN IF (PointInObsCone(IntersectionPos(1:3))) THEN @@ -594,14 +590,14 @@ SUBROUTINE PhotonTriaTracking() ! Check if specular of diffuse reflection IF (PartBound%PhotonSpecularReflection(iPBC)) THEN ! Specular reflection - IF (NrOfThroughSides.LT.2) THEN + IF ((NrOfThroughSides.LT.2).AND.(UsePhotonTriaTracking)) THEN CALL PerfectPhotonReflection(LocalSide,ElemID,TriNum, IntersectionPos, .FALSE.) ELSE CALL PerfectPhotonReflection(LocalSide,ElemID,TriNum, IntersectionPos, .TRUE.) END IF ELSE ! Diffuse reflection - IF (NrOfThroughSides.LT.2) THEN + IF ((NrOfThroughSides.LT.2).AND.(UsePhotonTriaTracking)) THEN CALL DiffusePhotonReflection(LocalSide,ElemID,TriNum, IntersectionPos, .FALSE.) ELSE CALL DiffusePhotonReflection(LocalSide,ElemID,TriNum, IntersectionPos, .TRUE.) @@ -621,7 +617,7 @@ SUBROUTINE PhotonTriaTracking() END IF ! RadiationAbsorptionModel.EQ.0 CASE(3) ! PartBound%PeriodicBC - IF(NrOfThroughSides.LT.2)THEN + IF((NrOfThroughSides.LT.2).AND.(UsePhotonTriaTracking))THEN CALL PhotonIntersectionWithSide(LocalSide,ElemID,TriNum, IntersectionPos, PhotonLost) IF(PhotonLost)THEN ASSOCIATE( LastPhotPos => PhotonProps%PhotonLastPos(1:3), & @@ -707,9 +703,6 @@ SUBROUTINE PhotonTriaTracking() END IF ! PhotonLost END IF ! BC(SideID).GT./.LE. 0 - ! Store new position - PhotonProps%PhotonStartPos(1:3) = IntersectionPos(1:3) - ! Check if output to PartStateBoundary is activated IF(PhotonModeBPO.EQ.2)THEN CALL StoreBoundaryParticleProperties(0,& @@ -915,8 +908,7 @@ SUBROUTINE Photon2DSymTracking() END DO ! .NOT.PartisDone END SUBROUTINE Photon2DSymTracking -SUBROUTINE PhotonComputeBiLinearIntersection(isHit,PartTrajectory,lengthPartTrajectory,alpha,xitild,etatild & - ,PartID,SideID,ElemCheck_Opt,alpha2,LastPartPos_IN) +SUBROUTINE PhotonComputeBiLinearIntersection(isHit,SideID,Dist,ElemCheck_Opt) !=================================================================================================================================== ! Compute the Intersection with planar surface, improved version by ! Haselbacher, A.; Najjar, F. M. & Ferry, J. P., An efficient and robust particle-localization algorithm for unstructured grids @@ -931,6 +923,7 @@ SUBROUTINE PhotonComputeBiLinearIntersection(isHit,PartTrajectory,lengthPartTraj USE MOD_Particle_Surfaces ,ONLY: CalcNormAndTangBilinear USE MOD_Particle_Tracking_Vars ,ONLY: TrackingMethod USE MOD_Particle_Vars ,ONLY: PartState,LastPartPos!,PEM +USE MOD_Photon_TrackingVars ,ONLY: PhotonProps #ifdef CODE_ANALYZE USE MOD_Particle_Surfaces_Vars ,ONLY: BezierControlPoints3D USE MOD_Particle_Tracking_Vars ,ONLY: PartOut,MPIRankOut @@ -944,21 +937,17 @@ SUBROUTINE PhotonComputeBiLinearIntersection(isHit,PartTrajectory,lengthPartTraj IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES -REAL,INTENT(IN),DIMENSION(1:3) :: PartTrajectory -REAL,INTENT(IN) :: lengthPartTrajectory -INTEGER,INTENT(IN) :: PartID,SideID +INTEGER,INTENT(IN) :: SideID LOGICAL,INTENT(IN),OPTIONAL :: ElemCheck_Opt -REAL,INTENT(IN),OPTIONAL :: alpha2 -REAL,INTENT(IN),OPTIONAL :: LastPartPos_IN(1:3) +REAL, INTENT(OUT) :: Dist !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES -REAL,INTENT(OUT) :: alpha,xitild,etatild LOGICAL,INTENT(OUT) :: isHit !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES REAL,DIMENSION(4) :: a1,a2 REAL,DIMENSION(1:3,1:4) :: BiLinearCoeff,NormalCoeff -REAL :: A,B,C,alphaNorm +REAL :: A,B,C,alpha, xitild, etatild REAL :: xi(2),eta(2),t(2),scaleFac INTEGER :: CNSideID,InterType,nRoot LOGICAL :: ElemCheck @@ -978,38 +967,32 @@ SUBROUTINE PhotonComputeBiLinearIntersection(isHit,PartTrajectory,lengthPartTraj BiLinearCoeff(:,4) = 0.25*BaseVectors0(:,SideID) #ifdef CODE_ANALYZE - IF(PARTOUT.GT.0 .AND. MPIRANKOUT.EQ.MyRank)THEN - IF(PartID.EQ.PARTOUT)THEN - WRITE(UNIT_stdout,'(110("-"))') - WRITE(UNIT_stdout,'(A)') ' | Output of bilinear intersection equation constants: ' - WRITE(UNIT_stdout,'(A,3(1X,G0))') ' | SideNormVec : ',SideNormVec(1:3,CNSideID) - WRITE(UNIT_stdout,'(A,4(1X,G0))') ' | BilinearCoeff: ',BilinearCoeff(1,1:4) - WRITE(UNIT_stdout,'(A,4(1X,G0))') ' | BilinearCoeff: ',BilinearCoeff(2,1:4) - WRITE(UNIT_stdout,'(A,4(1X,G0))') ' | BilinearCoeff: ',BilinearCoeff(3,1:4) - WRITE(UNIT_stdout,'(A,3(1X,G0))') ' | Beziercontrolpoint1: ',BezierControlPoints3D(:,0,0,SideID) - WRITE(UNIT_stdout,'(A,3(1X,G0))') ' | Beziercontrolpoint2: ',BezierControlPoints3D(:,NGeo,0,SideID) - WRITE(UNIT_stdout,'(A,3(1X,G0))') ' | Beziercontrolpoint3: ',BezierControlPoints3D(:,0,NGeo,SideID) - WRITE(UNIT_stdout,'(A,3(1X,G0))') ' | Beziercontrolpoint4: ',BezierControlPoints3D(:,NGeo,NGeo,SideID) - END IF + IF(MPIRANKOUT.EQ.MyRank)THEN + WRITE(UNIT_stdout,'(110("-"))') + WRITE(UNIT_stdout,'(A)') ' | Output of bilinear intersection equation constants: ' + WRITE(UNIT_stdout,'(A,3(1X,G0))') ' | SideNormVec : ',SideNormVec(1:3,CNSideID) + WRITE(UNIT_stdout,'(A,4(1X,G0))') ' | BilinearCoeff: ',BilinearCoeff(1,1:4) + WRITE(UNIT_stdout,'(A,4(1X,G0))') ' | BilinearCoeff: ',BilinearCoeff(2,1:4) + WRITE(UNIT_stdout,'(A,4(1X,G0))') ' | BilinearCoeff: ',BilinearCoeff(3,1:4) + WRITE(UNIT_stdout,'(A,3(1X,G0))') ' | Beziercontrolpoint1: ',BezierControlPoints3D(:,0,0,SideID) + WRITE(UNIT_stdout,'(A,3(1X,G0))') ' | Beziercontrolpoint2: ',BezierControlPoints3D(:,NGeo,0,SideID) + WRITE(UNIT_stdout,'(A,3(1X,G0))') ' | Beziercontrolpoint3: ',BezierControlPoints3D(:,0,NGeo,SideID) + WRITE(UNIT_stdout,'(A,3(1X,G0))') ' | Beziercontrolpoint4: ',BezierControlPoints3D(:,NGeo,NGeo,SideID) END IF #endif /*CODE_ANALYZE*/ ! Check if the site can be encountered. Both vectors are already normalized -scaleFac = DOT_PRODUCT(PartTrajectory,SideNormVec(1:3,CNSideID)) +scaleFac = DOT_PRODUCT(PhotonProps%PhotonDirection,SideNormVec(1:3,CNSideID)) IF (ABS(scaleFac).LT.epsilontol) RETURN ! Haselbacher et al. define d = d - r_p -IF(PRESENT(LastPartPos_IN))THEN - BiLinearCoeff(:,4) = BiLinearCoeff(:,4) - LastPartPos_IN(1:3) -ELSE - BiLinearCoeff(:,4) = BiLinearCoeff(:,4) - LastPartPos(:,PartID) -END IF ! PRESENT(LastPartPos_IN) +BiLinearCoeff(:,4) = BiLinearCoeff(:,4) - PhotonProps%PhotonLastPos(1:3) ! Calculate component normal to ray -NormalCoeff(:,1) = BiLinearCoeff(:,1) - SUM(BiLinearCoeff(:,1)*PartTrajectory(:))*PartTrajectory -NormalCoeff(:,2) = BiLinearCoeff(:,2) - SUM(BiLinearCoeff(:,2)*PartTrajectory(:))*PartTrajectory -NormalCoeff(:,3) = BiLinearCoeff(:,3) - SUM(BiLinearCoeff(:,3)*PartTrajectory(:))*PartTrajectory -NormalCoeff(:,4) = BiLinearCoeff(:,4) - SUM(BiLinearCoeff(:,4)*PartTrajectory(:))*PartTrajectory +NormalCoeff(:,1) = BiLinearCoeff(:,1) - SUM(BiLinearCoeff(:,1)*PhotonProps%PhotonDirection(:))*PhotonProps%PhotonDirection +NormalCoeff(:,2) = BiLinearCoeff(:,2) - SUM(BiLinearCoeff(:,2)*PhotonProps%PhotonDirection(:))*PhotonProps%PhotonDirection +NormalCoeff(:,3) = BiLinearCoeff(:,3) - SUM(BiLinearCoeff(:,3)*PhotonProps%PhotonDirection(:))*PhotonProps%PhotonDirection +NormalCoeff(:,4) = BiLinearCoeff(:,4) - SUM(BiLinearCoeff(:,4)*PhotonProps%PhotonDirection(:))*PhotonProps%PhotonDirection ! A1 is X_xz = X_z - X_x A1(:) = NormalCoeff(3,:) - NormalCoeff(1,:) @@ -1031,11 +1014,9 @@ SUBROUTINE PhotonComputeBiLinearIntersection(isHit,PartTrajectory,lengthPartTraj CALL QuadraticSolver(A,B,C,nRoot,Eta(1),Eta(2)) #ifdef CODE_ANALYZE - IF(PARTOUT.GT.0 .AND. MPIRANKOUT.EQ.MyRank)THEN - IF(PartID.EQ.PARTOUT)THEN - WRITE(UNIT_stdout,'(A)') ' | Output after QuadraticSolver: ' - WRITE(UNIT_stdout,'(A,I0,A,2(1X,G0))') ' | number of root: ',nRoot,' | Eta: ',Eta(1:2) - END IF + IF(MPIRANKOUT.EQ.MyRank)THEN + WRITE(UNIT_stdout,'(A)') ' | Output after QuadraticSolver: ' + WRITE(UNIT_stdout,'(A,I0,A,2(1X,G0))') ' | number of root: ',nRoot,' | Eta: ',Eta(1:2) END IF #endif /*CODE_ANALYZE*/ @@ -1048,10 +1029,8 @@ SUBROUTINE PhotonComputeBiLinearIntersection(isHit,PartTrajectory,lengthPartTraj ! One possible intersection CASE(1) ! nRoot = 1 #ifdef CODE_ANALYZE - IF(PARTOUT.GT.0 .AND. MPIRANKOUT.EQ.MyRank)THEN - IF(PartID.EQ.PARTOUT)THEN - WRITE(UNIT_stdout,'(A)') ' | nRoot = 1 ' - END IF + IF(MPIRANKOUT.EQ.MyRank)THEN + WRITE(UNIT_stdout,'(A)') ' | nRoot = 1 ' END IF #endif /*CODE_ANALYZE*/ ! Check if eta is valid @@ -1060,46 +1039,28 @@ SUBROUTINE PhotonComputeBiLinearIntersection(isHit,PartTrajectory,lengthPartTraj xi(1) = ComputeXi(eta(1),A1=A1,A2=A2) IF (Xi(1).EQ.HUGE(1.)) THEN - return + RETURN IPWRITE(UNIT_stdOut,'(I0,A,I0)') ' Both denominators zero when calculating Xi in bilinear intersection' - IPWRITE(UNIT_stdOut,'(I0,A,I0)') ' PartID: ', PartID IPWRITE(UNIT_stdOut,'(I0,A,I0)') ' global SideID: ', SideID IPWRITE(UNIT_stdOut,'(I0,A,I0)') ' global ElemID: ', SideInfo_Shared(SIDE_ELEMID,SideID) - IPWRITE(UNIT_stdOut,'(I0,A,3(1X,ES25.17E3))') ' LastPartPos: ', LastPartPos(1:3,PartID) - IPWRITE(UNIT_stdOut,'(I0,A,3(1X,ES25.17E3))') ' PartPos: ', PartState (1:3,PartID) + IPWRITE(UNIT_stdOut,'(I0,A,3(1X,ES25.17E3))') ' LastPhotonPos: ', PhotonProps%PhotonLastPos(1:3) + IPWRITE(UNIT_stdOut,'(I0,A,3(1X,ES25.17E3))') ' PhotonDirection: ', PhotonProps%PhotonDirection(1:3) CALL ABORT(__STAMP__,'Invalid intersection with bilinear side!',SideID) END IF IF( ABS(xi(1)).LE.1.0) THEN ! compute alpha only with valid xi and eta - t(1) = ComputeSurfaceDistance2(BiLinearCoeff,xi(1),eta(1),PartTrajectory) + t(1) = ComputeSurfaceDistance2(BiLinearCoeff,xi(1),eta(1),PhotonProps%PhotonDirection) - IF (PRESENT(alpha2)) THEN - IF (alpha2.GT.-1.0 .AND. ALMOSTEQUAL(t(1),alpha2)) THEN - t(1) = -1.0 -#ifdef CODE_ANALYZE - IF(PARTOUT.GT.0 .AND. MPIRANKOUT.EQ.MyRank)THEN - IF(PartID.EQ.PARTOUT)THEN - WRITE(UNIT_stdout,'(A)') 'changed t1' - END IF - END IF -#endif /*CODE_ANALYZE*/ - END IF - END IF - - ! Normalize alpha to unitLength - alphaNorm = t(1)/lengthPartTrajectory - - IF ((alphaNorm.LE.1.0) .AND.(alphaNorm.GE.0.)) THEN + IF (t(1).GT.0.) THEN alpha = t(1) xitild = xi(1) etatild = eta(1) isHit = .TRUE. + Dist = t(1) #ifdef CODE_ANALYZE - IF(PARTOUT.GT.0 .AND. MPIRANKOUT.EQ.MyRank)THEN - IF(PartID.EQ.PARTOUT)THEN - WRITE(UNIT_stdout,'(A,G0,A,G0)') ' | alphanorm: ',alphaNorm,' | epsilonTolerance: ',epsilontol - END IF + IF(MPIRANKOUT.EQ.MyRank)THEN + WRITE(UNIT_stdout,'(A,G0,A,G0)') ' | t(1): ',t(1),' | epsilonTolerance: ',epsilontol END IF #endif /*CODE_ANALYZE*/ ! This is the only possible intersection, so we are done @@ -1116,10 +1077,8 @@ SUBROUTINE PhotonComputeBiLinearIntersection(isHit,PartTrajectory,lengthPartTraj CASE(2) ! nRoot = 2 #ifdef CODE_ANALYZE - IF(PARTOUT.GT.0 .AND. MPIRANKOUT.EQ.MyRank)THEN - IF(PartID.EQ.PARTOUT)THEN - WRITE(UNIT_stdout,'(A)') ' | nRoot = 2 ' - END IF + IF(MPIRANKOUT.EQ.MyRank)THEN + WRITE(UNIT_stdout,'(A)') ' | nRoot = 2 ' END IF #endif /*CODE_ANALYZE*/ InterType = 0 @@ -1133,50 +1092,29 @@ SUBROUTINE PhotonComputeBiLinearIntersection(isHit,PartTrajectory,lengthPartTraj IF (Xi(1).EQ.HUGE(1.)) THEN return IPWRITE(UNIT_stdOut,'(I0,A,I0)') ' Both denominators zero when calculating Xi in bilinear intersection' - IPWRITE(UNIT_stdOut,'(I0,A,I0)') ' PartID: ', PartID IPWRITE(UNIT_stdOut,'(I0,A,I0)') ' global SideID: ', SideID IPWRITE(UNIT_stdOut,'(I0,A,I0)') ' global ElemID: ', SideInfo_Shared(SIDE_ELEMID,SideID) - IPWRITE(UNIT_stdOut,'(I0,A,3(1X,ES25.17E3))') ' LastPartPos: ', LastPartPos(1:3,PartID) - IPWRITE(UNIT_stdOut,'(I0,A,3(1X,ES25.17E3))') ' PartPos: ', PartState (1:3,PartID) + IPWRITE(UNIT_stdOut,'(I0,A,3(1X,ES25.17E3))') ' LastPhotonPos: ', PhotonProps%PhotonLastPos(1:3) + IPWRITE(UNIT_stdOut,'(I0,A,3(1X,ES25.17E3))') ' PhotonDirection: ', PhotonProps%PhotonDirection(1:3) CALL ABORT(__STAMP__,'Invalid intersection with bilinear side!',SideID) END IF IF( ABS(xi(1)).LE.1.0) THEN ! compute alpha only with valid xi and eta - t(1) = ComputeSurfaceDistance2(BiLinearCoeff,xi(1),eta(1),PartTrajectory) + t(1) = ComputeSurfaceDistance2(BiLinearCoeff,xi(1),eta(1),PhotonProps%PhotonDirection) - IF (PRESENT(alpha2)) THEN - IF (alpha2.GT.-1.0 .AND. ALMOSTEQUAL(t(1),alpha2)) THEN #ifdef CODE_ANALYZE - IF(PARTOUT.GT.0 .AND. MPIRANKOUT.EQ.MyRank)THEN - IF(PartID.EQ.PARTOUT)THEN - WRITE(UNIT_stdout,'(A)') 'changed t1' - END IF - END IF -#endif /*CODE_ANALYZE*/ - t(1) = -1.0 - END IF - END IF - - ! Normalize alpha to unitLength - alphaNorm = t(1)/lengthPartTrajectory - -#ifdef CODE_ANALYZE - IF(PARTOUT.GT.0 .AND. MPIRANKOUT.EQ.MyRank)THEN - IF(PartID.EQ.PARTOUT)THEN - WRITE(UNIT_stdout,'(A,G0,A,G0,A,G0)') ' | xi: ',xi(1),' | t: ',t(1),' | alphaNorm: ',alphaNorm - END IF + IF(MPIRANKOUT.EQ.MyRank)THEN + WRITE(UNIT_stdout,'(A,G0,A,G0)') ' | xi: ',xi(1),' | t: ',t(1) END IF #endif /*CODE_ANALYZE*/ - IF ((alphaNorm.LE.1.0) .AND.(alphaNorm.GE.0.)) THEN + IF (t(1).GT.0.) THEN InterType = InterType+1 isHit = .TRUE. #ifdef CODE_ANALYZE - IF(PARTOUT.GT.0 .AND. MPIRANKOUT.EQ.MyRank)THEN - IF(PartID.EQ.PARTOUT)THEN - WRITE(UNIT_stdout,'(A,E15.8,A,E15.8)') ' | alphanorm1: ',alphaNorm,' | epsilonTolerance: ',epsilontol - END IF + IF(MPIRANKOUT.EQ.MyRank)THEN + WRITE(UNIT_stdout,'(A,E15.8,A,E15.8)') ' | t(1): ',t(1),' | epsilonTolerance: ',epsilontol END IF #endif /*CODE_ANALYZE*/ END IF @@ -1191,50 +1129,29 @@ SUBROUTINE PhotonComputeBiLinearIntersection(isHit,PartTrajectory,lengthPartTraj IF (Xi(2).EQ.HUGE(1.)) THEN return IPWRITE(UNIT_stdOut,'(I0,A,I0)') ' Both denominators zero when calculating Xi in bilinear intersection' - IPWRITE(UNIT_stdOut,'(I0,A,I0)') ' PartID: ', PartID IPWRITE(UNIT_stdOut,'(I0,A,I0)') ' global SideID: ', SideID IPWRITE(UNIT_stdOut,'(I0,A,I0)') ' global ElemID: ', SideInfo_Shared(SIDE_ELEMID,SideID) - IPWRITE(UNIT_stdOut,'(I0,A,3(1X,ES25.17E3))') ' LastPartPos: ', LastPartPos(1:3,PartID) - IPWRITE(UNIT_stdOut,'(I0,A,3(1X,ES25.17E3))') ' PartPos: ', PartState (1:3,PartID) + IPWRITE(UNIT_stdOut,'(I0,A,3(1X,ES25.17E3))') ' LastPhotonPos: ', PhotonProps%PhotonLastPos(1:3) + IPWRITE(UNIT_stdOut,'(I0,A,3(1X,ES25.17E3))') ' PhotonDirection: ', PhotonProps%PhotonDirection(1:3) CALL ABORT(__STAMP__,'Invalid intersection with bilinear side!',SideID) END IF IF( ABS(xi(2)).LE.1.0) THEN ! compute alpha only with valid xi and eta - t(2) = ComputeSurfaceDistance2(BiLinearCoeff,xi(2),eta(2),PartTrajectory) - - IF (PRESENT(alpha2)) THEN - IF (alpha2.GT.-1.0 .AND. ALMOSTEQUAL(t(2),alpha2)) THEN - t(2) = -1.0 -#ifdef CODE_ANALYZE - IF(PARTOUT.GT.0 .AND. MPIRANKOUT.EQ.MyRank)THEN - IF(PartID.EQ.PARTOUT)THEN - WRITE(UNIT_stdout,'(A)') 'changed t2' - END IF - END IF -#endif /*CODE_ANALYZE*/ - END IF - END IF - - ! Normalize alpha to unitLength - alphaNorm = t(2)/lengthPartTrajectory + t(2) = ComputeSurfaceDistance2(BiLinearCoeff,xi(2),eta(2),PhotonProps%PhotonDirection) #ifdef CODE_ANALYZE - IF(PARTOUT.GT.0 .AND. MPIRANKOUT.EQ.MyRank)THEN - IF(PartID.EQ.PARTOUT)THEN - WRITE(UNIT_stdout,'(A,G0,A,G0,A,G0)') ' | xi: ',xi(2),' | t: ',t(2),' | alphaNorm: ',alphaNorm - END IF + IF(MPIRANKOUT.EQ.MyRank)THEN + WRITE(UNIT_stdout,'(A,G0,A,G0)') ' | xi: ',xi(2),' | t: ',t(2) END IF #endif /*CODE_ANALYZE*/ - IF ((alphaNorm.LE.1.0) .AND.(alphaNorm.GE.0.)) THEN + IF (t(2).GT.0.) THEN InterType = InterType+2 isHit = .TRUE. #ifdef CODE_ANALYZE - IF(PARTOUT.GT.0 .AND. MPIRANKOUT.EQ.MyRank)THEN - IF(PartID.EQ.PARTOUT)THEN - WRITE(UNIT_stdout,'(A,E15.8,A,E15.8)') ' | alphanorm2: ',alphaNorm,' | epsilonTolerance: ',epsilontol - END IF + IF(MPIRANKOUT.EQ.MyRank)THEN + WRITE(UNIT_stdout,'(A,E15.8,A,E15.8)') ' | t(2): ',t(2),' | epsilonTolerance: ',epsilontol END IF #endif /*CODE_ANALYZE*/ END IF @@ -1251,54 +1168,43 @@ SUBROUTINE PhotonComputeBiLinearIntersection(isHit,PartTrajectory,lengthPartTraj alpha =t (1) xitild =xi (1) etatild=eta(1) + Dist = t(1) ! Second intersection is only hit CASE(2) alpha =t (2) xitild =xi (2) etatild=eta(2) + Dist = t(2) ! Two intersections found, decide on the correct one CASE(3) ! If side is a BC side, take only the intersection encountered first IF (SideInfo_Shared(SIDE_BCID,SideID).GT.0) THEN - SELECT CASE(TrackingMethod) - ! Take the one encountered first - CASE(REFMAPPING) - IF(t(1).LT.t(2))THEN - alpha =t (1) - xitild =xi (1) - etatild=eta(1) - ELSE - alpha =t (2) - xitild =xi (2) - etatild=eta(2) - END IF - - CASE(TRACING) - ! Check if the element is supposed to be checked - ElemCheck = .FALSE. - IF(PRESENT(ElemCheck_Opt))THEN - ElemCheck = ElemCheck_Opt - END IF + ! Check if the element is supposed to be checked + ElemCheck = .FALSE. + IF(PRESENT(ElemCheck_Opt))THEN + ElemCheck = ElemCheck_Opt + END IF - IF(ElemCheck)THEN - alpha =-1 - xitild =-2 - etatild=-2 - ELSE - ! Apparently we don't care about the direction of the PartTrajectory - IF(ABS(t(1)).LT.ABS(t(2)))THEN - alpha =t (1) - xitild =xi (1) - etatild=eta(1) - ELSE - alpha =t (2) - xitild =xi (2) - etatild=eta(2) - END IF - END IF - END SELECT ! TrackingMethod + IF(ElemCheck)THEN + alpha =-1 + xitild =-2 + etatild=-2 + ELSE + ! Apparently we don't care about the direction of the PartTrajectory + IF(ABS(t(1)).LT.ABS(t(2)))THEN + alpha =t (1) + xitild =xi (1) + etatild=eta(1) + Dist = t(1) + ELSE + alpha =t (2) + xitild =xi (2) + etatild=eta(2) + Dist = t(2) + END IF + END IF ! Inner side with double intersection, particle leaves and enters element ELSE alpha =-1 diff --git a/src/radiation/ray_tracing/raytrace.f90 b/src/radiation/ray_tracing/raytrace.f90 index 5a4e357aa..42b24a182 100644 --- a/src/radiation/ray_tracing/raytrace.f90 +++ b/src/radiation/ray_tracing/raytrace.f90 @@ -162,9 +162,6 @@ SUBROUTINE RayTracing() PartStateBoundary=0. END IF ! .NOT.ALLOCATED(PartStateBoundary) -! Bilinear tracking requires shorter movement vectors for the rays, otherwise it hangs -IF(.NOT.UsePhotonTriaTracking) Ray%Direction = Ray%Direction*0.01 - DO iRay = 1, LocRayNum IF(MPIroot.AND.(MOD(RayVisCount,RayDisp).EQ.0)) CALL PrintStatusLineRadiation(REAL(RayVisCount),0.0,REAL(LocRayNum),.TRUE.) RayVisCount = RayVisCount + 1 From 080a000b99c83c7f68ff4e42bff35102e7efd687 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Fri, 3 Nov 2023 15:51:12 +0100 Subject: [PATCH 309/495] Typo fixed in .gitlab-ci.yml (build_radiation) --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b85641e4e..0825570ff 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -358,7 +358,7 @@ build_DSMC: - if [ -n "${DO_WEEKLY}" ]; then cd ..; mkdir -p build_radiation ; cd build_radiation; - cmake -GNinja .. -DLIBS_BUILD_HDF5=OFF -DPICLAS_BUILD_POSTI=ON -DPOSTI_BUILD_SUPERB=ON -DPICLAS_READIN_CONSTANTS=ON -DPICLAS_TIMEDISCMETHOD=Radiation -DPICLAS_INTKIND8=ON ; ninja -j0 all + cmake -GNinja .. -DLIBS_BUILD_HDF5=OFF -DPICLAS_BUILD_POSTI=ON -DPOSTI_BUILD_SUPERB=ON -DPICLAS_READIN_CONSTANTS=ON -DPICLAS_TIMEDISCMETHOD=Radiation -DPICLAS_INTKIND8=ON ; ninja -j0 all; fi build_hopr: From a0f92629d847d50fce8cf70ef11959dd48548f62 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Fri, 3 Nov 2023 16:25:52 +0100 Subject: [PATCH 310/495] Added ray tracing reggie for periodic sides --- .../DSMC.ini | 71 ++++ .../Electrons_ref.csv | 22 ++ .../analyze.ini | 8 + .../command_line.ini | 2 + .../export.neu | 333 ++++++++++++++++++ .../externals.ini | 6 + .../hopr.ini | 31 ++ .../parameter.ini | 163 +++++++++ .../readme.md | 13 + 9 files changed, 649 insertions(+) create mode 100644 regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/DSMC.ini create mode 100644 regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/Electrons_ref.csv create mode 100644 regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/analyze.ini create mode 100644 regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/command_line.ini create mode 100644 regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/export.neu create mode 100644 regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/externals.ini create mode 100644 regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/hopr.ini create mode 100644 regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/parameter.ini create mode 100644 regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/readme.md diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/DSMC.ini b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/DSMC.ini new file mode 100644 index 000000000..f0b045264 --- /dev/null +++ b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/DSMC.ini @@ -0,0 +1,71 @@ + +! =============================================================================== ! +! Species1, H2 +! =============================================================================== ! +Part-Species1-SpeciesName = H2 +Part-Species1-InteractionID = 2 +Part-Species1-Tref = 1000 +Part-Species1-dref = 2.68E-10 +Part-Species1-omega = 0.407 +Part-Species1-HeatOfFormation_K = 0.0 +Part-Species1-CharaTempVib = 6332.37 +Part-Species1-Ediss_eV = 4.47 +! =============================================================================== ! +! Species2, H +! =============================================================================== ! +Part-Species2-SpeciesName = H +Part-Species2-InteractionID = 1 +Part-Species2-Tref = 1000 +Part-Species2-dref = 2.581E-10 +Part-Species2-omega = 0.407 +Part-Species2-HeatOfFormation_K = 26159.76 +! =============================================================================== ! +! Species3, e +! =============================================================================== ! +Part-Species3-SpeciesName = electron +Part-Species3-InteractionID = 4 +Part-Species3-Tref = 1000 +Part-Species3-dref = 2.817920E-15 +Part-Species3-omega = 0.407 +! =============================================================================== ! +! Species4, H2Ion +! =============================================================================== ! +Part-Species4-SpeciesName = H2Ion1 +Part-Species4-InteractionID = 20 +Part-Species4-Tref = 1000 +Part-Species4-dref = 3.883E-10 +Part-Species4-omega = 0.407 +Part-Species4-CharaTempVib = 3341.01 +Part-Species4-Ediss_eV = 2.65 +Part-Species4-PreviousState = 1 +! =============================================================================== ! +! Species5, HIon +! =============================================================================== ! +Part-Species5-SpeciesName = HIon1 +Part-Species5-InteractionID = 10 +Part-Species5-Tref = 1000 +Part-Species5-dref = 3.912E-10 +Part-Species5-omega = 0.407 +Part-Species5-PreviousState = 2 + + + +! =============================================================================== ! +! Reactions +! =============================================================================== ! +DSMC-NumOfReactions = 2 + +! ---------------------------------------------------- +! Photo-ionization (electron species should be at the first or second position of the product array) +! ---------------------------------------------------- +! Reaction 1 | H2 + photon --> H2Ion + e +DSMC-Reaction1-ReactionModel = phIon +DSMC-Reaction1-Reactants = (/1,0,0/) +DSMC-Reaction1-Products = (/4,3,0,0/) +DSMC-Reaction1-CrossSection = 4.84E-24 + +! Reaction 2 | H2 + photon --> H + HIon + e +DSMC-Reaction2-ReactionModel = phIon +DSMC-Reaction2-Reactants = (/1,0,0/) +DSMC-Reaction2-Products = (/2,3,5,0/) +DSMC-Reaction2-CrossSection = 8.3E-25 diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/Electrons_ref.csv b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/Electrons_ref.csv new file mode 100644 index 000000000..8ccf38709 --- /dev/null +++ b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/Electrons_ref.csv @@ -0,0 +1,22 @@ +"electrons" +0.0000000000000000E+000 +0.5099999999999998E+008 +0.3099999999999999E+009 +0.1377999999999999E+010 +0.4912999999999998E+010 +0.1431799999999999E+011 +0.3443899999999998E+011 +0.6904099999999997E+011 +0.1168840000000000E+012 +0.1700699999999999E+012 +0.2176069999999999E+012 +0.2517669999999999E+012 +0.2715039999999999E+012 +0.2806709999999999E+012 +0.2840939999999999E+012 +0.2851209999999999E+012 +0.2853689999999999E+012 +0.2854169999999999E+012 +0.2854169999999999E+012 +0.2854169999999999E+012 +0.2854169999999999E+012 diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/analyze.ini b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/analyze.ini new file mode 100644 index 000000000..88c8f857e --- /dev/null +++ b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/analyze.ini @@ -0,0 +1,8 @@ +! =================================================================================================================== +! compare column +! =================================================================================================================== +compare_column_file = PartAnalyze.csv ! data file name +compare_column_reference_file = Electrons_ref.csv ! data file name +compare_column_index = 9 ! column index for comparison +compare_column_tolerance_value = 10e9 ! tolerance (depends on machine accuracy and MPI) +compare_column_tolerance_type = absolute ! absolute or relative tolerance diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/command_line.ini b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/command_line.ini new file mode 100644 index 000000000..73e8d46c3 --- /dev/null +++ b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/command_line.ini @@ -0,0 +1,2 @@ +MPI = 1,2,5,8 +cmd_suffix = DSMC.ini diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/export.neu b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/export.neu new file mode 100644 index 000000000..e02a9739b --- /dev/null +++ b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/export.neu @@ -0,0 +1,333 @@ + CONTROL INFO 2.4.6 +** GAMBIT NEUTRAL FILE +/media/nizenkov/storage/boltzplatz/Projects/Zeiss/012-SMT-Dinger-P23006-MEMS-Raytracing/3-TestCases/meshes/2023-08-25-M0X-Debug-Cubit-3to1/export.neu +PROGRAM: Coreform_Cubit VERSION: 2023.4 + + NUMNP NELEM NGRPS NBSETS NDFCD NDFVL + 96 49 2 6 3 3 +ENDOFSECTION + NODAL COORDINATES 2.4.6 + 1 5.00000000000e-01 5.00000000000e-01 0.00000000000e+00 + 2 1.77136438333e-01 5.00000000000e-01 5.80800343049e-02 + 3 1.65922930089e-01 5.00000000000e-01 -1.33442609378e-01 + 4 5.00000000000e-01 5.00000000000e-01 -1.66666666667e-01 + 5 5.00000000000e-01 1.77136438333e-01 5.80800343049e-02 + 6 1.76708380738e-01 1.79483363067e-01 -1.92732493396e-02 + 7 1.70986215705e-01 1.71365536089e-01 -1.75388514517e-01 + 8 5.00000000000e-01 1.65922930089e-01 -1.33442609378e-01 + 9 -1.77136438333e-01 5.00000000000e-01 5.80800343049e-02 + 10 -1.65922930089e-01 5.00000000000e-01 -1.33442609378e-01 + 11 -1.76757698738e-01 1.79371924687e-01 -1.91878832863e-02 + 12 -1.70841566289e-01 1.71382951399e-01 -1.75183210145e-01 + 13 -5.00000000000e-01 5.00000000000e-01 0.00000000000e+00 + 14 -5.00000000000e-01 5.00000000000e-01 -1.66666666667e-01 + 15 -5.00000000000e-01 1.77136438333e-01 5.80800343049e-02 + 16 -5.00000000000e-01 1.65922930089e-01 -1.33442609378e-01 + 17 1.64873215942e-01 5.00000000000e-01 -3.18360801562e-01 + 18 5.00000000000e-01 5.00000000000e-01 -3.33333333333e-01 + 19 1.68050720983e-01 1.68046773869e-01 -3.36720028064e-01 + 20 5.00000000000e-01 1.64873215942e-01 -3.18360801562e-01 + 21 -1.64873215942e-01 5.00000000000e-01 -3.18360801562e-01 + 22 -1.67970039349e-01 1.68135871499e-01 -3.36483981681e-01 + 23 -5.00000000000e-01 5.00000000000e-01 -3.33333333333e-01 + 24 -5.00000000000e-01 1.64873215942e-01 -3.18360801562e-01 + 25 1.66666666667e-01 5.00000000000e-01 -5.00000000000e-01 + 26 5.00000000000e-01 5.00000000000e-01 -5.00000000000e-01 + 27 1.66666666667e-01 1.66666666667e-01 -5.00000000000e-01 + 28 5.00000000000e-01 1.66666666667e-01 -5.00000000000e-01 + 29 -1.66666666667e-01 5.00000000000e-01 -5.00000000000e-01 + 30 -1.66666666667e-01 1.66666666667e-01 -5.00000000000e-01 + 31 -5.00000000000e-01 5.00000000000e-01 -5.00000000000e-01 + 32 -5.00000000000e-01 1.66666666667e-01 -5.00000000000e-01 + 33 5.00000000000e-01 -1.77136438333e-01 5.80800343049e-02 + 34 1.76733273392e-01 -1.79406401063e-01 -1.91723599758e-02 + 35 1.70962160892e-01 -1.71408003494e-01 -1.75207218157e-01 + 36 5.00000000000e-01 -1.65922930089e-01 -1.33442609378e-01 + 37 -1.76629794550e-01 -1.79429072538e-01 -1.90680848152e-02 + 38 -1.70853129197e-01 -1.71364388408e-01 -1.74988002849e-01 + 39 -5.00000000000e-01 -1.77136438333e-01 5.80800343049e-02 + 40 -5.00000000000e-01 -1.65922930089e-01 -1.33442609378e-01 + 41 1.68040989340e-01 -1.68118176892e-01 -3.36635631438e-01 + 42 5.00000000000e-01 -1.64873215942e-01 -3.18360801562e-01 + 43 -1.68055817370e-01 -1.68109323888e-01 -3.36359806400e-01 + 44 -5.00000000000e-01 -1.64873215942e-01 -3.18360801562e-01 + 45 1.66666666667e-01 -1.66666666667e-01 -5.00000000000e-01 + 46 5.00000000000e-01 -1.66666666667e-01 -5.00000000000e-01 + 47 -1.66666666667e-01 -1.66666666667e-01 -5.00000000000e-01 + 48 -5.00000000000e-01 -1.66666666667e-01 -5.00000000000e-01 + 49 5.00000000000e-01 -5.00000000000e-01 0.00000000000e+00 + 50 1.77136438333e-01 -5.00000000000e-01 5.80800343049e-02 + 51 1.65922930089e-01 -5.00000000000e-01 -1.33442609378e-01 + 52 5.00000000000e-01 -5.00000000000e-01 -1.66666666667e-01 + 53 -1.77136438333e-01 -5.00000000000e-01 5.80800343049e-02 + 54 -1.65922930089e-01 -5.00000000000e-01 -1.33442609378e-01 + 55 -5.00000000000e-01 -5.00000000000e-01 0.00000000000e+00 + 56 -5.00000000000e-01 -5.00000000000e-01 -1.66666666667e-01 + 57 1.64873215942e-01 -5.00000000000e-01 -3.18360801562e-01 + 58 5.00000000000e-01 -5.00000000000e-01 -3.33333333333e-01 + 59 -1.64873215942e-01 -5.00000000000e-01 -3.18360801562e-01 + 60 -5.00000000000e-01 -5.00000000000e-01 -3.33333333333e-01 + 61 1.66666666667e-01 -5.00000000000e-01 -5.00000000000e-01 + 62 5.00000000000e-01 -5.00000000000e-01 -5.00000000000e-01 + 63 -1.66666666667e-01 -5.00000000000e-01 -5.00000000000e-01 + 64 -5.00000000000e-01 -5.00000000000e-01 -5.00000000000e-01 + 65 5.00000000000e-01 5.00000000000e-01 5.00000000000e-01 + 66 1.71618098554e-01 5.00000000000e-01 2.68543406174e-01 + 67 1.75224475667e-01 1.87325558653e-01 1.24315387207e-01 + 68 5.00000000000e-01 1.71618098554e-01 2.68543406174e-01 + 69 -1.71618098554e-01 5.00000000000e-01 2.68543406174e-01 + 70 -1.75305352846e-01 1.87236259741e-01 1.24326964392e-01 + 71 -5.00000000000e-01 5.00000000000e-01 5.00000000000e-01 + 72 -5.00000000000e-01 1.71618098554e-01 2.68543406174e-01 + 73 1.75308731395e-01 -1.87246304991e-01 1.24358939826e-01 + 74 5.00000000000e-01 -1.71618098554e-01 2.68543406174e-01 + 75 -1.75182745767e-01 -1.87299782629e-01 1.24378343577e-01 + 76 -5.00000000000e-01 -1.71618098554e-01 2.68543406174e-01 + 77 1.71618098554e-01 -5.00000000000e-01 2.68543406174e-01 + 78 5.00000000000e-01 -5.00000000000e-01 5.00000000000e-01 + 79 -1.71618098554e-01 -5.00000000000e-01 2.68543406174e-01 + 80 -5.00000000000e-01 -5.00000000000e-01 5.00000000000e-01 + 81 1.66666666667e-01 -1.66666666667e-01 -8.30000000000e-01 + 82 5.00000000000e-01 -1.66666666667e-01 -8.30000000000e-01 + 83 5.00000000000e-01 -5.00000000000e-01 -8.30000000000e-01 + 84 1.66666666667e-01 -5.00000000000e-01 -8.30000000000e-01 + 85 -1.66666666667e-01 -1.66666666667e-01 -8.30000000000e-01 + 86 -1.66666666667e-01 -5.00000000000e-01 -8.30000000000e-01 + 87 -5.00000000000e-01 -1.66666666667e-01 -8.30000000000e-01 + 88 -5.00000000000e-01 -5.00000000000e-01 -8.30000000000e-01 + 89 1.66666666667e-01 1.66666666667e-01 -8.30000000000e-01 + 90 5.00000000000e-01 1.66666666667e-01 -8.30000000000e-01 + 91 -1.66666666667e-01 1.66666666667e-01 -8.30000000000e-01 + 92 -5.00000000000e-01 1.66666666667e-01 -8.30000000000e-01 + 93 1.66666666667e-01 5.00000000000e-01 -8.30000000000e-01 + 94 5.00000000000e-01 5.00000000000e-01 -8.30000000000e-01 + 95 -1.66666666667e-01 5.00000000000e-01 -8.30000000000e-01 + 96 -5.00000000000e-01 5.00000000000e-01 -8.30000000000e-01 +ENDOFSECTION + ELEMENTS/CELLS 2.4.6 + 1 4 8 1 2 4 3 5 6 8 + 7 + 2 4 8 2 9 3 10 6 11 7 + 12 + 3 4 8 9 13 10 14 11 15 12 + 16 + 4 4 8 4 3 18 17 8 7 20 + 19 + 5 4 8 3 10 17 21 7 12 19 + 22 + 6 4 8 10 14 21 23 12 16 22 + 24 + 7 4 8 18 17 26 25 20 19 28 + 27 + 8 4 8 17 21 25 29 19 22 27 + 30 + 9 4 8 21 23 29 31 22 24 30 + 32 + 10 4 8 5 6 8 7 33 34 36 + 35 + 11 4 8 6 11 7 12 34 37 35 + 38 + 12 4 8 11 15 12 16 37 39 38 + 40 + 13 4 8 8 7 20 19 36 35 42 + 41 + 14 4 8 7 12 19 22 35 38 41 + 43 + 15 4 8 12 16 22 24 38 40 43 + 44 + 16 4 8 20 19 28 27 42 41 46 + 45 + 17 4 8 19 22 27 30 41 43 45 + 47 + 18 4 8 22 24 30 32 43 44 47 + 48 + 19 4 8 33 34 36 35 49 50 52 + 51 + 20 4 8 34 37 35 38 50 53 51 + 54 + 21 4 8 37 39 38 40 53 55 54 + 56 + 22 4 8 36 35 42 41 52 51 58 + 57 + 23 4 8 35 38 41 43 51 54 57 + 59 + 24 4 8 38 40 43 44 54 56 59 + 60 + 25 4 8 42 41 46 45 58 57 62 + 61 + 26 4 8 41 43 45 47 57 59 61 + 63 + 27 4 8 43 44 47 48 59 60 63 + 64 + 28 4 8 1 2 5 6 65 66 68 + 67 + 29 4 8 2 9 6 11 66 69 67 + 70 + 30 4 8 9 13 11 15 69 71 70 + 72 + 31 4 8 5 6 33 34 68 67 74 + 73 + 32 4 8 6 11 34 37 67 70 73 + 75 + 33 4 8 11 15 37 39 70 72 75 + 76 + 34 4 8 33 34 49 50 74 73 78 + 77 + 35 4 8 34 37 50 53 73 75 77 + 79 + 36 4 8 37 39 53 55 75 76 79 + 80 + 37 4 8 67 70 73 75 68 72 74 + 76 + 38 4 8 68 72 74 76 65 71 78 + 80 + 39 4 8 66 69 67 70 65 71 68 + 72 + 40 4 8 73 75 77 79 74 76 78 + 80 + 41 4 8 45 46 61 62 81 82 84 + 83 + 42 4 8 47 45 63 61 85 81 86 + 84 + 43 4 8 48 47 64 63 87 85 88 + 86 + 44 4 8 27 28 45 46 89 90 81 + 82 + 45 4 8 30 27 47 45 91 89 85 + 81 + 46 4 8 32 30 48 47 92 91 87 + 85 + 47 4 8 25 26 27 28 93 94 89 + 90 + 48 4 8 29 25 30 27 95 93 91 + 89 + 49 4 8 31 29 32 30 96 95 92 + 91 +ENDOFSECTION + ELEMENT GROUP 2.4.6 +GROUP: 1 ELEMENTS: 40 MATERIAL: 0 NFLAGS: 0 + Block 1 + + + 1 2 3 4 5 6 7 8 9 10 + 11 12 13 14 15 16 17 18 19 20 + 21 22 23 24 25 26 27 28 29 30 + 31 32 33 34 35 36 37 38 39 40 +ENDOFSECTION + ELEMENT GROUP 2.4.6 +GROUP: 2 ELEMENTS: 9 MATERIAL: 0 NFLAGS: 0 + Block 2 + + + 41 42 43 44 45 46 47 48 49 +ENDOFSECTION + BOUNDARY CONDITIONS 2.4.6 + BC_TOP 1 1 0 6 + 38 4 6 +ENDOFSECTION + BOUNDARY CONDITIONS 2.4.6 + BC_BOT 1 9 0 6 + 41 4 6 + 42 4 6 + 43 4 6 + 44 4 6 + 45 4 6 + 46 4 6 + 47 4 6 + 48 4 6 + 49 4 6 +ENDOFSECTION + BOUNDARY CONDITIONS 2.4.6 + BC_XPLUS 1 16 0 6 + 34 4 4 + 31 4 4 + 28 4 4 + 38 4 4 + 7 4 4 + 4 4 4 + 1 4 4 + 16 4 4 + 13 4 4 + 10 4 4 + 25 4 4 + 22 4 4 + 19 4 4 + 41 4 2 + 44 4 2 + 47 4 2 +ENDOFSECTION + BOUNDARY CONDITIONS 2.4.6 + BC_XMINUS 1 16 0 6 + 30 4 2 + 33 4 2 + 36 4 2 + 38 4 2 + 3 4 2 + 6 4 2 + 9 4 2 + 12 4 2 + 15 4 2 + 18 4 2 + 21 4 2 + 24 4 2 + 27 4 2 + 49 4 4 + 46 4 4 + 43 4 4 +ENDOFSECTION + BOUNDARY CONDITIONS 2.4.6 + BC_YMINUS 1 16 0 6 + 36 4 3 + 35 4 3 + 34 4 3 + 40 4 3 + 19 4 6 + 20 4 6 + 21 4 6 + 22 4 6 + 23 4 6 + 24 4 6 + 25 4 6 + 26 4 6 + 27 4 6 + 43 4 3 + 42 4 3 + 41 4 3 +ENDOFSECTION + BOUNDARY CONDITIONS 2.4.6 + BC_YPLUS 1 16 0 6 + 28 4 1 + 29 4 1 + 30 4 1 + 39 4 1 + 1 4 5 + 4 4 5 + 7 4 5 + 2 4 5 + 5 4 5 + 8 4 5 + 3 4 5 + 6 4 5 + 9 4 5 + 47 4 1 + 48 4 1 + 49 4 1 +ENDOFSECTION + BOUNDARY CONDITIONS 2.4.6 + cfd_bc 1 1 0 0 51 +ENDOFSECTION + BOUNDARY CONDITIONS 2.4.6 + cfd_bc 2 1 0 0 51 +ENDOFSECTION + BOUNDARY CONDITIONS 2.4.6 + cfd_bc 3 1 0 0 51 +ENDOFSECTION + BOUNDARY CONDITIONS 2.4.6 + cfd_bc 4 1 0 0 51 +ENDOFSECTION + BOUNDARY CONDITIONS 2.4.6 + cfd_bc 5 1 0 0 51 +ENDOFSECTION + BOUNDARY CONDITIONS 2.4.6 + cfd_bc 6 1 0 0 51 +ENDOFSECTION diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/externals.ini b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/externals.ini new file mode 100644 index 000000000..a1a4a4745 --- /dev/null +++ b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/externals.ini @@ -0,0 +1,6 @@ +MPI = 1 +externalbinary = ./hopr/build/bin/hopr!, ./bin/piclas2vtk ! Relative binary path in build directory +externaldirectory = hopr.ini !, parameter.ini ! Directory name, where the files are located for the external tool reggie +externalruntime = pre !, post ! Run after piclas is completed (post: after, pre: before) +cmd_suffix = !, RadTrans_Cylinder_2D_RadiationState.h5 ! Suffix for the binary execution +!nocrosscombination:MPI,externalbinary,externaldirectory,externalruntime,cmd_suffix diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/hopr.ini b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/hopr.ini new file mode 100644 index 000000000..072933f2d --- /dev/null +++ b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/hopr.ini @@ -0,0 +1,31 @@ +!=============================================================================== ! +! OUTPUT +!=============================================================================== ! +ProjectName = mesh_cubitDebug ! name of the project (used for filenames) +Debugvisu = T +!=============================================================================== ! +! MESH +!=============================================================================== ! +FileName = export.neu ! name of mesh file as exported from grid generator +Mode = 2 ! 1 Cartesian 2 gambit file 3 CGNS +meshscale = 0.001 +!=============================================================================== ! +! BOUNDARY CONDITIONS +!=============================================================================== ! +BoundaryName=BC_TOP +BoundaryType=(/4,0,0,0/) +BoundaryName=BC_BOT +BoundaryType=(/4,0,0,0/) + +BoundaryName=BC_XMINUS +BoundaryType=(/1,0,0,1/) +BoundaryName=BC_XPLUS +BoundaryType=(/1,0,0,-1/) + +BoundaryName=BC_YMINUS +BoundaryType=(/1,0,0,2/) +BoundaryName=BC_YPLUS +BoundaryType=(/1,0,0,-2/) + +vv=(/0.001 , 0. , 0./) ! Periodic vector in x +vv=(/0. , 0.001 , 0./) ! Periodic vector in y diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/parameter.ini b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/parameter.ini new file mode 100644 index 000000000..d1469512b --- /dev/null +++ b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/parameter.ini @@ -0,0 +1,163 @@ +! =============================================================================== ! +! POSTI +! =============================================================================== ! +VisuParticles = T +TimeStampLength = 21 +! =============================================================================== ! +! VARIABLES +! =============================================================================== ! +CFLscale = 0.2 +IniExactFunc = 0 +N = 1!,2,3,4 +RayTracing-NMax = 1!,2,3,4 +NVisu = 1!,2,3,4 +NodeTypeVisu = VISU_INNER + +DoLoadBalance = T +Load-DeviationThreshold = 0.001 +LoadBalanceMaxSteps = 20 +DoInitialAutoRestart = T +!nocrosscombination:N,RayTracing-NMax,NVisu,UsePhotonTriaTracking,RayTracing-nSurfSample,Part-Boundary$-PhotonSpecularReflection +! =============================================================================== ! +! MESH +! =============================================================================== ! +MeshFile = mesh_cubitDebug_mesh.h5 +Logging = F +WriteErrorFiles = F +useCurveds = F +! if boundaries have to be changed (else they are used from Mesh directly): +TrackingMethod = triatracking +! =============================================================================== ! +! OUTPUT / VISUALIZATION +! =============================================================================== ! +ProjectName = photoionization +IterDisplayStep = 10 +Part-AnalyzeStep = 1 + +CalcNumSpec = T +CalcNumDens = T + +!CheckExchangeProcs = F ! deactivate the asymmetric communicator check +CalcPartBalance = T +! =============================================================================== ! +! CALCULATION +! =============================================================================== ! +ManualTimeStep = 5.0E-9 +tend = 100e-9 +Analyze_dt = 100e-9 + +PIC-DoDeposition = F + +PIC-DoInterpolation = F +Part-LorentzType = 0 + +epsCG = 1e-2 +! =============================================================================== ! +! DSMC +! =============================================================================== ! +UseDSMC = T +Particles-DSMC-CollisMode = 3 +Part-NumberOfRandomSeeds = 0 +Particles-HaloEpsVelo = 3E7 + +Particles-CollXSec-Database = XSec_Database_H2_Photoionization.h5 + +Particles-DSMC-ElectronicModel = 1 +Particles-DSMCElectronicDatabase = Electronic-State-Database.h5 +EpsMergeElectronicState = 1E-2 +Part-Species$-ElecRelaxProb = 1. +! =============================================================================== ! +! PARTICLES +! =============================================================================== ! +Part-nSpecies = 5 +Part-maxParticleNumber = 500000 +Part-nBounds = 6 + +Part-Boundary1-SourceName = BC_TOP +Part-Boundary1-Condition = reflective +Part-Boundary1-PhotonEnACC = 1.0 ! Photon inlet BC must always be absorbing + +Part-Boundary2-SourceName = BC_BOT +Part-Boundary2-Condition = reflective + +Part-Boundary3-SourceName = BC_XMINUS +Part-Boundary3-Condition = periodic + +Part-Boundary4-SourceName = BC_XPLUS +Part-Boundary4-Condition = periodic + +Part-Boundary5-SourceName = BC_YMINUS +Part-Boundary5-Condition = periodic + +Part-Boundary6-SourceName = BC_YPLUS +Part-Boundary6-Condition = periodic + +Part-nPeriodicVectors = 2 + +Part-FIBGMdeltas = (/ 1.0e-3 , 1.0e-3 , 0.00133 /) +Part-FactorFIBGM = (/ 1 , 1 , 1 /) + +Part-Boundary$-BoundaryParticleOutput = T +Part-Boundary$-PhotonSpecularReflection = T!,F,T,F ! F: diffuse with PhotonEnACC, T: perfect mirror +Part-Boundary$-PhotonEnACC = 1.0 +! =============================================================================== ! +! Ray Tracing +! =============================================================================== ! +UseRayTracing = T +UsePhotonTriaTracking = F!,T,F,T +RayTracing-nSurfSample= 1!,2,5,10 +RayTracing-NumRays = 5000 +!RayTracing-NumRays = 5000000 +RayTracing-PartBound = 1 ! -> iBC: 6 +PhotonModeBPO = 1 ! Debugging output: vectors +RayTracing-VolRefineMode = 1 ! Volumetric refinement +RayTracing-VolRefineModeZ = 1000. + +RayTracing-PulseDuration = 15e-9 +RayTracing-WaveLength = 10e-9 +RayTracing-PowerDensity = 1.0 +RayTracing-RepetitionRate = 1000 +RayTracing-RayDirection = (/ 0. , 0.0 , -1.0 /) +!RayTracing-RayDirection = (/ 0. , 0.5 , -1.0 /) +! =============================================================================== ! +! Weighting Factor +! =============================================================================== ! +Part-Species$-MacroParticleFactor = 0.1 + +! =============================================================================== ! +! Species1 | H2 +! =============================================================================== ! +Part-Species1-MassIC = 3.348E-27 +Part-Species1-ChargeIC = 0.0 + +Part-Species1-nInits = 1 + +Part-Species1-Init1-velocityDistribution = maxwell_lpn +Part-Species1-Init1-SpaceIC = background +Part-Species1-Init1-VeloIC = 0. +Part-Species1-Init1-PartDensity = 10.0e20 +Part-Species1-Init1-VeloVecIC = (/0.,1.,0./) +Part-Species1-Init1-MWTemperatureIC = 300. +Part-Species1-Init1-TempVib = 300. +Part-Species1-Init1-TempRot = 300. +Part-Species1-Init1-TempElec = 300. +! =============================================================================== ! +! Species2 | H +! =============================================================================== ! +Part-Species2-MassIC = 1.674E-27 +Part-Species2-ChargeIC = 0.0 +! =============================================================================== ! +! Species3 | e +! =============================================================================== ! +Part-Species3-MassIC = 9.11E-31 +Part-Species3-ChargeIC = -1.60217653E-19 +! =============================================================================== ! +! Species4 | H2Ion +! =============================================================================== ! +Part-Species4-MassIC = 3.3470890E-27 +Part-Species4-ChargeIC = 1.60217653E-19 +! =============================================================================== ! +! Species5 | HIon +! =============================================================================== ! +Part-Species5-MassIC = 1.673089E-27 +Part-Species5-ChargeIC = 1.60217653E-19 diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/readme.md b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/readme.md new file mode 100644 index 000000000..b3e6719e3 --- /dev/null +++ b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/readme.md @@ -0,0 +1,13 @@ +# Photoionization in the volume (rectangle) for ray tracing with high-order refinement and bilinear tracking +- **Comparing**: the total number of real electrons in the system with a numerical ref. solution +* convert cubit mesh with hopr to .h5 +* ray tracing + volume ionization reactions +* reference density in Electrons_ref.csv calculated with the old model and 1x1x1 emission region for volume see and 1e-3 J + * the size of the domain in this example is 1mm x 1mm x 1.33 mm, which is much smaller than the other reggies with 1m3 simulation + size, however, the resulting density must be the same as the irradiation is the same, just on a smaller scale + * the MPF is therefore chosen much smaller: MPF=0.01 +* Particle emission due to photoionization of $`H_{2}`$ in a volume only (no surface emission) +* no deposition, no interpolation +* comparison of the number of emitted electrons with the reference solution (1 MPF and MPI=1) +* different MPF and number of MPI ranks are tested to yield the same result +* Note: Because the volume is exactly 1 cubic metre, the calculated electron density is exactly the number of real electrons in the system From 9bb13fc8fd619ab838b62a0a6f979319601521f3 Mon Sep 17 00:00:00 2001 From: Raphael Tietz Date: Sun, 5 Nov 2023 16:20:44 +0100 Subject: [PATCH 311/495] Bugfixes to fix Ambipolar Diffusion, LIBS_MPI=OFF and macroscopic restart --- src/particles/dsmc/dsmc_ambipolardiff.f90 | 4 ++-- src/particles/dsmc/dsmc_init.f90 | 2 ++ src/particles/dsmc/dsmc_main.f90 | 2 +- .../emission/particle_macroscopic_restart.f90 | 6 ++--- src/particles/particle_tools.f90 | 24 +++++++++++++++++++ 5 files changed, 32 insertions(+), 6 deletions(-) diff --git a/src/particles/dsmc/dsmc_ambipolardiff.f90 b/src/particles/dsmc/dsmc_ambipolardiff.f90 index cf021c101..3262a9c1a 100644 --- a/src/particles/dsmc/dsmc_ambipolardiff.f90 +++ b/src/particles/dsmc/dsmc_ambipolardiff.f90 @@ -251,7 +251,7 @@ SUBROUTINE AD_SetSFElectronVelo(iSpec,iSFIon,iSample,jSample,iSide,BCSideID,Side iPart = 0 DO i = NbrOfParticle-PartIns+1,NbrOfParticle iPart = iPart + 1 - PositionNbr = GetNextFreePosition() + PositionNbr = GetNextFreePosition(i) ! In case of side-normal velocities: calc n-vector at particle position, xi was saved in PartState(4:5) IF (Species(DSMC%AmbiDiffElecSpec)%Surfaceflux(iSF)%VeloIsNormal .AND. TriaSurfaceFlux) THEN vec_nIn(1:3) = SurfMeshSubSideData(iSample,jSample,BCSideID)%vec_nIn(1:3) @@ -299,7 +299,7 @@ SUBROUTINE AD_SetSFElectronVelo(iSpec,iSFIon,iSample,jSample,iSide,BCSideID,Side iPart = 0 DO i = NbrOfParticle-PartIns+1,NbrOfParticle iPart = iPart + 1 - PositionNbr = GetNextFreePosition() + PositionNbr = GetNextFreePosition(i) !-- 0a.: In case of side-normal velocities: calc n-/t-vectors at particle position, xi was saved in PartState(4:5) IF (Species(DSMC%AmbiDiffElecSpec)%Surfaceflux(iSF)%VeloIsNormal .AND. TriaSurfaceFlux) THEN vec_nIn(1:3) = SurfMeshSubSideData(iSample,jSample,BCSideID)%vec_nIn(1:3) diff --git a/src/particles/dsmc/dsmc_init.f90 b/src/particles/dsmc/dsmc_init.f90 index 60e1be226..35aab03be 100644 --- a/src/particles/dsmc/dsmc_init.f90 +++ b/src/particles/dsmc/dsmc_init.f90 @@ -1445,6 +1445,8 @@ SUBROUTINE FinalizeDSMC() SDEALLOCATE(CollInf%omega) SDEALLOCATE(CollInf%dref) SDEALLOCATE(CollInf%Tref) +SDEALLOCATE(CollInf%OldCollPartner) +CollInf%ProhibitDoubleColl=.FALSE. !SDEALLOCATE(VibQuantsPar) ! SDEALLOCATE(XiEq_Surf) SDEALLOCATE(DSMC_Solution) diff --git a/src/particles/dsmc/dsmc_main.f90 b/src/particles/dsmc/dsmc_main.f90 index 700c31708..c337c8cb3 100644 --- a/src/particles/dsmc/dsmc_main.f90 +++ b/src/particles/dsmc/dsmc_main.f90 @@ -129,7 +129,7 @@ SUBROUTINE DSMC_main(DoElement) ! Advance particle vector length and the current next free position with newly created particles PDM%ParticleVecLength = MIN(PDM%maxParticleNumber,PDM%ParticleVecLength + DSMCSumOfFormedParticles) -PDM%CurrentNextFreePosition = PDM%CurrentNextFreePosition + DSMCSumOfFormedParticles +! PDM%CurrentNextFreePosition = PDM%CurrentNextFreePosition + DSMCSumOfFormedParticles IF(PDM%ParticleVecLength.GT.PDM%MaxParticleNumber) THEN CALL Abort(__STAMP__& diff --git a/src/particles/emission/particle_macroscopic_restart.f90 b/src/particles/emission/particle_macroscopic_restart.f90 index e28db82c2..ba7b744e9 100644 --- a/src/particles/emission/particle_macroscopic_restart.f90 +++ b/src/particles/emission/particle_macroscopic_restart.f90 @@ -96,7 +96,7 @@ SUBROUTINE MacroRestart_InsertParticles() RandomPos(3) = 0.0 InsideFlag = ParticleInsideCheck(RandomPos,1,GlobalElemID) IF (InsideFlag) THEN - IF (locnPart.GT.PDM%maxParticleNumber) CALL IncreaseMaxParticleNumber() + IF (locnPart.GE.PDM%maxParticleNumber) CALL IncreaseMaxParticleNumber() PartState(1:3,locnPart) = RandomPos(1:3) CALL InitializeParticleMaxwell(locnPart,iSpec,iElem,Mode=1) locnPart = locnPart + 1 @@ -215,8 +215,8 @@ SUBROUTINE MacroRestart_InsertParticles() END ASSOCIATE END DO ! nElems -IF(locnPart.GE.PDM%maxParticleNumber) CALL abort(__STAMP__,'ERROR in MacroRestart: Increase maxParticleNumber!', locnPart) - +! IF(locnPart.GE.PDM%maxParticleNumber) CALL abort(__STAMP__,'ERROR in MacroRestart: Increase maxParticleNumber!', locnPart) +IPWRITE(*,*) "PDM%ParticleVecLength,locnPart",PDM%ParticleVecLength,locnPart PDM%ParticleVecLength = PDM%ParticleVecLength + locnPart END SUBROUTINE MacroRestart_InsertParticles diff --git a/src/particles/particle_tools.f90 b/src/particles/particle_tools.f90 index e9b059297..1d79d7bef 100644 --- a/src/particles/particle_tools.f90 +++ b/src/particles/particle_tools.f90 @@ -1664,7 +1664,9 @@ SUBROUTINE IncreaseMaxParticleNumber(Amount) USE MOD_Globals USE MOD_Particle_Vars USE MOD_DSMC_Vars +#if USE_MPI USE MOD_Particle_MPI_Vars ,ONLY: PartShiftVector, PartTargetProc +#endif USE MOD_PICInterpolation_Vars ,ONLY: FieldAtParticle #if defined(IMPA) || defined(ROS) USE MOD_LinearSolver_Vars ,ONLY: PartXK, R_PartXK @@ -1818,6 +1820,7 @@ SUBROUTINE IncreaseMaxParticleNumber(Amount) CALL MOVE_ALLOC(Temp1Int,CollInf%OldCollPartner) END IF +#if USE_MPI IF(ALLOCATED(PartTargetProc)) THEN ALLOCATE(Temp1Int(NewSize),STAT=ALLOCSTAT) IF (ALLOCSTAT.NE.0) CALL ABORT(& @@ -1826,6 +1829,7 @@ SUBROUTINE IncreaseMaxParticleNumber(Amount) Temp1Int(1:PDM%MaxParticleNumber)=PartTargetProc CALL MOVE_ALLOC(Temp1Int,PartTargetProc) END IF +#endif ! __ __ __ __ ____ _________ __ ___ ! / / / /___ ____/ /___ _/ /____ / __ \/ ____/ | / / / | ______________ ___ _______ @@ -1933,6 +1937,7 @@ SUBROUTINE IncreaseMaxParticleNumber(Amount) CALL MOVE_ALLOC(Temp2Real,PartStateIntEn) END IF +#if USE_MPI IF(ALLOCATED(PartShiftVector)) THEN ALLOCATE(Temp2Real(3,NewSize),STAT=ALLOCSTAT) IF (ALLOCSTAT.NE.0) CALL ABORT(& @@ -1941,6 +1946,7 @@ SUBROUTINE IncreaseMaxParticleNumber(Amount) Temp2Real(:,1:PDM%MaxParticleNumber)=PartShiftVector CALL MOVE_ALLOC(Temp2Real,PartShiftVector) END IF +#endif IF(ALLOCATED(FieldAtParticle)) THEN ALLOCATE(Temp2Real(6,NewSize),STAT=ALLOCSTAT) @@ -2164,7 +2170,9 @@ SUBROUTINE ReduceMaxParticleNumber() USE MOD_Globals USE MOD_Particle_Vars USE MOD_DSMC_Vars +#if USE_MPI USE MOD_Particle_MPI_Vars ,ONLY: PartShiftVector, PartTargetProc +#endif USE MOD_PICInterpolation_Vars ,ONLY: FieldAtParticle #if defined(IMPA) || defined(ROS) USE MOD_LinearSolver_Vars ,ONLY: PartXK, R_PartXK @@ -2201,6 +2209,12 @@ SUBROUTINE ReduceMaxParticleNumber() END DO END IF +IF(DSMC%DoAmbipolarDiff) THEN + DO i=1,PDM%ParticleVecLength + IF(ALLOCATED(AmbipolElecVelo(i)%ElecVelo))nPart = nPart + 1 + END DO +END IF + IF(BGGas%NumberOfSpecies.GT.0.AND..NOT.UseMCC) nPart=nPart*2 ! Reduce Arrays only for at least PDM%maxParticleNumber*PDM%MaxPartNumIncrease free spots @@ -2341,6 +2355,7 @@ SUBROUTINE ReduceMaxParticleNumber() CALL MOVE_ALLOC(Temp1Int,CollInf%OldCollPartner) END IF +#if USE_MPI IF(ALLOCATED(PartTargetProc)) THEN ALLOCATE(Temp1Int(NewSize),STAT=ALLOCSTAT) IF (ALLOCSTAT.NE.0) CALL ABORT(& @@ -2349,6 +2364,7 @@ SUBROUTINE ReduceMaxParticleNumber() Temp1Int=PartTargetProc(1:NewSize) CALL MOVE_ALLOC(Temp1Int,PartTargetProc) END IF +#endif ! __ __ __ __ ____ _________ __ ___ ! / / / /___ ____/ /___ _/ /____ / __ \/ ____/ | / / / | ______________ ___ _______ @@ -2455,6 +2471,7 @@ SUBROUTINE ReduceMaxParticleNumber() CALL MOVE_ALLOC(Temp2Real,PartStateIntEn) END IF +#if USE_MPI IF(ALLOCATED(PartShiftVector)) THEN ALLOCATE(Temp2Real(3,NewSize),STAT=ALLOCSTAT) IF (ALLOCSTAT.NE.0) CALL ABORT(& @@ -2463,6 +2480,7 @@ SUBROUTINE ReduceMaxParticleNumber() Temp2Real=PartShiftVector(:,1:NewSize) CALL MOVE_ALLOC(Temp2Real,PartShiftVector) END IF +#endif IF(ALLOCATED(FieldAtParticle)) THEN ALLOCATE(Temp2Real(6,NewSize),STAT=ALLOCSTAT) @@ -2689,7 +2707,9 @@ SUBROUTINE ChangePartID(OldID,NewID) USE MOD_Globals USE MOD_Particle_Vars USE MOD_DSMC_Vars +#if USE_MPI USE MOD_Particle_MPI_Vars ,ONLY: PartShiftVector, PartTargetProc +#endif USE MOD_PICInterpolation_Vars ,ONLY: FieldAtParticle #if defined(IMPA) || defined(ROS) USE MOD_LinearSolver_Vars ,ONLY: PartXK, R_PartXK @@ -2771,9 +2791,11 @@ SUBROUTINE ChangePartID(OldID,NewID) CollInf%OldCollPartner(NewID)=CollInf%OldCollPartner(OldID) END IF +#if USE_MPI IF(ALLOCATED(PartTargetProc)) THEN PartTargetProc(NewID)=PartTargetProc(OldID) END IF +#endif ! __ __ __ __ ____ _________ __ ___ ! / / / /___ ____/ /___ _/ /____ / __ \/ ____/ | / / / | ______________ ___ _______ @@ -2826,9 +2848,11 @@ SUBROUTINE ChangePartID(OldID,NewID) PartStateIntEn(:,NewID)=PartStateIntEn(:,OldID) END IF +#if USE_MPI IF(ALLOCATED(PartShiftVector)) THEN PartShiftVector(:,NewID)=PartShiftVector(:,OldID) END IF +#endif IF(ALLOCATED(FieldAtParticle)) THEN FieldAtParticle(:,NewID)=FieldAtParticle(:,OldID) From 6f0eda6c86639aa0d1614cd93fdbf9d274a7e8d8 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Sun, 5 Nov 2023 17:56:38 +0100 Subject: [PATCH 312/495] - Fixed super-sampling of photon paths in the volume by completely removing PhotonStartPos, which is now replaced with PhotonPos - Added update of PhotonPos to periodic photon movement - Clean-up of photon tracking function: Moved code to StoreLostPhotonProperties() - Switched PhotonLastPost and PhotonPos in StoreLostPhotonProperties() - Deactivated bilinear photon tracking in reggies as this feature is WIP - Deactivated analysis of ray tracing photon reggie with periodic sides due to broken mesh: grid coordinates do not match in the periodic directions in x and y --- .../parameter.ini | 2 +- .../analyze.ini | 10 +- .../parameter.ini | 7 +- src/particles/particle_tools.f90 | 46 +++++-- .../tracking/radtrans_tracking.f90 | 118 +++--------------- .../tracking/radtrans_tracking_tools.f90 | 25 ++-- .../tracking/radtrans_tracking_vars.f90 | 1 - src/radiation/ray_tracing/raytrace.f90 | 5 +- 8 files changed, 81 insertions(+), 133 deletions(-) diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/parameter.ini b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/parameter.ini index cdd150aa3..d47500a48 100644 --- a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/parameter.ini +++ b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/parameter.ini @@ -102,7 +102,7 @@ Part-Boundary$-PhotonEnACC = 1e-9 , 1.0 , 1e-9 , 1.0 ! 1: fully abs ! Ray Tracing ! =============================================================================== ! UseRayTracing = T -UsePhotonTriaTracking = F,T,F,T +UsePhotonTriaTracking = T!F,T,F,T RayTracing-nSurfSample= 1,2,5,10 RayTracing-NumRays = 5000 !RayTracing-NumRays = 5000000 diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/analyze.ini b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/analyze.ini index 88c8f857e..1e2b3af43 100644 --- a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/analyze.ini +++ b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/analyze.ini @@ -1,8 +1,8 @@ ! =================================================================================================================== ! compare column ! =================================================================================================================== -compare_column_file = PartAnalyze.csv ! data file name -compare_column_reference_file = Electrons_ref.csv ! data file name -compare_column_index = 9 ! column index for comparison -compare_column_tolerance_value = 10e9 ! tolerance (depends on machine accuracy and MPI) -compare_column_tolerance_type = absolute ! absolute or relative tolerance +!compare_column_file = PartAnalyze.csv ! data file name +!compare_column_reference_file = Electrons_ref.csv ! data file name +!compare_column_index = 9 ! column index for comparison +!compare_column_tolerance_value = 10e9 ! tolerance (depends on machine accuracy and MPI) +!compare_column_tolerance_type = absolute ! absolute or relative tolerance diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/parameter.ini b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/parameter.ini index d1469512b..7dd482937 100644 --- a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/parameter.ini +++ b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/parameter.ini @@ -18,6 +18,7 @@ Load-DeviationThreshold = 0.001 LoadBalanceMaxSteps = 20 DoInitialAutoRestart = T !nocrosscombination:N,RayTracing-NMax,NVisu,UsePhotonTriaTracking,RayTracing-nSurfSample,Part-Boundary$-PhotonSpecularReflection +!nocrosscombination:UsePhotonTriaTracking,RayTracing-nSurfSample,Part-Boundary$-PhotonEnACC,RayTracing-PowerDensity ! =============================================================================== ! ! MESH ! =============================================================================== ! @@ -98,13 +99,13 @@ Part-FIBGMdeltas = (/ 1.0e-3 , 1.0e-3 , 0.00133 /) Part-FactorFIBGM = (/ 1 , 1 , 1 /) Part-Boundary$-BoundaryParticleOutput = T -Part-Boundary$-PhotonSpecularReflection = T!,F,T,F ! F: diffuse with PhotonEnACC, T: perfect mirror +Part-Boundary$-PhotonSpecularReflection = T ! F: diffuse with PhotonEnACC, T: perfect mirror Part-Boundary$-PhotonEnACC = 1.0 ! =============================================================================== ! ! Ray Tracing ! =============================================================================== ! UseRayTracing = T -UsePhotonTriaTracking = F!,T,F,T +UsePhotonTriaTracking = T!,F,T,F RayTracing-nSurfSample= 1!,2,5,10 RayTracing-NumRays = 5000 !RayTracing-NumRays = 5000000 @@ -115,7 +116,7 @@ RayTracing-VolRefineModeZ = 1000. RayTracing-PulseDuration = 15e-9 RayTracing-WaveLength = 10e-9 -RayTracing-PowerDensity = 1.0 +RayTracing-PowerDensity = 1.0!, 1.0, 1.0, 1.0 ! theoretical value is calculated from the increased energy that is deposited in the volume due to the increased optical path of the photons when photons travel under an angle RayTracing-RepetitionRate = 1000 RayTracing-RayDirection = (/ 0. , 0.0 , -1.0 /) !RayTracing-RayDirection = (/ 0. , 0.5 , -1.0 /) diff --git a/src/particles/particle_tools.f90 b/src/particles/particle_tools.f90 index a2ee0409f..01adc43e7 100644 --- a/src/particles/particle_tools.f90 +++ b/src/particles/particle_tools.f90 @@ -229,34 +229,54 @@ SUBROUTINE UpdateNextFreePosition(WithOutMPIParts) END SUBROUTINE UpdateNextFreePosition -SUBROUTINE StoreLostPhotonProperties(LastPhotPos,Pos,Dir,ElemID) +SUBROUTINE StoreLostPhotonProperties(ElemID,CallingFileName,LineNbrOfCall) !----------------------------------------------------------------------------------------------------------------------------------! -! Store information of a lost particle (during restart and during the simulation) +! Store information of a lost photons during tracking !----------------------------------------------------------------------------------------------------------------------------------! ! MODULES ! USE MOD_Globals ,ONLY: abort,myrank USE MOD_Particle_Tracking_Vars ,ONLY: PartStateLost,PartLostDataSize,PartStateLostVecLength USE MOD_TimeDisc_Vars ,ONLY: time +USE MOD_Photon_TrackingVars ,ONLY: PhotonProps +USE MOD_Particle_Tracking_Vars ,ONLY: NbrOfLostParticles,DisplayLostParticles !----------------------------------------------------------------------------------------------------------------------------------! ! insert modules here !----------------------------------------------------------------------------------------------------------------------------------! IMPLICIT NONE ! INPUT / OUTPUT VARIABLES -REAL,INTENT(IN) :: LastPhotPos(1:3) -REAL,INTENT(IN) :: Pos(1:3) -REAL,INTENT(IN) :: Dir(1:3) +CHARACTER(LEN=*),INTENT(IN) :: CallingFileName ! Name of calling file +INTEGER,INTENT(IN) :: LineNbrOfCall ! Line number from which this function was called from CallingFileName INTEGER,INTENT(IN) :: ElemID ! Global element index INTEGER :: dims(2) !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES ! Temporary arrays -REAL, ALLOCATABLE :: PartStateLost_tmp(:,:) ! (1:11,1:NParts) 1st index: x,y,z,vx,vy,vz,SpecID,MPF,time,ElemID,iPart -! ! 2nd index: 1 to number of lost particles -INTEGER :: ALLOCSTAT +REAL, ALLOCATABLE :: PartStateLost_tmp(:,:) ! (1:11,1:NParts) 1st index: x,y,z,vx,vy,vz,SpecID,MPF,time,ElemID,iPart +! ! 2nd index: 1 to number of lost particles +INTEGER :: ALLOCSTAT +CHARACTER(LEN=60) :: hilf !=================================================================================================================================== + +! Increment counter for lost particle per process +NbrOfLostParticles=NbrOfLostParticles+1 + +! Output in terminal if activated +IF(DisplayLostParticles)THEN + WRITE(UNIT=hilf,FMT='(I0)') LineNbrOfCall + IPWRITE(*,*) 'Error in photon tracking in '//TRIM(CallingFileName)//' in line '//TRIM(hilf)//'! Photon lost. Element:', ElemID + IPWRITE(*,*) 'LastPos: ', PhotonProps%PhotonLastPos(1:3) + IPWRITE(*,*) 'Pos: ', PhotonProps%PhotonPos(1:3) + IPWRITE(*,*) 'Direction:', PhotonProps%PhotonDirection(1:3) + IPWRITE(*,*) 'Photon deleted!' +END IF ! DisplayLostParticles + +! Check if size of the array must be increased dims = SHAPE(PartStateLost) -ASSOCIATE( iMax => PartStateLostVecLength ) +ASSOCIATE( iMax => PartStateLostVecLength , & + LastPhotPos => PhotonProps%PhotonLastPos(1:3) , & + PhotPos => PhotonProps%PhotonPos(1:3) , & + Dir => PhotonProps%PhotonDirection(1:3) ) ! Increase maximum number of boundary-impact particles iMax = iMax + 1 @@ -279,8 +299,8 @@ SUBROUTINE StoreLostPhotonProperties(LastPhotPos,Pos,Dir,ElemID) END IF - ! 1-3: Particle position (last valid position) - PartStateLost(1:3,iMax) = LastPhotPos(1:3) + ! 1-3: Particle position (current position) + PartStateLost(1:3,iMax) = PhotPos(1:3) ! 4-6: Particle velocity PartStateLost(4:6 ,iMax) = Dir(1:3) ! 7: SpeciesID @@ -293,8 +313,8 @@ SUBROUTINE StoreLostPhotonProperties(LastPhotPos,Pos,Dir,ElemID) PartStateLost(10 ,iMax) = REAL(ElemID) ! 11: Particle ID PartStateLost(11 ,iMax) = REAL(0) - ! 12-14: Particle position (position of loss) - PartStateLost(12:14,iMax) = Pos(1:3) + ! 12-14: Particle position (starting point or last valid position) + PartStateLost(12:14,iMax) = LastPhotPos(1:3) ! 15: myrank PartStateLost(15,iMax) = myrank ! 16: missing type, i.e., 0: lost, 1: missing & found once, >1: missing & multiply found diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 index 31952e913..47b3a3655 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 @@ -276,7 +276,6 @@ SUBROUTINE PhotonTriaTracking() USE MOD_Photon_TrackingTools ,ONLY: PhotonIntersectSensor USE MOD_Particle_Boundary_Tools ,ONLY: StoreBoundaryParticleProperties USE MOD_part_tools ,ONLY: StoreLostPhotonProperties -USE MOD_Particle_Tracking_Vars ,ONLY: NbrOfLostParticles,DisplayLostParticles USE MOD_RadiationTrans_Vars ,ONLY: RadiationAbsorptionModel USE MOD_RayTracing_Vars ,ONLY: RayForceAbsorption USE MOD_Particle_Mesh_Tools ,ONLY: GetGlobalNonUniqueSideID @@ -395,20 +394,8 @@ SUBROUTINE PhotonTriaTracking() ! treatment is required, where the particle path is reconstructed (which side was crossed first) by comparing the ratio ! the determinants IF (NrOfThroughSides.EQ.0) THEN - ! Particle appears to have not crossed any of the checked sides. Deleted! - ASSOCIATE( LastPhotPos => PhotonProps%PhotonLastPos(1:3), & - Pos => PhotonProps%PhotonPos(1:3), & - Dir => PhotonProps%PhotonDirection(1:3) ) - CALL StoreLostPhotonProperties(LastPhotPos,Pos,Dir,ElemID) - NbrOfLostParticles=NbrOfLostParticles+1 - IF(DisplayLostParticles)THEN - IPWRITE(*,*) 'Error in Photon TriaTracking (NrOfThroughSides=0)! Photon lost. Element:', ElemID - IPWRITE(*,*) 'LastPos: ', PhotonProps%PhotonLastPos(1:3) - IPWRITE(*,*) 'Pos: ', PhotonProps%PhotonPos(1:3) - IPWRITE(*,*) 'Direction:', PhotonProps%PhotonDirection(1:3) - IPWRITE(*,*) 'Photon deleted!' - END IF ! DisplayLostParticles - END ASSOCIATE + ! Particle appears to have not crossed any of the checked sides (NrOfThroughSides=0). Deleted! + CALL StoreLostPhotonProperties(ElemID,TRIM(__FILE__),__LINE__) Done = .TRUE. EXIT ELSE IF (NrOfThroughSides.GT.1) THEN @@ -434,20 +421,9 @@ SUBROUTINE PhotonTriaTracking() ! Get the determinant between the old and new particle position and the nodes of the triangle which was crossed CALL PhotonIntersectionWithSide(LocSidesTemp(ind2),NbElemID,TriNumTemp(ind2), IntersectionPosTemp, PhotonLost, .TRUE.) IF(PhotonLost)THEN - ASSOCIATE( LastPhotPos => PhotonProps%PhotonLastPos(1:3), & - Pos => PhotonProps%PhotonPos(1:3), & - Dir => PhotonProps%PhotonDirection(1:3) ) - CALL StoreLostPhotonProperties(LastPhotPos,Pos,Dir,ElemID) - NbrOfLostParticles=NbrOfLostParticles+1 - IF(DisplayLostParticles)THEN - IPWRITE(*,*) 'Error in Photon TriaTracking! PhotonIntersectionWithSide() cannot determine intersection'& - //' because photon is parallel to side. NbElemID:', NbElemID - IPWRITE(*,*) 'LastPos: ', PhotonProps%PhotonLastPos(1:3) - IPWRITE(*,*) 'Pos: ', PhotonProps%PhotonPos(1:3) - IPWRITE(*,*) 'Direction:', PhotonProps%PhotonDirection(1:3) - IPWRITE(*,*) 'Photon deleted!' - END IF ! DisplayLostParticles - END ASSOCIATE + ! Error in Photon TriaTracking! PhotonIntersectionWithSide() cannot determine intersection because photon is + ! parallel to side + CALL StoreLostPhotonProperties(ElemID,TRIM(__FILE__),__LINE__) Done = .TRUE. EXIT END IF ! PhotonLost @@ -468,20 +444,9 @@ SUBROUTINE PhotonTriaTracking() ELSE ! Regular side CALL PhotonIntersectionWithSide(LocSidesTemp(ind2),ElemID,TriNumTemp(ind2), IntersectionPosTemp, PhotonLost) IF(PhotonLost)THEN - ASSOCIATE( LastPhotPos => PhotonProps%PhotonLastPos(1:3), & - Pos => PhotonProps%PhotonPos(1:3), & - Dir => PhotonProps%PhotonDirection(1:3) ) - CALL StoreLostPhotonProperties(LastPhotPos,Pos,Dir,ElemID) - NbrOfLostParticles=NbrOfLostParticles+1 - IF(DisplayLostParticles)THEN - IPWRITE(*,*) 'Error in Photon TriaTracking! PhotonIntersectionWithSide() cannot determine intersection'& - //' because photon is parallel to side. ElemID:', ElemID - IPWRITE(*,*) 'LastPos: ', PhotonProps%PhotonLastPos(1:3) - IPWRITE(*,*) 'Pos: ', PhotonProps%PhotonPos(1:3) - IPWRITE(*,*) 'Direction:', PhotonProps%PhotonDirection(1:3) - IPWRITE(*,*) 'Photon deleted!' - END IF ! DisplayLostParticles - END ASSOCIATE + ! Error in Photon TriaTracking! PhotonIntersectionWithSide() cannot determine intersection because photon is + ! parallel to side + CALL StoreLostPhotonProperties(ElemID,TRIM(__FILE__),__LINE__) Done = .TRUE. EXIT END IF ! PhotonLost @@ -501,26 +466,14 @@ SUBROUTINE PhotonTriaTracking() END DO ! ind2 = 1, NrOfThroughSides ! Particle that went through multiple sides first, but did not cross any sides during the second check -> Deleted! IF (SecondNrOfThroughSides.EQ.0) THEN - ASSOCIATE( LastPhotPos => PhotonProps%PhotonLastPos(1:3), & - Pos => PhotonProps%PhotonPos(1:3), & - Dir => PhotonProps%PhotonDirection(1:3) ) - CALL StoreLostPhotonProperties(LastPhotPos,Pos,Dir,ElemID) - NbrOfLostParticles=NbrOfLostParticles+1 - IF(DisplayLostParticles)THEN - IPWRITE(*,*) 'Error in Photon TriaTracking! Photon lost on second check. Element:', ElemID - IPWRITE(*,*) 'LastPos: ', PhotonProps%PhotonLastPos(1:3) - IPWRITE(*,*) 'Pos: ', PhotonProps%PhotonPos(1:3) - IPWRITE(*,*) 'Direction:', PhotonProps%PhotonDirection(1:3) - IPWRITE(*,*) 'Photon deleted!' - END IF ! DisplayLostParticles - END ASSOCIATE + CALL StoreLostPhotonProperties(ElemID,TRIM(__FILE__),__LINE__) Done = .TRUE. EXIT END IF ELSE ind2 = MINLOC(DistTemp(1:NrOfThroughSides),1) IF (DistTemp(ind2).LE.0.0) THEN - print*, 'NrOfThroughSides', NrOfThroughSides, DistTemp(1:NrOfThroughSides) + IPWRITE(UNIT_StdOut,*) "NrOfThroughSides =", NrOfThroughSides, "DistTemp(1:NrOfThroughSides) =",DistTemp(1:NrOfThroughSides) CALL abort(__STAMP__,' ERROR: Side Distance is negative!') END IF SideID = GlobSideTemp(ind2) @@ -548,20 +501,9 @@ SUBROUTINE PhotonTriaTracking() IF(NrOfThroughSides.LT.2)THEN CALL PhotonIntersectionWithSide(LocalSide,ElemID,TriNum, IntersectionPos, PhotonLost) IF(PhotonLost)THEN - ASSOCIATE( LastPhotPos => PhotonProps%PhotonLastPos(1:3), & - Pos => PhotonProps%PhotonPos(1:3), & - Dir => PhotonProps%PhotonDirection(1:3) ) - CALL StoreLostPhotonProperties(LastPhotPos,Pos,Dir,ElemID) - NbrOfLostParticles=NbrOfLostParticles+1 - IF(DisplayLostParticles)THEN - IPWRITE(*,*) 'Error in open BC Photon TriaTracking! PhotonIntersectionWithSide() cannot determine intersection'& - //' because photon is parallel to side. ElemID:', ElemID - IPWRITE(*,*) 'LastPos: ', PhotonProps%PhotonLastPos(1:3) - IPWRITE(*,*) 'Pos: ', PhotonProps%PhotonPos(1:3) - IPWRITE(*,*) 'Direction:', PhotonProps%PhotonDirection(1:3) - IPWRITE(*,*) 'Photon deleted!' - END IF ! DisplayLostParticles - END ASSOCIATE + ! Error in open BC Photon TriaTracking! PhotonIntersectionWithSide() cannot determine intersection because photon is + ! parallel to side + CALL StoreLostPhotonProperties(ElemID,TRIM(__FILE__),__LINE__) Done = .TRUE. EXIT END IF ! PhotonLost @@ -620,20 +562,9 @@ SUBROUTINE PhotonTriaTracking() IF((NrOfThroughSides.LT.2).AND.(UsePhotonTriaTracking))THEN CALL PhotonIntersectionWithSide(LocalSide,ElemID,TriNum, IntersectionPos, PhotonLost) IF(PhotonLost)THEN - ASSOCIATE( LastPhotPos => PhotonProps%PhotonLastPos(1:3), & - Pos => PhotonProps%PhotonPos(1:3), & - Dir => PhotonProps%PhotonDirection(1:3) ) - CALL StoreLostPhotonProperties(LastPhotPos,Pos,Dir,ElemID) - NbrOfLostParticles=NbrOfLostParticles+1 - IF(DisplayLostParticles)THEN - IPWRITE(*,*) 'Error in periodic Photon TriaTracking! PhotonIntersectionWithSide() cannot determine intersection'& - //' because photon is parallel to side. ElemID:', ElemID - IPWRITE(*,*) 'LastPos: ', PhotonProps%PhotonLastPos(1:3) - IPWRITE(*,*) 'Pos: ', PhotonProps%PhotonPos(1:3) - IPWRITE(*,*) 'Direction:', PhotonProps%PhotonDirection(1:3) - IPWRITE(*,*) 'Photon deleted!' - END IF ! DisplayLostParticles - END ASSOCIATE + ! Error in periodic Photon TriaTracking! PhotonIntersectionWithSide() cannot determine intersection because photon is + ! parallel to side + CALL StoreLostPhotonProperties(ElemID,TRIM(__FILE__),__LINE__) Done = .TRUE. EXIT END IF ! PhotonLost @@ -676,20 +607,8 @@ SUBROUTINE PhotonTriaTracking() ! Check if lost during intersection IF(PhotonLost)THEN - ASSOCIATE( LastPhotPos => PhotonProps%PhotonLastPos(1:3), & - Pos => PhotonProps%PhotonPos(1:3), & - Dir => PhotonProps%PhotonDirection(1:3) ) - CALL StoreLostPhotonProperties(LastPhotPos,Pos,Dir,ElemID) - NbrOfLostParticles=NbrOfLostParticles+1 - IF(DisplayLostParticles)THEN - IPWRITE(*,*) 'Error in Photon TriaTracking! PhotonIntersectionWithSide() cannot determine intersection'& - //' because photon is parallel to side. ElemID:', ElemID - IPWRITE(*,*) 'LastPos: ', PhotonProps%PhotonLastPos(1:3) - IPWRITE(*,*) 'Pos: ', PhotonProps%PhotonPos(1:3) - IPWRITE(*,*) 'Direction:', PhotonProps%PhotonDirection(1:3) - IPWRITE(*,*) 'Photon deleted!' - END IF ! DisplayLostParticles - END ASSOCIATE + ! Error in Photon TriaTracking! PhotonIntersectionWithSide() cannot determine intersection because photon is parallel to side + CALL StoreLostPhotonProperties(ElemID,TRIM(__FILE__),__LINE__) Done = .TRUE. EXIT ELSE @@ -714,6 +633,7 @@ SUBROUTINE PhotonTriaTracking() MPF_optIN=0.0,& Velo_optIN=PhotonProps%PhotonDirection(1:3)) END IF ! PhotonModeBPO.EQ.2 + IF (ElemID.LT.1) CALL abort(__STAMP__ ,'ERROR: Element not defined! Please increase the size of the halo region (HaloEpsVelo)!') END DO ! .NOT.PartisDone diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 index a8edd9bf3..1d8d38ab9 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 @@ -669,7 +669,7 @@ SUBROUTINE CalcAbsorptionRayTrace(IntersectionPos,GlobalElemID,PhotonDir) REAL :: RandVal(3) !--------------------------------------------------------------------------------------------------! ! Calculate the direction and length of the path of the ray through the element -direction(1:3) = IntersectionPos(1:3)-PhotonProps%PhotonStartPos(1:3) +direction(1:3) = IntersectionPos(1:3)-PhotonProps%PhotonPos(1:3) length = VECNORM(direction(1:3)) ! Check primary or secondary direction @@ -696,19 +696,22 @@ SUBROUTINE CalcAbsorptionRayTrace(IntersectionPos,GlobalElemID,PhotonDir) ! only in z-dir DO iIntersec = 1, NbrOfSamples-1 CALL RANDOM_NUMBER(RandVal(1)) - SamplePos(1:3) = PhotonProps%PhotonStartPos(1:3) + (/1.0 , 1.0 , RandVal(1)/) * direction(1:3) + SamplePos(1:3) = PhotonProps%PhotonPos(1:3) + (/1.0 , 1.0 , RandVal(1)/) * direction(1:3) CALL GetNestestDOFInRefElem(Nloc,SamplePos(1:3),GlobalElemID,k,l,m) U_N_Ray(GlobalElemID)%U(idx,k,l,m) = U_N_Ray(GlobalElemID)%U(idx,k,l,m) + sublength*PhotonProps%PhotonEnergy END DO ELSE DO iIntersec = 1, NbrOfSamples-1 CALL RANDOM_NUMBER(RandVal(1:3)) - SamplePos(1:3) = PhotonProps%PhotonStartPos(1:3) + RandVal(1:3) * direction(1:3) + SamplePos(1:3) = PhotonProps%PhotonPos(1:3) + RandVal(1:3) * direction(1:3) CALL GetNestestDOFInRefElem(Nloc,SamplePos(1:3),GlobalElemID,k,l,m) U_N_Ray(GlobalElemID)%U(idx,k,l,m) = U_N_Ray(GlobalElemID)%U(idx,k,l,m) + sublength*PhotonProps%PhotonEnergy END DO END IF ! ABS(direction(3).GT.1e6*(ABS(direction(1))+ABS(direction(2)))) +! Store intersection point as new starting point +PhotonProps%PhotonPos(1:3) = IntersectionPos(1:3) + END SUBROUTINE CalcAbsorptionRayTrace @@ -1253,7 +1256,8 @@ END SUBROUTINE DiffusePhotonReflection2D SUBROUTINE PeriodicPhotonBC(iLocSide, Element, TriNum, IntersectionPos, IntersecAlreadyCalc, SideID) !----------------------------------------------------------------------------------------------------------------------------------! -! Computes the perfect reflection in 3D +! Computes the periodic movement of a photon and updates PhotonLastPos, PhotonPos and IntersectionPos to the periodically moves +! location !----------------------------------------------------------------------------------------------------------------------------------! ! MODULES ! !----------------------------------------------------------------------------------------------------------------------------------! @@ -1330,22 +1334,25 @@ SUBROUTINE PeriodicPhotonBC(iLocSide, Element, TriNum, IntersectionPos, Intersec IntersectionPos(3) = PoldZ + POI_fak * VelZ END IF -! set last particle position on face +! Set last particle position on face PhotonProps%PhotonLastPos = IntersectionPos -! perform the periodic movement +! Perform the periodic movement PVID = BoundaryType(SideInfo_Shared(SIDE_BCID,SideID),BC_ALPHA) PhotonProps%PhotonLastPos = PhotonProps%PhotonLastPos + SIGN( GEO%PeriodicVectors(1:3,ABS(PVID)),REAL(PVID)) -! update particle positon after periodic BC +! Update particle positon after periodic BC !PartState(1:3,PartID) = PhotonProps%PhotonLastPos + (TrackInfo%lengthPartTrajectory-TrackInfo%alpha)*TrackInfo%PartTrajectory !TrackInfo%lengthPartTrajectory = TrackInfo%lengthPartTrajectory - TrackInfo%alpha ! refmapping and tracing -! move particle from old element to new element +! Move particle from old element to new element Element = SideInfo_Shared(SIDE_NBELEMID,SideID) -! Move the intersection point as it will be considered the starting point in the next iteration +! Periodic movement the intersection point as it will be considered the starting point in the next iteration IntersectionPos = PhotonProps%PhotonLastPos +! Periodic movement the photon position +PhotonProps%PhotonPos = PhotonProps%PhotonLastPos + END SUBROUTINE PeriodicPhotonBC diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_vars.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_vars.f90 index 6c726524e..0ad22796d 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_vars.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_vars.f90 @@ -32,7 +32,6 @@ MODULE MOD_Photon_TrackingVars REAL :: PhotonEnergy !> INTEGER :: ElemID !> INTEGER :: WaveLength !> - REAL :: PhotonStartPos(3) !> super sampled ray path END TYPE TYPE (tPhotonProps) :: PhotonProps !> diff --git a/src/radiation/ray_tracing/raytrace.f90 b/src/radiation/ray_tracing/raytrace.f90 index 42b24a182..feab81b4e 100644 --- a/src/radiation/ray_tracing/raytrace.f90 +++ b/src/radiation/ray_tracing/raytrace.f90 @@ -334,7 +334,8 @@ SUBROUTINE ReadRayTracingDataFromH5(onlySurfData) DEALLOCATE(HSize) IF(nSurfSampleHDF5.NE.Ray%nSurfSample)THEN SWRITE(UNIT_stdOut,'(A)') ' Number of nSurfSample in .h5 file differs from the ini file parameter "RayTracing-nSurfSample' - SWRITE(UNIT_stdOut,'(A,I0)') ' nSurfSampleHDF5: ', nSurfSampleHDF5 + SWRITE(UNIT_stdOut,'(A)') ' ' + SWRITE(UNIT_stdOut,'(A,I0)') ' nSurfSampleHDF5 : ', nSurfSampleHDF5 SWRITE(UNIT_stdOut,'(A,I0)') ' RayTracing-nSurfSample: ', Ray%nSurfSample CALL abort(__STAMP__,'Number of nSurfSample in .h5 file differs from the ini file parameter "RayTracing-nSurfSample"!') END IF ! nSurfSampleHDF5.NE.Ray%nSurfSample @@ -551,7 +552,7 @@ END FUNCTION SetRayPos FUNCTION SetPhotonStartDirection(iCNElem, iPhot, RandRot) !=================================================================================================================================== -! modified particle emmission for LD case +! Set the starting direction in which the photon moves !=================================================================================================================================== ! MODULES USE MOD_Globals From 5b70a939841f9b7623d7e36126d255ef87516874 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Sun, 5 Nov 2023 19:40:53 +0100 Subject: [PATCH 313/495] Added automatic calculation of volumetric increased energy due to slanted photon emission during ray tracing --- src/radiation/ray_tracing/raytrace_ini.f90 | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/radiation/ray_tracing/raytrace_ini.f90 b/src/radiation/ray_tracing/raytrace_ini.f90 index aaed37286..d075a8c2d 100644 --- a/src/radiation/ray_tracing/raytrace_ini.f90 +++ b/src/radiation/ray_tracing/raytrace_ini.f90 @@ -167,7 +167,6 @@ SUBROUTINE InitRayTracing() Ray%Power = Ray%PowerDensity * A ! adjust power from [W/m2] to [W] E0 = Ray%Power / Ray%RepetitionRate - ! Generate two base vectors perpendicular to the ray direction CALL OrthoNormVec(Ray%Direction,Ray%BaseVector1IC,Ray%BaseVector2IC) @@ -190,6 +189,12 @@ SUBROUTINE InitRayTracing() CALL PrintOption('Rectangular ray emission area: A [m2]' , 'CALCUL.' , RealOpt=Ray%Area) CALL PrintOption('Angle between emission area normal and ray direction: alpha [deg]' , 'CALCUL.' , RealOpt=alpha) +! Increased energy in the volume due to the increased optical path (only 2D approximation) +IF(ABS(alpha)+1e-4.LT.90.0)THEN + CALL PrintOption('Enhancement factor for energy deposited in the volume [-]' , 'CALCUL.' , RealOpt=1.0/COS(alpha*PI/180.0)) +ELSE + CALL PrintOption('Enhancement factor for energy deposited in the volume [-]' , 'CALCUL.' , RealOpt=1.0) +END IF ! ABS(alpha).GT.0.0 CALL PrintOption('Single pulse energy [J]' , 'CALCUL.' , RealOpt=Ray%Energy) CALL PrintOption('Intensity amplitude: I0 [W/m^2]' , 'CALCUL.' , RealOpt=Ray%IntensityAmplitude) CALL PrintOption('Corrected Intensity amplitude: I0_corr [W/m^2]' , 'CALCUL.' , RealOpt=Ray%IntensityAmplitude) From 29202ea75f3ba8d2f06f9d801234061e6821bf0c Mon Sep 17 00:00:00 2001 From: Marcel Pfeiffer Date: Mon, 6 Nov 2023 13:40:41 +0100 Subject: [PATCH 314/495] combine tracing and tritracking for photons --- .../tracking/radtrans_tracking.f90 | 186 ++++++++++++------ .../tracking/radtrans_tracking_tools.f90 | 3 +- 2 files changed, 133 insertions(+), 56 deletions(-) diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 index 31952e913..e73285e47 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 @@ -287,16 +287,16 @@ SUBROUTINE PhotonTriaTracking() ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -INTEGER :: NblocSideID, NbElemID, ind, nbSideID, nMortarElems, BCType, localSideID, iPBC +INTEGER :: NblocSideID, NbElemID, ind, nbSideID, nMortarElems, BCType, localSideID, iPBC, GlobSideID INTEGER :: ElemID,OldElemID,nlocSides INTEGER :: LocalSide INTEGER :: NrOfThroughSides, ind2 INTEGER :: SideID,TempSideID,iLocSide INTEGER :: TriNum, LocSidesTemp(1:6),TriNumTemp(1:6), GlobSideTemp(1:6) -INTEGER :: SecondNrOfThroughSides, indSide +INTEGER :: SecondNrOfThroughSides, indSide INTEGER :: DoneLastElem(1:4,1:6) ! 1:3: 1=Element,2=LocalSide,3=TriNum 1:2: 1=last 2=beforelast -LOGICAL :: ThroughSide, Done -LOGICAL :: oldElemIsMortar, isMortarSideTemp(1:6), doCheckSide +LOGICAL :: ThroughSide, Done, TempPointSelect(2), LastInterPointSelect(2),DummyPointSelect(2),FallBack +LOGICAL :: oldElemIsMortar, isMortarSideTemp(1:6), doCheckSide, InterPointSelect(2), InterPointSelectTemp(2,6) REAL :: minRatio, intersecDist, intersecDistVec(3) REAL :: IntersectionPos(1:3), IntersectionPosTemp(1:3) REAL :: DistTemp(1:6) @@ -307,10 +307,15 @@ SUBROUTINE PhotonTriaTracking() Done = .FALSE. ElemID = PhotonProps%ElemID SideID = 0 +GlobSideID = 0 DoneLastElem(:,:) = 0 +InterPointSelect = .FALSE. +LastInterPointSelect = .FALSE. ! 1) Loop tracking until Photon is considered "done" (either absorbed or deleted) DO WHILE (.NOT.Done) + PhotonLost=.FALSE. + InterPointSelectTemp = .FALSE. oldElemIsMortar = .FALSE. NrOfThroughSides = 0 LocSidesTemp(:) = 0 @@ -318,6 +323,7 @@ SUBROUTINE PhotonTriaTracking() TriNumTemp(:) = 0 GlobSideTemp = 0 isMortarSideTemp = .FALSE. + FallBack = .FALSE. nlocSides = ElemInfo_Shared(ELEM_LASTSIDEIND,ElemID) - ElemInfo_Shared(ELEM_FIRSTSIDEIND,ElemID) LocSideLoop: DO iLocSide=1,nlocSides TempSideID = ElemInfo_Shared(ELEM_FIRSTSIDEIND,ElemID) + iLocSide @@ -370,10 +376,16 @@ SUBROUTINE PhotonTriaTracking() END DO ELSE ! 2) Tracing on bilinear sides (bilinear algorithm for intersection calculation)) - SideID = GetGlobalNonUniqueSideID(ElemID,localSideID) + GlobSideID = GetGlobalNonUniqueSideID(ElemID,localSideID) ThroughSide = .FALSE. !CALL ComputeBiLinearIntersection(foundHit,PartTrajectory,lengthPartTrajectory,locAlpha,xi,eta,iPart,SideID,alpha2=currentIntersect%alpha) - CALL PhotonComputeBiLinearIntersection(ThroughSide,SideID, intersecDist) + IF (SideInfo_Shared(SIDE_NBELEMID,TempSideID).EQ.DoneLastElem(1,1)) THEN + DummyPointSelect = LastInterPointSelect + ELSE + DummyPointSelect = (/.FALSE.,.FALSE./) + END IF + CALL PhotonComputeBiLinearIntersection(ThroughSide,GlobSideID, intersecDist,TempPointSelect, DummyPointSelect) +! print*,intersecDist, SideInfo_Shared(SIDE_NBELEMID,TempSideID), DoneLastElem(1,1), DummyPointSelect, 'ThroughSide',ThroughSide,'which', TempPointSelect IF(ThroughSide)THEN NrOfThroughSides = NrOfThroughSides + 1 LocSidesTemp(NrOfThroughSides) = localSideID @@ -381,12 +393,49 @@ SUBROUTINE PhotonTriaTracking() DistTemp(NrOfThroughSides) = intersecDist SideID = TempSideID LocalSide = localSideID - IntersectionPos(1:3) = PhotonProps%PhotonLastPos(1:3) + intersecDist*PhotonProps%PhotonDirection(1:3) + InterPointSelect = TempPointSelect(1:2) + InterPointSelectTemp(1:2,NrOfThroughSides) = TempPointSelect(1:2) + IntersectionPos(1:3) = PhotonProps%PhotonPos(1:3) + intersecDist*PhotonProps%PhotonDirection(1:3) +! print*, NrOfThroughSides, SideID, IntersectionPos END IF ! foundHit END IF ! UsePhotonTriaTracking END IF ! Mortar or regular side END DO LocSideLoop ! iLocSide=1,6 + IF ((NrOfThroughSides.EQ.0).AND.(.NOT.UsePhotonTriaTracking)) THEN + FallBack = .TRUE. + LocSideLoop2: DO iLocSide=1,nlocSides + TempSideID = ElemInfo_Shared(ELEM_FIRSTSIDEIND,ElemID) + iLocSide + localSideID = SideInfo_Shared(SIDE_LOCALID,TempSideID) + ! Side is not one of the 6 local sides + IF (localSideID.LE.0) CYCLE + NbElemID = SideInfo_Shared(SIDE_NBELEMID,TempSideID) + IF (NbElemID.LT.0) THEN ! Mortar side + CALL ABORT(__STAMP__,'Mortars not allowed for photon tracing!') + ELSE ! Regular side + ! A) TriaTracking + DO TriNum = 1,2 + ThroughSide = .FALSE. + CALL PhotonThroughSideCheck3DFast(localSideID,ElemID,ThroughSide,TriNum) + IF (ThroughSide) THEN + CALL PhotonIntersectionWithSide(localSideID,ElemID,TriNum, IntersectionPos, PhotonLost) + IF (PhotonLost) CYCLE + NrOfThroughSides = NrOfThroughSides + 1 + LocSidesTemp(NrOfThroughSides) = localSideID + TriNumTemp(NrOfThroughSides) = TriNum + GlobSideTemp(NrOfThroughSides) = TempSideID + ind = MAXLOC(ABS(PhotonProps%PhotonDirection),1) + intersecDist = (IntersectionPos(ind) - PhotonProps%PhotonPos(ind))/PhotonProps%PhotonDirection(ind) + InterPointSelect = (/.TRUE.,.TRUE./) + InterPointSelectTemp(1:2,NrOfThroughSides) = InterPointSelect + SideID = TempSideID + LocalSide = localSideID + END IF + END DO + END IF + END DO LocSideLoop2 + END IF +! TriNum = TriNumTemp(1) ! ---------------------------------------------------------------------------- ! Additional treatment if particle did not cross any sides or it crossed multiple sides @@ -399,7 +448,9 @@ SUBROUTINE PhotonTriaTracking() ASSOCIATE( LastPhotPos => PhotonProps%PhotonLastPos(1:3), & Pos => PhotonProps%PhotonPos(1:3), & Dir => PhotonProps%PhotonDirection(1:3) ) - CALL StoreLostPhotonProperties(LastPhotPos,Pos,Dir,ElemID) + print*, 'Dmand' +! read* + CALL StoreLostPhotonProperties(Pos,LastPhotPos,Dir,ElemID) NbrOfLostParticles=NbrOfLostParticles+1 IF(DisplayLostParticles)THEN IPWRITE(*,*) 'Error in Photon TriaTracking (NrOfThroughSides=0)! Photon lost. Element:', ElemID @@ -412,7 +463,7 @@ SUBROUTINE PhotonTriaTracking() Done = .TRUE. EXIT ELSE IF (NrOfThroughSides.GT.1) THEN - IF(UsePhotonTriaTracking)THEN + IF(UsePhotonTriaTracking.OR.FallBack)THEN ! Use the slower search method if particle appears to have crossed more than one side (possible for irregular hexagons ! and in the case of mortar elements) SecondNrOfThroughSides = 0 @@ -437,7 +488,7 @@ SUBROUTINE PhotonTriaTracking() ASSOCIATE( LastPhotPos => PhotonProps%PhotonLastPos(1:3), & Pos => PhotonProps%PhotonPos(1:3), & Dir => PhotonProps%PhotonDirection(1:3) ) - CALL StoreLostPhotonProperties(LastPhotPos,Pos,Dir,ElemID) + CALL StoreLostPhotonProperties(Pos,LastPhotPos,Dir,ElemID) NbrOfLostParticles=NbrOfLostParticles+1 IF(DisplayLostParticles)THEN IPWRITE(*,*) 'Error in Photon TriaTracking! PhotonIntersectionWithSide() cannot determine intersection'& @@ -471,7 +522,7 @@ SUBROUTINE PhotonTriaTracking() ASSOCIATE( LastPhotPos => PhotonProps%PhotonLastPos(1:3), & Pos => PhotonProps%PhotonPos(1:3), & Dir => PhotonProps%PhotonDirection(1:3) ) - CALL StoreLostPhotonProperties(LastPhotPos,Pos,Dir,ElemID) + CALL StoreLostPhotonProperties(Pos,LastPhotPos,Dir,ElemID) NbrOfLostParticles=NbrOfLostParticles+1 IF(DisplayLostParticles)THEN IPWRITE(*,*) 'Error in Photon TriaTracking! PhotonIntersectionWithSide() cannot determine intersection'& @@ -504,7 +555,7 @@ SUBROUTINE PhotonTriaTracking() ASSOCIATE( LastPhotPos => PhotonProps%PhotonLastPos(1:3), & Pos => PhotonProps%PhotonPos(1:3), & Dir => PhotonProps%PhotonDirection(1:3) ) - CALL StoreLostPhotonProperties(LastPhotPos,Pos,Dir,ElemID) + CALL StoreLostPhotonProperties(Pos,LastPhotPos,Dir,ElemID) NbrOfLostParticles=NbrOfLostParticles+1 IF(DisplayLostParticles)THEN IPWRITE(*,*) 'Error in Photon TriaTracking! Photon lost on second check. Element:', ElemID @@ -528,13 +579,14 @@ SUBROUTINE PhotonTriaTracking() TriNum = 1 intersecDist = DistTemp(ind2) oldElemIsMortar = .FALSE. + InterPointSelect = InterPointSelectTemp(1:2,ind2) IntersectionPos(1:3) = PhotonProps%PhotonLastPos(1:3) + intersecDist*PhotonProps%PhotonDirection(1:3) END IF END IF ! NrOfThroughSides.EQ.0/.GT.1 END IF ! NrOfThroughSides.NE.1 ! Dummy flag - IF(.NOT.UsePhotonTriaTracking) TriNum=1 + IF((.NOT.UsePhotonTriaTracking).OR.(.NOT.FallBack)) TriNum=1 ! ---------------------------------------------------------------------------- ! 3) In case of a boundary, perform the appropriate boundary interaction @@ -544,14 +596,14 @@ SUBROUTINE PhotonTriaTracking() BCType = PartBound%TargetBoundCond(iPBC) SELECT CASE(BCType) CASE(1) !PartBound%OpenBC) - IF(UsePhotonTriaTracking)THEN + IF(UsePhotonTriaTracking.OR.Fallback)THEN IF(NrOfThroughSides.LT.2)THEN CALL PhotonIntersectionWithSide(LocalSide,ElemID,TriNum, IntersectionPos, PhotonLost) IF(PhotonLost)THEN ASSOCIATE( LastPhotPos => PhotonProps%PhotonLastPos(1:3), & Pos => PhotonProps%PhotonPos(1:3), & Dir => PhotonProps%PhotonDirection(1:3) ) - CALL StoreLostPhotonProperties(LastPhotPos,Pos,Dir,ElemID) + CALL StoreLostPhotonProperties(Pos,LastPhotPos,Dir,ElemID) NbrOfLostParticles=NbrOfLostParticles+1 IF(DisplayLostParticles)THEN IPWRITE(*,*) 'Error in open BC Photon TriaTracking! PhotonIntersectionWithSide() cannot determine intersection'& @@ -590,14 +642,14 @@ SUBROUTINE PhotonTriaTracking() ! Check if specular of diffuse reflection IF (PartBound%PhotonSpecularReflection(iPBC)) THEN ! Specular reflection - IF ((NrOfThroughSides.LT.2).AND.(UsePhotonTriaTracking)) THEN + IF ((NrOfThroughSides.LT.2).AND.(UsePhotonTriaTracking.OR.Fallback)) THEN CALL PerfectPhotonReflection(LocalSide,ElemID,TriNum, IntersectionPos, .FALSE.) ELSE CALL PerfectPhotonReflection(LocalSide,ElemID,TriNum, IntersectionPos, .TRUE.) END IF ELSE ! Diffuse reflection - IF ((NrOfThroughSides.LT.2).AND.(UsePhotonTriaTracking)) THEN + IF ((NrOfThroughSides.LT.2).AND.(UsePhotonTriaTracking.OR.Fallback)) THEN CALL DiffusePhotonReflection(LocalSide,ElemID,TriNum, IntersectionPos, .FALSE.) ELSE CALL DiffusePhotonReflection(LocalSide,ElemID,TriNum, IntersectionPos, .TRUE.) @@ -617,13 +669,13 @@ SUBROUTINE PhotonTriaTracking() END IF ! RadiationAbsorptionModel.EQ.0 CASE(3) ! PartBound%PeriodicBC - IF((NrOfThroughSides.LT.2).AND.(UsePhotonTriaTracking))THEN - CALL PhotonIntersectionWithSide(LocalSide,ElemID,TriNum, IntersectionPos, PhotonLost) + IF((NrOfThroughSides.LT.2).AND.(UsePhotonTriaTracking.OR.Fallback))THEN + CALL PhotonIntersectionWithSide(LocalSide,ElemID,TriNum, IntersectionPos, PhotonLost) IF(PhotonLost)THEN ASSOCIATE( LastPhotPos => PhotonProps%PhotonLastPos(1:3), & Pos => PhotonProps%PhotonPos(1:3), & Dir => PhotonProps%PhotonDirection(1:3) ) - CALL StoreLostPhotonProperties(LastPhotPos,Pos,Dir,ElemID) + CALL StoreLostPhotonProperties(Pos,LastPhotPos,Dir,ElemID) NbrOfLostParticles=NbrOfLostParticles+1 IF(DisplayLostParticles)THEN IPWRITE(*,*) 'Error in periodic Photon TriaTracking! PhotonIntersectionWithSide() cannot determine intersection'& @@ -648,6 +700,7 @@ SUBROUTINE PhotonTriaTracking() IF ((BCType.EQ.2).OR.(BCType.EQ.10)) THEN DoneLastElem(:,:) = 0 + LastInterPointSelect = .FALSE. ELSE DO ind2= 5, 1, -1 DoneLastElem(:,ind2+1) = DoneLastElem(:,ind2) @@ -656,6 +709,7 @@ SUBROUTINE PhotonTriaTracking() DoneLastElem(2,1) = LocalSide DoneLastElem(3,1) = TriNum DoneLastElem(4,1) = SideID + LastInterPointSelect= InterPointSelect END IF ELSE ! BC(SideID).LE.0 DO ind2= 5, 1, -1 @@ -665,6 +719,7 @@ SUBROUTINE PhotonTriaTracking() DoneLastElem(2,1) = LocalSide DoneLastElem(3,1) = TriNum DoneLastElem(4,1) = SideID + LastInterPointSelect = InterPointSelect IF (oldElemIsMortar) THEN ElemID = SideInfo_Shared(SIDE_ELEMID,SideID) @@ -679,7 +734,7 @@ SUBROUTINE PhotonTriaTracking() ASSOCIATE( LastPhotPos => PhotonProps%PhotonLastPos(1:3), & Pos => PhotonProps%PhotonPos(1:3), & Dir => PhotonProps%PhotonDirection(1:3) ) - CALL StoreLostPhotonProperties(LastPhotPos,Pos,Dir,ElemID) + CALL StoreLostPhotonProperties(Pos,LastPhotPos,Dir,ElemID) NbrOfLostParticles=NbrOfLostParticles+1 IF(DisplayLostParticles)THEN IPWRITE(*,*) 'Error in Photon TriaTracking! PhotonIntersectionWithSide() cannot determine intersection'& @@ -703,6 +758,8 @@ SUBROUTINE PhotonTriaTracking() END IF ! PhotonLost END IF ! BC(SideID).GT./.LE. 0 +! print*, DONE, PhotonProps%PhotonDirection, PhotonProps%PhotonPos, ElemID, SideID +! read* ! Check if output to PartStateBoundary is activated IF(PhotonModeBPO.EQ.2)THEN CALL StoreBoundaryParticleProperties(0,& @@ -908,7 +965,7 @@ SUBROUTINE Photon2DSymTracking() END DO ! .NOT.PartisDone END SUBROUTINE Photon2DSymTracking -SUBROUTINE PhotonComputeBiLinearIntersection(isHit,SideID,Dist,ElemCheck_Opt) +SUBROUTINE PhotonComputeBiLinearIntersection(isHit,SideID, Dist,PointSelect,OldPointSelect,ElemCheck_Opt) !=================================================================================================================================== ! Compute the Intersection with planar surface, improved version by ! Haselbacher, A.; Najjar, F. M. & Ferry, J. P., An efficient and robust particle-localization algorithm for unstructured grids @@ -916,9 +973,10 @@ SUBROUTINE PhotonComputeBiLinearIntersection(isHit,SideID,Dist,ElemCheck_Opt) !=================================================================================================================================== ! MODULES USE MOD_Globals +USE MOD_Globals_Vars ,ONLY: EpsMach USE MOD_Utils ,ONLY: QuadraticSolver -USE MOD_Mesh_Tools ,ONLY: GetCNSideID -USE MOD_Particle_Mesh_Vars ,ONLY: SideInfo_Shared +USE MOD_Mesh_Tools ,ONLY: GetCNSideID, GetCNElemID +USE MOD_Particle_Mesh_Vars ,ONLY: SideInfo_Shared, ElemRadiusNGeo USE MOD_Particle_Surfaces_Vars ,ONLY: BaseVectors0,BaseVectors1,BaseVectors2,BaseVectors3,SideNormVec,epsilonTol!,BaseVectorsScale USE MOD_Particle_Surfaces ,ONLY: CalcNormAndTangBilinear USE MOD_Particle_Tracking_Vars ,ONLY: TrackingMethod @@ -940,6 +998,8 @@ SUBROUTINE PhotonComputeBiLinearIntersection(isHit,SideID,Dist,ElemCheck_Opt) INTEGER,INTENT(IN) :: SideID LOGICAL,INTENT(IN),OPTIONAL :: ElemCheck_Opt REAL, INTENT(OUT) :: Dist +LOGICAL,INTENT(OUT) :: PointSelect(2) +LOGICAL,INTENT(IN) :: OldPointSelect(2) !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES LOGICAL,INTENT(OUT) :: isHit @@ -957,9 +1017,10 @@ SUBROUTINE PhotonComputeBiLinearIntersection(isHit,SideID,Dist,ElemCheck_Opt) alpha = -1.0 xitild = -2.0 etatild = -2.0 +Dist = 0.0 isHit = .FALSE. +PointSelect = .FALSE. CNSideID = GetCNSideID(SideID) - ! compute initial vectors BiLinearCoeff(:,1) = 0.25*BaseVectors3(:,SideID) BiLinearCoeff(:,2) = 0.25*BaseVectors1(:,SideID) @@ -986,7 +1047,7 @@ SUBROUTINE PhotonComputeBiLinearIntersection(isHit,SideID,Dist,ElemCheck_Opt) IF (ABS(scaleFac).LT.epsilontol) RETURN ! Haselbacher et al. define d = d - r_p -BiLinearCoeff(:,4) = BiLinearCoeff(:,4) - PhotonProps%PhotonLastPos(1:3) +BiLinearCoeff(:,4) = BiLinearCoeff(:,4) - PhotonProps%PhotonPos(1:3) ! Calculate component normal to ray NormalCoeff(:,1) = BiLinearCoeff(:,1) - SUM(BiLinearCoeff(:,1)*PhotonProps%PhotonDirection(:))*PhotonProps%PhotonDirection @@ -1043,21 +1104,21 @@ SUBROUTINE PhotonComputeBiLinearIntersection(isHit,SideID,Dist,ElemCheck_Opt) IPWRITE(UNIT_stdOut,'(I0,A,I0)') ' Both denominators zero when calculating Xi in bilinear intersection' IPWRITE(UNIT_stdOut,'(I0,A,I0)') ' global SideID: ', SideID IPWRITE(UNIT_stdOut,'(I0,A,I0)') ' global ElemID: ', SideInfo_Shared(SIDE_ELEMID,SideID) - IPWRITE(UNIT_stdOut,'(I0,A,3(1X,ES25.17E3))') ' LastPhotonPos: ', PhotonProps%PhotonLastPos(1:3) - IPWRITE(UNIT_stdOut,'(I0,A,3(1X,ES25.17E3))') ' PhotonDirection: ', PhotonProps%PhotonDirection(1:3) + IPWRITE(UNIT_stdOut,'(I0,A,3(1X,ES25.17E3))') ' LastPhotonPos: ', PhotonProps%PhotonPos(1:3) + IPWRITE(UNIT_stdOut,'(I0,A,3(1X,ES25.17E3))') ' PhotonDirection: ', PhotonProps%PhotonDirection(1:3) CALL ABORT(__STAMP__,'Invalid intersection with bilinear side!',SideID) END IF IF( ABS(xi(1)).LE.1.0) THEN ! compute alpha only with valid xi and eta t(1) = ComputeSurfaceDistance2(BiLinearCoeff,xi(1),eta(1),PhotonProps%PhotonDirection) - - IF (t(1).GT.0.) THEN + IF ((t(1).GT.ABS(EpsMach)).AND.(.NOT.OldPointSelect(1))) THEN alpha = t(1) xitild = xi(1) etatild = eta(1) isHit = .TRUE. Dist = t(1) + PointSelect(1) = .TRUE. #ifdef CODE_ANALYZE IF(MPIRANKOUT.EQ.MyRank)THEN WRITE(UNIT_stdout,'(A,G0,A,G0)') ' | t(1): ',t(1),' | epsilonTolerance: ',epsilontol @@ -1091,12 +1152,12 @@ SUBROUTINE PhotonComputeBiLinearIntersection(isHit,SideID,Dist,ElemCheck_Opt) IF (Xi(1).EQ.HUGE(1.)) THEN return - IPWRITE(UNIT_stdOut,'(I0,A,I0)') ' Both denominators zero when calculating Xi in bilinear intersection' - IPWRITE(UNIT_stdOut,'(I0,A,I0)') ' global SideID: ', SideID - IPWRITE(UNIT_stdOut,'(I0,A,I0)') ' global ElemID: ', SideInfo_Shared(SIDE_ELEMID,SideID) - IPWRITE(UNIT_stdOut,'(I0,A,3(1X,ES25.17E3))') ' LastPhotonPos: ', PhotonProps%PhotonLastPos(1:3) - IPWRITE(UNIT_stdOut,'(I0,A,3(1X,ES25.17E3))') ' PhotonDirection: ', PhotonProps%PhotonDirection(1:3) - CALL ABORT(__STAMP__,'Invalid intersection with bilinear side!',SideID) +! IPWRITE(UNIT_stdOut,'(I0,A,I0)') ' Both denominators zero when calculating Xi in bilinear intersection' +! IPWRITE(UNIT_stdOut,'(I0,A,I0)') ' global SideID: ', SideID +! IPWRITE(UNIT_stdOut,'(I0,A,I0)') ' global ElemID: ', SideInfo_Shared(SIDE_ELEMID,SideID) +! IPWRITE(UNIT_stdOut,'(I0,A,3(1X,ES25.17E3))') ' LastPhotonPos: ', PhotonProps%PhotonPos(1:3) +! IPWRITE(UNIT_stdOut,'(I0,A,3(1X,ES25.17E3))') ' PhotonDirection: ', PhotonProps%PhotonDirection(1:3) +! CALL ABORT(__STAMP__,'Invalid intersection with bilinear side!',SideID) END IF IF( ABS(xi(1)).LE.1.0) THEN @@ -1109,7 +1170,7 @@ SUBROUTINE PhotonComputeBiLinearIntersection(isHit,SideID,Dist,ElemCheck_Opt) END IF #endif /*CODE_ANALYZE*/ - IF (t(1).GT.0.) THEN + IF (t(1).GT.ABS(EpsMach)) THEN InterType = InterType+1 isHit = .TRUE. #ifdef CODE_ANALYZE @@ -1128,12 +1189,12 @@ SUBROUTINE PhotonComputeBiLinearIntersection(isHit,SideID,Dist,ElemCheck_Opt) IF (Xi(2).EQ.HUGE(1.)) THEN return - IPWRITE(UNIT_stdOut,'(I0,A,I0)') ' Both denominators zero when calculating Xi in bilinear intersection' - IPWRITE(UNIT_stdOut,'(I0,A,I0)') ' global SideID: ', SideID - IPWRITE(UNIT_stdOut,'(I0,A,I0)') ' global ElemID: ', SideInfo_Shared(SIDE_ELEMID,SideID) - IPWRITE(UNIT_stdOut,'(I0,A,3(1X,ES25.17E3))') ' LastPhotonPos: ', PhotonProps%PhotonLastPos(1:3) - IPWRITE(UNIT_stdOut,'(I0,A,3(1X,ES25.17E3))') ' PhotonDirection: ', PhotonProps%PhotonDirection(1:3) - CALL ABORT(__STAMP__,'Invalid intersection with bilinear side!',SideID) +! IPWRITE(UNIT_stdOut,'(I0,A,I0)') ' Both denominators zero when calculating Xi in bilinear intersection' +! IPWRITE(UNIT_stdOut,'(I0,A,I0)') ' global SideID: ', SideID +! IPWRITE(UNIT_stdOut,'(I0,A,I0)') ' global ElemID: ', SideInfo_Shared(SIDE_ELEMID,SideID) +! IPWRITE(UNIT_stdOut,'(I0,A,3(1X,ES25.17E3))') ' LastPhotonPos: ', PhotonProps%PhotonPos(1:3) +! IPWRITE(UNIT_stdOut,'(I0,A,3(1X,ES25.17E3))') ' PhotonDirection: ', PhotonProps%PhotonDirection(1:3) +! CALL ABORT(__STAMP__,'Invalid intersection with bilinear side!',SideID) END IF IF( ABS(xi(2)).LE.1.0) THEN @@ -1146,7 +1207,7 @@ SUBROUTINE PhotonComputeBiLinearIntersection(isHit,SideID,Dist,ElemCheck_Opt) END IF #endif /*CODE_ANALYZE*/ - IF (t(2).GT.0.) THEN + IF (t(2).GT.ABS(EpsMach)) THEN InterType = InterType+2 isHit = .TRUE. #ifdef CODE_ANALYZE @@ -1165,17 +1226,28 @@ SUBROUTINE PhotonComputeBiLinearIntersection(isHit,SideID,Dist,ElemCheck_Opt) ! First intersection is only hit CASE(1) - alpha =t (1) - xitild =xi (1) - etatild=eta(1) - Dist = t(1) - + IF (.NOT.OldPointSelect(1)) THEN + alpha =t (1) + xitild =xi (1) + etatild=eta(1) + Dist = t(1) + PointSelect(1)=.TRUE. + ELSE + isHit = .FALSE. + RETURN + END IF ! Second intersection is only hit CASE(2) - alpha =t (2) - xitild =xi (2) - etatild=eta(2) - Dist = t(2) + IF (.NOT.OldPointSelect(2)) THEN + alpha =t (2) + xitild =xi (2) + etatild=eta(2) + Dist = t(2) + PointSelect(2)=.TRUE. + ELSE + isHit = .FALSE. + RETURN + END IF ! Two intersections found, decide on the correct one CASE(3) @@ -1193,16 +1265,20 @@ SUBROUTINE PhotonComputeBiLinearIntersection(isHit,SideID,Dist,ElemCheck_Opt) etatild=-2 ELSE ! Apparently we don't care about the direction of the PartTrajectory - IF(ABS(t(1)).LT.ABS(t(2)))THEN + IF((ABS(t(1)).LT.ABS(t(2))).AND.(.NOT.OldPointSelect(1)))THEN alpha =t (1) xitild =xi (1) etatild=eta(1) Dist = t(1) - ELSE + PointSelect(1)=.TRUE. + ELSE IF (.NOT.OldPointSelect(2)) THEN alpha =t (2) xitild =xi (2) etatild=eta(2) Dist = t(2) + PointSelect(2)=.TRUE. + ELSE + isHit = .FALSE. END IF END IF ! Inner side with double intersection, particle leaves and enters element diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 index a8edd9bf3..412ae0ccb 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking_tools.f90 @@ -669,7 +669,7 @@ SUBROUTINE CalcAbsorptionRayTrace(IntersectionPos,GlobalElemID,PhotonDir) REAL :: RandVal(3) !--------------------------------------------------------------------------------------------------! ! Calculate the direction and length of the path of the ray through the element -direction(1:3) = IntersectionPos(1:3)-PhotonProps%PhotonStartPos(1:3) +direction(1:3) = IntersectionPos(1:3)-PhotonProps%PhotonPos(1:3) length = VECNORM(direction(1:3)) ! Check primary or secondary direction @@ -708,6 +708,7 @@ SUBROUTINE CalcAbsorptionRayTrace(IntersectionPos,GlobalElemID,PhotonDir) U_N_Ray(GlobalElemID)%U(idx,k,l,m) = U_N_Ray(GlobalElemID)%U(idx,k,l,m) + sublength*PhotonProps%PhotonEnergy END DO END IF ! ABS(direction(3).GT.1e6*(ABS(direction(1))+ABS(direction(2)))) +PhotonProps%PhotonPos(1:3) = IntersectionPos(1:3) END SUBROUTINE CalcAbsorptionRayTrace From 956c05831e12ab2f5178171529bd88486b029caf Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Tue, 7 Nov 2023 12:12:25 +0100 Subject: [PATCH 315/495] Output ray tracing/radiation in 1% steps in PrintStatusLineRadiation() --- src/output/output.f90 | 8 ++++---- src/radiation/radiative_transfer/radtrans_init.f90 | 4 ++-- src/radiation/radiative_transfer/radtrans_main.f90 | 2 +- src/radiation/ray_tracing/raytrace.f90 | 3 +-- 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/output/output.f90 b/src/output/output.f90 index 61ca0ccd3..2d3db661a 100644 --- a/src/output/output.f90 +++ b/src/output/output.f90 @@ -287,14 +287,14 @@ SUBROUTINE PrintStatusLineRadiation(t,tStart,tEnd,Phot,outputrank) !days = MOD(time_remaining,365.) ! Use this if years are also to be displayed days = time_remaining IF (Phot) THEN - WRITE(UNIT_stdOut,'(A,E10.4,A,E10.4,A,A,I6,A1,I0.2,A1,I0.2,A1,I0.2,A,A,A,A3,F6.2,A3,A1)',ADVANCE='NO') & + WRITE(UNIT_stdOut,'(A,E10.4,A,E10.4,A,A,I6,A1,I0.2,A1,I0.2,A1,I0.2,A,A,A,A4,I3,A4,A1)',ADVANCE='NO') & ' Photon = ', t,' TotalPhotons = ', tEnd, ' ', ' eta = ',INT(days),':',INT(hours),':',INT(mins),':',INT(secs),' |',& - REPEAT('☄️ ',CEILING(percent/4)),REPEAT(' ',INT((100-percent)/4)),'| [',percent,'%] ',& + REPEAT('☄️ ',CEILING(percent/4)),REPEAT(' ',INT((100-percent)/4)),'| [ ',NINT(percent),'% ] ',& ACHAR(13) ! ACHAR(13) is carriage return ELSE - WRITE(UNIT_stdOut,'(A,E10.4,A,E10.4,A,A,I6,A1,I0.2,A1,I0.2,A1,I0.2,A,A,A,A3,F6.2,A3,A1)',ADVANCE='NO') & + WRITE(UNIT_stdOut,'(A,E10.4,A,E10.4,A,A,I6,A1,I0.2,A1,I0.2,A1,I0.2,A,A,A,A4,I3,A4,A1)',ADVANCE='NO') & ' Elem = ', t,' TotalElems = ', tEnd, ' ', ' eta = ',INT(days),':',INT(hours),':',INT(mins),':',INT(secs),' |',& - REPEAT('☢ ',CEILING(percent/4)),REPEAT(' ',INT((100-percent)/4)),'| [',percent,'%] ',& + REPEAT('☢ ',CEILING(percent/4)),REPEAT(' ',INT((100-percent)/4)),'| [ ',NINT(percent),'% ] ',& ACHAR(13) ! ACHAR(13) is carriage return END IF #ifdef INTEL diff --git a/src/radiation/radiative_transfer/radtrans_init.f90 b/src/radiation/radiative_transfer/radtrans_init.f90 index e22399696..7d533b360 100644 --- a/src/radiation/radiative_transfer/radtrans_init.f90 +++ b/src/radiation/radiative_transfer/radtrans_init.f90 @@ -316,8 +316,8 @@ SUBROUTINE InitRadiationTransport() SELECT CASE(RadiationSwitches%RadType) CASE(1) !calls radition solver module SWRITE(UNIT_stdOut,'(A)') ' Calculate Radiation Data per Cell ...' - ElemDisp = INT((lastElem-firstElem+1)/20) - ElemDisp = MAX(10,ElemDisp) + ElemDisp = INT((lastElem-firstElem+1)/100) + ElemDisp = MAX(1,ElemDisp) DO iElem = firstElem, lastElem IF((myRank.EQ.DisplRank).AND.(MOD(iElem-firstElem,ElemDisp).EQ.0)) CALL PrintStatusLineRadiation(REAL(iElem),REAL(firstElem),REAL(lastElem),.FALSE.,DisplRank) diff --git a/src/radiation/radiative_transfer/radtrans_main.f90 b/src/radiation/radiative_transfer/radtrans_main.f90 index a915e689a..ab6f8db9b 100644 --- a/src/radiation/radiative_transfer/radtrans_main.f90 +++ b/src/radiation/radiative_transfer/radtrans_main.f90 @@ -156,7 +156,7 @@ SUBROUTINE RadTrans_main() photonCount = 0 photVisCount = 0 LocPhotNum = SUM(RadTransPhotPerCellLoc(:)) - PhotDisp = INT(LocPhotNum/20) + PhotDisp = INT(LocPhotNum/100) PhotDisp = MAX(1,PhotDisp) DO iElem = 1, nComputeNodeElems IF (RadTransPhotPerCellLoc(iElem).GT.0) THEN diff --git a/src/radiation/ray_tracing/raytrace.f90 b/src/radiation/ray_tracing/raytrace.f90 index feab81b4e..d92ace97f 100644 --- a/src/radiation/ray_tracing/raytrace.f90 +++ b/src/radiation/ray_tracing/raytrace.f90 @@ -151,8 +151,7 @@ SUBROUTINE RayTracing() LocRayNum = NumRays/nProcessors IF(myrank.LT.MOD(NumRays,nProcessors)) LocRayNum = LocRayNum + 1 ! Output to screen every 20 rays to show that the tool is still running -RayDisp = MAX(1,INT(LocRayNum/20)) ! This value cannot be zero - +RayDisp = MAX(1,INT(LocRayNum/100)) ! This value cannot be zero RectPower = Ray%IntensityAmplitude * Ray%Area / REAL(NumRays) ! This array is not de-allocated during load balance as it is only written to .h5 during WriteStateToHDF5() From 1c8ac5543bb3e37d873bca3785c716f5e3ed9b24 Mon Sep 17 00:00:00 2001 From: Raphael Tietz Date: Tue, 7 Nov 2023 14:21:41 +0100 Subject: [PATCH 316/495] Included some checks and bugfixes + Flag for UNFP after MPI Particle send --- .../NIG_tracking_DSMC/curved/parameter.ini | 1 + src/particles/dsmc/dsmc_bg_gas.f90 | 22 +++---- src/particles/dsmc/dsmc_main.f90 | 4 -- src/particles/emission/particle_emission.f90 | 5 +- .../emission/particle_emission_init.f90 | 4 +- .../emission/particle_macroscopic_restart.f90 | 2 +- .../particle_position_and_velocity.f90 | 4 +- .../emission/particle_surface_flux.f90 | 8 +-- src/particles/particle_init.f90 | 8 +++ src/particles/particle_mpi/particle_mpi.f90 | 3 + src/particles/particle_tools.f90 | 61 +++++++++++++------ src/particles/particle_vars.f90 | 3 + src/particles/restart/particle_restart.f90 | 12 +--- 13 files changed, 81 insertions(+), 56 deletions(-) diff --git a/regressioncheck/NIG_tracking_DSMC/curved/parameter.ini b/regressioncheck/NIG_tracking_DSMC/curved/parameter.ini index 4d9d4567c..ec94670d7 100644 --- a/regressioncheck/NIG_tracking_DSMC/curved/parameter.ini +++ b/regressioncheck/NIG_tracking_DSMC/curved/parameter.ini @@ -21,6 +21,7 @@ RefMappingEps = 1e-5 RefMappingGuess = 3 BezierNewtonTolerance = 1e-4 BezierSplitLimit = 0.8 +Part-MPI-UNFP-afterPartSend = true ! =============================================================================== ! ! OUTPUT / VISUALIZATION ! =============================================================================== ! diff --git a/src/particles/dsmc/dsmc_bg_gas.f90 b/src/particles/dsmc/dsmc_bg_gas.f90 index dfb1023d4..8404d4b77 100644 --- a/src/particles/dsmc/dsmc_bg_gas.f90 +++ b/src/particles/dsmc/dsmc_bg_gas.f90 @@ -573,11 +573,13 @@ SUBROUTINE BGGas_PhotoIonization(iSpec,iInit,TotalNbrOfReactions) USE MOD_part_tools ,ONLY: CalcVelocity_maxwell_particle USE MOD_MCC_Vars ,ONLY: PhotoIonFirstLine,PhotoIonLastLine,PhotoReacToReac,PhotonEnergies USE MOD_MCC_Vars ,ONLY: NbrOfPhotonXsecReactions,SpecPhotonXSecInterpolated,MaxPhotonXSec +USE MOD_Part_Tools ,ONLY: GetNextFreePosition, IncreaseMaxParticleNumber ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES -INTEGER, INTENT(IN) :: iSpec,iInit,TotalNbrOfReactions +INTEGER, INTENT(IN) :: iSpec,iInit +INTEGER, INTENT(INOUT) :: TotalNbrOfReactions !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- @@ -687,8 +689,9 @@ SUBROUTINE BGGas_PhotoIonization(iSpec,iInit,TotalNbrOfReactions) !> 2.) Delete left-over inserted particles IF(TotalNbrOfReactions.GT.NbrOfParticle) THEN DO iPart = NbrOfParticle+1,TotalNbrOfReactions - PDM%ParticleInside(PDM%nextFreePosition(iPart+PDM%CurrentNextFreePosition)) = .FALSE. + PDM%ParticleInside(GetNextFreePosition(iPart)) = .FALSE. END DO + TotalNbrOfReactions = NbrOfParticle ELSE IF(TotalNbrOfReactions.LT.NbrOfParticle) THEN CALL Abort(__STAMP__,'PhotoIonization: Something is wrong, trying to perform more reactions than anticipated!') END IF @@ -704,14 +707,14 @@ SUBROUTINE BGGas_PhotoIonization(iSpec,iInit,TotalNbrOfReactions) DO iPart = 1, NbrOfParticle ! Loop over the particles with a set position (from SetParticlePosition) - ParticleIndex = PDM%nextFreePosition(iPart+PDM%CurrentNextFreePosition) + ParticleIndex = GetNextFreePosition(iPart) IF (DSMC%DoAmbipolarDiff) THEN newAmbiParts = newAmbiParts + 1 iPartIndx_NodeNewAmbi(newAmbiParts) = ParticleIndex END IF iNewPart = iNewPart + 1 ! Get a new index for the second product - NewParticleIndex = PDM%nextFreePosition(iNewPart+PDM%CurrentNextFreePosition+NbrOfParticle) + NewParticleIndex = GetNextFreePosition(iNewPart+NbrOfParticle) IF (NewParticleIndex.EQ.0) THEN CALL Abort(__STAMP__,'ERROR in PhotoIonization: MaxParticleNumber should be increased!') END IF @@ -769,14 +772,13 @@ SUBROUTINE BGGas_PhotoIonization(iSpec,iInit,TotalNbrOfReactions) IF(DSMC%ElectronicModel.GT.0) PartStateIntEn(3,ParticleIndex) = 0. END DO + ! Add the particles initialized through the emission and the background particles -PDM%ParticleVecLength = MIN(PDM%maxParticleNumber,PDM%ParticleVecLength + NbrOfParticle + iNewPart) ! Update the current next free position +PDM%ParticleVecLength = PDM%ParticleVecLength + NbrOfParticle + iNewPart PDM%CurrentNextFreePosition = PDM%CurrentNextFreePosition + NbrOfParticle + iNewPart +IF(PDM%ParticleVecLength.GT.PDM%maxParticleNumber) CALL IncreaseMaxParticleNumber(PDM%ParticleVecLength*CEILING(1+0.5*PDM%MaxPartNumIncrease)-PDM%maxParticleNumber) -IF(PDM%ParticleVecLength.GT.PDM%MaxParticleNumber) CALL Abort(__STAMP__& - ,'ERROR in PhotoIonization: ParticleVecLength greater than MaxParticleNumber! Increase the MaxParticleNumber to at least: ' & - , IntInfoOpt=PDM%ParticleVecLength) !> 4.) Perform the reaction, distribute the collision energy (including photon energy) and emit electrons perpendicular !> to the photon's path @@ -811,10 +813,6 @@ SUBROUTINE BGGas_PhotoIonization(iSpec,iInit,TotalNbrOfReactions) END DO END IF ! NbrOfPhotonXsecReactions.GT.0 -! Advance particle vector length and the current next free position with newly created particles -PDM%ParticleVecLength = MIN(PDM%maxParticleNumber,PDM%ParticleVecLength + DSMCSumOfFormedParticles) -PDM%CurrentNextFreePosition = PDM%CurrentNextFreePosition + DSMCSumOfFormedParticles - DSMCSumOfFormedParticles = 0 DEALLOCATE(Coll_pData) diff --git a/src/particles/dsmc/dsmc_main.f90 b/src/particles/dsmc/dsmc_main.f90 index c337c8cb3..dacea3e4d 100644 --- a/src/particles/dsmc/dsmc_main.f90 +++ b/src/particles/dsmc/dsmc_main.f90 @@ -127,10 +127,6 @@ SUBROUTINE DSMC_main(DoElement) #endif /*USE_LOADBALANCE*/ END DO ! iElem Loop -! Advance particle vector length and the current next free position with newly created particles -PDM%ParticleVecLength = MIN(PDM%maxParticleNumber,PDM%ParticleVecLength + DSMCSumOfFormedParticles) -! PDM%CurrentNextFreePosition = PDM%CurrentNextFreePosition + DSMCSumOfFormedParticles - IF(PDM%ParticleVecLength.GT.PDM%MaxParticleNumber) THEN CALL Abort(__STAMP__& ,'ERROR in DSMC: ParticleVecLength greater than MaxParticleNumber! Increase the MaxParticleNumber to at least: ' & diff --git a/src/particles/emission/particle_emission.f90 b/src/particles/emission/particle_emission.f90 index e9823ec26..3ef4ed491 100644 --- a/src/particles/emission/particle_emission.f90 +++ b/src/particles/emission/particle_emission.f90 @@ -42,7 +42,7 @@ SUBROUTINE ParticleInserting() USE MOD_Timedisc_Vars ,ONLY: RKdtFrac,RKdtFracTotal USE MOD_Particle_Vars USE MOD_PIC_Vars -USE MOD_part_tools ,ONLY: UpdateNextFreePosition, GetNextFreePosition +USE MOD_part_tools ,ONLY: UpdateNextFreePosition, GetNextFreePosition, IncreaseMaxParticleNumber USE MOD_DSMC_Vars ,ONLY: useDSMC, CollisMode, SpecDSMC USE MOD_part_emission_tools ,ONLY: DSMC_SetInternalEnr_LauxVFD USE MOD_DSMC_PolyAtomicModel ,ONLY: DSMC_SetInternalEnr_Poly @@ -352,7 +352,8 @@ SUBROUTINE ParticleInserting() END IF ! CalcPartBalance ! Update the current next free position and increase the particle vector length PDM%CurrentNextFreePosition = PDM%CurrentNextFreePosition + NbrOfParticle - PDM%ParticleVecLength = MIN(PDM%maxParticleNumber,PDM%ParticleVecLength + NbrOfParticle) + PDM%ParticleVecLength = PDM%ParticleVecLength + NbrOfParticle + IF(PDM%ParticleVecLength.GT.PDM%maxParticleNumber) CALL IncreaseMaxParticleNumber(PDM%ParticleVecLength*CEILING(1+0.5*PDM%MaxPartNumIncrease)-PDM%maxParticleNumber) ! Complete check if all particles were emitted successfully #if USE_MPI diff --git a/src/particles/emission/particle_emission_init.f90 b/src/particles/emission/particle_emission_init.f90 index cb8ba2cc5..31373de01 100644 --- a/src/particles/emission/particle_emission_init.f90 +++ b/src/particles/emission/particle_emission_init.f90 @@ -508,7 +508,8 @@ SUBROUTINE InitialParticleInserting() END DO END IF ! Add new particles to particle vector length - PDM%ParticleVecLength = MIN(PDM%maxParticleNumber,PDM%ParticleVecLength + NbrOfParticle) + PDM%ParticleVecLength = PDM%ParticleVecLength + NbrOfParticle + IF(PDM%ParticleVecLength.GT.PDM%maxParticleNumber) CALL IncreaseMaxParticleNumber(PDM%ParticleVecLength*CEILING(1+0.5*PDM%MaxPartNumIncrease)-PDM%maxParticleNumber) ! Update CALL UpdateNextFreePosition() END IF ! Species(iSpec)%Init(iInit)%ParticleEmissionType.EQ.0 @@ -531,7 +532,6 @@ SUBROUTINE InitialParticleInserting() END DO END IF END IF -CALL IncreaseMaxParticleNumber() LBWRITE(UNIT_stdOut,'(A)') ' INITIAL PARTICLE INSERTING DONE!' diff --git a/src/particles/emission/particle_macroscopic_restart.f90 b/src/particles/emission/particle_macroscopic_restart.f90 index ba7b744e9..f9d765e81 100644 --- a/src/particles/emission/particle_macroscopic_restart.f90 +++ b/src/particles/emission/particle_macroscopic_restart.f90 @@ -216,8 +216,8 @@ SUBROUTINE MacroRestart_InsertParticles() END DO ! nElems ! IF(locnPart.GE.PDM%maxParticleNumber) CALL abort(__STAMP__,'ERROR in MacroRestart: Increase maxParticleNumber!', locnPart) -IPWRITE(*,*) "PDM%ParticleVecLength,locnPart",PDM%ParticleVecLength,locnPart PDM%ParticleVecLength = PDM%ParticleVecLength + locnPart +IF(PDM%ParticleVecLength.GT.PDM%maxParticleNumber) CALL IncreaseMaxParticleNumber(PDM%ParticleVecLength*CEILING(1+0.5*PDM%MaxPartNumIncrease)-PDM%maxParticleNumber) END SUBROUTINE MacroRestart_InsertParticles diff --git a/src/particles/emission/particle_position_and_velocity.f90 b/src/particles/emission/particle_position_and_velocity.f90 index 8da058a75..5c6164199 100644 --- a/src/particles/emission/particle_position_and_velocity.f90 +++ b/src/particles/emission/particle_position_and_velocity.f90 @@ -311,12 +311,12 @@ SUBROUTINE SetParticlePosition(FractNbr,iInit,NbrOfParticle) DO i = 1,chunkSize ! Find a free position in the PDM array IF(AcceptedParts(i).NE.-1) THEN - ParticleIndexNbr = GetNextFreePosition(Species(FractNbr)%Init(iInit)%mySumOfMatchedParticles+1) + Species(FractNbr)%Init(iInit)%mySumOfMatchedParticles = Species(FractNbr)%Init(iInit)%mySumOfMatchedParticles + 1 + ParticleIndexNbr = GetNextFreePosition(Species(FractNbr)%Init(iInit)%mySumOfMatchedParticles) PartState(1:DimSend,ParticleIndexNbr) = particle_positions(DimSend*(i-1)+1:DimSend*(i-1)+DimSend) PDM%ParticleInside(ParticleIndexNbr)=.TRUE. PEM%GlobalElemID(ParticleIndexNbr) = AcceptedParts(i) IF(TrackingMethod.EQ.REFMAPPING) CALL GetPositionInRefElem(PartState(1:DimSend,ParticleIndexNbr),PartPosRef(1:3,ParticleIndexNbr),AcceptedParts(i)) - Species(FractNbr)%Init(iInit)%mySumOfMatchedParticles = Species(FractNbr)%Init(iInit)%mySumOfMatchedParticles + 1 PDM%IsNewPart(ParticleIndexNbr) = .TRUE. PDM%dtFracPush(ParticleIndexNbr) = .FALSE. END IF diff --git a/src/particles/emission/particle_surface_flux.f90 b/src/particles/emission/particle_surface_flux.f90 index 7974195bd..2bc8cd5ff 100644 --- a/src/particles/emission/particle_surface_flux.f90 +++ b/src/particles/emission/particle_surface_flux.f90 @@ -35,7 +35,7 @@ SUBROUTINE ParticleSurfaceflux() ! Modules USE MOD_Globals USE MOD_Particle_Vars -USE MOD_part_tools ,ONLY: CalcRadWeightMPF +USE MOD_part_tools ,ONLY: CalcRadWeightMPF, IncreaseMaxParticleNumber USE MOD_DSMC_Vars ,ONLY: useDSMC, CollisMode, RadialWeighting, DSMC USE MOD_Eval_xyz ,ONLY: GetPositionInRefElem USE MOD_Mesh_Vars ,ONLY: SideToElem, offsetElem @@ -257,9 +257,6 @@ SUBROUTINE ParticleSurfaceflux() IF (useDSMC) THEN IF (DSMC%DoAmbipolarDiff) CALL AD_SetSFElectronVelo(iSpec,iSF,iSample,jSample,iSide,BCSideID,SideID,ElemID,NbrOfParticle,PartInsSubSide,particle_xis) - DO iPart = 1, NbrOfParticle - PositionNbr = GetNextFreePosition(iPart) - END DO END IF IF (SF%VeloIsNormal .AND. .NOT.TriaSurfaceFlux) DEALLOCATE(particle_xis) @@ -294,7 +291,8 @@ SUBROUTINE ParticleSurfaceflux() END IF ! CalcPartBalance ! instead of an UpdateNextfreePosition we update the particleVecLength only - enough ?!? PDM%CurrentNextFreePosition = PDM%CurrentNextFreePosition + NbrOfParticle - PDM%ParticleVecLength = MIN(PDM%ParticleVecLength + NbrOfParticle,PDM%maxParticleNumber) + PDM%ParticleVecLength = PDM%ParticleVecLength + NbrOfParticle + IF(PDM%ParticleVecLength.GT.PDM%maxParticleNumber) CALL IncreaseMaxParticleNumber(PDM%ParticleVecLength*CEILING(1+0.5*PDM%MaxPartNumIncrease)-PDM%maxParticleNumber) #if USE_LOADBALANCE CALL LBPauseTime(LB_SURFFLUX,tLBStart) #endif /*USE_LOADBALANCE*/ diff --git a/src/particles/particle_init.f90 b/src/particles/particle_init.f90 index 58587de89..67c382acb 100644 --- a/src/particles/particle_init.f90 +++ b/src/particles/particle_init.f90 @@ -96,6 +96,11 @@ SUBROUTINE DefineParametersParticles() , '0.1') CALL prms%CreateLogicalOption( 'Part-RearrangePartIDs', 'Rearrange PartIDs in the process of reducing maxPartNum to allow lower memory usage'& , '.TRUE.') +#if USE_MPI +CALL prms%CreateLogicalOption( 'Part-MPI-UNFP-afterPartSend', 'UpdateNextFreePosition after MPIParticleSend to reduce '//& + 'PDM%maxParticleNummber increase and decreace operations'& + , '.FALSE.') +#endif CALL prms%CreateIntOption( 'Part-NumberOfRandomSeeds' , 'Number of Seeds for Random Number Generator'//& 'Choose nRandomSeeds \n'//& '=-1 Random \n'//& @@ -434,6 +439,9 @@ SUBROUTINE InitializeVariables() PDM%maxAllowedParticleNumber = GETINT('Part-maxParticleNumber',TRIM(hilf)) PDM%MaxPartNumIncrease = GETREAL('Part-MaxPartNumIncrease','0.1') PDM%RearrangePartIDs = GETLOGICAL('Part-RearrangePartIDs','.TRUE.') +#if USE_MPI +PDM%UNFPafterMPIPartSend = GETLOGICAL('Part-MPI-UNFP-afterPartSend','.FALSE.') +#endif PDM%maxParticleNumber=1 PDM%ParticleVecLength=0 CALL AllocateParticleArrays() diff --git a/src/particles/particle_mpi/particle_mpi.f90 b/src/particles/particle_mpi/particle_mpi.f90 index 1856d1978..1c9508cce 100644 --- a/src/particles/particle_mpi/particle_mpi.f90 +++ b/src/particles/particle_mpi/particle_mpi.f90 @@ -446,6 +446,7 @@ SUBROUTINE MPIParticleSend(UseOldVecLength) USE MOD_Particle_Tracking_Vars, ONLY:TrackingMethod USE MOD_Particle_Vars, ONLY:PartState,PartSpecies,usevMPF,PartMPF,PEM,PDM,PartPosRef,Species USE MOD_Particle_Vars, ONLY:UseRotRefFrame,PartVeloRotRef +USE MOD_Part_Tools ,ONLY: UpdateNextFreePosition #if defined(LSERK) USE MOD_Particle_Vars, ONLY:Pt_temp #endif @@ -879,6 +880,8 @@ SUBROUTINE MPIParticleSend(UseOldVecLength) ! Deallocate sendBuffer after send was successful, see MPIParticleRecv END DO ! iProc +IF(PDM%UNFPafterMPIPartSend) CALL UpdateNextFreePosition() + END SUBROUTINE MPIParticleSend diff --git a/src/particles/particle_tools.f90 b/src/particles/particle_tools.f90 index 1d79d7bef..03358c2f3 100644 --- a/src/particles/particle_tools.f90 +++ b/src/particles/particle_tools.f90 @@ -1628,30 +1628,55 @@ FUNCTION GetNextFreePosition(Offset) INTEGER :: GetNextFreePosition !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES +INTEGER :: i !=================================================================================================================================== IF(PRESENT(Offset)) THEN - IF(PDM%CurrentNextFreePosition+Offset.GT.PDM%MaxParticleNumber) CALL IncreaseMaxParticleNumber() + IF(PDM%CurrentNextFreePosition+Offset.GT.PDM%MaxParticleNumber) CALL IncreaseMaxParticleNumber(CEILING((PDM%CurrentNextFreePosition+Offset)*(1+PDM%MaxPartNumIncrease)-PDM%MaxParticleNumber)) GetNextFreePosition = PDM%nextFreePosition(PDM%CurrentNextFreePosition+Offset) + ! If next free position is equal 0, determine how much more particles are needed to get a position within the particle vector IF(GetNextFreePosition.EQ.0) THEN - CALL IncreaseMaxParticleNumber() + IF(PDM%nextFreePosition(1).EQ.0) THEN + i = 0 + ELSE + i = PDM%CurrentNextFreePosition+Offset + DO WHILE(PDM%nextFreePosition(i).EQ.0.AND.i.GT.0) + i = i - 1 + END DO + END IF + ! Increase the maxpartnum + margin + CALL IncreaseMaxParticleNumber(CEILING((PDM%CurrentNextFreePosition+Offset-i)*(1+PDM%MaxPartNumIncrease)+PDM%maxParticleNumber*PDM%MaxPartNumIncrease)) GetNextFreePosition = PDM%nextFreePosition(PDM%CurrentNextFreePosition+Offset) END IF ELSE PDM%CurrentNextFreePosition = PDM%CurrentNextFreePosition + 1 - IF(PDM%CurrentNextFreePosition.GT.PDM%MaxParticleNumber) CALL IncreaseMaxParticleNumber() + IF(PDM%CurrentNextFreePosition.GT.PDM%MaxParticleNumber) CALL IncreaseMaxParticleNumber(CEILING((PDM%CurrentNextFreePosition)*(1+PDM%MaxPartNumIncrease)-PDM%MaxParticleNumber)) GetNextFreePosition = PDM%nextFreePosition(PDM%CurrentNextFreePosition) + ! If next free position is equal 0, determine how much more particles are needed to get a position within the particle vector IF(GetNextFreePosition.EQ.0) THEN - CALL IncreaseMaxParticleNumber() + IF(PDM%nextFreePosition(1).EQ.0) THEN + i = 0 + ELSE + i = PDM%CurrentNextFreePosition + DO WHILE(PDM%nextFreePosition(i).EQ.0.AND.i.GT.0) + i = i - 1 + END DO + END IF + ! Increase the maxpartnum + margin + CALL IncreaseMaxParticleNumber(CEILING((PDM%CurrentNextFreePosition-i)*(1+PDM%MaxPartNumIncrease)+PDM%maxParticleNumber*PDM%MaxPartNumIncrease)) GetNextFreePosition = PDM%nextFreePosition(PDM%CurrentNextFreePosition) END IF - IF(PDM%ParticleInside(GetNextFreePosition)) CALL ABORT(& + IF(PDM%ParticleInside(GetNextFreePosition)) THEN + CALL ABORT(& __STAMP__& - ,'This Particle is already in use',IntInfoOpt=PDM%MaxParticleNumber) - IF(GetNextFreePosition.GT.PDM%ParticleVecLength) PDM%ParticleVecLength = PDM%ParticleVecLength + 1 + ,'This Particle is already in use',IntInfoOpt=GetNextFreePosition) + END IF + IF(GetNextFreePosition.GT.PDM%ParticleVecLength) PDM%ParticleVecLength = GetNextFreePosition END IF -IF(GetNextFreePosition.EQ.0) CALL ABORT(& +IF(GetNextFreePosition.EQ.0) THEN + CALL ABORT(& __STAMP__& ,'This should not happen, PDM%MaxParticleNumber reached',IntInfoOpt=PDM%MaxParticleNumber) +END IF END FUNCTION GetNextFreePosition @@ -1667,7 +1692,7 @@ SUBROUTINE IncreaseMaxParticleNumber(Amount) #if USE_MPI USE MOD_Particle_MPI_Vars ,ONLY: PartShiftVector, PartTargetProc #endif -USE MOD_PICInterpolation_Vars ,ONLY: FieldAtParticle +USE MOD_PICInterpolation_Vars ,ONLY: FieldAtParticle, DoInterpolation #if defined(IMPA) || defined(ROS) USE MOD_LinearSolver_Vars ,ONLY: PartXK, R_PartXK #endif @@ -1699,10 +1724,11 @@ SUBROUTINE IncreaseMaxParticleNumber(Amount) __STAMP__& ,'More Particles needed than allowed in PDM%maxAllowedParticleNumber',IntInfoOpt=NewSize) ELSE - IF(PDM%MaxParticleNumber.EQ.PDM%maxAllowedParticleNumber)CALL ABORT(& + NewSize=MAX(CEILING(PDM%MaxParticleNumber*(1+PDM%MaxPartNumIncrease)),PDM%MaxParticleNumber+1) + IF(PDM%MaxParticleNumber.GE.PDM%maxAllowedParticleNumber) CALL ABORT(& __STAMP__& ,'More Particles needed than allowed in PDM%maxAllowedParticleNumber',IntInfoOpt=NewSize) - NewSize=MIN(MAX(CEILING(PDM%MaxParticleNumber*(1+PDM%MaxPartNumIncrease)),PDM%MaxParticleNumber+1),PDM%maxAllowedParticleNumber) + NewSize=MIN(NewSize,PDM%maxAllowedParticleNumber) IPWRITE(*,*) "Increase by percent" END IF @@ -1894,6 +1920,7 @@ SUBROUTINE IncreaseMaxParticleNumber(Amount) __STAMP__& ,'Cannot allocate increased Array in IncreaseMaxParticleNumber') Temp2Real(:,1:PDM%MaxParticleNumber)=Pt + IF(.NOT.DoInterpolation) Temp2Real(:,PDM%MaxParticleNumber+1:NewSize)=0 CALL MOVE_ALLOC(Temp2Real,Pt) END IF @@ -2200,14 +2227,10 @@ SUBROUTINE ReduceMaxParticleNumber() ! REAL :: !=================================================================================================================================== -IF(useDSMC.OR.usevMPF) THEN - nPart=SUM(PEM%pNumber) -ELSE - nPart=0 - DO i=1,PDM%ParticleVecLength - IF(PDM%ParticleInside(i)) nPart = nPart + 1 - END DO -END IF +nPart=0 +DO i=1,PDM%ParticleVecLength + IF(PDM%ParticleInside(i)) nPart = nPart + 1 +END DO IF(DSMC%DoAmbipolarDiff) THEN DO i=1,PDM%ParticleVecLength diff --git a/src/particles/particle_vars.f90 b/src/particles/particle_vars.f90 index 00f864ecc..5ac4b4f13 100644 --- a/src/particles/particle_vars.f90 +++ b/src/particles/particle_vars.f90 @@ -197,6 +197,9 @@ PPURE INTEGER FUNCTION ElemID_INTERFACE(iPart) INTEGER :: maxParticleNumber ! Maximum Number of all Particles INTEGER :: maxAllowedParticleNumber ! Maximum allowed number of PDM%maxParticleNumber LOGICAL :: RearrangePartIDs ! Rearrange PartIDs during shrinking maxPartNum +#if USE_MPI + LOGICAL :: UNFPafterMPIPartSend ! UpdateNextFreePosition after MPI Part Send +#endif INTEGER :: ParticleVecLength ! Vector Length for Particle Push Calculation INTEGER :: ParticleVecLengthOld ! Vector Length for Particle Push Calculation REAL :: MaxPartNumIncrease ! How much shall the PDM%MaxParticleNumber be incresed if it is full diff --git a/src/particles/restart/particle_restart.f90 b/src/particles/restart/particle_restart.f90 index 78979aeeb..d1fb9e5f4 100644 --- a/src/particles/restart/particle_restart.f90 +++ b/src/particles/restart/particle_restart.f90 @@ -280,17 +280,10 @@ SUBROUTINE ParticleRestart() SDEALLOCATE(MapPartDataToReadin) PDM%ParticleVecLength = PDM%ParticleVecLength + iPart + IF(PDM%ParticleVecLength.GT.PDM%maxParticleNumber) CALL IncreaseMaxParticleNumber(PDM%ParticleVecLength*CEILING(1+0.5*PDM%MaxPartNumIncrease)-PDM%maxParticleNumber) CALL UpdateNextFreePosition() LBWRITE(UNIT_stdOut,*)' DONE!' - ! if ParticleVecLength GT maxParticleNumber: Stop - IF (PDM%ParticleVecLength.GT.PDM%maxParticleNumber) THEN - SWRITE (UNIT_stdOut,*) "PDM%ParticleVecLength =", PDM%ParticleVecLength - SWRITE (UNIT_stdOut,*) "PDM%maxParticleNumber =", PDM%maxParticleNumber - CALL abort(__STAMP__& - ,' Number of Particles in Restart file is higher than MaxParticleNumber! Increase MaxParticleNumber!') - END IF ! PDM%ParticleVecLength.GT.PDM%maxParticleNumber - ! Since the elementside-local node number are NOT persistant and dependent on the location ! of the MPI borders, all particle-element mappings need to be checked after a restart ! Step 1: Identify particles that are not in the element in which they were before the restart @@ -719,6 +712,7 @@ SUBROUTINE ParticleRestart() END DO ! iPart = 1, TotalNbrOfMissingParticlesSum PDM%ParticleVecLength = PDM%ParticleVecLength + NbrOfFoundParts + IF(PDM%ParticleVecLength.GT.PDM%maxParticleNumber) CALL IncreaseMaxParticleNumber(PDM%ParticleVecLength*CEILING(1+0.5*PDM%MaxPartNumIncrease)-PDM%maxParticleNumber) ! Combine number of found particles to make sure none are lost completely or found twice IF(MPIroot)THEN @@ -782,7 +776,7 @@ SUBROUTINE ParticleRestart() NbrOfLostParticles = 0 END IF ! NbrOfMissingParticles.GT.0 #endif /*USE_MPI*/ - CALL IncreaseMaxParticleNumber() + CALL UpdateNextFreePosition() ! Read-in the stored cloned particles From b011f6c87e24edb98aafa60b55a139ccb28a5ffd Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Tue, 7 Nov 2023 17:47:51 +0100 Subject: [PATCH 317/495] Allow a maximum number of MaxIterPhoton=1000 fallback tries during photon bilinear tray tracing before marking the photon as lost. Also introduced error codes for lost photons, 999: lost during tracking and 9999: lost during tracking but reached MaxIterPhoton (bilinear tracking). --- src/particles/particle_tools.f90 | 7 ++++-- .../tracking/radtrans_tracking.f90 | 25 +++++++++++++------ 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/particles/particle_tools.f90 b/src/particles/particle_tools.f90 index 01adc43e7..464560e12 100644 --- a/src/particles/particle_tools.f90 +++ b/src/particles/particle_tools.f90 @@ -229,7 +229,7 @@ SUBROUTINE UpdateNextFreePosition(WithOutMPIParts) END SUBROUTINE UpdateNextFreePosition -SUBROUTINE StoreLostPhotonProperties(ElemID,CallingFileName,LineNbrOfCall) +SUBROUTINE StoreLostPhotonProperties(ElemID,CallingFileName,LineNbrOfCall,ErrorCode) !----------------------------------------------------------------------------------------------------------------------------------! ! Store information of a lost photons during tracking !----------------------------------------------------------------------------------------------------------------------------------! @@ -247,6 +247,9 @@ SUBROUTINE StoreLostPhotonProperties(ElemID,CallingFileName,LineNbrOfCall) CHARACTER(LEN=*),INTENT(IN) :: CallingFileName ! Name of calling file INTEGER,INTENT(IN) :: LineNbrOfCall ! Line number from which this function was called from CallingFileName INTEGER,INTENT(IN) :: ElemID ! Global element index +INTEGER,INTENT(IN) :: ErrorCode ! Code for identifying the type of error that was encountered. +! ! 999: lost during tracking +! ! 9999: lost during tracking but reached MaxIterPhoton (bilinear tracking) INTEGER :: dims(2) !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES @@ -304,7 +307,7 @@ SUBROUTINE StoreLostPhotonProperties(ElemID,CallingFileName,LineNbrOfCall) ! 4-6: Particle velocity PartStateLost(4:6 ,iMax) = Dir(1:3) ! 7: SpeciesID - PartStateLost(7 ,iMax) = REAL(999) + PartStateLost(7 ,iMax) = REAL(ErrorCode) ! 8: Macro particle factor PartStateLost(8 ,iMax) = 0.0 ! 9: time of loss diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 index 8da6e21c8..66b2652ea 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 @@ -286,8 +286,9 @@ SUBROUTINE PhotonTriaTracking() ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES +INTEGER,PARAMETER :: MaxIterPhoton=1000 ! Maximum number of cycles in the do while loop for each photon INTEGER :: NblocSideID, NbElemID, ind, nbSideID, nMortarElems, BCType, localSideID, iPBC, GlobSideID -INTEGER :: ElemID,OldElemID,nlocSides +INTEGER :: ElemID,OldElemID,nlocSides,IterPhoton INTEGER :: LocalSide INTEGER :: NrOfThroughSides, ind2 INTEGER :: SideID,TempSideID,iLocSide @@ -310,6 +311,7 @@ SUBROUTINE PhotonTriaTracking() DoneLastElem(:,:) = 0 InterPointSelect = .FALSE. LastInterPointSelect = .FALSE. +IterPhoton=0 ! 1) Loop tracking until Photon is considered "done" (either absorbed or deleted) DO WHILE (.NOT.Done) @@ -402,6 +404,13 @@ SUBROUTINE PhotonTriaTracking() END DO LocSideLoop ! iLocSide=1,6 IF ((NrOfThroughSides.EQ.0).AND.(.NOT.UsePhotonTriaTracking)) THEN + ! Check if tracking fails to converge + IterPhoton = IterPhoton + 1 ! Stop when MaxIterPhoton is reached with this counter + IF(IterPhoton.GE.MaxIterPhoton)THEN + CALL StoreLostPhotonProperties(ElemID,TRIM(__FILE__),__LINE__,9999) + Done = .TRUE. + EXIT + END IF ! IterPhoton.GE.100 FallBack = .TRUE. LocSideLoop2: DO iLocSide=1,nlocSides TempSideID = ElemInfo_Shared(ELEM_FIRSTSIDEIND,ElemID) + iLocSide @@ -444,7 +453,7 @@ SUBROUTINE PhotonTriaTracking() ! the determinants IF (NrOfThroughSides.EQ.0) THEN ! Particle appears to have not crossed any of the checked sides (NrOfThroughSides=0). Deleted! - CALL StoreLostPhotonProperties(ElemID,TRIM(__FILE__),__LINE__) + CALL StoreLostPhotonProperties(ElemID,TRIM(__FILE__),__LINE__,999) Done = .TRUE. EXIT ELSE IF (NrOfThroughSides.GT.1) THEN @@ -472,7 +481,7 @@ SUBROUTINE PhotonTriaTracking() IF(PhotonLost)THEN ! Error in Photon TriaTracking! PhotonIntersectionWithSide() cannot determine intersection because photon is ! parallel to side - CALL StoreLostPhotonProperties(ElemID,TRIM(__FILE__),__LINE__) + CALL StoreLostPhotonProperties(ElemID,TRIM(__FILE__),__LINE__,999) Done = .TRUE. EXIT END IF ! PhotonLost @@ -495,7 +504,7 @@ SUBROUTINE PhotonTriaTracking() IF(PhotonLost)THEN ! Error in Photon TriaTracking! PhotonIntersectionWithSide() cannot determine intersection because photon is ! parallel to side - CALL StoreLostPhotonProperties(ElemID,TRIM(__FILE__),__LINE__) + CALL StoreLostPhotonProperties(ElemID,TRIM(__FILE__),__LINE__,999) Done = .TRUE. EXIT END IF ! PhotonLost @@ -515,7 +524,7 @@ SUBROUTINE PhotonTriaTracking() END DO ! ind2 = 1, NrOfThroughSides ! Particle that went through multiple sides first, but did not cross any sides during the second check -> Deleted! IF (SecondNrOfThroughSides.EQ.0) THEN - CALL StoreLostPhotonProperties(ElemID,TRIM(__FILE__),__LINE__) + CALL StoreLostPhotonProperties(ElemID,TRIM(__FILE__),__LINE__,999) Done = .TRUE. EXIT END IF @@ -553,7 +562,7 @@ SUBROUTINE PhotonTriaTracking() IF(PhotonLost)THEN ! Error in open BC Photon TriaTracking! PhotonIntersectionWithSide() cannot determine intersection because photon is ! parallel to side - CALL StoreLostPhotonProperties(ElemID,TRIM(__FILE__),__LINE__) + CALL StoreLostPhotonProperties(ElemID,TRIM(__FILE__),__LINE__,999) Done = .TRUE. EXIT END IF ! PhotonLost @@ -614,7 +623,7 @@ SUBROUTINE PhotonTriaTracking() IF(PhotonLost)THEN ! Error in periodic Photon TriaTracking! PhotonIntersectionWithSide() cannot determine intersection because photon is ! parallel to side - CALL StoreLostPhotonProperties(ElemID,TRIM(__FILE__),__LINE__) + CALL StoreLostPhotonProperties(ElemID,TRIM(__FILE__),__LINE__,999) Done = .TRUE. EXIT END IF ! PhotonLost @@ -661,7 +670,7 @@ SUBROUTINE PhotonTriaTracking() ! Check if lost during intersection IF(PhotonLost)THEN ! Error in Photon TriaTracking! PhotonIntersectionWithSide() cannot determine intersection because photon is parallel to side - CALL StoreLostPhotonProperties(ElemID,TRIM(__FILE__),__LINE__) + CALL StoreLostPhotonProperties(ElemID,TRIM(__FILE__),__LINE__,999) Done = .TRUE. EXIT ELSE From e22c619bf9fe2a4e2e35e0dfc4f14ddc7bcec17e Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Tue, 7 Nov 2023 17:52:57 +0100 Subject: [PATCH 318/495] Removed compiler warnings --- .../radiative_transfer/tracking/radtrans_tracking.f90 | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 index 66b2652ea..cefd1cb90 100644 --- a/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 +++ b/src/radiation/radiative_transfer/tracking/radtrans_tracking.f90 @@ -301,8 +301,6 @@ SUBROUTINE PhotonTriaTracking() REAL :: IntersectionPos(1:3), IntersectionPosTemp(1:3) REAL :: DistTemp(1:6) LOGICAL :: PhotonLost -LOGICAL :: foundHit -REAL :: alpha,xi,eta !=================================================================================================================================== Done = .FALSE. ElemID = PhotonProps%ElemID @@ -903,11 +901,9 @@ SUBROUTINE PhotonComputeBiLinearIntersection(isHit,SideID, Dist,PointSelect,OldP USE MOD_Globals_Vars ,ONLY: EpsMach USE MOD_Utils ,ONLY: QuadraticSolver USE MOD_Mesh_Tools ,ONLY: GetCNSideID, GetCNElemID -USE MOD_Particle_Mesh_Vars ,ONLY: SideInfo_Shared, ElemRadiusNGeo +USE MOD_Particle_Mesh_Vars ,ONLY: SideInfo_Shared USE MOD_Particle_Surfaces_Vars ,ONLY: BaseVectors0,BaseVectors1,BaseVectors2,BaseVectors3,SideNormVec,epsilonTol!,BaseVectorsScale USE MOD_Particle_Surfaces ,ONLY: CalcNormAndTangBilinear -USE MOD_Particle_Tracking_Vars ,ONLY: TrackingMethod -USE MOD_Particle_Vars ,ONLY: PartState,LastPartPos!,PEM USE MOD_Photon_TrackingVars ,ONLY: PhotonProps #ifdef CODE_ANALYZE USE MOD_Particle_Surfaces_Vars ,ONLY: BezierControlPoints3D From 086150886d121b4412dee51bafdfa241da3a6657 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Tue, 7 Nov 2023 18:25:47 +0100 Subject: [PATCH 319/495] Adjusted Cubit 3to1 reggie to work for bilinear ray tracing --- .../parameter.ini | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/parameter.ini b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/parameter.ini index d47500a48..f36fc211f 100644 --- a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/parameter.ini +++ b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/parameter.ini @@ -17,6 +17,7 @@ DoLoadBalance = T Load-DeviationThreshold = 0.001 LoadBalanceMaxSteps = 20 DoInitialAutoRestart = T +!nocrosscombination:N,RayTracing-NMax,NVisu, RayTracing-nSurfSample,Part-Boundary$-PhotonSpecularReflection,Part-Boundary$-PhotonEnACC,RayTracing-PowerDensity nocrosscombination:N,RayTracing-NMax,NVisu,UsePhotonTriaTracking,RayTracing-nSurfSample,Part-Boundary$-PhotonSpecularReflection,Part-Boundary$-PhotonEnACC,RayTracing-PowerDensity ! =============================================================================== ! ! MESH @@ -102,7 +103,7 @@ Part-Boundary$-PhotonEnACC = 1e-9 , 1.0 , 1e-9 , 1.0 ! 1: fully abs ! Ray Tracing ! =============================================================================== ! UseRayTracing = T -UsePhotonTriaTracking = T!F,T,F,T +UsePhotonTriaTracking = F,T,F,T RayTracing-nSurfSample= 1,2,5,10 RayTracing-NumRays = 5000 !RayTracing-NumRays = 5000000 From 8f8c50906f65a15d4f9133bc90a1151cebc68f9d Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Tue, 7 Nov 2023 21:20:39 +0100 Subject: [PATCH 320/495] Added periodic reggies for ray tracing --- .../parameter.ini | 2 +- .../export.neu | 333 - .../export_periodic.neu | 1060 ++ .../hopr.ini | 12 +- .../parameter.ini | 6 +- .../export_split2hex.neu | 14285 ++++++++++++++++ .../hopr.ini | 28 + 7 files changed, 15382 insertions(+), 344 deletions(-) delete mode 100644 regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/export.neu create mode 100644 regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/export_periodic.neu create mode 100644 regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_split2hex_periodic/export_split2hex.neu create mode 100644 regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_split2hex_periodic/hopr.ini diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/parameter.ini b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/parameter.ini index f36fc211f..df35e8f1d 100644 --- a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/parameter.ini +++ b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/parameter.ini @@ -75,7 +75,7 @@ Part-nBounds = 6 Part-Boundary1-SourceName = BC_TOP Part-Boundary1-Condition = reflective -Part-Boundary1-PhotonEnACC = 1.0 +Part-Boundary1-PhotonEnACC = 1.0 ! Photon inlet BC must always be absorbing Part-Boundary2-SourceName = BC_BOT Part-Boundary2-Condition = reflective diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/export.neu b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/export.neu deleted file mode 100644 index e02a9739b..000000000 --- a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/export.neu +++ /dev/null @@ -1,333 +0,0 @@ - CONTROL INFO 2.4.6 -** GAMBIT NEUTRAL FILE -/media/nizenkov/storage/boltzplatz/Projects/Zeiss/012-SMT-Dinger-P23006-MEMS-Raytracing/3-TestCases/meshes/2023-08-25-M0X-Debug-Cubit-3to1/export.neu -PROGRAM: Coreform_Cubit VERSION: 2023.4 - - NUMNP NELEM NGRPS NBSETS NDFCD NDFVL - 96 49 2 6 3 3 -ENDOFSECTION - NODAL COORDINATES 2.4.6 - 1 5.00000000000e-01 5.00000000000e-01 0.00000000000e+00 - 2 1.77136438333e-01 5.00000000000e-01 5.80800343049e-02 - 3 1.65922930089e-01 5.00000000000e-01 -1.33442609378e-01 - 4 5.00000000000e-01 5.00000000000e-01 -1.66666666667e-01 - 5 5.00000000000e-01 1.77136438333e-01 5.80800343049e-02 - 6 1.76708380738e-01 1.79483363067e-01 -1.92732493396e-02 - 7 1.70986215705e-01 1.71365536089e-01 -1.75388514517e-01 - 8 5.00000000000e-01 1.65922930089e-01 -1.33442609378e-01 - 9 -1.77136438333e-01 5.00000000000e-01 5.80800343049e-02 - 10 -1.65922930089e-01 5.00000000000e-01 -1.33442609378e-01 - 11 -1.76757698738e-01 1.79371924687e-01 -1.91878832863e-02 - 12 -1.70841566289e-01 1.71382951399e-01 -1.75183210145e-01 - 13 -5.00000000000e-01 5.00000000000e-01 0.00000000000e+00 - 14 -5.00000000000e-01 5.00000000000e-01 -1.66666666667e-01 - 15 -5.00000000000e-01 1.77136438333e-01 5.80800343049e-02 - 16 -5.00000000000e-01 1.65922930089e-01 -1.33442609378e-01 - 17 1.64873215942e-01 5.00000000000e-01 -3.18360801562e-01 - 18 5.00000000000e-01 5.00000000000e-01 -3.33333333333e-01 - 19 1.68050720983e-01 1.68046773869e-01 -3.36720028064e-01 - 20 5.00000000000e-01 1.64873215942e-01 -3.18360801562e-01 - 21 -1.64873215942e-01 5.00000000000e-01 -3.18360801562e-01 - 22 -1.67970039349e-01 1.68135871499e-01 -3.36483981681e-01 - 23 -5.00000000000e-01 5.00000000000e-01 -3.33333333333e-01 - 24 -5.00000000000e-01 1.64873215942e-01 -3.18360801562e-01 - 25 1.66666666667e-01 5.00000000000e-01 -5.00000000000e-01 - 26 5.00000000000e-01 5.00000000000e-01 -5.00000000000e-01 - 27 1.66666666667e-01 1.66666666667e-01 -5.00000000000e-01 - 28 5.00000000000e-01 1.66666666667e-01 -5.00000000000e-01 - 29 -1.66666666667e-01 5.00000000000e-01 -5.00000000000e-01 - 30 -1.66666666667e-01 1.66666666667e-01 -5.00000000000e-01 - 31 -5.00000000000e-01 5.00000000000e-01 -5.00000000000e-01 - 32 -5.00000000000e-01 1.66666666667e-01 -5.00000000000e-01 - 33 5.00000000000e-01 -1.77136438333e-01 5.80800343049e-02 - 34 1.76733273392e-01 -1.79406401063e-01 -1.91723599758e-02 - 35 1.70962160892e-01 -1.71408003494e-01 -1.75207218157e-01 - 36 5.00000000000e-01 -1.65922930089e-01 -1.33442609378e-01 - 37 -1.76629794550e-01 -1.79429072538e-01 -1.90680848152e-02 - 38 -1.70853129197e-01 -1.71364388408e-01 -1.74988002849e-01 - 39 -5.00000000000e-01 -1.77136438333e-01 5.80800343049e-02 - 40 -5.00000000000e-01 -1.65922930089e-01 -1.33442609378e-01 - 41 1.68040989340e-01 -1.68118176892e-01 -3.36635631438e-01 - 42 5.00000000000e-01 -1.64873215942e-01 -3.18360801562e-01 - 43 -1.68055817370e-01 -1.68109323888e-01 -3.36359806400e-01 - 44 -5.00000000000e-01 -1.64873215942e-01 -3.18360801562e-01 - 45 1.66666666667e-01 -1.66666666667e-01 -5.00000000000e-01 - 46 5.00000000000e-01 -1.66666666667e-01 -5.00000000000e-01 - 47 -1.66666666667e-01 -1.66666666667e-01 -5.00000000000e-01 - 48 -5.00000000000e-01 -1.66666666667e-01 -5.00000000000e-01 - 49 5.00000000000e-01 -5.00000000000e-01 0.00000000000e+00 - 50 1.77136438333e-01 -5.00000000000e-01 5.80800343049e-02 - 51 1.65922930089e-01 -5.00000000000e-01 -1.33442609378e-01 - 52 5.00000000000e-01 -5.00000000000e-01 -1.66666666667e-01 - 53 -1.77136438333e-01 -5.00000000000e-01 5.80800343049e-02 - 54 -1.65922930089e-01 -5.00000000000e-01 -1.33442609378e-01 - 55 -5.00000000000e-01 -5.00000000000e-01 0.00000000000e+00 - 56 -5.00000000000e-01 -5.00000000000e-01 -1.66666666667e-01 - 57 1.64873215942e-01 -5.00000000000e-01 -3.18360801562e-01 - 58 5.00000000000e-01 -5.00000000000e-01 -3.33333333333e-01 - 59 -1.64873215942e-01 -5.00000000000e-01 -3.18360801562e-01 - 60 -5.00000000000e-01 -5.00000000000e-01 -3.33333333333e-01 - 61 1.66666666667e-01 -5.00000000000e-01 -5.00000000000e-01 - 62 5.00000000000e-01 -5.00000000000e-01 -5.00000000000e-01 - 63 -1.66666666667e-01 -5.00000000000e-01 -5.00000000000e-01 - 64 -5.00000000000e-01 -5.00000000000e-01 -5.00000000000e-01 - 65 5.00000000000e-01 5.00000000000e-01 5.00000000000e-01 - 66 1.71618098554e-01 5.00000000000e-01 2.68543406174e-01 - 67 1.75224475667e-01 1.87325558653e-01 1.24315387207e-01 - 68 5.00000000000e-01 1.71618098554e-01 2.68543406174e-01 - 69 -1.71618098554e-01 5.00000000000e-01 2.68543406174e-01 - 70 -1.75305352846e-01 1.87236259741e-01 1.24326964392e-01 - 71 -5.00000000000e-01 5.00000000000e-01 5.00000000000e-01 - 72 -5.00000000000e-01 1.71618098554e-01 2.68543406174e-01 - 73 1.75308731395e-01 -1.87246304991e-01 1.24358939826e-01 - 74 5.00000000000e-01 -1.71618098554e-01 2.68543406174e-01 - 75 -1.75182745767e-01 -1.87299782629e-01 1.24378343577e-01 - 76 -5.00000000000e-01 -1.71618098554e-01 2.68543406174e-01 - 77 1.71618098554e-01 -5.00000000000e-01 2.68543406174e-01 - 78 5.00000000000e-01 -5.00000000000e-01 5.00000000000e-01 - 79 -1.71618098554e-01 -5.00000000000e-01 2.68543406174e-01 - 80 -5.00000000000e-01 -5.00000000000e-01 5.00000000000e-01 - 81 1.66666666667e-01 -1.66666666667e-01 -8.30000000000e-01 - 82 5.00000000000e-01 -1.66666666667e-01 -8.30000000000e-01 - 83 5.00000000000e-01 -5.00000000000e-01 -8.30000000000e-01 - 84 1.66666666667e-01 -5.00000000000e-01 -8.30000000000e-01 - 85 -1.66666666667e-01 -1.66666666667e-01 -8.30000000000e-01 - 86 -1.66666666667e-01 -5.00000000000e-01 -8.30000000000e-01 - 87 -5.00000000000e-01 -1.66666666667e-01 -8.30000000000e-01 - 88 -5.00000000000e-01 -5.00000000000e-01 -8.30000000000e-01 - 89 1.66666666667e-01 1.66666666667e-01 -8.30000000000e-01 - 90 5.00000000000e-01 1.66666666667e-01 -8.30000000000e-01 - 91 -1.66666666667e-01 1.66666666667e-01 -8.30000000000e-01 - 92 -5.00000000000e-01 1.66666666667e-01 -8.30000000000e-01 - 93 1.66666666667e-01 5.00000000000e-01 -8.30000000000e-01 - 94 5.00000000000e-01 5.00000000000e-01 -8.30000000000e-01 - 95 -1.66666666667e-01 5.00000000000e-01 -8.30000000000e-01 - 96 -5.00000000000e-01 5.00000000000e-01 -8.30000000000e-01 -ENDOFSECTION - ELEMENTS/CELLS 2.4.6 - 1 4 8 1 2 4 3 5 6 8 - 7 - 2 4 8 2 9 3 10 6 11 7 - 12 - 3 4 8 9 13 10 14 11 15 12 - 16 - 4 4 8 4 3 18 17 8 7 20 - 19 - 5 4 8 3 10 17 21 7 12 19 - 22 - 6 4 8 10 14 21 23 12 16 22 - 24 - 7 4 8 18 17 26 25 20 19 28 - 27 - 8 4 8 17 21 25 29 19 22 27 - 30 - 9 4 8 21 23 29 31 22 24 30 - 32 - 10 4 8 5 6 8 7 33 34 36 - 35 - 11 4 8 6 11 7 12 34 37 35 - 38 - 12 4 8 11 15 12 16 37 39 38 - 40 - 13 4 8 8 7 20 19 36 35 42 - 41 - 14 4 8 7 12 19 22 35 38 41 - 43 - 15 4 8 12 16 22 24 38 40 43 - 44 - 16 4 8 20 19 28 27 42 41 46 - 45 - 17 4 8 19 22 27 30 41 43 45 - 47 - 18 4 8 22 24 30 32 43 44 47 - 48 - 19 4 8 33 34 36 35 49 50 52 - 51 - 20 4 8 34 37 35 38 50 53 51 - 54 - 21 4 8 37 39 38 40 53 55 54 - 56 - 22 4 8 36 35 42 41 52 51 58 - 57 - 23 4 8 35 38 41 43 51 54 57 - 59 - 24 4 8 38 40 43 44 54 56 59 - 60 - 25 4 8 42 41 46 45 58 57 62 - 61 - 26 4 8 41 43 45 47 57 59 61 - 63 - 27 4 8 43 44 47 48 59 60 63 - 64 - 28 4 8 1 2 5 6 65 66 68 - 67 - 29 4 8 2 9 6 11 66 69 67 - 70 - 30 4 8 9 13 11 15 69 71 70 - 72 - 31 4 8 5 6 33 34 68 67 74 - 73 - 32 4 8 6 11 34 37 67 70 73 - 75 - 33 4 8 11 15 37 39 70 72 75 - 76 - 34 4 8 33 34 49 50 74 73 78 - 77 - 35 4 8 34 37 50 53 73 75 77 - 79 - 36 4 8 37 39 53 55 75 76 79 - 80 - 37 4 8 67 70 73 75 68 72 74 - 76 - 38 4 8 68 72 74 76 65 71 78 - 80 - 39 4 8 66 69 67 70 65 71 68 - 72 - 40 4 8 73 75 77 79 74 76 78 - 80 - 41 4 8 45 46 61 62 81 82 84 - 83 - 42 4 8 47 45 63 61 85 81 86 - 84 - 43 4 8 48 47 64 63 87 85 88 - 86 - 44 4 8 27 28 45 46 89 90 81 - 82 - 45 4 8 30 27 47 45 91 89 85 - 81 - 46 4 8 32 30 48 47 92 91 87 - 85 - 47 4 8 25 26 27 28 93 94 89 - 90 - 48 4 8 29 25 30 27 95 93 91 - 89 - 49 4 8 31 29 32 30 96 95 92 - 91 -ENDOFSECTION - ELEMENT GROUP 2.4.6 -GROUP: 1 ELEMENTS: 40 MATERIAL: 0 NFLAGS: 0 - Block 1 - - - 1 2 3 4 5 6 7 8 9 10 - 11 12 13 14 15 16 17 18 19 20 - 21 22 23 24 25 26 27 28 29 30 - 31 32 33 34 35 36 37 38 39 40 -ENDOFSECTION - ELEMENT GROUP 2.4.6 -GROUP: 2 ELEMENTS: 9 MATERIAL: 0 NFLAGS: 0 - Block 2 - - - 41 42 43 44 45 46 47 48 49 -ENDOFSECTION - BOUNDARY CONDITIONS 2.4.6 - BC_TOP 1 1 0 6 - 38 4 6 -ENDOFSECTION - BOUNDARY CONDITIONS 2.4.6 - BC_BOT 1 9 0 6 - 41 4 6 - 42 4 6 - 43 4 6 - 44 4 6 - 45 4 6 - 46 4 6 - 47 4 6 - 48 4 6 - 49 4 6 -ENDOFSECTION - BOUNDARY CONDITIONS 2.4.6 - BC_XPLUS 1 16 0 6 - 34 4 4 - 31 4 4 - 28 4 4 - 38 4 4 - 7 4 4 - 4 4 4 - 1 4 4 - 16 4 4 - 13 4 4 - 10 4 4 - 25 4 4 - 22 4 4 - 19 4 4 - 41 4 2 - 44 4 2 - 47 4 2 -ENDOFSECTION - BOUNDARY CONDITIONS 2.4.6 - BC_XMINUS 1 16 0 6 - 30 4 2 - 33 4 2 - 36 4 2 - 38 4 2 - 3 4 2 - 6 4 2 - 9 4 2 - 12 4 2 - 15 4 2 - 18 4 2 - 21 4 2 - 24 4 2 - 27 4 2 - 49 4 4 - 46 4 4 - 43 4 4 -ENDOFSECTION - BOUNDARY CONDITIONS 2.4.6 - BC_YMINUS 1 16 0 6 - 36 4 3 - 35 4 3 - 34 4 3 - 40 4 3 - 19 4 6 - 20 4 6 - 21 4 6 - 22 4 6 - 23 4 6 - 24 4 6 - 25 4 6 - 26 4 6 - 27 4 6 - 43 4 3 - 42 4 3 - 41 4 3 -ENDOFSECTION - BOUNDARY CONDITIONS 2.4.6 - BC_YPLUS 1 16 0 6 - 28 4 1 - 29 4 1 - 30 4 1 - 39 4 1 - 1 4 5 - 4 4 5 - 7 4 5 - 2 4 5 - 5 4 5 - 8 4 5 - 3 4 5 - 6 4 5 - 9 4 5 - 47 4 1 - 48 4 1 - 49 4 1 -ENDOFSECTION - BOUNDARY CONDITIONS 2.4.6 - cfd_bc 1 1 0 0 51 -ENDOFSECTION - BOUNDARY CONDITIONS 2.4.6 - cfd_bc 2 1 0 0 51 -ENDOFSECTION - BOUNDARY CONDITIONS 2.4.6 - cfd_bc 3 1 0 0 51 -ENDOFSECTION - BOUNDARY CONDITIONS 2.4.6 - cfd_bc 4 1 0 0 51 -ENDOFSECTION - BOUNDARY CONDITIONS 2.4.6 - cfd_bc 5 1 0 0 51 -ENDOFSECTION - BOUNDARY CONDITIONS 2.4.6 - cfd_bc 6 1 0 0 51 -ENDOFSECTION diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/export_periodic.neu b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/export_periodic.neu new file mode 100644 index 000000000..4f8d22eaf --- /dev/null +++ b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/export_periodic.neu @@ -0,0 +1,1060 @@ + CONTROL INFO 2.4.6 +** GAMBIT NEUTRAL FILE +/media/nizenkov/storage/boltzplatz/Projects/Zeiss/012-SMT-Dinger-P23006-MEMS-Raytracing/3-TestCases/meshes/2023-08-25-M0X-Debug-Cubit-3to1/export_periodic.neu +PROGRAM: Coreform_Cubit VERSION: 2023.4 + + NUMNP NELEM NGRPS NBSETS NDFCD NDFVL + 384 196 8 6 3 3 +ENDOFSECTION + NODAL COORDINATES 2.4.6 + 1 5.00000000000e-01 5.00000000000e-01 0.00000000000e+00 + 2 8.22863561667e-01 5.00000000000e-01 5.80800343049e-02 + 3 8.34077069911e-01 5.00000000000e-01 -1.33442609378e-01 + 4 5.00000000000e-01 5.00000000000e-01 -1.66666666667e-01 + 5 5.00000000000e-01 8.22863561667e-01 5.80800343049e-02 + 6 8.23291619262e-01 8.20516636933e-01 -1.92732493396e-02 + 7 8.29013784295e-01 8.28634463911e-01 -1.75388514517e-01 + 8 5.00000000000e-01 8.34077069911e-01 -1.33442609378e-01 + 9 1.17713643833e+00 5.00000000000e-01 5.80800343049e-02 + 10 1.16592293009e+00 5.00000000000e-01 -1.33442609378e-01 + 11 1.17675769874e+00 8.20628075313e-01 -1.91878832863e-02 + 12 1.17084156629e+00 8.28617048601e-01 -1.75183210145e-01 + 13 1.50000000000e+00 5.00000000000e-01 0.00000000000e+00 + 14 1.50000000000e+00 5.00000000000e-01 -1.66666666667e-01 + 15 1.50000000000e+00 8.22863561667e-01 5.80800343049e-02 + 16 1.50000000000e+00 8.34077069911e-01 -1.33442609378e-01 + 17 8.35126784058e-01 5.00000000000e-01 -3.18360801562e-01 + 18 5.00000000000e-01 5.00000000000e-01 -3.33333333333e-01 + 19 8.31949279017e-01 8.31953226131e-01 -3.36720028064e-01 + 20 5.00000000000e-01 8.35126784058e-01 -3.18360801562e-01 + 21 1.16487321594e+00 5.00000000000e-01 -3.18360801562e-01 + 22 1.16797003935e+00 8.31864128501e-01 -3.36483981681e-01 + 23 1.50000000000e+00 5.00000000000e-01 -3.33333333333e-01 + 24 1.50000000000e+00 8.35126784058e-01 -3.18360801562e-01 + 25 8.33333333333e-01 5.00000000000e-01 -5.00000000000e-01 + 26 5.00000000000e-01 5.00000000000e-01 -5.00000000000e-01 + 27 8.33333333333e-01 8.33333333333e-01 -5.00000000000e-01 + 28 5.00000000000e-01 8.33333333333e-01 -5.00000000000e-01 + 29 1.16666666667e+00 5.00000000000e-01 -5.00000000000e-01 + 30 1.16666666667e+00 8.33333333333e-01 -5.00000000000e-01 + 31 1.50000000000e+00 5.00000000000e-01 -5.00000000000e-01 + 32 1.50000000000e+00 8.33333333333e-01 -5.00000000000e-01 + 33 5.00000000000e-01 1.17713643833e+00 5.80800343049e-02 + 34 8.23266726608e-01 1.17940640106e+00 -1.91723599758e-02 + 35 8.29037839108e-01 1.17140800349e+00 -1.75207218157e-01 + 36 5.00000000000e-01 1.16592293009e+00 -1.33442609378e-01 + 37 1.17662979455e+00 1.17942907254e+00 -1.90680848152e-02 + 38 1.17085312920e+00 1.17136438841e+00 -1.74988002849e-01 + 39 1.50000000000e+00 1.17713643833e+00 5.80800343049e-02 + 40 1.50000000000e+00 1.16592293009e+00 -1.33442609378e-01 + 41 8.31959010660e-01 1.16811817689e+00 -3.36635631438e-01 + 42 5.00000000000e-01 1.16487321594e+00 -3.18360801562e-01 + 43 1.16805581737e+00 1.16810932389e+00 -3.36359806400e-01 + 44 1.50000000000e+00 1.16487321594e+00 -3.18360801562e-01 + 45 8.33333333333e-01 1.16666666667e+00 -5.00000000000e-01 + 46 5.00000000000e-01 1.16666666667e+00 -5.00000000000e-01 + 47 1.16666666667e+00 1.16666666667e+00 -5.00000000000e-01 + 48 1.50000000000e+00 1.16666666667e+00 -5.00000000000e-01 + 49 5.00000000000e-01 1.50000000000e+00 0.00000000000e+00 + 50 8.22863561667e-01 1.50000000000e+00 5.80800343049e-02 + 51 8.34077069911e-01 1.50000000000e+00 -1.33442609378e-01 + 52 5.00000000000e-01 1.50000000000e+00 -1.66666666667e-01 + 53 1.17713643833e+00 1.50000000000e+00 5.80800343049e-02 + 54 1.16592293009e+00 1.50000000000e+00 -1.33442609378e-01 + 55 1.50000000000e+00 1.50000000000e+00 0.00000000000e+00 + 56 1.50000000000e+00 1.50000000000e+00 -1.66666666667e-01 + 57 8.35126784058e-01 1.50000000000e+00 -3.18360801562e-01 + 58 5.00000000000e-01 1.50000000000e+00 -3.33333333333e-01 + 59 1.16487321594e+00 1.50000000000e+00 -3.18360801562e-01 + 60 1.50000000000e+00 1.50000000000e+00 -3.33333333333e-01 + 61 8.33333333333e-01 1.50000000000e+00 -5.00000000000e-01 + 62 5.00000000000e-01 1.50000000000e+00 -5.00000000000e-01 + 63 1.16666666667e+00 1.50000000000e+00 -5.00000000000e-01 + 64 1.50000000000e+00 1.50000000000e+00 -5.00000000000e-01 + 65 5.00000000000e-01 5.00000000000e-01 5.00000000000e-01 + 66 8.28381901446e-01 5.00000000000e-01 2.68543406174e-01 + 67 8.24775524333e-01 8.12674441347e-01 1.24315387207e-01 + 68 5.00000000000e-01 8.28381901446e-01 2.68543406174e-01 + 69 1.17161809855e+00 5.00000000000e-01 2.68543406174e-01 + 70 1.17530535285e+00 8.12763740259e-01 1.24326964392e-01 + 71 1.50000000000e+00 5.00000000000e-01 5.00000000000e-01 + 72 1.50000000000e+00 8.28381901446e-01 2.68543406174e-01 + 73 8.24691268605e-01 1.18724630499e+00 1.24358939826e-01 + 74 5.00000000000e-01 1.17161809855e+00 2.68543406174e-01 + 75 1.17518274577e+00 1.18729978263e+00 1.24378343577e-01 + 76 1.50000000000e+00 1.17161809855e+00 2.68543406174e-01 + 77 8.28381901446e-01 1.50000000000e+00 2.68543406174e-01 + 78 5.00000000000e-01 1.50000000000e+00 5.00000000000e-01 + 79 1.17161809855e+00 1.50000000000e+00 2.68543406174e-01 + 80 1.50000000000e+00 1.50000000000e+00 5.00000000000e-01 + 81 8.33333333333e-01 1.16666666667e+00 -8.30000000000e-01 + 82 5.00000000000e-01 1.16666666667e+00 -8.30000000000e-01 + 83 5.00000000000e-01 1.50000000000e+00 -8.30000000000e-01 + 84 8.33333333333e-01 1.50000000000e+00 -8.30000000000e-01 + 85 1.16666666667e+00 1.16666666667e+00 -8.30000000000e-01 + 86 1.16666666667e+00 1.50000000000e+00 -8.30000000000e-01 + 87 1.50000000000e+00 1.16666666667e+00 -8.30000000000e-01 + 88 1.50000000000e+00 1.50000000000e+00 -8.30000000000e-01 + 89 8.33333333333e-01 8.33333333333e-01 -8.30000000000e-01 + 90 5.00000000000e-01 8.33333333333e-01 -8.30000000000e-01 + 91 1.16666666667e+00 8.33333333333e-01 -8.30000000000e-01 + 92 1.50000000000e+00 8.33333333333e-01 -8.30000000000e-01 + 93 8.33333333333e-01 5.00000000000e-01 -8.30000000000e-01 + 94 5.00000000000e-01 5.00000000000e-01 -8.30000000000e-01 + 95 1.16666666667e+00 5.00000000000e-01 -8.30000000000e-01 + 96 1.50000000000e+00 5.00000000000e-01 -8.30000000000e-01 + 97 5.00000000000e-01 5.00000000000e-01 0.00000000000e+00 + 98 1.77136438333e-01 5.00000000000e-01 5.80800343049e-02 + 99 1.65922930089e-01 5.00000000000e-01 -1.33442609378e-01 + 100 5.00000000000e-01 5.00000000000e-01 -1.66666666667e-01 + 101 5.00000000000e-01 1.77136438333e-01 5.80800343049e-02 + 102 1.76708380738e-01 1.79483363067e-01 -1.92732493396e-02 + 103 1.70986215705e-01 1.71365536089e-01 -1.75388514517e-01 + 104 5.00000000000e-01 1.65922930089e-01 -1.33442609378e-01 + 105 -1.77136438333e-01 5.00000000000e-01 5.80800343049e-02 + 106 -1.65922930089e-01 5.00000000000e-01 -1.33442609378e-01 + 107 -1.76757698738e-01 1.79371924687e-01 -1.91878832863e-02 + 108 -1.70841566289e-01 1.71382951399e-01 -1.75183210145e-01 + 109 -5.00000000000e-01 5.00000000000e-01 0.00000000000e+00 + 110 -5.00000000000e-01 5.00000000000e-01 -1.66666666667e-01 + 111 -5.00000000000e-01 1.77136438333e-01 5.80800343049e-02 + 112 -5.00000000000e-01 1.65922930089e-01 -1.33442609378e-01 + 113 1.64873215942e-01 5.00000000000e-01 -3.18360801562e-01 + 114 5.00000000000e-01 5.00000000000e-01 -3.33333333333e-01 + 115 1.68050720983e-01 1.68046773869e-01 -3.36720028064e-01 + 116 5.00000000000e-01 1.64873215942e-01 -3.18360801562e-01 + 117 -1.64873215942e-01 5.00000000000e-01 -3.18360801562e-01 + 118 -1.67970039349e-01 1.68135871499e-01 -3.36483981681e-01 + 119 -5.00000000000e-01 5.00000000000e-01 -3.33333333333e-01 + 120 -5.00000000000e-01 1.64873215942e-01 -3.18360801562e-01 + 121 1.66666666667e-01 5.00000000000e-01 -5.00000000000e-01 + 122 5.00000000000e-01 5.00000000000e-01 -5.00000000000e-01 + 123 1.66666666667e-01 1.66666666667e-01 -5.00000000000e-01 + 124 5.00000000000e-01 1.66666666667e-01 -5.00000000000e-01 + 125 -1.66666666667e-01 5.00000000000e-01 -5.00000000000e-01 + 126 -1.66666666667e-01 1.66666666667e-01 -5.00000000000e-01 + 127 -5.00000000000e-01 5.00000000000e-01 -5.00000000000e-01 + 128 -5.00000000000e-01 1.66666666667e-01 -5.00000000000e-01 + 129 5.00000000000e-01 -1.77136438333e-01 5.80800343049e-02 + 130 1.76733273392e-01 -1.79406401063e-01 -1.91723599758e-02 + 131 1.70962160892e-01 -1.71408003494e-01 -1.75207218157e-01 + 132 5.00000000000e-01 -1.65922930089e-01 -1.33442609378e-01 + 133 -1.76629794550e-01 -1.79429072538e-01 -1.90680848152e-02 + 134 -1.70853129197e-01 -1.71364388408e-01 -1.74988002849e-01 + 135 -5.00000000000e-01 -1.77136438333e-01 5.80800343049e-02 + 136 -5.00000000000e-01 -1.65922930089e-01 -1.33442609378e-01 + 137 1.68040989340e-01 -1.68118176892e-01 -3.36635631438e-01 + 138 5.00000000000e-01 -1.64873215942e-01 -3.18360801562e-01 + 139 -1.68055817370e-01 -1.68109323888e-01 -3.36359806400e-01 + 140 -5.00000000000e-01 -1.64873215942e-01 -3.18360801562e-01 + 141 1.66666666667e-01 -1.66666666667e-01 -5.00000000000e-01 + 142 5.00000000000e-01 -1.66666666667e-01 -5.00000000000e-01 + 143 -1.66666666667e-01 -1.66666666667e-01 -5.00000000000e-01 + 144 -5.00000000000e-01 -1.66666666667e-01 -5.00000000000e-01 + 145 5.00000000000e-01 -5.00000000000e-01 0.00000000000e+00 + 146 1.77136438333e-01 -5.00000000000e-01 5.80800343049e-02 + 147 1.65922930089e-01 -5.00000000000e-01 -1.33442609378e-01 + 148 5.00000000000e-01 -5.00000000000e-01 -1.66666666667e-01 + 149 -1.77136438333e-01 -5.00000000000e-01 5.80800343049e-02 + 150 -1.65922930089e-01 -5.00000000000e-01 -1.33442609378e-01 + 151 -5.00000000000e-01 -5.00000000000e-01 0.00000000000e+00 + 152 -5.00000000000e-01 -5.00000000000e-01 -1.66666666667e-01 + 153 1.64873215942e-01 -5.00000000000e-01 -3.18360801562e-01 + 154 5.00000000000e-01 -5.00000000000e-01 -3.33333333333e-01 + 155 -1.64873215942e-01 -5.00000000000e-01 -3.18360801562e-01 + 156 -5.00000000000e-01 -5.00000000000e-01 -3.33333333333e-01 + 157 1.66666666667e-01 -5.00000000000e-01 -5.00000000000e-01 + 158 5.00000000000e-01 -5.00000000000e-01 -5.00000000000e-01 + 159 -1.66666666667e-01 -5.00000000000e-01 -5.00000000000e-01 + 160 -5.00000000000e-01 -5.00000000000e-01 -5.00000000000e-01 + 161 5.00000000000e-01 5.00000000000e-01 5.00000000000e-01 + 162 1.71618098554e-01 5.00000000000e-01 2.68543406174e-01 + 163 1.75224475667e-01 1.87325558653e-01 1.24315387207e-01 + 164 5.00000000000e-01 1.71618098554e-01 2.68543406174e-01 + 165 -1.71618098554e-01 5.00000000000e-01 2.68543406174e-01 + 166 -1.75305352846e-01 1.87236259741e-01 1.24326964392e-01 + 167 -5.00000000000e-01 5.00000000000e-01 5.00000000000e-01 + 168 -5.00000000000e-01 1.71618098554e-01 2.68543406174e-01 + 169 1.75308731395e-01 -1.87246304991e-01 1.24358939826e-01 + 170 5.00000000000e-01 -1.71618098554e-01 2.68543406174e-01 + 171 -1.75182745767e-01 -1.87299782629e-01 1.24378343577e-01 + 172 -5.00000000000e-01 -1.71618098554e-01 2.68543406174e-01 + 173 1.71618098554e-01 -5.00000000000e-01 2.68543406174e-01 + 174 5.00000000000e-01 -5.00000000000e-01 5.00000000000e-01 + 175 -1.71618098554e-01 -5.00000000000e-01 2.68543406174e-01 + 176 -5.00000000000e-01 -5.00000000000e-01 5.00000000000e-01 + 177 1.66666666667e-01 -1.66666666667e-01 -8.30000000000e-01 + 178 5.00000000000e-01 -1.66666666667e-01 -8.30000000000e-01 + 179 5.00000000000e-01 -5.00000000000e-01 -8.30000000000e-01 + 180 1.66666666667e-01 -5.00000000000e-01 -8.30000000000e-01 + 181 -1.66666666667e-01 -1.66666666667e-01 -8.30000000000e-01 + 182 -1.66666666667e-01 -5.00000000000e-01 -8.30000000000e-01 + 183 -5.00000000000e-01 -1.66666666667e-01 -8.30000000000e-01 + 184 -5.00000000000e-01 -5.00000000000e-01 -8.30000000000e-01 + 185 1.66666666667e-01 1.66666666667e-01 -8.30000000000e-01 + 186 5.00000000000e-01 1.66666666667e-01 -8.30000000000e-01 + 187 -1.66666666667e-01 1.66666666667e-01 -8.30000000000e-01 + 188 -5.00000000000e-01 1.66666666667e-01 -8.30000000000e-01 + 189 1.66666666667e-01 5.00000000000e-01 -8.30000000000e-01 + 190 5.00000000000e-01 5.00000000000e-01 -8.30000000000e-01 + 191 -1.66666666667e-01 5.00000000000e-01 -8.30000000000e-01 + 192 -5.00000000000e-01 5.00000000000e-01 -8.30000000000e-01 + 193 5.00000000000e-01 5.00000000000e-01 0.00000000000e+00 + 194 5.00000000000e-01 5.00000000000e-01 -1.66666666667e-01 + 195 1.65922930089e-01 5.00000000000e-01 -1.33442609378e-01 + 196 1.77136438333e-01 5.00000000000e-01 5.80800343049e-02 + 197 5.00000000000e-01 8.22863561667e-01 5.80800343049e-02 + 198 5.00000000000e-01 8.34077069911e-01 -1.33442609378e-01 + 199 1.70986215705e-01 8.28634463911e-01 -1.75388514517e-01 + 200 1.76708380738e-01 8.20516636933e-01 -1.92732493396e-02 + 201 -1.65922930089e-01 5.00000000000e-01 -1.33442609378e-01 + 202 -1.77136438333e-01 5.00000000000e-01 5.80800343049e-02 + 203 -1.70841566289e-01 8.28617048601e-01 -1.75183210145e-01 + 204 -1.76757698738e-01 8.20628075313e-01 -1.91878832863e-02 + 205 -5.00000000000e-01 5.00000000000e-01 -1.66666666667e-01 + 206 -5.00000000000e-01 5.00000000000e-01 0.00000000000e+00 + 207 -5.00000000000e-01 8.34077069911e-01 -1.33442609378e-01 + 208 -5.00000000000e-01 8.22863561667e-01 5.80800343049e-02 + 209 5.00000000000e-01 5.00000000000e-01 -3.33333333333e-01 + 210 1.64873215942e-01 5.00000000000e-01 -3.18360801562e-01 + 211 5.00000000000e-01 8.35126784058e-01 -3.18360801562e-01 + 212 1.68050720983e-01 8.31953226131e-01 -3.36720028064e-01 + 213 -1.64873215942e-01 5.00000000000e-01 -3.18360801562e-01 + 214 -1.67970039349e-01 8.31864128501e-01 -3.36483981681e-01 + 215 -5.00000000000e-01 5.00000000000e-01 -3.33333333333e-01 + 216 -5.00000000000e-01 8.35126784058e-01 -3.18360801562e-01 + 217 5.00000000000e-01 5.00000000000e-01 -5.00000000000e-01 + 218 1.66666666667e-01 5.00000000000e-01 -5.00000000000e-01 + 219 5.00000000000e-01 8.33333333333e-01 -5.00000000000e-01 + 220 1.66666666667e-01 8.33333333333e-01 -5.00000000000e-01 + 221 -1.66666666667e-01 5.00000000000e-01 -5.00000000000e-01 + 222 -1.66666666667e-01 8.33333333333e-01 -5.00000000000e-01 + 223 -5.00000000000e-01 5.00000000000e-01 -5.00000000000e-01 + 224 -5.00000000000e-01 8.33333333333e-01 -5.00000000000e-01 + 225 5.00000000000e-01 1.17713643833e+00 5.80800343049e-02 + 226 5.00000000000e-01 1.16592293009e+00 -1.33442609378e-01 + 227 1.70962160892e-01 1.17140800349e+00 -1.75207218157e-01 + 228 1.76733273392e-01 1.17940640106e+00 -1.91723599758e-02 + 229 -1.70853129197e-01 1.17136438841e+00 -1.74988002849e-01 + 230 -1.76629794550e-01 1.17942907254e+00 -1.90680848152e-02 + 231 -5.00000000000e-01 1.16592293009e+00 -1.33442609378e-01 + 232 -5.00000000000e-01 1.17713643833e+00 5.80800343049e-02 + 233 5.00000000000e-01 1.16487321594e+00 -3.18360801562e-01 + 234 1.68040989340e-01 1.16811817689e+00 -3.36635631438e-01 + 235 -1.68055817370e-01 1.16810932389e+00 -3.36359806400e-01 + 236 -5.00000000000e-01 1.16487321594e+00 -3.18360801562e-01 + 237 5.00000000000e-01 1.16666666667e+00 -5.00000000000e-01 + 238 1.66666666667e-01 1.16666666667e+00 -5.00000000000e-01 + 239 -1.66666666667e-01 1.16666666667e+00 -5.00000000000e-01 + 240 -5.00000000000e-01 1.16666666667e+00 -5.00000000000e-01 + 241 5.00000000000e-01 1.50000000000e+00 0.00000000000e+00 + 242 5.00000000000e-01 1.50000000000e+00 -1.66666666667e-01 + 243 1.65922930089e-01 1.50000000000e+00 -1.33442609378e-01 + 244 1.77136438333e-01 1.50000000000e+00 5.80800343049e-02 + 245 -1.65922930089e-01 1.50000000000e+00 -1.33442609378e-01 + 246 -1.77136438333e-01 1.50000000000e+00 5.80800343049e-02 + 247 -5.00000000000e-01 1.50000000000e+00 -1.66666666667e-01 + 248 -5.00000000000e-01 1.50000000000e+00 0.00000000000e+00 + 249 5.00000000000e-01 1.50000000000e+00 -3.33333333333e-01 + 250 1.64873215942e-01 1.50000000000e+00 -3.18360801562e-01 + 251 -1.64873215942e-01 1.50000000000e+00 -3.18360801562e-01 + 252 -5.00000000000e-01 1.50000000000e+00 -3.33333333333e-01 + 253 5.00000000000e-01 1.50000000000e+00 -5.00000000000e-01 + 254 1.66666666667e-01 1.50000000000e+00 -5.00000000000e-01 + 255 -1.66666666667e-01 1.50000000000e+00 -5.00000000000e-01 + 256 -5.00000000000e-01 1.50000000000e+00 -5.00000000000e-01 + 257 5.00000000000e-01 5.00000000000e-01 5.00000000000e-01 + 258 5.00000000000e-01 8.28381901446e-01 2.68543406174e-01 + 259 1.75224475667e-01 8.12674441347e-01 1.24315387207e-01 + 260 1.71618098554e-01 5.00000000000e-01 2.68543406174e-01 + 261 -1.75305352846e-01 8.12763740259e-01 1.24326964392e-01 + 262 -1.71618098554e-01 5.00000000000e-01 2.68543406174e-01 + 263 -5.00000000000e-01 8.28381901446e-01 2.68543406174e-01 + 264 -5.00000000000e-01 5.00000000000e-01 5.00000000000e-01 + 265 5.00000000000e-01 1.17161809855e+00 2.68543406174e-01 + 266 1.75308731395e-01 1.18724630499e+00 1.24358939826e-01 + 267 -1.75182745767e-01 1.18729978263e+00 1.24378343577e-01 + 268 -5.00000000000e-01 1.17161809855e+00 2.68543406174e-01 + 269 5.00000000000e-01 1.50000000000e+00 5.00000000000e-01 + 270 1.71618098554e-01 1.50000000000e+00 2.68543406174e-01 + 271 -1.71618098554e-01 1.50000000000e+00 2.68543406174e-01 + 272 -5.00000000000e-01 1.50000000000e+00 5.00000000000e-01 + 273 1.66666666667e-01 1.16666666667e+00 -8.30000000000e-01 + 274 1.66666666667e-01 1.50000000000e+00 -8.30000000000e-01 + 275 5.00000000000e-01 1.50000000000e+00 -8.30000000000e-01 + 276 5.00000000000e-01 1.16666666667e+00 -8.30000000000e-01 + 277 -1.66666666667e-01 1.16666666667e+00 -8.30000000000e-01 + 278 -1.66666666667e-01 1.50000000000e+00 -8.30000000000e-01 + 279 -5.00000000000e-01 1.16666666667e+00 -8.30000000000e-01 + 280 -5.00000000000e-01 1.50000000000e+00 -8.30000000000e-01 + 281 1.66666666667e-01 8.33333333333e-01 -8.30000000000e-01 + 282 5.00000000000e-01 8.33333333333e-01 -8.30000000000e-01 + 283 -1.66666666667e-01 8.33333333333e-01 -8.30000000000e-01 + 284 -5.00000000000e-01 8.33333333333e-01 -8.30000000000e-01 + 285 1.66666666667e-01 5.00000000000e-01 -8.30000000000e-01 + 286 5.00000000000e-01 5.00000000000e-01 -8.30000000000e-01 + 287 -1.66666666667e-01 5.00000000000e-01 -8.30000000000e-01 + 288 -5.00000000000e-01 5.00000000000e-01 -8.30000000000e-01 + 289 5.00000000000e-01 5.00000000000e-01 0.00000000000e+00 + 290 5.00000000000e-01 5.00000000000e-01 -1.66666666667e-01 + 291 8.34077069911e-01 5.00000000000e-01 -1.33442609378e-01 + 292 8.22863561667e-01 5.00000000000e-01 5.80800343049e-02 + 293 5.00000000000e-01 1.77136438333e-01 5.80800343049e-02 + 294 5.00000000000e-01 1.65922930089e-01 -1.33442609378e-01 + 295 8.29013784295e-01 1.71365536089e-01 -1.75388514517e-01 + 296 8.23291619262e-01 1.79483363067e-01 -1.92732493396e-02 + 297 1.16592293009e+00 5.00000000000e-01 -1.33442609378e-01 + 298 1.17713643833e+00 5.00000000000e-01 5.80800343049e-02 + 299 1.17084156629e+00 1.71382951399e-01 -1.75183210145e-01 + 300 1.17675769874e+00 1.79371924687e-01 -1.91878832863e-02 + 301 1.50000000000e+00 5.00000000000e-01 -1.66666666667e-01 + 302 1.50000000000e+00 5.00000000000e-01 0.00000000000e+00 + 303 1.50000000000e+00 1.65922930089e-01 -1.33442609378e-01 + 304 1.50000000000e+00 1.77136438333e-01 5.80800343049e-02 + 305 5.00000000000e-01 5.00000000000e-01 -3.33333333333e-01 + 306 8.35126784058e-01 5.00000000000e-01 -3.18360801562e-01 + 307 5.00000000000e-01 1.64873215942e-01 -3.18360801562e-01 + 308 8.31949279017e-01 1.68046773869e-01 -3.36720028064e-01 + 309 1.16487321594e+00 5.00000000000e-01 -3.18360801562e-01 + 310 1.16797003935e+00 1.68135871499e-01 -3.36483981681e-01 + 311 1.50000000000e+00 5.00000000000e-01 -3.33333333333e-01 + 312 1.50000000000e+00 1.64873215942e-01 -3.18360801562e-01 + 313 5.00000000000e-01 5.00000000000e-01 -5.00000000000e-01 + 314 8.33333333333e-01 5.00000000000e-01 -5.00000000000e-01 + 315 5.00000000000e-01 1.66666666667e-01 -5.00000000000e-01 + 316 8.33333333333e-01 1.66666666667e-01 -5.00000000000e-01 + 317 1.16666666667e+00 5.00000000000e-01 -5.00000000000e-01 + 318 1.16666666667e+00 1.66666666667e-01 -5.00000000000e-01 + 319 1.50000000000e+00 5.00000000000e-01 -5.00000000000e-01 + 320 1.50000000000e+00 1.66666666667e-01 -5.00000000000e-01 + 321 5.00000000000e-01 -1.77136438333e-01 5.80800343049e-02 + 322 5.00000000000e-01 -1.65922930089e-01 -1.33442609378e-01 + 323 8.29037839108e-01 -1.71408003494e-01 -1.75207218157e-01 + 324 8.23266726608e-01 -1.79406401063e-01 -1.91723599758e-02 + 325 1.17085312920e+00 -1.71364388408e-01 -1.74988002849e-01 + 326 1.17662979455e+00 -1.79429072538e-01 -1.90680848152e-02 + 327 1.50000000000e+00 -1.65922930089e-01 -1.33442609378e-01 + 328 1.50000000000e+00 -1.77136438333e-01 5.80800343049e-02 + 329 5.00000000000e-01 -1.64873215942e-01 -3.18360801562e-01 + 330 8.31959010660e-01 -1.68118176892e-01 -3.36635631438e-01 + 331 1.16805581737e+00 -1.68109323888e-01 -3.36359806400e-01 + 332 1.50000000000e+00 -1.64873215942e-01 -3.18360801562e-01 + 333 5.00000000000e-01 -1.66666666667e-01 -5.00000000000e-01 + 334 8.33333333333e-01 -1.66666666667e-01 -5.00000000000e-01 + 335 1.16666666667e+00 -1.66666666667e-01 -5.00000000000e-01 + 336 1.50000000000e+00 -1.66666666667e-01 -5.00000000000e-01 + 337 5.00000000000e-01 -5.00000000000e-01 0.00000000000e+00 + 338 5.00000000000e-01 -5.00000000000e-01 -1.66666666667e-01 + 339 8.34077069911e-01 -5.00000000000e-01 -1.33442609378e-01 + 340 8.22863561667e-01 -5.00000000000e-01 5.80800343049e-02 + 341 1.16592293009e+00 -5.00000000000e-01 -1.33442609378e-01 + 342 1.17713643833e+00 -5.00000000000e-01 5.80800343049e-02 + 343 1.50000000000e+00 -5.00000000000e-01 -1.66666666667e-01 + 344 1.50000000000e+00 -5.00000000000e-01 0.00000000000e+00 + 345 5.00000000000e-01 -5.00000000000e-01 -3.33333333333e-01 + 346 8.35126784058e-01 -5.00000000000e-01 -3.18360801562e-01 + 347 1.16487321594e+00 -5.00000000000e-01 -3.18360801562e-01 + 348 1.50000000000e+00 -5.00000000000e-01 -3.33333333333e-01 + 349 5.00000000000e-01 -5.00000000000e-01 -5.00000000000e-01 + 350 8.33333333333e-01 -5.00000000000e-01 -5.00000000000e-01 + 351 1.16666666667e+00 -5.00000000000e-01 -5.00000000000e-01 + 352 1.50000000000e+00 -5.00000000000e-01 -5.00000000000e-01 + 353 5.00000000000e-01 5.00000000000e-01 5.00000000000e-01 + 354 5.00000000000e-01 1.71618098554e-01 2.68543406174e-01 + 355 8.24775524333e-01 1.87325558653e-01 1.24315387207e-01 + 356 8.28381901446e-01 5.00000000000e-01 2.68543406174e-01 + 357 1.17530535285e+00 1.87236259741e-01 1.24326964392e-01 + 358 1.17161809855e+00 5.00000000000e-01 2.68543406174e-01 + 359 1.50000000000e+00 1.71618098554e-01 2.68543406174e-01 + 360 1.50000000000e+00 5.00000000000e-01 5.00000000000e-01 + 361 5.00000000000e-01 -1.71618098554e-01 2.68543406174e-01 + 362 8.24691268605e-01 -1.87246304991e-01 1.24358939826e-01 + 363 1.17518274577e+00 -1.87299782629e-01 1.24378343577e-01 + 364 1.50000000000e+00 -1.71618098554e-01 2.68543406174e-01 + 365 5.00000000000e-01 -5.00000000000e-01 5.00000000000e-01 + 366 8.28381901446e-01 -5.00000000000e-01 2.68543406174e-01 + 367 1.17161809855e+00 -5.00000000000e-01 2.68543406174e-01 + 368 1.50000000000e+00 -5.00000000000e-01 5.00000000000e-01 + 369 8.33333333333e-01 -1.66666666667e-01 -8.30000000000e-01 + 370 8.33333333333e-01 -5.00000000000e-01 -8.30000000000e-01 + 371 5.00000000000e-01 -5.00000000000e-01 -8.30000000000e-01 + 372 5.00000000000e-01 -1.66666666667e-01 -8.30000000000e-01 + 373 1.16666666667e+00 -1.66666666667e-01 -8.30000000000e-01 + 374 1.16666666667e+00 -5.00000000000e-01 -8.30000000000e-01 + 375 1.50000000000e+00 -1.66666666667e-01 -8.30000000000e-01 + 376 1.50000000000e+00 -5.00000000000e-01 -8.30000000000e-01 + 377 8.33333333333e-01 1.66666666667e-01 -8.30000000000e-01 + 378 5.00000000000e-01 1.66666666667e-01 -8.30000000000e-01 + 379 1.16666666667e+00 1.66666666667e-01 -8.30000000000e-01 + 380 1.50000000000e+00 1.66666666667e-01 -8.30000000000e-01 + 381 8.33333333333e-01 5.00000000000e-01 -8.30000000000e-01 + 382 5.00000000000e-01 5.00000000000e-01 -8.30000000000e-01 + 383 1.16666666667e+00 5.00000000000e-01 -8.30000000000e-01 + 384 1.50000000000e+00 5.00000000000e-01 -8.30000000000e-01 +ENDOFSECTION + ELEMENTS/CELLS 2.4.6 + 1 4 8 1 2 4 3 5 6 8 + 7 + 2 4 8 2 9 3 10 6 11 7 + 12 + 3 4 8 9 13 10 14 11 15 12 + 16 + 4 4 8 4 3 18 17 8 7 20 + 19 + 5 4 8 3 10 17 21 7 12 19 + 22 + 6 4 8 10 14 21 23 12 16 22 + 24 + 7 4 8 18 17 26 25 20 19 28 + 27 + 8 4 8 17 21 25 29 19 22 27 + 30 + 9 4 8 21 23 29 31 22 24 30 + 32 + 10 4 8 5 6 8 7 33 34 36 + 35 + 11 4 8 6 11 7 12 34 37 35 + 38 + 12 4 8 11 15 12 16 37 39 38 + 40 + 13 4 8 8 7 20 19 36 35 42 + 41 + 14 4 8 7 12 19 22 35 38 41 + 43 + 15 4 8 12 16 22 24 38 40 43 + 44 + 16 4 8 20 19 28 27 42 41 46 + 45 + 17 4 8 19 22 27 30 41 43 45 + 47 + 18 4 8 22 24 30 32 43 44 47 + 48 + 19 4 8 33 34 36 35 49 50 52 + 51 + 20 4 8 34 37 35 38 50 53 51 + 54 + 21 4 8 37 39 38 40 53 55 54 + 56 + 22 4 8 36 35 42 41 52 51 58 + 57 + 23 4 8 35 38 41 43 51 54 57 + 59 + 24 4 8 38 40 43 44 54 56 59 + 60 + 25 4 8 42 41 46 45 58 57 62 + 61 + 26 4 8 41 43 45 47 57 59 61 + 63 + 27 4 8 43 44 47 48 59 60 63 + 64 + 28 4 8 1 2 5 6 65 66 68 + 67 + 29 4 8 2 9 6 11 66 69 67 + 70 + 30 4 8 9 13 11 15 69 71 70 + 72 + 31 4 8 5 6 33 34 68 67 74 + 73 + 32 4 8 6 11 34 37 67 70 73 + 75 + 33 4 8 11 15 37 39 70 72 75 + 76 + 34 4 8 33 34 49 50 74 73 78 + 77 + 35 4 8 34 37 50 53 73 75 77 + 79 + 36 4 8 37 39 53 55 75 76 79 + 80 + 37 4 8 67 70 73 75 68 72 74 + 76 + 38 4 8 68 72 74 76 65 71 78 + 80 + 39 4 8 66 69 67 70 65 71 68 + 72 + 40 4 8 73 75 77 79 74 76 78 + 80 + 41 4 8 45 46 61 62 81 82 84 + 83 + 42 4 8 47 45 63 61 85 81 86 + 84 + 43 4 8 48 47 64 63 87 85 88 + 86 + 44 4 8 27 28 45 46 89 90 81 + 82 + 45 4 8 30 27 47 45 91 89 85 + 81 + 46 4 8 32 30 48 47 92 91 87 + 85 + 47 4 8 25 26 27 28 93 94 89 + 90 + 48 4 8 29 25 30 27 95 93 91 + 89 + 49 4 8 31 29 32 30 96 95 92 + 91 + 50 4 8 97 98 100 99 101 102 104 + 103 + 51 4 8 98 105 99 106 102 107 103 + 108 + 52 4 8 105 109 106 110 107 111 108 + 112 + 53 4 8 100 99 114 113 104 103 116 + 115 + 54 4 8 99 106 113 117 103 108 115 + 118 + 55 4 8 106 110 117 119 108 112 118 + 120 + 56 4 8 114 113 122 121 116 115 124 + 123 + 57 4 8 113 117 121 125 115 118 123 + 126 + 58 4 8 117 119 125 127 118 120 126 + 128 + 59 4 8 101 102 104 103 129 130 132 + 131 + 60 4 8 102 107 103 108 130 133 131 + 134 + 61 4 8 107 111 108 112 133 135 134 + 136 + 62 4 8 104 103 116 115 132 131 138 + 137 + 63 4 8 103 108 115 118 131 134 137 + 139 + 64 4 8 108 112 118 120 134 136 139 + 140 + 65 4 8 116 115 124 123 138 137 142 + 141 + 66 4 8 115 118 123 126 137 139 141 + 143 + 67 4 8 118 120 126 128 139 140 143 + 144 + 68 4 8 129 130 132 131 145 146 148 + 147 + 69 4 8 130 133 131 134 146 149 147 + 150 + 70 4 8 133 135 134 136 149 151 150 + 152 + 71 4 8 132 131 138 137 148 147 154 + 153 + 72 4 8 131 134 137 139 147 150 153 + 155 + 73 4 8 134 136 139 140 150 152 155 + 156 + 74 4 8 138 137 142 141 154 153 158 + 157 + 75 4 8 137 139 141 143 153 155 157 + 159 + 76 4 8 139 140 143 144 155 156 159 + 160 + 77 4 8 97 98 101 102 161 162 164 + 163 + 78 4 8 98 105 102 107 162 165 163 + 166 + 79 4 8 105 109 107 111 165 167 166 + 168 + 80 4 8 101 102 129 130 164 163 170 + 169 + 81 4 8 102 107 130 133 163 166 169 + 171 + 82 4 8 107 111 133 135 166 168 171 + 172 + 83 4 8 129 130 145 146 170 169 174 + 173 + 84 4 8 130 133 146 149 169 171 173 + 175 + 85 4 8 133 135 149 151 171 172 175 + 176 + 86 4 8 163 166 169 171 164 168 170 + 172 + 87 4 8 164 168 170 172 161 167 174 + 176 + 88 4 8 162 165 163 166 161 167 164 + 168 + 89 4 8 169 171 173 175 170 172 174 + 176 + 90 4 8 141 142 157 158 177 178 180 + 179 + 91 4 8 143 141 159 157 181 177 182 + 180 + 92 4 8 144 143 160 159 183 181 184 + 182 + 93 4 8 123 124 141 142 185 186 177 + 178 + 94 4 8 126 123 143 141 187 185 181 + 177 + 95 4 8 128 126 144 143 188 187 183 + 181 + 96 4 8 121 122 123 124 189 190 185 + 186 + 97 4 8 125 121 126 123 191 189 187 + 185 + 98 4 8 127 125 128 126 192 191 188 + 187 + 99 4 8 193 194 196 195 197 198 200 + 199 + 100 4 8 196 195 202 201 200 199 204 + 203 + 101 4 8 202 201 206 205 204 203 208 + 207 + 102 4 8 194 209 195 210 198 211 199 + 212 + 103 4 8 195 210 201 213 199 212 203 + 214 + 104 4 8 201 213 205 215 203 214 207 + 216 + 105 4 8 209 217 210 218 211 219 212 + 220 + 106 4 8 210 218 213 221 212 220 214 + 222 + 107 4 8 213 221 215 223 214 222 216 + 224 + 108 4 8 197 198 200 199 225 226 228 + 227 + 109 4 8 200 199 204 203 228 227 230 + 229 + 110 4 8 204 203 208 207 230 229 232 + 231 + 111 4 8 198 211 199 212 226 233 227 + 234 + 112 4 8 199 212 203 214 227 234 229 + 235 + 113 4 8 203 214 207 216 229 235 231 + 236 + 114 4 8 211 219 212 220 233 237 234 + 238 + 115 4 8 212 220 214 222 234 238 235 + 239 + 116 4 8 214 222 216 224 235 239 236 + 240 + 117 4 8 225 226 228 227 241 242 244 + 243 + 118 4 8 228 227 230 229 244 243 246 + 245 + 119 4 8 230 229 232 231 246 245 248 + 247 + 120 4 8 226 233 227 234 242 249 243 + 250 + 121 4 8 227 234 229 235 243 250 245 + 251 + 122 4 8 229 235 231 236 245 251 247 + 252 + 123 4 8 233 237 234 238 249 253 250 + 254 + 124 4 8 234 238 235 239 250 254 251 + 255 + 125 4 8 235 239 236 240 251 255 252 + 256 + 126 4 8 193 197 196 200 257 258 260 + 259 + 127 4 8 196 200 202 204 260 259 262 + 261 + 128 4 8 202 204 206 208 262 261 264 + 263 + 129 4 8 197 225 200 228 258 265 259 + 266 + 130 4 8 200 228 204 230 259 266 261 + 267 + 131 4 8 204 230 208 232 261 267 263 + 268 + 132 4 8 225 241 228 244 265 269 266 + 270 + 133 4 8 228 244 230 246 266 270 267 + 271 + 134 4 8 230 246 232 248 267 271 268 + 272 + 135 4 8 259 266 261 267 258 265 263 + 268 + 136 4 8 258 265 263 268 257 269 264 + 272 + 137 4 8 260 259 262 261 257 258 264 + 263 + 138 4 8 266 270 267 271 265 269 268 + 272 + 139 4 8 238 254 237 253 273 274 276 + 275 + 140 4 8 239 255 238 254 277 278 273 + 274 + 141 4 8 240 256 239 255 279 280 277 + 278 + 142 4 8 220 238 219 237 281 273 282 + 276 + 143 4 8 222 239 220 238 283 277 281 + 273 + 144 4 8 224 240 222 239 284 279 283 + 277 + 145 4 8 218 220 217 219 285 281 286 + 282 + 146 4 8 221 222 218 220 287 283 285 + 281 + 147 4 8 223 224 221 222 288 284 287 + 283 + 148 4 8 289 290 292 291 293 294 296 + 295 + 149 4 8 292 291 298 297 296 295 300 + 299 + 150 4 8 298 297 302 301 300 299 304 + 303 + 151 4 8 290 305 291 306 294 307 295 + 308 + 152 4 8 291 306 297 309 295 308 299 + 310 + 153 4 8 297 309 301 311 299 310 303 + 312 + 154 4 8 305 313 306 314 307 315 308 + 316 + 155 4 8 306 314 309 317 308 316 310 + 318 + 156 4 8 309 317 311 319 310 318 312 + 320 + 157 4 8 293 294 296 295 321 322 324 + 323 + 158 4 8 296 295 300 299 324 323 326 + 325 + 159 4 8 300 299 304 303 326 325 328 + 327 + 160 4 8 294 307 295 308 322 329 323 + 330 + 161 4 8 295 308 299 310 323 330 325 + 331 + 162 4 8 299 310 303 312 325 331 327 + 332 + 163 4 8 307 315 308 316 329 333 330 + 334 + 164 4 8 308 316 310 318 330 334 331 + 335 + 165 4 8 310 318 312 320 331 335 332 + 336 + 166 4 8 321 322 324 323 337 338 340 + 339 + 167 4 8 324 323 326 325 340 339 342 + 341 + 168 4 8 326 325 328 327 342 341 344 + 343 + 169 4 8 322 329 323 330 338 345 339 + 346 + 170 4 8 323 330 325 331 339 346 341 + 347 + 171 4 8 325 331 327 332 341 347 343 + 348 + 172 4 8 329 333 330 334 345 349 346 + 350 + 173 4 8 330 334 331 335 346 350 347 + 351 + 174 4 8 331 335 332 336 347 351 348 + 352 + 175 4 8 289 293 292 296 353 354 356 + 355 + 176 4 8 292 296 298 300 356 355 358 + 357 + 177 4 8 298 300 302 304 358 357 360 + 359 + 178 4 8 293 321 296 324 354 361 355 + 362 + 179 4 8 296 324 300 326 355 362 357 + 363 + 180 4 8 300 326 304 328 357 363 359 + 364 + 181 4 8 321 337 324 340 361 365 362 + 366 + 182 4 8 324 340 326 342 362 366 363 + 367 + 183 4 8 326 342 328 344 363 367 364 + 368 + 184 4 8 355 362 357 363 354 361 359 + 364 + 185 4 8 354 361 359 364 353 365 360 + 368 + 186 4 8 356 355 358 357 353 354 360 + 359 + 187 4 8 362 366 363 367 361 365 364 + 368 + 188 4 8 334 350 333 349 369 370 372 + 371 + 189 4 8 335 351 334 350 373 374 369 + 370 + 190 4 8 336 352 335 351 375 376 373 + 374 + 191 4 8 316 334 315 333 377 369 378 + 372 + 192 4 8 318 335 316 334 379 373 377 + 369 + 193 4 8 320 336 318 335 380 375 379 + 373 + 194 4 8 314 316 313 315 381 377 382 + 378 + 195 4 8 317 318 314 316 383 379 381 + 377 + 196 4 8 319 320 317 318 384 380 383 + 379 +ENDOFSECTION + ELEMENT GROUP 2.4.6 +GROUP: 8 ELEMENTS: 40 MATERIAL: 0 NFLAGS: 0 + Block 8 + + + 1 2 3 4 5 6 7 8 9 10 + 11 12 13 14 15 16 17 18 19 20 + 21 22 23 24 25 26 27 28 29 30 + 31 32 33 34 35 36 37 38 39 40 +ENDOFSECTION + ELEMENT GROUP 2.4.6 +GROUP: 9 ELEMENTS: 9 MATERIAL: 0 NFLAGS: 0 + Block 9 + + + 41 42 43 44 45 46 47 48 49 +ENDOFSECTION + ELEMENT GROUP 2.4.6 +GROUP: 1 ELEMENTS: 40 MATERIAL: 0 NFLAGS: 0 + Block 1 + + + 50 51 52 53 54 55 56 57 58 59 + 60 61 62 63 64 65 66 67 68 69 + 70 71 72 73 74 75 76 77 78 79 + 80 81 82 83 84 85 86 87 88 89 +ENDOFSECTION + ELEMENT GROUP 2.4.6 +GROUP: 2 ELEMENTS: 9 MATERIAL: 0 NFLAGS: 0 + Block 2 + + + 90 91 92 93 94 95 96 97 98 +ENDOFSECTION + ELEMENT GROUP 2.4.6 +GROUP: 3 ELEMENTS: 40 MATERIAL: 0 NFLAGS: 0 + Block 3 + + + 99 100 101 102 103 104 105 106 107 108 + 109 110 111 112 113 114 115 116 117 118 + 119 120 121 122 123 124 125 126 127 128 + 129 130 131 132 133 134 135 136 137 138 +ENDOFSECTION + ELEMENT GROUP 2.4.6 +GROUP: 4 ELEMENTS: 9 MATERIAL: 0 NFLAGS: 0 + Block 4 + + + 139 140 141 142 143 144 145 146 147 +ENDOFSECTION + ELEMENT GROUP 2.4.6 +GROUP: 6 ELEMENTS: 40 MATERIAL: 0 NFLAGS: 0 + Block 6 + + + 148 149 150 151 152 153 154 155 156 157 + 158 159 160 161 162 163 164 165 166 167 + 168 169 170 171 172 173 174 175 176 177 + 178 179 180 181 182 183 184 185 186 187 +ENDOFSECTION + ELEMENT GROUP 2.4.6 +GROUP: 7 ELEMENTS: 9 MATERIAL: 0 NFLAGS: 0 + Block 7 + + + 188 189 190 191 192 193 194 195 196 +ENDOFSECTION + BOUNDARY CONDITIONS 2.4.6 + BC_TOP 1 4 0 6 + 87 4 6 + 136 4 6 + 185 4 6 + 38 4 6 +ENDOFSECTION + BOUNDARY CONDITIONS 2.4.6 + BC_BOT 1 36 0 6 + 90 4 6 + 91 4 6 + 92 4 6 + 93 4 6 + 94 4 6 + 95 4 6 + 96 4 6 + 97 4 6 + 98 4 6 + 139 4 6 + 140 4 6 + 141 4 6 + 142 4 6 + 143 4 6 + 144 4 6 + 145 4 6 + 146 4 6 + 147 4 6 + 188 4 6 + 189 4 6 + 190 4 6 + 191 4 6 + 192 4 6 + 193 4 6 + 194 4 6 + 195 4 6 + 196 4 6 + 41 4 6 + 42 4 6 + 43 4 6 + 44 4 6 + 45 4 6 + 46 4 6 + 47 4 6 + 48 4 6 + 49 4 6 +ENDOFSECTION + BOUNDARY CONDITIONS 2.4.6 + BC_XPLUS 1 32 0 6 + 177 4 3 + 180 4 3 + 183 4 3 + 185 4 3 + 150 4 3 + 153 4 3 + 156 4 3 + 159 4 3 + 162 4 3 + 165 4 3 + 168 4 3 + 171 4 3 + 174 4 3 + 196 4 1 + 193 4 1 + 190 4 1 + 30 4 2 + 33 4 2 + 36 4 2 + 38 4 2 + 3 4 2 + 6 4 2 + 9 4 2 + 12 4 2 + 15 4 2 + 18 4 2 + 21 4 2 + 24 4 2 + 27 4 2 + 49 4 4 + 46 4 4 + 43 4 4 +ENDOFSECTION + BOUNDARY CONDITIONS 2.4.6 + BC_XMINUS 1 32 0 6 + 79 4 2 + 82 4 2 + 85 4 2 + 87 4 2 + 52 4 2 + 55 4 2 + 58 4 2 + 61 4 2 + 64 4 2 + 67 4 2 + 70 4 2 + 73 4 2 + 76 4 2 + 98 4 4 + 95 4 4 + 92 4 4 + 128 4 3 + 131 4 3 + 134 4 3 + 136 4 3 + 101 4 3 + 104 4 3 + 107 4 3 + 110 4 3 + 113 4 3 + 116 4 3 + 119 4 3 + 122 4 3 + 125 4 3 + 147 4 1 + 144 4 1 + 141 4 1 +ENDOFSECTION + BOUNDARY CONDITIONS 2.4.6 + BC_YMINUS 1 32 0 6 + 85 4 3 + 84 4 3 + 83 4 3 + 89 4 3 + 68 4 6 + 69 4 6 + 70 4 6 + 71 4 6 + 72 4 6 + 73 4 6 + 74 4 6 + 75 4 6 + 76 4 6 + 92 4 3 + 91 4 3 + 90 4 3 + 183 4 2 + 182 4 2 + 181 4 2 + 187 4 2 + 166 4 6 + 167 4 6 + 168 4 6 + 169 4 6 + 170 4 6 + 171 4 6 + 172 4 6 + 173 4 6 + 174 4 6 + 190 4 2 + 189 4 2 + 188 4 2 +ENDOFSECTION + BOUNDARY CONDITIONS 2.4.6 + BC_YPLUS 1 32 0 6 + 134 4 2 + 133 4 2 + 132 4 2 + 138 4 2 + 117 4 6 + 118 4 6 + 119 4 6 + 120 4 6 + 121 4 6 + 122 4 6 + 123 4 6 + 124 4 6 + 125 4 6 + 141 4 2 + 140 4 2 + 139 4 2 + 36 4 3 + 35 4 3 + 34 4 3 + 40 4 3 + 19 4 6 + 20 4 6 + 21 4 6 + 22 4 6 + 23 4 6 + 24 4 6 + 25 4 6 + 26 4 6 + 27 4 6 + 43 4 3 + 42 4 3 + 41 4 3 +ENDOFSECTION + BOUNDARY CONDITIONS 2.4.6 + cfd_bc 1 1 0 0 51 +ENDOFSECTION + BOUNDARY CONDITIONS 2.4.6 + cfd_bc 2 1 0 0 51 +ENDOFSECTION + BOUNDARY CONDITIONS 2.4.6 + cfd_bc 3 1 0 0 51 +ENDOFSECTION + BOUNDARY CONDITIONS 2.4.6 + cfd_bc 4 1 0 0 51 +ENDOFSECTION + BOUNDARY CONDITIONS 2.4.6 + cfd_bc 5 1 0 0 51 +ENDOFSECTION + BOUNDARY CONDITIONS 2.4.6 + cfd_bc 6 1 0 0 51 +ENDOFSECTION diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/hopr.ini b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/hopr.ini index 072933f2d..ed08284ce 100644 --- a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/hopr.ini +++ b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/hopr.ini @@ -1,13 +1,13 @@ !=============================================================================== ! ! OUTPUT !=============================================================================== ! -ProjectName = mesh_cubitDebug ! name of the project (used for filenames) +ProjectName = mesh_cubitDebug_periodic ! name of the project (used for filenames) Debugvisu = T !=============================================================================== ! ! MESH !=============================================================================== ! -FileName = export.neu ! name of mesh file as exported from grid generator -Mode = 2 ! 1 Cartesian 2 gambit file 3 CGNS +FileName = export_periodic.neu ! name of mesh file as exported from grid generator +Mode = 2 ! 1 Cartesian 2 gambit file 3 CGNS meshscale = 0.001 !=============================================================================== ! ! BOUNDARY CONDITIONS @@ -16,16 +16,14 @@ BoundaryName=BC_TOP BoundaryType=(/4,0,0,0/) BoundaryName=BC_BOT BoundaryType=(/4,0,0,0/) - BoundaryName=BC_XMINUS BoundaryType=(/1,0,0,1/) BoundaryName=BC_XPLUS BoundaryType=(/1,0,0,-1/) - BoundaryName=BC_YMINUS BoundaryType=(/1,0,0,2/) BoundaryName=BC_YPLUS BoundaryType=(/1,0,0,-2/) -vv=(/0.001 , 0. , 0./) ! Periodic vector in x -vv=(/0. , 0.001 , 0./) ! Periodic vector in y +vv=(/0.002,0.,0./) +vv=(/0.,0.002,0./) \ No newline at end of file diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/parameter.ini b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/parameter.ini index 7dd482937..ae34591c9 100644 --- a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/parameter.ini +++ b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/parameter.ini @@ -22,7 +22,7 @@ DoInitialAutoRestart = T ! =============================================================================== ! ! MESH ! =============================================================================== ! -MeshFile = mesh_cubitDebug_mesh.h5 +MeshFile = mesh_cubitDebug_periodic_mesh.h5 Logging = F WriteErrorFiles = F useCurveds = F @@ -95,8 +95,8 @@ Part-Boundary6-Condition = periodic Part-nPeriodicVectors = 2 -Part-FIBGMdeltas = (/ 1.0e-3 , 1.0e-3 , 0.00133 /) -Part-FactorFIBGM = (/ 1 , 1 , 1 /) +Part-FIBGMdeltas = (/ 2.0e-3 , 2.0e-3 , 0.00133 /) +Part-FactorFIBGM = (/ 1. , 1. , 1. /) Part-Boundary$-BoundaryParticleOutput = T Part-Boundary$-PhotonSpecularReflection = T ! F: diffuse with PhotonEnACC, T: perfect mirror diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_split2hex_periodic/export_split2hex.neu b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_split2hex_periodic/export_split2hex.neu new file mode 100644 index 000000000..5c22e138a --- /dev/null +++ b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_split2hex_periodic/export_split2hex.neu @@ -0,0 +1,14285 @@ + CONTROL INFO 2.4.6 +** GAMBIT NEUTRAL FILE +/media/nizenkov/storage/boltzplatz/Projects/Zeiss/012-SMT-Dinger-P23006-MEMS-Raytracing/3-TestCases/meshes/2023-08-25-M0X-Debug-Cubit-3to1/export_split2hex.neu +PROGRAM: Coreform_Cubit VERSION: 2023.4 + + NUMNP NELEM NGRPS NBSETS NDFCD NDFVL + 4865 4380 1 6 3 3 +ENDOFSECTION + NODAL COORDINATES 2.4.6 + 1 2.72274554279e-01 1.77953789918e-01 -7.14615628033e-01 + 2 1.54721719688e-01 1.07561337508e-01 -7.72307814017e-01 + 3 2.69814479792e-01 2.38374225005e-01 -7.91538542678e-01 + 4 3.86137277139e-01 3.38976894959e-01 -7.72307814017e-01 + 5 3.86137277139e-01 8.89768949591e-02 -7.72307814017e-01 + 6 2.69814479792e-01 7.17075583385e-02 -7.91538542678e-01 + 7 3.27360859844e-01 1.78780668754e-01 -8.01153907008e-01 + 8 4.24091518093e-01 2.25984596639e-01 -7.91538542678e-01 + 9 2.68584442549e-01 2.68584442549e-01 -8.30000000000e-01 + 10 5.00000000000e-01 5.00000000000e-01 -8.30000000000e-01 + 11 3.45722961699e-01 1.79056295032e-01 -8.30000000000e-01 + 12 5.00000000000e-01 2.50000000000e-01 -8.30000000000e-01 + 13 2.68584442549e-01 1.85844425486e-02 -8.30000000000e-01 + 14 5.00000000000e-01 0.00000000000e+00 -8.30000000000e-01 + 15 3.71688850972e-02 3.71688850972e-02 -8.30000000000e-01 + 16 1.97625724784e-01 2.02969231938e-01 -6.83004442633e-01 + 17 1.31750483189e-01 3.01979487959e-01 -7.32002961755e-01 + 18 1.36137277139e-01 3.38976894959e-01 -7.72307814017e-01 + 19 1.44140111555e-01 1.47702449658e-01 -7.32002961755e-01 + 20 1.08105083666e-01 2.35776837243e-01 -7.56502221316e-01 + 21 1.03147813125e-01 2.38374225005e-01 -7.91538542678e-01 + 22 6.14884476448e-02 3.63992336979e-01 -7.40696628616e-01 + 23 0.00000000000e+00 5.00000000000e-01 -8.30000000000e-01 + 24 5.33819267956e-02 2.55051186352e-01 -7.70464419077e-01 + 25 1.85844425486e-02 2.68584442549e-01 -8.30000000000e-01 + 26 8.00728901934e-02 1.32576779528e-01 -7.40696628616e-01 + 27 1.22976895290e-01 2.27984673959e-01 -6.51393257232e-01 + 28 -2.72056303882e-01 -2.06424224657e-01 -7.32206115671e-01 + 29 -1.17443709393e-01 -8.46276697797e-02 -7.81103057836e-01 + 30 -7.82958062618e-02 -2.23085113186e-01 -7.97402038557e-01 + 31 -1.36028151941e-01 -3.53212112328e-01 -7.81103057836e-01 + 32 -3.86028151941e-01 -1.03212112328e-01 -7.81103057836e-01 + 33 -2.44962472928e-01 -5.64184465198e-02 -7.97402038557e-01 + 34 -1.83721854696e-01 -1.67313834890e-01 -8.05551528918e-01 + 35 -2.57352101294e-01 -2.35474741552e-01 -7.97402038557e-01 + 36 1.85844425486e-02 -2.31415557451e-01 -8.30000000000e-01 + 37 0.00000000000e+00 -5.00000000000e-01 -8.30000000000e-01 + 38 -1.54277038301e-01 -1.54277038301e-01 -8.30000000000e-01 + 39 -2.50000000000e-01 -2.50000000000e-01 -8.30000000000e-01 + 40 -2.31415557451e-01 1.85844425486e-02 -8.30000000000e-01 + 41 -5.00000000000e-01 0.00000000000e+00 -8.30000000000e-01 + 42 1.45017428921e-01 -4.11959107700e-02 -6.29748141368e-01 + 43 1.55822436183e-01 2.43394812798e-02 -6.40603138014e-01 + 44 2.06336057417e-01 7.05486130053e-03 -6.34963620979e-01 + 45 2.26190364403e-01 -3.43551447140e-02 -6.26716364139e-01 + 46 1.64199299999e-01 -7.57054530762e-02 -6.75016088746e-01 + 47 1.65008681148e-01 -2.05120109410e-02 -6.67163437384e-01 + 48 2.00597335832e-01 -2.22626028702e-02 -6.56293724765e-01 + 49 2.11920633294e-01 -5.96417616035e-02 -6.57905588134e-01 + 50 2.36995371665e-01 3.11802473358e-02 -6.37571360785e-01 + 51 3.07363299885e-01 -2.75143786579e-02 -6.23684586910e-01 + 52 2.19123971470e-01 -1.59515002369e-02 -6.65142252565e-01 + 53 2.45372235481e-01 -6.88646870202e-02 -6.71984311517e-01 + 54 1.75004307262e-01 -1.01700610264e-02 -6.85871085392e-01 + 55 1.83381171078e-01 -1.10214995382e-01 -7.20284036125e-01 + 56 1.66627443446e-01 8.98748733296e-02 -6.51458134659e-01 + 57 1.88085189557e-01 -3.26316356012e-01 -5.83230139215e-01 + 58 2.64912341062e-01 -3.38168322524e-01 -5.26009221254e-01 + 59 1.81146476296e-01 -3.92112215016e-01 -5.14638095231e-01 + 60 1.00849968162e-01 -4.13158178006e-01 -5.37562991200e-01 + 61 3.44042594779e-01 -4.13158178006e-01 -7.06615069608e-01 + 62 3.43274894041e-01 -3.92112215016e-01 -6.27339480836e-01 + 63 2.60859857222e-01 -4.19084161262e-01 -5.93478571423e-01 + 64 2.33899978774e-01 -4.42105452004e-01 -6.35041994133e-01 + 65 1.77677119666e-01 -4.25010144518e-01 -4.80342073238e-01 + 66 1.36147467661e-02 -5.00000000000e-01 -4.91895843185e-01 + 67 2.85118079777e-01 -4.50006763012e-01 -5.96894715492e-01 + 68 2.56807373383e-01 -5.00000000000e-01 -6.60947921592e-01 + 69 4.20869746283e-01 -4.25010144518e-01 -6.49394151646e-01 + 70 5.00000000000e-01 -5.00000000000e-01 -8.30000000000e-01 + 71 3.41739492566e-01 -3.50020289036e-01 -4.68788303292e-01 + 72 2.43974289443e-01 2.60176839421e-01 -5.47553399215e-01 + 73 3.71987144721e-01 2.15416156877e-01 -5.13748596736e-01 + 74 3.43758251331e-01 2.65657418528e-01 -5.49941144679e-01 + 75 2.65637376996e-01 3.13158390625e-01 -5.84939819890e-01 + 76 3.71987144721e-01 3.80088419711e-01 -4.07864925685e-01 + 77 4.14658096481e-01 3.10277437918e-01 -4.31891215209e-01 + 78 3.82818688498e-01 3.24243063896e-01 -4.79499971548e-01 + 79 3.43758251331e-01 3.75438927083e-01 -4.79352030645e-01 + 80 3.93650232275e-01 2.68397708082e-01 -5.51135017411e-01 + 81 2.87300464550e-01 3.66139941829e-01 -6.22326240565e-01 + 82 4.29100154850e-01 3.45598472054e-01 -4.56815495659e-01 + 83 3.93650232275e-01 4.33069970915e-01 -4.45251346360e-01 + 84 5.00000000000e-01 3.35327737167e-01 -3.74060123207e-01 + 85 5.00000000000e-01 5.00000000000e-01 -2.68176452156e-01 + 86 5.00000000000e-01 1.70655474334e-01 -4.79943794258e-01 + 87 -3.05282120157e-01 -3.58791644431e-01 -3.85681612401e-01 + 88 -1.45833686696e-01 -4.29395822216e-01 -4.38788727793e-01 + 89 -2.63889124464e-01 -4.52930548144e-01 -4.16272802165e-01 + 90 -4.02641060079e-01 -4.29395822216e-01 -3.78461281656e-01 + 91 -4.02641060079e-01 -4.29395822216e-01 -6.07840806201e-01 + 92 -2.63889124464e-01 -4.52930548144e-01 -5.69192485195e-01 + 93 -3.22916843348e-01 -4.64697911108e-01 -5.19704601624e-01 + 94 -4.35094040052e-01 -4.52930548144e-01 -5.28974187770e-01 + 95 -2.43192626617e-01 -5.00000000000e-01 -4.31568397047e-01 + 96 -5.00000000000e-01 -5.00000000000e-01 -3.71240950910e-01 + 97 -3.28795084411e-01 -5.00000000000e-01 -5.64378931365e-01 + 98 -5.00000000000e-01 -5.00000000000e-01 -6.00620475455e-01 + 99 -2.43192626617e-01 -5.00000000000e-01 -6.60947921592e-01 + 100 -5.00000000000e-01 -5.00000000000e-01 -8.30000000000e-01 + 101 -5.00000000000e-01 -2.03967303369e-01 -1.42173602522e-01 + 102 -5.00000000000e-01 -3.51983651684e-01 -2.56707276716e-01 + 103 -3.46008190530e-01 -4.01322434456e-01 -1.80833208398e-01 + 104 -2.69012285796e-01 -3.51983651684e-01 -8.56293371419e-02 + 105 -5.00000000000e-01 -3.51983651684e-01 1.78913198739e-01 + 106 -5.00000000000e-01 -4.01322434456e-01 -4.47151781061e-03 + 107 -3.84506142898e-01 -4.25991825842e-01 -1.06249062984e-02 + 108 -3.46008190530e-01 -4.01322434456e-01 1.09580441905e-01 + 109 -2.69012285796e-01 -5.00000000000e-01 -2.00163011336e-01 + 110 -3.80245715914e-02 -5.00000000000e-01 -2.90850717617e-02 + 111 -3.46008190530e-01 -5.00000000000e-01 3.32246591095e-02 + 112 -2.69012285796e-01 -5.00000000000e-01 2.35457464119e-01 + 113 -5.00000000000e-01 -5.00000000000e-01 6.43795245452e-02 + 114 -5.00000000000e-01 -5.00000000000e-01 5.00000000000e-01 + 115 -1.09897314994e-01 -4.52930548144e-01 -3.02220842449e-01 + 116 -1.71653345874e-01 -4.29395822216e-01 -2.07383342082e-01 + 117 -2.07422986246e-01 -4.64697911108e-01 -3.19475869564e-01 + 118 -2.81102230583e-01 -4.52930548144e-01 -2.62002545024e-01 + 119 -1.22049124127e-02 -5.00000000000e-01 -2.60490457473e-01 + 120 -1.74803274942e-01 -5.00000000000e-01 -2.97407288619e-01 + 121 -2.63478886461e-01 2.52966228573e-01 9.80053919930e-02 + 122 -3.81739443230e-01 3.76483114286e-01 -8.50855300814e-02 + 123 -2.39994266754e-01 4.17655409524e-01 -5.70207617589e-02 + 124 -1.09991400131e-01 3.76483114286e-01 4.85570834396e-02 + 125 -2.49118359808e-01 2.71427143287e-01 -3.04760276624e-02 + 126 -3.32745573205e-01 3.47618095525e-01 -1.09709502494e-01 + 127 -2.38685158354e-01 3.85713571643e-01 -8.25049331486e-02 + 128 -1.51580211139e-01 3.47618095525e-01 -2.06144268129e-02 + 129 -2.28251956901e-01 5.00000000000e-01 -1.34533838635e-01 + 130 4.34960861984e-02 5.00000000000e-01 -8.91225113863e-04 + 131 -2.30420582319e-01 4.29962686000e-01 -1.42675041529e-01 + 132 -9.56308734779e-02 3.94944029000e-01 -7.99243362158e-02 + 133 -3.67378916577e-01 3.94944029000e-01 -2.13566949737e-01 + 134 -2.34757833154e-01 2.89888058001e-01 -1.58957447318e-01 + 135 -5.00000000000e-01 5.00000000000e-01 -2.68176452156e-01 + 136 -3.80546922638e-01 -2.02387331160e-02 -3.12404801652e-01 + 137 -4.40273461319e-01 7.52083706089e-02 -3.96174297955e-01 + 138 -4.60182307546e-01 -1.78501873837e-02 -3.11507399477e-01 + 139 -4.40273461319e-01 -1.12103018242e-01 -2.27289202087e-01 + 140 -4.40273461319e-01 3.61116032277e-02 -1.74024001416e-01 + 141 -4.60182307546e-01 8.09595602631e-02 -2.75997265697e-01 + 142 -4.70136730660e-01 9.72784435512e-03 -2.42541349903e-01 + 143 -4.60182307546e-01 -4.39146989711e-02 -1.63407201785e-01 + 144 -5.00000000000e-01 -1.66559145175e-02 -3.11058698390e-01 + 145 -5.00000000000e-01 1.97167035122e-02 -2.19253532653e-01 + 146 -5.00000000000e-01 -5.57526818987e-02 -8.89084018514e-02 + 147 -5.00000000000e-01 1.31558706953e-01 -2.57793497719e-01 + 148 -5.00000000000e-01 9.24619395715e-02 -3.56432011806e-02 + 149 -5.00000000000e-01 1.70655474334e-01 -4.79943794258e-01 + 150 5.00000000000e-01 -2.03967303369e-01 -1.42173602522e-01 + 151 2.30987714204e-01 -3.51983651684e-01 -8.56293371419e-02 + 152 3.20658476136e-01 -4.01322434456e-01 -1.80833208398e-01 + 153 5.00000000000e-01 -3.51983651684e-01 -2.56707276716e-01 + 154 5.00000000000e-01 -3.51983651684e-01 1.78913198739e-01 + 155 3.20658476136e-01 -4.01322434456e-01 1.09580441905e-01 + 156 3.65493857102e-01 -4.25991825842e-01 -1.06249062984e-02 + 157 5.00000000000e-01 -4.01322434456e-01 -4.47151781061e-03 + 158 2.30987714204e-01 -5.00000000000e-01 -2.00163011336e-01 + 159 5.00000000000e-01 -5.00000000000e-01 -3.71240950910e-01 + 160 3.20658476136e-01 -5.00000000000e-01 3.32246591095e-02 + 161 5.00000000000e-01 -5.00000000000e-01 6.43795245452e-02 + 162 2.30987714204e-01 -5.00000000000e-01 2.35457464119e-01 + 163 5.00000000000e-01 -5.00000000000e-01 5.00000000000e-01 + 164 1.31331185504e-01 2.56114618453e-01 -2.84339608728e-01 + 165 1.57858979116e-01 3.78057309226e-01 -3.82152249326e-01 + 166 1.19738014810e-01 4.18704872818e-01 -2.55065241255e-01 + 167 8.74136358509e-02 3.78057309226e-01 -1.42615416921e-01 + 168 3.15665592752e-01 3.78057309226e-01 -2.76258030442e-01 + 169 2.71905986077e-01 4.18704872818e-01 -3.44160316936e-01 + 170 2.14803511108e-01 4.39028654613e-01 -2.58343043980e-01 + 171 2.24942423901e-01 4.18704872818e-01 -1.84469095333e-01 + 172 1.13941429463e-01 5.00000000000e-01 -2.40428057519e-01 + 173 2.42627619642e-01 5.00000000000e-01 -2.49677522398e-01 + 174 2.71748043099e-01 5.00000000000e-01 -1.34533838635e-01 + 175 3.42193386364e-01 5.00000000000e-01 -3.74070671040e-01 + 176 1.84386772728e-01 5.00000000000e-01 -4.79964889923e-01 + 177 -2.42155598925e-01 2.27619469692e-01 -1.04542325995e-01 + 178 -2.49263361437e-01 2.36068389319e-01 -3.70264199990e-02 + 179 -3.67378916577e-01 1.91174998786e-01 -9.73003242492e-02 + 180 -3.28103732617e-01 1.82566959652e-01 -8.15759510569e-02 + 181 -3.11947521078e-01 2.00166776882e-01 -3.66806152944e-02 + 182 -3.32745573205e-01 2.11772075382e-01 -3.21984188351e-02 + 183 -2.56516125578e-01 2.09158554978e-01 2.39390936603e-02 + 184 -3.37677417052e-01 1.70259683176e-01 4.07832871333e-03 + 185 -3.81739443230e-01 1.72714084072e-01 3.11810954062e-02 + 186 -3.74776682348e-01 1.28906410477e-01 -4.28852029265e-02 + 187 -2.49553364695e-01 1.65350881383e-01 -5.01272046724e-02 + 188 -3.13043635387e-02 2.90209979345e-01 -4.03435206244e-01 + 189 5.00134109824e-02 2.73162298899e-01 -3.43887407486e-01 + 190 9.48045315644e-02 3.48774865933e-01 -3.89246568299e-01 + 191 7.65412045948e-02 3.95104989672e-01 -4.41700048084e-01 + 192 -3.73920205374e-02 3.20351903285e-01 -3.33481274880e-01 + 193 1.88490481429e-02 2.98939475008e-01 -3.17100719496e-01 + 194 6.02334792893e-02 3.49204606256e-01 -3.57816762103e-01 + 195 3.65342438845e-02 3.80234602190e-01 -3.82309146561e-01 + 196 9.07460935653e-02 3.68869481893e-01 -3.42610614056e-01 + 197 7.04535475961e-02 4.25246913613e-01 -3.71746116720e-01 + 198 4.39257539837e-02 3.03304222839e-01 -2.73933476122e-01 + 199 -4.34796775360e-02 3.50493827226e-01 -2.63527343516e-01 + 200 1.00567700276e-01 3.53997571278e-01 -6.03474994053e-01 + 201 1.11772297783e-01 2.90991122618e-01 -6.27434125643e-01 + 202 1.04326184984e-01 2.83911026265e-01 -5.89884025770e-01 + 203 9.50008298315e-02 3.11874202419e-01 -5.59129410039e-01 + 204 4.62784704142e-02 2.98120670330e-01 -6.26563454582e-01 + 205 7.18446120393e-02 2.74742004873e-01 -6.34840055465e-01 + 206 7.62419488762e-02 2.73494212044e-01 -6.04825998105e-01 + 207 6.06636334051e-02 2.88664058073e-01 -5.89303578396e-01 + 208 1.06205427338e-01 2.48867753759e-01 -5.83088541629e-01 + 209 8.94339593869e-02 2.69750833559e-01 -5.14783826025e-01 + 210 6.81333650763e-02 2.46659758967e-01 -6.05276332790e-01 + 211 4.07115999697e-02 2.55997301471e-01 -5.82217870568e-01 + 212 5.74830679210e-02 2.35114221670e-01 -6.50522586172e-01 + 213 -8.01075944755e-03 2.42243769382e-01 -6.49651915111e-01 + 214 1.67492102733e-01 1.88850733631e-01 -4.49654347572e-01 + 215 1.49411644118e-01 2.22482676042e-01 -3.66996978150e-01 + 216 2.04104432333e-01 1.83973518944e-01 -3.57462685666e-01 + 217 2.40491055748e-01 1.47902969189e-01 -3.94024224134e-01 + 218 3.33746051367e-01 3.44425366816e-01 -3.58915399864e-01 + 219 2.66274429412e-01 3.14988450695e-01 -3.34056802819e-01 + 220 2.78078324250e-01 2.62980139208e-01 -3.35141127288e-01 + 221 3.26994037165e-01 2.65268646126e-01 -3.52074966808e-01 + 222 2.22410597133e-01 1.81534911600e-01 -3.11366854712e-01 + 223 3.13490008763e-01 1.06955204747e-01 -3.38394100697e-01 + 224 3.14940398089e-01 2.87689941067e-01 -2.96970053860e-01 + 225 4.06745004381e-01 3.03477602373e-01 -3.03285276426e-01 + 226 1.23839301166e-01 1.90062766741e-01 -3.14957593579e-02 + 227 3.11919650583e-01 1.41262353156e-01 -3.35694802693e-02 + 228 2.51723495556e-01 1.79546441588e-01 -1.17159523089e-01 + 229 1.27585243335e-01 2.23088692597e-01 -1.57917684043e-01 + 230 3.11919650583e-01 3.45031383370e-01 -1.49836105757e-01 + 231 3.74613100389e-01 2.60841568771e-01 -1.11771804231e-01 + 232 3.13792621667e-01 2.59659831191e-01 -1.54913755356e-01 + 233 2.51723495556e-01 3.15392461731e-01 -1.94670606747e-01 + 234 3.15665592752e-01 1.74288279012e-01 -1.59991404954e-01 + 235 3.77110395168e-01 2.82858852675e-01 -1.96053087355e-01 + 236 5.00000000000e-01 2.96230969786e-01 -1.51909826668e-01 + 237 5.00000000000e-01 9.24619395715e-02 -3.56432011806e-02 + 238 5.00000000000e-01 -1.96954445134e-01 -5.17505801094e-01 + 239 3.93234823273e-01 -1.33551511106e-01 -4.87841385273e-01 + 240 4.28823215515e-01 -1.57023441861e-01 -3.72618791023e-01 + 241 5.00000000000e-01 -2.00460874252e-01 -3.29839701808e-01 + 242 5.00000000000e-01 -1.31494854002e-02 -4.98724797676e-01 + 243 4.28823215515e-01 -3.21491826263e-02 -4.85208854934e-01 + 244 4.46617411636e-01 -7.51037128119e-02 -3.99450041831e-01 + 245 5.00000000000e-01 -7.67554247231e-02 -3.79874399291e-01 + 246 3.93234823273e-01 -1.37057940224e-01 -3.00175285987e-01 + 247 4.28823215515e-01 -3.44868020378e-02 -3.60098122077e-01 + 248 5.00000000000e-01 -1.66559145175e-02 -3.11058698390e-01 + 249 3.93234823273e-01 5.02534486277e-02 -4.69060381854e-01 + 250 2.86469646545e-01 -7.01485770784e-02 -4.58176969451e-01 + 251 3.14940398089e-01 1.51843920924e-01 -2.19458970202e-01 + 252 4.06745004381e-01 9.97085721592e-02 -1.87018650939e-01 + 253 3.61205298567e-01 2.38882940693e-01 -2.31638340690e-01 + 254 4.37830002921e-01 2.33139048106e-01 -2.14071251344e-01 + 255 4.20869746283e-01 -4.25010144518e-01 -4.20014627101e-01 + 256 2.85118079777e-01 -4.50006763012e-01 -4.43975032462e-01 + 257 3.38838559833e-01 -4.62505072259e-01 -5.40481274347e-01 + 258 4.47246497522e-01 -4.50006763012e-01 -5.56676418067e-01 + 259 3.37871582255e-01 -5.00000000000e-01 -5.64378931365e-01 + 260 5.00000000000e-01 -5.00000000000e-01 -6.00620475455e-01 + 261 2.56807373383e-01 -5.00000000000e-01 -4.31568397047e-01 + 262 3.27666408330e-01 -2.48979475517e-01 -6.69395589601e-01 + 263 2.57875798944e-01 -2.87647915765e-01 -6.26312864408e-01 + 264 2.12144909647e-01 -2.59135735742e-01 -6.21906325217e-01 + 265 2.24174769692e-01 -2.25545425607e-01 -6.41244418217e-01 + 266 1.63833204165e-01 -3.74489737758e-01 -7.49697794800e-01 + 267 1.71917199296e-01 -3.58431943843e-01 -6.94208576272e-01 + 268 1.59108682235e-01 -3.19351801807e-01 -6.73929743912e-01 + 269 1.49449846461e-01 -3.17030283738e-01 -7.04162945478e-01 + 270 1.54384160305e-01 -2.64213865855e-01 -5.98161693024e-01 + 271 1.20683131054e-01 -2.02111375698e-01 -6.13093246834e-01 + 272 1.02922773537e-01 -3.42809243903e-01 -6.75441128683e-01 + 273 6.03415655268e-02 -3.51055687849e-01 -7.21546623417e-01 + 274 9.40425947785e-02 -4.13158178006e-01 -7.06615069608e-01 + 275 -4.60182307546e-01 -1.55125679722e-02 -4.36618132335e-01 + 276 -4.40273461319e-01 -1.08596589125e-01 -4.14955301373e-01 + 277 -4.70136730660e-01 -6.26262518213e-02 -3.63006999881e-01 + 278 -4.60182307546e-01 -1.40386827206e-01 -3.24028068423e-01 + 279 -5.00000000000e-01 -1.31494854002e-02 -4.98724797676e-01 + 280 -5.00000000000e-01 -1.96954445134e-01 -5.17505801094e-01 + 281 -5.00000000000e-01 -7.67554247231e-02 -3.79874399291e-01 + 282 -5.00000000000e-01 -2.00460874252e-01 -3.29839701808e-01 + 283 -4.00654411929e-01 5.64005762038e-02 -6.94818930202e-01 + 284 -4.33769607953e-01 9.44855422471e-02 -6.23193884887e-01 + 285 -5.00000000000e-01 8.53277371669e-02 -6.54971897129e-01 + 286 -4.12472224806e-01 9.33471520759e-03 -6.66961326627e-01 + 287 -3.75417757823e-01 4.38235276076e-02 -6.31186837886e-01 + 288 -4.06563318367e-01 7.55315142891e-02 -5.93376076979e-01 + 289 -4.41648149870e-01 6.31083015830e-02 -6.04622149170e-01 + 290 -4.00654411929e-01 1.41728313371e-01 -5.19790827331e-01 + 291 -3.75417757823e-01 1.00708685719e-01 -5.14501435972e-01 + 292 -4.12472224806e-01 9.46624523745e-02 -4.91933223755e-01 + 293 -3.13126636735e-01 6.57352914114e-02 -5.31780256829e-01 + 294 -3.24944449611e-01 1.86694304152e-02 -5.03922653253e-01 + 295 -3.01308823858e-01 1.12801152408e-01 -5.59637860404e-01 + 296 -1.55818547188e-01 5.00000000000e-01 -4.57106030524e-01 + 297 -3.27909273594e-01 5.00000000000e-01 -3.62641241340e-01 + 298 -2.96858793447e-01 4.29962686000e-01 -2.94746643332e-01 + 299 -1.95288190171e-01 3.94944029000e-01 -3.08031738921e-01 + 300 -5.61612304946e-02 5.00000000000e-01 -2.28998627819e-01 + 301 -2.04107486996e-01 5.00000000000e-01 -2.42057902598e-01 + 302 -2.11770073536e-01 4.47472014500e-01 -2.21282788778e-01 + 303 -1.15693431381e-01 4.29962686000e-01 -2.05651567652e-01 + 304 -3.45789050550e-01 8.36476801846e-02 -7.57790823616e-01 + 305 -3.97192700367e-01 2.22431786790e-01 -7.81860549078e-01 + 306 -5.00000000000e-01 2.50000000000e-01 -8.30000000000e-01 + 307 -4.05463670987e-01 1.13302024919e-01 -7.08387818381e-01 + 308 -3.34168481025e-01 1.31299803402e-01 -7.00785761331e-01 + 309 -3.75626360769e-01 2.23474852552e-01 -7.33089320999e-01 + 310 -4.36975780658e-01 2.42201349946e-01 -7.48925212254e-01 + 311 -3.45789050550e-01 3.33647680185e-01 -7.57790823616e-01 + 312 -5.00000000000e-01 5.00000000000e-01 -8.30000000000e-01 + 313 -3.34168481025e-01 2.97966470069e-01 -7.00785761331e-01 + 314 -4.05463670987e-01 3.63302024919e-01 -7.08387818381e-01 + 315 -2.51252721537e-01 1.96949705103e-01 -6.36178641997e-01 + 316 -3.10927341974e-01 2.26604049837e-01 -5.86775636761e-01 + 317 -1.91578101101e-01 1.67295360369e-01 -6.85581647233e-01 + 318 -4.35094040052e-01 -3.54252982600e-01 -2.99698721944e-01 + 319 -4.02641060079e-01 -2.81379473900e-01 -2.63927607462e-01 + 320 -4.02641060079e-01 -2.77873044783e-01 -4.51593706748e-01 + 321 -4.35094040052e-01 -3.51915363189e-01 -4.24809454802e-01 + 322 -4.51320530039e-01 -3.14928348234e-01 -3.54150491732e-01 + 323 -4.35094040052e-01 -2.53237797645e-01 -3.48453672006e-01 + 324 -5.00000000000e-01 -3.00307249501e-01 -3.43640118175e-01 + 325 -5.00000000000e-01 -3.48477222567e-01 -4.44373376002e-01 + 326 -2.81102230583e-01 -3.54252982600e-01 -1.85646762228e-01 + 327 -3.35826672937e-01 -3.90689736950e-01 -2.32045309399e-01 + 328 -2.47369780789e-01 1.17720653183e-01 -5.23298029071e-01 + 329 -1.97179855789e-01 1.56902443511e-01 -4.80800350651e-01 + 330 -1.86535387143e-01 1.52386960751e-01 -4.98633728901e-01 + 331 -2.06308115320e-01 1.30538324208e-01 -5.28799257236e-01 + 332 -2.30198987067e-01 1.81759131661e-01 -4.96651473597e-01 + 333 -2.02462634974e-01 1.86534165720e-01 -4.77201873142e-01 + 334 -1.93158588694e-01 1.75739623098e-01 -4.91476526207e-01 + 335 -2.08548141329e-01 1.68958086185e-01 -5.09201144198e-01 + 336 -1.56118190321e-01 1.69720114535e-01 -4.86301578816e-01 + 337 -1.65246449852e-01 1.43355995233e-01 -5.34300485400e-01 + 338 -1.75088191329e-01 1.95079279736e-01 -4.80869358585e-01 + 339 -1.89137321599e-01 1.94576802685e-01 -5.02152701762e-01 + 340 -1.80009062067e-01 2.20940921988e-01 -4.54153795178e-01 + 341 -2.13028193345e-01 2.45797610138e-01 -4.70004918124e-01 + 342 -1.46989930790e-01 1.96084233838e-01 -4.38302672231e-01 + 343 -2.50000000000e-01 -5.00000000000e-01 -8.30000000000e-01 + 344 -2.40229972784e-01 -4.34248900021e-01 -7.47222263577e-01 + 345 -1.10344959176e-01 -4.01373350031e-01 -7.05833395366e-01 + 346 -2.57352101294e-01 -4.02141408219e-01 -7.97402038557e-01 + 347 -2.48186555559e-01 -3.77292731180e-01 -7.43468226601e-01 + 348 -1.64248740745e-01 -3.36390308240e-01 -7.14624302134e-01 + 349 -3.60344959176e-01 -4.01373350031e-01 -7.05833395366e-01 + 350 -2.20689918352e-01 -3.02746700063e-01 -5.81666790732e-01 + 351 -3.30915407411e-01 -3.36390308240e-01 -7.14624302134e-01 + 352 -2.46373111117e-01 -2.54585462360e-01 -6.56936453201e-01 + 353 -3.86028151941e-01 -3.53212112328e-01 -7.81103057836e-01 + 354 8.20433117838e-06 4.25246913613e-01 -1.32209284315e-01 + 355 -5.19340461751e-02 4.50164609075e-01 -2.40508199718e-01 + 356 -9.96491123618e-02 4.25246913613e-01 -3.60316687020e-01 + 357 -1.39118755345e-01 3.20190942613e-01 -2.11242395417e-01 + 358 -7.82471414973e-02 3.80127295076e-01 -1.41125338649e-01 + 359 -9.76399929199e-02 4.10095471307e-01 -2.20120511618e-01 + 360 -1.44685352626e-01 3.80127295076e-01 -2.93196940453e-01 + 361 4.34358417068e-01 -3.10862549564e-01 -2.95031039465e-01 + 362 4.01537625603e-01 -3.64310172662e-01 -3.71459757936e-01 + 363 3.78303163150e-01 -4.44059206068e-01 -3.42334818757e-01 + 364 4.18868775433e-01 -3.64028571835e-01 -2.75614413345e-01 + 365 3.89920394376e-01 -3.30176515207e-01 -2.99630451250e-01 + 366 3.53227192502e-01 -3.72246252487e-01 -3.52116067492e-01 + 367 4.01537625603e-01 -2.16293824346e-01 -2.56926083743e-01 + 368 3.03075251205e-01 -2.28620345324e-01 -3.71678564963e-01 + 369 3.53227192502e-01 -2.73568686943e-01 -2.75760284697e-01 + 370 2.79840788752e-01 -3.08369378730e-01 -3.42553625784e-01 + 371 3.78303163150e-01 -2.96042857753e-01 -2.27801144563e-01 + 372 2.56606326300e-01 -3.88118412136e-01 -3.13428686604e-01 + 373 -4.51320530039e-01 -3.88936522391e-01 -5.26107091101e-01 + 374 -4.35094040052e-01 -3.51915363189e-01 -5.77729137832e-01 + 375 -5.00000000000e-01 -3.98984815045e-01 -5.72915584001e-01 + 376 -5.00000000000e-01 -3.48477222567e-01 -6.73752900547e-01 + 377 -9.30383626661e-02 -4.01681872686e-01 -2.22460869969e-01 + 378 -5.74873261887e-02 -4.34454581791e-01 -3.12272527707e-01 + 379 -1.19436024681e-01 -4.15538847451e-01 -3.30624798881e-01 + 380 -1.63786281830e-01 -3.87385129935e-01 -2.76867784113e-01 + 381 -1.46573175711e-01 -3.87385129935e-01 -4.31138041254e-01 + 382 -2.26667136949e-01 -3.31077694902e-01 -4.00759140289e-01 + 383 -6.72187034874e-02 -4.01681872686e-01 -4.53866255680e-01 + 384 -1.48052153741e-01 -3.03363745373e-01 -4.15836668176e-01 + 385 -2.28004634021e-01 -1.85206769573e-01 -3.51910639623e-01 + 386 -2.66643377089e-01 -2.71999207002e-01 -3.68796126012e-01 + 387 -2.83204226862e-01 -2.35730443149e-01 -3.54480045317e-01 + 388 -2.72165280215e-01 -1.74199842507e-01 -3.38879261775e-01 + 389 -2.42084629391e-01 -1.96957512840e-01 -4.00506863078e-01 + 390 -2.63150459646e-01 -2.50902223370e-01 -3.95565112852e-01 + 391 -2.76444326337e-01 -2.28974896388e-01 -3.78135805621e-01 + 392 -2.66831728397e-01 -1.85702647040e-01 -3.75620536694e-01 + 393 -3.10804023283e-01 -2.60992279936e-01 -3.55764748164e-01 + 394 -3.16325926409e-01 -1.63192915441e-01 -3.25847883926e-01 + 395 -2.92590890442e-01 -2.43564271993e-01 -3.86877527620e-01 + 396 -2.86245275584e-01 -1.85950585774e-01 -3.87475485230e-01 + 397 -2.80723372459e-01 -2.83749950269e-01 -4.17392349467e-01 + 398 -2.56164624760e-01 -2.08708256106e-01 -4.49103086533e-01 + 399 5.00000000000e-01 -3.48477222567e-01 -6.73752900547e-01 + 400 4.47246497522e-01 -3.48991578057e-01 -6.05431368129e-01 + 401 4.60434873142e-01 -3.86743683542e-01 -5.46883763824e-01 + 402 5.00000000000e-01 -3.98984815045e-01 -5.72915584001e-01 + 403 4.47246497522e-01 -3.48991578057e-01 -4.52511685099e-01 + 404 5.00000000000e-01 -3.48477222567e-01 -4.44373376002e-01 + 405 4.20869746283e-01 -2.73487367085e-01 -4.93147052193e-01 + 406 4.69898852988e-02 -3.17969094735e-01 -3.44119733077e-01 + 407 3.03023160324e-02 -4.08984547367e-01 -4.18007788131e-01 + 408 1.05736986122e-01 -4.02029168957e-01 -3.83148087622e-01 + 409 1.51798105799e-01 -3.53043753436e-01 -3.28774209841e-01 + 410 4.48265685367e-03 -4.08984547367e-01 -1.86602402420e-01 + 411 7.52668682447e-03 -4.39323031578e-01 -2.88366882675e-01 + 412 6.97965966933e-02 -4.26521876718e-01 -2.94632333657e-01 + 413 8.85238800023e-02 -4.02029168957e-01 -2.28877830481e-01 + 414 1.35110536533e-01 -4.44059206068e-01 -4.02662264895e-01 + 415 7.73988338248e-02 -4.62706137379e-01 -2.78136533850e-01 + 416 1.09290877354e-01 -4.44059206068e-01 -1.71256879183e-01 + 417 2.82160102993e-01 -2.35101687187e-01 -4.29267793842e-01 + 418 2.56214712722e-01 -2.13065736600e-01 -4.23086493531e-01 + 419 2.53699591692e-01 -1.98807090374e-01 -3.91201228936e-01 + 420 2.94772448875e-01 -1.49384461201e-01 -4.14927767207e-01 + 421 2.83596617510e-01 -1.80117317151e-01 -4.38904185712e-01 + 422 2.63778446178e-01 -1.77336446719e-01 -4.31859112511e-01 + 423 2.64622943310e-01 -1.55920919276e-01 -4.13526475775e-01 + 424 2.32784443480e-01 -2.05288432237e-01 -4.48790457816e-01 + 425 2.04323932179e-01 -1.68993835425e-01 -4.10723892910e-01 + 426 2.50679511168e-01 -1.60241813851e-01 -4.51919295028e-01 + 427 2.45396789362e-01 -1.19571206252e-01 -4.34450431181e-01 + 428 2.73857300663e-01 -1.55865803064e-01 -4.72516996086e-01 + 429 2.61244954781e-01 -2.41583029050e-01 -4.86857022722e-01 + 430 -3.16909948518e-01 3.46129296455e-01 -4.63146702974e-01 + 431 -4.08454974259e-01 4.23064648228e-01 -6.46573351487e-01 + 432 -4.38969982839e-01 3.38928256930e-01 -5.91030165744e-01 + 433 -4.08454974259e-01 2.58392385395e-01 -4.71545248616e-01 + 434 -4.08454974259e-01 4.23064648228e-01 -3.65661577565e-01 + 435 -4.38969982839e-01 4.48709765485e-01 -5.20441051710e-01 + 436 -4.54227487130e-01 3.79196192697e-01 -5.10316737347e-01 + 437 -4.38969982839e-01 3.38928256930e-01 -4.03755649796e-01 + 438 -5.00000000000e-01 3.35327737167e-01 -6.54971897129e-01 + 439 -5.00000000000e-01 3.90218491445e-01 -5.26040082138e-01 + 440 -5.00000000000e-01 3.35327737167e-01 -3.74060123207e-01 + 441 -5.00000000000e-01 5.00000000000e-01 -5.49088226078e-01 + 442 -2.13132829468e-01 8.31544306639e-02 -4.10251548488e-01 + 443 -1.95967138928e-01 5.10847296121e-02 -4.47513151508e-01 + 444 -2.38959575822e-01 4.02796298798e-02 -4.66316318757e-01 + 445 -2.69038639540e-01 5.09119305395e-02 -4.57087100870e-01 + 446 -2.30251305129e-01 1.00437541924e-01 -4.66774788779e-01 + 447 -2.13101352881e-01 7.32967041359e-02 -4.72774777363e-01 + 448 -2.41062127064e-01 5.96398857057e-02 -4.80561746335e-01 + 449 -2.61815686623e-01 7.31815047542e-02 -4.79157410271e-01 + 450 -2.51872948999e-01 1.88422294878e-02 -4.94348703891e-01 + 451 -2.50371892929e-01 5.18017040530e-02 -5.03998478951e-01 + 452 -2.86157115200e-01 6.81950417993e-02 -5.13610341162e-01 + 453 -2.13085614588e-01 6.83678408719e-02 -5.04036391800e-01 + 454 -1.78801448387e-01 1.90150285604e-02 -4.84774754529e-01 + 455 -2.44215522228e-01 2.20742414642e-01 -2.27085333634e-01 + 456 -2.39951763542e-01 1.83144816565e-01 -2.13944624226e-01 + 457 -2.33091039661e-01 1.98918839205e-01 -1.73310326364e-01 + 458 -2.94145557171e-01 2.07366502808e-01 -2.11780373228e-01 + 459 -2.80654775215e-01 1.88776592300e-01 -2.39591322135e-01 + 460 -2.68347142953e-01 1.68569849327e-01 -2.26609292954e-01 + 461 -2.73238453504e-01 1.74227542008e-01 -2.03741317289e-01 + 462 -2.42548728735e-01 1.29773195847e-01 -2.41438212680e-01 + 463 -2.31424246169e-01 1.07949620409e-01 -1.87663205410e-01 + 464 -2.79543579553e-01 1.28130446436e-01 -2.49159908166e-01 + 465 -2.92478763678e-01 1.16397284012e-01 -2.26133252274e-01 + 466 -3.03603246245e-01 1.38220859450e-01 -2.79908259544e-01 + 467 -3.53533281188e-01 1.24844947615e-01 -2.64603299139e-01 + 468 -2.53673211302e-01 1.51596771284e-01 -2.95213219950e-01 + 469 3.66115272955e-01 -4.12712900391e-01 -3.84485980269e-01 + 470 2.77990141408e-01 -4.34534675293e-01 -4.11338445998e-01 + 471 2.56740357689e-01 -4.62706137379e-01 -3.92188493566e-01 + 472 2.03986855211e-01 -4.12712900391e-01 -4.24704277694e-01 + 473 2.99172909433e-01 -3.69069350586e-01 -3.91108494948e-01 + 474 5.00000000000e-01 -3.00307249501e-01 -3.43640118175e-01 + 475 4.50768812801e-01 -2.82385523457e-01 -3.50649729872e-01 + 476 4.34358417068e-01 -3.08524930153e-01 -4.20141772322e-01 + 477 4.34358417068e-01 -2.09847364609e-01 -3.43785989527e-01 + 478 4.01537625603e-01 -2.12787395229e-01 -4.44592183029e-01 + 479 -5.00000000000e-01 2.96230969786e-01 -1.51909826668e-01 + 480 -4.21159628820e-01 2.81809389381e-01 -6.86047537812e-02 + 481 -5.00000000000e-01 5.00000000000e-01 1.15911773922e-01 + 482 -5.00000000000e-01 3.64153979857e-01 6.53934488879e-02 + 483 -4.40869721615e-01 3.36357042036e-01 7.35464346641e-02 + 484 -4.21159628820e-01 4.17655409524e-01 1.09942979946e-01 + 485 -4.21159628820e-01 2.81809389381e-01 1.87454063604e-01 + 486 -3.81739443230e-01 3.76483114286e-01 2.99002695996e-01 + 487 -5.00000000000e-01 2.96230969786e-01 2.32178399410e-01 + 488 -5.00000000000e-01 5.00000000000e-01 5.00000000000e-01 + 489 -2.12285901233e-01 -1.41265844052e-01 -3.10237245506e-01 + 490 -2.09812250997e-01 -1.09162206110e-01 -3.16634710187e-01 + 491 -2.16434792274e-01 -1.15080849901e-01 -3.40670139586e-01 + 492 -2.46965909625e-01 -1.48574867848e-01 -3.15440791646e-01 + 493 -2.36440669850e-01 -1.22669883443e-01 -3.18938003622e-01 + 494 -2.49731836985e-01 -1.31118205081e-01 -3.35729387699e-01 + 495 -2.00716059486e-01 -7.11399243790e-02 -2.98996745469e-01 + 496 -2.04864950526e-01 -4.49549302279e-02 -3.29429639549e-01 + 497 -2.39252681793e-01 -1.01824254733e-01 -3.07947124955e-01 + 498 -2.60595438467e-01 -1.04073922835e-01 -3.27638761738e-01 + 499 -2.56446547427e-01 -1.30258916986e-01 -2.97205867658e-01 + 500 -1.96567168445e-01 -9.73249185301e-02 -2.68563851390e-01 + 501 -2.47565409937e-01 3.89330517962e-01 -3.72043059328e-01 + 502 -3.31710273292e-01 4.26220345308e-01 -3.37420856938e-01 + 503 -2.36364247853e-01 4.23064648228e-01 -4.60126366749e-01 + 504 -2.70680256131e-01 3.74930110793e-01 -4.02410940544e-01 + 505 -3.28010192098e-01 4.06197583095e-01 -3.68852318447e-01 + 506 -3.24242831902e-01 4.48709765485e-01 -3.96143061884e-01 + 507 -4.19656136344e-01 3.89330517962e-01 -2.77578270144e-01 + 508 -3.85407407068e-01 3.74930110793e-01 -3.39434414421e-01 + 509 -3.28111110603e-01 3.12395166189e-01 -3.75063395553e-01 + 510 -3.39312272687e-01 2.78661035924e-01 -2.86980088133e-01 + 511 -4.97048399845e-03 4.50164609075e-01 -4.00199421321e-01 + 512 -7.68675294208e-02 3.80234602190e-01 -3.74689526762e-01 + 513 -1.15539538835e-02 4.10175951643e-01 -4.01008367552e-01 + 514 1.42841127703e-02 5.00000000000e-01 -4.68535460224e-01 + 515 -9.12045999348e-04 4.30069993115e-01 -4.46835375564e-01 + 516 -9.35614553632e-02 3.95104989672e-01 -4.30270618384e-01 + 517 -2.35249772952e-01 -6.76558616781e-02 -3.73798383024e-01 + 518 -2.62275157437e-01 -9.95015462658e-02 -3.57814883325e-01 + 519 -2.92705936582e-01 -3.25968316719e-02 -3.20917220600e-01 + 520 -2.83682156181e-01 -5.18501521574e-02 -3.53333855900e-01 + 521 -2.91843098738e-01 -7.96858429784e-02 -3.46462362906e-01 + 522 -3.00579266524e-01 -7.61288595950e-02 -3.22560775042e-01 + 523 -2.90980260893e-01 -1.26774854285e-01 -3.72007505212e-01 + 524 -3.20835814808e-01 -9.12628138952e-02 -3.52139937359e-01 + 525 -3.48436424523e-01 -9.17158242786e-02 -3.19126342789e-01 + 526 -3.23090759008e-01 -5.52977631222e-02 -3.65285964075e-01 + 527 -2.65634595378e-01 -9.03567931284e-02 -4.18167126499e-01 + 528 -1.17136493262e-01 1.16546109525e-01 -4.46674800355e-01 + 529 -9.25962338666e-02 1.37720218621e-01 -3.95058318558e-01 + 530 -9.78096280350e-02 1.08225737960e-01 -3.94940721237e-01 + 531 -1.12686454817e-01 8.28914430826e-02 -4.20690163476e-01 + 532 -7.57702746856e-02 1.13034480424e-01 -4.46276925996e-01 + 533 -7.31988412809e-02 1.28321096188e-01 -4.11998562917e-01 + 534 -8.19582350536e-02 1.08550016301e-01 -4.07675303837e-01 + 535 -8.65923219143e-02 9.17685791630e-02 -4.29086459529e-01 + 536 -8.81461954216e-02 1.04065552178e-01 -3.69073681678e-01 + 537 -1.08236416372e-01 4.92367766402e-02 -3.94705526596e-01 + 538 -7.02321489843e-02 1.05884651893e-01 -3.94675471664e-01 + 539 -7.13202362407e-02 7.93798139820e-02 -4.20292289116e-01 + 540 -5.12300152906e-02 1.34208589520e-01 -3.94660444198e-01 + 541 -3.44040561096e-02 1.09522851324e-01 -4.45879051637e-01 + 542 -6.80559744716e-02 1.58894327716e-01 -3.43441836760e-01 + 543 -3.08662952632e-02 -9.42125629360e-02 -3.14001781323e-01 + 544 -6.01439864263e-02 -4.96474952187e-02 -2.84999387408e-01 + 545 -4.99377075716e-02 -6.31091341643e-02 -2.61136067414e-01 + 546 -3.01957225627e-02 -9.21224874957e-02 -2.63705604374e-01 + 547 -1.27552445096e-02 -4.89048074048e-02 -2.89515018358e-01 + 548 -3.83107222029e-02 -3.42973474370e-02 -2.78342343403e-01 + 549 -3.61143291177e-02 -4.82311135916e-02 -2.62109114409e-01 + 550 -1.83452129604e-02 -6.26140089550e-02 -2.64146488047e-01 + 551 -5.94734137258e-02 -4.75574197784e-02 -2.34703210459e-01 + 552 -2.95251498622e-02 -9.00324120554e-02 -2.13409427425e-01 + 553 -3.78636737359e-02 -3.29039638101e-02 -2.44811558771e-01 + 554 -1.20846718091e-02 -4.68147319645e-02 -2.39218841409e-01 + 555 -4.20329356727e-02 -4.33973968746e-03 -2.60512624443e-01 + 556 5.35580624402e-03 -3.59705187362e-03 -2.65028255393e-01 + 557 -8.94216775895e-02 -5.08242750129e-03 -2.55996993493e-01 + 558 1.39450380224e-01 1.56375165665e-01 -4.14652439541e-01 + 559 1.36743981984e-01 1.89621649927e-01 -3.71214829270e-01 + 560 1.00910104389e-01 1.90474691671e-01 -4.75693275407e-01 + 561 1.04409622164e-01 1.68282993680e-01 -4.43679027441e-01 + 562 1.11140012999e-01 1.90240899873e-01 -4.03844172763e-01 + 563 1.11050464760e-01 2.12354667265e-01 -4.11908719847e-01 + 564 1.21369921609e-01 1.90007108075e-01 -3.31995070118e-01 + 565 9.23559830876e-02 1.90704288620e-01 -3.88574114493e-01 + 566 8.28296457740e-02 2.24106634082e-01 -3.93035905985e-01 + 567 7.28683818796e-02 1.57999123704e-01 -4.40691367375e-01 + 568 3.43281060445e-02 1.92098649711e-01 -5.01732203241e-01 + 569 1.11408657715e-01 1.23899597698e-01 -3.79650531509e-01 + 570 5.00000000000e-01 -5.57526818987e-02 -8.89084018514e-02 + 571 5.00000000000e-01 -2.03835121266e-01 1.07394398766e-01 + 572 5.00000000000e-01 -2.03769030214e-01 2.32178399410e-01 + 573 3.40097724750e-01 -5.33014537612e-02 6.50491617206e-02 + 574 3.93398483167e-01 -1.03523403630e-01 -4.02509302700e-03 + 575 4.20048862375e-01 -2.02642552723e-01 1.21981180230e-01 + 576 3.93398483167e-01 -2.02200969174e-01 2.10032774480e-01 + 577 3.93398483167e-01 -3.01010716821e-01 1.74522640700e-01 + 578 3.40097724750e-01 -3.49532423547e-01 3.32870762311e-01 + 579 3.40097724750e-01 -2.01516075231e-01 1.17839610498e-02 + 580 1.80195449500e-01 -1.99064847094e-01 1.65741524622e-01 + 581 -4.09581234775e-02 -8.78866798302e-03 -3.62775955385e-01 + 582 -1.78011586168e-02 -6.19285992832e-03 -3.13902105389e-01 + 583 -2.52592488809e-02 2.29295506491e-02 -2.98441751878e-01 + 584 -4.05667764434e-02 3.61928519104e-02 -3.15148500121e-01 + 585 -6.51899005335e-02 -6.93554774215e-03 -3.09386474439e-01 + 586 -4.16746649410e-02 -5.82271578598e-03 -2.94600401424e-01 + 587 -4.12998560581e-02 1.59265561115e-02 -2.87830562282e-01 + 588 -5.68517434921e-02 2.24344254398e-02 -2.95431331245e-01 + 589 -1.74098115827e-02 3.87886599651e-02 -2.66274650125e-01 + 590 -4.01754294093e-02 8.11743718038e-02 -2.67521044857e-01 + 591 -4.14137669183e-02 2.41649641430e-02 -2.62848764581e-01 + 592 -6.47985534994e-02 3.80459721513e-02 -2.61759019175e-01 + 593 -1.61029175967e-01 2.94753314235e-01 -3.50387711833e-01 + 594 -1.57653592126e-01 2.56575413538e-01 -2.97687584222e-01 + 595 -1.21238268679e-01 2.54415317301e-01 -2.97994741217e-01 + 596 -1.04718398875e-01 2.72424219532e-01 -3.24498383521e-01 + 597 -1.02254426752e-01 3.22623570731e-01 -3.06957527675e-01 + 598 -1.19595620596e-01 2.87881551434e-01 -2.86300837320e-01 + 599 -1.01798620893e-01 2.78434944782e-01 -2.89377891792e-01 + 600 -8.43054917622e-02 2.98447422096e-01 -3.04174703519e-01 + 601 -1.01342815034e-01 2.34246318834e-01 -2.71798255909e-01 + 602 -4.84076217833e-02 2.50095124828e-01 -2.98609055208e-01 + 603 -8.20551025349e-02 2.72995488298e-01 -2.69041285112e-01 + 604 -4.59436496596e-02 3.00294476027e-01 -2.81068199362e-01 + 605 -9.88788429107e-02 2.84445670033e-01 -2.54257400063e-01 + 606 -1.54278008285e-01 2.18397512841e-01 -2.44987456610e-01 + 607 -7.14684787983e-02 1.59785052124e-01 -5.41773195330e-01 + 608 -1.18357464325e-01 1.51570523678e-01 -5.38036840365e-01 + 609 -1.27901619813e-01 1.66408427065e-01 -5.04792117654e-01 + 610 -1.09229204794e-01 1.77934642981e-01 -4.90037933781e-01 + 611 -8.70175654655e-02 2.40745425713e-01 -5.49188594516e-01 + 612 -1.13093860261e-01 2.08282282220e-01 -5.44225891478e-01 + 613 -1.21567877893e-01 2.05232770124e-01 -5.17745086666e-01 + 614 -1.07008353907e-01 2.25858361755e-01 -5.12226620421e-01 + 615 -1.38267677591e-01 2.20382009458e-01 -5.09735717111e-01 + 616 -1.24778291461e-01 2.58895016570e-01 -4.97453332967e-01 + 617 -1.33906550992e-01 2.32530897268e-01 -5.45452239551e-01 + 618 -1.02566652133e-01 3.21705799302e-01 -5.56603993702e-01 + 619 -3.98559926610e-02 2.70152552087e-01 -3.51022130726e-01 + 620 1.72064000605e-02 2.65473240875e-01 -3.28794623393e-01 + 621 -4.10638876193e-02 2.96932977133e-01 -3.21857201656e-01 + 622 2.03488066137e-03 2.86728387463e-01 -3.12477803424e-01 + 623 4.14617818601e-02 2.53104871641e-01 -2.91474331968e-01 + 624 1.31479620614e-02 2.85567856836e-01 -2.82158669151e-01 + 625 5.00000000000e-01 2.54372471302e-01 -2.61254482531e-01 + 626 4.37830002921e-01 2.59203559694e-01 -3.62171449037e-01 + 627 4.53372502191e-01 2.17518154663e-01 -2.80539387073e-01 + 628 5.00000000000e-01 1.31558706953e-01 -2.57793497719e-01 + 629 4.37830002921e-01 1.23357539551e-01 -2.84660365378e-01 + 630 4.06745004381e-01 1.38805339540e-01 -4.09168947477e-01 + 631 2.22445129121e-01 3.96687588914e-01 -1.00187812209e-01 + 632 1.99666643217e-01 3.61544346298e-01 -1.46225761339e-01 + 633 9.95555242892e-02 3.15392461731e-01 -1.05575531067e-01 + 634 8.36676936821e-02 3.45031383370e-01 -1.61934922359e-02 + 635 2.76587158256e-02 3.73615826880e-02 -8.34894703149e-02 + 636 8.87669246301e-02 4.88815598460e-02 -1.22858174861e-01 + 637 1.00457716809e-01 9.59419621443e-02 -9.24040363603e-02 + 638 7.57490084957e-02 1.13712174714e-01 -5.74926148364e-02 + 639 1.19322041546e-01 1.26929875548e-02 -5.31050091195e-02 + 640 1.29506405509e-01 2.85958373713e-02 -8.94789658823e-02 + 641 1.28089629423e-01 6.89625697136e-02 -7.49831642512e-02 + 642 1.20827794752e-01 7.18162472835e-02 -4.59019258656e-02 + 643 1.36857217300e-01 1.25232151872e-01 -9.68613193829e-02 + 644 1.61566600622e-01 7.94962320555e-02 -7.21477288966e-02 + 645 1.67412334216e-01 8.90435795812e-02 -2.71081536410e-02 + 646 1.80430250350e-01 2.42129647129e-02 -9.24737136660e-02 + 647 2.10985367266e-01 -1.19756075783e-02 -2.27205479241e-02 + 648 1.49875133435e-01 6.04015370041e-02 -1.62226879408e-01 + 649 1.61070020322e-01 3.14988450695e-01 -4.04652948741e-01 + 650 1.10382572445e-01 2.62932726006e-01 -3.99561717376e-01 + 651 1.35050639206e-01 3.41955150671e-01 -4.26362774892e-01 + 652 1.43161005088e-01 3.03679046411e-01 -4.32185668062e-01 + 653 1.29419082541e-01 2.38238728548e-01 -4.16259260775e-01 + 654 1.75939437731e-01 3.44425366816e-01 -4.64809618748e-01 + 655 1.47104278283e-01 3.19533855730e-01 -4.81467687840e-01 + 656 1.28463031060e-01 2.29300783595e-01 -4.82219086799e-01 + 657 1.36910366058e-01 3.84875416780e-01 -4.97374357974e-01 + 658 3.53841721501e-01 -1.13710650209e-01 -2.22469673466e-01 + 659 4.02561147667e-01 -4.49864536155e-02 -1.60194182704e-01 + 660 4.06745004381e-01 -4.85060493109e-02 -2.40283851609e-01 + 661 3.40391150588e-01 -4.01553652237e-02 -2.61111149210e-01 + 662 3.80293362941e-01 -7.00103902489e-03 -2.04744162202e-01 + 663 4.37830002921e-01 -1.51671968345e-03 -1.72070301466e-01 + 664 3.53841721501e-01 3.45039712611e-02 -1.69204472795e-01 + 665 3.40391150588e-01 5.86543824231e-02 -2.25601015429e-01 + 666 2.60586725882e-01 4.17506038489e-02 -3.20579922553e-01 + 667 2.07683443002e-01 -2.34539970492e-02 -3.02765744410e-01 + 668 8.26247010630e-02 -7.93597989513e-02 -2.82416937509e-01 + 669 7.29285876746e-02 -1.05279911378e-02 -2.59835796071e-01 + 670 7.30059108265e-02 -2.24228418341e-02 -2.26832713915e-01 + 671 7.78926290966e-02 -6.27861710890e-02 -2.21621743557e-01 + 672 1.16249917249e-01 -9.47913097361e-03 -2.22321908458e-01 + 673 9.85774362613e-02 1.31151849095e-02 -2.27299490516e-01 + 674 9.22232164785e-02 -1.71674712455e-03 -2.10681255289e-01 + 675 1.01886797209e-01 -2.17236017246e-02 -2.01823455507e-01 + 676 6.81965157082e-02 6.04563672451e-03 -1.99040602119e-01 + 677 7.31605571301e-02 -4.62125432267e-02 -1.60826549605e-01 + 678 9.54227216170e-02 2.41642701510e-02 -1.86769361215e-01 + 679 1.11517845282e-01 7.09449688870e-03 -1.61526714507e-01 + 680 1.06553803860e-01 5.93526768399e-02 -1.99740767020e-01 + 681 6.32324742863e-02 5.83038166757e-02 -2.37254654633e-01 + 682 -1.07522952631e-01 1.77489280777e-01 -3.90872254496e-01 + 683 -8.21167562666e-02 2.15062846966e-01 -3.95059905079e-01 + 684 -4.96801690051e-02 2.24552153530e-01 -3.73438521502e-01 + 685 -6.20752406404e-02 1.73703518048e-01 -3.97235476929e-01 + 686 -9.03801373568e-02 1.81163756645e-01 -4.10924542030e-01 + 687 -7.56111939023e-02 2.08425312320e-01 -4.09052208083e-01 + 688 -5.18182816065e-02 2.12539005147e-01 -3.99302053368e-01 + 689 -8.91471471642e-02 2.43147106591e-01 -4.20868939238e-01 + 690 -7.81296003792e-02 2.24935640521e-01 -4.30922331858e-01 + 691 -4.36994351740e-02 2.39361343863e-01 -4.27232161671e-01 + 692 -1.01542218799e-01 1.92298471109e-01 -4.44665894665e-01 + 693 -5.60945068093e-02 1.88512708380e-01 -4.51029117098e-01 + 694 6.53876716884e-02 -1.81353241628e-02 -3.49921353589e-01 + 695 4.55105295300e-02 2.77788384803e-02 -3.52767875627e-01 + 696 3.21256217680e-02 1.73202083623e-02 -3.23521335549e-01 + 697 3.53717389662e-02 -1.08661880182e-02 -3.07474804491e-01 + 698 6.43100729874e-02 2.00842462565e-02 -2.93588004111e-01 + 699 5.14178444488e-02 3.79538312121e-02 -3.14263468629e-01 + 700 3.99023348976e-02 2.75661104407e-02 -3.01954665320e-01 + 701 4.46586507396e-02 1.21904802131e-02 -2.84068087871e-01 + 702 1.54945968078e-02 3.50479746248e-02 -3.10321326529e-01 + 703 3.14072226340e-02 4.27999219751e-02 -2.85965769230e-01 + 704 3.42941402652e-02 2.73533824010e-02 -2.51141455013e-01 + 705 4.44329308290e-02 6.59984088995e-02 -2.96434526149e-01 + 706 2.56333873716e-02 7.36930011233e-02 -3.55614397665e-01 + 707 1.15285224385e-02 6.97390942398e-02 -2.52387849745e-01 + 708 9.47095037367e-03 4.52937122020e-02 -2.56601318294e-01 + 709 -7.27102101888e-03 7.74336864636e-02 -3.11567721261e-01 + 710 1.62301440829e-02 7.10570632009e-02 -2.86796699052e-01 + 711 1.35115596231e-02 5.23935344323e-02 -2.81354588137e-01 + 712 -3.06207859791e-03 5.04234403512e-02 -2.96054565972e-01 + 713 1.14812931075e-01 1.24939990711e-01 -2.27940380923e-01 + 714 1.40603159469e-01 1.58258077729e-01 -2.23283244068e-01 + 715 1.78779288218e-01 1.84737699774e-02 -2.32496311909e-01 + 716 1.40263683574e-01 3.17504522102e-02 -2.34082426150e-01 + 717 1.38030559057e-01 8.78414937709e-02 -2.46646721795e-01 + 718 1.62963253980e-01 9.76873861359e-02 -2.49777410849e-01 + 719 9.72818298949e-02 1.57209217564e-01 -2.60797131680e-01 + 720 1.34082367597e-01 9.69881460265e-02 -2.74786669257e-01 + 721 1.69507314253e-01 1.16330310702e-01 -2.93552676569e-01 + 722 1.35457958644e-01 1.74249098132e-02 -2.70010199521e-01 + 723 2.40183352058e-01 -2.43487034284e-02 -7.93428012042e-01 + 724 1.10275028088e-01 -3.65230551426e-02 -7.75142018062e-01 + 725 1.79056295032e-01 -1.54277038301e-01 -8.30000000000e-01 + 726 1.80137514044e-01 -1.43261527571e-01 -8.02571009031e-01 + 727 7.35166853917e-02 -1.91015370095e-01 -7.93428012042e-01 + 728 3.41690585539e-01 -5.51074976912e-02 -7.75142018062e-01 + 729 2.27793723693e-01 -2.03404998461e-01 -7.93428012042e-01 + 730 9.16905855390e-02 -3.05107497691e-01 -7.75142018062e-01 + 731 2.50000000000e-01 -2.50000000000e-01 -8.30000000000e-01 + 732 1.88991823557e-01 -1.78437398106e-01 -5.22822641660e-01 + 733 2.37730735051e-01 -1.24292987592e-01 -4.90499805556e-01 + 734 2.45568808294e-01 -1.63389668078e-01 -4.89285544611e-01 + 735 2.25118389169e-01 -2.10010213578e-01 -5.04839832191e-01 + 736 2.11107742595e-01 -1.72156669784e-01 -5.53885421956e-01 + 737 2.36228377245e-01 -1.38153972216e-01 -5.21982604454e-01 + 738 2.42482521629e-01 -1.64011236424e-01 -5.13201209021e-01 + 739 2.27820146657e-01 -1.95298789540e-01 -5.31542622211e-01 + 740 2.60312754320e-01 -1.59202515864e-01 -5.09994064808e-01 + 741 2.47234308207e-01 -2.03729485257e-01 -5.35902612486e-01 + 742 2.59846654089e-01 -1.18012259271e-01 -5.21562585851e-01 + 743 2.33223661633e-01 -1.65875941463e-01 -5.84948202251e-01 + 744 4.24091518093e-01 2.82869754751e-01 -6.74853140764e-01 + 745 3.86137277139e-01 1.74304632126e-01 -5.97279711145e-01 + 746 4.43068638570e-01 2.12152316063e-01 -7.13639855573e-01 + 747 4.24091518093e-01 1.16203088084e-01 -6.74853140764e-01 + 748 5.00000000000e-01 3.35327737167e-01 -6.54971897129e-01 + 749 5.00000000000e-01 2.23551824778e-01 -7.13314598086e-01 + 750 5.00000000000e-01 8.53277371669e-02 -6.54971897129e-01 + 751 3.42193386364e-01 5.00000000000e-01 -6.54982444962e-01 + 752 2.28128924243e-01 5.00000000000e-01 -7.13321629974e-01 + 753 2.50000000000e-01 5.00000000000e-01 -8.30000000000e-01 + 754 3.93650232275e-01 4.33069970915e-01 -7.26163120282e-01 + 755 3.23895745759e-01 4.55379980610e-01 -6.44097043496e-01 + 756 2.42921809320e-01 4.66534985457e-01 -6.90572782622e-01 + 757 2.62433488183e-01 4.55379980610e-01 -7.60775413522e-01 + 758 9.21933863641e-02 5.00000000000e-01 -6.54982444962e-01 + 759 1.57229079093e-01 4.55379980610e-01 -6.44097043496e-01 + 760 1.43650232275e-01 4.33069970915e-01 -7.26163120282e-01 + 761 2.35843618639e-01 4.33069970915e-01 -5.51145565244e-01 + 762 -8.66155000354e-02 1.52529408953e-01 -4.48851958727e-01 + 763 -1.06740310287e-01 1.67047683914e-01 -4.45335529895e-01 + 764 -1.32063212026e-01 1.56315171682e-01 -4.42488736293e-01 + 765 -8.04289915142e-02 1.54651048540e-01 -4.13715251405e-01 + 766 -9.70692263330e-02 1.65009344865e-01 -4.19862106611e-01 + 767 -1.10727466174e-01 1.57174890360e-01 -4.09473103116e-01 + 768 -1.87028684656e-01 2.70275462187e-01 -4.10196314978e-01 + 769 -1.58874673815e-01 2.87418907892e-01 -4.58998874553e-01 + 770 -1.31797914050e-01 3.08229556769e-01 -4.53495852768e-01 + 771 -1.54009553378e-01 2.45418774037e-01 -3.94345192032e-01 + 772 -1.73682433367e-01 2.45545052737e-01 -4.19565100729e-01 + 773 -1.55903488059e-01 2.64585239378e-01 -4.53824823973e-01 + 774 -1.36861919630e-01 2.70847782459e-01 -4.48431459256e-01 + 775 -1.57797422739e-01 2.83751704720e-01 -5.13304455913e-01 + 776 -1.54194925422e-01 2.54529214426e-01 -4.88303861352e-01 + 777 9.57698966038e-02 -4.02176624633e-02 -3.95464918307e-01 + 778 1.08352729656e-01 -1.38138601027e-02 -4.16469704772e-01 + 779 9.94530337237e-02 1.04292102279e-02 -4.04200315646e-01 + 780 1.36535557345e-01 -2.07946606060e-02 -3.26343548999e-01 + 781 1.33074412070e-01 -3.46297739919e-02 -3.64565193675e-01 + 782 1.33185407992e-01 -1.62238943393e-02 -3.88043714682e-01 + 783 1.35529836816e-01 -8.65192197802e-04 -3.70388791901e-01 + 784 1.29835258639e-01 -1.16531280726e-02 -4.49743880364e-01 + 785 1.33518395759e-01 3.89937446186e-02 -4.58479277703e-01 + 786 1.55784653427e-01 -1.55867510648e-02 -4.00751168380e-01 + 787 1.70600919380e-01 7.76987378468e-03 -3.80622511056e-01 + 788 1.66917782261e-01 -4.28769989065e-02 -3.71887113718e-01 + 789 1.26152121519e-01 -6.23000007638e-02 -4.41008483026e-01 + 790 -4.29395129603e-02 -1.24276349928e-03 -4.57412391163e-01 + 791 -9.84953320487e-02 -2.28665383279e-02 -4.41404824876e-01 + 792 -1.01742360156e-01 1.16789999482e-03 -4.25838392116e-01 + 793 -7.55879646660e-02 2.39970065705e-02 -4.26058958880e-01 + 794 -1.10870480674e-01 8.88613253054e-03 -4.71093572846e-01 + 795 -1.25264037495e-01 -8.90601603178e-03 -4.55861468094e-01 + 796 -1.21007132214e-01 5.62968213621e-03 -4.40572482719e-01 + 797 -1.09992459240e-01 2.23363472338e-02 -4.45630890763e-01 + 798 -1.31143783754e-01 2.37323174188e-03 -4.10051392593e-01 + 799 -1.47029671965e-01 7.92049734804e-03 -4.34959179905e-01 + 800 -1.43518932380e-01 3.41259026003e-02 -4.39740140562e-01 + 801 -1.66426299762e-01 -1.27376422980e-02 -4.55086006559e-01 + 802 -1.54051151137e-01 -4.44903131564e-02 -4.25397258589e-01 + 803 -1.14924434811e-01 2.34526379330e-01 1.52964405963e-02 + 804 -1.82238899753e-01 1.99938630357e-01 -1.74153820380e-02 + 805 -2.09318895322e-01 2.17614496429e-01 2.10582093056e-02 + 806 -1.89201660636e-01 2.43746303951e-01 5.66509162947e-02 + 807 -1.74841133983e-01 2.62207218665e-01 -7.18305033607e-02 + 808 -1.99745210887e-01 2.29921772905e-01 -6.45960704646e-02 + 809 -2.15678629780e-01 2.35682886822e-01 -2.39457048502e-02 + 810 -2.04387051475e-01 2.59126888635e-01 -1.52185382428e-02 + 811 -1.81866713703e-01 1.17392381950e-02 -2.22099021417e-01 + 812 -1.35644195646e-01 3.32840534683e-03 -2.39048007455e-01 + 813 -1.36756441774e-01 2.82426019122e-02 -2.61813765058e-01 + 814 -1.60423823866e-01 4.49051166189e-02 -2.64722150840e-01 + 815 -1.38961778261e-01 7.03547103514e-02 -2.22054125117e-01 + 816 -1.22448411370e-01 4.52089977338e-02 -2.33368414576e-01 + 817 -1.26581542035e-01 5.34244970611e-02 -2.51862630998e-01 + 818 -1.38968163516e-01 7.29268052486e-02 -2.50484510166e-01 + 819 -1.14201305809e-01 3.64942837708e-02 -2.81671136878e-01 + 820 -1.38980934028e-01 7.80709950429e-02 -3.07345280263e-01 + 821 -1.08153151478e-01 6.73195833498e-02 -2.61783834191e-01 + 822 -1.17518888423e-01 1.03520588775e-01 -2.64677254540e-01 + 823 -9.27392602037e-02 6.19438775033e-02 -2.39003111155e-01 + 824 -9.60568428179e-02 1.28970182508e-01 -2.22009228817e-01 + 825 -1.44171839659e-01 2.86259799356e-01 -2.22490749148e-01 + 826 -1.94517920720e-01 2.54142785421e-01 -2.01972451964e-01 + 827 -1.20106976241e-01 2.23170450383e-01 -1.75666283783e-01 + 828 -9.45645433396e-02 2.65611575997e-01 -2.04953303694e-01 + 829 -1.29612865793e-01 2.71680696498e-01 -1.93454339600e-01 + 830 -1.58323928546e-01 2.45409652922e-01 -1.70096671628e-01 + 831 -1.21391151629e-01 2.89441757717e-01 -1.76276633930e-01 + 832 -1.60346888676e-01 2.58915722963e-01 -1.32651279137e-01 + 833 -6.47078108668e-02 2.89218607575e-01 -1.84936227236e-01 + 834 -8.59359441975e-02 2.27943387925e-01 -1.06345110956e-01 + 835 -9.38553341989e-02 3.64434838736e-03 -7.47767381382e-01 + 836 -1.53255657427e-01 -6.63785092939e-02 -7.42580292812e-01 + 837 2.41072741431e-04 -5.70304713129e-02 -7.65339994385e-01 + 838 -7.47991360040e-02 -4.79803769828e-02 -7.32071583845e-01 + 839 -1.24113427974e-01 -8.75913389012e-02 -7.32105216801e-01 + 840 -9.05247194665e-02 -1.06828389094e-01 -7.54295368147e-01 + 841 -2.48467928689e-01 -1.18152206489e-01 -6.98870439218e-01 + 842 -1.77874198997e-01 -1.29178080234e-01 -6.99473622402e-01 + 843 -1.54371521748e-01 -1.78827026190e-01 -7.16443052220e-01 + 844 -1.30783146555e-01 -9.05550080228e-02 -6.83107375767e-01 + 845 -3.66867396143e-02 -1.51229827723e-01 -7.00679988769e-01 + 846 -2.24879553495e-01 -2.98801883225e-02 -6.65534762764e-01 + 847 -2.39145240557e-01 1.65263141349e-01 -4.15498157275e-01 + 848 -2.26139035013e-01 1.24208786006e-01 -4.12874852882e-01 + 849 -2.57106225052e-01 1.23927239508e-01 -4.01066032852e-01 + 850 -2.79092922843e-01 1.44313643930e-01 -3.96473275034e-01 + 851 -2.70863662377e-01 1.58684333052e-01 -4.45380435924e-01 + 852 -2.51620051407e-01 1.33507698923e-01 -4.33670806779e-01 + 853 -2.68475189838e-01 1.30971810820e-01 -4.19615203282e-01 + 854 -2.86922643294e-01 1.46910937538e-01 -4.22736421547e-01 + 855 -2.66086717299e-01 1.03259288588e-01 -3.93849970640e-01 + 856 -3.19040605130e-01 1.23364146512e-01 -3.77448392793e-01 + 857 -2.78251839598e-01 1.19541367310e-01 -4.20987551951e-01 + 858 -3.10811344663e-01 1.37734835633e-01 -4.26355553683e-01 + 859 -2.57857456832e-01 1.17629977710e-01 -4.42757131530e-01 + 860 -3.02582084196e-01 1.52105524755e-01 -4.75262714573e-01 + 861 -1.70820809933e-01 -1.61702940274e-01 -4.08562905441e-01 + 862 -1.62435980535e-01 -1.03096626715e-01 -4.16980082015e-01 + 863 -1.53057697225e-01 -1.25010119086e-01 -4.43990000723e-01 + 864 -1.52560970269e-01 -1.65270022050e-01 -4.53286371789e-01 + 865 -2.18227702655e-01 -1.26029866701e-01 -4.13365015970e-01 + 866 -1.96835518816e-01 -9.88500155195e-02 -4.17375763510e-01 + 867 -1.81201921763e-01 -1.16346787596e-01 -4.37534282167e-01 + 868 -1.90252178639e-01 -1.40298945743e-01 -4.41579956693e-01 + 869 -1.44176140871e-01 -1.06663708492e-01 -4.61703548364e-01 + 870 -1.34301130605e-01 -1.68837103827e-01 -4.98009838138e-01 + 871 -1.84662292373e-01 -1.01228070037e-01 -4.47191407742e-01 + 872 -1.99967862992e-01 -1.29596948478e-01 -4.58088482318e-01 + 873 -2.09842873257e-01 -6.74235531424e-02 -4.21782192544e-01 + 874 -2.06820029203e-01 2.05411730417e-01 -1.97202703113e-01 + 875 -2.14236350914e-01 2.19960780708e-01 -2.33052707959e-01 + 876 -2.18533324728e-01 1.91957990634e-01 -2.21705332322e-01 + 877 -1.92851127227e-01 1.63173566625e-01 -2.16325331010e-01 + 878 -2.13125155252e-01 1.59314634845e-01 -2.42621293990e-01 + 879 -2.03975609794e-01 1.84997142062e-01 -2.70100338280e-01 + 880 -3.30962308320e-01 9.33655042590e-02 -6.91739835879e-01 + 881 -3.25953566733e-01 1.26675140653e-01 -6.65498786100e-01 + 882 -3.70745388611e-01 1.13135067415e-01 -6.58804499055e-01 + 883 -2.67938088978e-01 1.68900187538e-01 -6.10665048133e-01 + 884 -3.06118082916e-01 1.69702601122e-01 -5.73206748583e-01 + 885 -2.46443462479e-01 1.40048256388e-01 -6.22609753819e-01 + 886 4.09100602978e-02 4.10852899651e-01 -5.18284441813e-01 + 887 -2.46661421974e-02 4.40568599767e-01 -4.97891638050e-01 + 888 -1.29192599660e-01 4.10852899651e-01 -5.06855012113e-01 + 889 -6.69355078358e-02 3.05957889324e-01 -4.80019599973e-01 + 890 1.68385856856e-02 3.70638592882e-01 -4.80001363290e-01 + 891 -2.63256975327e-02 4.02978944662e-01 -4.74277530098e-01 + 892 -9.65631876197e-02 3.70638592882e-01 -4.72381743490e-01 + 893 -4.52492814594e-02 1.49017779852e-01 -4.48454084368e-01 + 894 -2.49797195889e-02 1.57515988022e-01 -4.24843260286e-01 + 895 -9.42232597864e-03 1.42017627842e-01 -4.11750331879e-01 + 896 -3.79750325396e-05 1.50810750517e-01 -4.73805627439e-01 + 897 -1.87234856248e-02 1.63378069805e-01 -4.66213457326e-01 + 898 -1.01527631805e-02 1.66161653444e-01 -4.44065496024e-01 + 899 5.16115136241e-03 1.58711301798e-01 -4.41744289000e-01 + 900 -2.02675513285e-02 1.81512556371e-01 -4.14325364610e-01 + 901 1.55594041523e-02 1.74512404361e-01 -3.77621612121e-01 + 902 -2.06899887083e-03 1.85041254151e-01 -4.43460977487e-01 + 903 2.49437550984e-02 1.83305527036e-01 -4.39676907681e-01 + 904 -1.08832003824e-02 1.90305679045e-01 -4.76380660170e-01 + 905 -1.85701863769e-02 1.75941850917e-01 -5.21752699286e-01 + 906 -4.65690082955e-02 2.24529833712e-01 -5.33369797424e-01 + 907 -6.37814928038e-02 1.74148880252e-01 -4.96401156214e-01 + 908 -3.10782931877e-02 1.80132136738e-01 -4.98178171890e-01 + 909 -4.89503829240e-02 2.15525552379e-01 -5.12784627343e-01 + 910 -7.67098792468e-02 2.23334519936e-01 -5.16468768710e-01 + 911 -3.41192730441e-02 2.56902224506e-01 -5.29168098472e-01 + 912 -4.14443509659e-02 2.34105719131e-01 -5.03121771347e-01 + 913 -7.93305794710e-02 2.55109253841e-01 -5.03816555400e-01 + 914 -5.39890139057e-02 1.52606870609e-01 -4.79560454688e-01 + 915 -5.29362674539e-02 1.34653951724e-01 -4.93826123483e-01 + 916 -3.19097339182e-02 1.62479815385e-01 -4.85103391827e-01 + 917 -2.38481429544e-02 1.53802184386e-01 -4.96461483403e-01 + 918 6.18810327157e-02 2.30924741635e-01 -5.08258014633e-01 + 919 9.70847227216e-02 2.16900072300e-01 -4.88723458946e-01 + 920 8.50310836450e-02 2.39321367241e-01 -4.33618545998e-01 + 921 1.05646338417e-01 2.26703708839e-01 -4.37627496392e-01 + 922 -1.14079648663e-01 -8.88087504252e-02 -2.09727235021e-01 + 923 -1.11334386591e-01 -3.15373553532e-02 -1.81149592007e-01 + 924 -1.34845162295e-01 -1.71118241705e-02 -1.94799401810e-01 + 925 -1.47973181183e-01 -3.85347561151e-02 -2.15913128219e-01 + 926 -1.49183793706e-01 -7.68033440145e-02 -1.74633087386e-01 + 927 -1.35652237310e-01 -4.26242161034e-02 -1.67279374588e-01 + 928 -1.47205856408e-01 -2.90333525288e-02 -1.80984286296e-01 + 929 -1.60078100371e-01 -4.72891499447e-02 -1.90455065396e-01 + 930 -1.45227919111e-01 1.87366389569e-02 -1.87335485205e-01 + 931 -1.58247925657e-01 -9.10821989667e-03 -1.71403303387e-01 + 932 -1.83077326226e-01 -2.65293497044e-02 -1.80818980584e-01 + 933 -1.46438531633e-01 -1.95319489425e-02 -1.46055444372e-01 + 934 -1.84287938748e-01 -6.47979376038e-02 -1.39538939751e-01 + 935 -1.08589124519e-01 2.57340397188e-02 -1.52571948993e-01 + 936 7.21966862530e-02 2.23729794328e-01 -2.25530652756e-01 + 937 8.94108912239e-02 2.12507451799e-01 -1.60852354957e-01 + 938 6.26298195682e-02 3.15819862885e-01 -1.50650843542e-01 + 939 7.79321899676e-02 2.84380588849e-01 -1.20862072496e-01 + 940 6.84507440842e-02 1.90703868472e-01 -9.91087280714e-02 + 941 6.01325247889e-02 2.93802578981e-01 -6.63695604189e-02 + 942 2.82791366005e-02 3.45672485101e-01 -8.38064609493e-02 + 943 1.30621870026e-02 1.91344970203e-01 -1.66721696785e-01 + 944 7.67493621088e-02 1.06028867480e-01 -4.15885518975e-01 + 945 6.26089434207e-02 1.34718794890e-01 -4.44501080397e-01 + 946 1.09930713620e-01 1.22415430162e-01 -4.60906651265e-01 + 947 8.73171645811e-02 1.10996332529e-01 -4.57977936324e-01 + 948 7.40698999470e-02 1.31271911824e-01 -4.68916503053e-01 + 949 8.47298444283e-02 1.45643170012e-01 -4.74515168591e-01 + 950 3.82090862737e-02 1.40128393486e-01 -4.76926354841e-01 + 951 6.16236473577e-02 1.33729349866e-01 -4.98671826901e-01 + 952 7.13904377851e-02 1.56514956169e-01 -5.21947487131e-01 + 953 7.52714180143e-02 1.04544699944e-01 -4.97141638731e-01 + 954 1.08452769526e-01 1.20931262627e-01 -5.42162771021e-01 + 955 4.20900665028e-02 8.81581372617e-02 -4.52120506442e-01 + 956 4.37830002921e-01 2.45477919040e-02 -3.20170499159e-01 + 957 4.53372502191e-01 4.15263288209e-02 -2.49038674664e-01 + 958 5.00000000000e-01 1.97167035122e-02 -2.19253532653e-01 + 959 1.65238026849e-01 -1.15646918094e-01 -4.25866187968e-01 + 960 1.49897693781e-01 -1.22224874161e-01 -4.13255965411e-01 + 961 1.22684574582e-01 -9.88403935294e-02 -4.14522001662e-01 + 962 1.28725196032e-01 -1.02918108966e-01 -4.63341537565e-01 + 963 1.53924774748e-01 -1.24943351119e-01 -4.45802322680e-01 + 964 1.45247837972e-01 -1.27552709913e-01 -4.31360622084e-01 + 965 1.25555806570e-01 -1.13739001409e-01 -4.38239531809e-01 + 966 1.61770479912e-01 -1.52187310860e-01 -3.99379706604e-01 + 967 1.19217027646e-01 -1.35380786295e-01 -3.88035520298e-01 + 968 1.51613076790e-01 -1.49303612963e-01 -4.28144668437e-01 + 969 1.25257649096e-01 -1.39458501732e-01 -4.36855056201e-01 + 970 1.67811101362e-01 -1.56265026297e-01 -4.48199242506e-01 + 971 1.31298270546e-01 -1.43536217169e-01 -4.85674592103e-01 + 972 1.33307312004e-02 1.35761382992e-01 -6.27263256459e-01 + 973 2.38294186225e-02 1.63930016351e-01 -5.64497729850e-01 + 974 2.06374460285e-02 1.33349773079e-01 -5.50828917101e-01 + 975 1.37921160205e-02 1.03975334764e-01 -5.75377274031e-01 + 976 6.08917503631e-02 1.28346322809e-01 -5.84713013740e-01 + 977 5.20372022569e-02 1.49597098443e-01 -5.57052743574e-01 + 978 4.25912769028e-02 1.30245145466e-01 -5.48662380581e-01 + 979 4.53456671889e-02 1.09627310718e-01 -5.64305773028e-01 + 980 2.42908034426e-02 1.32143968123e-01 -5.12611747422e-01 + 981 1.42535008407e-02 7.21892865353e-02 -5.23491291602e-01 + 982 5.23447921370e-02 1.28406399624e-01 -5.22462088622e-01 + 983 6.13531351832e-02 9.65602745811e-02 -5.32827031312e-01 + 984 -6.56187867021e-02 -5.24137431399e-02 -5.95554776140e-01 + 985 -1.22210117545e-01 -1.66993572897e-02 -5.40164765335e-01 + 986 -1.60294677240e-01 -4.65980711724e-02 -5.40890728255e-01 + 987 -1.51041291667e-01 -7.94046210388e-02 -5.68948715118e-01 + 988 -1.09834968920e-01 -4.84520281481e-02 -5.10476017365e-01 + 989 -1.32823795409e-01 -2.59630092453e-02 -5.01908929753e-01 + 990 -1.58733795714e-01 -4.60711316684e-02 -5.12017360838e-01 + 991 -1.52044578157e-01 -6.77665184113e-02 -5.21098229608e-01 + 992 -2.07632622509e-01 -4.36902351887e-02 -5.13558704312e-01 + 993 -2.36463796631e-01 -1.06395498938e-01 -5.42342654095e-01 + 994 -1.89772132052e-01 -4.39569278446e-02 -4.84171555738e-01 + 995 -1.95257473884e-01 -7.54429060471e-02 -4.83869956342e-01 + 996 -1.59436481837e-01 -2.32533342823e-01 -4.12199786808e-01 + 997 -1.82292532565e-01 -2.16757818407e-01 -3.92103404413e-01 + 998 -1.99412721977e-01 -1.73454854924e-01 -3.80236772532e-01 + 999 -2.13492717346e-01 -1.85205598190e-01 -4.28832995987e-01 + 1000 -1.91679196145e-01 -2.24591647251e-01 -4.24500886717e-01 + 1001 -2.00760555614e-01 -2.14745427831e-01 -4.06353324943e-01 + 1002 -2.18330022905e-01 -1.85205988651e-01 -4.03192210532e-01 + 1003 -1.88028393881e-01 -2.44285257473e-01 -3.83873653899e-01 + 1004 -2.10740470841e-01 -2.32426257017e-01 -4.05616798110e-01 + 1005 -2.02108389250e-01 -2.56036000739e-01 -4.32469877354e-01 + 1006 -2.38427271556e-01 -2.55727478084e-01 -5.15384938632e-01 + 1007 -2.03718557906e-01 -2.26764019999e-01 -5.09593238468e-01 + 1008 -1.77495524479e-01 -2.35791901945e-01 -5.39838314435e-01 + 1009 -2.28576857492e-01 -2.04571099500e-01 -5.62004722413e-01 + 1010 -2.37772779914e-01 -2.05950151702e-01 -5.24370843787e-01 + 1011 -2.11904867587e-01 -1.96671889733e-01 -5.17780592374e-01 + 1012 -1.97151615196e-01 -1.92659767609e-01 -5.40673094322e-01 + 1013 -1.95232877682e-01 -1.88772679966e-01 -4.73556462335e-01 + 1014 -2.08976517332e-01 -1.61313619624e-01 -4.96485192922e-01 + 1015 -1.85382463618e-01 -1.37616301382e-01 -5.20176246116e-01 + 1016 -2.46314210696e-01 -1.57551877522e-01 -4.95722870314e-01 + 1017 -1.66723564742e-01 5.04687452882e-02 -4.29910609871e-01 + 1018 -1.60684622920e-01 6.61956036521e-02 -4.02478537542e-01 + 1019 -1.83591990303e-01 1.93320587537e-02 -4.17824403539e-01 + 1020 -1.81995142998e-01 1.92263820226e-02 -4.40141187202e-01 + 1021 -1.63555461341e-01 2.67289806770e-02 -4.28782272050e-01 + 1022 -1.58473465659e-01 2.93002980492e-02 -4.10118111224e-01 + 1023 -5.00000000000e-01 -2.50000000000e-01 -8.30000000000e-01 + 1024 -3.33333333333e-01 -3.33333333333e-01 -8.30000000000e-01 + 1025 -4.24018767961e-01 -2.35474741552e-01 -7.97402038557e-01 + 1026 -3.18014075971e-01 -3.01606056164e-01 -8.05551528918e-01 + 1027 3.23895745759e-01 4.55379980610e-01 -4.56822527548e-01 + 1028 3.09453687390e-01 4.20058946474e-01 -4.31898247098e-01 + 1029 3.03915381680e-01 4.06579195313e-01 -4.79505245465e-01 + 1030 2.38553842240e-01 3.75438927083e-01 -5.49948176568e-01 + 1031 2.14180531086e-01 3.80088419711e-01 -5.13759144569e-01 + 1032 -2.06746997054e-01 2.74154924570e-01 -5.71689815232e-01 + 1033 -2.08840729151e-01 2.64702486426e-01 -5.37794849529e-01 + 1034 -2.09738300326e-01 3.33917547879e-01 -5.09875348338e-01 + 1035 -2.43467980875e-01 2.98146381865e-01 -5.35508777812e-01 + 1036 -2.35858033993e-01 2.85059188933e-01 -5.19132812890e-01 + 1037 -2.10834931332e-01 3.04544235299e-01 -4.96585204933e-01 + 1038 -2.61977767660e-01 2.36200829988e-01 -5.28390277443e-01 + 1039 -2.80288494613e-01 2.72843652143e-01 -5.06642419286e-01 + 1040 -2.64969070932e-01 2.95963453297e-01 -4.66575810549e-01 + 1041 -3.13918645246e-01 2.86366673146e-01 -5.24961169868e-01 + 1042 -1.13107823432e-01 2.60349175806e-01 -3.97375196770e-01 + 1043 -9.61667697530e-02 2.92481646790e-01 -3.76911459039e-01 + 1044 -9.36203154870e-02 2.69333337495e-01 -4.66113957393e-01 + 1045 -1.10472530607e-01 2.75688331680e-01 -4.37182396003e-01 + 1046 -9.83000638796e-02 3.02223030961e-01 -4.36808970593e-01 + 1047 3.38749614574e-01 2.02928701224e-01 -5.80704273835e-01 + 1048 2.58124421861e-01 2.19065314670e-01 -6.31084513624e-01 + 1049 2.62037404889e-01 1.35329128740e-01 -6.37351596188e-01 + 1050 3.41358269926e-01 1.47104577271e-01 -5.84882328878e-01 + 1051 3.17012274805e-01 1.75372642809e-01 -5.75550096462e-01 + 1052 2.56016366407e-01 1.76945032301e-01 -6.07418863864e-01 + 1053 3.31924848314e-01 1.74512260439e-01 -5.29194919272e-01 + 1054 2.47887272471e-01 1.76440653492e-01 -5.53820481779e-01 + 1055 3.75900127749e-01 1.31679970948e-01 -5.20015679301e-01 + 1056 2.51800255499e-01 9.27044675623e-02 -5.60087564344e-01 + 1057 3.94795590909e-01 5.00000000000e-01 -5.26047114026e-01 + 1058 5.00000000000e-01 5.00000000000e-01 -5.49088226078e-01 + 1059 3.67921809320e-01 4.66534985457e-01 -5.50116895661e-01 + 1060 4.29100154850e-01 4.55379980610e-01 -5.73500897573e-01 + 1061 5.00000000000e-01 -9.84772225671e-02 -6.73752900547e-01 + 1062 4.42555469443e-01 -1.48644640217e-01 -6.72300463565e-01 + 1063 4.13833204165e-01 -2.22966960326e-01 -5.93450695347e-01 + 1064 4.03681649942e-01 -1.12234411896e-01 -5.70595194002e-01 + 1065 4.35787766628e-01 -7.48229412641e-02 -6.57063462668e-01 + 1066 4.08757427054e-01 -1.18362074827e-01 -6.60146494401e-01 + 1067 3.78343236072e-01 -1.57816099770e-01 -6.03528659202e-01 + 1068 4.13833204165e-01 -1.24489737758e-01 -7.49697794800e-01 + 1069 3.78343236072e-01 -9.21646180583e-02 -7.07693392170e-01 + 1070 3.17514854107e-01 -1.38246927087e-01 -6.46540088255e-01 + 1071 4.03681649942e-01 -1.37571893290e-02 -7.26842293455e-01 + 1072 1.84236456340e-01 -1.26966682297e-01 -5.33664078882e-01 + 1073 1.70963489205e-01 -1.25596943386e-01 -5.51784514843e-01 + 1074 1.66704689245e-01 -1.50647431835e-01 -5.55424014213e-01 + 1075 1.60145047051e-01 -1.60986807637e-01 -5.04248616882e-01 + 1076 1.66590394409e-01 -1.32489860587e-01 -5.17667583289e-01 + 1077 1.61047184540e-01 -1.30081761832e-01 -5.35257034158e-01 + 1078 1.54902549679e-01 -1.48277026947e-01 -5.32174206843e-01 + 1079 1.61949322029e-01 -9.91767160265e-02 -5.66265451434e-01 + 1080 1.44417554934e-01 -1.22857465565e-01 -5.88025386765e-01 + 1081 1.51732304868e-01 -1.13963216407e-01 -5.39401831657e-01 + 1082 1.37857912740e-01 -1.33196841367e-01 -5.36849989434e-01 + 1083 1.55389679835e-01 -1.09516091828e-01 -5.15090054103e-01 + 1084 1.79481089123e-01 -7.54959664876e-02 -5.44505516103e-01 + 1085 2.45684452638e-03 -2.80411485324e-01 -4.25437227085e-01 + 1086 8.03579564624e-03 -3.90205742662e-01 -4.58666535135e-01 + 1087 -2.13359380272e-02 -3.60030354676e-01 -4.82130308333e-01 + 1088 -3.88112804238e-02 -2.90045532015e-01 -4.77247540907e-01 + 1089 1.08775623863e-02 -2.54066799918e-01 -4.82532152860e-01 + 1090 1.17899571796e-02 -3.36044533279e-01 -4.85653382968e-01 + 1091 -1.11773834588e-02 -3.26953294636e-01 -4.96504500908e-01 + 1092 -1.94414268671e-02 -2.69271059514e-01 -4.98040720150e-01 + 1093 -3.32323293039e-02 -3.99839789353e-01 -5.10476848957e-01 + 1094 -8.00794053739e-02 -2.99679578706e-01 -5.29057854729e-01 + 1095 -1.57221261205e-02 -3.42467231073e-01 -5.20193592183e-01 + 1096 -3.03905625638e-02 -2.63700846609e-01 -5.34342466682e-01 + 1097 1.64565135062e-02 -3.63861057257e-01 -5.15761460910e-01 + 1098 1.92982802463e-02 -2.27722114513e-01 -5.39627078635e-01 + 1099 2.79581777692e-01 3.25950444522e-02 -5.91886075627e-01 + 1100 2.81877733976e-01 -1.65282939134e-03 -5.47316373568e-01 + 1101 2.69134951022e-01 1.12779452419e-02 -5.09132266898e-01 + 1102 2.12853941762e-01 5.42720554759e-02 -5.58872458673e-01 + 1103 2.44357061136e-01 2.70099107646e-02 -5.80476501419e-01 + 1104 2.54885207489e-01 2.72028880385e-03 -5.49901618427e-01 + 1105 2.37392510023e-01 1.27985112911e-02 -5.25307295599e-01 + 1106 2.96916473215e-01 -4.88314778682e-02 -5.40930778181e-01 + 1107 2.55913524819e-01 -2.72744374490e-02 -5.46506303121e-01 + 1108 2.30188637286e-01 -2.71544668445e-02 -5.07917161227e-01 + 1109 2.40635463955e-01 -5.83736763425e-03 -5.90670969956e-01 + 1110 1.73907628026e-01 1.58396433894e-02 -5.57657353003e-01 + 1111 2.08762785611e-01 -1.76235486795e-02 -6.03696693760e-01 + 1112 2.43422194504e-01 -5.15051725727e-02 -5.84095051506e-01 + 1113 2.20250672345e-01 -2.90569005854e-02 -5.75282485338e-01 + 1114 2.01442361489e-01 -3.20916531315e-02 -5.88898899346e-01 + 1115 2.10620605976e-01 -4.80687519718e-02 -5.99312748127e-01 + 1116 1.59462528473e-01 -1.26781336903e-02 -5.93702747185e-01 + 1117 1.66135382023e-01 -3.36174112894e-02 -5.77303670158e-01 + 1118 1.62249259022e-01 -5.83459386288e-02 -5.87126828735e-01 + 1119 1.76694358575e-01 -2.98281615491e-02 -5.51081434553e-01 + 1120 9.49639666504e-02 -1.55562189595e-01 -5.24966146881e-02 + 1121 1.51447973471e-01 -1.22555460925e-01 -1.11907113773e-01 + 1122 2.67631982314e-01 -1.49692741739e-01 -1.21995943356e-01 + 1123 2.97481983325e-01 -1.79764746482e-01 -9.73351086051e-02 + 1124 1.33403558665e-01 -1.93771461550e-01 -1.67347006361e-01 + 1125 1.58246365874e-01 -1.59030551785e-01 -1.68670541860e-01 + 1126 2.43684774405e-01 -1.70264739681e-01 -1.62046307025e-01 + 1127 2.55602372443e-01 -1.97170075490e-01 -1.58955871748e-01 + 1128 3.53965990146e-01 -1.46758017812e-01 -1.56745607690e-01 + 1129 2.93258376990e-01 -1.75165589709e-01 -1.98562871138e-01 + 1130 3.35921575340e-01 -2.17974018437e-01 -2.12185500278e-01 + 1131 1.89887565486e-01 -1.60764732880e-01 -2.26757505445e-01 + 1132 1.71843150680e-01 -2.31980733505e-01 -2.82197398033e-01 + 1133 2.07931980291e-01 -8.95487322546e-02 -1.71317612858e-01 + 1134 -1.52528147978e-01 -1.66566856116e-01 -3.32522791242e-01 + 1135 -1.74547658212e-01 -1.31945887323e-01 -3.00543321316e-01 + 1136 -1.54245239976e-01 -1.12116390988e-01 -3.13329244073e-01 + 1137 -1.33084275742e-01 -1.19512127218e-01 -3.35711940414e-01 + 1138 -1.78696549252e-01 -1.05760893172e-01 -3.30976215395e-01 + 1139 -1.84653422316e-01 -1.02948901625e-01 -3.10172094060e-01 + 1140 -1.66900167614e-01 -9.53260257983e-02 -3.17354342942e-01 + 1141 -1.57011167336e-01 -9.46597282211e-02 -3.33617840126e-01 + 1142 -1.55103785976e-01 -8.48911584249e-02 -3.03732470488e-01 + 1143 -1.13640403506e-01 -7.24573983198e-02 -3.38901089586e-01 + 1144 -1.71690840826e-01 -7.15790823592e-02 -3.12298193508e-01 + 1145 -1.59252677016e-01 -5.87061642738e-02 -3.34165364568e-01 + 1146 -3.04939416676e-01 1.63836909000e-01 -5.40558737246e-01 + 1147 -3.06754713085e-01 1.89354787296e-01 -5.31019175667e-01 + 1148 -4.05463670987e-01 1.98629762085e-01 -5.33359715509e-01 + 1149 -3.70745388611e-01 1.70020225526e-01 -5.42119097141e-01 + 1150 -3.53704562507e-01 1.65541550333e-01 -5.25405001499e-01 + 1151 -3.71169808724e-01 1.83121682975e-01 -5.13994048531e-01 + 1152 -3.01945454027e-01 1.32453338581e-01 -5.17450287489e-01 + 1153 -3.67963636018e-01 1.45187383832e-01 -5.04948123078e-01 + 1154 -4.01291042098e-01 1.61380499544e-01 -4.77603254415e-01 + 1155 -4.08162963204e-01 -1.80073680288e-01 -4.21676842510e-01 + 1156 -3.98957616349e-01 -1.26795364564e-01 -3.85252828891e-01 + 1157 -3.60653507262e-01 -1.50168051235e-01 -4.20506937173e-01 + 1158 -3.65626861106e-01 -1.17685721705e-01 -3.93481403293e-01 + 1159 -3.82060506005e-01 -1.02516657126e-01 -4.16025909748e-01 + 1160 -3.82817297689e-01 -1.43655619131e-01 -4.67836463797e-01 + 1161 2.18230615841e-01 4.08316507721e-02 -3.66546374270e-01 + 1162 2.23504202261e-01 7.29744746828e-02 -3.98436689200e-01 + 1163 2.99979827654e-01 1.84033138343e-02 -3.98285535074e-01 + 1164 2.69214366103e-01 4.45087687310e-03 -3.66445604853e-01 + 1165 2.35290373517e-01 1.30865938095e-02 -3.89454023065e-01 + 1166 2.44492683689e-01 2.52667907624e-02 -4.18350115950e-01 + 1167 2.09223828435e-01 -1.82029431697e-02 -4.06473997188e-01 + 1168 2.09994021152e-01 -1.55774162299e-02 -4.58328123577e-01 + 1169 2.47076544773e-01 -4.68012870638e-02 -3.80471356931e-01 + 1170 1.18034998229e-01 -2.29265507147e-02 -5.85745884583e-01 + 1171 1.36659208162e-01 -1.00044860133e-02 -5.76383040723e-01 + 1172 1.00342258172e-01 -2.57250669339e-03 -6.24018617923e-01 + 1173 9.72456946275e-02 -3.26740134869e-03 -5.96593621215e-01 + 1174 1.16411177977e-01 1.50935983583e-03 -5.86859554162e-01 + 1175 1.24864048124e-01 3.56487666755e-03 -6.01898196283e-01 + 1176 1.32480097782e-01 5.59122636506e-03 -5.49700490400e-01 + 1177 1.06875760996e-01 1.57444500378e-02 -5.72563358426e-01 + 1178 1.14787357725e-01 2.59452703863e-02 -5.87973223740e-01 + 1179 7.33598274809e-02 1.56968533620e-02 -5.80016361138e-01 + 1180 5.56670874239e-02 3.60508973833e-02 -6.18289094478e-01 + 1181 9.10525675379e-02 -4.65719065930e-03 -5.41743627798e-01 + 1182 1.52816605321e-01 -6.88979836257e-02 -4.92756999564e-01 + 1183 1.32228592727e-01 -4.74843859702e-02 -5.09085875642e-01 + 1184 1.08602344529e-01 -3.34785957115e-02 -4.91376055412e-01 + 1185 1.50029874773e-01 -2.32301786872e-02 -4.99332918014e-01 + 1186 1.59846946223e-01 -4.06521079540e-02 -5.14390450710e-01 + 1187 1.42648351552e-01 -3.16533786303e-02 -5.21228744982e-01 + 1188 1.30370772361e-01 -1.70391826779e-02 -5.13469821275e-01 + 1189 1.35266828331e-01 -4.00765785734e-02 -5.43124571950e-01 + 1190 1.48147094896e-01 -2.14378379191e-02 -5.47968832301e-01 + 1191 8.02554411822e-02 5.20223121226e-02 -1.60990334785e-01 + 1192 8.14686602185e-02 1.25873253603e-01 -1.64474288096e-01 + 1193 7.53899315745e-02 1.03350107961e-01 -1.88734410275e-01 + 1194 6.34571276373e-02 8.68529766426e-02 -1.62423175285e-01 + 1195 6.35320120876e-02 9.63693632983e-02 -1.37479348836e-01 + 1196 4.54455950560e-02 4.78326996818e-02 -1.60372062474e-01 + 1197 3.46511257048e-02 9.56701231888e-02 -1.62488607244e-01 + 1198 2.03604514141e-02 1.14353276445e-01 -1.25105583550e-01 + 1199 3.81473306444e-02 1.24824393439e-01 -2.01988175709e-01 + 1200 2.57904811533e-01 1.14308747772e-01 -7.64552799821e-02 + 1201 2.46174950466e-01 8.27376589345e-02 -6.30215969676e-02 + 1202 2.78274889477e-01 9.01830329113e-02 -2.99531694875e-02 + 1203 3.24937566717e-01 7.64317382878e-02 -9.89350402943e-02 + 1204 2.86953500233e-01 4.69626229991e-02 -7.35302095042e-02 + 1205 3.55492683633e-01 4.02431659966e-02 -2.91818745523e-02 + 1206 7.49511950776e-02 1.48075850882e-02 9.06159039929e-02 + 1207 8.49575808640e-02 -7.03773022534e-02 1.90596446524e-02 + 1208 6.58579591845e-02 -3.44643406063e-02 -1.51233936700e-02 + 1209 5.13049554516e-02 2.60845838881e-02 3.56321683900e-03 + 1210 1.42968281172e-01 1.41598875496e-03 3.39476780344e-02 + 1211 1.26966842998e-01 -5.09100706951e-02 5.13291379358e-03 + 1212 1.02139811205e-01 -2.88421573493e-02 -1.70226822335e-02 + 1213 1.04531759390e-01 1.33978533993e-02 -5.19803808202e-03 + 1214 6.13113412380e-02 -5.91003034536e-02 -6.79930425015e-02 + 1215 1.11202683247e-01 -4.33920714951e-02 -5.29022109757e-02 + 1216 1.52974666958e-01 -8.37688985867e-02 -3.76085813061e-02 + 1217 8.60997491235e-02 1.84842206837e-01 -3.47203917453e-01 + 1218 6.34840309335e-02 1.49206001029e-01 -3.78636071815e-01 + 1219 5.38064678207e-02 1.37093041524e-01 -3.20240757597e-01 + 1220 7.96480403816e-02 1.76766900500e-01 -3.08273707974e-01 + 1221 6.36258813243e-02 1.76203276465e-01 -3.25610684011e-01 + 1222 4.10574465979e-02 1.49566162469e-01 -3.39367709105e-01 + 1223 7.34452948279e-02 2.15313511407e-01 -3.30980610425e-01 + 1224 4.76982891941e-02 1.93637836054e-01 -3.07597401512e-01 + 1225 5.88184103945e-03 1.62399444855e-01 -3.19226297903e-01 + 1226 6.37677317150e-02 2.03200551901e-01 -2.72585296207e-01 + 1227 -3.79572207341e-03 1.50286485350e-01 -2.60830983686e-01 + 1228 -9.95808242955e-02 1.99154273392e-01 -2.55201913545e-01 + 1229 -7.22322323006e-02 1.89532653668e-01 -2.60309142012e-01 + 1230 -1.76727173904e-02 2.20720047515e-01 -2.32665375996e-01 + 1231 -6.32078143554e-02 2.19945869290e-01 -2.36772736201e-01 + 1232 -7.14200714710e-02 1.97201947595e-01 -2.33081859355e-01 + 1233 -4.38007591995e-02 1.90136759180e-01 -2.29113326937e-01 + 1234 -1.25167425552e-01 1.73683847674e-01 -2.33498342713e-01 + 1235 -7.90908880336e-02 1.79570888517e-01 -2.11239460737e-01 + 1236 -4.14973279077e-02 1.60157576355e-01 -1.94365462801e-01 + 1237 -7.06079106414e-02 2.04871241522e-01 -2.05854576697e-01 + 1238 4.02643993430e-01 -6.70180320173e-02 -1.16378138853e-01 + 1239 3.55492683633e-01 -1.07971455474e-01 -8.24470752231e-02 + 1240 4.03661789089e-01 -4.11603237919e-02 -6.68457838756e-02 + 1241 3.54729336889e-01 -5.32574259076e-02 -9.29637411211e-02 + 1242 3.06305782519e-01 -1.01830547734e-01 -1.12070587768e-01 + 1243 3.53965990146e-01 1.45660365844e-03 -1.03480407019e-01 + 1244 3.06305782519e-01 -3.02080008714e-03 -7.65604539874e-02 + 1245 2.09458673778e-01 -5.07621699164e-02 -9.70190803908e-02 + 1246 1.09188326491e-02 1.11989743236e-01 -3.08222690675e-01 + 1247 1.24656898168e-02 1.32830630278e-01 -3.31355664491e-01 + 1248 4.44154410043e-02 1.15959694724e-01 -3.32031970953e-01 + 1249 3.72014317913e-02 1.30597872133e-01 -3.43429381245e-01 + 1250 2.05963957619e-02 1.24102702742e-01 -3.66618004893e-01 + 1251 5.08671497462e-02 1.24035001061e-01 -3.70962180432e-01 + 1252 6.85210225432e-02 9.87962994106e-02 -3.67632464587e-01 + 1253 -1.06772468317e-01 2.60858442199e-01 -3.60773856682e-01 + 1254 -1.44506520707e-01 2.46182673626e-01 -3.39443181902e-01 + 1255 -1.16826833935e-01 2.44664890109e-01 -3.80156060570e-01 + 1256 -1.45334324068e-01 2.29483193697e-01 -3.72396345345e-01 + 1257 -7.96441144924e-02 2.43911006181e-01 -3.65966929107e-01 + 1258 -1.27983865446e-01 1.97612033016e-01 -3.28498651970e-01 + 1259 -1.02092719925e-01 2.27968748733e-01 -3.90078843482e-01 + 1260 -1.37486898118e-01 1.96848133427e-01 -3.83400662101e-01 + 1261 3.28276559575e-02 2.26907382547e-01 -3.20190092019e-01 + 1262 2.63759472156e-02 2.18832076210e-01 -2.81259882541e-01 + 1263 2.36718114498e-02 2.07752158248e-01 -3.05350314936e-01 + 1264 -1.64241088155e-02 2.12303764594e-01 -3.38115333665e-01 + 1265 -1.22146465681e-02 1.91631338179e-01 -3.12353883672e-01 + 1266 -2.61016719283e-02 2.00190805089e-01 -2.79720019447e-01 + 1267 6.19438221936e-03 2.18940344472e-01 -4.27596340536e-01 + 1268 -7.87247969321e-03 2.32361191853e-01 -3.90528409183e-01 + 1269 6.04062319001e-02 2.07575224175e-01 -3.87897808030e-01 + 1270 3.74785830404e-02 2.28233912967e-01 -3.91782157584e-01 + 1271 3.85287420390e-02 2.40279000720e-01 -3.55132142364e-01 + 1272 1.51187125289e-03 2.41154314528e-01 -4.52583704743e-01 + 1273 4.47849760031e-02 2.46141082503e-01 -3.96502339404e-01 + 1274 2.90647979241e-02 2.79980406452e-01 -4.59109516135e-01 + 1275 8.08387895255e-02 3.53320270968e-01 -4.66061307398e-01 + 1276 9.34618885200e-02 3.29018857839e-01 -4.20630882730e-01 + 1277 6.31535937839e-02 2.72025143786e-01 -4.00852880332e-01 + 1278 1.16658415187e-01 2.51195020370e-02 -3.29190071038e-01 + 1279 9.88497682199e-02 3.61809402499e-02 -2.98544932236e-01 + 1280 1.59546050358e-01 5.02228003244e-02 -3.41208137960e-01 + 1281 1.14908496029e-01 5.80462005907e-02 -3.46010224528e-01 + 1282 1.01989490594e-01 5.81106046119e-02 -3.18821332054e-01 + 1283 1.27441525001e-01 5.29164724415e-02 -3.06556976851e-01 + 1284 6.67581731242e-02 8.52988051657e-02 -3.24173194602e-01 + 1285 8.73205660005e-02 9.11017071868e-02 -3.08452593071e-01 + 1286 1.86408759761e-01 4.91792851901e-02 -5.25408065016e-01 + 1287 1.53713011893e-01 2.74166940040e-02 -5.08068315353e-01 + 1288 2.11423981457e-01 1.93473196230e-02 -5.08600291125e-01 + 1289 1.97965223443e-01 -5.10506302348e-03 -4.91437866719e-01 + 1290 1.92659325629e-01 6.58491060904e-02 -5.09283421023e-01 + 1291 2.23929432601e-01 2.05165450342e-02 -4.92247937166e-01 + 1292 -2.39464887319e-02 2.17745030695e-01 -4.10695311821e-01 + 1293 -9.37784003781e-03 2.11333435449e-01 -4.33454534676e-01 + 1294 -1.76902547678e-02 2.23607112479e-01 -4.52065508861e-01 + 1295 -7.57814011521e-02 2.15572113359e-01 -3.58458564991e-01 + 1296 -9.80199199589e-02 1.78253180366e-01 -3.35970244365e-01 + 1297 -9.35835335615e-02 2.10700143479e-01 -3.78419591801e-01 + 1298 -1.14343256902e-01 1.84196864857e-01 -3.70081053654e-01 + 1299 -6.92319502560e-02 2.45972379063e-01 -3.43514304474e-01 + 1300 -8.81957436147e-02 2.23853578922e-01 -3.13553853589e-01 + 1301 -6.89379563099e-02 2.24202866226e-01 -3.43496187546e-01 + 1302 -8.14824872337e-02 2.02200495187e-01 -3.23516514646e-01 + 1303 -4.92559865978e-02 2.33066477296e-01 -3.48495366071e-01 + 1304 -5.82317981274e-02 2.04494726272e-01 -3.21025445984e-01 + 1305 -1.34638616072e-02 1.29319183069e-03 -1.82523435385e-01 + 1306 2.48843063396e-02 2.97985042532e-02 -2.09889045009e-01 + 1307 7.23392280676e-03 5.01940989338e-02 -2.02316531568e-01 + 1308 -2.07653529330e-02 4.61392400628e-02 -1.84847470035e-01 + 1309 7.09742710922e-03 1.93273872593e-02 -1.33006452850e-01 + 1310 2.58091095016e-02 3.23195303981e-02 -1.67755853444e-01 + 1311 1.23401210615e-02 4.69859698723e-02 -1.72609766254e-01 + 1312 -4.62399668014e-03 4.32133542712e-02 -1.51061470128e-01 + 1313 1.75828150137e-02 7.46445524853e-02 -2.12213079659e-01 + 1314 -2.80668442589e-02 9.09852882949e-02 -1.87171504686e-01 + 1315 2.09414486177e-02 6.22168958862e-02 -1.69305209878e-01 + 1316 -2.04064216614e-04 6.41734354914e-02 -1.35330487500e-01 + 1317 -8.95260136756e-02 5.13876464485e-02 -2.76954439538e-01 + 1318 -8.95781817186e-02 7.96226834234e-02 -2.87433162560e-01 + 1319 -9.11587209612e-02 7.07832804633e-02 -2.63218136858e-01 + 1320 -9.17377354184e-02 9.60718497849e-02 -2.65625184646e-01 + 1321 -7.52179832722e-02 6.83540422701e-02 -2.48509089056e-01 + 1322 -6.81161361136e-02 1.05072277156e-01 -2.44765136837e-01 + 1323 6.92086155975e-02 1.68587801777e-01 -2.29438653382e-01 + 1324 6.35893125721e-02 1.54901640159e-01 -2.60808415682e-01 + 1325 5.09575311797e-02 1.64012472670e-01 -2.37286735958e-01 + 1326 4.68658834776e-02 1.99248691335e-01 -2.37297429733e-01 + 1327 2.41663130718e-02 1.33311757409e-01 -2.21602445034e-01 + 1328 4.63323246457e-03 1.70815727776e-01 -2.13776340235e-01 + 1329 2.97183761065e-02 1.04295151013e-01 -2.49042819159e-01 + 1330 -7.50232862815e-03 1.41165129249e-01 -1.76946600735e-01 + 1331 4.21801952311e-03 1.06563947062e-01 -1.45794223929e-01 + 1332 1.89716332139e-02 9.44989144653e-02 -1.68659331605e-01 + 1333 1.60759390100e-02 1.13544691724e-01 -1.97049285368e-01 + 1334 -4.38533436900e-03 9.16079262236e-02 -4.00746724651e-01 + 1335 2.26291180477e-03 1.19242752269e-01 -3.93038353808e-01 + 1336 -2.56088810699e-02 1.14036726721e-01 -3.81645095354e-01 + 1337 -1.53168097643e-02 1.29155646131e-01 -3.80639224546e-01 + 1338 -2.89668754763e-02 1.47643194467e-01 -3.88980833506e-01 + 1339 -8.95439431589e-03 1.35699911067e-01 -3.58892615515e-01 + 1340 -2.62482851596e-02 1.66703366038e-01 -3.60531724441e-01 + 1341 -2.12112935500e-02 1.16293664420e-01 -3.49528117213e-01 + 1342 -8.86670732589e-02 5.60886292977e-02 -5.14230759557e-01 + 1343 -8.00677760286e-02 1.07936840711e-01 -5.28001977443e-01 + 1344 -9.24240151062e-02 1.10806596982e-01 -5.00892918414e-01 + 1345 -1.02901783260e-01 8.63173694114e-02 -4.80452779956e-01 + 1346 -6.15355646842e-02 8.28057403108e-02 -4.80054905597e-01 + 1347 -6.48465360556e-02 1.08465510915e-01 -5.00627668841e-01 + 1348 -7.79190253571e-02 1.10485660568e-01 -4.87139451720e-01 + 1349 -8.00692075434e-02 9.40525300489e-02 -4.68928203850e-01 + 1350 -9.43024860299e-02 1.38165580825e-01 -4.94223997843e-01 + 1351 -7.43363427231e-02 1.28618004324e-01 -4.78109015774e-01 + 1352 -1.12020354132e-01 1.63291107762e-01 -2.75253940393e-01 + 1353 -9.73655609119e-02 1.61825514413e-01 -2.97983239182e-01 + 1354 -8.51260761297e-02 1.83892917017e-01 -2.98139693189e-01 + 1355 -9.08161100158e-02 1.92225780117e-01 -2.83038978665e-01 + 1356 -7.08401463576e-02 1.79319878351e-01 -2.88020040262e-01 + 1357 -8.20564086447e-02 1.43932255112e-01 -2.82725532788e-01 + 1358 -4.99262824457e-02 1.39628333929e-01 -2.41420106251e-01 + 1359 -4.94200622249e-02 1.76450597562e-01 -2.60483089237e-01 + 1360 -3.59258482725e-02 1.54590406533e-01 -3.02136410223e-01 + 1361 -5.59695131210e-02 1.46050331858e-01 -2.75427349754e-01 + 1362 -5.40790402865e-02 1.72061530100e-01 -2.81222776118e-01 + 1363 -4.00864394427e-02 1.86425312631e-01 -3.00960625218e-01 + 1364 -1.47143314058e-01 -2.50186788646e-02 -2.92713316521e-01 + 1365 -1.35975677207e-01 -4.08315853497e-02 -3.08109240876e-01 + 1366 -1.71922942277e-01 1.65580324075e-02 -3.18387459906e-01 + 1367 -1.44422520714e-01 9.34454577125e-03 -2.97590637768e-01 + 1368 -1.36726991412e-01 -1.11059402515e-02 -3.07918250723e-01 + 1369 -1.52495429353e-01 -1.31137778349e-02 -3.25225336466e-01 + 1370 -1.01531040548e-01 -3.87699129105e-02 -2.97449041540e-01 + 1371 -1.14014338374e-01 1.77056407269e-04 -3.00747787781e-01 + 1372 -1.26310668767e-01 2.80679836155e-03 -3.23123184925e-01 + 1373 -2.60899610069e-01 -1.49532524617e-01 -4.33635106516e-01 + 1374 -2.52754338923e-01 -1.35153516057e-01 -4.69870955709e-01 + 1375 -3.78082312380e-01 -2.02831350620e-01 -4.83304443814e-01 + 1376 -3.40599740046e-01 -1.65339831456e-01 -4.61592004709e-01 + 1377 -3.14565754192e-01 -1.50603748327e-01 -4.81779667055e-01 + 1378 -3.30876140464e-01 -1.70686066726e-01 -5.02983847241e-01 + 1379 -2.51049196005e-01 -9.83761460330e-02 -4.80254890297e-01 + 1380 -3.34032797336e-01 -1.31235579067e-01 -4.92671860563e-01 + 1381 -3.68231898316e-01 -1.51674972036e-01 -5.29924227595e-01 + 1382 3.59905942474e-02 -1.74495870535e-01 -2.32658486091e-01 + 1383 5.45755756888e-02 -1.10354206881e-01 -1.96742517848e-01 + 1384 2.55477658829e-02 -9.54866807753e-02 -1.71478390143e-01 + 1385 1.74137025921e-03 -1.20123749550e-01 -1.76804310412e-01 + 1386 6.54772804489e-02 -1.65029030065e-01 -1.42577550389e-01 + 1387 6.80383726760e-02 -1.25423534452e-01 -1.48660550128e-01 + 1388 4.29018160747e-02 -1.10505557980e-01 -1.41732946279e-01 + 1389 3.28155690563e-02 -1.31936562898e-01 -1.35368411837e-01 + 1390 2.03263517006e-02 -5.59820858956e-02 -1.40888342169e-01 + 1391 -3.25078537290e-02 -6.57516285645e-02 -1.20950134733e-01 + 1392 4.52055566838e-02 -8.91754537954e-02 -1.11424433009e-01 + 1393 3.12280564607e-02 -1.10656909080e-01 -8.67233747106e-02 + 1394 8.40622618903e-02 -1.00887366411e-01 -1.06661582147e-01 + 1395 0.00000000000e+00 5.00000000000e-01 5.00000000000e-01 + 1396 -1.66666666667e-01 1.66666666667e-01 5.00000000000e-01 + 1397 -5.00000000000e-01 0.00000000000e+00 5.00000000000e-01 + 1398 -2.82524396111e-01 2.47999486801e-01 3.99197147845e-01 + 1399 -2.16829307408e-02 3.31999657868e-01 4.32798098563e-01 + 1400 -1.41262198056e-01 1.23999743401e-01 4.49598573923e-01 + 1401 -3.55016264074e-01 -1.33367546567e-03 4.32798098563e-01 + 1402 0.00000000000e+00 0.00000000000e+00 5.00000000000e-01 + 1403 -2.16829307408e-02 -1.33367546567e-03 4.32798098563e-01 + 1404 -2.82524396111e-01 -2.52000513199e-01 3.99197147845e-01 + 1405 2.17475603889e-01 2.47999486801e-01 3.99197147845e-01 + 1406 -6.50487922224e-02 -4.00102639702e-03 2.98394295690e-01 + 1407 5.00000000000e-01 5.00000000000e-01 5.00000000000e-01 + 1408 -9.97944302741e-02 2.04769564876e-01 -6.67616781172e-01 + 1409 -1.00718504227e-01 2.43748309684e-01 -6.30612518682e-01 + 1410 -5.52887057902e-02 2.81974784342e-01 -6.03127954407e-01 + 1411 -4.00537972378e-03 3.71121884691e-01 -7.39825957556e-01 + 1412 -6.65296201827e-02 3.03179709917e-01 -7.21744520781e-01 + 1413 -7.55388781702e-02 3.07811232263e-01 -6.80459389012e-01 + 1414 -3.68591371934e-02 3.54649856228e-01 -6.78751969605e-01 + 1415 -1.47072376617e-01 2.44500579836e-01 -6.21092820468e-01 + 1416 -9.80482510778e-02 3.29667053224e-01 -6.90728546978e-01 + 1417 -5.12833260664e-02 4.10852899651e-01 -6.93301996851e-01 + 1418 -9.57890505503e-02 3.33647680185e-01 -7.57790823616e-01 + 1419 -3.31809698757e-02 2.68004809453e-01 -4.87257134396e-01 + 1420 -3.89093541091e-02 2.48131784185e-01 -4.78200130072e-01 + 1421 -6.33218408269e-02 2.66809495676e-01 -4.70356105682e-01 + 1422 3.08192339642e-02 2.50686487538e-01 -4.73317078504e-01 + 1423 5.59472218491e-02 2.52043520267e-01 -4.26072711060e-01 + 1424 1.70349193136e-01 -2.86398156966e-01 -7.39893208575e-01 + 1425 2.55523789704e-01 -1.79597235450e-01 -6.94839812863e-01 + 1426 2.75888802777e-01 -2.49659825172e-01 -7.76465196534e-01 + 1427 2.52761894852e-01 -2.14798617725e-01 -7.62419906431e-01 + 1428 3.37015859803e-01 -1.19731490300e-01 -7.39893208575e-01 + 1429 2.89818927082e-01 7.52197056302e-02 -6.69150107472e-01 + 1430 3.59879284721e-01 5.01464704201e-02 -7.22766738314e-01 + 1431 3.94909463541e-01 8.02737213985e-02 -6.62061002300e-01 + 1432 3.59879284721e-01 1.07031628531e-01 -6.06081336400e-01 + 1433 4.35787766628e-01 4.77136985586e-02 -6.44542793722e-01 + 1434 4.03681649942e-01 7.15705478380e-02 -5.51814190584e-01 + 1435 2.39527251569e-01 -3.64028571835e-01 -1.61562453629e-01 + 1436 3.04645438677e-01 -3.98021428876e-01 -2.13982077949e-01 + 1437 2.39527251569e-01 -4.62706137379e-01 -2.37918236425e-01 + 1438 1.27233925872e-01 -1.55670266228e-01 -2.82307167771e-01 + 1439 9.68194819968e-02 -1.61945467664e-01 -2.65757607211e-01 + 1440 1.03916872464e-01 -2.03238302020e-01 -2.57427942062e-01 + 1441 1.54133277345e-01 -1.33629754904e-01 -2.45310649467e-01 + 1442 1.24597606570e-01 -1.43846283811e-01 -2.42147608623e-01 + 1443 1.38588575073e-01 -1.65341778765e-01 -2.28724498994e-01 + 1444 5.93076476552e-02 -1.26927834743e-01 -2.57537711800e-01 + 1445 1.08849091867e-01 -1.14468133914e-01 -2.28797678819e-01 + 1446 1.21961287269e-01 -1.32022301395e-01 -2.01988049474e-01 + 1447 1.45278340677e-01 -8.44542656030e-02 -2.26867275183e-01 + 1448 3.64610982143e-01 -9.82058002902e-02 -5.33122452485e-01 + 1449 3.98458236607e-01 -3.09904816342e-02 -5.19827787928e-01 + 1450 4.35787766628e-01 -1.79377831528e-02 -5.40378060754e-01 + 1451 3.64610982143e-01 2.43308395325e-02 -5.20601783540e-01 + 1452 -3.49793763884e-01 5.15627066978e-02 -3.44926597222e-01 + 1453 -3.99862509256e-01 9.12602959098e-02 -3.89932329568e-01 + 1454 -4.09520302565e-01 1.47009810423e-01 -4.28696093525e-01 + 1455 -3.21992527371e-01 7.10167884634e-02 -4.40685523023e-01 + 1456 -3.41510659126e-01 4.05982812702e-02 -3.97925282566e-01 + 1457 -3.81132994345e-01 7.31125795361e-02 -4.18429910489e-01 + 1458 -3.81328351580e-01 1.04229683754e-01 -4.53771613435e-01 + 1459 -4.01830457416e-01 5.63620572110e-02 -4.32090416388e-01 + 1460 -3.52745686125e-01 -7.84651350430e-04 -4.08163727453e-01 + 1461 -2.74339302323e-01 1.15260902796e-01 -5.41467944738e-01 + 1462 -2.86535315540e-01 1.52375285143e-01 -5.56570508746e-01 + 1463 -2.83753562948e-01 1.27542443449e-01 -5.19399534683e-01 + 1464 -2.90547007704e-01 1.52307845046e-01 -5.36243560203e-01 + 1465 -2.79148561381e-01 1.72162351510e-01 -5.55036832916e-01 + 1466 -2.86959735653e-01 1.65476742592e-01 -5.28445460135e-01 + 1467 -2.74975932493e-01 1.34913088969e-01 -4.99280371822e-01 + 1468 -1.99858628959e-01 -1.23524703511e-01 -5.83089114389e-01 + 1469 -2.23924520600e-01 -1.51157877226e-01 -6.32794781483e-01 + 1470 -2.54260050257e-01 -1.56409861797e-01 -6.37274384883e-01 + 1471 -2.30671675063e-01 -6.81378436301e-02 -6.03938708430e-01 + 1472 -2.08198937137e-01 -9.23098651147e-02 -6.10570997181e-01 + 1473 -2.24163278824e-01 -1.20838455000e-01 -6.40979776804e-01 + 1474 -2.44466551336e-01 -1.14233303972e-01 -6.46694510843e-01 + 1475 -2.17654882584e-01 -1.73539066370e-01 -6.78020845178e-01 + 1476 -2.20063106221e-01 -1.25652773688e-01 -6.73858817706e-01 + 1477 -1.94066507390e-01 -8.52670482032e-02 -6.44685168724e-01 + 1478 -1.63253461286e-01 -1.40653908084e-01 -6.23835574684e-01 + 1479 5.04043271978e-02 -8.21767804974e-03 -2.61566615845e-01 + 1480 4.39902536535e-02 -4.14784254125e-02 -2.73722596451e-01 + 1481 5.60933846809e-02 -1.77163943440e-02 -2.36381599285e-01 + 1482 5.37136881457e-02 -4.30564646839e-02 -2.36090580836e-01 + 1483 4.72496125535e-02 2.83140719180e-03 -2.21036486544e-01 + 1484 3.92581816871e-02 -2.49047975502e-02 -2.12927402499e-01 + 1485 7.10854389542e-02 -3.49532423547e-01 6.83282264300e-02 + 1486 2.14056959303e-01 -3.99688282365e-01 2.12218817620e-01 + 1487 2.85542719477e-01 -3.50758037616e-01 1.23620712584e-01 + 1488 2.14056959303e-01 -3.01010716821e-01 -1.83904988738e-03 + 1489 -3.41211368341e-02 8.60798300494e-02 -2.27346274772e-01 + 1490 -5.25546504192e-02 5.56924108658e-02 -2.36896514346e-01 + 1491 -3.80770362534e-02 4.08700451810e-02 -2.43929449607e-01 + 1492 -2.09621558081e-02 5.61875360750e-02 -2.39906934979e-01 + 1493 -3.73775718681e-02 2.74352696400e-02 -2.36065584524e-01 + 1494 -1.13555190074e-02 4.36941182106e-02 -2.26099880039e-01 + 1495 -5.87442609242e-02 4.29514303968e-02 -2.21584249090e-01 + 1496 -1.13786780813e-01 2.55886676235e-02 -1.05487941714e-01 + 1497 -6.66382819337e-02 2.95129726450e-02 -9.81551179144e-02 + 1498 -4.04652043466e-02 3.15478112034e-02 -1.18030709654e-01 + 1499 -8.16428494599e-02 7.19850565244e-02 -1.20519403819e-01 + 1500 -9.40900453425e-02 5.64711361923e-02 -9.98142473576e-02 + 1501 -6.36528550505e-02 5.16937478163e-02 -9.57330530970e-02 + 1502 -4.52089943647e-02 6.04438985789e-02 -1.08176092651e-01 + 1503 -4.56628606411e-02 3.14024391081e-02 -7.09467023750e-02 + 1504 -4.86740985610e-02 6.03469838487e-02 -7.67867544649e-02 + 1505 -1.35189292876e-02 7.77988280090e-02 -8.59781644798e-02 + 1506 -8.68405057544e-02 7.18396844291e-02 -7.34353965399e-02 + 1507 -5.46965744009e-02 1.18236073330e-01 -8.84668586448e-02 + 1508 -1.18984437108e-01 2.54432955282e-02 -5.84039344351e-02 + 1509 5.04096364779e-02 -4.42548026937e-03 -1.22158009960e-01 + 1510 2.27704730756e-02 -2.48675297011e-02 -1.21755384884e-01 + 1511 4.08188464693e-02 -5.75411946746e-02 -1.04440692335e-01 + 1512 6.52610798687e-02 -5.48043833779e-02 -9.89375448694e-02 + 1513 3.00382762490e-02 -6.13174118239e-02 -8.56454065787e-02 + 1514 -2.42456895169e-03 -1.41950229383e-02 -1.02219802524e-01 + 1515 -1.94432944225e-01 -4.35135368543e-02 -2.73364170785e-01 + 1516 -1.89216941074e-01 -4.27928401676e-02 -2.45331436403e-01 + 1517 -1.42994423017e-01 -5.12036730157e-02 -2.62280422441e-01 + 1518 -1.63617932187e-01 -4.91207587531e-02 -2.84663494811e-01 + 1519 -1.68180127566e-01 -3.39057595161e-02 -2.69022376462e-01 + 1520 -1.55951853246e-01 -3.02227026121e-02 -2.48886622100e-01 + 1521 -1.93365832115e-01 -1.66078460165e-02 -2.75764330483e-01 + 1522 -1.58717780606e-01 -1.27660398447e-02 -2.69175218153e-01 + 1523 -5.33030538695e-02 1.25083770721e-01 2.40639154882e-02 + 1524 -8.61437454886e-02 7.52635331248e-02 -1.71700094735e-02 + 1525 -7.56613551261e-02 8.95877131932e-02 -4.09356258639e-02 + 1526 -5.39998141352e-02 1.21659922026e-01 -3.22014715783e-02 + 1527 -1.28221690219e-02 8.12226767047e-02 -2.97127774134e-02 + 1528 -4.82095917172e-02 6.26295496459e-02 -3.92764964206e-02 + 1529 -4.98313373881e-02 7.65311805669e-02 -5.15740869767e-02 + 1530 -2.67803041483e-02 9.35604755798e-02 -4.92974711572e-02 + 1531 -3.61970257095e-02 1.73973146819e-01 -3.90697521993e-01 + 1532 -3.49738601668e-02 2.03032354950e-01 -3.93881943056e-01 + 1533 -2.79336446193e-02 2.07872237141e-01 -3.74832885042e-01 + 1534 2.88247353276e-02 1.31335270811e-01 -4.14871059281e-01 + 1535 5.63527094566e-02 1.28856713107e-01 -4.03130883357e-01 + 1536 5.08465586036e-02 1.44667197258e-01 -4.27781213328e-01 + 1537 3.06591922332e-02 1.51589730444e-01 -4.43824773935e-01 + 1538 5.37653893039e-02 1.63503550590e-01 -4.19668115624e-01 + 1539 1.67946510835e-02 2.42733031747e-01 -3.41001370575e-01 + 1540 -2.13841937232e-02 2.38272502845e-01 -3.59888624525e-01 + 1541 7.31568383538e-02 1.86656317556e-01 -3.85835988900e-01 + 1542 -1.01883696577e-01 2.35434247174e-01 -4.81978594344e-01 + 1543 -8.42388633176e-02 2.49128180216e-01 -4.62342747319e-01 + 1544 -3.97396191229e-02 2.01014410753e-01 -5.95712555221e-01 + 1545 -6.06819634595e-02 2.41244873603e-01 -5.82676368048e-01 + 1546 -3.69294460835e-02 2.28958317630e-01 -5.62440326846e-01 + 1547 -1.50503774004e-02 1.98042490405e-01 -5.64385771227e-01 + 1548 -2.54164351786e-02 2.52016072798e-01 -5.69329370685e-01 + 1549 1.31586732985e-02 2.17171209546e-01 -5.75692059176e-01 + 1550 1.50870165492e-01 4.64797817558e-02 -3.80298517874e-01 + 1551 1.22463526737e-01 8.14466711583e-02 -4.19064904606e-01 + 1552 7.95758915653e-02 5.63433728709e-02 -4.07046837684e-01 + 1553 1.22278408711e-01 2.97442495642e-02 -3.72286473259e-01 + 1554 1.19560970962e-01 5.32830865977e-02 -3.74127487822e-01 + 1555 9.01868136151e-02 7.88621144799e-02 -3.97914735626e-01 + 1556 2.12449333239e-01 1.15427401222e-01 -3.59022316103e-01 + 1557 1.86139020746e-01 8.99495156878e-02 -3.92174636636e-01 + 1558 2.10860703160e-01 6.91336017986e-02 -3.40270125539e-01 + 1559 1.91525126310e-01 6.15986375036e-02 -3.69822413580e-01 + 1560 9.56723733255e-02 8.36838265261e-02 -4.30083438551e-01 + 1561 9.88674723756e-02 9.29956855513e-02 -4.58103271669e-01 + 1562 1.17793274333e-01 9.46082016479e-02 -4.60097526744e-01 + 1563 9.46870772625e-02 8.26943815024e-02 -4.84254185055e-01 + 1564 1.20985582642e-01 7.99625036228e-02 -5.00321024362e-01 + 1565 8.78042311309e-02 6.35759409401e-02 -4.55299892072e-01 + 1566 -3.53815581639e-01 -2.54818115224e-01 -4.50763500010e-01 + 1567 -2.60712221090e-01 -2.90082200200e-01 -4.72150496555e-01 + 1568 -3.20534165817e-01 -2.66800261434e-01 -4.83489322690e-01 + 1569 -3.25618181037e-01 -2.36136467101e-01 -5.16091892786e-01 + 1570 -3.41990679503e-01 -2.86164263209e-01 -4.94951401409e-01 + 1571 -3.60344959176e-01 -2.49850572598e-01 -5.49586295913e-01 + 1572 -2.62986019255e-01 -3.30769172247e-01 -4.83674201567e-01 + 1573 -3.41990679503e-01 -3.87179448165e-01 -5.99116134378e-01 + 1574 -2.53089322936e-01 -4.15384586124e-01 -5.72311061580e-01 + 1575 -2.35691723862e-01 -4.34248900021e-01 -6.34520877972e-01 + 1576 -1.70785763914e-01 -3.87179448165e-01 -4.86414748773e-01 + 1577 -1.03537585793e-01 -4.01373350031e-01 -5.36781316958e-01 + 1578 -3.73869348855e-01 -2.39646335002e-01 -4.09678432474e-01 + 1579 -3.44443167831e-01 -2.31911815278e-01 -4.19534595989e-01 + 1580 -3.57496850390e-01 -1.89618538894e-01 -4.30818923851e-01 + 1581 2.70293480759e-01 -9.66951600604e-02 -6.04316394580e-01 + 1582 2.40022683547e-01 -8.96287622028e-02 -5.84379435088e-01 + 1583 2.06352375378e-01 -1.20685953975e-01 -5.64726859177e-01 + 1584 2.75685536021e-01 -8.78462990664e-02 -5.55603252871e-01 + 1585 2.51634424296e-01 -8.47587159217e-02 -5.52828818679e-01 + 1586 2.33058132434e-01 -1.03840161676e-01 -5.29210229268e-01 + 1587 2.57771345184e-01 -5.77196407413e-02 -5.42122357488e-01 + 1588 2.32975367834e-01 -7.28222717830e-02 -5.01341242777e-01 + 1589 5.00000000000e-01 -8.76632360015e-03 -6.09149865117e-01 + 1590 4.51840824971e-01 -1.34533373646e-02 -6.12783545565e-01 + 1591 -4.05402011642e-01 -2.30726577094e-01 -3.42802224986e-01 + 1592 -4.38775308803e-01 -1.88038221315e-01 -3.28509095848e-01 + 1593 -3.73869348855e-01 -2.41983954414e-01 -2.84567699617e-01 + 1594 -4.08162963204e-01 -1.83580109405e-01 -2.34010743224e-01 + 1595 -4.24018767961e-01 -3.01126223264e-01 -6.93237305589e-01 + 1596 -3.86028151941e-01 -2.01689334895e-01 -6.24855958383e-01 + 1597 -4.06896639451e-01 -3.33233715066e-01 -6.43057530609e-01 + 1598 -3.73186555559e-01 -3.01531342463e-01 -6.65344676874e-01 + 1599 -3.30915407411e-01 -2.35375123284e-01 -6.10459569166e-01 + 1600 -4.24018767961e-01 -1.34459556597e-01 -6.93237305589e-01 + 1601 -4.43014075971e-01 -2.25844667448e-01 -7.27427979191e-01 + 1602 -5.00000000000e-01 -2.32318148378e-01 -7.25835267031e-01 + 1603 -5.00000000000e-01 -9.84772225671e-02 -6.73752900547e-01 + 1604 -1.41191471557e-01 1.29951052379e-01 -4.90487642878e-01 + 1605 -1.43124291301e-01 1.51995446199e-01 -4.73092652662e-01 + 1606 -1.89189639660e-01 1.13255212948e-01 -4.72276016944e-01 + 1607 -1.65171924194e-01 1.14352178474e-01 -4.63742278081e-01 + 1608 -1.60626425843e-01 1.34785192315e-01 -4.57382376619e-01 + 1609 -1.75123070037e-01 1.40864886578e-01 -4.60951568707e-01 + 1610 -1.59086417840e-01 1.31928258009e-01 -4.31743007025e-01 + 1611 -1.80061380129e-01 1.39619332251e-01 -4.24277110360e-01 + 1612 -1.65134661365e-01 9.98502700945e-02 -4.28463174422e-01 + 1613 1.42477236502e-01 4.26998785639e-01 -5.41719941988e-01 + 1614 1.90751645851e-01 4.06712504369e-01 -5.68588708180e-01 + 1615 1.93934082413e-01 3.60068756554e-01 -6.12900617309e-01 + 1616 5.02838501380e-02 4.26998785639e-01 -7.16737497026e-01 + 1617 9.49848243348e-02 4.51332523759e-01 -6.37813294659e-01 + 1618 1.43063734389e-01 4.30034378277e-01 -6.33941531135e-01 + 1619 1.29289388275e-01 4.06712504369e-01 -6.85267078206e-01 + 1620 -2.23655370650e-01 1.04124643349e-01 -6.07082981272e-01 + 1621 -2.39694005424e-01 7.25392848391e-02 -5.67833648291e-01 + 1622 -2.63094188677e-01 4.14604820426e-02 -6.12586311584e-01 + 1623 -2.39255492818e-01 8.34054414848e-02 -6.36918090134e-01 + 1624 -2.23961416361e-01 7.06234354312e-02 -6.21695926645e-01 + 1625 -2.34755854781e-01 3.83994604519e-02 -6.00400686449e-01 + 1626 -1.84828644045e-01 9.97863888199e-02 -6.30805541705e-01 + 1627 -1.78079186990e-01 3.22774172705e-02 -5.76029436177e-01 + 1628 -1.98178947195e-01 5.65641964391e-02 -6.42381948725e-01 + 1629 -2.01479370243e-01 1.19861447403e-03 -6.20782099471e-01 + 1630 -2.08228827298e-01 6.87075860234e-02 -6.75558204998e-01 + 1631 -4.93768432758e-02 -1.70601852947e-01 9.94528932942e-02 + 1632 6.54093031121e-02 -1.84833350021e-01 1.32597208958e-01 + 1633 6.85899337673e-02 -1.18286371651e-01 1.18603440636e-01 + 1634 1.27871759009e-02 -7.78971339295e-02 9.50343986436e-02 + 1635 -5.72128177491e-02 -8.73014396721e-02 1.98923594492e-01 + 1636 2.19232713339e-02 -1.24555908813e-01 1.87862904535e-01 + 1637 3.51802522699e-02 -8.97150353375e-02 1.63551154400e-01 + 1638 -1.31581468068e-02 -5.32650980854e-02 1.62821030992e-01 + 1639 1.27573322289e-01 -9.21286310028e-02 1.28178714307e-01 + 1640 6.33659507851e-02 -6.27527628009e-02 1.84917241435e-01 + 1641 4.95120142762e-03 5.40327934559e-03 1.94505099842e-01 + 1642 5.75733286388e-02 -1.01532936745e-01 2.32067910156e-01 + 1643 -7.62859377349e-02 6.39990241584e-02 -6.16087507759e-01 + 1644 -1.33932019418e-01 1.15647192264e-01 -6.50834577496e-01 + 1645 -1.48647741942e-01 8.78572672661e-02 -6.25899530390e-01 + 1646 -1.27182562363e-01 4.81382207145e-02 -5.96058471968e-01 + 1647 -1.20766193793e-01 1.03677509696e-01 -5.75193996580e-01 + 1648 -1.44370162896e-01 1.24883459920e-01 -6.11989880131e-01 + 1649 -1.52797418919e-01 1.01731949258e-01 -6.02999769143e-01 + 1650 -1.39870524859e-01 7.98774788873e-02 -5.75472476446e-01 + 1651 -1.78301245981e-01 1.14309590958e-01 -5.98637189604e-01 + 1652 -1.71662818421e-01 8.78167062517e-02 -5.55164960789e-01 + 1653 -1.78412275476e-01 1.55325677801e-01 -6.09941066317e-01 + 1654 4.01939142512e-02 -8.79871573438e-03 -4.52636726932e-01 + 1655 4.11419903770e-02 3.96797107636e-02 -4.52378616687e-01 + 1656 3.59724560419e-02 5.10174742169e-02 -4.20123877013e-01 + 1657 3.29136508114e-02 3.24471426945e-02 -4.04125562298e-01 + 1658 8.68561550051e-02 1.50975144421e-02 -4.55558002317e-01 + 1659 7.19341255043e-02 3.94510553820e-02 -4.54412170359e-01 + 1660 6.03589409712e-02 4.80115418173e-02 -4.29712727185e-01 + 1661 6.64485657939e-02 3.46293433358e-02 -4.22243467433e-01 + 1662 3.38617269372e-02 8.09255691925e-02 -4.03867452053e-01 + 1663 6.70806165445e-02 6.69482943345e-02 -4.22071393937e-01 + 1664 1.11064659216e-02 9.04579965696e-02 -4.17871318581e-01 + 1665 1.22197004793e-02 1.11471598517e-01 -4.07808891966e-01 + 1666 2.77609526756e-02 1.12121180915e-01 -3.95118838743e-01 + 1667 7.74847151518e-03 1.24064464315e-01 -4.25207056733e-01 + 1668 3.84300519661e-03 9.88404942928e-02 -4.48999779039e-01 + 1669 -5.28515124635e-02 1.52309962473e-01 -4.13450001832e-01 + 1670 -3.57487833095e-02 1.57860572945e-01 -4.04492904404e-01 + 1671 5.97107038630e-02 9.52502453610e-02 -3.95795145205e-01 + 1672 7.81626268370e-02 8.11861201754e-02 -4.11466178330e-01 + 1673 7.12529459681e-02 6.28211195010e-02 -5.35799230140e-01 + 1674 9.97526685318e-02 5.81370359839e-02 -5.41953199410e-01 + 1675 8.54082220418e-02 7.73714312603e-02 -5.08044446775e-01 + 1676 8.68193084158e-02 5.68642757804e-02 -5.16469242031e-01 + 1677 1.11007910941e-01 5.17559388621e-02 -5.14128558841e-01 + 1678 5.26530341893e-02 3.37660479380e-02 -5.32617459700e-01 + 1679 7.96081547125e-02 3.55086134982e-02 -5.07904732368e-01 + 1680 1.12285481648e-01 1.71682769796e-02 -5.00111452750e-01 + 1681 7.38859482998e-02 5.55915155769e-02 -4.90985284653e-01 + 1682 -1.03518454250e-01 1.18482661379e-01 -3.25393558511e-01 + 1683 -6.04678403759e-02 1.03552774627e-01 -3.35467171563e-01 + 1684 -5.66737733281e-02 7.58819980831e-02 -3.31479838964e-01 + 1685 -1.23608675200e-01 6.36538858415e-02 -3.51025403429e-01 + 1686 -1.05091108290e-01 9.54006997997e-02 -3.48497547873e-01 + 1687 -7.24099843749e-02 8.99737751306e-02 -3.50276760321e-01 + 1688 -7.38613210093e-02 6.70002576021e-02 -3.52555068175e-01 + 1689 -5.02196678239e-02 9.39413684931e-02 -3.64587253674e-01 + 1690 -4.13015145001e-02 6.14648888817e-02 -3.75159962131e-01 + 1691 7.89335917235e-02 4.01652111420e-01 -2.57180766820e-01 + 1692 6.14677271302e-02 4.50164609075e-01 -2.48127819518e-01 + 1693 4.37825313886e-02 3.68869481893e-01 -1.82919392453e-01 + 1694 -3.30521389103e-02 2.18427959062e-01 -3.55776927583e-01 + 1695 -3.36347307008e-02 1.94500618968e-01 -3.39890834696e-01 + 1696 -1.54061030578e-02 1.27624604730e-01 -3.19962406037e-01 + 1697 -7.66472625527e-03 1.39346554637e-01 -3.34377207558e-01 + 1698 -1.87640974642e-02 1.61231072475e-01 -3.27298144189e-01 + 1699 6.42044093453e-03 9.65882246097e-02 -2.55202227725e-01 + 1700 -2.19855757414e-02 1.15730428577e-01 -2.64176014272e-01 + 1701 2.83567131948e-02 9.40944343829e-02 -2.84566678661e-01 + 1702 1.12236775438e-02 9.08644187381e-02 -2.80305270210e-01 + 1703 -6.11258803706e-03 1.01717952759e-01 -2.94655475403e-01 + 1704 -1.01262944330e-01 1.89562206470e-01 -1.30858005537e-01 + 1705 -1.18934632315e-01 1.99173975260e-01 -1.68901155895e-01 + 1706 -3.64368785975e-02 2.09644179064e-01 -1.36533403871e-01 + 1707 -6.31545672188e-02 1.90156461047e-01 -1.42812569287e-01 + 1708 -8.59354274855e-02 1.97216723996e-01 -1.68356291117e-01 + 1709 -7.57172551601e-02 2.12561956989e-01 -1.72684754784e-01 + 1710 -1.35433976373e-01 1.84789268927e-01 -2.00179178364e-01 + 1711 -8.59352552481e-02 1.86974502686e-01 -1.89026684504e-01 + 1712 -5.17638787295e-02 1.71262997609e-01 -1.61046298452e-01 + 1713 -1.16589944461e-01 1.51181025014e-01 -1.55370900118e-01 + 1714 -1.59312831661e-02 1.20635886822e-01 -2.24001244186e-01 + 1715 -2.40126652472e-02 1.07482048483e-01 -2.38507844410e-01 + 1716 1.04566359847e-02 9.98585301067e-02 -2.28419047668e-01 + 1717 -2.20138036382e-03 9.51874905310e-02 -2.38194546965e-01 + 1718 -1.66993312729e-03 7.68211589248e-02 -2.30649068059e-01 + 1719 -1.33845777321e-01 -5.84738557381e-02 -3.82149174088e-01 + 1720 -1.46170788192e-01 -9.28835505833e-02 -3.90953751206e-01 + 1721 -1.42230606719e-01 -1.17080169297e-01 -3.73731997514e-01 + 1722 -1.57518835056e-01 -5.39675472347e-02 -3.64575995908e-01 + 1723 -1.60844328775e-01 -8.09013954944e-02 -3.75572723291e-01 + 1724 -1.63108721322e-01 -9.30384229404e-02 -3.58964544859e-01 + 1725 -1.76578970532e-01 -8.37160612193e-02 -3.87796601193e-01 + 1726 -1.87842880229e-01 -1.03328935251e-01 -3.68996272495e-01 + 1727 -1.79458050831e-01 -4.47226216921e-02 -3.77413449069e-01 + 1728 -2.23572327909e-01 -2.13534301927e-01 -2.19858547956e-01 + 1729 -1.30798449750e-01 -3.56767150964e-01 -1.24471809859e-01 + 1730 -2.53865633167e-01 -3.05833868432e-01 -1.30372407413e-01 + 1731 -3.61786163955e-01 -2.08750802648e-01 -1.81016075239e-01 + 1732 -2.64427224033e-01 -2.86162973179e-01 -3.02770080179e-01 + 1733 -1.88959673219e-01 -3.57441982120e-01 -2.11541744040e-01 + 1734 -2.66719754914e-01 -3.19073312432e-01 -1.94199708660e-01 + 1735 -3.42951482689e-01 -2.58764416576e-01 -2.49237920960e-01 + 1736 -2.30873343357e-01 -1.53589329836e-01 -4.25277706158e-01 + 1737 -2.18700116914e-01 -1.55967384354e-01 -4.55093350390e-01 + 1738 -2.06730290169e-01 -1.57401273334e-01 -4.43460739153e-01 + 1739 -1.87095521766e-01 -1.79749433402e-01 -4.51891943371e-01 + 1740 -2.41181190872e-01 1.62560232751e-01 -5.48124717078e-01 + 1741 -2.19473940945e-01 1.42508006776e-01 -6.04439838152e-01 + 1742 -2.49958407955e-01 1.70540021130e-01 -5.98551771022e-01 + 1743 -2.28780418429e-01 1.63744014656e-01 -5.82488949616e-01 + 1744 -2.01398110580e-01 1.42790669595e-01 -5.81060053901e-01 + 1745 -2.38086895913e-01 1.84980022535e-01 -5.60538061081e-01 + 1746 -2.22583964309e-01 1.79085135146e-01 -6.02219256465e-01 + 1747 -4.00397026870e-02 -3.99839789353e-01 -6.79528927364e-01 + 1748 -6.22977972998e-02 -3.48883441016e-01 -6.69859977019e-01 + 1749 -9.34466959496e-02 -2.73325161525e-01 -5.89789965529e-01 + 1750 -2.02603750425e-02 -3.42467231073e-01 -6.32894977788e-01 + 1751 -4.18987779132e-02 -3.18593109391e-01 -6.37301752423e-01 + 1752 -5.58650372177e-02 -2.58124145854e-01 -5.73069003231e-01 + 1753 -5.34069932627e-02 -3.73485372172e-01 -7.40261038164e-01 + 1754 -1.06813986525e-01 -2.46970744344e-01 -6.50522076329e-01 + 1755 -2.91719020930e-02 -3.24897619619e-01 -6.73383051655e-01 + 1756 -4.37578531395e-02 -2.37346429428e-01 -5.95074577482e-01 + 1757 9.64914012316e-03 -3.63861057257e-01 -6.84813539318e-01 + 1758 -7.85312364543e-02 -2.43076066926e-01 -4.72365212865e-01 + 1759 -5.15352094607e-02 -2.55521206392e-01 -4.56722550938e-01 + 1760 -3.38268370340e-02 -2.48571433422e-01 -4.77448682863e-01 + 1761 -4.59213975541e-02 -2.37958082788e-01 -4.94785834789e-01 + 1762 -1.84093142540e-02 -2.31535384994e-01 -4.60245625574e-01 + 1763 -2.88423936442e-02 -2.07097334829e-01 -4.77649824818e-01 + 1764 -3.72631115041e-02 -2.33442020235e-01 -4.20554899043e-01 + 1765 -7.69830675346e-02 -1.86472555146e-01 -4.15672571002e-01 + 1766 -6.90250571953e-02 -4.34248900021e-01 -6.34520877972e-01 + 1767 -1.76768792896e-01 -4.50686675016e-01 -6.83390658479e-01 + 1768 6.80737338304e-03 -5.00000000000e-01 -6.60947921592e-01 + 1769 -1.62128417745e-01 -5.00000000000e-01 -7.17298614395e-01 + 1770 8.31730178852e-02 -3.55493582491e-02 -4.46822604979e-01 + 1771 9.99548105098e-02 -1.07016572932e-02 -4.50708162553e-01 + 1772 8.57995344361e-02 -2.52519690525e-02 -4.78462945918e-01 + 1773 9.77292497668e-02 -9.19054063472e-03 -4.73467028865e-01 + 1774 1.16907694939e-01 -9.32114893483e-03 -4.80410462842e-01 + 1775 8.82549591827e-02 8.51261274163e-03 -4.84286544144e-01 + 1776 6.56232408946e-02 -6.72795319684e-03 -4.97190177365e-01 + 1777 1.01354767377e-01 -2.70775457027e-01 -7.21125760986e-01 + 1778 1.57932677615e-01 -2.65326461649e-01 -7.08193218140e-01 + 1779 1.52032151066e-01 -1.56163185540e-01 -6.66688641479e-01 + 1780 2.10576903487e-01 -1.87101948866e-01 -6.67590957520e-01 + 1781 -1.17950473971e-01 1.39895718961e-01 -5.07582827029e-01 + 1782 -1.25210338175e-01 1.53942847680e-01 -4.90262788329e-01 + 1783 -1.11864967616e-01 1.57471798496e-01 -4.75583555972e-01 + 1784 -7.93654718445e-03 1.62548361609e-01 -5.56922885010e-01 + 1785 -7.62895730436e-03 1.41357662790e-01 -5.22332230058e-01 + 1786 -2.38903517817e-03 1.39958592840e-01 -5.48564986658e-01 + 1787 -2.90688737989e-02 1.47773217558e-01 -5.84518225894e-01 + 1788 -1.46280822524e-02 1.22578573884e-01 -5.64175914464e-01 + 1789 -2.86074889788e-02 1.15987169330e-01 -5.32632243466e-01 + 1790 -3.62725428426e-02 7.92669223856e-02 -4.94533700932e-01 + 1791 -3.72067862091e-02 6.41389579165e-02 -5.18861025579e-01 + 1792 -4.50715268315e-02 9.93964548202e-02 -5.06343574531e-01 + 1793 -4.86273504055e-02 9.60209893190e-02 -5.26498415496e-01 + 1794 -1.00752776345e-02 9.08560689296e-02 -4.84685171620e-01 + 1795 -3.05396780224e-02 1.13832396661e-01 -5.03714512856e-01 + 1796 1.99083002071e-01 -9.63935869116e-02 -4.96119025886e-01 + 1797 2.08883958545e-01 -1.06842397124e-01 -4.71925780777e-01 + 1798 2.06310884032e-01 -6.62242889211e-02 -4.49592726239e-01 + 1799 1.97367619063e-01 -6.93148481099e-02 -4.81230322860e-01 + 1800 1.80850281933e-01 -8.78701903746e-02 -4.82341390171e-01 + 1801 1.81306679537e-01 -9.19949316703e-02 -4.61620014860e-01 + 1802 1.45643827063e-01 -9.37773948067e-02 -4.90396197077e-01 + 1803 -3.04497998036e-01 3.49436616380e-01 -6.57793210155e-01 + 1804 -3.01283326066e-01 4.10852899651e-01 -6.93301996851e-01 + 1805 -3.75945763498e-01 3.57577782097e-01 -6.26640779912e-01 + 1806 -3.07600985656e-01 3.48609786399e-01 -6.09131583359e-01 + 1807 -3.06492200217e-01 3.89278365253e-01 -6.16583565559e-01 + 1808 -2.50000000000e-01 5.00000000000e-01 -8.30000000000e-01 + 1809 -2.30526033700e-01 3.89098453456e-01 -7.81860549078e-01 + 1810 -1.98536188308e-01 3.72250289918e-01 -7.25546410234e-01 + 1811 -2.00855550711e-01 4.40568599767e-01 -7.38867997901e-01 + 1812 -2.64714917744e-01 3.29667053224e-01 -6.90728546978e-01 + 1813 2.72733735318e-02 4.40568599767e-01 -6.22189627875e-01 + 1814 4.55969552179e-02 4.18925842645e-01 -6.17510969420e-01 + 1815 -6.66317285600e-04 3.91901123527e-01 -6.63359662585e-01 + 1816 6.07959402905e-02 3.91901123527e-01 -5.46681292559e-01 + 1817 -9.99475928400e-04 3.37851685290e-01 -5.80039493877e-01 + 1818 -2.50000000000e-01 2.50000000000e-01 -8.30000000000e-01 + 1819 -2.30526033700e-01 2.22431786790e-01 -7.81860549078e-01 + 1820 -1.54277038301e-01 1.79056295032e-01 -8.30000000000e-01 + 1821 -1.63602304001e-01 1.76116061367e-01 -7.93895411808e-01 + 1822 -2.18136405334e-01 6.81547484888e-02 -7.81860549078e-01 + 1823 -5.14697386678e-02 2.34821415155e-01 -7.81860549078e-01 + 1824 -7.72046080017e-02 1.02232122733e-01 -7.57790823616e-01 + 1825 1.77455249402e-01 8.31276172152e-02 1.32097202197e-01 + 1826 9.66205688604e-02 5.40847360111e-02 1.87529566695e-01 + 1827 1.17514289020e-01 -9.20265976512e-03 1.82082556177e-01 + 1828 1.78368649434e-01 -1.09365375545e-02 1.43311976339e-01 + 1829 1.31701987001e-01 -1.72060747162e-02 2.12571440238e-01 + 1830 2.30077376613e-01 -2.38085988758e-02 1.69660012511e-01 + 1831 1.07455255752e-01 7.37233114726e-02 2.35986398046e-01 + 1832 2.79959303726e-01 1.51447649342e-01 1.73578500401e-01 + 1833 1.95590408383e-01 -1.05520227336e-01 7.15104883488e-02 + 1834 1.55377337281e-01 -6.54109565280e-02 7.78789602302e-02 + 1835 1.86522828892e-01 -1.11963050604e-02 1.01803845273e-01 + 1836 2.23713373497e-01 -1.98642684433e-02 1.05533159033e-01 + 1837 1.88631955356e-01 5.14265422840e-02 8.04912854900e-02 + 1838 2.45472335496e-01 6.97360208819e-02 7.54289762386e-02 + 1839 3.30314890330e-01 7.73113271118e-02 3.84049170988e-02 + 1840 2.97060272255e-01 -3.95261717002e-02 3.57925918390e-02 + 1841 2.92785030123e-01 8.21728356038e-03 7.02390689796e-02 + 1842 3.89979651863e-01 1.21954794457e-01 6.89676496103e-02 + 1843 3.20051584409e-01 1.49482472733e-02 1.01225607947e-01 + 1844 1.41180198776e-01 6.83854530082e-02 -5.49910062012e-01 + 1845 1.38626264437e-01 5.85882168783e-02 -5.19433133909e-01 + 1846 1.78053551017e-01 7.64917911929e-02 -5.53302562789e-01 + 1847 1.66919762202e-01 6.71172795493e-02 -5.29596741518e-01 + 1848 1.64590473594e-01 8.42098249360e-02 -5.20243204356e-01 + 1849 1.80126512512e-01 1.06817865095e-01 -5.51125167682e-01 + 1850 8.20599284748e-02 7.84910800051e-02 -5.80225932750e-01 + 1851 5.94577859301e-02 7.63904821819e-02 -5.61314385701e-01 + 1852 5.91501960500e-02 9.75811810007e-02 -5.95905040653e-01 + 1853 4.79260222477e-02 9.12332073843e-02 -5.77801603390e-01 + 1854 3.49602941323e-02 5.41200919593e-02 -5.70890193040e-01 + 1855 2.77504398216e-02 8.13338556368e-02 -5.89681214180e-01 + 1856 3.44989093121e-02 8.59061401875e-02 -6.22776175469e-01 + 1857 -3.62439776747e-01 -1.49400941612e-02 -7.47767381382e-01 + 1858 -4.08293184498e-01 -7.56115444856e-02 -6.71013521286e-01 + 1859 -3.74233964344e-01 -1.08314714528e-01 -6.86311669882e-01 + 1860 -3.32311952459e-01 -7.87681376597e-02 -7.42580292812e-01 + 1861 -3.32311952459e-01 -1.44419619371e-01 -6.38415559843e-01 + 1862 -3.62439776747e-01 -1.13417316728e-01 -5.91520281929e-01 + 1863 4.14902397731e-02 -2.46232482635e-01 -2.88389109584e-01 + 1864 1.35230683555e-03 -2.32474617511e-01 -2.87300415702e-01 + 1865 -1.59668368704e-02 -2.61463990999e-01 -3.14621380507e-01 + 1866 1.49853026516e-02 -3.30821655090e-01 -2.01954430310e-01 + 1867 -8.49191277120e-03 -2.99355963133e-01 -2.22746579717e-01 + 1868 -2.33194151107e-02 -3.40975993999e-01 -2.19442610925e-01 + 1869 -2.14664823961e-02 -1.89727378899e-01 -2.58890757014e-01 + 1870 -7.89235590396e-02 -2.04958887263e-01 -2.85123027937e-01 + 1871 -2.69858454612e-02 -2.93151585933e-01 -1.82288861930e-01 + 1872 -5.84740653155e-02 -3.52479443632e-01 -1.57104049849e-01 + 1873 -1.01698867200e-03 -3.37247935267e-01 -1.30871778926e-01 + 1874 -2.49934618053e-01 -1.61423939603e-01 -4.06393617552e-01 + 1875 -2.30156166023e-01 -1.61493689770e-01 -4.06935939524e-01 + 1876 -2.46819614700e-01 -1.37781781351e-01 -3.85038883061e-01 + 1877 -2.21486679777e-01 -1.45755500992e-01 -3.92880223854e-01 + 1878 -3.39183018768e-01 -3.14335840027e-02 -2.51881212401e-01 + 1879 -3.31563987982e-01 -7.53533611488e-02 -2.76536769576e-01 + 1880 -2.94410329354e-01 -3.59406994111e-02 -2.77730688117e-01 + 1881 -2.99889228618e-01 -6.77537534186e-02 -2.89759987069e-01 + 1882 -3.07072520653e-01 -1.02910675165e-01 -2.58602753538e-01 + 1883 -2.73003330611e-01 -8.35920935195e-02 -2.82211715542e-01 + 1884 -2.51342032712e-01 -4.37916825586e-02 -2.60393631350e-01 + 1885 -2.97819114898e-01 -4.26284348893e-02 -1.91357623150e-01 + 1886 -2.39842914301e-01 -1.54445983472e-02 -2.06728322284e-01 + 1887 -2.28183593042e-01 -2.52813756407e-02 -2.47628761372e-01 + 1888 -2.25417665682e-01 -4.27380384081e-02 -2.27340165319e-01 + 1889 -2.20279486893e-01 -4.32922613631e-02 -2.52862533877e-01 + 1890 -2.33083744623e-01 -6.16360945491e-02 -2.63117038030e-01 + 1891 -2.47193141672e-01 -6.99766767097e-02 -2.29960737270e-01 + 1892 1.05694377223e-01 -1.03419048672e-01 -1.88267549518e-01 + 1893 1.03011774580e-01 -1.16454833903e-01 -1.54324815810e-01 + 1894 1.12962180396e-01 -1.39868930795e-01 -1.52157571212e-01 + 1895 1.25352168024e-01 -9.71078216921e-02 -1.28213592384e-01 + 1896 1.40546268711e-01 -6.78806377406e-02 -1.66072081231e-01 + 1897 -6.42924730890e-02 -4.34084667292e-02 2.98459205597e-03 + 1898 1.53357467807e-02 -9.94853281621e-02 -2.47560113161e-02 + 1899 1.94434031290e-02 -5.38696912121e-02 -4.43338309824e-02 + 1900 -1.83168786317e-02 -3.02344202063e-03 -4.02524391295e-02 + 1901 5.32936099433e-03 -1.43004408205e-02 4.68002480245e-02 + 1902 3.52075628797e-02 -6.13876904120e-02 1.37012937869e-02 + 1903 3.33203511162e-02 -3.67003721370e-02 -1.05963972385e-02 + 1904 1.27724792714e-02 2.92023368231e-03 3.37034191133e-03 + 1905 -7.11817882221e-02 7.16243477672e-02 -2.21725908999e-01 + 1906 -6.20618435384e-02 1.09977735401e-01 -2.04590366751e-01 + 1907 -1.02322983668e-01 7.73521111134e-02 -1.87290588905e-01 + 1908 -9.80225483087e-02 4.98739315751e-02 -2.10192723768e-01 + 1909 -8.05336222963e-02 6.01517707551e-02 -2.04437418997e-01 + 1910 -7.75709371985e-02 8.18965035072e-02 -1.87250894165e-01 + 1911 -7.53592154557e-02 3.72123001708e-02 -1.98580149057e-01 + 1912 -6.83279843888e-02 5.83596640069e-02 -1.69871726839e-01 + 1913 -9.90054010541e-02 1.03258061088e-02 -2.04284471243e-01 + 1914 -1.22077225889e-01 5.25507921612e-02 3.94815481138e-02 + 1915 -1.71553616425e-01 1.62684019809e-02 8.70779265497e-03 + 1916 -1.64256619135e-01 1.38197750795e-03 3.51101362820e-02 + 1917 -1.35869925221e-01 1.20799603616e-02 6.36981858249e-02 + 1918 -1.67704669585e-01 7.02278944779e-02 3.31951571770e-02 + 1919 -1.85479782043e-01 4.01472669188e-02 1.47747838500e-02 + 1920 -1.76525492671e-01 2.30127323296e-02 3.30597937715e-02 + 1921 -1.61690654575e-01 3.73549725060e-02 5.14350459633e-02 + 1922 -1.85346315757e-01 -2.42024298187e-02 3.29244303661e-02 + 1923 -1.49662624554e-01 -2.83908714379e-02 8.79148235361e-02 + 1924 -1.94674914932e-01 1.31667123858e-02 3.09192089908e-02 + 1925 -1.81497368917e-01 2.97570626784e-02 5.74117948881e-02 + 1926 -2.17181060121e-01 3.39455042976e-02 2.42140171813e-03 + 1927 -2.13332113281e-01 8.79049967947e-02 2.69087662401e-02 + 1928 -2.21030006961e-01 -2.00139881994e-02 -2.20659628039e-02 + 1929 -1.14436123994e-01 -9.65338256118e-02 -6.09695175412e-01 + 1930 -8.85196625340e-02 -1.14765826316e-01 -6.40023446531e-01 + 1931 -5.11527631582e-02 -1.01821785431e-01 -6.48117382455e-01 + 1932 -8.05837757165e-02 -1.24287752819e-01 -5.90881454495e-01 + 1933 -1.08140337573e-01 -1.29743137907e-01 -6.01866161225e-01 + 1934 -9.02769380833e-02 -1.35114810361e-01 -6.26569618111e-01 + 1935 -6.59514303491e-02 -1.33268444454e-01 -6.27480965920e-01 + 1936 -9.99701004500e-02 -1.45941867903e-01 -6.62257781727e-01 + 1937 -9.84963218770e-02 -1.62681832769e-01 -6.36907898768e-01 + 1938 -6.61177521726e-02 -1.73695795111e-01 -6.43444060810e-01 + 1939 -1.29401113008e-01 -1.68407835291e-01 -6.05021853767e-01 + 1940 -9.55487647309e-02 -1.96161762499e-01 -5.86208132850e-01 + 1941 -1.41606584798e-01 -1.07254641376e-01 -6.63350108739e-01 + 1942 -1.22609635274e-01 -9.35444168173e-02 -6.46401275589e-01 + 1943 -1.09061693270e-01 -7.78412530618e-02 -6.53923175891e-01 + 1944 -1.51250600494e-01 -7.43159465154e-02 -6.28308371196e-01 + 1945 -1.45249170098e-01 -4.11469657312e-02 -6.30544769452e-01 + 1946 1.03691734902e-01 -2.77019235263e-01 -5.61428608925e-01 + 1947 1.09355533619e-01 -2.52049948741e-01 -5.78650154895e-01 + 1948 8.20166502142e-02 -3.14037461556e-01 -6.41487616171e-01 + 1949 6.91278232678e-02 -3.51346156842e-01 -6.50952405950e-01 + 1950 4.66604704333e-02 -3.09944496737e-01 -6.60906775156e-01 + 1951 6.99907056499e-02 -2.14916745106e-01 -5.76360162734e-01 + 1952 -7.22533493845e-02 -8.33349806279e-02 -3.26451435455e-01 + 1953 -7.79761254528e-02 -5.72507962524e-02 -3.02966621468e-01 + 1954 -1.13860026085e-01 -8.06330743725e-02 -2.74314162304e-01 + 1955 -8.61954491441e-02 -8.51595705604e-02 -2.87543368643e-01 + 1956 -8.70020062554e-02 -6.51402847956e-02 -2.79656774856e-01 + 1957 -1.05713909920e-01 -5.54495254154e-02 -2.68208439367e-01 + 1958 -7.81225405053e-02 -6.27012469542e-02 -2.59908669946e-01 + 1959 -1.01750663126e-01 -4.69455889633e-02 -2.32862114257e-01 + 1960 -7.24729719632e-02 -9.15106566806e-02 -2.61864508172e-01 + 1961 1.96657877868e-01 -1.73715616765e-01 -4.66773267285e-01 + 1962 2.26595134094e-01 -1.39193270203e-01 -4.63907834674e-01 + 1963 1.74871342094e-01 -1.63655816900e-01 -4.73073708891e-01 + 1964 2.02770918207e-01 -1.40279006944e-01 -4.69349524031e-01 + 1965 2.02253246883e-01 -1.30707397451e-01 -4.88891401072e-01 + 1966 2.07363949757e-01 -1.27559543224e-01 -4.51525151488e-01 + 1967 5.00000000000e-01 -2.50000000000e-01 -8.30000000000e-01 + 1968 3.33333333333e-01 -3.33333333333e-01 -8.30000000000e-01 + 1969 2.50000000000e-01 -5.00000000000e-01 -8.30000000000e-01 + 1970 4.13833204165e-01 -3.74489737758e-01 -7.49697794800e-01 + 1971 4.42555469443e-01 -2.49659825172e-01 -7.76465196534e-01 + 1972 3.31916602083e-01 -3.12244868879e-01 -7.89848897400e-01 + 1973 2.75888802777e-01 -4.16326491839e-01 -7.76465196534e-01 + 1974 -1.20582998740e-02 2.95604760840e-02 -2.11574398488e-01 + 1975 -4.05402768158e-03 -1.15193002147e-03 -2.23775845389e-01 + 1976 -5.14427695983e-02 -1.89461783530e-03 -2.19260214439e-01 + 1977 -4.36507944852e-02 2.90653508748e-02 -2.08563977855e-01 + 1978 -3.13991443029e-02 2.08997501877e-02 -2.22680047239e-01 + 1979 -3.25099109842e-02 -2.46209584807e-03 -2.34516228090e-01 + 1980 1.83748063077e-02 1.86666522109e-02 -2.28268781803e-01 + 1981 6.76439366608e-03 3.67463112319e-02 -2.17994462524e-01 + 1982 1.35071454238e-02 4.85640176990e-02 -2.29818138237e-01 + 1983 -9.60584912924e-02 3.95063679000e-02 -3.54942254081e-01 + 1984 -8.99695287527e-02 3.46411635299e-02 -3.35060617824e-01 + 1985 -1.20285917968e-01 1.82834577878e-02 -3.46983965482e-01 + 1986 -1.00453969346e-01 1.15154263451e-02 -3.50931962958e-01 + 1987 -9.78598203371e-02 -1.05835708664e-03 -3.36340775078e-01 + 1988 -7.45972699246e-02 2.02240543286e-02 -3.78740740990e-01 + 1989 -8.76116477850e-02 -1.06697632209e-02 -3.65460857189e-01 + 1990 -7.72992634917e-02 -4.06230331514e-02 -3.50838522486e-01 + 1991 -1.10938409939e-01 -1.16103108398e-02 -3.66803308091e-01 + 1992 -2.08998889997e-01 1.90997502180e-02 -3.69840594018e-01 + 1993 -1.90682977044e-01 -2.09693757346e-03 -3.88359482209e-01 + 1994 -1.70071336876e-01 1.07364909800e-02 -3.89945993305e-01 + 1995 -1.75411398789e-01 2.91454256921e-02 -3.78128904877e-01 + 1996 -1.55717506012e-01 -1.34028222480e-02 -3.83177474911e-01 + 1997 -1.56550683449e-01 2.14092320616e-03 -3.62067583072e-01 + 1998 7.96999938995e-02 4.01990157381e-03 -4.20345786074e-01 + 1999 5.27907929698e-02 -1.34670199486e-02 -4.01279040260e-01 + 2000 9.13130258044e-02 -1.25600740106e-02 -4.25511460312e-01 + 2001 7.72445691529e-02 -2.97446802203e-02 -4.14522187849e-01 + 2002 7.31317041130e-03 8.99567583736e-02 -4.73830283227e-01 + 2003 2.81717836717e-02 8.01737118985e-02 -4.87805899022e-01 + 2004 -4.24723228758e-04 4.34576868812e-02 -4.54766448802e-01 + 2005 -1.17511675224e-02 6.54794083621e-02 -4.51803983081e-01 + 2006 -5.25000043161e-03 6.71568779054e-02 -4.69725810211e-01 + 2007 4.46801812772e-03 5.30348867659e-02 -4.77674729736e-01 + 2008 -2.10300227431e-02 6.01564581199e-02 -4.75594244801e-01 + 2009 -1.43430060598e-02 3.54732615180e-02 -4.90451841383e-01 + 2010 -3.86717845350e-02 5.41400439123e-02 -4.51645721400e-01 + 2011 -3.90023617032e-02 7.74842096958e-02 -3.98732991966e-01 + 2012 -4.62657648953e-02 9.78367392008e-02 -3.84910203165e-01 + 2013 -6.18599951472e-02 5.25056214883e-02 -4.32665656465e-01 + 2014 -8.65306279437e-03 3.62251188120e-02 -4.06513394414e-01 + 2015 -1.72367272328e-02 6.06576963160e-02 -4.19635280155e-01 + 2016 -3.99866495175e-02 5.78024663970e-02 -4.13402841765e-01 + 2017 -4.18475139868e-02 4.05623380881e-02 -4.02577438475e-01 + 2018 -1.46629471157e-01 1.48234253942e-01 -2.76166368437e-01 + 2019 -1.29771928377e-01 1.41812896797e-01 -2.58113988563e-01 + 2020 -1.33482399737e-01 1.37841514030e-01 -3.17921966117e-01 + 2021 -1.40414269253e-01 1.64693513633e-01 -2.93610462948e-01 + 2022 -1.29324912644e-01 1.55762680852e-01 -2.75710154415e-01 + 2023 -1.21007214097e-01 1.34884403522e-01 -2.85951053683e-01 + 2024 -1.26106238850e-01 1.81659909455e-01 -2.65165112466e-01 + 2025 -1.41130936866e-01 2.08004772928e-01 -2.86743054290e-01 + 2026 -1.11673591315e-01 1.44859118592e-01 -3.26428589664e-01 + 2027 -1.07769404191e-01 1.40886884571e-01 -3.00323749452e-01 + 2028 -1.01031250439e-01 1.21978501756e-01 -2.90932115280e-01 + 2029 1.45154072032e-01 -5.14068980003e-02 -2.92591340959e-01 + 2030 1.18565271918e-01 -4.03163733878e-02 -3.11701345169e-01 + 2031 7.40061863757e-02 -4.87475615570e-02 -3.16169145549e-01 + 2032 1.17846872784e-01 -1.48366597749e-02 -2.74145778850e-01 + 2033 1.04732072510e-01 -1.56613258719e-02 -2.93089672535e-01 + 2034 7.04149490126e-02 -1.30637688128e-02 -2.89864315243e-01 + 2035 1.12101196326e-01 5.57149848791e-03 -2.96647250877e-01 + 2036 2.37459200943e-01 -2.30300539414e-01 -3.26937981498e-01 + 2037 2.27533948296e-01 -1.61351691959e-01 -3.18880569135e-01 + 2038 2.55379347104e-01 -1.26037171187e-01 -3.37222154687e-01 + 2039 2.26414111355e-01 -2.09864971418e-01 -3.54866618635e-01 + 2040 2.21731444267e-01 -1.63262227826e-01 -3.41841400079e-01 + 2041 2.38360875462e-01 -1.40356059266e-01 -3.61722734094e-01 + 2042 1.89763296841e-01 -1.27717365277e-01 -2.92481571222e-01 + 2043 1.94616841954e-01 -1.41476188660e-01 -3.31895678451e-01 + 2044 2.06003687591e-01 -9.62239162370e-02 -3.56744818660e-01 + 2045 1.88083541430e-01 -2.00487284465e-01 -3.46460645471e-01 + 2046 -2.10069748177e-01 -1.55429610229e-01 -2.44211199673e-01 + 2047 -1.90889214777e-01 -1.59142025524e-01 -2.73648396862e-01 + 2048 -1.88050237943e-01 -1.90050579021e-01 -2.76190669599e-01 + 2049 -2.25788480965e-01 -1.99370535750e-01 -2.85884593789e-01 + 2050 -2.16048043459e-01 -1.65355330010e-01 -2.80111012989e-01 + 2051 -2.00168069588e-01 -1.65658211537e-01 -2.93213957552e-01 + 2052 -2.01368369969e-01 -1.88435975872e-01 -3.01430659607e-01 + 2053 -1.92366650148e-01 -1.49699514740e-01 -3.17665760751e-01 + 2054 -1.90266391000e-01 -1.75886812845e-01 -3.42216715432e-01 + 2055 9.99269581829e-02 -9.74042362418e-02 -2.11804896516e-01 + 2056 6.39252841469e-02 -1.00022737571e-01 -2.25300657735e-01 + 2057 1.21239079495e-01 -7.17070248109e-02 -2.04853699991e-01 + 2058 3.63181632583e-01 -1.67578741924e-01 -3.24009712312e-01 + 2059 3.97386224438e-01 -1.74922667726e-01 -3.72383734508e-01 + 2060 3.63181632583e-01 -1.65241122512e-01 -4.49120445170e-01 + 2061 8.39359371306e-02 -9.16797605165e-02 -5.38912229656e-01 + 2062 1.14476683026e-01 -6.64378356433e-02 -5.84330185512e-01 + 2063 1.06668644530e-01 -4.58442873153e-02 -5.70134666274e-01 + 2064 8.74942523342e-02 -4.81684755879e-02 -5.40327928727e-01 + 2065 1.31708513127e-01 -8.35878635020e-02 -5.41708872880e-01 + 2066 1.36144818392e-01 -6.94572125914e-02 -5.71055295709e-01 + 2067 1.24871755678e-01 -5.32572071084e-02 -5.63727378731e-01 + 2068 1.18156531264e-01 -5.72776392211e-02 -5.41720457852e-01 + 2069 1.38517028527e-01 -4.04496893056e-02 -5.71999095089e-01 + 2070 5.52627827034e-02 -8.60388413665e-02 -3.32204438237e-01 + 2071 7.88925623086e-02 -7.81258944989e-02 -3.68472453166e-01 + 2072 1.04388411291e-01 -7.08298998575e-02 -3.61712710267e-01 + 2073 1.00920864354e-01 -1.07370292623e-01 -3.35226228903e-01 + 2074 7.65808643508e-02 -1.02486156343e-01 -3.50814798924e-01 + 2075 8.89736786429e-02 -9.24396174479e-02 -3.73363219949e-01 + 2076 1.09331283409e-01 -9.23468620034e-02 -3.70486980278e-01 + 2077 7.70264929315e-02 -7.75089422727e-02 -4.11500210995e-01 + 2078 9.10900045029e-02 -9.67995569468e-02 -4.03678647430e-01 + 2079 7.35589459948e-02 -1.14049335038e-01 -3.85013729631e-01 + 2080 2.79008643438e-02 -9.27178837816e-02 -3.81991938965e-01 + 2081 2.00565524771e-01 -1.39936435352e-01 -5.50758786671e-01 + 2082 2.22041555215e-01 -1.22489470784e-01 -5.27613332366e-01 + 2083 2.18314186409e-01 -1.08027313891e-01 -5.08501709072e-01 + 2084 3.53054518461e-01 7.86151877461e-02 -5.54571981837e-01 + 2085 3.36408300482e-01 4.14242465399e-02 -5.30473228741e-01 + 2086 3.46089967348e-01 6.44037882726e-02 -4.99402776018e-01 + 2087 1.70267535736e-01 5.28572583595e-02 -6.04557743831e-01 + 2088 1.61850833464e-01 2.15062019830e-02 -6.12954543010e-01 + 2089 1.98228950069e-01 9.25105682275e-03 -6.15637053985e-01 + 2090 2.15966123786e-01 2.60667126870e-02 -6.10933358191e-01 + 2091 2.01899302446e-01 1.70755208041e-01 7.10413705216e-02 + 2092 3.01266201631e-01 2.80503472028e-01 -4.20312370375e-02 + 2093 3.89979651863e-01 3.25723824671e-01 -4.72989758773e-02 + 2094 3.01266201631e-01 1.44657451885e-01 3.54798466209e-02 + 2095 3.50949651223e-01 2.33493088914e-01 -4.04342280733e-02 + 2096 4.26653101242e-01 2.47969862971e-01 -4.34137176451e-02 + 2097 4.35953188830e-03 3.47279599143e-01 -1.43713421805e-01 + 2098 -1.52087452667e-02 2.70919398714e-01 -2.15124520151e-01 + 2099 -9.79255699887e-03 3.06429452709e-01 -9.13193442850e-02 + 2100 -1.82143371332e-02 3.17445546338e-01 -1.34371344093e-01 + 2101 -3.87844782437e-02 2.56594061785e-01 -1.78864717086e-01 + 2102 -2.86398451784e-02 3.59479071717e-01 -1.23587893196e-01 + 2103 -2.12199289996e-02 3.63971693963e-01 -5.36181680352e-02 + 2104 -4.13817093299e-02 1.04610680812e-01 -1.37819181665e-01 + 2105 -2.32337438857e-02 1.33522110609e-01 -1.47453353372e-01 + 2106 -2.08171936992e-02 1.54790521766e-01 -1.27594277715e-01 + 2107 -1.83682342781e-02 8.21943147709e-02 -1.19709277882e-01 + 2108 -1.05106289579e-02 1.09481978629e-01 -1.31462382608e-01 + 2109 -4.65855719091e-03 1.15647542074e-01 -1.12892675248e-01 + 2110 3.19952502409e-02 2.32518237828e-01 -2.49890120240e-01 + 2111 1.31265182967e-02 2.62012135177e-01 -2.53299426059e-01 + 2112 -2.62750374389e-02 2.63977974086e-01 -2.42952698503e-01 + 2113 3.36378983233e-02 2.65984471961e-01 -2.38196216343e-01 + 2114 -4.41368963530e-02 -3.12738825753e-02 -2.17309952101e-01 + 2115 -2.14945057347e-02 -4.43696101124e-02 -1.97966431405e-01 + 2116 -3.17637207037e-02 -2.43546748999e-02 -2.29239527924e-01 + 2117 -1.25444017418e-02 -3.07787573661e-02 -2.20320372734e-01 + 2118 9.06294726465e-03 -3.68903266535e-02 -1.54766706574e-01 + 2119 -2.29858576681e-02 -3.22292183669e-02 -1.51736785059e-01 + 2120 1.37118894049e-02 -1.83273493181e-02 -1.36947397509e-01 + 2121 -6.10433317019e-03 -9.03228468195e-03 -1.28987680144e-01 + 2122 2.98483477615e-02 -2.24596756980e-02 -1.71674992495e-01 + 2123 2.91184704495e-02 -2.51925623601e-03 -1.42279818435e-01 + 2124 -7.58453173235e-02 -2.31269332793e-02 -2.07326123304e-01 + 2125 -6.90571371905e-02 -3.21491861683e-02 -1.82990688209e-01 + 2126 -6.02499533944e-02 -1.70219020018e-02 -2.01125451324e-01 + 2127 -5.05260453294e-02 -2.10017268353e-02 -1.82834937268e-01 + 2128 -7.04915545718e-02 7.31493468274e-03 -1.97030792624e-01 + 2129 -6.10264930630e-02 1.35136157748e-02 -1.67547692189e-01 + 2130 3.76469714087e-02 1.26865119919e-02 -1.66023527484e-01 + 2131 4.09763899364e-02 4.46148842657e-03 -1.93534879874e-01 + 2132 5.46839157474e-02 1.64842853790e-02 -1.60523558184e-01 + 2133 2.16841672557e-02 -1.61721344232e-02 -2.02792746794e-01 + 2134 3.20712440133e-02 2.44685335152e-03 -2.11408223754e-01 + 2135 -3.09611785889e-01 9.45253691926e-02 -5.12941076077e-01 + 2136 -3.13763266904e-01 8.53874775852e-02 -4.89592683913e-01 + 2137 -2.91207684753e-01 8.30637453354e-02 -5.28952847576e-01 + 2138 -2.94051284614e-01 1.00324190190e-01 -5.15530314326e-01 + 2139 -2.91632104865e-01 9.61652027846e-02 -5.00827798966e-01 + 2140 -4.41648149870e-01 -2.54318012843e-03 -5.00457416202e-01 + 2141 -4.12472224806e-01 -8.91425073596e-02 -5.10714227174e-01 + 2142 -4.26372843062e-01 -6.96706837533e-03 -4.53444262564e-01 + 2143 -4.01830457416e-01 -6.61745826117e-02 -4.44611085333e-01 + 2144 -4.26766640594e-01 1.47750210975e-01 -3.72273546698e-01 + 2145 -3.97615184625e-01 1.91387152624e-01 -3.43842393843e-01 + 2146 -3.46422776938e-01 2.01752991769e-01 -2.75791693636e-01 + 2147 -3.36286943159e-01 1.24104547063e-01 -3.21025845966e-01 + 2148 -3.90857962106e-01 1.39621522820e-01 -3.73998495396e-01 + 2149 -3.77971539751e-01 1.74381401096e-01 -3.52243893581e-01 + 2150 -3.37295386335e-01 1.75623376684e-01 -3.09677260022e-01 + 2151 -4.19656136344e-01 2.24658255129e-01 -3.83461941195e-01 + 2152 -3.86117625939e-01 1.90893552256e-01 -3.81457425061e-01 + 2153 -3.29176438908e-01 2.01012591218e-01 -3.32214240463e-01 + 2154 -2.57865924088e-01 9.02094870920e-03 -3.92817433196e-01 + 2155 -2.88453264609e-01 6.61925476104e-02 -3.85132912995e-01 + 2156 -2.63346452895e-01 7.18465086282e-02 -3.93505791492e-01 + 2157 -2.35499376778e-01 4.60876896866e-02 -4.01534490842e-01 + 2158 -2.91405186850e-01 1.38451895622e-02 -4.48370043225e-01 + 2159 -3.00616992943e-01 5.03515085453e-02 -4.24729493081e-01 + 2160 -2.78745952074e-01 5.85522390750e-02 -4.21110006933e-01 + 2161 -2.65314401056e-01 3.69482699294e-02 -4.35663878312e-01 + 2162 -2.85705961403e-01 7.50626691969e-02 -4.30540864845e-01 + 2163 -2.18333686238e-01 1.40179886348e-02 -4.38796093863e-01 + 2164 -1.96906174538e-01 -5.48477862896e-03 -4.34329815438e-01 + 2165 -2.05958537613e-01 -1.77346822236e-02 -4.09107345893e-01 + 2166 -2.61750259733e-01 -4.06679222096e-02 -4.05492279847e-01 + 2167 -2.34100655951e-01 -2.07736052863e-02 -4.31919771408e-01 + 2168 -2.14088279748e-01 -2.67027822538e-02 -4.30289143203e-01 + 2169 -2.25850556868e-01 -4.19420525252e-02 -4.12127272761e-01 + 2170 -1.99495731634e-01 -3.86106925748e-02 -4.42779713206e-01 + 2171 -2.22218021883e-01 -3.56708822840e-02 -4.51470940514e-01 + 2172 -3.19051238328e-01 -2.02032214712e-01 -5.47171748640e-01 + 2173 -3.03329584936e-01 -2.03701225060e-01 -5.22654583113e-01 + 2174 -2.56460164459e-01 -1.75574447176e-02 -4.68954844760e-01 + 2175 -2.95289522495e-01 -3.58436813566e-02 -4.61044889876e-01 + 2176 -2.80704123121e-01 -4.38630342612e-02 -5.23132653674e-01 + 2177 -2.46736564877e-01 -2.29036799874e-02 -5.10346687292e-01 + 2178 -2.51461072502e-01 -3.97669582726e-02 -4.87301797094e-01 + 2179 -2.75680947207e-01 -5.93609538836e-02 -4.88144144616e-01 + 2180 -2.26966613466e-01 -5.92457545019e-02 -4.81761511708e-01 + 2181 4.76854929051e-02 -8.63095480576e-02 -6.22797180593e-01 + 2182 6.93690302215e-02 -4.54833693585e-02 -5.82270404196e-01 + 2183 9.45851631213e-02 -4.40542164956e-02 -5.98096316586e-01 + 2184 9.63514609129e-02 -6.37527294138e-02 -6.26272660980e-01 + 2185 5.16762901645e-02 -2.51293253372e-02 -6.20543137536e-01 + 2186 6.48017159556e-02 -1.83052804445e-02 -5.94276634290e-01 + 2187 8.48556441969e-02 -2.40279380259e-02 -6.03144511059e-01 + 2188 8.27900030832e-02 -3.04848538148e-02 -6.23611472146e-01 + 2189 1.88455901706e-01 -2.92272075682e-02 -4.15107618648e-01 + 2190 2.06768403689e-01 -5.19675249638e-02 -4.00650398962e-01 + 2191 1.82046721274e-01 -3.11516110745e-02 -4.52554910060e-01 + 2192 -2.52286360696e-01 -2.52510905311e-01 -3.19150266660e-01 + 2193 -2.69949127159e-01 -1.88363608684e-01 -2.72853215941e-01 + 2194 -2.55967629446e-01 -1.87311328981e-01 -2.99205690502e-01 + 2195 -2.68296252124e-01 -2.30181407843e-01 -3.20824670977e-01 + 2196 -2.81726791492e-01 -2.45172953933e-01 -3.10462681428e-01 + 2197 -1.54969964096e-01 -6.39275778241e-02 -1.15853335982e-01 + 2198 -1.80749222270e-01 -8.84130199468e-02 -8.88377902413e-02 + 2199 -2.08297838683e-01 -1.01090920898e-01 -8.71728192554e-02 + 2200 -1.34362148563e-01 -1.15435737095e-01 -1.24794320995e-01 + 2201 -1.31458762190e-01 -9.79762307449e-02 -1.13918791401e-01 + 2202 -1.56671006297e-01 -1.07828149107e-01 -9.41407682407e-02 + 2203 -1.67010678581e-01 -1.22751792794e-01 -9.47984469166e-02 + 2204 -1.78979864031e-01 -1.00220561118e-01 -6.34872154865e-02 + 2205 -2.32307738617e-01 -1.37383904192e-01 -3.48066987600e-02 + 2206 -1.47465362147e-01 -1.22171552941e-01 -7.90080444040e-02 + 2207 -1.58372048498e-01 -1.51728720389e-01 -7.24282004995e-02 + 2208 -1.05044173911e-01 -1.14565377315e-01 -1.01108717226e-01 + 2209 -8.44363583788e-02 -1.66073536586e-01 -1.10049702239e-01 + 2210 -1.25651989444e-01 -6.30572180445e-02 -9.21677322130e-02 + 2211 3.66611830816e-01 -1.81415193299e-01 -5.51227001673e-01 + 2212 3.46862320506e-01 -1.30114921752e-01 -5.75379530085e-01 + 2213 3.53630023321e-01 -2.03936620705e-01 -5.90616530982e-01 + 2214 3.42063342462e-01 -1.59831060193e-01 -5.98883544964e-01 + 2215 2.89417789949e-01 -1.47456598546e-01 -6.26009459587e-01 + 2216 2.80445034982e-01 -2.07427708490e-01 -6.27171895926e-01 + 2217 2.19450998862e-01 1.33914331624e-01 -6.83036881346e-01 + 2218 2.07427722934e-01 5.25378892884e-02 -6.95452599606e-01 + 2219 2.27827862678e-01 3.38693972679e-02 -7.17449832079e-01 + 2220 2.48755099203e-01 8.01047615300e-02 -6.63252783201e-01 + 2221 2.32411617172e-01 3.25248223019e-02 -6.77510596432e-01 + 2222 2.54339675080e-01 1.34081386260e-02 -6.86194750356e-01 + 2223 -5.15202799517e-02 -1.29081323383e-02 -1.52015173037e-01 + 2224 -2.51656217328e-02 -5.14969495964e-02 -1.72294332514e-01 + 2225 -4.60214974293e-02 -3.21892022676e-02 -1.67363736634e-01 + 2226 -7.05484891239e-02 -2.00087944228e-02 -1.36761041863e-01 + 2227 -5.68740427033e-02 -4.33500003004e-02 -1.62310503717e-01 + 2228 -3.10165017956e-02 -7.78920203100e-02 -1.67179781079e-01 + 2229 -1.58801426292e-01 2.08191931731e-01 -1.11193038104e-01 + 2230 -1.95234167340e-01 1.98316203633e-01 -1.13617001678e-01 + 2231 -1.75673888808e-01 2.20534541508e-01 -1.57164173718e-01 + 2232 -1.45761240604e-01 2.23004156980e-01 -1.40224486131e-01 + 2233 -1.48248555835e-01 1.93939205051e-01 -1.22237503608e-01 + 2234 -1.69019426380e-01 1.82604477427e-01 -1.27534967825e-01 + 2235 -1.20823222862e-01 1.67343868595e-01 -8.73108334972e-02 + 2236 -1.55710501526e-01 1.06744349266e-01 -6.82765560380e-02 + 2237 -1.19412130062e-01 1.61956254068e-01 -1.09997522371e-01 + 2238 -1.36150222994e-01 1.28962687140e-01 -1.11823728078e-01 + 2239 -2.43707204127e-01 4.80760872281e-02 -3.66603792706e-01 + 2240 -2.58994391456e-01 3.05369155102e-02 -3.44779914816e-01 + 2241 -2.31365437307e-01 -1.79669907593e-02 -3.61123536373e-01 + 2242 -2.25287901361e-01 1.57401497151e-02 -3.77499540411e-01 + 2243 -2.33996640727e-01 2.48183328641e-02 -3.57310254417e-01 + 2244 -2.40951244479e-01 5.37296693083e-03 -3.39663156394e-01 + 2245 -2.36627844146e-01 6.76036564875e-02 -3.53496972462e-01 + 2246 -2.60122858824e-01 5.20528823111e-02 -2.96742396435e-01 + 2247 -2.26040212939e-01 3.00841275824e-02 -3.45474528157e-01 + 2248 -2.32493904675e-01 3.54897604164e-03 -3.13086017992e-01 + 2249 -2.01690698403e-01 2.38535069836e-01 -6.09653759232e-01 + 2250 -2.76268023802e-01 3.03901302377e-01 -6.64740319424e-01 + 2251 -1.58423861577e-01 3.97376657118e-01 -4.03746871178e-01 + 2252 -1.39804791763e-01 3.72153037846e-01 -4.54699245353e-01 + 2253 -2.38969562243e-01 3.20441305345e-01 -4.06767207403e-01 + 2254 -2.11252557224e-01 3.80294203564e-01 -4.23546815110e-01 + 2255 -1.84081080951e-01 3.65647102498e-01 -4.56811109758e-01 + 2256 -1.93501925539e-01 3.20862803331e-01 -4.56712802836e-01 + 2257 -1.91765049280e-01 3.89278365253e-01 -4.92285575733e-01 + 2258 -3.14566409811e-01 2.26694163849e-01 -4.36443093631e-01 + 2259 -3.26939341249e-01 2.52677599886e-01 -3.61711590882e-01 + 2260 -2.95746014798e-01 2.43490977251e-01 -3.63829807378e-01 + 2261 -2.73962885854e-01 2.25905947914e-01 -4.02254667000e-01 + 2262 -3.15738179165e-01 2.86411730152e-01 -4.49794898302e-01 + 2263 -3.23596210339e-01 2.83828165409e-01 -3.95523294912e-01 + 2264 -3.01036998228e-01 2.69150557052e-01 -3.88659031277e-01 + 2265 -2.88278573409e-01 2.65980397428e-01 -4.22552012325e-01 + 2266 -2.86335817292e-01 2.51889383952e-01 -3.27523164252e-01 + 2267 -2.33359361897e-01 2.25117731980e-01 -3.68066240370e-01 + 2268 -2.96527194367e-01 2.83302688120e-01 -3.72731010492e-01 + 2269 -2.75134655208e-01 2.85623514218e-01 -4.15606471672e-01 + 2270 -8.61283997735e-02 4.40568599767e-01 -6.14570008075e-01 + 2271 -7.79092735938e-02 5.00000000000e-01 -6.43553015262e-01 + 2272 -1.84996066480e-02 4.55426449826e-01 -5.80918728537e-01 + 2273 9.52274184690e-03 5.00000000000e-01 -5.89023640149e-01 + 2274 -9.42798921325e-02 2.16521948411e-01 -4.96927244590e-01 + 2275 -9.15176387991e-02 1.81460664781e-01 -4.77034994887e-01 + 2276 -2.74688421638e-01 -3.35300926474e-01 2.99726446647e-01 + 2277 -2.04808545166e-01 -2.24867626448e-01 2.99282396328e-01 + 2278 -1.59902275250e-01 -3.49532423547e-01 3.32870762311e-01 + 2279 -1.23060464592e-01 -2.89888900014e-01 2.55064805972e-01 + 2280 -1.08557546500e-01 -2.18416931610e-01 2.65897178402e-01 + 2281 -1.28284447574e-01 -2.34355291164e-01 3.21378606771e-01 + 2282 -5.00000000000e-01 2.54372471302e-01 -2.61254482531e-01 + 2283 -4.46437424229e-01 2.90374325165e-01 -1.96933247156e-01 + 2284 -4.59828068172e-01 2.60444612457e-01 -2.67685883932e-01 + 2285 -4.46437424229e-01 3.16438836753e-01 -3.45033444849e-01 + 2286 -4.46437424229e-01 1.80592816610e-01 -2.67522361190e-01 + 2287 -4.19656136344e-01 1.85561487748e-01 -1.61311644657e-01 + 2288 -3.03773124057e-01 -6.85404875758e-02 1.50873198959e-01 + 2289 -4.01886562029e-01 -1.36253895472e-01 4.34979821818e-03 + 2290 -4.34591041352e-01 -2.57502596982e-01 1.69566532145e-01 + 2291 -4.01886562029e-01 -2.84270243788e-01 3.25436599479e-01 + 2292 -4.01886562029e-01 1.19607259979e-02 5.76149988889e-02 + 2293 -4.34591041352e-01 -6.00152837910e-02 -8.98120158142e-03 + 2294 -4.50943281014e-01 -1.70011462843e-01 1.18264098814e-01 + 2295 -4.34591041352e-01 -1.58692849335e-01 2.05076665926e-01 + 2296 -5.00000000000e-01 -2.03835121266e-01 1.07394398766e-01 + 2297 -5.00000000000e-01 -2.03769030214e-01 2.32178399410e-01 + 2298 -4.03059041458e-01 1.27515169145e-01 -6.14089322856e-01 + 2299 -4.36975780658e-01 1.32419841390e-01 -6.32239810340e-01 + 2300 3.18551908452e-01 2.25795981786e-02 -7.54966554719e-01 + 2301 2.48206152613e-01 2.62269199082e-02 -7.73724916039e-01 + 2302 1.64274870151e-01 3.49692265443e-02 -7.54966554719e-01 + 2303 1.01898164272e-01 6.35218792134e-02 -7.40729067330e-01 + 2304 1.16271252488e-01 2.86159492189e-02 -7.03735425342e-01 + 2305 9.10931570090e-02 -2.01351283642e-03 -7.29874070684e-01 + 2306 1.29059166540e-01 5.60958768144e-03 -7.33914056928e-01 + 2307 1.33048732135e-01 -6.09178693143e-03 -7.07872578038e-01 + 2308 1.21855828365e-01 -3.80806736851e-02 -7.26677392497e-01 + 2309 3.33746051367e-01 1.79753103983e-01 -4.64799070915e-01 + 2310 3.06430786077e-01 1.50736891842e-01 -4.96561902058e-01 + 2311 2.09646179116e-01 1.40777600597e-01 -5.04870955958e-01 + 2312 2.05733196088e-01 2.24513786526e-01 -4.98603873394e-01 + 2313 3.03822130725e-01 2.06561015795e-01 -4.92383847015e-01 + 2314 2.90816661919e-01 1.78096878737e-01 -5.09309776347e-01 + 2315 2.21088882558e-01 1.80577346872e-01 -5.19098437044e-01 + 2316 1.72598340519e-01 3.43309224327e-01 -5.14100705054e-01 + 2317 1.66704124415e-01 2.64963836490e-01 -5.31168612620e-01 + 2318 1.98617721635e-01 3.16342524351e-01 -4.92390878904e-01 + 2319 1.71321781073e-01 3.04694601653e-01 -4.97989115684e-01 + 2320 1.66966783854e-01 2.39592802204e-01 -5.03997190937e-01 + 2321 7.86525006670e-02 2.10041661835e-01 -5.76562730237e-01 + 2322 5.68785775115e-02 1.85281568887e-01 -5.93462905644e-01 + 2323 6.81538132450e-02 1.81873028475e-01 -6.39328256846e-01 + 2324 1.15714832408e-01 1.74457968293e-01 -5.96778014127e-01 + 2325 8.85859236199e-02 1.80338195432e-01 -5.65096077165e-01 + 2326 6.97721255150e-02 1.69193992322e-01 -5.80637871988e-01 + 2327 8.15867986719e-02 1.61559106526e-01 -6.06939761571e-01 + 2328 1.58690294274e-01 1.01665849448e-01 -7.32024587564e-01 + 2329 1.64863013475e-01 4.86956382406e-02 -7.29089449704e-01 + 2330 1.11147265435e-01 6.29628853564e-02 -6.34873614569e-01 + 2331 8.64878053224e-02 5.43648852700e-02 -6.99915743046e-01 + 2332 1.01120211222e-01 3.04746862600e-02 -6.82373842626e-01 + 2333 1.22437319930e-01 2.82432866476e-02 -6.33165123502e-01 + 2334 7.92844671473e-02 1.06746239035e-02 -6.92679078615e-01 + 2335 4.64179862605e-02 3.66098912402e-02 -7.24144547239e-01 + 2336 1.32067386299e-01 4.72551380341e-02 -6.09134860713e-01 + 2337 1.35304896954e-01 2.51423758330e-02 -6.14288180877e-01 + 2338 1.79095987921e-01 -1.59400770848e-01 -6.39441828403e-01 + 2339 1.76953396343e-01 -1.83993658580e-01 -5.99020724542e-01 + 2340 2.16238593024e-01 -1.81795447015e-01 -6.46930268702e-01 + 2341 2.27191067006e-01 -2.05655597559e-01 -6.22479012895e-01 + 2342 2.08302416355e-01 -1.38045468423e-01 -6.52616119188e-01 + 2343 2.48090413680e-01 -1.75023470787e-01 -6.58209275992e-01 + 2344 3.34702950448e-01 -2.99499882276e-01 -5.69091946446e-01 + 2345 2.85830363485e-01 -3.08438706855e-01 -5.73804677369e-01 + 2346 3.89801966966e-01 -3.66333254851e-01 -6.56061297631e-01 + 2347 3.39372772613e-01 -3.56329030141e-01 -6.37853508027e-01 + 2348 3.38583865962e-01 -3.58431943843e-01 -6.94208576272e-01 + 2349 -1.83433698072e-02 -3.25614913862e-01 -7.65339994385e-01 + 2350 1.60715160954e-04 -2.04686980875e-01 -7.86893329590e-01 + 2351 7.33472157318e-02 -1.30722411553e-01 -7.10482012447e-01 + 2352 4.88981438212e-02 -2.53814941035e-01 -7.50321341631e-01 + 2353 4.59658291402e-02 -1.81068984502e-01 -7.70241006224e-01 + 2354 6.12877721869e-02 -7.47586460028e-02 -7.50321341631e-01 + 2355 1.50141095407e-01 1.18853406367e-01 -3.22251961549e-01 + 2356 1.90978323746e-01 1.15878855962e-01 -3.26287496336e-01 + 2357 1.85409950660e-01 1.62323140299e-01 -3.34128080311e-01 + 2358 2.17501545756e-01 1.13205275384e-01 -3.08499817945e-01 + 2359 4.91196993248e-02 1.01545725212e-01 -3.08337641873e-01 + 2360 5.69484699759e-02 1.10829966574e-01 -2.92578723276e-01 + 2361 9.92845148496e-03 -1.01736813398e-02 -3.25908521456e-01 + 2362 1.22147741054e-02 -1.34619960729e-02 -3.56348654487e-01 + 2363 -7.66236805297e-03 3.24521665701e-02 -3.59195176525e-01 + 2364 -3.32297662064e-03 2.04357604222e-02 -3.27806202814e-01 + 2365 1.38546854566e-02 1.07929892760e-02 -3.33334990508e-01 + 2366 1.66876451941e-02 1.55896696592e-02 -3.56103902213e-01 + 2367 9.95681673539e-02 1.07012266371e-02 -3.36100498555e-01 + 2368 1.08055724455e-01 1.77743561325e-02 -3.66695193342e-01 + 2369 7.48464849397e-02 3.15171405264e-02 -3.88005009652e-01 + 2370 1.01990772502e-01 1.46106010942e-01 -3.00414931623e-01 + 2371 7.55441488578e-02 1.47151129544e-01 -2.90518944639e-01 + 2372 9.04842440870e-02 2.26018741468e-02 -3.11389037574e-01 + 2373 5.41501633204e-02 -1.06970895780e-02 -2.83655300281e-01 + 2374 5.11227263318e-02 -3.36973916626e-02 -2.99122182164e-01 + 2375 8.65017155370e-05 5.67166062252e-02 -2.39243864892e-01 + 2376 -6.34301985189e-02 7.40118537763e-02 -2.33174692963e-01 + 2377 -5.47663721620e-02 1.00376614202e-01 -2.25567259453e-01 + 2378 -2.61749785440e-02 1.83447085564e-01 -3.20125871944e-01 + 2379 -1.85000551718e-02 4.86929016480e-02 -3.28637132636e-01 + 2380 -5.14352233779e-02 4.76584427277e-02 -3.41911877771e-01 + 2381 -4.86202748858e-02 5.60374249968e-02 -3.23314169543e-01 + 2382 -5.11743253552e-02 7.76461226567e-02 -3.10160240929e-01 + 2383 -7.33714956382e-02 5.01522329546e-02 -3.12547426835e-01 + 2384 -6.15651662729e-02 2.53412103423e-01 -2.25078832304e-01 + 2385 -5.82757801505e-02 2.52582858774e-01 -2.43461388030e-01 + 2386 -1.25360898178e-02 3.56204132676e-02 -3.12734913325e-01 + 2387 9.13881647568e-02 -5.32650412926e-02 -3.57782258041e-01 + 2388 1.38820088528e-01 -5.50379322548e-02 -3.42063721648e-01 + 2389 1.20461984318e-01 -4.58122802318e-02 -3.44028129633e-01 + 2390 7.11248125458e-02 -1.96395942239e-01 -3.88662599670e-01 + 2391 4.95128384448e-02 -1.44556913010e-01 -3.85327269318e-01 + 2392 6.05501259842e-02 -1.22824541657e-01 -3.51023825381e-01 + 2393 7.68747568044e-02 -1.37877870595e-01 -3.35539768590e-01 + 2394 9.51709200957e-02 -1.65888364267e-01 -3.88349059984e-01 + 2395 7.27475681784e-02 -1.41498204105e-01 -3.86230019644e-01 + 2396 7.52168513996e-02 -1.25963602817e-01 -3.60276749111e-01 + 2397 9.09888470848e-02 -1.37045509162e-01 -3.53038352492e-01 + 2398 2.18177036340e-02 -6.81224776411e-02 -1.87117988515e-01 + 2399 1.63304045040e-02 -4.66140023853e-02 -2.13088077475e-01 + 2400 8.88183797620e-03 -3.46372038313e-02 -2.05446916952e-01 + 2401 1.00571818869e-02 -4.49839211505e-02 -1.85586470805e-01 + 2402 4.20867027770e-02 -7.18682514111e-02 -2.18884304846e-01 + 2403 2.65497756004e-02 -8.46961055034e-02 -2.47913182467e-01 + 2404 3.29039786437e-02 -5.48004515268e-02 -2.30420292483e-01 + 2405 1.94851191483e-02 -5.76630876268e-02 -2.53618206776e-01 + 2406 1.90380706813e-02 -5.90564712537e-02 -2.87148991408e-01 + 2407 2.58792028999e-02 -8.67861809437e-02 -2.98209359416e-01 + 2408 1.72606882126e-02 -5.61739435494e-02 -3.31961567456e-01 + 2409 1.32923942231e-02 -3.86483129908e-02 -3.09650463435e-01 + 2410 3.06254709330e-02 -4.88261844809e-02 -3.02842081953e-01 + 2411 3.90486924961e-02 -6.39025620167e-02 -3.15446690807e-01 + 2412 -2.23193777621e-01 2.35457671059e-01 -4.19035579247e-01 + 2413 -1.97792495344e-01 2.22333191985e-01 -4.25457943575e-01 + 2414 -1.88601665500e-01 2.40438222548e-01 -4.06690385640e-01 + 2415 -2.02472243736e-01 2.55222885451e-01 -3.96152956776e-01 + 2416 -1.80459489551e-01 2.38651760018e-01 -3.85585541478e-01 + 2417 -1.97194268932e-01 2.59935523108e-01 -3.59226976102e-01 + 2418 -1.90174646343e-01 2.10600982909e-01 -4.03184456301e-01 + 2419 -1.12473554399e-01 2.47486824027e-01 -3.25831806337e-01 + 2420 -9.21812566838e-02 2.58167612856e-01 -3.45232656314e-01 + 2421 -8.02470537631e-02 2.78352806136e-01 -3.50810657762e-01 + 2422 -2.43516286599e-01 1.88357251632e-01 -3.31639730160e-01 + 2423 -2.13770193828e-01 1.98370672035e-01 -3.02755638977e-01 + 2424 -1.93818685091e-01 2.21757622410e-01 -3.06526848490e-01 + 2425 -2.75448281962e-01 2.18458513063e-01 -3.16753182818e-01 + 2426 -2.45155713543e-01 2.18443263007e-01 -2.98811751266e-01 + 2427 -2.42316547623e-01 2.40725426915e-01 -3.00011261704e-01 + 2428 -2.49087830758e-01 2.16218440016e-01 -2.75726921564e-01 + 2429 -2.46795140486e-01 2.48529274382e-01 -2.65983772371e-01 + 2430 -2.96492741994e-01 2.15128903604e-01 -2.91096654041e-01 + 2431 -4.11360067942e-01 9.17538962777e-02 -3.52317298349e-01 + 2432 -3.88280202239e-01 9.96564588361e-02 -3.58600071960e-01 + 2433 -3.51040269652e-01 7.59901203369e-02 -3.18152164528e-01 + 2434 -3.67040101913e-01 5.23031072496e-02 -2.88504050395e-01 + 2435 -9.49722312665e-02 -5.32328423869e-02 -4.45915700785e-02 + 2436 -7.41507720873e-02 -5.74057711127e-02 -7.00444249634e-02 + 2437 -7.90799215865e-02 -6.44044233045e-02 -1.06558933473e-01 + 2438 -1.22318213276e-01 -1.88069612581e-02 -7.52858333241e-02 + 2439 -1.02976299880e-01 -2.70074630818e-02 -4.91956915307e-02 + 2440 -8.53591883425e-02 -3.66935044525e-02 -6.71343023313e-02 + 2441 -9.23814267603e-02 -3.44551836936e-02 -9.05072671271e-02 + 2442 -4.84001634090e-02 -5.45800476469e-02 -5.89827713386e-02 + 2443 -7.19282546419e-02 -2.79055999218e-02 -5.87898257041e-02 + 2444 -7.57461454184e-02 -2.01541665181e-02 -8.96770345841e-02 + 2445 -9.16384550984e-02 -8.98258560050e-03 -2.77096711896e-02 + 2446 9.80895019802e-02 1.69287041887e-01 -2.04429394974e-01 + 2447 8.93752450567e-02 1.41541235584e-01 -2.12635709888e-01 + 2448 7.84817201692e-02 2.74635982853e-02 -1.60949388490e-01 + 2449 8.35648021301e-02 1.71835254885e-02 -1.35514299776e-01 + 2450 1.78903556863e-01 -1.45735976253e-02 -1.66772246133e-01 + 2451 2.85935704575e-01 2.11049147737e-02 -1.23062564482e-01 + 2452 2.07807711646e-01 -5.65013646519e-02 -2.37041678634e-01 + 2453 1.88496852242e-01 -1.75337307666e-02 -2.12103412225e-01 + 2454 2.66372639182e-01 9.96518681794e-03 -1.67988359464e-01 + 2455 3.05205141098e-01 -6.84692991078e-03 -1.69908852816e-01 + 2456 2.85852858812e-01 4.31364931755e-02 -1.66878608333e-01 + 2457 2.79671542835e-01 1.08374186992e-01 -2.07582851439e-01 + 2458 2.47222440485e-01 9.63810244948e-02 -1.96243858432e-01 + 2459 2.60402106313e-01 1.36326031676e-01 -1.60736563105e-01 + 2460 1.43655890285e-01 -2.51199128257e-02 -1.64790347290e-01 + 2461 1.46810604930e-01 -3.61689980673e-02 -2.05320476591e-01 + 2462 1.28398092980e-01 -3.86798843571e-02 -1.94196994845e-01 + 2463 2.26261405026e-01 1.49760215442e-01 -1.28426362169e-01 + 2464 1.35015206701e-01 1.68859640733e-01 -1.59354082498e-01 + 2465 1.36591954503e-01 6.42982480836e-02 1.21331989036e-02 + 2466 1.09358644834e-01 5.75640817347e-02 -1.17724684010e-02 + 2467 9.93952481217e-02 1.02435175914e-01 2.95600723175e-02 + 2468 7.54830706897e-02 8.07439781723e-02 -8.12310855997e-03 + 2469 1.42072962198e-01 -2.90940754025e-02 -9.17735487646e-02 + 2470 1.03934880074e-01 -6.94218937234e-03 -8.90121892814e-02 + 2471 1.15419943414e-01 9.89374222176e-03 -1.07315861813e-01 + 2472 1.44673685943e-01 7.37795399701e-04 -1.15257992312e-01 + 2473 1.71293771402e-01 -8.56955098093e-02 -8.21782584899e-02 + 2474 2.68649777972e-01 -1.23835033514e-01 -7.24635883781e-02 + 2475 2.53470328552e-01 -1.15263458199e-01 -9.71770944980e-02 + 2476 -4.26766640594e-01 1.08653443593e-01 -1.50123250160e-01 + 2477 -3.83784132029e-01 5.82261507658e-02 -1.63868041157e-01 + 2478 -3.25676198043e-01 4.11082563629e-02 -2.27980461145e-01 + 2479 -3.61652509119e-01 1.08418835865e-01 -1.62636568576e-01 + 2480 -3.45694160564e-01 7.06570181766e-02 -1.69816832220e-01 + 2481 -2.94258880752e-01 6.33887110450e-02 -2.14541375900e-01 + 2482 -3.98909557449e-01 2.49167523411e-02 -1.13500412166e-01 + 2483 -3.43081120356e-01 5.25943750304e-02 -1.38221343247e-01 + 2484 -2.64621680533e-01 3.26605927599e-02 -1.89510414280e-01 + 2485 -3.65712123084e-01 1.00205779990e-01 -1.11653203295e-01 + 2486 -4.11360067942e-01 6.56893846902e-02 -2.04217100657e-01 + 2487 -4.33520050957e-01 9.19309071011e-02 -2.73148774057e-01 + 2488 -4.51177760396e-01 1.29320787174e-01 -2.60063431526e-01 + 2489 -1.50694100308e-01 2.74509471517e-02 -3.43826815469e-01 + 2490 -1.41430676108e-01 2.47386078386e-03 -3.42595383999e-01 + 2491 -1.42247256801e-01 -2.27251839692e-02 -3.54345418577e-01 + 2492 -1.61176119787e-01 1.37371875022e-01 -3.68274863179e-01 + 2493 -1.54083025288e-01 1.66728054430e-01 -4.03288767705e-01 + 2494 -1.25407341683e-01 1.64116812192e-01 -3.83339790723e-01 + 2495 -1.14616047129e-01 1.48133101369e-01 -3.55858349970e-01 + 2496 -1.39156306524e-01 1.26958992273e-01 -4.07474831767e-01 + 2497 -1.41767514613e-01 1.50000739462e-01 -4.17750778589e-01 + 2498 -1.23339629577e-01 1.52224136525e-01 -3.99173543131e-01 + 2499 -1.15456195840e-01 1.37604104088e-01 -3.86130500098e-01 + 2500 -2.27855046840e-01 4.20686901975e-02 -1.05340603228e-01 + 2501 -1.91782774183e-01 7.44065197315e-02 -8.68085796330e-02 + 2502 -1.67516661824e-01 5.80854449971e-02 -7.73403645670e-02 + 2503 -1.73419741974e-01 3.37559928628e-02 -8.18722688315e-02 + 2504 -1.68222085679e-01 3.39013649581e-02 -1.28956276111e-01 + 2505 -1.64051557628e-01 5.81823597273e-02 -1.08729702753e-01 + 2506 -1.52784777498e-01 4.99975936775e-02 -9.61482606735e-02 + 2507 -1.51809536155e-01 3.10820084815e-02 -1.05438828885e-01 + 2508 -1.37347469317e-01 6.60938223969e-02 -6.33402452365e-02 + 2509 -1.27761354384e-01 5.26405615042e-02 -9.30841464887e-02 + 2510 -1.32149813022e-01 6.62391944922e-02 -1.10424252516e-01 + 2511 -4.07283204906e-01 1.98674819091e-01 -4.58193443944e-01 + 2512 -3.77869004980e-01 1.73571261565e-01 -4.31278426894e-01 + 2513 -3.16803507471e-01 1.75029155180e-01 -4.06945743212e-01 + 2514 -3.84626227499e-01 2.25336891369e-01 -4.01122325340e-01 + 2515 -3.68229821907e-01 1.99843705154e-01 -3.95203842204e-01 + 2516 -3.24306429209e-01 2.09573115428e-01 -3.66957191519e-01 + 2517 -1.76056881748e-01 8.06127128534e-02 -3.58798414375e-01 + 2518 -1.71096627761e-01 9.95324335761e-02 -3.61957230643e-01 + 2519 -1.50078526907e-01 1.07721435032e-01 -3.37810071721e-01 + 2520 -1.53450059956e-01 7.01540674490e-02 -3.70767451782e-01 + 2521 -1.55381574914e-01 8.69585193421e-02 -3.70144304631e-01 + 2522 -1.36131156729e-01 8.82265489015e-02 -3.56775223346e-01 + 2523 -1.87154474628e-01 1.10263152843e-01 -3.89263205833e-01 + 2524 -1.60848455209e-01 8.99210274419e-02 -3.91077312754e-01 + 2525 -1.34706268079e-01 9.33043258309e-02 -3.81490194887e-01 + 2526 -2.29733995057e-01 2.05252551736e-01 -5.30360346762e-01 + 2527 -2.57108438703e-01 1.96707437720e-01 -5.26692861319e-01 + 2528 -2.34142941490e-01 1.83369577098e-01 -5.28594767339e-01 + 2529 -9.84517448153e-02 5.26627029689e-02 -4.54468143076e-01 + 2530 -7.71025152467e-02 7.16160857539e-02 -4.51605112596e-01 + 2531 -8.71110097504e-02 8.28485916967e-02 -4.50372534536e-01 + 2532 -1.04679994297e-01 7.39571718210e-02 -4.51870362169e-01 + 2533 -2.82814989692e-01 -2.08888046680e-02 -4.38302404316e-01 + 2534 -2.56811604366e-01 -1.09128463609e-02 -4.49920491869e-01 + 2535 -2.53870607362e-01 1.55684692282e-02 -4.60504946993e-01 + 2536 -2.83710942322e-01 3.38634648334e-02 -5.76365092141e-01 + 2537 -2.74912001553e-01 -5.60537895365e-03 -5.84728708009e-01 + 2538 -2.57303003489e-01 3.34669529427e-02 -5.76281178150e-01 + 2539 -2.42634396699e-01 7.02221978775e-03 -5.81828950732e-01 + 2540 -2.68110820153e-01 5.45826666978e-02 -5.46529983278e-01 + 2541 -2.51511818301e-01 2.54734238429e-02 -5.39976044715e-01 + 2542 -9.99599586536e-02 -1.10625423483e-01 -5.46782307139e-01 + 2543 -1.45461237980e-01 -1.09215448635e-01 -5.45302422791e-01 + 2544 -1.21057792864e-01 -1.20634918350e-01 -5.72466729654e-01 + 2545 -1.49909293806e-01 -1.17075063497e-01 -5.64935710764e-01 + 2546 -1.55112014873e-01 -9.98210500538e-02 -5.87244334973e-01 + 2547 -1.78006129507e-01 -1.38628836949e-01 -5.54729355639e-01 + 2548 -1.48777295945e-01 -1.54745505955e-01 -5.60922706411e-01 + 2549 -7.38772082666e-02 1.11892038141e-01 -5.78930351545e-01 + 2550 -7.88071632640e-02 9.32909018600e-02 -5.57363820882e-01 + 2551 -8.24765054969e-02 6.00438267281e-02 -5.65159133658e-01 + 2552 -3.10162184471e-02 6.80941553468e-02 -5.69789399681e-01 + 2553 -4.45003052308e-02 9.86577876059e-02 -5.60450664897e-01 + 2554 -5.55419972379e-02 8.80154980288e-02 -5.48895688562e-01 + 2555 -5.02331700511e-02 6.40923133305e-02 -5.51269852973e-01 + 2556 -1.75654045609e-01 -6.28964768000e-02 -6.01144064333e-01 + 2557 -1.72553899529e-01 -8.23358346210e-02 -6.06816941921e-01 + 2558 1.01692151718e-01 -4.40971894280e-02 -7.98832956331e-02 + 2559 1.26369963682e-01 -7.12501134667e-02 -7.86812374058e-02 + 2560 3.70918451298e-03 -6.73321946155e-02 -1.65062037255e-01 + 2561 -5.84077017063e-04 -5.01758480040e-02 -1.69427386787e-01 + 2562 -7.18023992627e-02 -8.94205812403e-02 -2.11568331223e-01 + 2563 -8.40646410147e-02 -5.10357075873e-02 -1.91902870480e-01 + 2564 -7.32937511961e-02 -7.72801894949e-02 -1.65338684877e-01 + 2565 -5.87042174181e-02 -8.15309303484e-02 -1.81362265726e-01 + 2566 -7.11754441933e-02 -5.47146878316e-02 -1.74164686543e-01 + 2567 -8.50588756370e-02 -4.29421130903e-02 -1.61083106249e-01 + 2568 -1.04030150257e-01 -2.27190460692e-02 -2.06098725836e-01 + 2569 -8.54039001584e-02 -3.95473875658e-02 -2.07926401233e-01 + 2570 -7.76754920383e-02 -6.13078633273e-02 -2.26377885313e-01 + 2571 -1.41339858952e-01 -7.22213020245e-02 -1.47144635662e-01 + 2572 -1.19865819054e-01 -7.59329842349e-02 -1.50947483617e-01 + 2573 -1.33152175343e-01 -4.77324665887e-02 -1.48501463994e-01 + 2574 -1.16106920875e-01 -4.20439762503e-02 -1.51488972076e-01 + 2575 -1.39509684237e-01 -3.40403719765e-02 -1.28092873652e-01 + 2576 -1.17120556981e-01 -1.86615891628e-02 -1.22369840603e-01 + 2577 -3.14647567668e-02 2.14629380792e-02 -1.39528284898e-01 + 2578 -3.17255310073e-02 -3.40703581760e-04 -1.34883747356e-01 + 2579 -3.78127541407e-02 -8.85335385911e-04 -1.19003851347e-01 + 2580 -1.05203537963e-01 1.12490211298e-01 -7.83717073414e-02 + 2581 -1.08999006796e-01 1.25387149203e-01 -1.04038104934e-01 + 2582 -8.56432594312e-02 1.34708549172e-01 -1.21918879382e-01 + 2583 -1.06332066815e-01 8.35714874381e-02 -1.03105121225e-01 + 2584 -1.08896536227e-01 1.00473871832e-01 -1.16171565949e-01 + 2585 -9.32918811271e-02 9.83837126878e-02 -1.32136569252e-01 + 2586 -1.26963190169e-01 9.45531379996e-02 -1.25406468383e-01 + 2587 -1.12589534490e-01 8.84575323666e-02 -1.53971424556e-01 + 2588 -1.09797171012e-01 8.34745727079e-02 -7.17157830393e-02 + 2589 -1.09495159388e-01 6.90394394606e-02 -9.19298245277e-02 + 2590 -7.23283943602e-02 1.21083156655e-01 -1.71271202402e-01 + 2591 -6.64511210404e-02 1.20134128880e-01 -1.43669754483e-01 + 2592 -4.65727940297e-02 1.37936839211e-01 -1.49432740058e-01 + 2593 -4.38648672393e-02 1.44503761171e-01 -1.69754700530e-01 + 2594 -5.27414439533e-02 1.53587356182e-01 -1.36853151849e-01 + 2595 -5.00399434616e-02 3.93375066148e-02 -1.74088963021e-01 + 2596 -5.98853769936e-02 2.82325230858e-02 -1.94565970639e-01 + 2597 -5.98274294712e-04 2.41641171526e-01 1.95902286736e-01 + 2598 3.71764603914e-02 1.28224378307e-01 1.43259095365e-01 + 2599 3.10137618685e-03 8.41492434056e-02 1.94970828807e-01 + 2600 -3.28235332585e-02 1.18820072564e-01 2.47148291213e-01 + 2601 -2.58219852767e-02 1.35051480605e-01 1.56642125661e-01 + 2602 7.76907484138e-03 9.49701820997e-02 1.34633385105e-01 + 2603 -1.04353919246e-02 7.02273799755e-02 1.75573612751e-01 + 2604 -3.88975875919e-02 8.87006449380e-02 2.03892849004e-01 + 2605 -1.37144311345e-02 1.30894494588e-02 1.68797388090e-01 + 2606 -5.80472442406e-02 1.22303816442e-02 2.07888130138e-01 + 2607 1.19527494094e-02 2.16346873868e-02 1.03998934289e-01 + 2608 -5.10456962588e-02 2.84617896853e-02 1.17381964585e-01 + 2609 -1.38893863707e-01 7.96475707134e-02 -1.43975039621e-02 + 2610 -1.32257388174e-01 6.15794789850e-02 -2.90663141198e-02 + 2611 -1.20530831498e-01 3.89970438447e-02 -9.46119316064e-03 + 2612 -1.63706613565e-01 8.24000460738e-02 -6.28747228003e-04 + 2613 -1.52526069451e-01 6.81608584374e-02 -1.50725440298e-02 + 2614 -1.51464592092e-01 5.52996948280e-02 2.66212663962e-03 + 2615 -1.62675683971e-01 7.33642138628e-02 -3.32572414110e-02 + 2616 -1.66158275194e-01 5.66741461615e-02 -1.57475840975e-02 + 2617 -1.84521307403e-01 9.73246730301e-02 -2.06838948989e-02 + 2618 -1.42154652609e-01 1.00182410702e-01 1.30573216732e-01 + 2619 -9.66001744340e-02 6.43221001939e-02 1.23977590659e-01 + 2620 -1.14287657807e-01 3.34177763166e-02 1.11956668284e-01 + 2621 -1.45908638582e-01 3.58957696323e-02 1.09244020134e-01 + 2622 -1.32115939249e-01 7.63666014318e-02 8.50273824228e-02 + 2623 -1.05092524919e-01 6.03983308496e-02 9.58122431437e-02 + 2624 -1.16235049828e-01 3.82010302778e-02 9.38378882418e-02 + 2625 -1.37964834351e-01 4.14474438086e-02 8.59898627939e-02 + 2626 -1.00354160406e-01 3.54591237178e-05 1.02648394061e-01 + 2627 -1.07595182234e-01 1.75405701362e-02 8.15927787451e-02 + 2628 -8.65614610738e-02 4.05062909233e-02 7.84317563496e-02 + 2629 -1.37287166791e-01 -4.54020078558e-03 -1.16838274393e-01 + 2630 -1.73577370035e-01 1.00159743750e-03 -1.32483830657e-01 + 2631 -1.59929136804e-01 7.11202196018e-03 -1.13963856602e-01 + 2632 -1.51636187928e-01 -1.96773210378e-02 -9.89714370930e-02 + 2633 -1.77042474232e-01 9.04682707297e-04 -1.01094492471e-01 + 2634 -2.06071492794e-01 -1.13646237032e-02 -1.22439771489e-01 + 2635 -1.01784712029e-01 1.15285403201e-02 -5.31259808844e-03 + 2636 -9.31848494889e-02 4.57116271597e-03 2.12330700849e-02 + 2637 -5.87977634792e-02 4.08376519961e-02 1.35242537721e-02 + 2638 -7.88599880221e-02 3.57061998401e-02 -1.04518089636e-02 + 2639 -8.96642974887e-02 3.99173479204e-02 2.03153030572e-03 + 2640 -7.98909176157e-02 4.47420320511e-02 2.21766852193e-02 + 2641 -9.81215722887e-02 6.76926194703e-02 1.71384305564e-03 + 2642 -8.76901398791e-02 8.88172814413e-02 3.17727318010e-02 + 2643 -1.71873745209e-01 2.13709092612e-01 -3.13850782984e-01 + 2644 -1.47763683233e-01 2.36920953364e-01 -3.07957940138e-01 + 2645 -1.69162602899e-01 2.33970148018e-01 -3.22985015196e-01 + 2646 -1.82888848716e-01 2.46089519685e-01 -3.21147136271e-01 + 2647 -1.80671613671e-01 2.11364882498e-01 -3.48282446170e-01 + 2648 -1.74124134437e-01 2.39161026411e-01 -3.48984201391e-01 + 2649 -2.09327386852e-01 1.24041025656e-01 -3.57913210539e-01 + 2650 -2.07424665544e-01 1.44484323153e-01 -3.31744041564e-01 + 2651 -2.00160680172e-01 1.51317508185e-01 -3.91886510227e-01 + 2652 -2.04484729937e-01 1.28596482345e-01 -3.98008189647e-01 + 2653 -2.16781850278e-01 1.34346554579e-01 -3.72309447223e-01 + 2654 -2.17998190549e-01 1.51410595885e-01 -3.59662080135e-01 + 2655 -2.33403020385e-01 1.17375600974e-01 -3.52732384219e-01 + 2656 -2.35317093776e-01 1.33338114432e-01 -3.73654308571e-01 + 2657 -2.46409225929e-01 1.58429956316e-01 -3.55355688613e-01 + 2658 -2.89581731977e-01 8.77085144114e-02 -3.37095394614e-01 + 2659 -2.64098764474e-01 8.61904864956e-02 -3.61480779239e-01 + 2660 -2.86356908216e-01 1.37480458898e-01 -3.36330806371e-01 + 2661 -2.77612225085e-01 1.09004600036e-01 -3.23134669726e-01 + 2662 -2.61492376181e-01 1.02542057693e-01 -3.44913889416e-01 + 2663 -2.61948881967e-01 1.19371782820e-01 -3.60971053743e-01 + 2664 -2.42309633198e-01 9.56013614197e-02 -3.34069054958e-01 + 2665 -2.56898035063e-01 1.01824826798e-01 -2.95977808193e-01 + 2666 2.65998587642e-03 1.89002576187e-01 -6.38457585785e-01 + 2667 -2.20495023485e-02 1.79263401499e-01 -6.06229455633e-01 + 2668 1.32160259325e-02 1.90034600695e-01 -5.92882458270e-01 + 2669 -7.95510025022e-03 1.82472213552e-01 -5.80105142535e-01 + 2670 -1.08460667303e-01 1.19743225552e-01 -5.30101480096e-01 + 2671 -1.26956761555e-01 9.97223122653e-02 -5.24265622478e-01 + 2672 -1.10629623793e-01 1.18943946545e-01 -5.09244810161e-01 + 2673 -1.23683338791e-01 1.05330244685e-01 -4.98402015104e-01 + 2674 -6.92116853935e-02 1.38193889743e-01 -4.47860989697e-01 + 2675 -6.97758837447e-02 1.43591680338e-01 -4.71339041105e-01 + 2676 -8.15664929564e-02 1.54947956676e-01 -4.79825704261e-01 + 2677 -1.12489503543e-01 1.15167659793e-01 -3.68807408845e-01 + 2678 -1.13651250973e-01 1.15512272226e-01 -3.88274256723e-01 + 2679 -1.28849676473e-01 1.01051587062e-01 -4.03218396710e-01 + 2680 -1.46168579701e-01 8.29791056097e-02 -4.17210625146e-01 + 2681 -1.47968970824e-01 6.77805690427e-02 -4.65724777442e-01 + 2682 -1.34724786007e-01 6.15993049085e-02 -4.42051693827e-01 + 2683 -1.54326796872e-01 6.69880863474e-02 -4.34101657492e-01 + 2684 -1.69690257039e-01 7.29051895831e-02 -4.47233701124e-01 + 2685 -6.89227576630e-02 1.43368999236e-01 -4.21756201463e-01 + 2686 1.00978356645e-01 1.51206976760e-01 -6.43371549450e-01 + 2687 8.99790873232e-02 1.12818128161e-01 -6.39360695559e-01 + 2688 2.52498081488e-02 8.64651340445e-02 -7.28631628229e-01 + 2689 5.78255038624e-02 1.33638314016e-01 -7.02885504564e-01 + 2690 8.50259887583e-02 1.22697453844e-01 -6.90028662088e-01 + 2691 7.23756865812e-02 8.76017138062e-02 -7.02907130373e-01 + 2692 1.44802169368e-01 1.58929773644e-01 -6.51425695946e-01 + 2693 1.08924407944e-01 1.18342810795e-01 -7.10950463964e-01 + 2694 2.52692476432e-03 -1.16433288791e-02 -5.44272433291e-01 + 2695 -2.02062940980e-02 -6.44304618921e-03 -5.00842412227e-01 + 2696 -1.12596079853e-02 -4.00096102222e-02 -4.93544337942e-01 + 2697 4.58034450228e-03 -5.93930335837e-02 -5.11610311332e-01 + 2698 2.13604195078e-02 -1.02210223068e-02 -4.98454580112e-01 + 2699 -7.28913149243e-05 -7.22826937094e-03 -4.84773850462e-01 + 2700 1.60377257386e-03 -3.22068866003e-02 -4.83317435190e-01 + 2701 1.64515344186e-02 -4.25282609673e-02 -4.91952449865e-01 + 2702 -1.81528743600e-02 -5.41927508938e-02 -4.68180290267e-01 + 2703 6.63376424023e-03 -1.07142738288e-01 -4.78948189372e-01 + 2704 1.29605517705e-03 -3.90614058406e-02 -4.62999102489e-01 + 2705 2.34138392457e-02 -5.79707270113e-02 -4.65792458152e-01 + 2706 -1.37279935455e-03 -5.02073961683e-03 -4.55024559047e-01 + 2707 -7.99476675303e-02 3.46942141462e-02 -4.55449559105e-01 + 2708 -6.58032931096e-02 2.74229328992e-02 -4.85821575360e-01 + 2709 -1.04661112745e-01 3.07744177497e-02 -4.62780857961e-01 + 2710 -1.03469344869e-01 2.46202981196e-02 -4.85472635083e-01 + 2711 -1.25234979339e-01 4.14468114994e-02 -4.64570346894e-01 + 2712 -1.33734260823e-01 3.75518289290e-02 -4.99502757043e-01 + 2713 4.72585025853e-03 1.24603595857e-01 -4.90367515494e-01 + 2714 -1.43227320057e-02 1.33398959923e-01 -5.03218935453e-01 + 2715 1.43933801475e-02 1.41073010664e-01 -4.44338343360e-01 + 2716 1.40047054792e-02 1.29926546099e-01 -4.66577253773e-01 + 2717 4.37383244371e-02 1.55863204087e-02 -3.86057492729e-01 + 2718 2.25642124584e-02 9.49257331078e-03 -3.80237108393e-01 + 2719 8.28972604843e-03 1.87018724686e-02 -3.90342359994e-01 + 2720 2.15411541540e-02 -1.19075692934e-02 -3.88444678635e-01 + 2721 -3.82104613149e-04 -8.79369185870e-03 -4.07706341158e-01 + 2722 -3.81493009627e-01 -3.39623197407e-01 -5.78713551057e-01 + 2723 2.41322710865e-01 -1.01201771834e-01 -6.42972275095e-01 + 2724 2.62908635231e-01 -1.38146197755e-01 -6.49578103722e-01 + 2725 2.72803626431e-01 -1.28902949852e-01 -6.71121404212e-01 + 2726 2.10654425595e-01 -2.46096148738e-01 -5.84089170733e-01 + 2727 2.27517935324e-01 -2.44591775508e-01 -5.51678454729e-01 + 2728 2.24665072169e-01 -2.83949692531e-01 -5.35043580968e-01 + 2729 2.49658419840e-01 -2.47057257664e-01 -6.12524643689e-01 + 2730 2.52555053575e-01 -2.45688700511e-01 -5.81107738447e-01 + 2731 2.58998850889e-01 -2.72292953526e-01 -5.79827583846e-01 + 2732 2.74045008248e-01 -2.18812815343e-01 -5.80400271524e-01 + 2733 2.94455681555e-01 -2.45281252284e-01 -5.78126306161e-01 + 2734 -3.75842177936e-01 1.13810143168e-01 -4.86376387361e-01 + 2735 -3.57208839416e-01 1.13557895478e-01 -5.04691755622e-01 + 2736 -1.73766293348e-01 1.38870179841e-01 -4.05609694633e-01 + 2737 -1.59608843327e-01 1.33289162262e-01 -4.15875971063e-01 + 2738 -1.63815147506e-01 1.12357471737e-01 -4.08400404007e-01 + 2739 -2.63032368514e-01 1.45029773096e-01 -4.71352966973e-01 + 2740 -2.43257510673e-01 1.41491897266e-01 -4.69398093173e-01 + 2741 -2.50557483753e-01 1.29560937488e-01 -4.56077612352e-01 + 2742 -2.33215950271e-01 1.22046075065e-01 -4.49682578278e-01 + 2743 -2.54361564818e-01 1.17660202868e-01 -4.69604097377e-01 + 2744 -3.06828070006e-01 8.84489149632e-02 -2.80672847787e-01 + 2745 -2.89109783771e-01 1.09498200403e-01 -2.85519638508e-01 + 2746 -2.74688399371e-01 1.09111055405e-01 -2.61055530234e-01 + 2747 -2.81693462060e-01 9.49491501118e-02 -2.49669633661e-01 + 2748 -2.48406772098e-01 1.03866424668e-01 -2.59872940598e-01 + 2749 -2.45773552496e-01 8.00012513601e-02 -2.42202800923e-01 + 2750 -3.04008696373e-01 1.84540651240e-01 -3.19880566959e-01 + 2751 -3.08749032540e-01 1.33268621804e-01 -3.12421637294e-01 + 2752 -3.16389842577e-01 1.69616725334e-01 -3.06061250004e-01 + 2753 -3.15506255059e-01 1.85034251608e-01 -2.82265535740e-01 + 2754 -3.97615184625e-01 1.65322641037e-01 -1.95742196151e-01 + 2755 -2.87035052921e-01 2.84274546962e-01 -2.22968767725e-01 + 2756 -3.58023368614e-01 2.20337011165e-01 -1.60526912210e-01 + 2757 -3.56900846757e-01 1.96463995278e-01 -1.86546008942e-01 + 2758 -3.09201129010e-01 2.31131347180e-01 -2.36846944863e-01 + 2759 -3.62763704781e-01 1.69064981729e-01 -1.53067982546e-01 + 2760 -1.74007095315e-01 1.29565322712e-01 -1.71517052764e-01 + 2761 -1.67430732972e-01 1.59176052755e-01 -1.96007187380e-01 + 2762 -1.94257341261e-01 1.83006234475e-01 -1.67330517615e-01 + 2763 -1.84262508017e-01 1.91854054066e-01 -1.86744752364e-01 + 2764 -1.68541928634e-01 2.19822198619e-01 -1.86438601349e-01 + 2765 -2.20739055694e-01 3.66532329309e-02 -3.34992665972e-02 + 2766 -2.20593580060e-01 6.49868434961e-02 -3.92159184939e-02 + 2767 -1.84448852450e-01 3.11114347078e-02 -1.78537103329e-02 + 2768 -1.95300401047e-01 3.38507485802e-02 -3.97254335567e-02 + 2769 -1.86723865743e-01 5.18056608401e-02 -4.56119238076e-02 + 2770 -2.24442526900e-01 1.10273509990e-02 -6.37032830159e-02 + 2771 -1.89289830303e-01 1.58326658421e-02 -6.19368334890e-02 + 2772 -1.70007222034e-01 2.71465366440e-03 -4.02349486195e-02 + 2773 -2.05594008584e-01 -2.68080982250e-02 -3.82548110445e-01 + 2774 -2.42788489997e-01 -4.20969248824e-02 -3.80138066415e-01 + 2775 -2.20604155282e-01 -4.26952719509e-02 -3.91452864458e-01 + 2776 -2.08183565680e-01 -5.99340121709e-02 -3.90998008212e-01 + 2777 -2.53894290070e-01 -8.70252997721e-02 -2.78799749504e-01 + 2778 -2.70237403251e-01 -1.01048756287e-01 -2.61923119489e-01 + 2779 -9.79223524147e-02 1.65232025967e-01 -4.69444946254e-01 + 2780 -4.36975780658e-01 2.99086508057e-01 -6.32239810340e-01 + 2781 -4.52731835494e-01 2.24314881043e-01 -6.81679857755e-01 + 2782 -5.00000000000e-01 2.23551824778e-01 -7.13314598086e-01 + 2783 -1.97942159326e-01 2.34365863628e-01 -5.36921258497e-01 + 2784 -1.60280431777e-01 2.36953134891e-01 -5.20303132409e-01 + 2785 -1.92913481320e-01 2.30555281457e-01 -5.59226705288e-01 + 2786 -1.53728130500e-01 9.29723777728e-02 -4.88583346762e-01 + 2787 -1.72023949120e-01 8.11855118966e-02 -5.09537619965e-01 + 2788 -1.68579305242e-01 9.05178909956e-02 -4.69000397193e-01 + 2789 -1.85726909236e-01 8.18418181524e-02 -4.76442262806e-01 + 2790 -2.08583020036e-01 1.14743693027e-01 -4.89283354320e-01 + 2791 -2.01137627124e-01 9.08115269102e-02 -4.88156204372e-01 + 2792 -1.97139226343e-01 9.33638923256e-02 -5.14124423000e-01 + 2793 -6.20860431159e-02 1.81766837581e-01 -6.54165606268e-01 + 2794 -8.91236849501e-02 1.51528371681e-01 -6.56422451846e-01 + 2795 -6.44316520365e-02 1.76271391217e-01 -6.26067503533e-01 + 2796 -8.32386162328e-02 1.54280598495e-01 -6.18206033007e-01 + 2797 -9.03524464488e-02 1.89774727292e-01 -6.25668919225e-01 + 2798 -1.31523289949e-01 1.63540206247e-01 -6.13677421281e-01 + 2799 -1.21871077344e-01 2.16262070599e-01 -5.94652945422e-01 + 2800 -9.34059978698e-02 2.22757495294e-01 -6.08402687844e-01 + 2801 -2.62796011930e-01 1.56105303949e-01 -5.88823293367e-01 + 2802 -2.46752235249e-01 1.32605721987e-01 -5.89505845569e-01 + 2803 -1.10066486949e-01 8.78145495630e-02 -5.54872917572e-01 + 2804 -1.27069661959e-01 7.39302664899e-02 -5.60162047223e-01 + 2805 -1.14344065995e-01 5.07883569089e-02 -5.68782567831e-01 + 2806 -1.43997570034e-01 7.72406806004e-02 -5.41520227045e-01 + 2807 -1.33373130125e-01 4.41830232841e-02 -5.45130097867e-01 + 2808 -1.98842876743e-01 -8.53762441966e-02 -3.95389232520e-01 + 2809 -2.13773451946e-01 -9.90048878766e-02 -3.85386557163e-01 + 2810 -1.06977548822e-01 -3.58996690836e-02 4.54497077960e-02 + 2811 -1.48754278754e-01 -6.97277474530e-02 1.86975722773e-02 + 2812 -1.90985181586e-01 -8.28873878150e-02 2.65540623880e-02 + 2813 -1.44995034868e-01 -3.06044421222e-02 2.29444842627e-02 + 2814 -1.66823210805e-01 -5.72993076396e-02 8.50668850704e-03 + 2815 -2.01000123377e-01 -6.19295879431e-02 1.03473873241e-02 + 2816 -1.48300105853e-01 -9.03961854606e-02 -1.59110533520e-02 + 2817 -1.72543406222e-01 -6.69354530402e-02 -1.79626898360e-02 + 2818 -2.26668872789e-01 -7.86989461957e-02 -2.84363307819e-02 + 2819 -1.42661240025e-01 -3.17112274643e-02 -9.54068537396e-03 + 2820 -1.42974788433e-01 -3.41372867067e-02 -9.67035354663e-02 + 2821 -1.34378372455e-01 -1.91694551003e-02 -1.10670638848e-01 + 2822 -1.17741850357e-01 -3.95996093249e-03 -1.01047871880e-01 + 2823 -3.53802748748e-01 -9.48935045523e-02 -5.21257036147e-01 + 2824 -3.20447783375e-01 -1.11076710798e-01 -5.75127739318e-01 + 2825 -3.21571949934e-01 -7.86401754948e-02 -5.57326467802e-01 + 2826 -2.62095933246e-01 -3.92020856150e-02 -5.70600023371e-01 + 2827 -3.49941334369e-01 -6.93884010139e-02 -5.62321072371e-01 + 2828 -2.23141036844e-01 -1.43574413000e-01 -4.76905676316e-01 + 2829 -2.12133174205e-01 -1.21863131964e-01 -4.86173206244e-01 + 2830 -2.41091746682e-01 -2.13322098936e-02 -5.71957376572e-01 + 2831 -2.46495811078e-01 -1.84828837507e-02 -5.40764914508e-01 + 2832 -2.13140845706e-01 -3.46660899965e-02 -5.94635617679e-01 + 2833 -2.07271491811e-01 -3.70590408336e-02 -5.59186045136e-01 + 2834 -7.09523622185e-02 5.79264050927e-03 -6.05821141950e-01 + 2835 -1.22261425977e-01 -6.09830243465e-03 -6.25725682221e-01 + 2836 -1.21848986846e-01 -1.00681629347e-02 -5.85792106159e-01 + 2837 -1.06661303809e-01 1.46208994297e-02 -5.95890573359e-01 + 2838 -1.36215866231e-01 3.49562749165e-03 -6.13301620710e-01 + 2839 -1.56192509062e-01 -1.66721713973e-02 -6.12372991694e-01 + 2840 -1.50582745615e-01 1.70594179180e-02 -6.40811135262e-01 + 2841 -1.59748226073e-01 2.21320843688e-02 -6.19217235567e-01 + 2842 -2.08737747883e-01 -5.55568941655e-02 -4.67670448428e-01 + 2843 -2.18716514382e-01 -8.04142017408e-02 -4.61969013061e-01 + 2844 -1.74938692791e-01 -1.06574305307e-01 -4.88583250274e-01 + 2845 -1.97612668438e-01 -1.02519927262e-01 -4.70979219330e-01 + 2846 -1.85659571341e-01 3.87568318263e-02 -3.49008822767e-01 + 2847 -1.66303782598e-01 4.13768180298e-02 -3.60432998724e-01 + 2848 -1.96327072665e-01 1.14833883163e-01 -3.01279250106e-01 + 2849 -2.01928991599e-01 1.04274065664e-01 -3.37603349567e-01 + 2850 -1.99551896426e-01 6.50619386770e-02 -3.02043838349e-01 + 2851 -2.17592334718e-01 9.39068828793e-02 -2.99766965549e-01 + 2852 -2.16477458405e-01 9.12187698255e-02 -3.27388111284e-01 + 2853 -2.04078874107e-01 7.10927693393e-02 -3.38113075062e-01 + 2854 -1.85202590098e-01 9.30103077260e-02 -2.47504242837e-01 + 2855 -1.74894396161e-01 1.34806042764e-01 -2.46665314094e-01 + 2856 -2.08026130499e-01 1.12539128912e-01 -2.63407235208e-01 + 2857 -1.94589099946e-01 1.39003724894e-01 -2.58802290558e-01 + 2858 -1.82310717872e-01 1.49355093056e-01 -2.82515318941e-01 + 2859 -1.48023677816e-01 1.29366942644e-01 -1.88347778115e-01 + 2860 -1.63740544493e-01 1.18459901458e-01 -2.04836217113e-01 + 2861 -1.49587260433e-01 1.51624585193e-01 -2.02507697739e-01 + 2862 -1.60586365757e-01 1.51772438586e-01 -2.18219963612e-01 + 2863 -1.06323393640e-01 1.40075603761e-01 -1.88690064468e-01 + 2864 -1.22308265188e-01 1.66182906788e-01 -2.07455861848e-01 + 2865 -2.42782704709e-01 2.62315535588e-01 -2.30308330687e-01 + 2866 -2.45505331357e-01 2.34635844512e-01 -2.46534553003e-01 + 2867 -2.75914439048e-01 2.40048621736e-01 -2.47050251800e-01 + 2868 -1.26625838604e-01 1.07969501375e-02 -2.10222654635e-01 + 2869 -1.18983589657e-01 4.03402582301e-02 -2.13169298180e-01 + 2870 -1.28837560347e-01 5.54811534739e-02 -1.98893399742e-01 + 2871 -9.56736417260e-02 9.38768722113e-02 -4.77708584074e-02 + 2872 -1.09332664168e-01 8.57571385051e-02 -3.42055249950e-02 + 2873 -8.79033765987e-02 1.16688064439e-01 -4.42264997315e-02 + 2874 -1.04506777698e-01 1.15914059993e-01 -2.21063202749e-02 + 2875 -5.18727314571e-02 6.46547049565e-03 -4.63029375647e-02 + 2876 -2.30472036641e-02 -2.39328375353e-02 -6.71516709974e-02 + 2877 -4.70315120250e-02 -1.15888042694e-02 -6.49647368568e-02 + 2878 -4.12778583371e-02 -9.82250116113e-04 -8.76145131611e-02 + 2879 -8.44153044130e-02 8.93001176760e-02 -1.65038117932e-01 + 2880 -6.37841810595e-02 7.83184671146e-02 -1.42736770775e-01 + 2881 -7.69856219100e-02 9.65341065895e-02 -1.45895303110e-01 + 2882 -1.07078637266e-01 1.01961749080e-01 -1.76650692643e-01 + 2883 -8.73256890143e-02 9.92176338840e-02 -1.79280895653e-01 + 2884 -8.02378771794e-02 1.23712165272e-01 -1.88183877874e-01 + 2885 -6.12120055857e-04 -8.82407616296e-02 -5.68207191218e-02 + 2886 6.45558891452e-03 -5.68401755502e-02 -6.34879069200e-02 + 2887 -2.99789370443e-02 3.96789622267e-02 -1.88136542569e-02 + 2888 -5.22303120602e-02 3.61200455521e-02 -2.87112243015e-02 + 2889 2.58386472050e-01 -1.86198113353e-01 -9.64289752950e-03 + 2890 1.37579708075e-01 -1.77313518344e-01 5.66224549668e-02 + 2891 2.84696975295e-02 -3.27781094798e-01 -4.07908432249e-02 + 2892 1.85646465020e-01 -2.86509830988e-01 -7.45850963240e-02 + 2893 1.84283711140e-01 -2.64648585014e-01 -1.45034410876e-02 + 2894 7.90449481863e-02 -2.84875678896e-01 2.80532793906e-02 + 2895 1.16703537076e-01 -1.13273150534e-01 6.79536046422e-02 + 2896 1.62048261139e-01 -1.22200881422e-01 3.01747873365e-02 + 2897 1.40273994623e-01 -8.79487647947e-02 4.52850665006e-02 + 2898 1.32826197108e-01 1.67253991162e-02 -5.19293419501e-01 + 2899 1.44526048435e-01 -2.48887091859e-03 -4.85715037910e-01 + 2900 1.31157678211e-01 -3.03095085377e-03 -4.99722185382e-01 + 2901 4.24271890012e-02 -2.45703314802e-02 -7.26398590297e-01 + 2902 7.66239356410e-02 -3.01121912435e-02 -6.94181773987e-01 + 2903 1.15533331992e-01 -9.82622717200e-02 -6.71540608359e-01 + 2904 8.94118496934e-02 -5.31185527809e-02 -7.24360405573e-01 + 2905 1.03313244500e-01 -5.01378922782e-02 -7.00707339521e-01 + 2906 1.25361364301e-01 -7.92401514034e-02 -6.57609786029e-01 + 2907 2.28534796813e-01 -7.81954102970e-02 -6.12793643509e-01 + 2908 1.89120545277e-01 -1.03535926117e-01 -6.07348171809e-01 + 2909 2.17246390379e-01 -8.62003065683e-02 -6.39666241663e-01 + 2910 1.87207420544e-01 -1.05762282538e-01 -6.44993459914e-01 + 2911 2.83919970269e-01 4.31703650769e-02 -4.52219544831e-01 + 2912 2.82645132131e-01 9.98298361546e-02 -4.49240832520e-01 + 2913 3.66653218436e-01 6.91540340008e-02 -4.25504954802e-01 + 2914 3.37939977702e-01 7.50416423912e-02 -4.59150607187e-01 + 2915 3.55096754754e-01 1.23438382214e-01 -4.59475153099e-01 + 2916 2.46319576641e-01 4.21262099624e-02 -4.53784478049e-01 + 2917 2.32936220007e-01 7.95511389759e-02 -4.52320314248e-01 + 2918 1.84270251330e-01 1.06849648604e-01 -4.89407063206e-01 + 2919 1.50505249246e-01 1.13922239125e-01 -4.54066812638e-01 + 2920 1.37972436130e-01 1.54890998129e-01 -4.95908559297e-01 + 2921 1.75915042586e-01 1.34162154607e-01 -5.17301560979e-01 + 2922 1.65315880879e-01 1.10370052110e-01 -5.02595990160e-01 + 2923 1.36487756006e-01 1.16258580292e-01 -4.83432132099e-01 + 2924 2.04833502418e-01 1.11599894332e-01 -4.15509241991e-01 + 2925 1.37473052069e-01 1.17248025316e-01 -4.29261385595e-01 + 2926 1.81477291242e-01 1.14674820174e-01 -4.06544564370e-01 + 2927 1.97463589737e-01 1.39901845359e-01 -3.89232993259e-01 + 2928 5.49321122897e-02 9.37595621413e-02 -5.05924856355e-01 + 2929 4.97811107284e-02 1.18344334034e-01 -5.04876693077e-01 + 2930 3.02238911293e-02 1.17482024503e-01 -4.92448000428e-01 + 2931 1.40669043196e-02 1.15492231208e-01 -4.80805763231e-01 + 2932 6.32873210342e-02 6.64470561385e-02 -4.78030358582e-01 + 2933 7.45786831571e-02 8.00681077606e-02 -4.94063461692e-01 + 2934 4.86728789354e-02 1.15065785111e-01 -3.91251761934e-01 + 2935 -1.14680535831e-01 -1.39516629387e-01 -5.75902080453e-01 + 2936 -9.84895606794e-02 -1.39137536488e-01 -5.59924249043e-01 + 2937 -1.31034452207e-01 -1.68550924803e-01 -5.69351181891e-01 + 2938 -1.14924947668e-01 -1.82499433163e-01 -5.42108985494e-01 + 2939 -1.07190267990e-01 -2.34258341266e-01 -5.13533846433e-01 + 2940 -6.50274185776e-02 -2.32079599015e-01 -5.22231590501e-01 + 2941 -8.78140850524e-02 -2.47920670602e-01 -5.57632993789e-01 + 2942 -1.03309766903e-01 -2.21559481677e-01 -5.37758608572e-01 + 2943 -7.26577551159e-02 -2.23100139886e-01 -5.38225726088e-01 + 2944 -5.21099632862e-02 -2.41187818572e-01 -5.51631022071e-01 + 2945 -5.75014251794e-02 -1.98279609170e-01 -5.18818458387e-01 + 2946 -7.01838716966e-02 -1.97573660279e-01 -5.41281683208e-01 + 2947 -3.81252422423e-02 -2.11941938506e-01 -5.62917605743e-01 + 2948 -1.02914347832e-01 -2.85884684127e-01 -7.54295368147e-01 + 2949 -6.78935395999e-02 -2.05121291821e-01 -7.73221526110e-01 + 2950 -1.35033723906e-01 -1.93812326214e-01 -6.37178825506e-01 + 2951 -1.80707917231e-01 -1.98016292361e-01 -6.68854588895e-01 + 2952 -1.89435145204e-01 -2.26697484500e-01 -6.91364096000e-01 + 2953 -1.63751952439e-01 -2.74858722203e-01 -6.16094433530e-01 + 2954 -1.63585788721e-01 -2.30123784163e-01 -6.18674813915e-01 + 2955 -1.90703417511e-01 -2.24198894287e-01 -6.47057639354e-01 + 2956 -1.99853402920e-01 -2.52047223021e-01 -6.54798327577e-01 + 2957 -2.18666561173e-01 -2.16608277601e-01 -6.45902827029e-01 + 2958 -1.91971689819e-01 -2.21700304073e-01 -6.02751182708e-01 + 2959 -3.36173366838e-01 -1.69924722909e-01 -5.97351523620e-01 + 2960 -3.07302504716e-01 -2.03130217198e-01 -5.93430340398e-01 + 2961 -2.43070006289e-01 -2.05188807886e-01 -6.18738520166e-01 + 2962 -3.08349913502e-01 -1.34913589263e-01 -6.14397333406e-01 + 2963 -1.10223165172e-01 2.22034890228e-01 -2.90698387929e-01 + 2964 -1.06681584583e-01 1.98768713298e-01 -2.73526098151e-01 + 2965 -2.15984346457e-02 1.16012046498e-01 -3.06852065742e-01 + 2966 -3.73423753181e-02 1.30118394956e-01 -2.90597955101e-01 + 2967 -2.75326721698e-02 1.04587233548e-01 -3.22192426428e-01 + 2968 -5.41157019405e-02 1.20034349760e-01 -3.05481440809e-01 + 2969 -4.66759981002e-02 1.20143679887e-01 -2.50120419120e-01 + 2970 -4.26398030501e-02 1.23413985384e-01 -2.23337239063e-01 + 2971 -4.20237096399e-02 1.12854081989e-01 -2.34383190511e-01 + 2972 -5.20209921931e-02 1.29831341844e-01 -2.73450773530e-01 + 2973 -6.80960822329e-02 1.23012960676e-01 -2.77657370145e-01 + 2974 2.36805415895e-01 -3.93298197086e-02 -5.46006106367e-01 + 2975 2.13286121232e-01 -4.32683000589e-02 -5.20113279519e-01 + 2976 -3.98909557449e-01 -1.23297869129e-01 -1.66765612836e-01 + 2977 -4.32606371633e-01 -5.13779328955e-02 -1.23058142284e-01 + 2978 -3.66153869309e-01 -1.70675603780e-01 -8.84901506411e-02 + 2979 -3.43375617839e-01 -1.27993214150e-01 -1.22779308144e-01 + 2980 -3.82531713379e-01 -7.28794257197e-02 -1.00995281403e-01 + 2981 -4.10769246206e-01 -8.29630893298e-02 -7.08745008209e-02 + 2982 -3.43375617839e-01 -2.91834665033e-02 -8.72691743637e-02 + 2983 -3.66153869309e-01 -2.24609823103e-02 -3.52249499703e-02 + 2984 -2.65063426758e-01 -9.00061695407e-02 -1.13082160955e-01 + 2985 -3.63927523420e-01 6.72653148845e-02 -7.04919022043e-02 + 2986 -3.13729053373e-01 7.41452088546e-02 -3.80250127228e-02 + 2987 -2.38704205768e-01 1.03709785790e-01 -7.77339039502e-02 + 2988 -3.25802803845e-01 9.99605037174e-02 -6.37036696936e-02 + 2989 -2.97685131204e-01 9.69466269867e-02 -4.10505607102e-02 + 2990 -2.30246841605e-01 9.84415227918e-02 -4.28530138867e-02 + 2991 -3.56666056640e-01 9.01834681831e-02 -4.36721747024e-03 + 2992 -3.20961825992e-01 1.15239272583e-01 -1.96205465376e-02 + 2993 -2.31442738988e-01 1.26627939089e-01 -1.16092192161e-02 + 2994 -3.15522379646e-01 9.80463672273e-02 -4.52211253540e-01 + 2995 -3.61641784734e-01 1.16198644004e-01 -4.59144388719e-01 + 2996 -3.73874229775e-01 1.48708381867e-01 -4.44218300541e-01 + 2997 -1.23489291119e-01 -1.41044750032e-02 -2.10098799731e-01 + 2998 -1.28456013319e-01 -2.73839799105e-02 -2.29274416644e-01 + 2999 -2.04860880271e-01 2.69039641962e-02 -1.63719812323e-01 + 3000 -1.98003233097e-01 -3.66333640379e-03 -1.55659521465e-01 + 3001 -1.75649705952e-01 3.68600762686e-03 -1.54887628347e-01 + 3002 -1.72770295021e-01 2.65139893704e-02 -1.60003857879e-01 + 3003 -5.76690846739e-02 -7.47333852194e-03 6.01832783207e-02 + 3004 -8.83335979673e-02 -1.44458494939e-02 6.94271267258e-02 + 3005 -9.67695049477e-02 2.30331091984e-03 6.19407320728e-02 + 3006 -7.91384650788e-02 1.25347050391e-02 5.32827015850e-02 + 3007 -1.12010774511e-01 -6.41618200199e-03 4.34603212353e-02 + 3008 1.97445108990e-01 6.61396614271e-02 -5.89734350669e-01 + 3009 2.24924656714e-01 4.27261514058e-02 -5.98221909729e-01 + 3010 2.09213849472e-01 9.12896704459e-02 -6.05772849502e-01 + 3011 2.41930332943e-01 5.16883207447e-02 -6.11743428638e-01 + 3012 -2.89301259629e-02 1.56867212687e-01 -2.16520636429e-01 + 3013 -1.30470522847e-02 1.97242193460e-01 -2.42053911893e-01 + 3014 -3.37994999180e-02 1.80174190722e-01 -2.37042741124e-01 + 3015 -5.69128611339e-02 1.40620366505e-01 -1.82818332601e-01 + 3016 -6.65282000923e-02 1.57165392575e-01 -1.81367275240e-01 + 3017 -3.70205000247e-02 1.37100147002e-01 -1.91967476762e-01 + 3018 -8.84656521405e-02 1.72473422641e-01 -1.97272320582e-01 + 3019 1.72270994859e-01 3.07087205349e-01 -5.75514196634e-01 + 3020 1.76309587482e-01 3.71391470233e-01 -5.43664427730e-01 + 3021 2.10614151423e-01 3.26771450843e-01 -5.91118211277e-01 + 3022 2.04057306749e-01 3.70078588132e-01 -5.63329880939e-01 + 3023 2.79787509414e-01 2.72046865874e-01 -6.68470934299e-01 + 3024 3.53191672943e-01 2.38249735360e-01 -6.05628554285e-01 + 3025 3.53191672943e-01 3.48031243916e-01 -7.22313956199e-01 + 3026 3.89893754707e-01 3.03687301520e-01 -6.61721415714e-01 + 3027 4.29100154850e-01 3.45598472054e-01 -6.44090011607e-01 + 3028 1.07617103838e-01 -1.17607988843e-01 -5.12293410880e-01 + 3029 1.13795443065e-01 -9.91719928164e-02 -4.88531768262e-01 + 3030 1.05044029325e-01 -7.69898806402e-02 -4.89960356341e-01 + 3031 4.52848506854e-02 -9.94112494024e-02 -5.08930209514e-01 + 3032 7.39559906388e-02 -1.14119571991e-01 -5.01178337044e-01 + 3033 8.70050233589e-02 -1.01164679184e-01 -4.86135873539e-01 + 3034 7.22406076300e-02 -8.70408331895e-02 -4.86289634018e-01 + 3035 8.80280521017e-02 -1.04326318740e-01 -4.68543754834e-01 + 3036 6.63929428797e-02 -8.47213695260e-02 -4.59978336199e-01 + 3037 6.89660173930e-02 -1.25339477728e-01 -4.82311390737e-01 + 3038 2.72237075459e-02 3.16952854004e-02 -4.88064009267e-01 + 3039 3.21791605316e-02 5.05162360209e-02 -4.76082841659e-01 + 3040 6.26552702836e-02 3.41281051398e-02 -4.78202432079e-01 + 3041 5.75139693384e-02 4.76356131703e-02 -4.71681950670e-01 + 3042 1.72673142920e-02 -9.99303110349e-02 -4.30470064168e-01 + 3043 5.12505520766e-02 -1.11747136122e-01 -4.16325216212e-01 + 3044 6.29253959430e-02 -1.21261762292e-01 -4.33491854835e-01 + 3045 5.35622500344e-02 -8.73868742779e-02 -4.33982870454e-01 + 3046 6.99759444372e-02 -9.93853522822e-02 -4.22496032915e-01 + 3047 8.40009711350e-02 -1.01607841782e-01 -4.35997397565e-01 + 3048 1.26732840212e-01 4.27768649939e-02 -5.25010757381e-01 + 3049 1.24470988363e-01 4.40379051191e-02 -5.47187917274e-01 + 3050 -5.53368807763e-02 5.47895723741e-02 -4.72507400786e-01 + 3051 -6.85617646751e-02 5.34013734406e-02 -4.53056932238e-01 + 3052 3.83596737719e-03 2.07159357672e-02 -4.77846803232e-01 + 3053 1.31148225979e-02 2.60388860093e-02 -4.54056541512e-01 + 3054 1.33994921586e-02 3.75764861408e-02 -4.71415229035e-01 + 3055 6.61833422676e-02 2.14381764612e-02 -4.04162938972e-01 + 3056 1.44658649702e-01 2.94641748086e-01 -5.55270739764e-01 + 3057 1.24796144130e-01 3.74582801612e-01 -5.32741236667e-01 + 3058 1.54590680459e-01 3.45981311065e-01 -5.36444277304e-01 + 3059 1.44578182172e-01 1.50733969173e-01 -5.61949031950e-01 + 3060 1.26196774577e-01 1.90406257302e-01 -5.46227296641e-01 + 3061 9.89433644563e-02 1.95341048093e-01 -5.28473298523e-01 + 3062 1.52216155692e-01 1.63439557326e-01 -5.24517470490e-01 + 3063 1.36520606616e-01 1.90017376384e-01 -5.22084059374e-01 + 3064 1.21792943882e-01 1.93177609939e-01 -5.02200314873e-01 + 3065 1.35068777103e-01 2.25143754639e-01 -5.48259559451e-01 + 3066 1.45876552313e-01 2.13046080970e-01 -5.15391155492e-01 + 3067 1.74097848776e-01 1.84693704675e-01 -5.15694820225e-01 + 3068 1.80703594818e-01 1.80536675720e-01 -5.81735292878e-01 + 3069 1.03424326101e-01 1.67293548656e-01 -4.97849773945e-01 + 3070 9.99267344226e-02 1.92907869882e-01 -5.02083286965e-01 + 3071 7.74049449857e-02 1.94260248632e-01 -5.19559600096e-01 + 3072 2.44260788998e-01 1.29503468647e-01 -4.49378670871e-01 + 3073 2.16575190688e-01 1.06876037640e-01 -4.51653822579e-01 + 3074 1.30217981433e-01 1.18168834644e-01 -4.57486731951e-01 + 3075 1.29117843325e-01 1.44560531319e-01 -4.57155883368e-01 + 3076 1.05420409005e-01 1.56445060917e-01 -4.68299963336e-01 + 3077 3.15754756310e-01 1.00561039695e-02 -7.22146062767e-01 + 3078 3.30248156987e-01 -4.59097913468e-02 -7.24656207678e-01 + 3079 2.77146036554e-01 8.10479596075e-02 -6.32795926429e-01 + 3080 3.32859527415e-01 1.03449838289e-01 -5.94582893386e-01 + 3081 -9.07464972787e-02 -7.25391990114e-02 -1.40948367322e-01 + 3082 -9.92580035210e-02 -1.27441143506e-01 -1.59888468630e-01 + 3083 -7.70079535904e-02 -1.06877971859e-01 -1.46909023998e-01 + 3084 -8.91689625538e-02 -9.59227834052e-02 -1.33223701052e-01 + 3085 -1.08055998829e-01 -1.05979835019e-01 -1.37314889824e-01 + 3086 -8.08654005173e-02 -9.82941277318e-02 -1.07722523062e-01 + 3087 -5.84721060539e-02 -1.15912582575e-01 -1.15499918486e-01 + 3088 -4.37007074336e-02 -3.35300926474e-01 3.51839107662e-02 + 3089 -1.06569717828e-01 -2.69328585713e-01 1.18537075908e-02 + 3090 -1.40842290947e-01 -1.53992878570e-01 3.23230972671e-02 + 3091 -6.69066008273e-02 -1.68337694767e-01 -5.29840447244e-03 + 3092 -5.72792577487e-02 -2.78891796511e-01 -1.32272935689e-02 + 3093 -1.01036377966e-01 -2.43514823431e-01 -1.86221448667e-02 + 3094 -1.22040313424e-01 -1.58019764575e-01 -1.51345025683e-02 + 3095 -1.35166155104e-01 -3.18691952096e-01 -3.19458852609e-02 + 3096 -1.18256222863e-01 -2.67819146926e-01 -5.79804909203e-02 + 3097 -6.12304649851e-02 -3.33036768293e-01 -6.95673870004e-02 + 3098 -2.56777436736e-01 -2.80450402520e-01 -6.86884576813e-02 + 3099 -2.68040431337e-01 -1.02962195884e-01 5.80332500993e-02 + 3100 -3.45360287558e-01 -1.36630565046e-01 -8.70236744121e-03 + 3101 -2.68526358567e-01 -2.27472923784e-01 -1.37980435213e-02 + 3102 -1.91368478089e-01 -2.35308130589e-01 2.89938094789e-02 + 3103 -2.80599231883e-01 -2.57502596982e-01 -6.79515844179e-03 + 3104 -1.70898847824e-01 -2.84270243788e-01 6.08940635984e-02 + 3105 -6.51372526583e-02 -1.02666581908e-01 -1.63534124855e-01 + 3106 -7.60137189681e-02 -1.14971566356e-01 -1.77728788228e-01 + 3107 -4.88231206567e-02 -1.07285859069e-01 -1.48136421466e-01 + 3108 -5.69807541205e-02 -1.28052974321e-01 -1.61729564832e-01 + 3109 -1.17990356148e-01 -8.85803867077e-02 -5.06320624289e-01 + 3110 -1.47608716269e-01 -9.30341647652e-02 -5.15326131741e-01 + 3111 7.62926288750e-03 2.12171739632e-02 -4.21887838587e-01 + 3112 1.62444637913e-02 3.79524147878e-02 -4.29446005550e-01 + 3113 8.26131363802e-03 5.35361249619e-02 -4.21715765090e-01 + 3114 2.49095142784e-02 -6.95531126014e-02 -4.37858951756e-01 + 3115 5.02201660886e-02 -6.77398346420e-02 -4.38646334574e-01 + 3116 5.76599333369e-02 -5.94138182621e-02 -4.57531133110e-01 + 3117 6.47489667047e-02 -5.46055334266e-02 -4.25212382974e-01 + 3118 3.40473892975e-02 -5.07582997580e-02 -4.17314332948e-01 + 3119 6.73564813320e-02 5.61285639716e-02 -5.56421696225e-01 + 3120 8.50574748292e-02 5.07749897837e-02 -5.67398497766e-01 + 3121 5.36577186008e-02 3.45276644197e-02 -5.61174671293e-01 + 3122 1.09710090041e-02 -4.09240704838e-01 -6.20507640607e-01 + 3123 -2.21548862026e-02 -4.33226526235e-01 -6.16984565971e-01 + 3124 -1.17915945904e-02 -3.81850423305e-01 -5.97645194137e-01 + 3125 -1.58119341541e-01 -2.49454231281e-01 -5.83937461791e-01 + 3126 -1.50179937896e-01 -2.22581855463e-01 -5.55294920573e-01 + 3127 -1.53448318743e-01 -2.02099868618e-01 -5.72430084101e-01 + 3128 -1.59830714790e-01 -2.13187456882e-01 -5.97236832755e-01 + 3129 -1.72748170081e-01 -2.04079237324e-01 -5.67837401185e-01 + 3130 -1.50384661863e-01 -3.01213139384e-01 -5.55362322730e-01 + 3131 -1.00256441242e-01 -3.67475426256e-01 -6.46908215153e-01 + 3132 -9.57181923199e-02 -3.67475426256e-01 -5.34206829548e-01 + 3133 -7.17886442399e-02 -4.00606569692e-01 -6.08155122161e-01 + 3134 -1.26290096803e-01 -3.17798323000e-01 -7.37576064000e-01 + 3135 -1.03889257506e-01 -2.76156199181e-01 -7.28352045192e-01 + 3136 -1.38519010007e-01 -2.01541598908e-01 -6.94469393590e-01 + 3137 -4.78335753799e-02 -2.99400190689e-01 -7.27067355033e-01 + 3138 -7.17503630698e-02 -1.99100286033e-01 -6.75601032549e-01 + 3139 -2.24674730750e-01 -3.21634029956e-01 -4.61061690436e-01 + 3140 -1.65102361371e-01 -3.66225522467e-01 -4.68770228623e-01 + 3141 -1.84371036046e-01 -3.03055222718e-01 -4.98751729454e-01 + 3142 -1.18375775109e-01 -3.68703481812e-01 -4.96466434031e-01 + 3143 -2.08302232284e-01 -2.71606233847e-01 -4.82202181813e-01 + 3144 -2.32547204252e-01 -2.93402586493e-01 -4.58072039460e-01 + 3145 -2.36499632886e-01 -2.90287881970e-01 -4.16873789037e-01 + 3146 -1.69444386044e-01 2.06271332945e-01 -3.78289188191e-01 + 3147 -1.97267740842e-01 1.81244803501e-01 -3.68170551775e-01 + 3148 -1.80508470824e-01 1.86191280280e-01 -3.91547925260e-01 + 3149 -1.67377319480e-01 1.89046468464e-01 -3.75785606938e-01 + 3150 -1.74173115710e-01 1.86700546673e-01 -3.54946585173e-01 + 3151 -1.45383305341e-01 1.77022713959e-01 -3.78358729127e-01 + 3152 -1.44579992617e-01 1.67491954019e-01 -3.48386757575e-01 + 3153 -1.75237532752e-01 1.49517676700e-02 -2.86291313743e-01 + 3154 -1.53783568962e-01 9.94321887717e-03 -2.78717733681e-01 + 3155 -2.01322914459e-01 2.83896490421e-02 -3.11172438749e-01 + 3156 -2.04275393211e-01 4.20808444475e-02 -3.35942216184e-01 + 3157 -2.21050312581e-01 9.74175672618e-02 -2.71741025515e-01 + 3158 -2.10176013007e-01 7.93578325877e-02 -2.63916960703e-01 + 3159 -8.13400681909e-02 -2.87761646014e-02 -3.19224679488e-01 + 3160 -9.57502846502e-02 -2.06437469030e-03 -3.16254829682e-01 + 3161 -8.97869116983e-02 2.13999665195e-02 -3.08706076380e-01 + 3162 -1.49920464722e-01 9.65772979627e-02 -4.04976684654e-01 + 3163 -1.22737676095e-01 1.24779065927e-01 -3.39687326734e-01 + 3164 -1.42713639754e-01 1.37684967694e-01 -3.34706265137e-01 + 3165 -1.24049223433e-01 1.42987307699e-01 -3.36890158043e-01 + 3166 -1.19071986568e-01 1.64626078585e-01 -3.46738450636e-01 + 3167 -1.93067585673e-01 1.80673687593e-01 -4.26900414753e-01 + 3168 -2.06498177748e-01 1.95488369056e-01 -4.07289023292e-01 + 3169 -2.36252301227e-01 1.95190436664e-01 -3.91782198823e-01 + 3170 -1.82437097044e-01 1.66239750069e-01 -4.07358564229e-01 + 3171 -1.95167663258e-01 1.80959245547e-01 -3.97535483264e-01 + 3172 -2.11226907413e-01 1.75917582783e-01 -3.83946420275e-01 + 3173 -8.58172951817e-02 1.11777469268e-01 -2.85079347674e-01 + 3174 -8.24041126363e-02 1.06046564854e-01 -3.06102720627e-01 + 3175 3.39897769393e-01 -1.44326321225e-01 -5.20210324266e-01 + 3176 3.31764152016e-01 -1.15123335583e-01 -5.46078889927e-01 + 3177 3.53903855823e-01 -5.61270232753e-02 -1.62975040243e-01 + 3178 3.05205141098e-01 -1.05656677558e-01 -2.05418986597e-01 + 3179 1.63450235324e-01 -7.94173916721e-02 -3.45400632354e-01 + 3180 1.51017530722e-01 -7.37115947027e-02 -3.77269915911e-01 + 3181 1.33919323307e-01 -7.51236457648e-02 -3.53556671311e-01 + 3182 1.36508390570e-01 -7.93981940985e-02 -3.24406067406e-01 + 3183 4.66442680161e-02 -5.54266039722e-02 -3.65956646277e-01 + 3184 5.86377456984e-02 -6.34043356319e-02 -3.38110076687e-01 + 3185 7.31468858505e-02 -5.77177362360e-02 -3.90973925193e-01 + 3186 7.55163396536e-02 -6.31282519149e-02 -3.63834678272e-01 + 3187 6.49086429506e-02 -4.54879811106e-02 -4.06389625628e-01 + 3188 4.44941500945e-02 -3.98839745596e-02 -3.94850006495e-01 + 3189 6.32467026187e-02 -1.50083870575e-01 -3.01246007757e-01 + 3190 5.35577033966e-02 -1.85445906387e-01 -3.10660542881e-01 + 3191 1.21483981613e-01 -2.14188337872e-01 -3.35429998852e-01 + 3192 1.08530888096e-01 -1.69245491565e-01 -3.17758978404e-01 + 3193 9.03958146341e-02 -1.70558086308e-01 -2.96483855326e-01 + 3194 9.29861858244e-02 -2.00957515426e-01 -3.01172827931e-01 + 3195 -6.52862956685e-03 -5.07532758823e-02 -3.72383947175e-01 + 3196 9.04555170584e-03 -3.67684224997e-02 -3.99134873760e-01 + 3197 2.31310817015e-02 -3.21101479154e-02 -3.86831493718e-01 + 3198 1.74434708516e-02 -3.98806253091e-02 -3.64896415979e-01 + 3199 6.89726554541e-03 -6.68004564541e-02 -2.68714100413e-01 + 3200 7.41108531253e-03 -8.78682579809e-02 -2.69942715419e-01 + 3201 -6.78414394055e-02 -9.63419982199e-02 -4.25367111014e-01 + 3202 -1.10946295271e-01 -7.04161556881e-02 -4.25382184802e-01 + 3203 -9.58371257482e-02 -6.44153515054e-02 -4.82106381914e-01 + 3204 -6.67301130538e-02 -7.43778706799e-02 -5.10460943577e-01 + 3205 -1.01071285005e-01 -1.32589551023e-01 -4.61688474576e-01 + 3206 -1.18731240383e-01 -1.03223138401e-01 -4.49591402580e-01 + 3207 -1.05453126962e-01 -9.05207895857e-02 -4.86082245970e-01 + 3208 -8.92537855709e-02 -1.05864281729e-01 -5.06310575097e-01 + 3209 1.30216854580e-01 -9.32529862342e-02 -5.02525205222e-01 + 3210 1.29856382591e-01 -7.64919092560e-02 -5.08142076262e-01 + 3211 1.31571765600e-01 -1.03570648058e-01 -5.23030779287e-01 + 3212 -2.21562041656e-02 -3.55327609309e-02 -3.13935330700e-01 + 3213 -3.59122093703e-02 -5.15006154595e-02 -3.38388868354e-01 + 3214 -2.70235202073e-04 -3.11834017389e-02 -3.22931836422e-01 + 3215 -2.14558235077e-03 -4.03788516939e-02 -3.42233030099e-01 + 3216 5.00000000000e-01 2.96230969786e-01 2.32178399410e-01 + 3217 5.00000000000e-01 3.64153979857e-01 6.53934488879e-02 + 3218 4.26653101242e-01 2.47969862971e-01 2.12645099740e-01 + 3219 4.44989825931e-01 3.10977397228e-01 9.24397117662e-02 + 3220 5.00000000000e-01 5.00000000000e-01 1.15911773922e-01 + 3221 4.26653101242e-01 3.83815883114e-01 1.35134016082e-01 + 3222 3.89979651863e-01 3.25723824671e-01 3.36789250201e-01 + 3223 3.22671475302e-02 1.15220140920e-01 -6.78173627725e-02 + 3224 3.45713633824e-02 1.54149420035e-01 -5.99813090013e-02 + 3225 5.48534013313e-02 1.39589773211e-01 -9.39023088192e-02 + 3226 2.74659073983e-02 1.34251348240e-01 -9.25434462756e-02 + 3227 2.74016379225e-02 1.66547936758e-01 -9.55614382625e-02 + 3228 -7.03162592992e-02 1.73089730628e-01 -9.74059848006e-02 + 3229 -8.57408210200e-02 1.65786828756e-01 -1.16727623240e-01 + 3230 -6.10400690144e-02 1.72176364118e-01 -1.29226141626e-01 + 3231 -4.25234438653e-02 1.79174810486e-01 -1.20511222129e-01 + 3232 -5.21743750641e-02 7.67727802034e-02 7.07229400368e-02 + 3233 -5.62137410724e-02 3.67123645592e-02 4.81434907098e-02 + 3234 1.08240706041e-02 6.99456779048e-02 5.73399097406e-02 + 3235 -9.79918501687e-03 5.61177151650e-02 7.73539280222e-02 + 3236 -2.34225070349e-02 3.12361696914e-02 5.87615940306e-02 + 3237 -1.42147772936e-02 3.21609630268e-02 3.92214705124e-02 + 3238 -1.34623247567e-02 -4.63639852251e-05 7.03274868781e-02 + 3239 -1.03233241146e-01 1.51026208884e-01 -1.04614856439e-01 + 3240 -9.87810067081e-02 1.50974603507e-01 -8.76961752131e-02 + 3241 1.64356190113e-02 5.90843128325e-02 1.03967830554e-02 + 3242 -3.74640401379e-03 3.34611179421e-02 8.54373530554e-03 + 3243 1.44717491927e-01 -8.20266881677e-02 -6.08886764066e-01 + 3244 1.74219548496e-01 -1.09976439266e-01 -6.00907243461e-01 + 3245 1.88820608283e-01 -1.44366703514e-01 -5.86486794508e-01 + 3246 1.63899363006e-01 -1.16536230474e-01 -6.54154711445e-01 + 3247 1.57605384977e-01 -9.14227905726e-02 -6.46019188086e-01 + 3248 1.76509954141e-01 -1.10036078295e-01 -6.30751441627e-01 + 3249 1.87007462548e-01 -1.32982800804e-01 -6.31085875047e-01 + 3250 2.05648566748e-01 -1.00480804422e-01 -4.36636448462e-01 + 3251 1.87060992697e-01 -1.11244657609e-01 -4.48895984373e-01 + 3252 -6.96194990335e-02 1.76513579323e-01 -4.11405977341e-02 + 3253 -9.83164998642e-02 1.53257169304e-01 -5.01859171687e-02 + 3254 -6.46451908226e-02 1.57087743992e-01 -5.69160180377e-02 + 3255 -8.74115184984e-02 1.44501895311e-01 -5.97561525377e-02 + 3256 3.61024452921e-02 3.24488353970e-01 -1.78869968536e-01 + 3257 7.14615855076e-03 4.62623456806e-01 -3.00372372269e-01 + 3258 2.40214372464e-02 5.00000000000e-01 -3.12654048520e-01 + 3259 -6.76578607541e-02 2.47044924549e-01 -1.95395401967e-01 + 3260 1.27682422967e-01 -1.62896881472e-01 -1.84667527917e-01 + 3261 1.00932570526e-01 -1.87346264545e-01 -1.89117499604e-01 + 3262 2.96967151494e-02 -1.14629360514e-01 -2.42828283675e-01 + 3263 3.23272219263e-03 -1.32264141295e-01 -2.23033956758e-01 + 3264 4.05626756446e-02 -9.75251561920e-02 -2.22327850157e-01 + 3265 2.65420005051e-02 -1.03580275272e-01 -2.02298154374e-01 + 3266 -8.68080311459e-03 -1.10093303718e-01 -1.89006016083e-01 + 3267 1.17795369466e-02 -9.41231135953e-02 -1.81961149464e-01 + 3268 -5.37486987767e-02 -3.60278861401e-02 -3.10924910067e-01 + 3269 -3.89725725215e-02 -2.79201775735e-02 -2.99450746399e-01 + 3270 2.65530900479e-02 -8.87634152230e-02 -3.26136885932e-01 + 3271 -1.48271545967e-03 -9.34652233588e-02 -3.47996860144e-01 + 3272 3.62617354580e-02 -7.11063924579e-02 -3.32083002846e-01 + 3273 2.08074135897e-02 -6.83552569601e-02 -3.48638357959e-01 + 3274 -4.93538673343e-02 -9.52772805779e-02 -3.69684446169e-01 + 3275 -2.36022901083e-02 -9.44241483125e-02 -3.73786943767e-01 + 3276 -1.99702875308e-02 -9.45299410007e-02 -4.03679524989e-01 + 3277 -5.43997814415e-02 -5.25653331014e-02 -3.94071533199e-01 + 3278 -4.65552860487e-02 -6.64477430463e-02 -3.67381615907e-01 + 3279 -2.79412484506e-02 -7.30152782301e-02 -3.71034196672e-01 + 3280 -2.69662328464e-02 -6.59495166615e-02 -3.90045001788e-01 + 3281 -1.46411847990e-02 -6.52397049002e-02 -3.52923225224e-01 + 3282 -1.31952010403e-01 -2.17179746931e-01 -4.13357381539e-01 + 3283 -1.12517610638e-01 -2.44918150259e-01 -4.15754619589e-01 + 3284 -1.41176642173e-01 -2.36100424600e-01 -4.56923253157e-01 + 3285 -1.51058031426e-01 -2.11301263158e-01 -4.40803137252e-01 + 3286 -1.32539290453e-01 -2.05094086155e-01 -4.34520495689e-01 + 3287 -1.19778783960e-01 -2.19557801448e-01 -4.43173025772e-01 + 3288 -1.23901938734e-01 -1.74087747710e-01 -4.12117738221e-01 + 3289 -1.27368336024e-01 -1.72337533082e-01 -4.40748438194e-01 + 3290 -1.05642099070e-01 -1.77654829486e-01 -4.56841204570e-01 + 3291 1.09416517989e-01 -2.74974914120e-01 -3.13158565555e-01 + 3292 8.49412100754e-02 -2.41481899591e-01 -2.86325205734e-01 + 3293 5.41997646587e-02 -3.06111424694e-01 -2.22015172241e-01 + 3294 6.02694881291e-02 -3.49983276080e-01 -2.18467400957e-01 + 3295 5.66030577787e-02 -3.02158868013e-01 -1.81313651962e-01 + 3296 6.69092895443e-02 -3.65990366752e-01 -1.55641234898e-01 + 3297 2.92496666824e-02 -1.16022744141e-01 -2.76359068308e-01 + 3298 2.89124660978e-02 -1.10196529051e-01 -3.02767285972e-01 + 3299 4.88387198847e-02 -1.15524517756e-01 -2.99022454188e-01 + 3300 1.10083877760e-02 -1.20475439084e-01 -3.09550735460e-01 + 3301 3.19457292956e-02 -1.33606877158e-01 -3.07325212528e-01 + 3302 2.56214949214e-03 -1.34354216735e-01 -2.73330133707e-01 + 3303 1.53736029500e-01 -3.23645697741e-01 -4.38566129251e-01 + 3304 7.80964370130e-02 -3.02028591532e-01 -4.32001678168e-01 + 3305 5.84970514241e-02 -2.77259765859e-01 -4.67876811657e-01 + 3306 8.65171548730e-02 -2.75683906127e-01 -4.89096603943e-01 + 3307 8.36753881329e-02 -4.11822848871e-01 -4.65230986218e-01 + 3308 5.66025402641e-02 -3.68019061022e-01 -4.51966399840e-01 + 3309 4.72764752596e-02 -3.32944824395e-01 -4.73881569539e-01 + 3310 6.22163521707e-02 -3.50455937418e-01 -4.90029683690e-01 + 3311 -1.67340583525e-01 2.28391828267e-01 -3.71313819101e-01 + 3312 -1.53130401028e-01 2.10785718302e-01 -5.92162042112e-01 + 3313 -1.32714920471e-01 1.98035551757e-01 -5.79564830416e-01 + 3314 -1.42764343250e-01 1.56812135909e-01 -5.87218442654e-01 + 3315 -6.60352249145e-02 -1.26694618754e-01 -2.53740562964e-03 + 3316 -7.43644157339e-02 -1.04741001658e-01 -5.35325550915e-02 + 3317 -1.07603353340e-01 -1.29366940114e-01 -1.06047289122e-02 + 3318 -1.27012190028e-01 -1.15621969169e-01 -4.72906029810e-02 + 3319 -5.68346581824e-02 -1.07005159838e-01 5.12187426751e-02 + 3320 -1.15325684994e-01 -1.17131407956e-01 2.25435955301e-02 + 3321 -1.29060404290e-02 -6.64009115294e-02 6.43511297810e-02 + 3322 2.27935616873e-02 -1.63082021271e-01 2.34781393030e-02 + 3323 -6.23511657144e-03 -1.23190836424e-01 1.66469568873e-02 + 3324 1.40614613408e-02 -8.86912310458e-02 3.51391936637e-02 + 3325 4.01794394841e-02 -1.03785485818e-01 4.58573941997e-02 + 3326 -3.40463814269e-01 -1.53376680062e-01 -1.84463257876e-01 + 3327 -2.60695721404e-01 -1.28081368408e-01 -2.05608085553e-01 + 3328 -3.13424795356e-01 -1.49378486094e-01 -1.47049118097e-01 + 3329 -2.51233060475e-01 -1.31182213670e-01 -1.48674289955e-01 + 3330 -3.18626688842e-01 -1.84961836496e-01 -1.32279616413e-01 + 3331 -2.27940033263e-01 -1.75459103060e-01 -1.27332623358e-01 + 3332 3.52681236482e-02 1.57573268731e-01 -3.71592193486e-03 + 3333 2.33126576672e-02 1.85595902996e-01 6.28234809555e-02 + 3334 6.16205134355e-02 2.15851969133e-01 8.22032636892e-02 + 3335 4.45743317746e-03 2.12294573035e-01 -8.09965938080e-03 + 3336 -1.47960625048e-02 1.83224305597e-01 2.62153224220e-03 + 3337 -1.12466154523e-02 1.97828522079e-01 5.09417208657e-02 + 3338 2.77219735340e-03 2.22076772532e-01 5.99009893249e-02 + 3339 -2.69506640821e-02 1.83362471124e-01 1.09983101112e-01 + 3340 -5.62752543250e-02 2.00417107192e-01 7.84208809403e-02 + 3341 -5.77613545528e-02 2.38083775428e-01 1.05599363666e-01 + 3342 -8.41137443401e-02 1.79805075026e-01 1.96801780423e-02 + 3343 -5.59773914424e-03 1.78747409332e-01 -7.54359096531e-02 + 3344 -9.32757607540e-04 1.81896799550e-01 -9.82573564360e-02 + 3345 1.69885146569e-02 2.03117041623e-01 -1.01520855700e-01 + 3346 1.89516784841e-02 2.09003077333e-01 -6.89204351572e-02 + 3347 4.32865395499e-02 9.18289263096e-02 -7.63525479303e-05 + 3348 4.84958141246e-02 1.09984707517e-01 2.77280200411e-02 + 3349 3.27316543740e-02 1.17502706717e-01 -3.03071047282e-02 + 3350 -3.57141743062e-02 3.67263189665e-01 7.20260774123e-03 + 3351 -2.40088743024e-02 3.25389183619e-01 7.01025007396e-02 + 3352 1.74703175178e-02 3.08196382024e-01 -5.69684795849e-03 + 3353 1.29531695646e-02 2.91557579399e-01 4.47029357152e-02 + 3354 2.14489059518e-02 3.70820585763e-01 9.75055308112e-02 + 3355 5.55790376898e-02 3.10567979422e-01 5.45051007549e-02 + 3356 2.36154075423e-02 2.77337781217e-01 -7.63634480533e-02 + 3357 2.71331477222e-02 3.06002051555e-01 -4.62440318094e-02 + 3358 1.08745971803e-02 1.17686048370e-01 -4.48470432074e-02 + 3359 5.27989096513e-03 1.44460870264e-01 -3.19662341715e-02 + 3360 -4.41648149870e-01 -5.94283382397e-02 -6.17142818116e-01 + 3361 -4.56236112403e-01 -1.90738509632e-03 -5.82843062151e-01 + 3362 -5.00000000000e-01 -8.76632360015e-03 -6.09149865117e-01 + 3363 -3.31760710405e-01 -9.37593266963e-02 -4.95484558735e-01 + 3364 -3.63526348330e-01 -8.95472692825e-02 -4.79865193615e-01 + 3365 -3.19206423363e-01 -5.60889220342e-03 -3.52611117424e-01 + 3366 -3.21119098779e-01 2.48388200278e-03 -4.03048296034e-01 + 3367 -3.19151150619e-01 3.73821207016e-02 -3.60890209214e-01 + 3368 -3.20599475367e-01 3.27039481300e-02 -3.96648320224e-01 + 3369 -3.67781491907e-01 -7.22201352409e-02 -4.38000095625e-01 + 3370 -3.23708655876e-01 -3.06420319431e-02 -4.11498193801e-01 + 3371 -1.26429589833e-01 5.81946857147e-02 -7.27038803332e-01 + 3372 -2.19822192375e-01 4.36460142860e-02 -7.52779102499e-01 + 3373 -2.29236889466e-01 2.42956559158e-03 -7.75178254255e-01 + 3374 -3.05485884865e-01 4.58050573489e-02 -7.27038803332e-01 + 3375 -1.78440317689e-01 2.56462229155e-02 -5.30402095353e-01 + 3376 -2.01416805389e-01 5.63376996715e-02 -5.28034073259e-01 + 3377 -2.12724483890e-01 7.49990352270e-02 -5.49663732624e-01 + 3378 -2.27275028330e-01 2.33206254154e-02 -5.21575614653e-01 + 3379 -2.32298716444e-01 4.69206323574e-02 -5.22006218258e-01 + 3380 -2.50131139130e-01 5.62225002897e-02 -5.34416706167e-01 + 3381 -1.97781477336e-01 -1.83676843689e-02 -5.34382281600e-01 + 3382 -1.64740804678e-01 -2.68791990617e-02 -5.49675405235e-01 + 3383 -1.60053923441e-01 -4.21772749357e-02 -5.71308955471e-01 + 3384 -1.40833140693e-01 -3.73765769648e-04 -5.52119655615e-01 + 3385 -1.48515902879e-01 3.57936917095e-02 -5.25011650088e-01 + 3386 -7.71429299805e-02 1.83744307893e-03 -5.54892767848e-01 + 3387 -1.11029102783e-01 7.56330490607e-03 -5.31520096742e-01 + 3388 -1.27791623835e-01 1.37418329972e-02 -5.42647431601e-01 + 3389 -1.10788348984e-01 1.19841011428e-02 -5.61938323958e-01 + 3390 -7.68572658986e-02 2.25579701054e-02 -5.75291014485e-01 + 3391 -1.02162746172e-01 2.49878318967e-02 -5.75475619908e-01 + 3392 -1.28201671636e-01 6.38832557944e-02 -4.81893438147e-01 + 3393 -1.37462866190e-01 8.37514406540e-02 -4.94995199960e-01 + 3394 -1.44238323833e-01 7.28198843637e-02 -5.11101999829e-01 + 3395 -1.52698539622e-01 6.26842675904e-02 -5.27333858916e-01 + 3396 -1.74042361743e-01 6.48828136879e-02 -5.31701558702e-01 + 3397 -1.23210357820e-01 6.02216360058e-02 -4.60096460259e-01 + 3398 -3.15459309689e-02 -3.20285360095e-02 -5.69913604716e-01 + 3399 -5.05863117322e-02 -2.65614757376e-03 -5.51352656329e-01 + 3400 -4.30700742473e-02 2.22226502093e-02 -5.29251596424e-01 + 3401 -3.68795064853e-02 2.61778476396e-02 -5.80179970525e-01 + 3402 -4.64592665576e-02 -1.93492868679e-05 -5.85304905730e-01 + 3403 -5.70112182329e-02 1.40076453593e-02 -5.67536369187e-01 + 3404 -5.41420287432e-02 3.61481081923e-02 -5.58196900202e-01 + 3405 1.66080041452e-01 -6.41208427517e-02 -2.52166764925e-01 + 3406 1.62028814448e-01 -3.29902478128e-02 -2.29681793546e-01 + 3407 1.46727759166e-01 -1.41374196655e-02 -2.49136520442e-01 + 3408 2.67198120248e-01 1.28347841857e-02 -9.79770603425e-02 + 3409 1.89597493664e-01 -1.37076009429e-02 -1.18755013397e-01 + 3410 1.64025968229e-01 -4.92456276865e-02 -1.18288236796e-01 + 3411 1.60488259530e-01 -2.18338365139e-02 -1.29272897449e-01 + 3412 1.25853937946e-01 3.97288941982e-03 -2.46166053990e-01 + 3413 -1.94214163554e-02 2.12205232137e-02 -3.91934248071e-01 + 3414 -4.51758370376e-03 1.37157134767e-02 -4.07109867786e-01 + 3415 -4.19488182189e-02 -5.01571574115e-03 -4.10094173274e-01 + 3416 -1.45679073955e-02 -6.27671573890e-03 -4.24275024493e-01 + 3417 -4.11870508259e-02 3.80470365935e-02 -3.71031959882e-01 + 3418 -6.56355216264e-02 4.80530262058e-02 -3.55110289977e-01 + 3419 -7.73840411261e-02 3.63435678406e-02 -2.98409818500e-01 + 3420 -6.18216074155e-02 -5.84862097463e-02 -3.38559608765e-01 + 3421 -6.87216249590e-02 -4.51352641850e-02 -3.17918954947e-01 + 3422 -2.40502879888e-03 6.75328065524e-02 -4.27756586727e-01 + 3423 -5.53947376343e-02 9.79581739215e-02 -3.18480639886e-01 + 3424 3.26994037165e-01 1.55487137571e-01 -4.22664080842e-01 + 3425 3.08195591749e-01 1.39791470069e-01 -4.57019951718e-01 + 3426 -7.10552097063e-02 2.96388061409e-01 -3.28989829200e-01 + 3427 -7.86044056806e-02 3.11819040269e-01 -3.39116753865e-01 + 3428 -2.89924992101e-01 9.43233830865e-02 -4.41721327277e-01 + 3429 -2.80219787759e-01 8.46431286114e-02 -4.63145638771e-01 + 3430 -2.08349968231e-01 1.58950220722e-02 -4.09488746758e-01 + 3431 -2.07478713805e-01 6.82533997202e-04 -3.89473969956e-01 + 3432 -3.20334890731e-01 1.59070745976e-02 -3.04573599044e-01 + 3433 -2.99511901850e-01 1.36116993014e-02 -3.33988210428e-01 + 3434 -2.75850164019e-01 -1.02995808089e-03 -3.32848567708e-01 + 3435 -2.81844910663e-01 -4.38026034425e-03 -3.12858945879e-01 + 3436 -2.81092599084e-01 -1.87242382116e-02 -3.44883958132e-01 + 3437 -2.46602895808e-01 7.05456187225e-03 -2.36733013668e-01 + 3438 -2.20994786264e-01 3.18960602530e-02 -2.59420708926e-01 + 3439 -2.36168409488e-01 -5.94781115277e-03 -2.59907170138e-01 + 3440 -2.15618174351e-01 6.27906342608e-03 -2.82757019134e-01 + 3441 -2.78970986861e-01 4.71222371091e-03 -2.44050009793e-01 + 3442 -2.54268974749e-01 -1.18434942687e-02 -2.72509886378e-01 + 3443 -1.55487341005e-01 1.04996932653e-01 -2.39005904830e-01 + 3444 -1.55185007825e-01 1.33347077700e-01 -2.40501292775e-01 + 3445 -1.70006685344e-01 6.68418300640e-02 -1.70117577202e-01 + 3446 -1.45356737835e-01 8.75512808786e-02 -1.87414794407e-01 + 3447 -1.73960028130e-01 4.84742994410e-02 -1.87444725274e-01 + 3448 -1.54484231802e-01 6.85982702077e-02 -1.96085851159e-01 + 3449 -1.69782600897e-01 8.28863470373e-02 -2.10590485215e-01 + 3450 -2.06645479936e-01 5.98444293020e-02 -2.04881113414e-01 + 3451 -1.93656835518e-01 4.72877051830e-02 -2.75395566039e-01 + 3452 -1.96458864270e-01 2.42270463303e-02 -2.88904084416e-01 + 3453 -2.16600067315e-01 3.70634693112e-02 -4.29281245404e-01 + 3454 -2.00962838270e-01 1.66750236943e-02 -4.28310248701e-01 + 3455 -2.41117514196e-01 -1.64814726368e-01 -2.91545230724e-01 + 3456 -2.45488474254e-01 -1.58017378633e-01 -2.71423427757e-01 + 3457 -2.43686162889e-01 3.24649595872e-02 -4.47941597367e-01 + 3458 -2.62540554378e-01 6.68981020490e-02 -3.69314942728e-01 + 3459 -2.79009796014e-01 6.14793258440e-02 -3.55669407475e-01 + 3460 -1.95491225243e-01 -1.23513368612e-01 -3.20606730451e-01 + 3461 -1.95132577508e-01 -1.32242851972e-01 -3.37954356804e-01 + 3462 -3.12829632120e-01 -3.60476189807e-03 -2.66834940413e-01 + 3463 -2.85838461722e-01 -1.39423039805e-02 -2.82483615197e-01 + 3464 -7.26796122765e-02 4.06719714597e-02 4.59780050608e-02 + 3465 -7.54753253390e-02 6.86987841893e-02 6.03091427291e-02 + 3466 -1.52201105050e-01 9.49548950475e-02 -1.65202018174e-01 + 3467 -1.38165039492e-01 1.03458716913e-01 -1.79403820835e-01 + 3468 -2.24471272899e-01 5.72472469717e-02 -2.35501541088e-01 + 3469 -2.03098688181e-01 6.24531839895e-02 -2.53462475882e-01 + 3470 -1.84090631300e-01 6.59199512157e-02 -2.39035835697e-01 + 3471 -1.62082184179e-01 8.16825090387e-02 -2.34779183977e-01 + 3472 -1.51123550017e-01 -5.49549186448e-02 -2.98222893505e-01 + 3473 -1.33209749847e-01 -5.82882481170e-02 -2.87820644823e-01 + 3474 -9.75046373073e-02 -2.66394905697e-02 -3.94086606987e-01 + 3475 -7.93162625249e-02 -1.81739148796e-02 -4.15195201712e-01 + 3476 -8.65463009866e-02 -1.32124199964e-03 -4.10072782933e-01 + 3477 -1.01081896995e-01 -1.34740149975e-03 -3.94292913523e-01 + 3478 -6.40446842699e-02 1.30684483860e-02 -4.04964624381e-01 + 3479 -1.55323408554e-01 -9.30668344776e-02 -2.39145543205e-01 + 3480 -1.33356164899e-01 -6.37386988189e-02 -2.44762693301e-01 + 3481 -1.41429073538e-01 -8.61970224250e-02 -2.72397391999e-01 + 3482 -1.28427224551e-01 -6.59183736941e-02 -2.68297292373e-01 + 3483 -2.45997533518e-02 -1.57889106911e-01 -2.77261098450e-01 + 3484 -5.48949271514e-02 -1.49585725100e-01 -2.99562404630e-01 + 3485 -5.42243544509e-02 -1.47495649659e-01 -2.49266227681e-01 + 3486 -2.41527048848e-02 -1.56495723284e-01 -2.43730313818e-01 + 3487 -2.58311024794e-02 -1.40924933197e-01 -2.61298180694e-01 + 3488 -4.64383347216e-02 -1.29734620752e-01 -2.70844745562e-01 + 3489 -8.13361695931e-03 -1.19580281842e-01 -2.53356564946e-01 + 3490 -1.45198230385e-01 -2.81664662660e-02 -3.72108378580e-01 + 3491 -1.25309323672e-01 -2.25703116120e-02 -3.86334624924e-01 + 3492 -1.74219014569e-01 -1.32047037196e-01 -6.80564110472e-01 + 3493 -1.57332168261e-01 -1.66102653488e-01 -6.85573893042e-01 + 3494 2.47737761033e-01 -3.36832993388e-01 -4.53677216271e-01 + 3495 1.69696756277e-01 -3.91221995592e-01 -4.66416758576e-01 + 3496 1.91424148783e-01 -3.90446099728e-01 -4.28169740583e-01 + 3497 2.50693949455e-01 -3.53928132971e-01 -4.06927706382e-01 + 3498 1.41319034189e-01 -4.03921369959e-01 -4.14630219680e-01 + 3499 2.05171177900e-01 -3.55882054939e-01 -3.75997407928e-01 + 3500 2.93175531227e-01 -1.53134011308e-01 -2.42378914988e-01 + 3501 2.71864643493e-01 -1.37237691544e-01 -2.24613589456e-01 + 3502 1.95819524658e-01 -1.14994487603e-01 -2.52093585100e-01 + 3503 2.16251925158e-01 1.36620571641e-01 -5.70911428611e-01 + 3504 1.99998651017e-01 1.54030625638e-01 -5.30492401598e-01 + 3505 1.80318873281e-01 1.31390801970e-01 -5.61328542748e-01 + 3506 1.77112180644e-01 1.45755784885e-01 -5.33409993954e-01 + 3507 1.80930488679e-01 1.68955038632e-01 -3.63009647126e-01 + 3508 -1.47890432525e-01 2.21852495945e-01 -1.66415228751e-01 + 3509 -5.13323230041e-03 1.81029975129e-01 -3.79256516087e-02 + 3510 -3.25810329280e-02 1.94404076179e-01 -2.46201285575e-02 + 3511 -2.56736926142e-02 2.17510844665e-01 -4.08481432394e-02 + 3512 -8.47211442926e-02 1.95851179325e-01 -2.23282516240e-02 + 3513 -1.00430189504e-01 2.31234883627e-01 -4.55243351801e-02 + 3514 -1.75240678255e-02 1.65331499679e-01 -5.05609533677e-02 + 3515 -9.23992303844e-02 3.39277148642e-01 -8.87312611294e-02 + 3516 -1.02062060589e-01 3.41471479110e-01 -4.81840772784e-02 + 3517 -9.80305314910e-02 3.13089456314e-01 -6.27243356979e-02 + 3518 -5.24547642700e-02 3.20823255752e-01 -3.06466318247e-02 + 3519 -1.45206070721e-01 2.50785941752e-01 -8.33353725593e-02 + 3520 -1.10363593761e-01 9.47929707161e-02 -1.57703081198e-03 + 3521 -1.12518804598e-01 7.74555519191e-02 -1.57837567178e-02 + 3522 -1.40781889559e-01 1.06577705594e-01 -5.76795810321e-03 + 3523 -1.33317583575e-01 1.06494383758e-01 2.54863408642e-02 + 3524 -1.36105723641e-01 9.30709772357e-02 5.54441845105e-03 + 3525 -1.29570797680e-01 8.85131865591e-02 3.01514099474e-02 + 3526 -1.88039357414e-01 -4.32498501938e-03 -8.13373600545e-02 + 3527 -2.11057664183e-01 -1.42477452019e-02 -8.89818352609e-02 + 3528 -1.74767460939e-01 -1.97895434250e-02 -7.33362789966e-02 + 3529 -2.02658972854e-01 -4.24059629016e-02 -8.08024512774e-02 + 3530 -1.35799901979e-01 -3.62388758916e-03 6.80005912197e-03 + 3531 -1.31596035762e-01 3.64290819019e-03 -9.50093926730e-03 + 3532 -1.34768972386e-01 -1.26597198001e-02 -2.58284350610e-02 + 3533 -1.54030556652e-01 1.93266998300e-02 -1.36627830417e-02 + 3534 -1.76574983667e-01 -1.19571170262e-01 1.25163046126e-01 + 3535 -1.30391512975e-01 -2.46380780174e-01 7.37470068303e-02 + 3536 -1.95152568650e-01 -1.25508748238e-01 7.18397978309e-02 + 3537 -1.55870569385e-01 -2.19131561179e-01 4.66085804327e-02 + 3538 1.59583266656e-01 1.18772667057e-01 7.75662150121e-02 + 3539 1.72433791809e-01 8.60855983982e-02 5.24945242780e-02 + 3540 2.04927990719e-01 1.09844936168e-01 3.97873977064e-02 + 3541 -5.49050042078e-02 -6.18495099970e-02 7.32731499785e-02 + 3542 -5.02112697673e-02 -7.10700316310e-02 1.08417428940e-01 + 3543 -2.24409543865e-02 -4.26852362257e-02 7.76088384821e-02 + 3544 -8.49044815231e-03 -4.24441593912e-02 1.02483587291e-01 + 3545 -5.51571105856e-02 -4.87136965530e-02 1.71743051190e-01 + 3546 -2.26300341698e-02 -3.28333761427e-02 1.51461264391e-01 + 3547 7.52608576249e-02 -1.75076296545e-01 7.08992677426e-02 + 3548 7.51834419880e-02 -1.27605326137e-01 7.58284268052e-02 + 3549 -1.92579636265e-01 2.14740301185e-01 -5.90815440774e-01 + 3550 -3.27909273594e-01 5.00000000000e-01 -6.43553015262e-01 + 3551 -2.52795066440e-01 4.40568599767e-01 -6.14570008075e-01 + 3552 -2.18606182396e-01 5.00000000000e-01 -7.05702010175e-01 + 3553 -1.89596299830e-01 4.55426449826e-01 -6.68427506057e-01 + 3554 -5.41399918170e-02 1.48902671616e-01 -7.21744520781e-01 + 3555 1.45790628248e-02 1.39706327240e-01 -7.39825957556e-01 + 3556 -4.06049938627e-02 2.36677003712e-01 -7.48808390586e-01 + 3557 9.71937521655e-03 2.59804218160e-01 -7.69883971704e-01 + 3558 -3.09358611994e-01 2.01801246147e-01 -4.99493814988e-01 + 3559 -3.08574247004e-01 1.89399844302e-01 -4.55852904102e-01 + 3560 -2.57805138771e-01 1.98951567447e-01 -4.72633816349e-01 + 3561 -2.75512539839e-01 2.08169061577e-01 -5.10681089819e-01 + 3562 -2.85276007332e-01 2.12800337145e-01 -4.92121590772e-01 + 3563 -2.76725562451e-01 2.08199099581e-01 -4.60570242109e-01 + 3564 -3.12746875893e-01 2.26649106843e-01 -5.11609365196e-01 + 3565 -2.79507315044e-01 2.33031941275e-01 -4.97741216172e-01 + 3566 -2.63797301578e-01 2.36245886993e-01 -4.53224005877e-01 + 3567 -3.75164583929e-01 2.07984562673e-01 -5.01054174883e-01 + 3568 -3.77158786110e-01 2.47826311546e-01 -4.59844530287e-01 + 3569 -3.60600925076e-01 2.42520746119e-01 -4.91577306906e-01 + 3570 -3.75945763498e-01 2.47796273542e-01 -5.09955377998e-01 + 3571 -3.14134566768e-01 2.66475836714e-01 -4.95455144455e-01 + 3572 -2.18719998614e-01 3.57804783386e-01 -3.64824610163e-01 + 3573 -2.50170724327e-01 2.86707175080e-01 -3.18683899983e-01 + 3574 -2.43267486090e-01 3.54885911654e-01 -3.89405133366e-01 + 3575 -2.72417132391e-01 3.06514548871e-01 -3.66838167647e-01 + 3576 -4.23211388469e-01 1.66655849361e-01 -2.66792595677e-01 + 3577 -4.14055555301e-01 3.23861451678e-01 -3.74561759380e-01 + 3578 -3.85407407068e-01 2.65148602238e-01 -4.10023528455e-01 + 3579 5.26380413578e-03 -1.60817863091e-01 -8.12731584636e-02 + 3580 -1.79216216058e-02 -1.21681397637e-01 -5.31872416237e-02 + 3581 -7.32674848582e-03 -1.29129118249e-01 -9.44988172201e-02 + 3582 -2.15681796366e-02 -1.07698955369e-01 -7.01279649011e-02 + 3583 -6.04122283989e-02 -9.17445439600e-02 -7.60050816387e-02 + 3584 -2.69845392868e-02 -1.35440345228e-01 -1.54552774354e-01 + 3585 -2.42228820657e-02 -1.70284703560e-01 -1.71354094165e-01 + 3586 -2.76196919307e-02 -1.24088361935e-01 -1.69266937622e-01 + 3587 -2.59903046645e-02 -1.43533939725e-01 -1.85372538585e-01 + 3588 1.55060675063e-02 -1.65377198905e-01 -1.31734934339e-01 + 3589 -9.16565443996e-03 -2.73878575394e-01 -6.38771295630e-02 + 3590 2.12340773189e-03 -2.49032899179e-01 -1.06072468695e-01 + 3591 3.09766631021e-02 -2.76686020043e-01 -1.04746724180e-01 + 3592 -2.88234452409e-02 -2.80189802374e-01 -1.23931086697e-01 + 3593 -5.79615312268e-03 -2.92983980745e-01 -6.90102355802e-01 + 3594 -8.69422968402e-03 -1.89475971118e-01 -6.20153533702e-01 + 3595 -3.10506114733e-02 -2.81480671645e-01 -6.80207285933e-01 + 3596 -4.14008152978e-02 -2.08640895527e-01 -6.30276381245e-01 + 3597 -4.22754872891e-02 -8.52994932160e-02 -4.99956692175e-01 + 3598 -2.94925112309e-02 -7.97782407140e-02 -5.37251482756e-01 + 3599 -5.42791498312e-02 -2.68282533196e-02 -5.26483583652e-01 + 3600 -5.87999130226e-02 -4.99995016197e-02 -4.92778092772e-01 + 3601 -4.24414937069e-02 -6.42853107868e-02 -4.89320616922e-01 + 3602 -3.39748451407e-02 -5.35997483091e-02 -5.10638452225e-01 + 3603 -3.06038375826e-02 -1.01742368254e-01 -4.52157650193e-01 + 3604 -3.47157293752e-02 -6.82425000025e-02 -4.53909230516e-01 + 3605 -5.53904761829e-02 -4.87923808596e-02 -4.41389751089e-01 + 3606 4.84999942099e-02 1.95777933805e-02 -5.05957215444e-01 + 3607 6.97545945972e-02 2.44317811900e-02 -4.94087731009e-01 + 3608 1.67520818759e-01 -1.06085815440e-01 -2.59674423202e-01 + 3609 1.54050431582e-01 -1.11598176502e-01 -2.89126693317e-01 + 3610 3.36919564736e-01 -1.52013881914e-01 -2.72205970632e-01 + 3611 3.24307085188e-01 -1.31547555705e-01 -3.18698720337e-01 + 3612 2.65742780251e-01 -1.07407639817e-01 -3.77540426275e-01 + 3613 3.31384363182e-01 -9.91899591655e-02 -3.01038772128e-01 + 3614 -8.33617213629e-02 -5.68436448999e-02 1.01583227139e-01 + 3615 -7.87834890778e-02 -4.36329902742e-02 1.50785994276e-01 + 3616 -8.85857043451e-02 -1.31003604986e-03 1.67897027937e-01 + 3617 -8.80294200174e-02 -6.76645835941e-02 1.61920670840e-01 + 3618 -1.07355708388e-01 -1.61959489175e-02 1.93154559613e-01 + 3619 -9.95197339150e-02 -9.94963621926e-02 9.36838584151e-02 + 3620 -9.57865826832e-02 -1.15471593596e-02 -5.12580640611e-01 + 3621 -9.40067053272e-02 5.36178780473e-03 -5.12993170347e-01 + 3622 -6.57417909738e-02 8.10707552858e-04 -5.22399308953e-01 + 3623 -4.16251663595e-02 2.82245865703e-02 -3.92627067702e-01 + 3624 -1.10352724797e-01 -1.97829478088e-02 -4.90784795105e-01 + 3625 -8.75364835998e-02 -3.27156065985e-02 -4.92788141964e-01 + 3626 -3.91176951262e-02 4.23450507779e-02 -4.98378147441e-01 + 3627 -3.79392853720e-02 5.91395009144e-02 -4.85253373490e-01 + 3628 -7.41466554629e-02 -5.91960215076e-02 -3.75681385328e-01 + 3629 -9.07409214556e-02 -8.43996982698e-02 -3.82134100300e-01 + 3630 -6.33265654130e-02 -6.79501568647e-02 -3.60261484327e-01 + 3631 -7.07827127248e-02 -8.76706531586e-02 -3.59423327308e-01 + 3632 -1.11844331349e-01 -7.10965698987e-02 -3.96555153063e-01 + 3633 -9.41227793815e-02 -5.55195944198e-02 -3.88110353644e-01 + 3634 -8.76169046733e-02 -4.98736597864e-02 -4.04513441663e-01 + 3635 -1.02883226040e-01 -4.19121264864e-02 -3.75691434520e-01 + 3636 -8.96664689846e-03 -6.93616455987e-02 -6.09175978367e-01 + 3637 -5.13545634420e-03 -5.01222066922e-02 -5.87541463342e-01 + 3638 -3.76650985223e-03 -8.19553431619e-02 -5.65766715368e-01 + 3639 -2.19315119809e-03 -6.43773395912e-02 -5.60393144849e-01 + 3640 -1.88193658992e-02 -5.70666034357e-02 -5.39591799601e-01 + 3641 2.51062088347e-02 -4.89764384684e-02 -5.83534806942e-01 + 3642 1.89487273032e-02 -6.83652050750e-02 -5.48672601085e-01 + 3643 2.71596285727e-02 -9.67261431729e-02 -5.50872684983e-01 + 3644 3.83220452807e-02 3.23409481113e-01 -7.10348390781e-01 + 3645 3.80337552348e-02 2.51849332109e-01 -7.40261293086e-01 + 3646 5.07116736464e-02 1.69132442813e-01 -7.10348390781e-01 + 3647 -1.26144741871e-01 1.33608857971e-01 -5.94435708931e-01 + 3648 -1.04333622128e-01 1.22380023838e-01 -5.64053729497e-01 + 3649 -1.13110839211e-01 1.30359812217e-01 -6.14480783441e-01 + 3650 -4.70261616010e-02 1.13408542819e-01 -7.14281634564e-01 + 3651 1.41629522834e-02 1.38391345824e-01 -7.02305057190e-01 + 3652 -3.72723110626e-02 1.45617349460e-01 -6.98124204701e-01 + 3653 5.51667826204e-03 4.57396022130e-02 -6.88125534079e-01 + 3654 -1.03094251555e-02 5.00249607708e-02 -6.17188301119e-01 + 3655 3.53889012405e-02 6.96603884908e-02 -6.91850783646e-01 + 3656 7.47019149663e-03 6.82450474077e-02 -6.72909964674e-01 + 3657 -2.42937303689e-03 7.86037681778e-02 -6.20546619566e-01 + 3658 -1.95585263189e-02 5.05839546278e-02 -7.23043753880e-01 + 3659 -8.59544047911e-03 7.89764307491e-02 -6.91116921406e-01 + 3660 -3.14776032673e-02 9.98802035751e-02 -6.21675382109e-01 + 3661 6.81985367919e-02 7.47140097005e-02 -6.81752621399e-01 + 3662 7.85417540234e-02 8.72290512349e-02 -6.32336828532e-01 + 3663 -3.04441619613e-01 6.25540811136e-02 -6.85188567600e-01 + 3664 -3.42062792451e-01 2.76403213617e-02 -6.85057541056e-01 + 3665 -2.02816769535e-01 1.76574319638e-01 1.14289304362e-01 + 3666 -1.56894110431e-01 1.16382537626e-01 1.75657634805e-01 + 3667 -1.03601722416e-01 4.80906921527e-02 2.14483756211e-01 + 3668 -7.13764634520e-02 1.70911791114e-01 1.63237751734e-01 + 3669 -1.35410604455e-01 1.98263270267e-01 1.41493631820e-01 + 3670 -1.17820151397e-01 1.47697196101e-01 1.80718797788e-01 + 3671 -6.92672397088e-02 1.12607518610e-01 2.08289933053e-01 + 3672 -1.64263839342e-01 1.24482601088e-01 1.98199843842e-01 + 3673 -1.09708650993e-01 1.63535457900e-01 1.97433991473e-01 + 3674 -1.32038580378e-01 2.47303700049e-01 1.46953839365e-01 + 3675 -6.03064184892e-03 2.94688642208e-02 -5.92883011843e-01 + 3676 2.90970060941e-02 1.22037842521e-02 -5.81280763885e-01 + 3677 -2.09276780622e-02 8.99821238066e-03 -5.93550952917e-01 + 3678 -2.47492483795e-03 -9.33539154524e-03 -5.86038767970e-01 + 3679 -2.87458790044e-02 1.58787261339e-02 -6.09977126126e-01 + 3680 -4.97584963909e-03 -8.18142287830e-03 -6.06921935309e-01 + 3681 1.07270013128e-01 4.20411531851e-02 -5.64963211575e-01 + 3682 1.12675828325e-01 5.76072677999e-02 -5.72703072834e-01 + 3683 -8.15004466083e-02 1.31710204911e-01 -6.17676401695e-01 + 3684 -4.48078951109e-02 1.19848486425e-01 -5.95041319849e-01 + 3685 -8.48444358784e-02 1.22351922507e-01 -6.42977470484e-01 + 3686 -8.71969578511e-03 1.97677313856e-02 -5.08392038686e-01 + 3687 8.39021280250e-03 3.02729788281e-02 -5.33881862447e-01 + 3688 -4.30265538183e-02 1.44008456398e-02 -5.05305194670e-01 + 3689 -2.87065401536e-02 2.88479558636e-02 -5.09851718903e-01 + 3690 -2.39622158846e-02 3.88781956513e-02 -5.27331494817e-01 + 3691 -1.64247864110e-01 6.71380654017e-02 -6.55734639252e-01 + 3692 -8.79988687109e-02 2.37625736444e-02 -7.03874090175e-01 + 3693 -1.13893676808e-01 5.96457703256e-02 -6.99300979439e-01 + 3694 -7.68983845794e-02 8.94877565416e-02 -7.10556384997e-01 + 3695 -1.26051472624e-01 1.72490617398e-01 -3.69629506035e-01 + 3696 -1.19112361165e-01 1.05893493605e-01 -3.53441876699e-01 + 3697 -1.91740773646e-01 1.12548518003e-01 -3.45271227970e-01 + 3698 -1.84610088372e-01 1.22346547116e-01 -3.23611121131e-01 + 3699 -1.99756000272e-01 1.48167268617e-01 -4.21350792665e-01 + 3700 -1.90111030150e-01 1.45468420218e-01 -4.08081810293e-01 + 3701 -1.90828538374e-01 1.74604402150e-01 -3.11855935960e-01 + 3702 -1.73546003592e-01 1.42426599781e-01 -3.10352384061e-01 + 3703 -1.70453532641e-01 1.41162918591e-01 -3.24833003841e-01 + 3704 -1.80944398845e-01 1.62193559774e-01 -3.30662245033e-01 + 3705 -2.44566936850e-01 2.66177360713e-01 -3.35144680112e-01 + 3706 -2.21994704709e-01 2.54232398745e-01 -3.12605374237e-01 + 3707 -2.18206485647e-01 2.63937287667e-01 -2.94118418859e-01 + 3708 -2.02497513682e-01 1.32319772562e-01 -4.57284083263e-01 + 3709 -1.93184747725e-01 1.35078828230e-01 -4.76538183798e-01 + 3710 -3.72382831336e-01 1.83151720979e-01 -4.63883200821e-01 + 3711 -3.59047274784e-01 1.68204827362e-01 -4.42274498814e-01 + 3712 -3.12063033046e-01 1.67387945038e-01 -4.29718066999e-01 + 3713 7.14468871882e-02 -3.80538264159e-01 -4.24860568504e-01 + 3714 1.00362957399e-01 -3.20807396238e-01 -3.91342931164e-01 + 3715 1.17736746966e-01 -3.82433301153e-01 -3.97002598029e-01 + 3716 1.52444080366e-01 -3.43244401537e-01 -3.65371516311e-01 + 3717 -1.85812240825e-01 -2.58449023650e-01 -3.17847608066e-01 + 3718 -1.36549684414e-01 -3.38966015767e-01 -2.21593429298e-01 + 3719 -1.78732793350e-01 -3.43922422933e-01 -2.62615475074e-01 + 3720 -2.25635533936e-01 -2.91896563910e-01 -3.40458942844e-01 + 3721 -7.44767526029e-02 -1.23876282840e-01 -3.12675299616e-01 + 3722 -9.62819812727e-02 -1.38708142791e-01 -3.12012058762e-01 + 3723 -9.65016038514e-02 -1.46883818844e-01 -2.47425131479e-01 + 3724 -7.46231676553e-02 -1.29326733541e-01 -2.69617348094e-01 + 3725 -8.43774766179e-02 -1.15109399736e-01 -2.86938283467e-01 + 3726 -1.02214537070e-01 -1.22075012003e-01 -2.77917117515e-01 + 3727 -7.79533132871e-02 -1.95715721204e-01 -3.50397799469e-01 + 3728 -6.22576406124e-02 -1.61881335115e-01 -3.38265793421e-01 + 3729 -4.12411620571e-02 -1.93110565028e-01 -3.33856438185e-01 + 3730 -5.31551305496e-02 -1.90897895067e-01 -3.61128482457e-01 + 3731 -4.75829217280e-02 -1.66726562035e-01 -3.49346807174e-01 + 3732 -3.77828731258e-02 -1.60144564331e-01 -3.27238219231e-01 + 3733 -5.39246813989e-02 -1.40342559041e-01 -3.64837176162e-01 + 3734 -3.71360426242e-02 -1.53982453625e-01 -3.70754733586e-01 + 3735 -1.72125301689e-02 -1.37737402865e-01 -3.48295814878e-01 + 3736 -4.02709163047e-02 -1.83867398970e-01 -3.99131209718e-01 + 3737 -3.55876507473e-03 -1.81262242794e-01 -3.82589848434e-01 + 3738 1.45559625463e-02 -1.09525161119e-01 -2.60621658087e-01 + 3739 3.50258719749e-03 -1.40470806320e-01 -1.29038734438e-01 + 3740 5.70846933275e-02 3.63818877621e-01 -5.17117569884e-01 + 3741 -6.56634637293e-03 2.95728316431e-01 -5.35693909864e-01 + 3742 6.79554450646e-02 3.61363551035e-01 -5.38706925926e-01 + 3743 2.91450025100e-02 3.15151401380e-01 -5.58287604593e-01 + 3744 -6.71281630033e-02 -2.90344141283e-01 -1.41419267313e-01 + 3745 -4.13484736906e-02 -2.61382073596e-01 -1.64229072007e-01 + 3746 -4.24564410570e-02 -1.81842764795e-01 -2.09277072089e-01 + 3747 -8.16799587092e-02 -1.85516211925e-01 -1.97586365088e-01 + 3748 -1.29856792049e-01 -1.30364185406e-01 -2.54471371449e-01 + 3749 -1.25802694913e-01 -1.15887488635e-01 -2.75578800983e-01 + 3750 -1.29710376997e-01 -1.24913734704e-01 -2.97529322971e-01 + 3751 -1.37745363742e-01 -1.51141902897e-01 -2.76843439663e-01 + 3752 1.89914466187e-02 1.72490806406e-02 -5.06800150608e-01 + 3753 3.50870672397e-03 1.26261196056e-02 -4.94453210747e-01 + 3754 1.45652442849e-01 -2.81607736567e-01 -4.44706442726e-01 + 3755 1.84183280160e-01 -2.68266167395e-01 -4.58756636058e-01 + 3756 2.07490492140e-01 -2.82614363396e-01 -4.62711575986e-01 + 3757 1.70910609528e-01 -3.24981026877e-01 -5.10898134233e-01 + 3758 1.59796691752e-01 -2.96510609715e-01 -4.90881008223e-01 + 3759 1.85158757509e-01 -2.82778714549e-01 -4.89875011847e-01 + 3760 2.01022057946e-01 -2.97181694268e-01 -5.02884430396e-01 + 3761 1.99406905489e-01 -2.40576402221e-01 -4.68851889462e-01 + 3762 1.95633000179e-01 -2.69156386818e-01 -5.06977972713e-01 + 3763 1.62827022878e-01 -2.82943065703e-01 -5.17038447709e-01 + 3764 1.37568856198e-01 -2.39569775393e-01 -4.50846756202e-01 + 3765 -1.19331124669e-01 -1.29022469247e-01 -4.16965008227e-01 + 3766 -1.30904466825e-01 -1.00845083883e-01 -4.19775758348e-01 + 3767 -1.31753632770e-01 -1.17843088869e-01 -4.39334278296e-01 + 3768 -1.24321126648e-01 -1.42294014107e-01 -4.43979951531e-01 + 3769 -2.27112969307e-01 -2.82454053126e-01 -3.84476306733e-01 + 3770 -1.99876371890e-01 -2.34034938958e-01 -3.29201951918e-01 + 3771 -2.26227808957e-01 -2.65224115326e-01 -3.43321867039e-01 + 3772 -1.79505969702e-01 -2.26969701769e-01 -4.54316530949e-01 + 3773 -1.77334679760e-01 -2.10653011395e-01 -4.42878124572e-01 + 3774 -2.05005479548e-01 1.91442178760e-01 -3.30592704097e-01 + 3775 -1.92323611733e-01 1.98181012280e-01 -3.09191392225e-01 + 3776 -1.78645028344e-01 1.89202105714e-01 -2.89566442843e-01 + 3777 -1.67908230719e-01 1.21958331563e-01 -1.37103553855e-01 + 3778 -1.53078454169e-01 9.79022586020e-02 -1.40970652640e-01 + 3779 -1.93567373847e-01 1.07346984837e-01 -1.27969880724e-01 + 3780 -1.65241290738e-01 8.01426697978e-02 -1.36170570147e-01 + 3781 -7.24122534700e-02 -1.41407276683e-01 -4.20519841008e-01 + 3782 -4.94610906716e-02 -1.54692265386e-01 -4.07876510150e-01 + 3783 -3.57001022401e-02 -1.38802120507e-01 -4.03978479724e-01 + 3784 -5.85636007344e-02 -1.25675705434e-01 -3.85013821113e-01 + 3785 -4.48123918195e-02 -1.39572339774e-01 -3.84407827943e-01 + 3786 -3.40888332478e-02 -1.23938934650e-01 -3.73986246924e-01 + 3787 -2.63122073297e-01 3.91246892770e-02 -2.25254408332e-01 + 3788 -3.03825084970e-01 4.47564650123e-02 -2.50901106242e-01 + 3789 -2.85724875270e-01 6.05547538615e-02 -2.35091631034e-01 + 3790 -2.72007286016e-01 9.29125097544e-02 -4.78183736346e-01 + 3791 2.29592570851e-01 -2.75528052427e-01 -3.99310141236e-01 + 3792 1.83580713525e-01 -2.57548913910e-01 -4.25078448719e-01 + 3793 1.90495119743e-01 -2.28030554415e-01 -4.20293596782e-01 + 3794 2.16958251515e-01 -2.22260943926e-01 -4.05017017073e-01 + 3795 2.45418762816e-01 -2.58555540739e-01 -4.43083581979e-01 + 3796 2.09468793943e-01 -2.52226952290e-01 -4.45671306720e-01 + 3797 2.08182578502e-01 -2.31418673074e-01 -4.36934453267e-01 + 3798 2.31720485937e-01 -2.28701638967e-01 -4.32297018956e-01 + 3799 1.70946394189e-01 -2.04281805409e-01 -4.30785324556e-01 + 3800 2.01045914386e-01 -2.16715546623e-01 -4.49475890611e-01 + 3801 1.79386498900e-01 -8.49159444126e-02 -3.84832706782e-01 + 3802 2.06157285811e-01 -8.12241025791e-02 -4.03168772449e-01 + 3803 2.32825673909e-01 -8.75321365175e-02 -3.90555535590e-01 + 3804 1.97389995665e-01 2.09854749591e-01 -5.26314346555e-01 + 3805 1.70400986595e-01 2.24828770583e-01 -5.23431716422e-01 + 3806 1.71370614549e-01 2.36821449567e-01 -5.48024172706e-01 + 3807 2.12338942131e-01 2.20356757570e-01 -5.64644346046e-01 + 3808 2.16271369890e-01 -7.75205493446e-02 -5.95721611658e-01 + 3809 1.85907393226e-01 -9.41892729069e-02 -5.86400619907e-01 + 3810 1.25161406306e-01 -1.06460669668e-01 -6.43702201161e-01 + 3811 1.49493952355e-01 -1.45061278882e-01 -6.40467556574e-01 + 3812 1.24041837493e-01 -1.30373346176e-01 -6.36049962579e-01 + 3813 1.17249931679e-01 -1.32878639713e-01 -6.52058154517e-01 + 3814 9.60515239194e-02 -1.04583506811e-01 -6.05411283679e-01 + 3815 1.04262059631e-01 -1.37092796440e-01 -6.07971938064e-01 + 3816 8.41843119793e-02 -1.44210461878e-01 -6.17945213713e-01 + 3817 1.32550342994e-01 -1.62484420632e-01 -6.00559316799e-01 + 3818 -1.22924667870e-01 2.40214496230e-01 -3.05620718905e-01 + 3819 -1.20109133564e-01 3.81749047154e-01 -3.57007028624e-01 + 3820 -9.79079410574e-02 3.58864280202e-01 -3.68614073029e-01 + 3821 -1.16050695565e-01 3.61654431193e-01 -4.03642982867e-01 + 3822 -2.39941743070e-01 -4.97838819704e-02 -7.64435219609e-01 + 3823 1.47364678402e-01 -2.63773561319e-02 -5.68413659568e-01 + 3824 1.71204915589e-01 -5.00000000000e-01 -7.17298614395e-01 + 3825 2.29361729852e-01 -4.42105452004e-01 -7.47743379738e-01 + 3826 1.75424984081e-01 -4.56579089003e-01 -6.83781495600e-01 + 3827 6.72333121077e-02 -4.42105452004e-01 -6.35041994133e-01 + 3828 -3.06152786398e-02 3.88435256331e-02 -1.51439089845e-01 + 3829 -3.63324176507e-02 5.13603035672e-02 -1.41077641331e-01 + 3830 -3.01349147368e-01 -3.38581925117e-02 -3.74463120449e-01 + 3831 -3.07247972929e-01 -2.07262867800e-02 -4.06828003650e-01 + 3832 -1.86655906980e-02 -3.42497717546e-02 -4.00726761838e-01 + 3833 -5.05796919478e-02 -3.54578099007e-02 -4.15185152521e-01 + 3834 -3.09595528749e-02 -4.97728283709e-02 -4.06886849132e-01 + 3835 -7.51932430824e-03 -4.69803236404e-02 -4.19702165064e-01 + 3836 -2.76266960073e-02 -6.34342151669e-02 -4.21590480381e-01 + 3837 -3.24242831902e-01 4.48709765485e-01 -5.83417577833e-01 + 3838 -2.68823786960e-01 4.16958773939e-01 -5.76714181800e-01 + 3839 -2.29639646504e-01 7.50091553033e-02 -1.46501904319e-01 + 3840 -1.89289472509e-01 5.85841167751e-02 -1.48525252544e-01 + 3841 -2.13715335571e-01 5.39191829338e-02 -1.71700943352e-01 + 3842 -1.87433782808e-01 4.68728971301e-02 -1.66918694762e-01 + 3843 -1.84410958140e-01 -3.62707569864e-02 2.24633747324e-01 + 3844 -1.72828180278e-01 -3.36441284702e-02 1.79060772728e-01 + 3845 -2.26717874306e-01 -4.84656795068e-02 1.19394011247e-01 + 3846 -2.22963888333e-01 1.58209615633e-02 1.40723207845e-01 + 3847 -1.70325522963e-01 9.21363224320e-03 1.93280237127e-01 + 3848 -1.65159798361e-01 -1.87493677072e-04 1.66938883729e-01 + 3849 -1.98530133740e-01 1.08368389624e-03 1.23120413075e-01 + 3850 -1.18955356462e-01 2.25968376225e-02 1.72294111986e-01 + 3851 -8.61549701486e-02 -1.18423983895e-01 -3.93313590534e-01 + 3852 -7.23328014273e-02 -1.12371128655e-01 -3.73485638231e-01 + 3853 -9.53117355202e-02 -1.29464976733e-01 -3.77286830294e-01 + 3854 -7.38299221012e-02 -1.17714172134e-01 -3.56191813970e-01 + 3855 2.34926134865e-01 1.50398311067e-01 -6.18812828418e-01 + 3856 2.26489074548e-01 1.79245232819e-01 -6.48175460456e-01 + 3857 2.30234084408e-01 1.20177710270e-01 -6.42053775679e-01 + 3858 2.17851462010e-01 1.35267451632e-01 -6.26974154979e-01 + 3859 2.06535197514e-01 1.49455112989e-01 -6.49269685190e-01 + 3860 1.99710431254e-01 1.21038672204e-01 -5.97760330627e-01 + 3861 1.73665519132e-01 1.35205774525e-01 -6.16596713769e-01 + 3862 3.25887327068e-01 2.43731511376e-01 -5.91109765518e-01 + 3863 2.67849769424e-01 2.68090190390e-01 -6.28165089271e-01 + 3864 -9.82560973814e-03 -2.67779822440e-01 -3.51559996033e-01 + 3865 2.47233649126e-02 -2.99190290029e-01 -3.84778480081e-01 + 3866 -5.05311342210e-02 -3.10666420054e-01 -3.79978200627e-01 + 3867 -5.99952758272e-02 -2.75430575790e-01 -3.48359809730e-01 + 3868 -4.43822457388e-02 -2.76675803174e-01 -3.67629164069e-01 + 3869 -3.28684746386e-02 -3.00581441810e-01 -3.95131209446e-01 + 3870 -3.82333572566e-02 -2.42685186293e-01 -3.55280127511e-01 + 3871 -7.48396227513e-02 -2.62911372653e-01 -3.75465641066e-01 + 3872 -7.27976546072e-02 -2.91887615348e-01 -4.20636947630e-01 + 3873 -1.13487856390e-01 -2.54161316318e-01 -3.50479848056e-01 + 3874 1.62159145864e-02 -1.77879056664e-01 -3.07624167262e-01 + 3875 2.01108978389e-02 -1.49491999037e-01 -3.32413424496e-01 + 3876 1.21710496346e-02 -1.36990063288e-01 -3.82290893699e-01 + 3877 5.21844636518e-04 -1.49990225421e-01 -3.09750038616e-01 + 3878 7.36659956335e-03 -1.35672140011e-01 -3.27810513703e-01 + 3879 -2.17473199802e-03 -1.22730896504e-01 -3.59527856241e-01 + 3880 -8.98490100267e-02 -1.54629613576e-01 -3.46565562842e-01 + 3881 -1.15725853509e-01 -1.85762871689e-01 -3.08822909589e-01 + 3882 -1.15030703508e-01 -1.47994380566e-01 -3.18848969588e-01 + 3883 -1.05518794514e-01 -1.57613924211e-01 -3.43054869942e-01 + 3884 -1.02811591517e-01 -1.85999432841e-01 -3.44439463393e-01 + 3885 -1.14383873006e-01 -1.41832269860e-01 -3.62365483943e-01 + 3886 -1.14755607756e-01 -1.76519705631e-01 -3.74097681122e-01 + 3887 5.36602932288e-03 -5.34636097159e-02 -3.52172757315e-01 + 3888 -6.52818981181e-02 -1.06183895869e-01 -4.99469978666e-01 + 3889 -6.44287176890e-02 -1.09464528418e-01 -5.24170934550e-01 + 3890 -6.51696019235e-02 -1.24107280112e-01 -4.67441712841e-01 + 3891 -6.38336831825e-02 -1.37989921057e-01 -4.88479013755e-01 + 3892 -1.11022702738e-02 -9.87342067632e-02 -4.28769079784e-01 + 3893 -1.90615809454e-02 -7.43613459472e-02 -4.35929907628e-01 + 3894 -2.80162812542e-03 -6.70344618564e-02 -4.39450839833e-01 + 3895 -1.26588450995e-01 -9.37481624924e-02 -3.99557091158e-01 + 3896 -1.17434217615e-01 -1.10167445604e-01 -3.90943702014e-01 + 3897 -1.04221523623e-01 -1.91249007048e-02 -3.80444957539e-01 + 3898 4.13664380349e-02 1.60789677857e-01 -6.89577107201e-01 + 3899 4.27656223475e-02 2.01996608777e-01 -6.42769476268e-01 + 3900 1.87292964338e-01 1.65271112402e-01 -6.72489006642e-01 + 3901 1.49761944528e-01 1.33245555576e-01 -7.11866754981e-01 + 3902 1.83475592366e-01 2.44080756690e-01 -5.99473328224e-01 + 3903 1.55839628336e-01 2.80719694886e-01 -6.00807216833e-01 + 3904 1.88704837390e-01 3.02074756622e-01 -6.06186972766e-01 + 3905 2.18083883094e-01 2.84767151736e-01 -6.07090965671e-01 + 3906 1.70281686705e-01 3.16040729022e-01 -6.25731497283e-01 + 3907 2.05138679920e-01 2.97062307894e-01 -6.36859748898e-01 + 3908 1.39238211099e-01 2.77977479554e-01 -5.79301369131e-01 + 3909 1.52128381373e-01 2.52637448980e-01 -5.71243494157e-01 + 3910 1.91985014795e-01 1.95491713199e-01 -6.49248059381e-01 + 3911 2.13075246337e-01 2.22038434433e-01 -6.37854094827e-01 + 3912 2.04982333457e-01 2.11662994754e-01 -6.23824394340e-01 + 3913 2.32317479513e-01 2.06222435020e-01 -6.14634773375e-01 + 3914 1.51840245054e-01 2.04260674839e-01 -6.16564275055e-01 + 3915 1.82551593184e-01 2.22899396366e-01 -5.93560649775e-01 + 3916 1.51927935930e-01 1.30447603892e-01 -5.91785399519e-01 + 3917 1.76896015822e-01 1.21011819810e-01 -5.83860940726e-01 + 3918 1.37540106486e-01 1.05403067978e-01 -5.96810452840e-01 + 3919 1.75626822823e-01 1.01170201173e-01 -5.84569490008e-01 + 3920 -1.76071302812e-01 -1.24408242206e-01 -3.56838445410e-01 + 3921 -1.89054635614e-01 -1.39607874048e-01 -3.55606493964e-01 + 3922 -2.01230131493e-01 -1.30621546692e-01 -3.63301061538e-01 + 3923 -1.83784530644e-01 -1.71158855321e-01 -3.64332112102e-01 + 3924 -1.61674478955e-01 -1.64134898195e-01 -3.70542848341e-01 + 3925 -1.60463577986e-01 -1.11420531234e-01 -3.52354106454e-01 + 3926 -1.45663120472e-01 -1.33575731570e-01 -3.59995595423e-01 + 3927 -6.42950224269e-02 -1.53688278635e-01 -2.02860719200e-01 + 3928 -3.92236182583e-02 -1.58890176610e-01 -2.10310160923e-01 + 3929 -7.51033313358e-02 -1.39525350916e-01 -3.38424617462e-01 + 3930 -1.45023484777e-01 -2.57087794198e-01 -5.36244827866e-01 + 3931 -1.14065779557e-01 -3.01521662039e-01 -4.72447261452e-01 + 3932 -1.20810896573e-01 -2.57293475968e-01 -4.80968120347e-01 + 3933 -1.45780652018e-01 -2.68656781992e-01 -5.06142787944e-01 + 3934 -1.49607159156e-01 -3.01930008047e-01 -5.08853771212e-01 + 3935 -1.67681067566e-01 -2.58315849754e-01 -4.98504432348e-01 + 3936 -7.41761191883e-02 -1.27933349915e-01 -2.36086563461e-01 + 3937 -5.81570312629e-02 -9.10179084722e-02 -2.45712814590e-01 + 3938 -6.33486632070e-02 -1.19503153170e-01 -2.55565367927e-01 + 3939 7.45148651885e-02 3.60660748412e-01 -6.94956083762e-01 + 3940 5.38834590295e-02 3.31056503655e-01 -6.83630041599e-01 + 3941 3.08523136095e-02 3.65413780220e-01 -6.94375636388e-01 + 3942 8.22463202403e-02 2.29944719076e-01 -5.55969762166e-01 + 3943 8.87979325617e-02 2.02691354964e-01 -5.52518014380e-01 + 3944 1.06954541401e-01 2.06222256715e-01 -5.69446618093e-01 + 3945 1.25391804755e-01 1.99800861466e-01 -5.72518786789e-01 + 3946 1.31038149832e-01 2.26090727746e-01 -5.82637458712e-01 + 3947 1.37377753211e-01 1.76484204102e-01 -5.91763773710e-01 + 3948 2.83959625154e-01 3.96283577877e-01 -3.99265229884e-01 + 3949 2.73963291226e-01 3.62256893263e-01 -4.36337272217e-01 + 3950 3.03822130725e-01 3.16342524351e-01 -4.21794732981e-01 + 3951 -1.45483802100e-01 -4.48692145654e-02 -2.39096775330e-01 + 3952 -1.64171176937e-01 -5.81314769201e-02 -2.33463369276e-01 + 3953 1.57730352974e-01 -1.84033275995e-01 -4.49081747072e-01 + 3954 1.34433563372e-01 -1.91552996281e-01 -4.68260674153e-01 + 3955 1.28392941922e-01 -1.87475280844e-01 -4.19441138250e-01 + 3956 1.53703272008e-01 -1.81314799038e-01 -4.16535389803e-01 + 3957 1.48102021642e-01 -1.71870153570e-01 -4.33820190378e-01 + 3958 1.29361384797e-01 -1.72828926285e-01 -4.41518956201e-01 + 3959 1.96560207443e-01 -1.16904539710e-01 -5.02794929830e-01 + 3960 2.35257589266e-01 -1.64790709915e-01 -4.69645131686e-01 + 3961 2.18186903506e-01 -1.96338087527e-01 -4.73467852431e-01 + 3962 -6.59731928445e-02 -6.95340382295e-02 -2.48283859316e-01 + 3963 -7.67411789860e-02 -1.37468396583e-01 -2.04577348156e-01 + 3964 -9.24798553605e-02 -1.53280391425e-01 -2.01633321732e-01 + 3965 -2.35226460518e-01 -1.06986891473e-01 -1.83585036952e-01 + 3966 -2.03930133328e-01 -1.39166119765e-01 -1.79698743853e-01 + 3967 -2.39319537084e-01 -1.17829218449e-01 -2.26593340832e-01 + 3968 -2.25561637500e-01 -1.04571398238e-01 -2.04829740562e-01 + 3969 -2.01475811701e-01 -1.25219052687e-01 -2.09320446365e-01 + 3970 -2.41053526823e-01 -5.37131862466e-02 -1.65448281451e-01 + 3971 -2.26224740697e-01 -6.82504303411e-02 -1.99820138097e-01 + 3972 -1.90427553597e-01 -8.10614280669e-02 -2.04051395570e-01 + 3973 -1.27113983808e-01 -9.56843606650e-02 -1.37870902306e-01 + 3974 -1.27601315263e-01 -1.06560074872e-01 -1.53105292337e-01 + 3975 -1.64978251952e-01 -8.36438688530e-02 -2.05943342054e-01 + 3976 -1.69200367390e-01 -5.97980920910e-02 -2.09982261895e-01 + 3977 -1.87573940299e-01 -5.01278726463e-02 -2.10067270853e-01 + 3978 -8.82773678343e-02 -4.73583582919e-02 -4.36058920256e-01 + 3979 -8.26127225512e-02 -4.86222045039e-02 -4.75932884227e-01 + 3980 -1.20481426991e-01 -1.40210964580e-01 -3.87712188676e-01 + 3981 -1.07321430095e-01 -1.29243722990e-01 -3.97125919261e-01 + 3982 -1.05215105624e-01 -1.48172497880e-01 -4.16534195819e-01 + 3983 -9.30418791818e-02 -1.50550552397e-01 -4.46349840051e-01 + 3984 -1.12486611870e-01 -1.53338649366e-01 -4.36903106399e-01 + 3985 1.29660222433e-02 -1.67432426401e-01 -5.09287634003e-01 + 3986 -1.70170076827e-02 -1.73779135982e-01 -4.78082613003e-01 + 3987 -3.51746516472e-02 -1.46807646717e-01 -4.47310380187e-01 + 3988 -3.61230287062e-02 -1.67900652209e-01 -5.05528368715e-01 + 3989 -4.63380384133e-02 -1.72543627943e-01 -4.83064419287e-01 + 3990 -6.82168112999e-02 -1.54150799087e-01 -4.64210199504e-01 + 3991 -6.39953059645e-02 -1.94343924495e-01 -4.84436495925e-01 + 3992 7.94725746874e-03 -5.24755253259e-02 -4.42747311608e-01 + 3993 8.38508854491e-03 -3.42531210051e-02 -4.30680352353e-01 + 3994 -7.64475567451e-02 -3.77159357146e-02 -4.17738179038e-01 + 3995 1.03252878364e-02 -1.27040954954e-01 -4.14509992257e-01 + 3996 1.53749958275e-03 -1.44202490541e-01 -4.30769018903e-01 + 3997 -1.44997800455e-02 -1.23440708265e-01 -3.96649632804e-01 + 3998 -9.21639397404e-03 -1.19366215771e-01 -4.17224271946e-01 + 3999 -2.15888134133e-02 -1.28248993101e-01 -4.28968382940e-01 + 4000 -1.85914088499e-02 -1.16133671933e-01 -3.75987669934e-01 + 4001 -3.46632751439e-01 -1.93564840246e-01 -2.29293344801e-01 + 4002 -3.34429342304e-01 -1.55830738907e-01 -2.19809414389e-01 + 4003 -2.79239123072e-01 -1.39785217419e-01 -2.45688018344e-01 + 4004 -3.71381680436e-01 -1.36596217900e-01 -2.19793036533e-01 + 4005 -3.98957616349e-01 -1.29132983975e-01 -2.60142096033e-01 + 4006 -3.92788679179e-01 -8.89448237914e-02 -2.15312009108e-01 + 4007 -3.73672990986e-01 -1.07506846704e-01 -2.42945977813e-01 + 4008 -2.17331247465e-01 -1.20555358301e-01 -3.77017577778e-01 + 4009 -2.32834726642e-01 -1.06839497643e-01 -3.66502468557e-01 + 4010 -2.69988385269e-01 -1.46252159381e-01 -3.65308550016e-01 + 4011 -2.53707526583e-01 -1.20927852093e-01 -3.56338822399e-01 + 4012 -2.21324589116e-01 -3.18957114327e-02 -1.84331861440e-01 + 4013 -2.15135233949e-01 -4.82530132071e-02 -2.05389858927e-01 + 4014 -2.58571134415e-01 -1.29170142697e-01 -2.51406976605e-01 + 4015 -1.42249508024e-02 -7.62242902132e-03 -7.12777388070e-01 + 4016 -8.44431516999e-02 -1.50416821217e-02 -6.97029846301e-01 + 4017 -3.49119464466e-02 1.62513887052e-02 -6.80547427967e-01 + 4018 -8.24038482087e-02 4.71849444832e-03 -6.76794261666e-01 + 4019 4.47161182667e-02 -6.32108791511e-02 -5.68660614514e-01 + 4020 6.58107150179e-02 -8.89946542871e-02 -5.80854705125e-01 + 4021 4.70883284024e-02 -3.42033558653e-02 -5.69604413894e-01 + 4022 5.63002305845e-02 -4.85724570281e-02 -5.61931367835e-01 + 4023 7.42246658579e-02 -6.08821664111e-02 -5.67817679349e-01 + 4024 4.32314309475e-02 -5.16615446978e-02 -5.41592331474e-01 + 4025 5.91718098109e-02 -3.59934266850e-02 -5.41642763582e-01 + 4026 4.67897461511e-02 -8.15025976922e-03 -5.43008030545e-01 + 4027 -3.22060693108e-01 1.63433205994e-01 -1.27421284636e-01 + 4028 -2.40488805432e-01 1.36650250896e-01 -1.18895205041e-01 + 4029 -2.38578481339e-01 1.87729519931e-01 -1.32249285800e-01 + 4030 -3.03933861005e-01 1.63912624841e-01 -1.08097764645e-01 + 4031 -3.26992536955e-01 1.21920813788e-01 -9.11445370877e-02 + 4032 -4.11585944385e-01 2.94116665857e-01 -1.54259033551e-01 + 4033 -3.74559179904e-01 2.83829056536e-01 -9.11929271653e-02 + 4034 -1.68855945809e-01 3.64712740712e-02 -3.51989572126e-03 + 4035 -1.92603304262e-01 1.62594085836e-01 -2.64066594530e-03 + 4036 -1.64128274046e-01 1.61215688062e-01 2.11026034182e-02 + 4037 -2.10322199812e-01 1.85187121520e-01 2.25208485393e-02 + 4038 -1.97245144851e-01 1.91799201566e-01 4.67368662765e-02 + 4039 -2.42121454812e-01 1.68740702250e-01 2.49289845203e-02 + 4040 -2.38405499871e-01 1.70435612684e-01 6.24570791166e-02 + 4041 -1.36263273253e-01 1.04390392740e-01 6.05152994867e-02 + 4042 -1.77743382945e-01 9.40437037486e-02 7.87409914860e-02 + 4043 -1.32716761412e-01 9.14304925949e-02 5.52568616435e-02 + 4044 -1.59187997260e-01 8.02127332194e-02 6.56545103619e-02 + 4045 -9.77288532393e-02 1.12633090712e-01 7.73185661100e-02 + 4046 -1.05844977456e-01 9.26056578617e-02 6.47062267780e-02 + 4047 -2.28251956901e-01 5.00000000000e-01 2.49554387443e-01 + 4048 -2.39994266754e-01 4.17655409524e-01 1.99038055626e-01 + 4049 -3.18834637934e-01 5.00000000000e-01 7.69774409101e-02 + 4050 -3.04995700066e-01 4.38241557143e-01 8.22344286808e-02 + 4051 -1.84620631328e-01 1.63940763173e-01 -1.42567027221e-01 + 4052 -2.07297526950e-01 1.68194009225e-01 -1.38299069589e-01 + 4053 -1.26333865189e-01 2.43044593143e-01 1.03068039775e-01 + 4054 -7.35270248524e-02 3.31535800033e-01 9.76721512052e-02 + 4055 -8.38763773420e-02 3.07283444857e-01 7.70782235530e-02 + 4056 -1.11635745024e-01 3.29164202634e-01 3.74702024918e-02 + 4057 -2.02631933111e-01 1.36047615324e-01 -5.92018803552e-02 + 4058 -2.06198659834e-01 1.20000075815e-01 -3.04983314901e-02 + 4059 -2.11612756585e-01 1.00517229410e-01 -4.92088994245e-02 + 4060 -2.11039637687e-01 1.04721306949e-01 -7.45814546461e-02 + 4061 -1.98965887215e-01 7.89060120859e-02 -4.89027976753e-02 + 4062 2.03433558249e-01 -2.23543231860e-01 -5.63666994376e-01 + 4063 1.80663994081e-01 -2.31434557724e-01 -5.93757196100e-01 + 4064 1.82745951450e-01 -2.18185267820e-01 -5.76023557490e-01 + 4065 1.80966205415e-01 -1.82141571755e-01 -5.73621363582e-01 + 4066 1.88538506557e-01 -2.52376877059e-01 -5.53026390438e-01 + 4067 1.65920048056e-01 -2.35621709939e-01 -5.73048675903e-01 + 4068 1.54837477305e-01 -1.90274386902e-01 -5.67957944247e-01 + 4069 1.85707435230e-01 -1.21409791172e-01 -5.72493035040e-01 + 4070 1.56305357659e-01 -7.98497809410e-02 -5.87426348079e-01 + 4071 1.75534933653e-01 -1.01356321071e-01 -5.86806811622e-01 + 4072 1.51364169848e-01 -1.67802079790e-01 -5.74647091753e-01 + 4073 1.66108115873e-01 -1.63614927575e-01 -5.95355611950e-01 + 4074 1.71829042794e-01 -1.67320545208e-01 -5.77222369377e-01 + 4075 1.88877680041e-01 -1.55723601711e-01 -5.65265410225e-01 + 4076 1.19883920870e-01 -1.19357814417e-01 -5.37537402841e-01 + 4077 1.14176746032e-01 -1.07268613041e-01 -5.63468808211e-01 + 4078 1.34783212933e-01 -1.08392352435e-01 -5.39279431157e-01 + 4079 1.35944860396e-01 -9.66777308565e-02 -5.57147710841e-01 + 4080 1.25990700800e-01 -1.72823796433e-01 -5.49383919468e-01 + 4081 1.46991075052e-01 -1.74694996991e-01 -5.40530160199e-01 + 4082 1.32132985511e-01 -1.56168352811e-01 -5.62264408567e-01 + 4083 1.46347695023e-01 -1.61735614134e-01 -5.52403966841e-01 + 4084 -2.31602532279e-02 -1.40067928826e-01 -5.67590927388e-01 + 4085 -2.76690820234e-02 -1.43788561792e-01 -6.11953947848e-01 + 4086 4.54995483132e-04 -1.22148468570e-01 -5.85993011790e-01 + 4087 -8.83043829124e-03 -1.29418808358e-01 -6.14664756035e-01 + 4088 -1.82066778038e-02 -9.66510396402e-02 -6.39677315168e-01 + 4089 1.00990111790e-02 -1.55087163431e-01 -6.21034749333e-01 + 4090 5.49937664540e-03 -1.18769687890e-01 -6.61738584681e-01 + 4091 3.34918865757e-02 -1.57015831285e-01 -5.81212129614e-01 + 4092 2.45391791306e-02 -1.40391466953e-01 -5.47124149533e-01 + 4093 1.99968767241e-03 -1.18397036000e-01 -5.59231806185e-01 + 4094 -1.32289140718e-02 -1.29092865314e-01 -5.38043348049e-01 + 4095 -4.63622800112e-02 -3.73777613369e-01 -2.63013824338e-01 + 4096 -5.45025997683e-02 -3.31572931843e-01 -2.68541125238e-01 + 4097 -8.83334281239e-02 -3.36107544212e-01 -2.43348255958e-01 + 4098 -1.76194978580e-01 -2.18379123687e-01 -3.66756699680e-01 + 4099 -1.50290150859e-01 -2.34965300744e-01 -3.74179729709e-01 + 4100 -1.74851436418e-01 -2.04210077834e-01 -3.77208251120e-01 + 4101 -1.57133703884e-01 -2.10544513921e-01 -3.85640788286e-01 + 4102 -1.08801682675e-01 -3.51447506035e-01 -5.04614289205e-01 + 4103 -7.15056041162e-02 -3.67681108026e-01 -4.78930122030e-01 + 4104 -1.25854456418e-01 -2.18801052211e-01 -3.88010676806e-01 + 4105 -1.37096044797e-01 -2.04526524227e-01 -3.93148733965e-01 + 4106 -1.33444008482e-01 -1.71580783845e-01 -3.85586089228e-01 + 4107 1.70426379674e-01 -1.50264944527e-01 -6.26587717994e-01 + 4108 1.86528532312e-01 -1.35666692905e-01 -5.60075436695e-01 + 4109 1.29125993626e-01 -2.20840575545e-01 -5.31970001518e-01 + 4110 1.49081270270e-01 -2.06706183065e-01 -5.28920881565e-01 + 4111 1.29850085932e-01 -1.95072456086e-01 -5.16538198380e-01 + 4112 1.44635520339e-01 -1.90913691591e-01 -5.18109309200e-01 + 4113 1.63280339878e-01 -2.09003586749e-01 -4.86834698931e-01 + 4114 1.52619650100e-01 -1.87181130222e-01 -4.86447996655e-01 + 4115 1.65545720620e-01 -1.82634306523e-01 -4.67516970719e-01 + 4116 1.76961537312e-01 -1.95667002974e-01 -4.61464430257e-01 + 4117 1.95935211512e-01 -2.19863400849e-01 -4.86842140195e-01 + 4118 1.98032391679e-01 -2.07146009493e-01 -4.67812578373e-01 + 4119 -7.67221686602e-02 -8.45727124811e-02 -8.00457442823e-02 + 4120 -9.14602736373e-02 -9.08464071200e-02 -6.64109474654e-02 + 4121 -1.80105474968e-01 -1.72330580902e-01 -1.21571649652e-01 + 4122 -1.44585249124e-01 -2.54247935676e-01 -9.84500051791e-02 + 4123 -1.64634879373e-01 -2.83639402040e-01 -9.45834394925e-02 + 4124 -1.15344419293e-01 -2.93202612838e-01 -1.19664440652e-01 + 4125 -1.54004343144e-01 -1.89803919257e-01 -1.64954125097e-01 + 4126 7.36660721898e-02 -3.51346156842e-01 -5.38251020345e-01 + 4127 1.18478655274e-01 -3.83320684585e-01 -5.04564037217e-01 + 4128 9.36835615173e-02 -3.44421042067e-01 -5.13329797572e-01 + 4129 1.20373166434e-01 -2.92561389422e-01 -5.20474449034e-01 + 4130 1.71245313019e-01 -2.13514781441e-01 -3.81256015715e-01 + 4131 1.54706003439e-01 -2.35775254449e-01 -3.66522077118e-01 + 4132 1.45530089163e-01 -1.83680759900e-01 -3.35116459166e-01 + 4133 1.65128036835e-01 -1.78785118408e-01 -3.60318937080e-01 + 4134 1.58238241676e-01 -1.93981282654e-01 -3.82950891861e-01 + 4135 1.42876344841e-01 -2.02310431731e-01 -3.73693224844e-01 + 4136 3.80622477390e-01 -2.19268737092e-01 -5.02181411908e-01 + 4137 3.54773401995e-01 -2.22385939836e-01 -4.58680462926e-01 + 4138 3.49238200442e-01 -1.69562017088e-01 -4.87513264422e-01 + 4139 3.37697463133e-01 -1.84326599147e-01 -4.58554589558e-01 + 4140 1.77074800942e-01 -1.09276206256e-01 -3.67175052539e-01 + 4141 1.64344131086e-01 -9.75321548832e-02 -3.85633410161e-01 + 4142 -8.77773136396e-02 -8.08003970381e-02 6.34507696287e-02 + 4143 -1.23909919884e-01 -9.49462738266e-02 3.88864025316e-02 + 4144 -1.43782402149e-01 -1.12125542859e-01 5.08536726901e-02 + 4145 -1.40750733717e-01 -8.12831963219e-02 -4.13299463057e-02 + 4146 -1.73340998202e-01 -4.15356031220e-02 -5.71168475085e-02 + 4147 -1.92996578341e-01 -7.34850368120e-02 -4.96801312590e-02 + 4148 -1.60820552028e-01 -6.59658942913e-02 -3.65139504302e-02 + 4149 -1.36991489831e-01 -4.21598909910e-02 -3.70830343203e-02 + 4150 -2.28581162410e-01 -7.81050877352e-02 6.79937745782e-02 + 4151 -2.26693373547e-01 -6.35823128513e-02 4.54788402327e-02 + 4152 -2.52370289878e-01 -7.53127933224e-02 3.13335124649e-02 + 4153 -2.24821918524e-01 -3.89817824044e-02 7.22406865636e-02 + 4154 -2.62401565509e-01 -4.42772378876e-02 6.44036180773e-02 + 4155 -3.49823414743e-02 1.31728910644e-01 1.12449388937e-01 + 4156 -6.53519935911e-02 1.55635784316e-01 1.16846472985e-01 + 4157 -6.17754192580e-02 1.23842285659e-01 1.16980345885e-01 + 4158 -6.45995410542e-02 1.23428457304e-01 1.47952489351e-01 + 4159 -8.21678009125e-02 8.45759903697e-02 9.06730322685e-02 + 4160 -3.92788679179e-01 9.86492385537e-03 -1.79801875328e-01 + 4161 -4.19591509384e-01 -4.35931329507e-02 -1.70394807126e-01 + 4162 -3.16295017933e-01 3.81722138565e-02 -5.43499224042e-02 + 4163 -2.90554291770e-01 5.06054095911e-02 -3.40352502431e-02 + 4164 -3.60515003480e-01 3.62239756860e-02 -2.88545819923e-02 + 4165 -3.11454040080e-01 5.34509827223e-02 -1.02667992481e-02 + 4166 -2.04996598178e-01 8.55875532907e-02 -1.20426788225e-01 + 4167 -1.80894729763e-01 7.06241748977e-02 -1.28463078417e-01 + 4168 -2.13389335091e-01 -1.38572047908e-01 -1.31401395489e-01 + 4169 -2.38138264088e-01 -8.16034255617e-02 -1.21901087220e-01 + 4170 -2.34496780043e-01 -1.14586144653e-01 -1.46390452404e-01 + 4171 -3.10898915047e-01 1.00087325479e-01 -3.12931362789e-01 + 4172 -2.96592489111e-01 1.12964686930e-01 -3.08501827079e-01 + 4173 -2.37036691590e-01 2.56868079049e-02 -2.00373283326e-01 + 4174 -2.42808233398e-01 3.22783265065e-02 -2.24465561603e-01 + 4175 -3.19903462197e-01 5.17260985689e-02 -3.28865196960e-01 + 4176 -3.04394077670e-01 4.10498111040e-02 -3.44853256019e-01 + 4177 -3.43966439575e-01 2.06592598699e-02 -2.56121907980e-01 + 4178 -3.23005544387e-01 2.85076654802e-02 -2.66277030094e-01 + 4179 -3.31401020883e-01 5.22196989368e-02 -2.91250165742e-01 + 4180 -5.43411056345e-02 1.01056163154e-01 -6.89733102863e-01 + 4181 -1.00416984911e-01 1.05807175203e-01 -5.51597987012e-01 + 4182 -1.67705694830e-01 5.84229033689e-02 -6.35808338483e-01 + 4183 -1.51247943474e-01 -2.09246594595e-01 -2.52490787946e-01 + 4184 -1.51674678309e-01 -1.95020015102e-01 -2.79168122378e-01 + 4185 -1.62897800843e-01 -1.70596240959e-01 -2.76517054631e-01 + 4186 -1.66354351798e-01 -1.71939369240e-01 -2.57848475761e-01 + 4187 -1.42672958488e-01 -1.56283553970e-01 -2.95403223523e-01 + 4188 -1.50182680230e-01 -2.40618978188e-01 -3.06939414689e-01 + 4189 -1.50769047167e-01 -2.22105947670e-01 -3.13335258827e-01 + 4190 -1.74717543209e-01 -2.27821634472e-01 -3.22739335791e-01 + 4191 -1.26501286919e-01 -2.24963162917e-01 -3.44494162451e-01 + 4192 -1.35414819742e-01 -1.35327015057e-01 -3.06277690039e-01 + 4193 -1.14121732073e-01 -2.15340510974e-01 -3.62288764589e-01 + 4194 -1.01319593438e-01 -2.31598395927e-01 -3.72210755705e-01 + 4195 8.57163541439e-02 -1.28686580584e-01 -4.50886100591e-01 + 4196 1.01211541546e-01 -1.69966079704e-01 -4.37168595887e-01 + 4197 1.07213370246e-01 -1.58437648568e-01 -4.20790904024e-01 + 4198 8.20684687443e-02 -1.45613920998e-01 -4.35330225361e-01 + 4199 6.96856157772e-02 -1.49024965899e-01 -4.51095127048e-01 + 4200 6.56585348106e-02 -1.46306488941e-01 -4.18548769780e-01 + 4201 3.88792883930e-02 -1.51769340264e-01 -4.33805394521e-01 + 4202 9.58252959877e-02 -1.12089935629e-01 -4.48416696200e-01 + 4203 -4.60635809000e-02 -1.29985763885e-01 -4.39995957129e-01 + 4204 -3.54373769436e-02 -1.42804883612e-01 -4.25644429955e-01 + 4205 -2.46360227897e-02 -1.58292512076e-01 -4.25736869602e-01 + 4206 -6.81229683263e-02 -1.39698598870e-01 -4.54499427381e-01 + 4207 -3.53437916327e-02 -2.17666118394e-02 -5.32413200198e-01 + 4208 -2.48494026645e-02 -4.31106434516e-02 -5.19046947492e-01 + 4209 -3.25603666581e-01 1.44444388313e-01 2.97569856842e-02 + 4210 -3.06591091109e-01 1.49671011581e-01 9.78593809504e-03 + 4211 5.52495541424e-02 -3.88509617631e-01 -6.11188265259e-01 + 4212 1.11972446243e-01 -1.45775784461e-01 -5.45893356198e-01 + 4213 1.02309534092e-01 -1.46895568107e-01 -5.76002738245e-01 + 4214 1.20083723416e-01 -1.40046204737e-01 -5.56426363839e-01 + 4215 1.16345541039e-01 -1.38882867260e-01 -5.80010287752e-01 + 4216 5.31079936570e-02 -2.49234458410e-01 -4.71970353974e-01 + 4217 7.84335682223e-02 -2.33645944953e-01 -4.95236917419e-01 + 4218 4.52115463960e-02 -2.12059028376e-01 -4.64144839153e-01 + 4219 3.09599791062e-02 -2.34843180692e-01 -4.51242301797e-01 + 4220 5.76121983792e-02 -2.36024829367e-01 -4.51143415398e-01 + 4221 7.59973163301e-02 -2.21229277382e-01 -4.59712144836e-01 + 4222 7.00128503623e-02 -2.59990630358e-01 -4.38141991643e-01 + 4223 7.03835044234e-02 -2.38792400985e-01 -4.21648860986e-01 + 4224 1.04346834372e-01 -2.17982858816e-01 -4.19754677936e-01 + 4225 3.67908285361e-02 -2.38403713782e-01 -4.07049913378e-01 + 4226 1.60558794627e-02 -6.67901635611e-02 -7.17825723121e-01 + 4227 6.41186376676e-03 -3.38514687001e-02 -6.82783985578e-01 + 4228 -4.36278707851e-03 -6.31960584558e-02 -6.87257986376e-01 + 4229 -2.17122137397e-02 -5.54915619219e-02 -7.08744921637e-01 + 4230 1.36759119946e-01 3.64708205263e-01 -7.01239832599e-01 + 4231 1.27711265029e-01 3.62030546766e-01 -6.76798622962e-01 + 4232 -3.33657043478e-03 3.05982379987e-01 -6.03243634289e-01 + 4233 -2.50242782609e-03 3.54486784990e-01 -6.59932725717e-01 + 4234 1.59272184734e-01 2.34612255665e-01 -5.73866443837e-01 + 4235 1.48779058936e-01 -2.55999169034e-01 -5.49056714084e-01 + 4236 9.25167558327e-02 -2.23134421868e-01 -5.34522360557e-01 + 4237 1.16408864264e-01 -2.48929905404e-01 -5.46699305222e-01 + 4238 1.14984108667e-01 -2.64536081973e-01 -5.24567991351e-01 + 4239 -8.60830470301e-02 4.15477246636e-02 1.82116492336e-01 + 4240 -1.01977941411e-01 2.40630756382e-02 1.58566075136e-01 + 4241 4.68404884754e-02 -4.36325519238e-03 -6.90362091691e-01 + 4242 7.13847235867e-02 -1.35714190868e-02 -6.75208604110e-01 + 4243 9.07239527301e-03 6.93534644687e-03 -6.81281290206e-01 + 4244 -1.22671879790e-02 2.12012658748e-02 -6.64982844594e-01 + 4245 4.97488599087e-02 6.58345928161e-03 -5.68101718523e-01 + 4246 3.59443310476e-02 1.86295889989e-02 -5.36502450897e-01 + 4247 4.08750201417e-02 2.29849160950e-02 -5.56949111792e-01 + 4248 2.41491710096e-02 3.21989516798e-02 -5.62017606457e-01 + 4249 1.49662613666e-01 7.55485931153e-02 -5.83759419561e-01 + 4250 1.26163732105e-01 6.56741691823e-02 -5.92391838290e-01 + 4251 1.10249100132e-01 8.22856777799e-02 -6.03970000053e-01 + 4252 4.97647472955e-02 2.20775697684e-01 -6.00925791862e-01 + 4253 4.06562432717e-02 1.99522119011e-01 -6.07510158011e-01 + 4254 -2.12178315680e-03 5.74130693590e-02 -5.85955964613e-01 + 4255 1.74134543250e-03 7.70001477672e-02 -5.96282787575e-01 + 4256 -1.62339018980e-02 9.06498978952e-02 -5.88947351940e-01 + 4257 -3.00425461230e-02 1.07933686452e-01 -5.77153812788e-01 + 4258 -1.02251395808e-01 -1.79618160050e-01 -6.58345879927e-01 + 4259 -1.44702622827e-01 -1.86319676202e-01 -6.76810938863e-01 + 4260 -7.25040486785e-02 -4.90887185220e-02 -6.97942381918e-01 + 4261 -1.56957806530e-01 2.26735909628e-01 -4.99803017364e-01 + 4262 -2.88857973412e-01 2.61306280070e-01 -4.89092587872e-01 + 4263 -2.81501517225e-01 2.72873690147e-01 -4.56531571576e-01 + 4264 -2.68691059443e-01 1.66692883258e-01 -3.46909284371e-01 + 4265 -2.76199983513e-01 1.74240939246e-01 -3.72757316582e-01 + 4266 -2.86346362754e-01 1.94684921425e-01 -3.31926985311e-01 + 4267 -2.97237413238e-01 2.09047638138e-01 -3.44164907099e-01 + 4268 -1.29497450014e-02 -1.64079193043e-01 -2.10311412110e-02 + 4269 -1.92184516489e-02 -2.48059394782e-01 -2.30446238487e-02 + 4270 2.52085059440e-03 -2.75388014181e-01 5.95706894810e-03 + 4271 3.09313448776e-02 -2.89888900014e-01 7.87031153847e-02 + 4272 4.69395003208e-02 -2.56307222409e-01 4.59031828665e-02 + 4273 1.75766888377e-01 -1.39952338068e-01 -3.45930638913e-01 + 4274 1.66247873776e-01 -1.30271838950e-01 -3.24332887580e-01 + 4275 1.45342080598e-01 -1.17543828950e-01 -3.13853900063e-01 + 4276 1.24561626463e-01 -1.48907106250e-01 -3.17549951947e-01 + 4277 3.22407371886e-01 -2.89320317180e-01 -4.20233434128e-01 + 4278 3.81604914590e-01 -2.58531693165e-01 -4.52657556450e-01 + 4279 3.81604914590e-01 -3.59546878120e-01 -4.03902606388e-01 + 4280 4.11203685943e-01 -3.18898769873e-01 -4.32303405065e-01 + 4281 -9.21451571566e-02 7.65696908176e-02 7.78751612298e-02 + 4282 5.62191171939e-02 -1.32909337651e-01 -4.09409562076e-01 + 4283 3.52198137099e-02 -1.32085521436e-01 -4.16534242669e-01 + 4284 -7.52249048628e-02 -2.94484936467e-01 -4.56777249996e-01 + 4285 -7.41927922497e-02 -2.56749261947e-01 -4.18982155421e-01 + 4286 -7.56644455307e-02 -2.67481841137e-01 -4.46501080248e-01 + 4287 -1.01704875550e-01 -2.63171959741e-01 -4.53522364635e-01 + 4288 5.90573489223e-02 -2.57182518487e-01 -3.66391166374e-01 + 4289 5.13684306973e-02 -2.29620302503e-01 -3.21813606280e-01 + 4290 8.14871106930e-02 -2.30210410253e-01 -3.11909554218e-01 + 4291 9.66526161749e-02 -2.48781923493e-01 -3.38326576927e-01 + 4292 7.86975758579e-03 -2.04492178653e-01 -4.61108463534e-01 + 4293 -2.04145174543e-02 -1.98485637484e-01 -4.45963166023e-01 + 4294 -1.36524470307e-02 -1.75649912685e-01 -4.54209421861e-01 + 4295 7.45775980394e-03 -1.72042365198e-01 -4.67055038814e-01 + 4296 1.11202422984e-01 -1.60779315248e-01 -3.35328113878e-01 + 4297 1.20728330291e-01 -1.87919154013e-01 -3.52965172667e-01 + 4298 2.46536195854e-01 -1.42642486909e-01 -1.29123101281e-02 + 4299 2.97060272255e-01 -1.38335919347e-01 2.82458058514e-04 + 4300 2.11272859696e-01 -3.11982678958e-01 -1.51152024106e-01 + 4301 7.62608485797e-02 -2.95847641033e-01 -1.21259694828e-01 + 4302 1.82195636435e-01 -2.72877556617e-01 -1.26488171751e-01 + 4303 4.45911355178e-02 -8.36641175761e-03 -5.12884262674e-01 + 4304 3.70067268485e-02 1.17725128156e-02 -5.15536019906e-01 + 4305 6.20649256909e-02 -5.02392381255e-02 -4.95774478294e-01 + 4306 7.17274729732e-02 -3.50452223034e-02 -5.11097528129e-01 + 4307 5.44273359210e-02 -2.91947489473e-02 -5.19391254419e-01 + 4308 4.22189253820e-02 -3.73739350434e-02 -5.11940463293e-01 + 4309 -1.98351707100e-02 4.15149939382e-02 -5.61283744218e-01 + 4310 -9.59606176520e-04 4.01489697994e-02 -5.75535081783e-01 + 4311 1.25779312090e-02 -3.42241312714e-02 -6.12213683737e-01 + 4312 1.00651795978e-02 -2.85789306733e-02 -5.95228371126e-01 + 4313 3.52931683644e-02 -2.06339931845e-02 -5.95119569454e-01 + 4314 -4.86746120392e-02 -2.30280155514e-03 -5.27867590038e-01 + 4315 -3.70431463472e-02 4.51584027781e-02 -5.49520498052e-01 + 4316 -3.28310916945e-01 7.00058108305e-02 -3.12799722505e-01 + 4317 -2.69465978393e-01 2.60934700605e-01 -4.34415238775e-01 + 4318 -2.53651321684e-01 2.32536501989e-01 -4.24838084042e-01 + 4319 -2.54432501253e-01 2.72348212858e-01 -4.33739287156e-01 + 4320 -2.90917418499e-01 1.71773817236e-01 -4.09796547900e-01 + 4321 -2.93833584924e-01 1.66856744116e-01 -4.26163089568e-01 + 4322 -2.85431244855e-01 1.81354276651e-01 -4.42401321826e-01 + 4323 -2.76855825184e-01 1.95978652599e-01 -4.25970625453e-01 + 4324 -2.63848402528e-01 1.71248339947e-01 -3.87004263480e-01 + 4325 -2.42059271252e-01 1.80659214871e-01 -3.59592539198e-01 + 4326 -2.61304604721e-01 1.66335447781e-01 -3.64056502597e-01 + 4327 -2.70619685663e-01 1.46741353048e-01 -3.62719923339e-01 + 4328 -2.21838483386e-01 1.69837379909e-01 -3.61763120194e-01 + 4329 -2.16069564329e-01 1.71362126095e-01 -3.43851441166e-01 + 4330 -2.11659445401e-01 1.40555614759e-01 -4.46837601766e-01 + 4331 -2.11168317378e-01 1.59689342790e-01 -4.59032952859e-01 + 4332 -2.26086716951e-01 2.05530375743e-01 -4.42751537700e-01 + 4333 -1.99721121564e-01 2.02381661775e-01 -4.41268582544e-01 + 4334 -2.11633286370e-01 1.81216409627e-01 -4.61775944175e-01 + 4335 -2.33181071564e-01 1.76260468223e-01 -4.69600368157e-01 + 4336 -1.28493107238e-01 -1.46799937464e-01 -3.73914839318e-01 + 4337 2.17155601120e-02 -2.49615668764e-01 -3.63354790756e-01 + 4338 2.64739048238e-02 -2.24575736021e-01 -3.19789355867e-01 + 4339 3.76366317543e-02 -2.17530787576e-01 -3.37007666818e-01 + 4340 3.81853109233e-02 -2.31875759923e-01 -3.71790727060e-01 + 4341 3.45188805728e-02 -1.84051351856e-01 -3.34636978065e-01 + 4342 3.37830237355e-02 -1.88829092516e-01 -3.85626224052e-01 + 4343 -1.89801956864e-01 -2.45913951342e-01 -4.86154095895e-01 + 4344 -4.34969682052e-02 -1.39028924942e-01 -5.28034970571e-01 + 4345 -6.02072123536e-02 -1.49657653827e-01 -5.44397230971e-01 + 4346 1.14802241734e-01 -1.78720680274e-01 -4.28304867068e-01 + 4347 1.13330646430e-01 -1.93167311600e-01 -4.41727982659e-01 + 4348 1.09303565463e-01 -1.90448834642e-01 -4.09181625390e-01 + 4349 1.58832250092e-01 -2.36608726302e-01 -5.42498195978e-01 + 4350 1.71548623104e-01 -2.48107843170e-01 -5.18966512359e-01 + 4351 -3.01569662381e-01 2.13459269566e-01 -3.67234453732e-01 + 4352 -2.88988792279e-01 1.91725347447e-01 -3.93985908931e-01 + 4353 1.30125411959e-01 -9.01444799439e-02 -6.40213686213e-01 + 4354 1.12373492253e-01 -8.34543081310e-02 -6.13523569575e-01 + 4355 6.25556347350e-02 -1.72047679423e-01 -5.91839168687e-01 + 4356 5.16171086884e-02 -1.59700937515e-01 -5.39269654146e-01 + 4357 7.46391161435e-02 -1.73837750243e-01 -5.63877518375e-01 + 4358 6.79007103339e-02 -1.51955699696e-01 -5.78607433930e-01 + 4359 5.03065700940e-02 -1.35237141029e-01 -5.67112162962e-01 + 4360 8.41015203631e-02 -1.26700228091e-01 -5.91600885694e-01 + 4361 -2.43296217676e-01 3.56183031308e-01 -3.01014521992e-01 + 4362 -2.22729457249e-01 3.40825602040e-01 -3.13357819452e-01 + 4363 -2.45033093936e-01 2.87767469387e-01 -2.65441749095e-01 + 4364 -1.83868518770e-01 3.61547124079e-01 -3.22150396558e-01 + 4365 -1.97893504561e-01 2.92320686118e-01 -2.54672579575e-01 + 4366 -2.55579947904e-01 2.12584971778e-01 -4.40648723010e-01 + 4367 -2.51585172699e-01 1.87722092081e-01 -4.53588596658e-01 + 4368 -2.67330481977e-01 1.97465110023e-01 -4.49302220901e-01 + 4369 -2.77228098158e-01 -3.66323769408e-02 -3.63204750224e-01 + 4370 -4.09234568382e-02 6.80792460079e-02 -1.27924945660e-01 + 4371 -2.05675689627e-01 1.05764476941e-01 -5.94969704160e-01 + 4372 -1.95568379683e-01 1.15162356514e-01 -5.79802399470e-01 + 4373 -1.96898472544e-01 9.77846885623e-02 -5.44542650216e-01 + 4374 -1.92374216505e-01 7.80922735618e-02 -5.29600676294e-01 + 4375 -2.08130681647e-01 2.08065679326e-01 -4.22967997000e-01 + 4376 -2.28510931933e-01 2.12059494489e-01 -4.17856438590e-01 + 4377 -2.30322439277e-01 2.95560073610e-01 -4.27846444310e-01 + 4378 -1.98383492491e-01 3.02096505033e-01 -4.60035831658e-01 + 4379 -2.50531324722e-01 1.70221732356e-01 -4.71015954761e-01 + 4380 -2.54326686110e-01 1.71874596026e-01 -4.89521887256e-01 + 4381 1.38213002527e-01 -8.28072758349e-02 -5.75297818473e-01 + 4382 1.24456973662e-01 -8.52443789506e-02 -5.85561919263e-01 + 4383 9.19228566236e-02 -5.59606025009e-02 -5.83300294854e-01 + 4384 9.22129529855e-02 -7.30617397814e-02 -5.97152517206e-01 + 4385 4.60850647587e-02 -9.50440156208e-02 -5.46885866540e-01 + 4386 3.51955297601e-02 -7.41938439354e-02 -5.46232508228e-01 + 4387 3.10322087117e-02 -7.01552758946e-02 -5.20710950773e-01 + 4388 4.35878718740e-02 -6.92070715130e-02 -4.90165715320e-01 + 4389 3.33226350966e-02 -5.48161358546e-02 -5.03692394813e-01 + 4390 1.93972706023e-01 -2.46476639640e-01 -5.10939139950e-01 + 4391 2.12773989298e-01 -2.48778927723e-01 -5.30969934532e-01 + 4392 -1.99424764904e-04 4.13880390509e-01 3.98634095579e-01 + 4393 -2.50299137147e-01 3.70820585763e-01 3.47951143368e-01 + 4394 1.44986953995e-02 5.00000000000e-01 3.33036258295e-01 + 4395 1.07244529759e-02 4.35410292881e-01 2.98752765406e-01 + 4396 -1.52367396032e-01 4.13880390509e-01 2.31670353874e-01 + 4397 2.49700862853e-01 3.70820585763e-01 3.47951143368e-01 + 4398 1.80965937301e-01 4.13880390509e-01 2.31670353874e-01 + 4399 2.71748043099e-01 5.00000000000e-01 2.49554387443e-01 + 4400 1.79668192577e-01 -2.49026187108e-01 -3.77451431824e-01 + 4401 2.00717860766e-01 -2.53754392966e-01 -3.40753769634e-01 + 4402 1.85832127477e-01 -2.29018099187e-01 -3.85769547095e-01 + 4403 2.01919884570e-01 -2.25500873786e-01 -3.64077144060e-01 + 4404 2.50388068233e-01 -1.22804188719e-01 -3.85836292934e-01 + 4405 3.00473690024e-01 -3.22253015499e-01 -3.84631851620e-01 + 4406 3.50355267518e-01 -3.66689761624e-01 -3.81284126442e-01 + 4407 -3.36295093619e-01 -2.34871541292e-01 -2.68390411701e-01 + 4408 6.23385286745e-02 -2.79316785150e-01 -4.06801238788e-01 + 4409 9.22793707485e-02 -2.78769435064e-01 -3.97483244640e-01 + 4410 6.77275864416e-02 -3.07342092600e-01 -4.02707696471e-01 + 4411 8.51879038808e-02 -2.90399013298e-01 -4.14742461404e-01 + 4412 1.12764923666e-01 -2.93728189290e-01 -4.11177539510e-01 + 4413 9.79205767414e-02 -2.81208986153e-01 -4.38283370846e-01 + 4414 8.52278513476e-02 -2.51311604122e-01 -3.94543029650e-01 + 4415 1.06881676181e-01 -2.46478886468e-01 -3.66456621746e-01 + 4416 1.18800630726e-01 -2.63173201211e-01 -3.59054629104e-01 + 4417 1.26845606475e-01 -2.22648817046e-01 -3.73902251302e-01 + 4418 2.10204921971e-02 -3.66126860019e-01 -4.20484267782e-01 + 4419 5.41993765227e-02 -3.55506569450e-01 -4.25004733150e-01 + 4420 1.24672088875e-01 -2.79313485915e-01 -5.03067525826e-01 + 4421 1.03534388648e-01 -2.63645862549e-01 -4.76346654696e-01 + 4422 2.64637592279e-01 -2.48577142267e-01 -4.19281909640e-01 + 4423 2.66333911028e-01 -2.52074198875e-01 -3.85494353099e-01 + 4424 2.85666031709e-01 -3.12774170731e-01 -4.34049222264e-01 + 4425 2.77525672733e-01 -2.89043790171e-01 -4.51651822416e-01 + 4426 2.83913067351e-01 -2.73937928959e-01 -4.31658508053e-01 + 4427 2.91469104874e-01 -2.84722895596e-01 -4.13259003164e-01 + 4428 3.02019899517e-01 -2.73407887803e-01 -4.42441296992e-01 + 4429 3.01492223673e-01 -2.95801659043e-01 -4.77822663007e-01 + 4430 2.43099448576e-01 -3.31823232282e-01 -3.56369413920e-01 + 4431 2.63091382785e-01 -2.97422269962e-01 -3.61472464268e-01 + 4432 2.82753410231e-01 -3.10571774731e-01 -3.88301424024e-01 + 4433 2.75979463239e-01 -3.37888917866e-01 -3.93842377044e-01 + 4434 2.19347349277e-01 -2.98542399356e-01 -3.31645408624e-01 + 4435 2.14224738490e-01 -3.10049572821e-01 -2.97813042319e-01 + 4436 2.40279324759e-01 -2.81061885848e-01 -3.41653697709e-01 + 4437 2.43841576062e-01 -2.82906496988e-01 -3.22434883200e-01 + 4438 2.34836990912e-01 -2.45376377085e-01 -3.51062034744e-01 + 4439 2.49559177254e-01 -2.28681315556e-01 -4.17142405458e-01 + 4440 2.45663918079e-01 -2.24380744392e-01 -3.93904199703e-01 + 4441 2.27208726229e-01 -2.26280741670e-01 -3.65977499285e-01 + 4442 9.20129949898e-02 -1.00282258047e-01 -5.83244932338e-01 + 4443 9.91805290057e-02 -1.25739537459e-01 -5.90707010962e-01 + 4444 4.92330181578e-02 -1.66397925532e-02 -5.81775584040e-01 + 4445 1.05264103473e-01 -8.55106712274e-02 -5.94870734595e-01 + 4446 9.04265606152e-02 -1.91123235793e-01 -5.46131639191e-01 + 4447 7.52982753960e-02 -1.85629165841e-01 -5.12650835369e-01 + 4448 8.88039047440e-02 -1.66262366974e-01 -5.44326786807e-01 + 4449 7.81774959742e-02 -1.54312697399e-01 -5.21404633465e-01 + 4450 1.87256696810e-02 -1.63758771792e-02 -6.66660262803e-01 + 4451 -3.82974829681e-01 3.86099297953e-02 -2.01002231280e-01 + 4452 -1.13506819513e-01 -3.06164396397e-01 -1.78022215885e-01 + 4453 -1.28977415109e-01 -1.94855575259e-01 -2.05010426044e-01 + 4454 -1.06239204230e-01 -2.71141681444e-01 -1.61029087473e-01 + 4455 -1.38858511871e-01 -1.69100646538e-01 -2.38236270305e-01 + 4456 -1.53285676014e-01 -1.51156714536e-01 -2.45818165576e-01 + 4457 -1.78073048339e-01 -1.33222656961e-01 -2.32716544789e-01 + 4458 -1.68825988286e-01 -1.51171526176e-01 -2.14792891488e-01 + 4459 -2.48476159529e-01 -2.63721377372e-01 -1.06480980250e-01 + 4460 -1.25252973498e-01 -1.68343869050e-01 -2.06189628288e-01 + 4461 -1.40696111650e-01 -1.56138862980e-01 -1.79878495072e-01 + 4462 -1.83380103578e-01 1.48631651693e-01 -1.90496384685e-02 + 4463 -1.61322349872e-01 1.43058575130e-01 -8.69044973384e-03 + 4464 -1.73396100344e-01 1.68873869993e-01 -3.43691067047e-02 + 4465 -1.35317468168e-01 1.70635364298e-01 -2.64900577208e-02 + 4466 -1.07979330069e-01 1.55451499772e-01 -9.63873331782e-03 + 4467 -1.34317525872e-01 1.38564874028e-01 -5.01858428329e-04 + 4468 -1.27186533987e-01 1.49171715615e-01 2.20897074416e-02 + 4469 3.28643765156e-02 -1.61217984837e-01 -3.46475718290e-01 + 4470 3.18223039383e-02 -1.56792022938e-01 -3.84414795690e-01 + 4471 4.50054237123e-02 -1.54536565519e-01 -3.34437674909e-01 + 4472 -5.11499273493e-02 -2.23947642577e-01 -3.75410942008e-01 + 4473 -5.50960274172e-04 -2.30836864059e-01 -4.04013537759e-01 + 4474 -2.60283293610e-02 -2.16048761088e-01 -4.07899882173e-01 + 4475 -3.92521367806e-02 -2.13276292631e-01 -3.77205668614e-01 + 4476 -2.66751598626e-02 -2.22210871793e-01 -3.64383367819e-01 + 4477 2.55251690138e-02 -1.44379701776e-01 -4.08048144110e-01 + 4478 2.47332705704e-02 -1.61600307774e-01 -4.16733545825e-01 + 4479 2.33409639991e-02 -2.19356556786e-01 -3.98896558396e-01 + 4480 2.23302930609e-02 -2.21447946217e-01 -4.34079188456e-01 + 4481 2.89547759058e-02 -2.01793433182e-01 -4.36959842246e-01 + 4482 6.06545323266e-03 -2.29798614210e-01 -4.49218051385e-01 + 4483 3.23522856774e-02 -1.77086931680e-01 -4.69079289226e-01 + 4484 7.39071211126e-02 -1.89218091307e-01 -4.71321423470e-01 + 4485 5.70887818945e-02 -1.68699253052e-01 -4.73228114945e-01 + 4486 5.24101050107e-02 -1.59467023323e-01 -5.01416620037e-01 + 4487 1.44690175770e-01 1.54831871409e-01 -6.06687363948e-01 + 4488 1.56769311185e-01 1.66132074336e-01 -6.28195561590e-01 + 4489 1.32685702754e-01 1.46263603305e-01 -6.15004720971e-01 + 4490 -1.28539543710e-01 1.67354395016e-01 7.29348286641e-02 + 4491 -1.56803733567e-01 1.40871262276e-01 5.75928078561e-02 + 4492 -1.03460713763e-01 1.53264186918e-01 5.66445242721e-02 + 4493 -1.30928563643e-01 1.36924389387e-01 4.92105847641e-02 + 4494 -2.16135789807e-01 1.05528385314e-01 -1.02851892337e-01 + 4495 -2.12229370797e-01 1.26681617019e-01 -1.02022322040e-01 + 4496 -2.36277552568e-01 1.05123063997e-01 -1.14377004437e-01 + 4497 -1.02468483601e-01 1.73574471810e-01 -3.38153277275e-02 + 4498 -1.18856960178e-01 1.89738038840e-01 -5.31084087994e-02 + 4499 -3.41601043673e-01 1.30248793209e-03 3.10546783247e-02 + 4500 -2.58552618669e-01 9.68225460946e-03 8.88909825993e-02 + 4501 -2.46045081433e-01 -2.16492993497e-04 5.19053341316e-02 + 4502 -3.09533811075e-01 2.29531151477e-02 3.00182003035e-02 + 4503 -3.39035079113e-01 3.72754829301e-02 4.73795880060e-02 + 4504 -2.52366135969e-01 3.57966252391e-02 -1.61453810596e-01 + 4505 -2.62837080869e-01 -2.79872345938e-04 -1.48349113189e-01 + 4506 -3.19759764336e-01 8.08267500594e-02 -1.09549003273e-01 + 4507 -3.14274601977e-01 4.99629538222e-02 -1.30001158242e-01 + 4508 -3.41891387246e-01 3.06340649599e-02 -1.10780475853e-01 + 4509 -3.39616373953e-01 9.93983882758e-03 -8.30222623783e-02 + 4510 -3.12789215119e-01 -2.68910969273e-02 -7.09683714737e-02 + 4511 -3.17779248526e-01 -2.16453176066e-02 -3.08386209148e-02 + 4512 -2.59424560929e-01 -3.13212115444e-02 -1.06711792977e-01 + 4513 -2.50385620159e-01 -6.66754424269e-02 -8.27434282381e-02 + 4514 -2.36654033495e-01 -2.17858940986e-02 -1.45412388710e-01 + 4515 -2.22957203547e-01 -1.34046110252e-02 -1.64584046887e-01 + 4516 -2.35846958480e-01 3.72649783436e-03 -1.72932415932e-01 + 4517 -2.34741280402e-01 2.97822784780e-02 -1.76615113301e-01 + 4518 2.17414597643e-01 -2.35820787173e-01 -6.12666794475e-01 + 4519 1.02846959865e-01 1.43638048227e-01 -6.18069354843e-01 + 4520 9.61369813907e-02 1.15522506316e-01 -6.06961387380e-01 + 4521 -4.06959322623e-01 3.10847205157e-01 -5.89966533498e-01 + 4522 -6.26679310991e-03 1.44205581282e-01 -2.04908061719e-01 + 4523 -2.87143055369e-02 1.40396731589e-01 -2.09183353493e-01 + 4524 1.62789590090e-01 -2.77813215623e-01 -3.60381763642e-01 + 4525 1.85057250344e-01 -2.77051494558e-01 -3.73357889507e-01 + 4526 1.91664300176e-01 -2.99586875084e-01 -4.18938135243e-01 + 4527 1.54382678793e-01 -2.65065402213e-01 -3.90536761162e-01 + 4528 1.73185151807e-01 -2.67681064766e-01 -3.92730106180e-01 + 4529 1.73632485516e-01 -2.79581175187e-01 -4.29574342230e-01 + 4530 1.95535602832e-01 -2.70081638653e-01 -4.43895012353e-01 + 4531 2.14857851711e-01 -2.80252259739e-01 -4.41577764403e-01 + 4532 2.52240158949e-01 -3.05083005276e-01 -4.64737151755e-01 + 4533 2.46578261924e-01 -2.97694267063e-01 -4.48380399125e-01 + 4534 2.41689364306e-01 -3.16398013068e-01 -4.35554857926e-01 + 4535 2.22606226347e-01 -3.31016612253e-01 -1.91721189730e-01 + 4536 1.30141635129e-01 -3.73366381880e-01 -2.08237052133e-01 + 4537 3.09483158993e-01 -2.74688816337e-01 -2.45933229053e-01 + 4538 3.24972800628e-01 -2.21522794066e-01 -2.65349855173e-01 + 4539 3.07881182046e-01 -2.63171698584e-01 -2.77369563031e-01 + 4540 2.95650461222e-01 -1.72005594812e-01 -2.74703827482e-01 + 4541 -8.58924539049e-02 1.92116653853e-01 1.13923981355e-01 + 4542 -1.73519324627e-01 1.95891672868e-01 8.12916831071e-02 + 4543 -1.30289062044e-01 2.07329047533e-01 1.09944334014e-01 + 4544 -1.88736533547e-01 1.99127416995e-01 -6.55161918579e-02 + 4545 -1.68464256497e-01 2.10386262199e-01 -7.06458542531e-02 + 4546 -2.13340566458e-01 1.87327762883e-01 -9.24537360094e-02 + 4547 -1.42416267057e-01 3.19345166476e-01 -1.16367099606e-02 + 4548 -1.64098875012e-01 -1.48135258706e-01 -1.56482396649e-01 + 4549 -1.81151090913e-01 -1.45447420077e-01 -1.26063472176e-01 + 4550 -3.55750670173e-01 9.22958935229e-02 7.10784632570e-02 + 4551 -2.83626005259e-01 9.22128704986e-02 1.24439295476e-01 + 4552 -3.20146030950e-01 9.11981693408e-02 6.00360390028e-02 + 4553 -2.60194707933e-01 9.07769125973e-02 9.19291190639e-02 + 4554 -7.77451038961e-02 1.75358433070e-01 9.14589648882e-02 + 4555 1.20155428828e-01 -5.85332296068e-02 -5.16542464146e-01 + 4556 1.00380208729e-01 -5.28789839799e-02 -5.07221446827e-01 + 4557 8.53336351097e-02 -4.18589169185e-02 -4.93575266853e-01 + 4558 8.34273243003e-02 -5.42594923382e-02 -4.77519146538e-01 + 4559 6.42289342853e-02 -6.74803038257e-02 -4.77876407246e-01 + 4560 -1.54972432889e-02 -1.86905666864e-01 -3.00123787487e-01 + 4561 -1.93395062825e-02 -1.63732390882e-01 -3.03593285946e-01 + 4562 -7.53754839472e-02 -2.43801668276e-01 -3.85517373550e-01 + 4563 -1.46966769592e-02 -2.18967099444e-01 -4.40831681289e-01 + 4564 2.63689878968e-01 -3.05973224699e-01 -5.12958488410e-01 + 4565 2.36201416601e-01 -3.10391342960e-01 -4.94360398620e-01 + 4566 2.27853570541e-01 -3.33327447596e-01 -4.96861523919e-01 + 4567 4.56916602083e-01 -2.36483480163e-01 -7.11725347674e-01 + 4568 4.42555469443e-01 -3.15311306884e-01 -6.72300463565e-01 + 4569 5.00000000000e-01 -2.32318148378e-01 -7.25835267031e-01 + 4570 2.53937899472e-01 -3.93823957882e-01 -7.28156432204e-01 + 4571 4.19981957196e-02 -1.76670601710e-01 -6.56886617802e-01 + 4572 2.79987971464e-02 -2.84447067807e-01 -7.14591078534e-01 + 4573 6.68443906293e-02 -2.40889049701e-01 -7.16014317932e-01 + 4574 8.91258541724e-02 -1.54518732934e-01 -6.78019090576e-01 + 4575 7.87657638556e-02 -1.37466436715e-01 -6.64213613080e-01 + 4576 6.47933081229e-02 -1.15918123721e-01 -6.81253735162e-01 + 4577 4.38939614481e-02 -1.46550250493e-01 -6.45523472065e-01 + 4578 -3.57018958996e-01 1.94014803194e-01 -4.94606309806e-01 + 4579 2.13311642217e-01 -3.29097387435e-01 -3.83768319030e-01 + 4580 2.02944519333e-01 -3.04818223952e-01 -3.58375588781e-01 + 4581 1.94061835493e-01 -3.14581614461e-01 -3.44730737963e-01 + 4582 -2.48901389566e-01 -6.85791096376e-03 -1.06254729727e-01 + 4583 -2.32748026862e-01 -2.13429176238e-02 -1.14575782233e-01 + 4584 -2.34379020202e-01 -4.24801202308e-02 -1.17654175235e-01 + 4585 -2.06321884117e-01 1.47017878690e-01 8.51624583217e-02 + 4586 -2.19753296649e-01 3.98489733071e-02 1.02785060644e-01 + 4587 -2.30684694102e-01 9.31282871236e-02 1.01590143481e-01 + 4588 -2.36468887709e-01 9.48693838999e-02 1.26483935894e-01 + 4589 -2.76527904349e-01 1.85109795922e-01 -3.99363971017e-01 + 4590 -2.62357004088e-01 2.05691679059e-01 -4.06669163759e-01 + 4591 -7.85944092944e-02 -5.34848503573e-02 7.69335683679e-02 + 4592 -1.68729004765e-01 1.61419328046e-01 -2.94011152198e-01 + 4593 -2.06802392090e-01 -1.83265369028e-01 -5.82615006504e-01 + 4594 -1.88677076719e-01 -1.79658302728e-01 -5.61463714412e-01 + 4595 2.38303503834e-01 -1.17517792352e-01 3.23990932031e-01 + 4596 2.17475603889e-01 -2.52000513199e-01 3.99197147845e-01 + 4597 2.23776490251e-01 -1.37904556037e-01 2.84428580178e-01 + 4598 2.05048885759e-01 -2.34355291164e-01 3.21378606771e-01 + 4599 3.89979651863e-01 -1.74276175329e-01 3.36789250201e-01 + 4600 3.20051584409e-01 -1.82539065917e-01 2.79773341674e-01 + 4601 1.44784311161e-01 2.45880048376e-01 3.31432194142e-01 + 4602 2.38303503834e-01 2.15815540982e-01 3.23990932031e-01 + 4603 1.78578059302e-01 2.22271948618e-01 2.91968770707e-01 + 4604 2.59787009810e-01 2.97696273623e-01 2.89826929046e-01 + 4605 7.14374124029e-02 1.29695931490e-01 2.22625027609e-01 + 4606 1.39680514716e-01 1.96544410434e-01 1.84740393569e-01 + 4607 2.87866643194e-02 -3.00766468373e-01 3.66033955078e-01 + 4608 6.00651498333e-02 -3.99688282365e-01 3.88580508207e-01 + 4609 -2.16829307408e-02 -3.34667008799e-01 4.32798098563e-01 + 4610 0.00000000000e+00 -5.00000000000e-01 5.00000000000e-01 + 4611 -1.64117666293e-02 3.09410036282e-01 3.73574145607e-01 + 4612 -1.88549022172e-01 2.45880048376e-01 3.31432194142e-01 + 4613 -1.26672139882e-01 -1.02480781388e-01 -5.85098852890e-02 + 4614 2.17886407382e-01 -2.28053181158e-01 -5.44464501462e-01 + 4615 -1.68383130148e-01 5.32321786864e-02 8.17989355027e-02 + 4616 -2.02230628625e-01 2.27890121209e-02 9.90675013666e-02 + 4617 -2.22255953964e-01 -3.00878740633e-03 8.85655962449e-02 + 4618 -1.55222144504e-01 -1.92093035719e-02 -5.75458764840e-02 + 4619 -1.62488593065e-01 -3.06064620799e-02 -7.80441423007e-02 + 4620 -1.76989978384e-01 -4.92897146159e-02 -8.45908782559e-02 + 4621 -2.21949467213e-01 -7.26008760460e-03 6.09077064827e-02 + 4622 -1.67604197296e-01 -8.91777373203e-02 1.12746971930e-01 + 4623 -1.41965346027e-01 -6.78835595895e-02 1.59158802870e-01 + 4624 -1.39399586518e-01 -8.10477889734e-02 1.82906795981e-01 + 4625 -2.89607305427e-01 -1.90847171324e-01 3.16422498216e-01 + 4626 -4.01886562029e-01 2.15729756212e-01 3.25436599479e-01 + 4627 -4.34591041352e-01 -2.28468291919e-02 3.83624399653e-01 + 4628 -3.42205479070e-01 -1.81353784932e-02 3.62316873662e-01 + 4629 -2.89607305427e-01 1.42486162009e-01 3.16422498216e-01 + 4630 -1.32654804765e-01 -2.41856286273e-01 -5.48735654112e-01 + 4631 -1.32106029486e-01 -2.66196013756e-01 -5.65644259437e-01 + 4632 -1.01181375628e-01 -2.21566253421e-01 -6.18365104589e-01 + 4633 -6.10214903367e-02 -2.23618207118e-01 -5.92119095938e-01 + 4634 -7.96831636235e-02 -1.98120778188e-01 -6.45803399316e-01 + 4635 -5.49378026561e-02 -2.05521112270e-01 -6.19259319146e-01 + 4636 -3.76457413663e-02 -1.91704568245e-01 -6.08838400085e-01 + 4637 -8.38124791106e-03 2.88133133499e-01 -3.08589137080e-02 + 4638 3.89164034244e-01 2.86502069322e-01 -3.99258197995e-01 + 4639 3.52866598044e-01 2.79920761847e-01 -4.36331998300e-01 + 4640 4.26653101242e-01 5.04825497807e-02 3.91192833467e-01 + 4641 3.03727627876e-01 3.68616557363e-02 3.67993199023e-01 + 4642 3.11650402593e-01 -1.33367546567e-03 4.32798098563e-01 + 4643 5.00000000000e-01 0.00000000000e+00 5.00000000000e-01 + 4644 -2.84383322444e-01 -2.46380780174e-01 2.50108697418e-01 + 4645 -2.29549689889e-01 -1.85785841730e-01 2.62180096986e-01 + 4646 3.66226605390e-02 -1.42181537773e-01 -5.19162499221e-01 + 4647 3.93883686306e-02 -1.28213540344e-01 -5.45071169564e-01 + 4648 2.33745229894e-02 -1.78130759459e-01 -4.47456929028e-01 + 4649 3.67661482449e-01 -2.62852587740e-01 -4.91050375703e-01 + 4650 3.51514924638e-01 -2.54294527136e-01 -4.61207423018e-01 + 4651 -1.41017556536e-01 -2.48626402302e-01 -6.06132333303e-01 + 4652 -1.46576532723e-01 -2.21633278747e-01 -6.10558143649e-01 + 4653 -1.21872070847e-01 -1.94595471642e-01 -6.20188594621e-01 + 4654 -6.90426004480e-02 -1.61283680995e-01 -5.54849956441e-01 + 4655 -4.72897570622e-02 -1.58765873384e-01 -5.73796662542e-01 + 4656 -1.35861103417e-01 -2.83132341037e-01 -5.87082240596e-01 + 4657 -1.25783018746e-01 -2.61389696403e-01 -5.86863713660e-01 + 4658 -9.41473855434e-02 -2.47604028516e-01 -5.88596021302e-01 + 4659 1.61727694962e-01 3.25723824671e-01 8.63436376437e-02 + 4660 1.07619038543e-01 2.97696273623e-01 1.22863187341e-01 + 4661 2.05714278907e-01 3.48272205217e-01 2.17147390506e-01 + 4662 2.74485129975e-01 3.83815883114e-01 2.24229091762e-01 + 4663 -2.80599231883e-01 -3.56180162525e-01 2.07262709066e-01 + 4664 -2.22793634731e-01 -3.09785585131e-01 1.80310255123e-01 + 4665 -1.95800471622e-01 -3.90200617649e-01 1.90122607177e-01 + 4666 -1.83472521790e-01 1.68895003850e-01 6.76959538903e-02 + 4667 -1.01801491342e-01 -3.42416675010e-01 1.84027336539e-01 + 4668 -1.19276374031e-01 -3.99688282365e-01 2.12218817620e-01 + 4669 3.31489538805e-01 -2.01471138549e-01 -5.29770342022e-01 + 4670 3.62970454370e-01 -2.29172316567e-01 -5.57919471139e-01 + 4671 3.30533756186e-01 -2.13348222791e-01 -5.64676653917e-01 + 4672 -1.26748571971e-02 -5.00000000000e-01 3.23638309413e-01 + 4673 3.55427194771e-02 -4.24766211773e-01 2.84164113215e-01 + 4674 4.17351475224e-01 -3.23988552422e-01 -6.21422423497e-01 + 4675 3.89801966966e-01 -2.65318069896e-01 -5.51896564662e-01 + 4676 2.45418604804e-01 -3.34328112835e-01 -4.05023315096e-01 + 4677 -3.33333333333e-01 3.33333333333e-01 -8.30000000000e-01 + 4678 -2.97894525275e-01 2.91823840092e-01 -7.93895411808e-01 + 4679 -1.09167968292e-01 -3.49905814802e-01 -6.87396289020e-01 + 4680 -1.49890052190e-01 -3.14035417266e-01 -6.98598745683e-01 + 4681 -2.23115870038e-01 -1.89055082935e-01 -6.20012783795e-01 + 4682 2.02360859844e-01 3.03780668754e-01 -8.01153907008e-01 + 4683 2.57424851426e-01 3.92651263306e-01 -7.91538542678e-01 + 4684 1.79056295032e-01 3.45722961699e-01 -8.30000000000e-01 + 4685 2.27517304706e-01 2.57359468569e-01 -6.62778375277e-01 + 4686 1.70637978530e-01 3.18019601426e-01 -7.04583781458e-01 + 4687 1.86525006276e-01 3.48031243916e-01 -7.22313956199e-01 + 4688 -1.78970524688e-01 6.55403329465e-02 -5.12780818652e-02 + 4689 3.10216951892e-01 -2.80194264534e-01 -5.41680305205e-01 + 4690 3.57662713919e-01 -2.59384309684e-01 -5.35636679177e-01 + 4691 -3.68182123926e-01 4.61532324114e-01 -5.04607296413e-01 + 4692 -3.85272849063e-01 5.00000000000e-01 -5.18427494227e-01 + 4693 -2.62925560312e-01 7.03671633192e-02 -5.40721994726e-01 + 4694 -2.42252597212e-01 8.75997409539e-02 -5.52988441884e-01 + 4695 -1.83355005802e-01 2.67679628359e-01 -2.51444205254e-01 + 4696 -1.48386173736e-01 2.88383178076e-01 -2.54464989819e-01 + 4697 -1.46422228886e-01 3.11711733154e-01 -2.57624167556e-01 + 4698 -1.48771308461e-01 3.58783799866e-01 -3.07494633298e-01 + 4699 -3.07472163257e-01 3.92137273481e-01 -2.92805004533e-01 + 4700 -3.58023368614e-01 3.56183031308e-01 -2.38037995869e-01 + 4701 -3.93517526460e-01 2.90252758374e-01 -1.87439297197e-01 + 4702 3.47795204191e-01 -8.06364546174e-02 -8.69895675127e-03 + 4703 -2.79375048849e-01 -1.54085988225e-01 -3.97706032319e-01 + 4704 -2.66532445142e-01 -1.61866183562e-01 -3.86257184145e-01 + 4705 3.70245527874e-01 2.41615353178e-01 -3.84042173671e-01 + 4706 2.30475071623e-02 2.11960299708e-01 -2.52625336102e-01 + 4707 1.11080237392e-02 1.22730140131e-01 -2.12994709947e-01 + 4708 1.74293864597e-01 -3.74995585697e-01 -4.95620103736e-01 + 4709 -1.12679684707e-01 3.51667273221e-01 -4.41883235576e-01 + 4710 2.64893754707e-01 3.86023432937e-01 -7.49235467149e-01 + 4711 1.80011947962e-01 -1.94037974586e-02 -4.78830520796e-01 + 4712 1.95509798697e-01 -3.88696448176e-02 -4.85614268493e-01 + 4713 1.91502621303e-01 -4.80262252351e-02 -5.00337080396e-01 + 4714 3.26910774577e-01 -4.76536681874e-02 -3.10377604270e-01 + 4715 3.66653218436e-01 -5.57202252334e-02 -3.12914890890e-01 + 4716 3.99989913827e-01 8.73699658389e-04 -3.54672116732e-01 + 4717 2.88126159317e-01 1.08019441431e-01 -2.40285663754e-01 + 4718 1.46760467834e-01 -7.58247681637e-02 -1.01840331269e-01 + 4719 -4.24218212262e-01 -1.46088349265e-01 -3.24483022299e-01 + 4720 -3.34531286637e-01 -1.64803102453e-01 -4.27655974513e-01 + 4721 1.98560620206e-02 2.96924493380e-01 -5.81128682223e-01 + 4722 -7.04781739780e-03 2.77900134081e-01 -5.73679911613e-01 + 4723 5.96820503183e-02 2.33019481653e-01 -5.79390300402e-01 + 4724 3.85837686613e-02 2.34697750884e-01 -5.55389314793e-01 + 4725 -8.01693421723e-02 3.42081318288e-01 -1.32430281726e-01 + 4726 -2.34375883170e-01 -2.64017603871e-01 -4.00633001683e-01 + 4727 -1.39265582623e-01 -9.81563355134e-03 2.70787502255e-02 + 4728 -3.45360287558e-01 -3.78208173988e-02 2.68077663393e-02 + 4729 -3.84020215669e-01 -7.93574388913e-02 -1.54375758761e-02 + 4730 -1.76260330955e-01 -3.91030032824e-02 -5.94865407294e-01 + 4731 -3.37783206741e-01 2.53975986251e-02 -6.39773819105e-01 + 4732 -3.49941334369e-01 -3.73691930243e-03 -6.66485805339e-01 + 4733 -2.37099495461e-01 2.88666780890e-01 -3.93866885059e-01 + 4734 -2.31081669932e-01 2.77949488202e-01 -4.12901393325e-01 + 4735 3.29616346277e-03 2.56449762989e-01 -5.55692984520e-01 + 4736 7.06513776621e-03 2.61185094191e-01 -5.24373340990e-01 + 4737 1.75197024124e-01 7.98375617271e-02 -5.77841455757e-01 + 4738 2.79684011309e-01 -2.91724787404e-01 -5.52067763707e-01 + 4739 -2.62652689767e-01 2.86165344649e-01 -3.67145185827e-01 + 4740 -2.50024801403e-01 2.15718161829e-01 -4.22503102350e-01 + 4741 -2.56247971614e-01 1.30844622452e-01 -3.74602829626e-01 + 4742 -3.11676042175e-01 1.79720516700e-02 -8.86018475907e-02 + 4743 -8.66938051185e-02 -4.85809777249e-03 -1.10642006054e-01 + 4744 -5.81056748825e-02 5.69682234262e-03 -1.03853872119e-01 + 4745 -8.89163225639e-02 -3.43582689634e-02 -1.21896605313e-01 + 4746 -9.64333511999e-02 -1.94078778405e-02 -1.06023437594e-01 + 4747 -9.52071540888e-02 -4.79708893289e-02 -1.43854262740e-01 + 4748 -2.12541894775e-01 -7.40652766651e-02 -6.54705337716e-02 + 4749 -1.90819418443e-01 -7.13132620099e-02 -7.21448333819e-02 + 4750 -2.57854270233e-02 -1.33911511464e-01 -1.50272078943e-02 + 4751 -3.14277717409e-01 -3.33691100989e-02 1.45893340535e-02 + 4752 3.20234565740e-01 -1.68640498181e-01 -5.11871998880e-01 + 4753 5.44102430500e-02 -1.35742373877e-01 -3.21432490559e-01 + 4754 6.02915630407e-02 -1.42520207622e-01 -5.10790522442e-01 + 4755 1.83049125369e-01 -4.72029603034e-01 -3.01412638115e-01 + 4756 1.58530058392e-01 -5.00000000000e-01 -2.97407288619e-01 + 4757 -3.67697157754e-01 2.55534992640e-01 -4.16628419749e-01 + 4758 -1.94048139608e-01 1.77924602825e-01 -3.40013243867e-01 + 4759 1.24938461767e-01 -2.00831809358e-01 -3.77435568551e-01 + 4760 1.24538857982e-04 -2.19671523831e-01 -3.11122773885e-01 + 4761 -1.18308129385e-02 -2.34730074930e-01 -3.37277536483e-01 + 4762 -3.95071446070e-03 -2.78870077496e-02 -4.13704253111e-01 + 4763 9.60551356634e-02 -2.03609369025e-01 -4.92049475647e-01 + 4764 1.02212134511e-01 -2.03234870693e-01 -5.22310418444e-01 + 4765 -1.79626770941e-01 -1.16116477122e-01 -2.09422143529e-01 + 4766 -1.73979971773e-01 -1.22380329985e-01 -1.89708240909e-01 + 4767 -3.02208164426e-01 1.01957782890e-01 -9.46935536228e-02 + 4768 -2.17861486386e-01 1.67483227265e-01 -1.16256103360e-01 + 4769 -1.83780082626e-01 -1.01229279038e-01 7.58585542572e-02 + 4770 8.98225548840e-02 -2.01806012328e-01 -4.66202756653e-01 + 4771 -2.68476850076e-01 1.85556959478e-01 -5.13835324632e-01 + 4772 -2.29583973184e-01 1.07523645808e-01 -5.86136743221e-01 + 4773 4.26653101242e-01 -8.53634703621e-02 2.12645099740e-01 + 4774 4.44989825931e-01 6.09773972284e-02 2.84483824805e-01 + 4775 5.00000000000e-01 3.08206465238e-02 3.21452266273e-01 + 4776 -1.93613863837e-01 7.01517813256e-02 1.69461525843e-01 + 4777 -2.10766934247e-01 6.01415715334e-02 1.82424295547e-01 + 4778 -2.29572220405e-01 -9.10840567290e-03 -5.26767374514e-01 + 4779 -2.54692386919e-01 3.31535800033e-01 2.64635892910e-01 + 4780 -2.07281488245e-01 2.47651593425e-01 2.73075493605e-01 + 4781 -2.76175892894e-01 2.49655067392e-01 2.98799895894e-01 + 4782 6.60640739829e-02 1.48837174452e-01 8.50074771238e-02 + 4783 1.18104074836e-01 1.35965468652e-01 1.53365563710e-01 + 4784 1.19537881419e-01 1.49489793174e-01 1.07150232943e-01 + 4785 1.34400110199e-01 1.94383862536e-01 1.12661675927e-01 + 4786 -1.09853939314e-01 -2.39588245763e-01 -4.64644233011e-01 + 4787 -9.71212011712e-02 -2.18329745893e-01 -4.80913421289e-01 + 4788 7.86088343571e-02 1.19792714159e-01 -1.10983451466e-01 + 4789 9.55922072009e-02 1.47269757983e-01 -1.20148111850e-01 + 4790 1.04526951777e-01 1.74480973100e-01 -1.61195986070e-01 + 4791 2.25492713253e-01 1.77805994234e-01 -5.63125418812e-01 + 4792 2.10992560623e-01 1.80567179084e-01 -5.34757651002e-01 + 4793 2.31631550890e-01 2.58063811282e-01 -6.33972131261e-01 + 4794 -4.39935208161e-02 -3.61258410232e-01 -4.44389912815e-01 + 4795 -5.30149919556e-02 -3.45863702350e-01 -4.65556898294e-01 + 4796 -6.80163308168e-02 -2.20677838048e-01 -4.95591835626e-01 + 4797 6.61932849966e-02 -2.65509698409e-01 -1.49109392643e-01 + 4798 -1.01895827563e-01 -3.37349255778e-01 -6.47811680447e-01 + 4799 -6.57859690960e-02 -2.42633550015e-01 -5.76353785636e-01 + 4800 8.60195078990e-02 9.56546040829e-02 -6.09793314155e-01 + 4801 -1.88039315912e-01 -2.17167918247e-01 -3.30032161749e-01 + 4802 -1.22143153070e-01 -3.05464233641e-01 -2.37475828957e-01 + 4803 2.49516388277e-01 8.32546880380e-02 -6.37461478487e-01 + 4804 -2.95319149583e-01 2.11247703206e-01 -2.51438513635e-01 + 4805 -4.46390027003e-02 -1.56881861969e-01 -6.05517494099e-01 + 4806 -1.00575738039e-01 -1.83754060662e-01 -6.40311443158e-01 + 4807 3.29602719823e-01 -9.66772123893e-02 -7.10841053159e-01 + 4808 -1.51594068425e-01 -1.33303631636e-01 -1.69793606242e-01 + 4809 5.78872023665e-02 -7.76463715165e-02 -7.18440301372e-01 + 4810 3.44315572285e-02 -1.93687772645e-01 -6.17800104746e-01 + 4811 3.77450411477e-02 -1.66843216498e-01 -6.19049373708e-01 + 4812 2.45802515241e-01 3.61241338021e-01 -3.70533824595e-01 + 4813 3.49874291109e-02 3.45416653052e-01 -4.88696978974e-01 + 4814 -1.48123520949e-02 2.93888870736e-01 -4.91607675324e-01 + 4815 -2.52723756002e-03 2.68441315479e-01 -4.94138807303e-01 + 4816 -3.29928840128e-01 1.53786141399e-01 -1.61716788262e-01 + 4817 -3.55750670173e-01 2.28141913666e-01 2.49626196984e-01 + 4818 -3.91813002630e-01 1.94221920142e-01 1.78308847443e-01 + 4819 -4.34591041352e-01 1.74640483999e-01 2.05076665926e-01 + 4820 1.11674104199e-01 2.70787896902e-01 8.42734506664e-02 + 4821 1.49098230363e-01 2.80503472028e-01 4.70638386431e-02 + 4822 3.65038688306e-01 -1.13788814545e-01 2.00919205961e-01 + 4823 7.01662230448e-03 1.27177509112e-01 1.03527368739e-01 + 4824 3.62222920198e-02 1.42898823519e-01 6.97715867149e-02 + 4825 2.78695993039e-01 1.05499187019e-01 2.09297479846e-02 + 4826 -3.35449423912e-01 -3.18126947736e-01 1.19903631169e-01 + 4827 -6.47118538463e-02 9.15710863791e-02 1.85562940936e-01 + 4828 1.66666666667e-01 -1.66666666667e-01 5.00000000000e-01 + 4829 1.08737801944e-01 -1.26000256599e-01 4.49598573923e-01 + 4830 -7.49895733633e-03 1.02498579255e-01 1.06991017701e-01 + 4831 -5.00000000000e-01 3.08206465238e-02 3.21452266273e-01 + 4832 -4.50943281014e-01 5.98036299893e-03 2.78807499444e-01 + 4833 7.23158580716e-02 1.00973844890e-01 1.89622746705e-01 + 4834 2.36823672773e-01 3.35377604021e-01 -3.17462340566e-02 + 4835 2.74485129975e-01 3.83815883114e-01 -3.18297256228e-02 + 4836 -1.32489726650e-01 -2.52590943612e-02 -4.24132593490e-02 + 4837 -3.87456000777e-01 -5.20413007604e-02 -6.29240804278e-01 + 4838 7.82650026177e-02 -2.67837268243e-01 -4.63619297793e-01 + 4839 -2.33861199806e-01 -6.62060662211e-02 -9.69423061163e-02 + 4840 -2.22344322523e-01 2.70424980250e-01 -2.60328175973e-01 + 4841 4.46825116137e-01 3.84198854041e-01 -5.50111621744e-01 + 4842 5.00000000000e-01 3.90218491445e-01 -5.26040082138e-01 + 4843 2.58236679214e-02 -2.70265829484e-01 -6.70850078560e-01 + 4844 -1.56806654083e-01 5.30618320551e-02 7.12195886555e-02 + 4845 1.28413940127e-01 1.03716008944e-01 -3.01002634820e-01 + 4846 -1.47832178422e-01 2.14775543630e-01 -7.95706684290e-02 + 4847 -1.80145268639e-01 3.73651850025e-01 1.98254113404e-01 + 4848 3.47832028733e-01 5.00000000000e-01 7.69774409101e-02 + 4849 3.30863847481e-01 4.12861912336e-01 1.01127705783e-01 + 4850 -2.83075200685e-01 1.70106178650e-01 2.61818221660e-01 + 4851 -8.25889857228e-03 -2.46150427529e-01 -3.59317459133e-01 + 4852 1.52959882501e-02 -2.59880940951e-01 -3.84048936199e-01 + 4853 -2.91491738920e-02 -3.73777613369e-01 -4.17284081479e-01 + 4854 -2.12476692874e-02 -3.50436081358e-01 -4.19322367881e-01 + 4855 1.58479787426e-01 -3.12689413459e-01 -3.13248605905e-01 + 4856 1.57293847945e-01 -3.15428484529e-01 -3.44577986741e-01 + 4857 1.24189688493e-01 -2.91198508660e-01 -3.54961086787e-01 + 4858 1.27534480419e-01 -2.78291325343e-01 -3.78932504141e-01 + 4859 1.09353697672e-01 -3.59517060094e-01 -2.42207722369e-01 + 4860 2.92531943240e-02 -2.44009691273e-01 -3.85202352067e-01 + 4861 4.01905141236e-02 -2.64925507433e-01 -3.86073186611e-01 + 4862 6.45350996423e-02 -2.58586574423e-01 -4.02266579009e-01 + 4863 -3.13680233169e-02 -4.05333210027e-01 -3.20234329050e-01 + 4864 1.85645621958e-01 1.69087503231e-01 -6.49800578201e-01 + 4865 2.37188173510e-01 1.77842943155e-01 -6.00997971117e-01 +ENDOFSECTION + ELEMENTS/CELLS 2.4.6 + 1 4 8 1 2 4 3 5 6 8 + 7 + 2 4 8 4 3 10 9 8 7 12 + 11 + 3 4 8 12 11 14 13 8 7 5 + 6 + 4 4 8 2 15 3 9 6 13 7 + 11 + 5 4 8 1 16 18 17 2 19 21 + 20 + 6 4 8 18 17 23 22 21 20 25 + 24 + 7 4 8 25 24 15 26 21 20 2 + 19 + 8 4 8 16 27 17 22 19 26 20 + 24 + 9 4 8 28 29 31 30 32 33 35 + 34 + 10 4 8 31 30 37 36 35 34 39 + 38 + 11 4 8 39 38 41 40 35 34 32 + 33 + 12 4 8 29 15 30 36 33 40 34 + 38 + 13 4 8 42 43 45 44 46 47 49 + 48 + 14 4 8 45 44 51 50 49 48 53 + 52 + 15 4 8 53 52 55 54 49 48 46 + 47 + 16 4 8 43 56 44 50 47 54 48 + 52 + 17 4 8 57 58 60 59 61 62 64 + 63 + 18 4 8 60 59 66 65 64 63 68 + 67 + 19 4 8 68 67 70 69 64 63 61 + 62 + 20 4 8 58 71 59 65 62 69 63 + 67 + 21 4 8 72 73 75 74 76 77 79 + 78 + 22 4 8 75 74 81 80 79 78 83 + 82 + 23 4 8 83 82 85 84 79 78 76 + 77 + 24 4 8 73 86 74 80 77 84 78 + 82 + 25 4 8 87 88 90 89 91 92 94 + 93 + 26 4 8 90 89 96 95 94 93 98 + 97 + 27 4 8 98 97 100 99 94 93 91 + 92 + 28 4 8 88 66 89 95 92 99 93 + 97 + 29 4 8 101 102 104 103 105 106 108 + 107 + 30 4 8 104 103 110 109 108 107 112 + 111 + 31 4 8 112 111 114 113 108 107 105 + 106 + 32 4 8 102 96 103 109 106 113 107 + 111 + 33 4 8 87 88 116 115 90 89 118 + 117 + 34 4 8 116 115 110 119 118 117 109 + 120 + 35 4 8 109 120 96 95 118 117 90 + 89 + 36 4 8 88 66 115 119 89 95 117 + 120 + 37 4 8 121 122 124 123 125 126 128 + 127 + 38 4 8 124 123 130 129 128 127 132 + 131 + 39 4 8 132 131 134 133 128 127 125 + 126 + 40 4 8 122 135 123 129 126 133 127 + 131 + 41 4 8 136 137 139 138 140 141 143 + 142 + 42 4 8 139 138 101 144 143 142 146 + 145 + 43 4 8 146 145 148 147 143 142 140 + 141 + 44 4 8 137 149 138 144 141 147 142 + 145 + 45 4 8 150 151 153 152 154 155 157 + 156 + 46 4 8 153 152 159 158 157 156 161 + 160 + 47 4 8 161 160 163 162 157 156 154 + 155 + 48 4 8 151 110 152 158 155 162 156 + 160 + 49 4 8 164 165 167 166 168 169 171 + 170 + 50 4 8 167 166 130 172 171 170 174 + 173 + 51 4 8 174 173 85 175 171 170 168 + 169 + 52 4 8 165 176 166 172 169 175 170 + 173 + 53 4 8 134 177 125 178 179 180 182 + 181 + 54 4 8 125 178 121 183 182 181 185 + 184 + 55 4 8 185 184 148 186 182 181 179 + 180 + 56 4 8 177 187 178 183 180 186 181 + 184 + 57 4 8 188 189 191 190 192 193 195 + 194 + 58 4 8 191 190 176 165 195 194 197 + 196 + 59 4 8 197 196 199 198 195 194 192 + 193 + 60 4 8 189 164 190 165 193 198 194 + 196 + 61 4 8 200 201 203 202 204 205 207 + 206 + 62 4 8 203 202 209 208 207 206 211 + 210 + 63 4 8 211 210 213 212 207 206 204 + 205 + 64 4 8 201 27 202 208 205 212 206 + 210 + 65 4 8 214 215 217 216 218 219 221 + 220 + 66 4 8 217 216 223 222 221 220 225 + 224 + 67 4 8 225 224 85 168 221 220 218 + 219 + 68 4 8 215 164 216 222 219 168 220 + 224 + 69 4 8 226 227 229 228 230 231 233 + 232 + 70 4 8 229 228 164 234 233 232 168 + 235 + 71 4 8 168 235 85 236 233 232 230 + 231 + 72 4 8 227 237 228 234 231 236 232 + 235 + 73 4 8 238 239 241 240 242 243 245 + 244 + 74 4 8 241 240 150 246 245 244 248 + 247 + 75 4 8 248 247 86 249 245 244 242 + 243 + 76 4 8 239 250 240 246 243 249 244 + 247 + 77 4 8 223 222 252 251 225 224 254 + 253 + 78 4 8 252 251 237 234 254 253 236 + 235 + 79 4 8 236 235 85 168 254 253 225 + 224 + 80 4 8 222 164 251 234 224 168 253 + 235 + 81 4 8 71 65 69 67 255 256 258 + 257 + 82 4 8 69 67 70 68 258 257 260 + 259 + 83 4 8 260 259 159 261 258 257 255 + 256 + 84 4 8 65 66 67 68 256 261 257 + 259 + 85 4 8 262 263 265 264 266 267 269 + 268 + 86 4 8 265 264 271 270 269 268 273 + 272 + 87 4 8 273 272 37 274 269 268 266 + 267 + 88 4 8 263 57 264 270 267 274 268 + 272 + 89 4 8 136 137 276 275 139 138 278 + 277 + 90 4 8 276 275 280 279 278 277 282 + 281 + 91 4 8 282 281 101 144 278 277 139 + 138 + 92 4 8 137 149 275 279 138 144 277 + 281 + 93 4 8 41 283 285 284 286 287 289 + 288 + 94 4 8 285 284 149 290 289 288 292 + 291 + 95 4 8 292 291 294 293 289 288 286 + 287 + 96 4 8 283 295 284 290 287 293 288 + 291 + 97 4 8 296 297 299 298 300 301 303 + 302 + 98 4 8 299 298 134 133 303 302 132 + 131 + 99 4 8 132 131 130 129 303 302 300 + 301 + 100 4 8 297 135 298 133 301 129 302 + 131 + 101 4 8 41 304 306 305 307 308 310 + 309 + 102 4 8 306 305 312 311 310 309 314 + 313 + 103 4 8 314 313 316 315 310 309 307 + 308 + 104 4 8 304 317 305 311 308 315 309 + 313 + 105 4 8 87 90 319 318 320 321 323 + 322 + 106 4 8 319 318 101 102 323 322 282 + 324 + 107 4 8 282 324 280 325 323 322 320 + 321 + 108 4 8 90 96 318 102 321 325 322 + 324 + 109 4 8 87 116 319 326 90 118 318 + 327 + 110 4 8 319 326 101 104 318 327 102 + 103 + 111 4 8 102 103 96 109 318 327 90 + 118 + 112 4 8 116 110 326 104 118 109 327 + 103 + 113 4 8 328 329 331 330 332 333 335 + 334 + 114 4 8 331 330 337 336 335 334 339 + 338 + 115 4 8 339 338 341 340 335 334 332 + 333 + 116 4 8 329 342 330 336 333 340 334 + 338 + 117 4 8 37 343 345 344 31 346 348 + 347 + 118 4 8 345 344 350 349 348 347 352 + 351 + 119 4 8 352 351 28 353 348 347 31 + 346 + 120 4 8 343 100 344 349 346 353 347 + 351 + 121 4 8 199 354 356 355 357 358 360 + 359 + 122 4 8 356 355 296 300 360 359 299 + 303 + 123 4 8 299 303 134 132 360 359 357 + 358 + 124 4 8 354 130 355 300 358 132 359 + 303 + 125 4 8 159 153 362 361 363 364 366 + 365 + 126 4 8 362 361 368 367 366 365 370 + 369 + 127 4 8 370 369 372 371 366 365 363 + 364 + 128 4 8 153 150 361 367 364 371 365 + 369 + 129 4 8 87 90 320 321 91 94 374 + 373 + 130 4 8 320 321 280 325 374 373 376 + 375 + 131 4 8 376 375 100 98 374 373 91 + 94 + 132 4 8 90 96 321 325 94 98 373 + 375 + 133 4 8 110 119 116 115 377 378 380 + 379 + 134 4 8 116 115 87 88 380 379 382 + 381 + 135 4 8 382 381 384 383 380 379 377 + 378 + 136 4 8 119 66 115 88 378 383 379 + 381 + 137 4 8 385 386 388 387 389 390 392 + 391 + 138 4 8 388 387 394 393 392 391 396 + 395 + 139 4 8 396 395 398 397 392 391 389 + 390 + 140 4 8 386 87 387 393 390 397 391 + 395 + 141 4 8 70 69 260 258 399 400 402 + 401 + 142 4 8 260 258 159 255 402 401 404 + 403 + 143 4 8 404 403 238 405 402 401 399 + 400 + 144 4 8 69 71 258 255 400 405 401 + 403 + 145 4 8 406 407 409 408 410 411 413 + 412 + 146 4 8 409 408 372 414 413 412 416 + 415 + 147 4 8 416 415 110 119 413 412 410 + 411 + 148 4 8 407 66 408 414 411 119 412 + 415 + 149 4 8 368 417 419 418 420 421 423 + 422 + 150 4 8 419 418 425 424 423 422 427 + 426 + 151 4 8 427 426 250 428 423 422 420 + 421 + 152 4 8 417 429 418 424 421 428 422 + 426 + 153 4 8 430 431 433 432 434 435 437 + 436 + 154 4 8 433 432 149 438 437 436 440 + 439 + 155 4 8 440 439 135 441 437 436 434 + 435 + 156 4 8 431 312 432 438 435 441 436 + 439 + 157 4 8 442 443 445 444 446 447 449 + 448 + 158 4 8 445 444 294 450 449 448 452 + 451 + 159 4 8 452 451 328 453 449 448 446 + 447 + 160 4 8 443 454 444 450 447 453 448 + 451 + 161 4 8 134 455 457 456 458 459 461 + 460 + 162 4 8 457 456 463 462 461 460 465 + 464 + 163 4 8 465 464 467 466 461 460 458 + 459 + 164 4 8 455 468 456 462 459 466 460 + 464 + 165 4 8 159 255 261 256 363 469 471 + 470 + 166 4 8 261 256 66 65 471 470 414 + 472 + 167 4 8 414 472 372 473 471 470 363 + 469 + 168 4 8 255 71 256 65 469 473 470 + 472 + 169 4 8 159 153 404 474 362 361 476 + 475 + 170 4 8 404 474 238 241 476 475 478 + 477 + 171 4 8 478 477 368 367 476 475 362 + 361 + 172 4 8 153 150 474 241 361 367 475 + 477 + 173 4 8 135 479 122 480 481 482 484 + 483 + 174 4 8 122 480 121 185 484 483 486 + 485 + 175 4 8 486 485 488 487 484 483 481 + 482 + 176 4 8 479 148 480 185 482 487 483 + 485 + 177 4 8 385 489 491 490 388 492 494 + 493 + 178 4 8 491 490 496 495 494 493 498 + 497 + 179 4 8 498 497 394 499 494 493 388 + 492 + 180 4 8 489 500 490 495 492 499 493 + 497 + 181 4 8 296 501 297 502 503 504 506 + 505 + 182 4 8 297 502 135 507 506 505 434 + 508 + 183 4 8 434 508 430 509 506 505 503 + 504 + 184 4 8 501 510 502 507 504 509 505 + 508 + 185 4 8 199 356 197 511 192 512 195 + 513 + 186 4 8 197 511 176 514 195 513 191 + 515 + 187 4 8 191 515 188 516 195 513 192 + 512 + 188 4 8 356 296 511 514 512 516 513 + 515 + 189 4 8 496 517 498 518 519 520 522 + 521 + 190 4 8 498 518 394 523 522 521 525 + 524 + 191 4 8 525 524 136 526 522 521 519 + 520 + 192 4 8 517 527 518 523 520 526 521 + 524 + 193 4 8 528 529 531 530 532 533 535 + 534 + 194 4 8 531 530 537 536 535 534 539 + 538 + 195 4 8 539 538 541 540 535 534 532 + 533 + 196 4 8 529 542 530 536 533 540 534 + 538 + 197 4 8 543 544 546 545 547 548 550 + 549 + 198 4 8 546 545 552 551 550 549 554 + 553 + 199 4 8 554 553 556 555 550 549 547 + 548 + 200 4 8 544 557 545 551 548 555 549 + 553 + 201 4 8 214 558 215 559 560 561 563 + 562 + 202 4 8 215 559 164 564 563 562 566 + 565 + 203 4 8 566 565 568 567 563 562 560 + 561 + 204 4 8 558 569 559 564 561 567 562 + 565 + 205 4 8 237 570 572 571 573 574 576 + 575 + 206 4 8 572 571 163 154 576 575 578 + 577 + 207 4 8 578 577 580 579 576 575 573 + 574 + 208 4 8 570 150 571 154 574 579 575 + 577 + 209 4 8 581 582 584 583 585 586 588 + 587 + 210 4 8 584 583 590 589 588 587 592 + 591 + 211 4 8 592 591 557 555 588 587 585 + 586 + 212 4 8 582 556 583 589 586 555 587 + 591 + 213 4 8 593 594 596 595 597 598 600 + 599 + 214 4 8 596 595 602 601 600 599 604 + 603 + 215 4 8 604 603 199 605 600 599 597 + 598 + 216 4 8 594 606 595 601 598 605 599 + 603 + 217 4 8 607 608 610 609 611 612 614 + 613 + 218 4 8 610 609 342 336 614 613 616 + 615 + 219 4 8 616 615 618 617 614 613 611 + 612 + 220 4 8 608 337 609 336 612 617 613 + 615 + 221 4 8 188 619 189 620 192 621 193 + 622 + 222 4 8 189 620 164 623 193 622 198 + 624 + 223 4 8 198 624 199 604 193 622 192 + 621 + 224 4 8 619 602 620 623 621 604 622 + 624 + 225 4 8 85 84 236 625 225 626 254 + 627 + 226 4 8 236 625 237 628 254 627 252 + 629 + 227 4 8 252 629 223 630 254 627 225 + 626 + 228 4 8 84 86 625 628 626 630 627 + 629 + 229 4 8 85 174 168 171 230 631 233 + 632 + 230 4 8 168 171 164 167 233 632 229 + 633 + 231 4 8 229 633 226 634 233 632 230 + 631 + 232 4 8 174 130 171 167 631 634 632 + 633 + 233 4 8 635 636 638 637 639 640 642 + 641 + 234 4 8 638 637 226 643 642 641 645 + 644 + 235 4 8 645 644 647 646 642 641 639 + 640 + 236 4 8 636 648 637 643 640 646 641 + 644 + 237 4 8 164 165 215 649 650 651 653 + 652 + 238 4 8 215 649 214 654 653 652 656 + 655 + 239 4 8 656 655 209 657 653 652 650 + 651 + 240 4 8 165 176 649 654 651 657 652 + 655 + 241 4 8 150 658 570 659 660 661 663 + 662 + 242 4 8 570 659 237 664 663 662 252 + 665 + 243 4 8 252 665 223 666 663 662 660 + 661 + 244 4 8 658 667 659 664 661 666 662 + 665 + 245 4 8 668 669 671 670 672 673 675 + 674 + 246 4 8 671 670 677 676 675 674 679 + 678 + 247 4 8 679 678 648 680 675 674 672 + 673 + 248 4 8 669 681 670 676 673 680 674 + 678 + 249 4 8 542 682 684 683 685 686 688 + 687 + 250 4 8 684 683 188 689 688 687 691 + 690 + 251 4 8 691 690 693 692 688 687 685 + 686 + 252 4 8 682 342 683 689 686 692 687 + 690 + 253 4 8 694 695 697 696 698 699 701 + 700 + 254 4 8 697 696 556 702 701 700 704 + 703 + 255 4 8 704 703 681 705 701 700 698 + 699 + 256 4 8 695 706 696 702 699 705 700 + 703 + 257 4 8 590 707 589 708 709 710 712 + 711 + 258 4 8 589 708 556 704 712 711 702 + 703 + 259 4 8 702 703 706 705 712 711 709 + 710 + 260 4 8 707 681 708 704 710 705 711 + 703 + 261 4 8 648 680 714 713 715 716 718 + 717 + 262 4 8 714 713 164 719 718 717 721 + 720 + 263 4 8 721 720 667 722 718 717 715 + 716 + 264 4 8 680 681 713 719 716 722 717 + 720 + 265 4 8 15 13 724 723 36 725 727 + 726 + 266 4 8 724 723 55 728 727 726 730 + 729 + 267 4 8 730 729 37 731 727 726 36 + 725 + 268 4 8 13 14 723 728 725 731 726 + 729 + 269 4 8 732 733 735 734 736 737 739 + 738 + 270 4 8 735 734 429 428 739 738 741 + 740 + 271 4 8 741 740 743 742 739 738 736 + 737 + 272 4 8 733 250 734 428 737 742 738 + 740 + 273 4 8 1 4 745 744 5 8 747 + 746 + 274 4 8 745 744 86 748 747 746 750 + 749 + 275 4 8 750 749 14 12 747 746 5 + 8 + 276 4 8 4 10 744 748 8 12 746 + 749 + 277 4 8 10 751 753 752 754 755 757 + 756 + 278 4 8 753 752 23 758 757 756 760 + 759 + 279 4 8 760 759 81 761 757 756 754 + 755 + 280 4 8 751 176 752 758 755 761 756 + 759 + 281 4 8 528 762 764 763 529 765 767 + 766 + 282 4 8 764 763 342 692 767 766 682 + 686 + 283 4 8 682 686 542 685 767 766 529 + 765 + 284 4 8 762 693 763 692 765 685 766 + 686 + 285 4 8 593 768 770 769 771 772 774 + 773 + 286 4 8 770 769 618 775 774 773 616 + 776 + 287 4 8 616 776 342 340 774 773 771 + 772 + 288 4 8 768 341 769 775 772 340 773 + 776 + 289 4 8 694 777 779 778 780 781 783 + 782 + 290 4 8 779 778 785 784 783 782 787 + 786 + 291 4 8 787 786 667 788 783 782 780 + 781 + 292 4 8 777 789 778 784 781 788 782 + 786 + 293 4 8 790 791 793 792 794 795 797 + 796 + 294 4 8 793 792 537 798 797 796 800 + 799 + 295 4 8 800 799 454 801 797 796 794 + 795 + 296 4 8 791 802 792 798 795 801 796 + 799 + 297 4 8 803 804 806 805 807 808 810 + 809 + 298 4 8 806 805 121 183 810 809 125 + 178 + 299 4 8 125 178 134 177 810 809 807 + 808 + 300 4 8 804 187 805 183 808 177 809 + 178 + 301 4 8 811 812 814 813 815 816 818 + 817 + 302 4 8 814 813 820 819 818 817 822 + 821 + 303 4 8 822 821 824 823 818 817 815 + 816 + 304 4 8 812 557 813 819 816 823 817 + 821 + 305 4 8 606 605 826 825 827 828 830 + 829 + 306 4 8 826 825 134 357 830 829 832 + 831 + 307 4 8 832 831 834 833 830 829 827 + 828 + 308 4 8 605 199 825 357 828 833 829 + 831 + 309 4 8 15 835 29 836 837 838 840 + 839 + 310 4 8 29 836 28 841 840 839 843 + 842 + 311 4 8 843 842 845 844 840 839 837 + 838 + 312 4 8 835 846 836 841 838 844 839 + 842 + 313 4 8 847 848 850 849 851 852 854 + 853 + 314 4 8 850 849 856 855 854 853 858 + 857 + 315 4 8 858 857 860 859 854 853 851 + 852 + 316 4 8 848 442 849 855 852 859 853 + 857 + 317 4 8 861 862 864 863 865 866 868 + 867 + 318 4 8 864 863 870 869 868 867 872 + 871 + 319 4 8 872 871 527 873 868 867 865 + 866 + 320 4 8 862 802 863 869 866 873 867 + 871 + 321 4 8 134 826 457 874 455 875 456 + 876 + 322 4 8 457 874 463 877 456 876 462 + 878 + 323 4 8 462 878 468 879 456 876 455 + 875 + 324 4 8 826 606 874 877 875 879 876 + 878 + 325 4 8 41 304 307 308 283 880 882 + 881 + 326 4 8 307 308 316 315 882 881 884 + 883 + 327 4 8 884 883 295 885 882 881 283 + 880 + 328 4 8 304 317 308 315 880 885 881 + 883 + 329 4 8 618 886 888 887 889 890 892 + 891 + 330 4 8 888 887 296 514 892 891 516 + 515 + 331 4 8 516 515 188 191 892 891 889 + 890 + 332 4 8 886 176 887 514 890 191 891 + 515 + 333 4 8 541 893 895 894 896 897 899 + 898 + 334 4 8 895 894 901 900 899 898 903 + 902 + 335 4 8 903 902 568 904 899 898 896 + 897 + 336 4 8 893 693 894 900 897 904 898 + 902 + 337 4 8 607 905 611 906 907 908 910 + 909 + 338 4 8 611 906 618 911 910 909 913 + 912 + 339 4 8 913 912 693 904 910 909 907 + 908 + 340 4 8 905 568 906 911 908 904 909 + 912 + 341 4 8 607 907 915 914 905 908 917 + 916 + 342 4 8 915 914 541 893 917 916 896 + 897 + 343 4 8 896 897 568 904 917 916 905 + 908 + 344 4 8 907 693 914 893 908 904 916 + 897 + 345 4 8 209 918 656 919 650 920 653 + 921 + 346 4 8 656 919 214 560 653 921 215 + 563 + 347 4 8 215 563 164 566 653 921 650 + 920 + 348 4 8 918 568 919 560 920 566 921 + 563 + 349 4 8 922 923 925 924 926 927 929 + 928 + 350 4 8 925 924 811 930 929 928 932 + 931 + 351 4 8 932 931 934 933 929 928 926 + 927 + 352 4 8 923 935 924 930 927 933 928 + 931 + 353 4 8 164 936 229 937 167 938 633 + 939 + 354 4 8 229 937 226 940 633 939 634 + 941 + 355 4 8 634 941 130 942 633 939 167 + 938 + 356 4 8 936 943 937 940 938 942 939 + 941 + 357 4 8 569 944 567 945 946 947 949 + 948 + 358 4 8 567 945 568 950 949 948 952 + 951 + 359 4 8 952 951 954 953 949 948 946 + 947 + 360 4 8 944 955 945 950 947 953 948 + 951 + 361 4 8 223 630 252 629 660 956 663 + 957 + 362 4 8 252 629 237 628 663 957 570 + 958 + 363 4 8 570 958 150 248 663 957 660 + 956 + 364 4 8 630 86 629 628 956 248 957 + 958 + 365 4 8 789 959 961 960 962 963 965 + 964 + 366 4 8 961 960 967 966 965 964 969 + 968 + 367 4 8 969 968 971 970 965 964 962 + 963 + 368 4 8 959 425 960 966 963 970 964 + 968 + 369 4 8 972 973 975 974 976 977 979 + 978 + 370 4 8 975 974 981 980 979 978 983 + 982 + 371 4 8 983 982 954 952 979 978 976 + 977 + 372 4 8 973 568 974 980 977 952 978 + 982 + 373 4 8 984 985 987 986 988 989 991 + 990 + 374 4 8 987 986 993 992 991 990 995 + 994 + 375 4 8 995 994 802 801 991 990 988 + 989 + 376 4 8 985 454 986 992 989 801 990 + 994 + 377 4 8 861 996 998 997 999 1000 1002 + 1001 + 378 4 8 998 997 385 1003 1002 1001 389 + 1004 + 379 4 8 389 1004 398 1005 1002 1001 999 + 1000 + 380 4 8 996 384 997 1003 1000 1005 1001 + 1004 + 381 4 8 350 1006 1008 1007 1009 1010 1012 + 1011 + 382 4 8 1008 1007 870 1013 1012 1011 1015 + 1014 + 383 4 8 1015 1014 993 1016 1012 1011 1009 + 1010 + 384 4 8 1006 398 1007 1013 1010 1016 1011 + 1014 + 385 4 8 442 443 1018 1017 1019 1020 1022 + 1021 + 386 4 8 1018 1017 537 800 1022 1021 798 + 799 + 387 4 8 798 799 802 801 1022 1021 1019 + 1020 + 388 4 8 443 454 1017 800 1020 801 1021 + 799 + 389 4 8 41 1023 39 1024 32 1025 35 + 1026 + 390 4 8 39 1024 37 343 35 1026 31 + 346 + 391 4 8 31 346 28 353 35 1026 32 + 1025 + 392 4 8 1023 100 1024 343 1025 353 1026 + 346 + 393 4 8 85 175 83 1027 76 1028 79 + 1029 + 394 4 8 83 1027 81 761 79 1029 75 + 1030 + 395 4 8 75 1030 72 1031 79 1029 76 + 1028 + 396 4 8 175 176 1027 761 1028 1031 1029 + 1030 + 397 4 8 618 1032 775 1033 1034 1035 1037 + 1036 + 398 4 8 775 1033 341 1038 1037 1036 1040 + 1039 + 399 4 8 1040 1039 430 1041 1037 1036 1034 + 1035 + 400 4 8 1032 316 1033 1038 1035 1041 1036 + 1039 + 401 4 8 188 689 1043 1042 889 1044 1046 + 1045 + 402 4 8 1043 1042 593 771 1046 1045 770 + 774 + 403 4 8 770 774 618 616 1046 1045 889 + 1044 + 404 4 8 689 342 1042 771 1044 616 1045 + 774 + 405 4 8 1 745 1048 1047 1049 1050 1052 + 1051 + 406 4 8 1048 1047 72 73 1052 1051 1054 + 1053 + 407 4 8 1054 1053 1056 1055 1052 1051 1049 + 1050 + 408 4 8 745 86 1047 73 1050 1055 1051 + 1053 + 409 4 8 85 175 1058 1057 83 1027 1060 + 1059 + 410 4 8 1058 1057 10 751 1060 1059 754 + 755 + 411 4 8 754 755 81 761 1060 1059 83 + 1027 + 412 4 8 175 176 1057 751 1027 761 1059 + 755 + 413 4 8 238 1061 1063 1062 1064 1065 1067 + 1066 + 414 4 8 1063 1062 262 1068 1067 1066 1070 + 1069 + 415 4 8 1070 1069 51 1071 1067 1066 1064 + 1065 + 416 4 8 1061 14 1062 1068 1065 1071 1066 + 1069 + 417 4 8 732 1072 1074 1073 1075 1076 1078 + 1077 + 418 4 8 1074 1073 1080 1079 1078 1077 1082 + 1081 + 419 4 8 1082 1081 971 1083 1078 1077 1075 + 1076 + 420 4 8 1072 1084 1073 1079 1076 1083 1077 + 1081 + 421 4 8 1085 1086 1088 1087 1089 1090 1092 + 1091 + 422 4 8 1088 1087 1094 1093 1092 1091 1096 + 1095 + 423 4 8 1096 1095 1098 1097 1092 1091 1089 + 1090 + 424 4 8 1086 66 1087 1093 1090 1097 1091 + 1095 + 425 4 8 1056 1099 1101 1100 1102 1103 1105 + 1104 + 426 4 8 1101 1100 250 1106 1105 1104 1108 + 1107 + 427 4 8 1108 1107 1110 1109 1105 1104 1102 + 1103 + 428 4 8 1099 51 1100 1106 1103 1109 1104 + 1107 + 429 4 8 51 1109 45 1111 1112 1113 1115 + 1114 + 430 4 8 45 1111 42 1116 1115 1114 1118 + 1117 + 431 4 8 1118 1117 1084 1119 1115 1114 1112 + 1113 + 432 4 8 1109 1110 1111 1116 1113 1119 1114 + 1117 + 433 4 8 1120 1121 1123 1122 1124 1125 1127 + 1126 + 434 4 8 1123 1122 150 1128 1127 1126 1130 + 1129 + 435 4 8 1130 1129 1132 1131 1127 1126 1124 + 1125 + 436 4 8 1121 1133 1122 1128 1125 1131 1126 + 1129 + 437 4 8 1134 1135 1137 1136 1138 1139 1141 + 1140 + 438 4 8 1137 1136 1143 1142 1141 1140 1145 + 1144 + 439 4 8 1145 1144 496 495 1141 1140 1138 + 1139 + 440 4 8 1135 500 1136 1142 1139 495 1140 + 1144 + 441 4 8 316 884 1147 1146 1148 1149 1151 + 1150 + 442 4 8 1147 1146 860 1152 1151 1150 1154 + 1153 + 443 4 8 1154 1153 149 290 1151 1150 1148 + 1149 + 444 4 8 884 295 1146 1152 1149 290 1150 + 1153 + 445 4 8 394 1155 525 1156 523 1157 524 + 1158 + 446 4 8 525 1156 136 276 524 1158 526 + 1159 + 447 4 8 526 1159 527 1160 524 1158 523 + 1157 + 448 4 8 1155 280 1156 276 1157 1160 1158 + 1159 + 449 4 8 223 666 1162 1161 1163 1164 1166 + 1165 + 450 4 8 1162 1161 785 787 1166 1165 1168 + 1167 + 451 4 8 1168 1167 250 1169 1166 1165 1163 + 1164 + 452 4 8 666 667 1161 787 1164 1169 1165 + 1167 + 453 4 8 42 1170 1116 1171 1172 1173 1175 + 1174 + 454 4 8 1116 1171 1110 1176 1175 1174 1178 + 1177 + 455 4 8 1178 1177 1180 1179 1175 1174 1172 + 1173 + 456 4 8 1170 1181 1171 1176 1173 1179 1174 + 1177 + 457 4 8 789 1182 1184 1183 1185 1186 1188 + 1187 + 458 4 8 1184 1183 1181 1189 1188 1187 1176 + 1190 + 459 4 8 1176 1190 1110 1119 1188 1187 1185 + 1186 + 460 4 8 1182 1084 1183 1189 1186 1119 1187 + 1190 + 461 4 8 648 680 636 1191 1192 1193 1195 + 1194 + 462 4 8 636 1191 635 1196 1195 1194 1198 + 1197 + 463 4 8 1198 1197 943 1199 1195 1194 1192 + 1193 + 464 4 8 680 681 1191 1196 1193 1199 1194 + 1197 + 465 4 8 226 643 227 1200 645 644 1202 + 1201 + 466 4 8 227 1200 237 1203 1202 1201 1205 + 1204 + 467 4 8 1205 1204 647 646 1202 1201 645 + 644 + 468 4 8 643 648 1200 1203 644 646 1201 + 1204 + 469 4 8 1206 1207 1209 1208 1210 1211 1213 + 1212 + 470 4 8 1209 1208 635 1214 1213 1212 639 + 1215 + 471 4 8 639 1215 647 1216 1213 1212 1210 + 1211 + 472 4 8 1207 1120 1208 1214 1211 1216 1212 + 1215 + 473 4 8 569 564 1218 1217 1219 1220 1222 + 1221 + 474 4 8 1218 1217 901 1223 1222 1221 1225 + 1224 + 475 4 8 1225 1224 1227 1226 1222 1221 1219 + 1220 + 476 4 8 564 164 1217 1223 1220 1226 1221 + 1224 + 477 4 8 602 601 1229 1228 1230 1231 1233 + 1232 + 478 4 8 1229 1228 824 1234 1233 1232 1236 + 1235 + 479 4 8 1236 1235 943 1237 1233 1232 1230 + 1231 + 480 4 8 601 606 1228 1234 1231 1237 1232 + 1235 + 481 4 8 150 570 1128 1238 1239 1240 1242 + 1241 + 482 4 8 1128 1238 1133 1243 1242 1241 1245 + 1244 + 483 4 8 1245 1244 647 1205 1242 1241 1239 + 1240 + 484 4 8 570 237 1238 1243 1240 1205 1241 + 1244 + 485 4 8 1227 1246 1225 1247 1219 1248 1222 + 1249 + 486 4 8 1225 1247 901 1250 1222 1249 1218 + 1251 + 487 4 8 1218 1251 569 1252 1222 1249 1219 + 1248 + 488 4 8 1246 706 1247 1250 1248 1252 1249 + 1251 + 489 4 8 593 1043 1254 1253 771 1042 1256 + 1255 + 490 4 8 1254 1253 1258 1257 1256 1255 1260 + 1259 + 491 4 8 1260 1259 342 689 1256 1255 771 + 1042 + 492 4 8 1043 188 1253 1257 1042 689 1255 + 1259 + 493 4 8 164 623 1223 1261 1226 1262 1224 + 1263 + 494 4 8 1223 1261 901 1264 1224 1263 1225 + 1265 + 495 4 8 1225 1265 1227 1266 1224 1263 1226 + 1262 + 496 4 8 623 602 1261 1264 1262 1266 1263 + 1265 + 497 4 8 901 903 1268 1267 1223 1269 1271 + 1270 + 498 4 8 1268 1267 188 1272 1271 1270 189 + 1273 + 499 4 8 189 1273 164 566 1271 1270 1223 + 1269 + 500 4 8 903 568 1267 1272 1269 566 1270 + 1273 + 501 4 8 188 191 189 190 1274 1275 1277 + 1276 + 502 4 8 189 190 164 165 1277 1276 650 + 651 + 503 4 8 650 651 209 657 1277 1276 1274 + 1275 + 504 4 8 191 176 190 165 1275 657 1276 + 651 + 505 4 8 667 1278 722 1279 1280 1281 1283 + 1282 + 506 4 8 722 1279 681 705 1283 1282 1285 + 1284 + 507 4 8 1285 1284 569 1252 1283 1282 1280 + 1281 + 508 4 8 1278 706 1279 705 1281 1252 1282 + 1284 + 509 4 8 1110 1102 1287 1286 1108 1105 1289 + 1288 + 510 4 8 1287 1286 785 1290 1289 1288 1168 + 1291 + 511 4 8 1168 1291 250 1101 1289 1288 1108 + 1105 + 512 4 8 1102 1056 1286 1290 1105 1101 1288 + 1291 + 513 4 8 901 900 1268 1292 903 902 1267 + 1293 + 514 4 8 1268 1292 188 691 1267 1293 1272 + 1294 + 515 4 8 1272 1294 568 904 1267 1293 903 + 902 + 516 4 8 900 693 1292 691 902 904 1293 + 1294 + 517 4 8 1258 1257 1296 1295 1260 1259 1298 + 1297 + 518 4 8 1296 1295 542 684 1298 1297 682 + 683 + 519 4 8 682 683 342 689 1298 1297 1260 + 1259 + 520 4 8 1257 188 1295 684 1259 689 1297 + 683 + 521 4 8 1258 1257 1300 1299 1296 1295 1302 + 1301 + 522 4 8 1300 1299 602 619 1302 1301 1304 + 1303 + 523 4 8 1304 1303 542 684 1302 1301 1296 + 1295 + 524 4 8 1257 188 1299 619 1295 684 1301 + 1303 + 525 4 8 1305 1306 1308 1307 1309 1310 1312 + 1311 + 526 4 8 1308 1307 1314 1313 1312 1311 1316 + 1315 + 527 4 8 1316 1315 635 1196 1312 1311 1309 + 1310 + 528 4 8 1306 681 1307 1313 1310 1196 1311 + 1315 + 529 4 8 820 819 1318 1317 822 821 1320 + 1319 + 530 4 8 1318 1317 590 592 1320 1319 1322 + 1321 + 531 4 8 1322 1321 824 823 1320 1319 822 + 821 + 532 4 8 819 557 1317 592 821 823 1319 + 1321 + 533 4 8 164 719 936 1323 1226 1324 1326 + 1325 + 534 4 8 936 1323 943 1199 1326 1325 1328 + 1327 + 535 4 8 1328 1327 1227 1329 1326 1325 1226 + 1324 + 536 4 8 719 681 1323 1199 1324 1329 1325 + 1327 + 537 4 8 1314 1316 1313 1315 1330 1331 1333 + 1332 + 538 4 8 1313 1315 681 1196 1333 1332 1199 + 1197 + 539 4 8 1199 1197 943 1198 1333 1332 1330 + 1331 + 540 4 8 1316 635 1315 1196 1331 1198 1332 + 1197 + 541 4 8 541 1334 895 1335 540 1336 1338 + 1337 + 542 4 8 895 1335 901 1250 1338 1337 1340 + 1339 + 543 4 8 1340 1339 542 1341 1338 1337 540 + 1336 + 544 4 8 1334 706 1335 1250 1336 1341 1337 + 1339 + 545 4 8 1342 1343 1345 1344 1346 1347 1349 + 1348 + 546 4 8 1345 1344 528 1350 1349 1348 532 + 1351 + 547 4 8 532 1351 541 915 1349 1348 1346 + 1347 + 548 4 8 1343 607 1344 1350 1347 915 1348 + 1351 + 549 4 8 1258 1296 1300 1302 1352 1353 1355 + 1354 + 550 4 8 1300 1302 602 1304 1355 1354 1229 + 1356 + 551 4 8 1229 1356 824 1357 1355 1354 1352 + 1353 + 552 4 8 1296 542 1302 1304 1353 1357 1354 + 1356 + 553 4 8 1227 1358 1266 1359 1360 1361 1363 + 1362 + 554 4 8 1266 1359 602 1229 1363 1362 1304 + 1356 + 555 4 8 1304 1356 542 1357 1363 1362 1360 + 1361 + 556 4 8 1358 824 1359 1229 1361 1357 1362 + 1356 + 557 4 8 496 1364 1145 1365 1366 1367 1369 + 1368 + 558 4 8 1145 1365 1143 1370 1369 1368 1372 + 1371 + 559 4 8 1372 1371 820 819 1369 1368 1366 + 1367 + 560 4 8 1364 557 1365 1370 1367 819 1368 + 1371 + 561 4 8 398 1373 1016 1374 1375 1376 1378 + 1377 + 562 4 8 1016 1374 993 1379 1378 1377 1381 + 1380 + 563 4 8 1381 1380 280 1160 1378 1377 1375 + 1376 + 564 4 8 1373 527 1374 1379 1376 1160 1377 + 1380 + 565 4 8 1382 1383 1385 1384 1386 1387 1389 + 1388 + 566 4 8 1385 1384 1391 1390 1389 1388 1393 + 1392 + 567 4 8 1393 1392 1120 1394 1389 1388 1386 + 1387 + 568 4 8 1383 677 1384 1390 1387 1394 1388 + 1392 + 569 4 8 488 1395 1397 1396 1398 1399 1401 + 1400 + 570 4 8 1397 1396 114 1402 1401 1400 1404 + 1403 + 571 4 8 1404 1403 1406 1405 1401 1400 1398 + 1399 + 572 4 8 1395 1407 1396 1402 1399 1405 1400 + 1403 + 573 4 8 213 1408 1410 1409 1411 1412 1414 + 1413 + 574 4 8 1410 1409 618 1415 1414 1413 1417 + 1416 + 575 4 8 1417 1416 23 1418 1414 1413 1411 + 1412 + 576 4 8 1408 317 1409 1415 1412 1418 1413 + 1416 + 577 4 8 618 911 889 1419 913 912 1421 + 1420 + 578 4 8 889 1419 188 1272 1421 1420 691 + 1294 + 579 4 8 691 1294 693 904 1421 1420 913 + 912 + 580 4 8 911 568 1419 1272 912 904 1420 + 1294 + 581 4 8 209 918 650 920 1274 1422 1277 + 1423 + 582 4 8 650 920 164 566 1277 1423 189 + 1273 + 583 4 8 189 1273 188 1272 1277 1423 1274 + 1422 + 584 4 8 918 568 920 566 1422 1272 1423 + 1273 + 585 4 8 262 266 1425 1424 1068 1426 1428 + 1427 + 586 4 8 1425 1424 55 730 1428 1427 728 + 729 + 587 4 8 728 729 14 731 1428 1427 1068 + 1426 + 588 4 8 266 37 1424 730 1426 731 1427 + 729 + 589 4 8 1 5 745 747 1429 1430 1432 + 1431 + 590 4 8 745 747 86 750 1432 1431 1434 + 1433 + 591 4 8 1434 1433 51 1071 1432 1431 1429 + 1430 + 592 4 8 5 14 747 750 1430 1071 1431 + 1433 + 593 4 8 110 151 158 152 416 1435 1437 + 1436 + 594 4 8 158 152 159 153 1437 1436 363 + 364 + 595 4 8 363 364 372 371 1437 1436 416 + 1435 + 596 4 8 151 150 152 153 1435 371 1436 + 364 + 597 4 8 1132 1438 1440 1439 1131 1441 1443 + 1442 + 598 4 8 1440 1439 1382 1444 1443 1442 1446 + 1445 + 599 4 8 1446 1445 1133 1447 1443 1442 1131 + 1441 + 600 4 8 1438 668 1439 1444 1441 1447 1442 + 1445 + 601 4 8 238 239 242 243 1064 1448 1450 + 1449 + 602 4 8 242 243 86 249 1450 1449 1434 + 1451 + 603 4 8 1434 1451 51 1106 1450 1449 1064 + 1448 + 604 4 8 239 250 243 249 1448 1106 1449 + 1451 + 605 4 8 856 1452 1454 1453 1455 1456 1458 + 1457 + 606 4 8 1454 1453 149 137 1458 1457 292 + 1459 + 607 4 8 292 1459 294 1460 1458 1457 1455 + 1456 + 608 4 8 1452 136 1453 137 1456 1460 1457 + 1459 + 609 4 8 295 1461 884 1462 1152 1463 1146 + 1464 + 610 4 8 884 1462 316 1465 1146 1464 1147 + 1466 + 611 4 8 1147 1466 860 1467 1146 1464 1152 + 1463 + 612 4 8 1461 328 1462 1465 1463 1467 1464 + 1466 + 613 4 8 993 1468 1470 1469 1471 1472 1474 + 1473 + 614 4 8 1470 1469 28 1475 1474 1473 841 + 1476 + 615 4 8 841 1476 846 1477 1474 1473 1471 + 1472 + 616 4 8 1468 1478 1469 1475 1472 1477 1473 + 1476 + 617 4 8 668 669 1480 1479 671 670 1482 + 1481 + 618 4 8 1480 1479 556 704 1482 1481 1484 + 1483 + 619 4 8 1484 1483 677 676 1482 1481 671 + 670 + 620 4 8 669 681 1479 704 670 676 1481 + 1483 + 621 4 8 110 162 151 155 1485 1486 1488 + 1487 + 622 4 8 151 155 150 154 1488 1487 579 + 577 + 623 4 8 579 577 580 578 1488 1487 1485 + 1486 + 624 4 8 162 163 155 154 1486 578 1487 + 577 + 625 4 8 590 592 589 591 1489 1490 1492 + 1491 + 626 4 8 589 591 556 555 1492 1491 1494 + 1493 + 627 4 8 1494 1493 1314 1495 1492 1491 1489 + 1490 + 628 4 8 592 557 591 555 1490 1495 1491 + 1493 + 629 4 8 935 1496 1498 1497 1499 1500 1502 + 1501 + 630 4 8 1498 1497 635 1503 1502 1501 1505 + 1504 + 631 4 8 1505 1504 1507 1506 1502 1501 1499 + 1500 + 632 4 8 1496 1508 1497 1503 1500 1506 1501 + 1504 + 633 4 8 677 1390 1394 1392 1509 1510 1512 + 1511 + 634 4 8 1394 1392 1120 1393 1512 1511 1214 + 1513 + 635 4 8 1214 1513 635 1514 1512 1511 1509 + 1510 + 636 4 8 1390 1391 1392 1393 1510 1514 1511 + 1513 + 637 4 8 500 495 1516 1515 1517 1518 1520 + 1519 + 638 4 8 1516 1515 811 1521 1520 1519 812 + 1522 + 639 4 8 812 1522 557 1364 1520 1519 1517 + 1518 + 640 4 8 495 496 1515 1521 1518 1364 1519 + 1522 + 641 4 8 1523 1524 1526 1525 1527 1528 1530 + 1529 + 642 4 8 1526 1525 1507 1506 1530 1529 1505 + 1504 + 643 4 8 1505 1504 635 1503 1530 1529 1527 + 1528 + 644 4 8 1524 1508 1525 1506 1528 1503 1529 + 1504 + 645 4 8 901 900 1340 1531 1268 1292 1533 + 1532 + 646 4 8 1340 1531 542 685 1533 1532 684 + 688 + 647 4 8 684 688 188 691 1533 1532 1268 + 1292 + 648 4 8 900 693 1531 685 1292 691 1532 + 688 + 649 4 8 955 944 950 945 1534 1535 1537 + 1536 + 650 4 8 950 945 568 567 1537 1536 903 + 1538 + 651 4 8 903 1538 901 1218 1537 1536 1534 + 1535 + 652 4 8 944 569 945 567 1535 1218 1536 + 1538 + 653 4 8 602 623 1264 1261 619 620 1540 + 1539 + 654 4 8 1264 1261 901 1223 1540 1539 1268 + 1271 + 655 4 8 1268 1271 188 189 1540 1539 619 + 620 + 656 4 8 623 164 1261 1223 620 189 1539 + 1271 + 657 4 8 901 1223 1218 1217 903 1269 1538 + 1541 + 658 4 8 1218 1217 569 564 1538 1541 567 + 565 + 659 4 8 567 565 568 566 1538 1541 903 + 1269 + 660 4 8 1223 164 1217 564 1269 566 1541 + 565 + 661 4 8 618 913 889 1421 616 1542 1044 + 1543 + 662 4 8 889 1421 188 691 1044 1543 689 + 690 + 663 4 8 689 690 342 692 1044 1543 616 + 1542 + 664 4 8 913 693 1421 691 1542 692 1543 + 690 + 665 4 8 607 611 905 906 1544 1545 1547 + 1546 + 666 4 8 905 906 568 911 1547 1546 1549 + 1548 + 667 4 8 1549 1548 213 1410 1547 1546 1544 + 1545 + 668 4 8 611 618 906 911 1545 1410 1546 + 1548 + 669 4 8 785 787 1551 1550 1552 1553 1555 + 1554 + 670 4 8 1551 1550 569 1280 1555 1554 1252 + 1281 + 671 4 8 1252 1281 706 1278 1555 1554 1552 + 1553 + 672 4 8 787 667 1550 1280 1553 1278 1554 + 1281 + 673 4 8 223 1556 1162 1557 666 1558 1161 + 1559 + 674 4 8 1162 1557 785 1551 1161 1559 787 + 1550 + 675 4 8 787 1550 667 1280 1161 1559 666 + 1558 + 676 4 8 1556 569 1557 1551 1558 1280 1559 + 1550 + 677 4 8 569 944 946 947 1551 1560 1562 + 1561 + 678 4 8 946 947 954 953 1562 1561 1564 + 1563 + 679 4 8 1564 1563 785 1565 1562 1561 1551 + 1560 + 680 4 8 944 955 947 953 1560 1565 1561 + 1563 + 681 4 8 398 397 1375 1566 1006 1567 1569 + 1568 + 682 4 8 1375 1566 280 320 1569 1568 1571 + 1570 + 683 4 8 1571 1570 350 1572 1569 1568 1006 + 1567 + 684 4 8 397 87 1566 320 1567 1572 1568 + 1570 + 685 4 8 100 91 99 92 349 1573 1575 + 1574 + 686 4 8 99 92 66 88 1575 1574 1577 + 1576 + 687 4 8 1577 1576 350 1572 1575 1574 349 + 1573 + 688 4 8 91 87 92 88 1573 1572 1574 + 1576 + 689 4 8 394 393 1155 1578 396 395 1580 + 1579 + 690 4 8 1155 1578 280 320 1580 1579 1375 + 1566 + 691 4 8 1375 1566 398 397 1580 1579 396 + 395 + 692 4 8 393 87 1578 320 395 397 1579 + 1566 + 693 4 8 743 1581 1583 1582 742 1584 1586 + 1585 + 694 4 8 1583 1582 1084 1112 1586 1585 1588 + 1587 + 695 4 8 1588 1587 250 1106 1586 1585 742 + 1584 + 696 4 8 1581 51 1582 1112 1584 1106 1585 + 1587 + 697 4 8 86 750 242 1589 1434 1433 1450 + 1590 + 698 4 8 242 1589 238 1061 1450 1590 1064 + 1065 + 699 4 8 1064 1065 51 1071 1450 1590 1434 + 1433 + 700 4 8 750 14 1589 1061 1433 1071 1590 + 1065 + 701 4 8 280 320 1155 1578 282 323 1592 + 1591 + 702 4 8 1155 1578 394 393 1592 1591 1594 + 1593 + 703 4 8 1594 1593 101 319 1592 1591 282 + 323 + 704 4 8 320 87 1578 393 323 319 1591 + 1593 + 705 4 8 280 376 1596 1595 1571 1597 1599 + 1598 + 706 4 8 1596 1595 28 353 1599 1598 352 + 351 + 707 4 8 352 351 350 349 1599 1598 1571 + 1597 + 708 4 8 376 100 1595 353 1597 349 1598 + 351 + 709 4 8 28 32 353 1025 1596 1600 1595 + 1601 + 710 4 8 353 1025 100 1023 1595 1601 376 + 1602 + 711 4 8 376 1602 280 1603 1595 1601 1596 + 1600 + 712 4 8 32 41 1025 1023 1600 1603 1601 + 1602 + 713 4 8 337 1604 336 1605 1606 1607 1609 + 1608 + 714 4 8 336 1605 342 764 1609 1608 1611 + 1610 + 715 4 8 1611 1610 442 1612 1609 1608 1606 + 1607 + 716 4 8 1604 528 1605 764 1607 1612 1608 + 1610 + 717 4 8 200 1613 1615 1614 1616 1617 1619 + 1618 + 718 4 8 1615 1614 81 761 1619 1618 760 + 759 + 719 4 8 760 759 23 758 1619 1618 1616 + 1617 + 720 4 8 1613 176 1614 761 1617 758 1618 + 759 + 721 4 8 295 885 1621 1620 1622 1623 1625 + 1624 + 722 4 8 1621 1620 1627 1626 1625 1624 1629 + 1628 + 723 4 8 1629 1628 846 1630 1625 1624 1622 + 1623 + 724 4 8 885 317 1620 1626 1623 1630 1624 + 1628 + 725 4 8 1631 1632 1634 1633 1635 1636 1638 + 1637 + 726 4 8 1634 1633 1206 1639 1638 1637 1641 + 1640 + 727 4 8 1641 1640 1406 1642 1638 1637 1635 + 1636 + 728 4 8 1632 580 1633 1639 1636 1642 1637 + 1640 + 729 4 8 1643 1644 1646 1645 1647 1648 1650 + 1649 + 730 4 8 1646 1645 1627 1626 1650 1649 1652 + 1651 + 731 4 8 1652 1651 337 1653 1650 1649 1647 + 1648 + 732 4 8 1644 317 1645 1626 1648 1653 1649 + 1651 + 733 4 8 1654 1655 1657 1656 1658 1659 1661 + 1660 + 734 4 8 1657 1656 706 1662 1661 1660 1552 + 1663 + 735 4 8 1552 1663 785 1565 1661 1660 1658 + 1659 + 736 4 8 1655 955 1656 1662 1659 1565 1660 + 1663 + 737 4 8 706 1334 1250 1335 1662 1664 1666 + 1665 + 738 4 8 1250 1335 901 895 1666 1665 1534 + 1667 + 739 4 8 1534 1667 955 1668 1666 1665 1662 + 1664 + 740 4 8 1334 541 1335 895 1664 1668 1665 + 1667 + 741 4 8 541 540 895 1338 893 1669 894 + 1670 + 742 4 8 895 1338 901 1340 894 1670 900 + 1531 + 743 4 8 900 1531 693 685 894 1670 893 + 1669 + 744 4 8 540 542 1338 1340 1669 685 1670 + 1531 + 745 4 8 955 944 1662 1671 1565 1560 1663 + 1672 + 746 4 8 1662 1671 706 1252 1663 1672 1552 + 1555 + 747 4 8 1552 1555 785 1551 1663 1672 1565 + 1560 + 748 4 8 944 569 1671 1252 1560 1551 1672 + 1555 + 749 4 8 954 983 1674 1673 1564 1675 1677 + 1676 + 750 4 8 1674 1673 1181 1678 1677 1676 1680 + 1679 + 751 4 8 1680 1679 785 1681 1677 1676 1564 + 1675 + 752 4 8 983 981 1673 1678 1675 1681 1676 + 1679 + 753 4 8 820 1682 1684 1683 1685 1686 1688 + 1687 + 754 4 8 1684 1683 706 1341 1688 1687 1690 + 1689 + 755 4 8 1690 1689 537 536 1688 1687 1685 + 1686 + 756 4 8 1682 542 1683 1341 1686 536 1687 + 1689 + 757 4 8 176 165 172 166 197 196 1692 + 1691 + 758 4 8 172 166 130 167 1692 1691 354 + 1693 + 759 4 8 354 1693 199 198 1692 1691 197 + 196 + 760 4 8 165 164 166 167 196 198 1691 + 1693 + 761 4 8 602 619 1264 1540 1304 1303 1695 + 1694 + 762 4 8 1264 1540 901 1268 1695 1694 1340 + 1533 + 763 4 8 1340 1533 542 684 1695 1694 1304 + 1303 + 764 4 8 619 188 1540 1268 1303 684 1694 + 1533 + 765 4 8 1227 1246 1360 1696 1225 1247 1698 + 1697 + 766 4 8 1360 1696 542 1341 1698 1697 1340 + 1339 + 767 4 8 1340 1339 901 1250 1698 1697 1225 + 1247 + 768 4 8 1246 706 1696 1341 1247 1250 1697 + 1339 + 769 4 8 1227 1329 1700 1699 1246 1701 1703 + 1702 + 770 4 8 1700 1699 590 707 1703 1702 709 + 710 + 771 4 8 709 710 706 705 1703 1702 1246 + 1701 + 772 4 8 1329 681 1699 707 1701 705 1702 + 710 + 773 4 8 834 1704 827 1705 1706 1707 1709 + 1708 + 774 4 8 827 1705 606 1710 1709 1708 1237 + 1711 + 775 4 8 1237 1711 943 1712 1709 1708 1706 + 1707 + 776 4 8 1704 1713 1705 1710 1707 1712 1708 + 1711 + 777 4 8 1227 1714 1700 1715 1329 1716 1699 + 1717 + 778 4 8 1700 1715 590 1489 1699 1717 707 + 1718 + 779 4 8 707 1718 681 1313 1699 1717 1329 + 1716 + 780 4 8 1714 1314 1715 1489 1716 1313 1717 + 1718 + 781 4 8 1143 1719 1721 1720 1145 1722 1724 + 1723 + 782 4 8 1721 1720 861 862 1724 1723 1726 + 1725 + 783 4 8 1726 1725 496 1727 1724 1723 1145 + 1722 + 784 4 8 1719 802 1720 862 1722 1727 1723 + 1725 + 785 4 8 1728 1729 1731 1730 1732 1733 1735 + 1734 + 786 4 8 1731 1730 101 104 1735 1734 319 + 326 + 787 4 8 319 326 87 116 1735 1734 1732 + 1733 + 788 4 8 1729 110 1730 104 1733 116 1734 + 326 + 789 4 8 398 1373 999 1736 1013 1737 1739 + 1738 + 790 4 8 999 1736 861 865 1739 1738 864 + 868 + 791 4 8 864 868 870 872 1739 1738 1013 + 1737 + 792 4 8 1373 527 1736 865 1737 872 1738 + 868 + 793 4 8 328 1465 331 1740 1741 1742 1744 + 1743 + 794 4 8 331 1740 337 1745 1744 1743 1653 + 1746 + 795 4 8 1653 1746 317 315 1744 1743 1741 + 1742 + 796 4 8 1465 316 1740 1745 1742 315 1743 + 1746 + 797 4 8 1094 1747 1749 1748 1096 1750 1752 + 1751 + 798 4 8 1749 1748 1754 1753 1752 1751 1756 + 1755 + 799 4 8 1756 1755 1098 1757 1752 1751 1096 + 1750 + 800 4 8 1747 37 1748 1753 1750 1757 1751 + 1755 + 801 4 8 1094 1088 1096 1092 1758 1759 1761 + 1760 + 802 4 8 1096 1092 1098 1089 1761 1760 1763 + 1762 + 803 4 8 1763 1762 1765 1764 1761 1760 1758 + 1759 + 804 4 8 1088 1085 1092 1089 1759 1764 1760 + 1762 + 805 4 8 350 345 1577 1766 349 344 1575 + 1767 + 806 4 8 1577 1766 66 1768 1575 1767 99 + 1769 + 807 4 8 99 1769 100 343 1575 1767 349 + 344 + 808 4 8 345 37 1766 1768 344 343 1767 + 1769 + 809 4 8 789 1770 784 1771 1184 1772 1774 + 1773 + 810 4 8 784 1771 785 1658 1774 1773 1680 + 1775 + 811 4 8 1680 1775 1181 1776 1774 1773 1184 + 1772 + 812 4 8 1770 1654 1771 1658 1772 1776 1773 + 1775 + 813 4 8 37 730 273 1777 266 1424 269 + 1778 + 814 4 8 273 1777 271 1779 269 1778 265 + 1780 + 815 4 8 265 1780 262 1425 269 1778 266 + 1424 + 816 4 8 730 55 1777 1779 1424 1425 1778 + 1780 + 817 4 8 607 608 1350 1781 610 609 1783 + 1782 + 818 4 8 1350 1781 528 1604 1783 1782 764 + 1605 + 819 4 8 764 1605 342 336 1783 1782 610 + 609 + 820 4 8 608 337 1781 1604 609 336 1782 + 1605 + 821 4 8 568 905 973 1784 980 1785 974 + 1786 + 822 4 8 973 1784 972 1787 974 1786 975 + 1788 + 823 4 8 975 1788 981 1789 974 1786 980 + 1785 + 824 4 8 905 607 1784 1787 1785 1789 1786 + 1788 + 825 4 8 1342 1346 1791 1790 1343 1347 1793 + 1792 + 826 4 8 1791 1790 981 1794 1793 1792 1789 + 1795 + 827 4 8 1789 1795 607 915 1793 1792 1343 + 1347 + 828 4 8 1346 541 1790 1794 1347 915 1792 + 1795 + 829 4 8 250 1588 1797 1796 1798 1799 1801 + 1800 + 830 4 8 1797 1796 971 1083 1801 1800 962 + 1802 + 831 4 8 962 1802 789 1182 1801 1800 1798 + 1799 + 832 4 8 1588 1084 1796 1083 1799 1182 1800 + 1802 + 833 4 8 312 314 1804 1803 431 1805 1807 + 1806 + 834 4 8 1804 1803 618 1032 1807 1806 1034 + 1035 + 835 4 8 1034 1035 430 1041 1807 1806 431 + 1805 + 836 4 8 314 316 1803 1032 1805 1041 1806 + 1035 + 837 4 8 23 1418 1417 1416 1808 1809 1811 + 1810 + 838 4 8 1417 1416 618 1415 1811 1810 1804 + 1812 + 839 4 8 1804 1812 312 311 1811 1810 1808 + 1809 + 840 4 8 1418 317 1416 1415 1809 311 1810 + 1812 + 841 4 8 23 758 1417 1813 1616 1617 1815 + 1814 + 842 4 8 1417 1813 618 886 1815 1814 1817 + 1816 + 843 4 8 1817 1816 200 1613 1815 1814 1616 + 1617 + 844 4 8 758 176 1813 886 1617 1613 1814 + 1816 + 845 4 8 41 1818 304 1819 40 1820 1822 + 1821 + 846 4 8 304 1819 317 1418 1822 1821 1824 + 1823 + 847 4 8 1824 1823 15 25 1822 1821 40 + 1820 + 848 4 8 1818 23 1819 1418 1820 25 1821 + 1823 + 849 4 8 1206 1641 1639 1640 1825 1826 1828 + 1827 + 850 4 8 1639 1640 580 1642 1828 1827 1830 + 1829 + 851 4 8 1830 1829 1832 1831 1828 1827 1825 + 1826 + 852 4 8 1641 1406 1640 1642 1826 1831 1827 + 1829 + 853 4 8 580 1639 1830 1828 1833 1834 1836 + 1835 + 854 4 8 1830 1828 1832 1825 1836 1835 1838 + 1837 + 855 4 8 1838 1837 647 1210 1836 1835 1833 + 1834 + 856 4 8 1639 1206 1828 1825 1834 1210 1835 + 1837 + 857 4 8 647 1205 1838 1839 1833 1840 1836 + 1841 + 858 4 8 1838 1839 1832 1842 1836 1841 1830 + 1843 + 859 4 8 1830 1843 580 573 1836 1841 1833 + 1840 + 860 4 8 1205 237 1839 1842 1840 573 1841 + 1843 + 861 4 8 1110 1844 1287 1845 1102 1846 1286 + 1847 + 862 4 8 1287 1845 785 1564 1286 1847 1290 + 1848 + 863 4 8 1290 1848 1056 1849 1286 1847 1102 + 1846 + 864 4 8 1844 954 1845 1564 1846 1849 1847 + 1848 + 865 4 8 954 1850 983 1851 976 1852 979 + 1853 + 866 4 8 983 1851 981 1854 979 1853 975 + 1855 + 867 4 8 975 1855 972 1856 979 1853 976 + 1852 + 868 4 8 1850 1180 1851 1854 1852 1856 1853 + 1855 + 869 4 8 41 1603 32 1600 1857 1858 1860 + 1859 + 870 4 8 32 1600 28 1596 1860 1859 841 + 1861 + 871 4 8 841 1861 846 1862 1860 1859 1857 + 1858 + 872 4 8 1603 280 1600 1596 1858 1862 1859 + 1861 + 873 4 8 406 1863 1865 1864 410 1866 1868 + 1867 + 874 4 8 1865 1864 1870 1869 1868 1867 1872 + 1871 + 875 4 8 1872 1871 110 1873 1868 1867 410 + 1866 + 876 4 8 1863 1382 1864 1869 1866 1873 1867 + 1871 + 877 4 8 398 1373 389 1874 999 1736 1002 + 1875 + 878 4 8 389 1874 385 1876 1002 1875 998 + 1877 + 879 4 8 998 1877 861 865 1002 1875 999 + 1736 + 880 4 8 1373 527 1874 1876 1736 865 1875 + 1877 + 881 4 8 136 1878 525 1879 519 1880 522 + 1881 + 882 4 8 525 1879 394 1882 522 1881 498 + 1883 + 883 4 8 498 1883 496 1884 522 1881 519 + 1880 + 884 4 8 1878 1885 1879 1882 1880 1884 1881 + 1883 + 885 4 8 811 1886 1521 1887 1516 1888 1515 + 1889 + 886 4 8 1521 1887 496 1884 1515 1889 495 + 1890 + 887 4 8 495 1890 500 1891 1515 1889 1516 + 1888 + 888 4 8 1886 1885 1887 1884 1888 1891 1889 + 1890 + 889 4 8 1382 1383 1386 1387 1446 1892 1894 + 1893 + 890 4 8 1386 1387 1120 1394 1894 1893 1121 + 1895 + 891 4 8 1121 1895 1133 1896 1894 1893 1446 + 1892 + 892 4 8 1383 677 1387 1394 1892 1896 1893 + 1895 + 893 4 8 1897 1898 1900 1899 1901 1902 1904 + 1903 + 894 4 8 1900 1899 635 1214 1904 1903 1209 + 1208 + 895 4 8 1209 1208 1206 1207 1904 1903 1901 + 1902 + 896 4 8 1898 1120 1899 1214 1902 1207 1903 + 1208 + 897 4 8 824 823 1906 1905 1907 1908 1910 + 1909 + 898 4 8 1906 1905 1314 1495 1910 1909 1912 + 1911 + 899 4 8 1912 1911 935 1913 1910 1909 1907 + 1908 + 900 4 8 823 557 1905 1495 1908 1913 1909 + 1911 + 901 4 8 1914 1915 1917 1916 1918 1919 1921 + 1920 + 902 4 8 1917 1916 1923 1922 1921 1920 1925 + 1924 + 903 4 8 1925 1924 1927 1926 1921 1920 1918 + 1919 + 904 4 8 1915 1928 1916 1922 1919 1926 1920 + 1924 + 905 4 8 984 1929 1931 1930 1932 1933 1935 + 1934 + 906 4 8 1931 1930 845 1936 1935 1934 1938 + 1937 + 907 4 8 1938 1937 1940 1939 1935 1934 1932 + 1933 + 908 4 8 1929 1478 1930 1936 1933 1939 1934 + 1937 + 909 4 8 845 1936 1931 1930 844 1941 1943 + 1942 + 910 4 8 1931 1930 984 1929 1943 1942 1945 + 1944 + 911 4 8 1945 1944 846 1477 1943 1942 844 + 1941 + 912 4 8 1936 1478 1930 1929 1941 1477 1942 + 1944 + 913 4 8 57 270 274 272 1946 1947 1949 + 1948 + 914 4 8 274 272 37 273 1949 1948 1757 + 1950 + 915 4 8 1757 1950 1098 1951 1949 1948 1946 + 1947 + 916 4 8 270 271 272 273 1947 1951 1948 + 1950 + 917 4 8 1143 1952 1370 1953 1954 1955 1957 + 1956 + 918 4 8 1370 1953 557 544 1957 1956 1959 + 1958 + 919 4 8 1959 1958 922 1960 1957 1956 1954 + 1955 + 920 4 8 1952 543 1953 544 1955 1960 1956 + 1958 + 921 4 8 732 1961 733 1962 1075 1963 1965 + 1964 + 922 4 8 733 1962 250 427 1965 1964 1797 + 1966 + 923 4 8 1797 1966 971 970 1965 1964 1075 + 1963 + 924 4 8 1961 425 1962 427 1963 970 1964 + 1966 + 925 4 8 70 1967 1969 1968 1970 1971 1973 + 1972 + 926 4 8 1969 1968 37 731 1973 1972 266 + 1426 + 927 4 8 266 1426 262 1068 1973 1972 1970 + 1971 + 928 4 8 1967 14 1968 731 1971 1068 1972 + 1426 + 929 4 8 1305 1308 1975 1974 1976 1977 1979 + 1978 + 930 4 8 1975 1974 556 1494 1979 1978 555 + 1493 + 931 4 8 555 1493 557 1495 1979 1978 1976 + 1977 + 932 4 8 1308 1314 1974 1494 1977 1495 1978 + 1493 + 933 4 8 1305 1306 1975 1980 1308 1307 1974 + 1981 + 934 4 8 1975 1980 556 704 1974 1981 1494 + 1982 + 935 4 8 1494 1982 1314 1313 1974 1981 1308 + 1307 + 936 4 8 1306 681 1980 704 1307 1313 1981 + 1982 + 937 4 8 820 1685 1984 1983 1372 1985 1987 + 1986 + 938 4 8 1984 1983 581 1988 1987 1986 1990 + 1989 + 939 4 8 1990 1989 1143 1991 1987 1986 1372 + 1985 + 940 4 8 1685 537 1983 1988 1985 1991 1986 + 1989 + 941 4 8 442 1019 1018 1022 1992 1993 1995 + 1994 + 942 4 8 1018 1022 537 798 1995 1994 1997 + 1996 + 943 4 8 1997 1996 496 1727 1995 1994 1992 + 1993 + 944 4 8 1019 802 1022 798 1993 1727 1994 + 1996 + 945 4 8 1654 1658 1999 1998 1770 1771 2001 + 2000 + 946 4 8 1999 1998 694 779 2001 2000 777 + 778 + 947 4 8 777 778 789 784 2001 2000 1770 + 1771 + 948 4 8 1658 785 1998 779 1771 784 2000 + 778 + 949 4 8 955 1668 2003 2002 2004 2005 2007 + 2006 + 950 4 8 2003 2002 981 1794 2007 2006 2009 + 2008 + 951 4 8 2009 2008 790 2010 2007 2006 2004 + 2005 + 952 4 8 1668 541 2002 1794 2005 2010 2006 + 2008 + 953 4 8 537 1690 539 2011 536 1689 538 + 2012 + 954 4 8 539 2011 541 1334 538 2012 540 + 1336 + 955 4 8 540 1336 542 1341 538 2012 536 + 1689 + 956 4 8 1690 706 2011 1334 1689 1341 2012 + 1336 + 957 4 8 790 2010 793 2013 2014 2015 2017 + 2016 + 958 4 8 793 2013 537 539 2017 2016 1690 + 2011 + 959 4 8 1690 2011 706 1334 2017 2016 2014 + 2015 + 960 4 8 2010 541 2013 539 2015 1334 2016 + 2011 + 961 4 8 820 2018 822 2019 2020 2021 2023 + 2022 + 962 4 8 822 2019 824 1234 2023 2022 1352 + 2024 + 963 4 8 1352 2024 1258 2025 2023 2022 2020 + 2021 + 964 4 8 2018 606 2019 1234 2021 2025 2022 + 2024 + 965 4 8 1258 1296 1352 1353 2020 2026 2023 + 2027 + 966 4 8 1352 1353 824 1357 2023 2027 822 + 2028 + 967 4 8 822 2028 820 1682 2023 2027 2020 + 2026 + 968 4 8 1296 542 1353 1357 2026 1682 2027 + 2028 + 969 4 8 668 2029 2031 2030 669 2032 2034 + 2033 + 970 4 8 2031 2030 694 780 2034 2033 698 + 2035 + 971 4 8 698 2035 681 722 2034 2033 669 + 2032 + 972 4 8 2029 667 2030 780 2032 722 2033 + 2035 + 973 4 8 368 2036 2038 2037 419 2039 2041 + 2040 + 974 4 8 2038 2037 667 2042 2041 2040 2044 + 2043 + 975 4 8 2044 2043 425 2045 2041 2040 419 + 2039 + 976 4 8 2036 1132 2037 2042 2039 2045 2040 + 2043 + 977 4 8 1728 2046 2048 2047 2049 2050 2052 + 2051 + 978 4 8 2048 2047 1134 1135 2052 2051 2054 + 2053 + 979 4 8 2054 2053 385 489 2052 2051 2049 + 2050 + 980 4 8 2046 500 2047 1135 2050 489 2051 + 2053 + 981 4 8 1382 1446 1444 1445 1383 1892 2056 + 2055 + 982 4 8 1444 1445 668 1447 2056 2055 671 + 2057 + 983 4 8 671 2057 677 1896 2056 2055 1383 + 1892 + 984 4 8 1446 1133 1445 1447 1892 1896 2055 + 2057 + 985 4 8 250 246 420 2058 239 240 2060 + 2059 + 986 4 8 420 2058 368 367 2060 2059 478 + 477 + 987 4 8 478 477 238 241 2060 2059 239 + 240 + 988 4 8 246 150 2058 367 240 241 2059 + 477 + 989 4 8 2061 2062 2064 2063 2065 2066 2068 + 2067 + 990 4 8 2064 2063 1181 1170 2068 2067 1189 + 2069 + 991 4 8 1189 2069 1084 1118 2068 2067 2065 + 2066 + 992 4 8 2062 42 2063 1170 2066 1118 2067 + 2069 + 993 4 8 668 2070 2072 2071 2073 2074 2076 + 2075 + 994 4 8 2072 2071 789 2077 2076 2075 961 + 2078 + 995 4 8 961 2078 967 2079 2076 2075 2073 + 2074 + 996 4 8 2070 2080 2071 2077 2074 2079 2075 + 2078 + 997 4 8 732 736 1072 2081 733 737 2083 + 2082 + 998 4 8 1072 2081 1084 1583 2083 2082 1588 + 1586 + 999 4 8 1588 1586 250 742 2083 2082 733 + 737 + 1000 4 8 736 743 2081 1583 737 742 2082 + 1586 + 1001 4 8 1056 1099 1055 2084 1101 1100 2086 + 2085 + 1002 4 8 1055 2084 86 1434 2086 2085 249 + 1451 + 1003 4 8 249 1451 250 1106 2086 2085 1101 + 1100 + 1004 4 8 1099 51 2084 1434 1100 1106 2085 + 1451 + 1005 4 8 56 43 50 44 2087 2088 2090 + 2089 + 1006 4 8 50 44 51 45 2090 2089 1109 + 1111 + 1007 4 8 1109 1111 1110 1116 2090 2089 2087 + 2088 + 1008 4 8 43 42 44 45 2088 1116 2089 + 1111 + 1009 4 8 1832 2091 2093 2092 1842 2094 2096 + 2095 + 1010 4 8 2093 2092 85 230 2096 2095 236 + 231 + 1011 4 8 236 231 237 227 2096 2095 1842 + 2094 + 1012 4 8 2091 226 2092 230 2094 227 2095 + 231 + 1013 4 8 943 942 2098 2097 1706 2099 2101 + 2100 + 1014 4 8 2098 2097 199 354 2101 2100 833 + 2102 + 1015 4 8 833 2102 834 2103 2101 2100 1706 + 2099 + 1016 4 8 942 130 2097 354 2099 2103 2100 + 2102 + 1017 4 8 1507 2104 2106 2105 1505 2107 2109 + 2108 + 1018 4 8 2106 2105 943 1330 2109 2108 1198 + 1331 + 1019 4 8 1198 1331 635 1316 2109 2108 1505 + 2107 + 1020 4 8 2104 1314 2105 1330 2107 1316 2108 + 1331 + 1021 4 8 602 623 604 624 1230 2110 2112 + 2111 + 1022 4 8 604 624 199 198 2112 2111 2098 + 2113 + 1023 4 8 2098 2113 943 936 2112 2111 1230 + 2110 + 1024 4 8 623 164 624 198 2110 936 2111 + 2113 + 1025 4 8 552 551 2115 2114 554 553 2117 + 2116 + 1026 4 8 2115 2114 1305 1976 2117 2116 1975 + 1979 + 1027 4 8 1975 1979 556 555 2117 2116 554 + 553 + 1028 4 8 551 557 2114 1976 553 555 2116 + 1979 + 1029 4 8 1391 1390 2119 2118 1514 1510 2121 + 2120 + 1030 4 8 2119 2118 1305 2122 2121 2120 1309 + 2123 + 1031 4 8 1309 2123 635 1509 2121 2120 1514 + 1510 + 1032 4 8 1390 677 2118 2122 1510 1509 2120 + 2123 + 1033 4 8 552 551 2125 2124 2115 2114 2127 + 2126 + 1034 4 8 2125 2124 935 1913 2127 2126 2129 + 2128 + 1035 4 8 2129 2128 1305 1976 2127 2126 2115 + 2114 + 1036 4 8 551 557 2124 1913 2114 1976 2126 + 2128 + 1037 4 8 1305 1309 2122 2123 1306 1310 2131 + 2130 + 1038 4 8 2122 2123 677 1509 2131 2130 676 + 2132 + 1039 4 8 676 2132 681 1196 2131 2130 1306 + 1310 + 1040 4 8 1309 635 2123 1509 1310 1196 2130 + 2132 + 1041 4 8 677 2122 676 2131 1484 2133 1483 + 2134 + 1042 4 8 676 2131 681 1306 1483 2134 704 + 1980 + 1043 4 8 704 1980 556 1975 1483 2134 1484 + 2133 + 1044 4 8 2122 1305 2131 1306 2133 1975 2134 + 1980 + 1045 4 8 294 293 2136 2135 452 2137 2139 + 2138 + 1046 4 8 2136 2135 860 1152 2139 2138 1467 + 1463 + 1047 4 8 1467 1463 328 1461 2139 2138 452 + 2137 + 1048 4 8 293 295 2135 1152 2137 1461 2138 + 1463 + 1049 4 8 294 292 2141 2140 1460 1459 2143 + 2142 + 1050 4 8 2141 2140 280 279 2143 2142 276 + 275 + 1051 4 8 276 275 136 137 2143 2142 1460 + 1459 + 1052 4 8 292 149 2140 279 1459 137 2142 + 275 + 1053 4 8 467 2144 2146 2145 2147 2148 2150 + 2149 + 1054 4 8 2146 2145 510 2151 2150 2149 2153 + 2152 + 1055 4 8 2153 2152 856 1454 2150 2149 2147 + 2148 + 1056 4 8 2144 149 2145 2151 2148 1454 2149 + 2152 + 1057 4 8 2154 2155 2157 2156 2158 2159 2161 + 2160 + 1058 4 8 2157 2156 442 855 2161 2160 445 + 2162 + 1059 4 8 445 2162 294 1455 2161 2160 2158 + 2159 + 1060 4 8 2155 856 2156 855 2159 1455 2160 + 2162 + 1061 4 8 2154 2163 2165 2164 2166 2167 2169 + 2168 + 1062 4 8 2165 2164 802 801 2169 2168 873 + 2170 + 1063 4 8 873 2170 527 2171 2169 2168 2166 + 2167 + 1064 4 8 2163 454 2164 801 2167 2171 2168 + 2170 + 1065 4 8 350 1009 1571 2172 1006 1010 1569 + 2173 + 1066 4 8 1571 2172 280 1381 1569 2173 1375 + 1378 + 1067 4 8 1375 1378 398 1016 1569 2173 1006 + 1010 + 1068 4 8 1009 993 2172 1381 1010 1016 2173 + 1378 + 1069 4 8 294 450 2175 2174 2176 2177 2179 + 2178 + 1070 4 8 2175 2174 527 2171 2179 2178 1379 + 2180 + 1071 4 8 1379 2180 993 992 2179 2178 2176 + 2177 + 1072 4 8 450 454 2174 2171 2177 992 2178 + 2180 + 1073 4 8 2181 2182 2184 2183 2185 2186 2188 + 2187 + 1074 4 8 2184 2183 42 1170 2188 2187 1172 + 1173 + 1075 4 8 1172 1173 1180 1179 2188 2187 2185 + 2186 + 1076 4 8 2182 1181 2183 1170 2186 1179 2187 + 1173 + 1077 4 8 667 787 1169 1167 788 786 2190 + 2189 + 1078 4 8 1169 1167 250 1168 2190 2189 1798 + 2191 + 1079 4 8 1798 2191 789 784 2190 2189 788 + 786 + 1080 4 8 787 785 1167 1168 786 784 2189 + 2191 + 1081 4 8 1728 2049 1732 2192 2193 2194 2196 + 2195 + 1082 4 8 1732 2192 87 386 2196 2195 393 + 387 + 1083 4 8 393 387 394 388 2196 2195 2193 + 2194 + 1084 4 8 2049 385 2192 386 2194 388 2195 + 387 + 1085 4 8 934 2197 2199 2198 2200 2201 2203 + 2202 + 1086 4 8 2199 2198 2205 2204 2203 2202 2207 + 2206 + 1087 4 8 2207 2206 2209 2208 2203 2202 2200 + 2201 + 1088 4 8 2197 2210 2198 2204 2201 2208 2202 + 2206 + 1089 4 8 238 2211 1064 2212 1063 2213 1067 + 2214 + 1090 4 8 1064 2212 51 1581 1067 2214 1070 + 2215 + 1091 4 8 1070 2215 262 2216 1067 2214 1063 + 2213 + 1092 4 8 2211 743 2212 1581 2213 2216 2214 + 2215 + 1093 4 8 1 2217 2219 2218 1429 2220 2222 + 2221 + 1094 4 8 2219 2218 55 54 2222 2221 53 + 52 + 1095 4 8 53 52 51 50 2222 2221 1429 + 2220 + 1096 4 8 2217 56 2218 54 2220 50 2221 + 52 + 1097 4 8 1305 2119 2129 2223 2115 2224 2127 + 2225 + 1098 4 8 2129 2223 935 2226 2127 2225 2125 + 2227 + 1099 4 8 2125 2227 552 2228 2127 2225 2115 + 2224 + 1100 4 8 2119 1391 2223 2226 2224 2228 2225 + 2227 + 1101 4 8 134 832 2230 2229 2231 2232 2234 + 2233 + 1102 4 8 2230 2229 2236 2235 2234 2233 2238 + 2237 + 1103 4 8 2238 2237 1713 1704 2234 2233 2231 + 2232 + 1104 4 8 832 834 2229 2235 2232 1704 2233 + 2237 + 1105 4 8 2154 2157 2240 2239 2241 2242 2244 + 2243 + 1106 4 8 2240 2239 2246 2245 2244 2243 2248 + 2247 + 1107 4 8 2248 2247 496 1992 2244 2243 2241 + 2242 + 1108 4 8 2157 442 2239 2245 2242 1992 2243 + 2247 + 1109 4 8 317 1415 311 1812 315 2249 313 + 2250 + 1110 4 8 311 1812 312 1804 313 2250 314 + 1803 + 1111 4 8 314 1803 316 1032 313 2250 315 + 2249 + 1112 4 8 1415 618 1812 1804 2249 1032 2250 + 1803 + 1113 4 8 593 2251 770 2252 2253 2254 2256 + 2255 + 1114 4 8 770 2252 618 888 2256 2255 1034 + 2257 + 1115 4 8 1034 2257 430 503 2256 2255 2253 + 2254 + 1116 4 8 2251 296 2252 888 2254 503 2255 + 2257 + 1117 4 8 2258 2259 2261 2260 2262 2263 2265 + 2264 + 1118 4 8 2261 2260 2267 2266 2265 2264 2269 + 2268 + 1119 4 8 2269 2268 430 509 2265 2264 2262 + 2263 + 1120 4 8 2259 510 2260 2266 2263 509 2264 + 2268 + 1121 4 8 296 888 2271 2270 514 887 2273 + 2272 + 1122 4 8 2271 2270 23 1417 2273 2272 758 + 1813 + 1123 4 8 758 1813 176 886 2273 2272 514 + 887 + 1124 4 8 888 618 2270 1417 887 886 2272 + 1813 + 1125 4 8 618 913 616 1542 611 910 614 + 2274 + 1126 4 8 616 1542 342 692 614 2274 610 + 2275 + 1127 4 8 610 2275 607 907 614 2274 611 + 910 + 1128 4 8 913 693 1542 692 910 907 2274 + 2275 + 1129 4 8 114 2276 1404 2277 2278 2279 2281 + 2280 + 1130 4 8 1404 2277 1406 1635 2281 2280 1642 + 1636 + 1131 4 8 1642 1636 580 1632 2281 2280 2278 + 2279 + 1132 4 8 2276 1631 2277 1635 2279 1632 2280 + 1636 + 1133 4 8 135 479 440 2282 507 2283 2285 + 2284 + 1134 4 8 440 2282 149 147 2285 2284 2151 + 2286 + 1135 4 8 2151 2286 510 2287 2285 2284 507 + 2283 + 1136 4 8 479 148 2282 147 2283 2287 2284 + 2286 + 1137 4 8 2288 2289 2291 2290 2292 2293 2295 + 2294 + 1138 4 8 2291 2290 114 105 2295 2294 2297 + 2296 + 1139 4 8 2297 2296 148 146 2295 2294 2292 + 2293 + 1140 4 8 2289 101 2290 105 2293 146 2294 + 2296 + 1141 4 8 295 290 884 1149 283 284 882 + 2298 + 1142 4 8 884 1149 316 1148 882 2298 307 + 2299 + 1143 4 8 307 2299 41 285 882 2298 283 + 284 + 1144 4 8 290 149 1149 1148 284 285 2298 + 2299 + 1145 4 8 1 5 2219 2300 2 6 2302 + 2301 + 1146 4 8 2219 2300 55 728 2302 2301 724 + 723 + 1147 4 8 724 723 15 13 2302 2301 2 + 6 + 1148 4 8 5 14 2300 728 6 13 2301 + 723 + 1149 4 8 15 2303 2305 2304 724 2306 2308 + 2307 + 1150 4 8 2305 2304 42 43 2308 2307 46 + 47 + 1151 4 8 46 47 55 54 2308 2307 724 + 2306 + 1152 4 8 2303 56 2304 43 2306 54 2307 + 47 + 1153 4 8 214 2309 2311 2310 2312 2313 2315 + 2314 + 1154 4 8 2311 2310 1056 1055 2315 2314 1054 + 1053 + 1155 4 8 1054 1053 72 73 2315 2314 2312 + 2313 + 1156 4 8 2309 86 2310 1055 2313 73 2314 + 1053 + 1157 4 8 72 1031 2317 2316 2312 2318 2320 + 2319 + 1158 4 8 2317 2316 209 657 2320 2319 656 + 655 + 1159 4 8 656 655 214 654 2320 2319 2312 + 2318 + 1160 4 8 1031 176 2316 657 2318 654 2319 + 655 + 1161 4 8 27 2321 2323 2322 2324 2325 2327 + 2326 + 1162 4 8 2323 2322 972 973 2327 2326 976 + 977 + 1163 4 8 976 977 954 952 2327 2326 2324 + 2325 + 1164 4 8 2321 568 2322 973 2325 952 2326 + 977 + 1165 4 8 1 2217 2 2328 2219 2218 2302 + 2329 + 1166 4 8 2 2328 15 2303 2302 2329 724 + 2306 + 1167 4 8 724 2306 55 54 2302 2329 2219 + 2218 + 1168 4 8 2217 56 2328 2303 2218 54 2329 + 2306 + 1169 4 8 56 2303 43 2304 2330 2331 2333 + 2332 + 1170 4 8 43 2304 42 2305 2333 2332 1172 + 2334 + 1171 4 8 1172 2334 1180 2335 2333 2332 2330 + 2331 + 1172 4 8 2303 15 2304 2305 2331 2335 2332 + 2334 + 1173 4 8 1180 1178 1172 1175 2330 2336 2333 + 2337 + 1174 4 8 1172 1175 42 1116 2333 2337 43 + 2088 + 1175 4 8 43 2088 56 2087 2333 2337 2330 + 2336 + 1176 4 8 1178 1110 1175 1116 2336 2087 2337 + 2088 + 1177 4 8 271 1779 2339 2338 265 1780 2341 + 2340 + 1178 4 8 2339 2338 743 2342 2341 2340 2216 + 2343 + 1179 4 8 2216 2343 262 1425 2341 2340 265 + 1780 + 1180 4 8 1779 55 2338 2342 1780 1425 2340 + 2343 + 1181 4 8 262 2344 263 2345 1970 2346 2348 + 2347 + 1182 4 8 263 2345 57 58 2348 2347 61 + 62 + 1183 4 8 61 62 70 69 2348 2347 1970 + 2346 + 1184 4 8 2344 71 2345 58 2346 69 2347 + 62 + 1185 4 8 845 2349 837 2350 2351 2352 2354 + 2353 + 1186 4 8 837 2350 15 36 2354 2353 724 + 727 + 1187 4 8 724 727 55 730 2354 2353 2351 + 2352 + 1188 4 8 2349 37 2350 36 2352 730 2353 + 727 + 1189 4 8 569 1280 1556 1558 564 2355 2357 + 2356 + 1190 4 8 1556 1558 223 666 2357 2356 222 + 2358 + 1191 4 8 222 2358 164 721 2357 2356 564 + 2355 + 1192 4 8 1280 667 1558 666 2355 721 2356 + 2358 + 1193 4 8 681 705 1329 1701 1285 1284 2360 + 2359 + 1194 4 8 1329 1701 1227 1246 2360 2359 1219 + 1248 + 1195 4 8 1219 1248 569 1252 2360 2359 1285 + 1284 + 1196 4 8 705 706 1701 1246 1284 1252 2359 + 1248 + 1197 4 8 581 582 2362 2361 2363 2364 2366 + 2365 + 1198 4 8 2362 2361 694 697 2366 2365 695 + 696 + 1199 4 8 695 696 706 702 2366 2365 2363 + 2364 + 1200 4 8 582 556 2361 697 2364 702 2365 + 696 + 1201 4 8 694 780 779 783 695 2367 2369 + 2368 + 1202 4 8 779 783 785 787 2369 2368 1552 + 1553 + 1203 4 8 1552 1553 706 1278 2369 2368 695 + 2367 + 1204 4 8 780 667 783 787 2367 1278 2368 + 1553 + 1205 4 8 569 564 1219 1220 1285 2370 2360 + 2371 + 1206 4 8 1219 1220 1227 1226 2360 2371 1329 + 1324 + 1207 4 8 1329 1324 681 719 2360 2371 1285 + 2370 + 1208 4 8 564 164 1220 1226 2370 719 2371 + 1324 + 1209 4 8 681 698 705 699 722 2035 1279 + 2372 + 1210 4 8 705 699 706 695 1279 2372 1278 + 2367 + 1211 4 8 1278 2367 667 780 1279 2372 722 + 2035 + 1212 4 8 698 694 699 695 2035 780 2372 + 2367 + 1213 4 8 668 669 2031 2034 1480 1479 2374 + 2373 + 1214 4 8 2031 2034 694 698 2374 2373 697 + 701 + 1215 4 8 697 701 556 704 2374 2373 1480 + 1479 + 1216 4 8 669 681 2034 698 1479 704 2373 + 701 + 1217 4 8 590 1489 589 1492 707 1718 708 + 2375 + 1218 4 8 589 1492 556 1494 708 2375 704 + 1982 + 1219 4 8 704 1982 681 1313 708 2375 707 + 1718 + 1220 4 8 1489 1314 1492 1494 1718 1313 2375 + 1982 + 1221 4 8 590 592 1489 1490 1322 1321 2377 + 2376 + 1222 4 8 1489 1490 1314 1495 2377 2376 1906 + 1905 + 1223 4 8 1906 1905 824 823 2377 2376 1322 + 1321 + 1224 4 8 592 557 1490 1495 1321 823 2376 + 1905 + 1225 4 8 901 1264 1340 1695 1225 1265 1698 + 2378 + 1226 4 8 1340 1695 542 1304 1698 2378 1360 + 1363 + 1227 4 8 1360 1363 1227 1266 1698 2378 1225 + 1265 + 1228 4 8 1264 602 1695 1304 1265 1266 2378 + 1363 + 1229 4 8 706 2363 709 2379 1684 2380 2382 + 2381 + 1230 4 8 709 2379 590 584 2382 2381 1318 + 2383 + 1231 4 8 1318 2383 820 1984 2382 2381 1684 + 2380 + 1232 4 8 2363 581 2379 584 2380 1984 2381 + 2383 + 1233 4 8 943 1237 2098 2384 1230 1231 2112 + 2385 + 1234 4 8 2098 2384 199 605 2112 2385 604 + 603 + 1235 4 8 604 603 602 601 2112 2385 1230 + 1231 + 1236 4 8 1237 606 2384 605 1231 601 2385 + 603 + 1237 4 8 581 2363 584 2379 582 2364 583 + 2386 + 1238 4 8 584 2379 590 709 583 2386 589 + 712 + 1239 4 8 589 712 556 702 583 2386 582 + 2364 + 1240 4 8 2363 706 2379 709 2364 702 2386 + 712 + 1241 4 8 668 2072 2031 2387 2029 2388 2030 + 2389 + 1242 4 8 2031 2387 694 777 2030 2389 780 + 781 + 1243 4 8 780 781 667 788 2030 2389 2029 + 2388 + 1244 4 8 2072 789 2387 777 2388 788 2389 + 781 + 1245 4 8 2390 2391 2393 2392 2394 2395 2397 + 2396 + 1246 4 8 2393 2392 668 2070 2397 2396 2073 + 2074 + 1247 4 8 2073 2074 967 2079 2397 2396 2394 + 2395 + 1248 4 8 2391 2080 2392 2070 2395 2079 2396 + 2074 + 1249 4 8 552 554 2115 2117 2398 2399 2401 + 2400 + 1250 4 8 2115 2117 1305 1975 2401 2400 2122 + 2133 + 1251 4 8 2122 2133 677 1484 2401 2400 2398 + 2399 + 1252 4 8 554 556 2117 1975 2399 1484 2400 + 2133 + 1253 4 8 552 2398 2403 2402 554 2399 2405 + 2404 + 1254 4 8 2403 2402 668 671 2405 2404 1480 + 1482 + 1255 4 8 1480 1482 556 1484 2405 2404 554 + 2399 + 1256 4 8 2398 677 2402 671 2399 1484 2404 + 1482 + 1257 4 8 543 547 2407 2406 2408 2409 2411 + 2410 + 1258 4 8 2407 2406 668 1480 2411 2410 2031 + 2374 + 1259 4 8 2031 2374 694 697 2411 2410 2408 + 2409 + 1260 4 8 547 556 2406 1480 2409 697 2410 + 2374 + 1261 4 8 341 340 768 772 2412 2413 2415 + 2414 + 1262 4 8 768 772 593 771 2415 2414 2417 + 2416 + 1263 4 8 2417 2416 2267 2418 2415 2414 2412 + 2413 + 1264 4 8 340 342 772 771 2413 2418 2414 + 2416 + 1265 4 8 593 1254 1043 1253 596 2419 2421 + 2420 + 1266 4 8 1043 1253 188 1257 2421 2420 619 + 1299 + 1267 4 8 619 1299 602 1300 2421 2420 596 + 2419 + 1268 4 8 1254 1258 1253 1257 2419 1300 2420 + 1299 + 1269 4 8 2267 2422 2424 2423 2266 2425 2427 + 2426 + 1270 4 8 2424 2423 606 879 2427 2426 2429 + 2428 + 1271 4 8 2429 2428 510 2430 2427 2426 2266 + 2425 + 1272 4 8 2422 468 2423 879 2425 2430 2426 + 2428 + 1273 4 8 149 137 1454 1453 2144 2431 2148 + 2432 + 1274 4 8 1454 1453 856 1452 2148 2432 2147 + 2433 + 1275 4 8 2147 2433 467 2434 2148 2432 2144 + 2431 + 1276 4 8 137 136 1453 1452 2431 2434 2432 + 2433 + 1277 4 8 2210 2435 2437 2436 2438 2439 2441 + 2440 + 1278 4 8 2437 2436 1391 2442 2441 2440 2444 + 2443 + 1279 4 8 2444 2443 1508 2445 2441 2440 2438 + 2439 + 1280 4 8 2435 1897 2436 2442 2439 2445 2440 + 2443 + 1281 4 8 164 714 936 2446 719 713 1323 + 2447 + 1282 4 8 936 2446 943 1192 1323 2447 1199 + 1193 + 1283 4 8 1199 1193 681 680 1323 2447 719 + 713 + 1284 4 8 714 648 2446 1192 713 680 2447 + 1193 + 1285 4 8 648 680 679 678 636 1191 2449 + 2448 + 1286 4 8 679 678 677 676 2449 2448 1509 + 2132 + 1287 4 8 1509 2132 635 1196 2449 2448 636 + 1191 + 1288 4 8 680 681 678 676 1191 1196 2448 + 2132 + 1289 4 8 1133 2450 1243 2451 2452 2453 2455 + 2454 + 1290 4 8 1243 2451 237 1203 2455 2454 664 + 2456 + 1291 4 8 664 2456 667 715 2455 2454 2452 + 2453 + 1292 4 8 2450 648 2451 1203 2453 715 2454 + 2456 + 1293 4 8 667 664 721 2457 715 2456 718 + 2458 + 1294 4 8 721 2457 164 234 718 2458 714 + 2459 + 1295 4 8 714 2459 648 1203 718 2458 715 + 2456 + 1296 4 8 664 237 2457 234 2456 1203 2458 + 2459 + 1297 4 8 648 2450 679 2460 672 2461 675 + 2462 + 1298 4 8 679 2460 677 1896 675 2462 671 + 2057 + 1299 4 8 671 2057 668 1447 675 2462 672 + 2461 + 1300 4 8 2450 1133 2460 1896 2461 1447 2462 + 2057 + 1301 4 8 226 227 643 1200 229 228 2464 + 2463 + 1302 4 8 643 1200 648 1203 2464 2463 714 + 2459 + 1303 4 8 714 2459 164 234 2464 2463 229 + 228 + 1304 4 8 227 237 1200 1203 228 234 2463 + 2459 + 1305 4 8 647 1210 645 2465 639 1213 642 + 2466 + 1306 4 8 645 2465 226 2467 642 2466 638 + 2468 + 1307 4 8 638 2468 635 1209 642 2466 639 + 1213 + 1308 4 8 1210 1206 2465 2467 1213 1209 2466 + 2468 + 1309 4 8 647 639 646 640 2469 2470 2472 + 2471 + 1310 4 8 646 640 648 636 2472 2471 679 + 2449 + 1311 4 8 679 2449 677 1509 2472 2471 2469 + 2470 + 1312 4 8 639 635 640 636 2470 1509 2471 + 2449 + 1313 4 8 647 1216 1245 2473 1239 2474 1242 + 2475 + 1314 4 8 1245 2473 1133 1121 1242 2475 1128 + 1122 + 1315 4 8 1128 1122 150 1123 1242 2475 1239 + 2474 + 1316 4 8 1216 1120 2473 1121 2474 1123 2475 + 1122 + 1317 4 8 467 2476 2478 2477 465 2479 2481 + 2480 + 1318 4 8 2478 2477 1885 2482 2481 2480 2484 + 2483 + 1319 4 8 2484 2483 463 2485 2481 2480 465 + 2479 + 1320 4 8 2476 148 2477 2482 2479 2485 2480 + 2483 + 1321 4 8 148 140 147 141 2476 2486 2488 + 2487 + 1322 4 8 147 141 149 137 2488 2487 2144 + 2431 + 1323 4 8 2144 2431 467 2434 2488 2487 2476 + 2486 + 1324 4 8 140 136 141 137 2486 2434 2487 + 2431 + 1325 4 8 820 1685 1372 1985 1366 2489 1369 + 2490 + 1326 4 8 1372 1985 1143 1991 1369 2490 1145 + 2491 + 1327 4 8 1145 2491 496 1997 1369 2490 1366 + 2489 + 1328 4 8 1685 537 1985 1991 2489 1997 2490 + 2491 + 1329 4 8 2492 2493 2495 2494 2496 2497 2499 + 2498 + 1330 4 8 2495 2494 542 682 2499 2498 529 + 767 + 1331 4 8 529 767 528 764 2499 2498 2496 + 2497 + 1332 4 8 2493 342 2494 682 2497 764 2498 + 767 + 1333 4 8 2500 2501 2503 2502 2504 2505 2507 + 2506 + 1334 4 8 2503 2502 1508 2508 2507 2506 1496 + 2509 + 1335 4 8 1496 2509 935 2510 2507 2506 2504 + 2505 + 1336 4 8 2501 2236 2502 2508 2505 2510 2506 + 2509 + 1337 4 8 2258 2511 2513 2512 2259 2514 2516 + 2515 + 1338 4 8 2513 2512 856 1454 2516 2515 2153 + 2152 + 1339 4 8 2153 2152 510 2151 2516 2515 2259 + 2514 + 1340 4 8 2511 149 2512 1454 2514 2151 2515 + 2152 + 1341 4 8 820 2517 2519 2518 1685 2520 2522 + 2521 + 1342 4 8 2519 2518 2492 2523 2522 2521 2525 + 2524 + 1343 4 8 2525 2524 537 1018 2522 2521 1685 + 2520 + 1344 4 8 2517 442 2518 2523 2520 1018 2521 + 2524 + 1345 4 8 341 1038 339 2526 332 2527 335 + 2528 + 1346 4 8 339 2526 337 1745 335 2528 331 + 1740 + 1347 4 8 331 1740 328 1465 335 2528 332 + 2527 + 1348 4 8 1038 316 2526 1745 2527 1465 2528 + 1740 + 1349 4 8 1342 1346 1345 1349 2529 2530 2532 + 2531 + 1350 4 8 1345 1349 528 532 2532 2531 531 + 535 + 1351 4 8 531 535 537 539 2532 2531 2529 + 2530 + 1352 4 8 1346 541 1349 532 2530 539 2531 + 535 + 1353 4 8 2154 2166 2158 2533 2163 2167 2535 + 2534 + 1354 4 8 2158 2533 294 2175 2535 2534 450 + 2174 + 1355 4 8 450 2174 454 2171 2535 2534 2163 + 2167 + 1356 4 8 2166 527 2533 2175 2167 2171 2534 + 2174 + 1357 4 8 846 1622 2537 2536 1629 1625 2539 + 2538 + 1358 4 8 2537 2536 294 293 2539 2538 2541 + 2540 + 1359 4 8 2541 2540 1627 1621 2539 2538 1629 + 1625 + 1360 4 8 1622 295 2536 293 1625 1621 2538 + 2540 + 1361 4 8 984 2542 987 2543 1929 2544 2546 + 2545 + 1362 4 8 987 2543 993 1015 2546 2545 1468 + 2547 + 1363 4 8 1468 2547 1478 2548 2546 2545 1929 + 2544 + 1364 4 8 2542 870 2543 1015 2544 2548 2545 + 2547 + 1365 4 8 1643 2549 2551 2550 2552 2553 2555 + 2554 + 1366 4 8 2551 2550 1342 1343 2555 2554 1791 + 1793 + 1367 4 8 1791 1793 981 1789 2555 2554 2552 + 2553 + 1368 4 8 2549 607 2550 1343 2553 1789 2554 + 1793 + 1369 4 8 846 1471 1477 1472 1945 2556 1944 + 2557 + 1370 4 8 1477 1472 1478 1468 1944 2557 1929 + 2546 + 1371 4 8 1929 2546 984 987 1944 2557 1945 + 2556 + 1372 4 8 1471 993 1472 1468 2556 987 2557 + 2546 + 1373 4 8 635 639 1214 1215 1509 2470 1512 + 2558 + 1374 4 8 1214 1215 1120 1216 1512 2558 1394 + 2559 + 1375 4 8 1394 2559 677 2469 1512 2558 1509 + 2470 + 1376 4 8 639 647 1215 1216 2470 2469 2558 + 2559 + 1377 4 8 1391 1390 2228 2560 2119 2118 2224 + 2561 + 1378 4 8 2228 2560 552 2398 2224 2561 2115 + 2401 + 1379 4 8 2115 2401 1305 2122 2224 2561 2119 + 2118 + 1380 4 8 1390 677 2560 2398 2118 2122 2561 + 2401 + 1381 4 8 922 2562 923 2563 2564 2565 2567 + 2566 + 1382 4 8 923 2563 935 2125 2567 2566 2226 + 2227 + 1383 4 8 2226 2227 1391 2228 2567 2566 2564 + 2565 + 1384 4 8 2562 552 2563 2125 2565 2228 2566 + 2227 + 1385 4 8 922 923 2562 2563 1959 2568 2570 + 2569 + 1386 4 8 2562 2563 552 2125 2570 2569 551 + 2124 + 1387 4 8 551 2124 557 1913 2570 2569 1959 + 2568 + 1388 4 8 923 935 2563 2125 2568 1913 2569 + 2124 + 1389 4 8 922 926 2572 2571 923 927 2574 + 2573 + 1390 4 8 2572 2571 2210 2197 2574 2573 2576 + 2575 + 1391 4 8 2576 2575 935 933 2574 2573 923 + 927 + 1392 4 8 926 934 2571 2197 927 933 2573 + 2575 + 1393 4 8 935 2129 1498 2577 2226 2223 2579 + 2578 + 1394 4 8 1498 2577 635 1309 2579 2578 1514 + 2121 + 1395 4 8 1514 2121 1391 2119 2579 2578 2226 + 2223 + 1396 4 8 2129 1305 2577 1309 2223 2119 2578 + 2121 + 1397 4 8 1507 2580 2582 2581 1499 2583 2585 + 2584 + 1398 4 8 2582 2581 1713 2238 2585 2584 2587 + 2586 + 1399 4 8 2587 2586 935 2510 2585 2584 1499 + 2583 + 1400 4 8 2580 2236 2581 2238 2583 2510 2584 + 2586 + 1401 4 8 1508 2508 1506 2588 1496 2509 1500 + 2589 + 1402 4 8 1506 2588 1507 2580 1500 2589 1499 + 2583 + 1403 4 8 1499 2583 935 2510 1500 2589 1496 + 2509 + 1404 4 8 2508 2236 2588 2580 2509 2510 2589 + 2583 + 1405 4 8 1314 2104 1330 2105 2590 2591 2593 + 2592 + 1406 4 8 1330 2105 943 2106 2593 2592 1712 + 2594 + 1407 4 8 1712 2594 1713 2582 2593 2592 2590 + 2591 + 1408 4 8 2104 1507 2105 2106 2591 2582 2592 + 2594 + 1409 4 8 935 2129 1913 2128 1912 2595 1911 + 2596 + 1410 4 8 1913 2128 557 1976 1911 2596 1495 + 1977 + 1411 4 8 1495 1977 1314 1308 1911 2596 1912 + 2595 + 1412 4 8 2129 1305 2128 1976 2595 1308 2596 + 1977 + 1413 4 8 2597 2598 2600 2599 2601 2602 2604 + 2603 + 1414 4 8 2600 2599 1406 1641 2604 2603 2606 + 2605 + 1415 4 8 2606 2605 2608 2607 2604 2603 2601 + 2602 + 1416 4 8 2598 1206 2599 1641 2602 2607 2603 + 2605 + 1417 4 8 1914 2609 2611 2610 1918 2612 2614 + 2613 + 1418 4 8 2611 2610 1508 2508 2614 2613 2616 + 2615 + 1419 4 8 2616 2615 1927 2617 2614 2613 1918 + 2612 + 1420 4 8 2609 2236 2610 2508 2612 2617 2613 + 2615 + 1421 4 8 2618 2619 2621 2620 2622 2623 2625 + 2624 + 1422 4 8 2621 2620 1923 2626 2625 2624 1917 + 2627 + 1423 4 8 1917 2627 1914 2628 2625 2624 2622 + 2623 + 1424 4 8 2619 2608 2620 2626 2623 2628 2624 + 2627 + 1425 4 8 935 933 1496 2629 2504 2630 2507 + 2631 + 1426 4 8 1496 2629 1508 2632 2507 2631 2503 + 2633 + 1427 4 8 2503 2633 2500 2634 2507 2631 2504 + 2630 + 1428 4 8 933 934 2629 2632 2630 2634 2631 + 2633 + 1429 4 8 1897 2445 2636 2635 2637 2638 2640 + 2639 + 1430 4 8 2636 2635 1914 2611 2640 2639 2642 + 2641 + 1431 4 8 2642 2641 1523 1524 2640 2639 2637 + 2638 + 1432 4 8 2445 1508 2635 2611 2638 1524 2639 + 2641 + 1433 4 8 606 2025 2424 2643 594 2644 2646 + 2645 + 1434 4 8 2424 2643 2267 2647 2646 2645 2417 + 2648 + 1435 4 8 2417 2648 593 1254 2646 2645 594 + 2644 + 1436 4 8 2025 1258 2643 2647 2644 1254 2645 + 2648 + 1437 4 8 2492 2523 2650 2649 2651 2652 2654 + 2653 + 1438 4 8 2650 2649 468 2655 2654 2653 2657 + 2656 + 1439 4 8 2657 2656 847 848 2654 2653 2651 + 2652 + 1440 4 8 2523 442 2649 2655 2652 848 2653 + 2656 + 1441 4 8 856 2658 855 2659 2660 2661 2663 + 2662 + 1442 4 8 855 2659 442 2245 2663 2662 2655 + 2664 + 1443 4 8 2655 2664 468 2665 2663 2662 2660 + 2661 + 1444 4 8 2658 2246 2659 2245 2661 2665 2662 + 2664 + 1445 4 8 972 2666 1787 2667 973 2668 1784 + 2669 + 1446 4 8 1787 2667 607 1544 1784 2669 905 + 1547 + 1447 4 8 905 1547 568 1549 1784 2669 973 + 2668 + 1448 4 8 2666 213 2667 1544 2668 1549 2669 + 1547 + 1449 4 8 1342 1343 2671 2670 1345 1344 2673 + 2672 + 1450 4 8 2671 2670 337 608 2673 2672 1604 + 1781 + 1451 4 8 1604 1781 528 1350 2673 2672 1345 + 1344 + 1452 4 8 1343 607 2670 608 1344 1350 2672 + 1781 + 1453 4 8 528 532 1350 1351 762 2674 2676 + 2675 + 1454 4 8 1350 1351 607 915 2676 2675 907 + 914 + 1455 4 8 907 914 693 893 2676 2675 762 + 2674 + 1456 4 8 532 541 1351 915 2674 893 2675 + 914 + 1457 4 8 537 536 531 530 2525 2677 2679 + 2678 + 1458 4 8 531 530 528 529 2679 2678 2496 + 2499 + 1459 4 8 2496 2499 2492 2495 2679 2678 2525 + 2677 + 1460 4 8 536 542 530 529 2677 2495 2678 + 2499 + 1461 4 8 528 531 1612 2680 2681 2682 2684 + 2683 + 1462 4 8 1612 2680 442 1018 2684 2683 443 + 1017 + 1463 4 8 443 1017 454 800 2684 2683 2681 + 2682 + 1464 4 8 531 537 2680 1018 2682 800 2683 + 1017 + 1465 4 8 528 529 532 533 762 765 2674 + 2685 + 1466 4 8 532 533 541 540 2674 2685 893 + 1669 + 1467 4 8 893 1669 693 685 2674 2685 762 + 765 + 1468 4 8 529 542 533 540 765 685 2685 + 1669 + 1469 4 8 972 2323 2687 2686 2688 2689 2691 + 2690 + 1470 4 8 2687 2686 56 2692 2691 2690 2303 + 2693 + 1471 4 8 2303 2693 15 26 2691 2690 2688 + 2689 + 1472 4 8 2323 27 2686 2692 2689 26 2690 + 2693 + 1473 4 8 2694 2695 2697 2696 2698 2699 2701 + 2700 + 1474 4 8 2697 2696 2703 2702 2701 2700 2705 + 2704 + 1475 4 8 2705 2704 1654 2706 2701 2700 2698 + 2699 + 1476 4 8 2695 790 2696 2702 2699 2706 2700 + 2704 + 1477 4 8 790 793 2708 2707 794 797 2710 + 2709 + 1478 4 8 2708 2707 1342 2529 2710 2709 2712 + 2711 + 1479 4 8 2712 2711 454 800 2710 2709 794 + 797 + 1480 4 8 793 537 2707 2529 797 800 2709 + 2711 + 1481 4 8 981 980 1789 1785 1794 2713 1795 + 2714 + 1482 4 8 1789 1785 607 905 1795 2714 915 + 917 + 1483 4 8 915 917 541 896 1795 2714 1794 + 2713 + 1484 4 8 980 568 1785 905 2713 896 2714 + 917 + 1485 4 8 901 895 903 899 1534 1667 1537 + 2715 + 1486 4 8 903 899 568 896 1537 2715 950 + 2716 + 1487 4 8 950 2716 955 1668 1537 2715 1534 + 1667 + 1488 4 8 895 541 899 896 1667 1668 2715 + 2716 + 1489 4 8 706 695 2363 2366 1657 2717 2719 + 2718 + 1490 4 8 2363 2366 581 2362 2719 2718 2721 + 2720 + 1491 4 8 2721 2720 1654 1999 2719 2718 1657 + 2717 + 1492 4 8 695 694 2366 2362 2717 1999 2718 + 2720 + 1493 4 8 280 320 376 374 1571 1570 1597 + 2722 + 1494 4 8 376 374 100 91 1597 2722 349 + 1573 + 1495 4 8 349 1573 350 1572 1597 2722 1571 + 1570 + 1496 4 8 320 87 374 91 1570 1572 2722 + 1573 + 1497 4 8 51 1581 53 2723 1070 2215 2725 + 2724 + 1498 4 8 53 2723 55 2342 2725 2724 1425 + 2343 + 1499 4 8 1425 2343 262 2216 2725 2724 1070 + 2215 + 1500 4 8 1581 743 2723 2342 2215 2216 2724 + 2343 + 1501 4 8 57 2726 2728 2727 263 2729 2731 + 2730 + 1502 4 8 2728 2727 429 741 2731 2730 2733 + 2732 + 1503 4 8 2733 2732 262 2216 2731 2730 263 + 2729 + 1504 4 8 2726 743 2727 741 2729 2216 2730 + 2732 + 1505 4 8 294 292 2136 2734 293 291 2135 + 2735 + 1506 4 8 2136 2734 860 1154 2135 2735 1152 + 1153 + 1507 4 8 1152 1153 295 290 2135 2735 293 + 291 + 1508 4 8 292 149 2734 1154 291 290 2735 + 1153 + 1509 4 8 342 2493 1611 2736 764 2497 1610 + 2737 + 1510 4 8 1611 2736 442 2523 1610 2737 1612 + 2738 + 1511 4 8 1612 2738 528 2496 1610 2737 764 + 2497 + 1512 4 8 2493 2492 2736 2523 2497 2496 2737 + 2738 + 1513 4 8 847 851 2740 2739 848 852 2742 + 2741 + 1514 4 8 2740 2739 328 1467 2742 2741 446 + 2743 + 1515 4 8 446 2743 442 859 2742 2741 848 + 852 + 1516 4 8 851 860 2739 1467 852 859 2741 + 2743 + 1517 4 8 467 466 465 464 2744 2745 2747 + 2746 + 1518 4 8 465 464 463 462 2747 2746 2749 + 2748 + 1519 4 8 2749 2748 2246 2665 2747 2746 2744 + 2745 + 1520 4 8 466 468 464 462 2745 2665 2746 + 2748 + 1521 4 8 856 2660 2153 2750 2147 2751 2150 + 2752 + 1522 4 8 2153 2750 510 2430 2150 2752 2146 + 2753 + 1523 4 8 2146 2753 467 466 2150 2752 2147 + 2751 + 1524 4 8 2660 468 2750 2430 2751 466 2752 + 2753 + 1525 4 8 510 2287 2146 2754 2755 2756 2758 + 2757 + 1526 4 8 2146 2754 467 2476 2758 2757 458 + 2759 + 1527 4 8 458 2759 134 179 2758 2757 2755 + 2756 + 1528 4 8 2287 148 2754 2476 2756 179 2757 + 2759 + 1529 4 8 463 2760 877 2761 457 2762 874 + 2763 + 1530 4 8 877 2761 606 1710 874 2763 826 + 2764 + 1531 4 8 826 2764 134 2231 874 2763 457 + 2762 + 1532 4 8 2760 1713 2761 1710 2762 2231 2763 + 2764 + 1533 4 8 1927 1926 2766 2765 2616 2767 2769 + 2768 + 1534 4 8 2766 2765 2500 2770 2769 2768 2503 + 2771 + 1535 4 8 2503 2771 1508 2772 2769 2768 2616 + 2767 + 1536 4 8 1926 1928 2765 2770 2767 2772 2768 + 2771 + 1537 4 8 496 2241 1727 2773 517 2774 2776 + 2775 + 1538 4 8 1727 2773 802 2165 2776 2775 873 + 2169 + 1539 4 8 873 2169 527 2166 2776 2775 517 + 2774 + 1540 4 8 2241 2154 2773 2165 2774 2166 2775 + 2169 + 1541 4 8 394 498 1882 1883 499 497 2778 + 2777 + 1542 4 8 1882 1883 1885 1884 2778 2777 1891 + 1890 + 1543 4 8 1891 1890 500 495 2778 2777 499 + 497 + 1544 4 8 498 496 1883 1884 497 495 2777 + 1890 + 1545 4 8 342 692 764 763 610 2275 1783 + 2779 + 1546 4 8 764 763 528 762 1783 2779 1350 + 2676 + 1547 4 8 1350 2676 607 907 1783 2779 610 + 2275 + 1548 4 8 692 693 763 762 2275 907 2779 + 2676 + 1549 4 8 316 1148 314 2780 307 2299 310 + 2781 + 1550 4 8 314 2780 312 438 310 2781 306 + 2782 + 1551 4 8 306 2782 41 285 310 2781 307 + 2299 + 1552 4 8 1148 149 2780 438 2299 285 2781 + 2782 + 1553 4 8 341 1038 775 1033 339 2526 2784 + 2783 + 1554 4 8 775 1033 618 1032 2784 2783 617 + 2785 + 1555 4 8 617 2785 337 1745 2784 2783 339 + 2526 + 1556 4 8 1038 316 1033 1032 2526 1745 2783 + 2785 + 1557 4 8 454 2681 2787 2786 443 2684 2789 + 2788 + 1558 4 8 2787 2786 337 1604 2789 2788 1606 + 1607 + 1559 4 8 1606 1607 442 1612 2789 2788 443 + 2684 + 1560 4 8 2681 528 2786 1604 2684 1612 2788 + 1607 + 1561 4 8 442 446 1606 2790 443 447 2789 + 2791 + 1562 4 8 1606 2790 337 331 2789 2791 2787 + 2792 + 1563 4 8 2787 2792 454 453 2789 2791 443 + 447 + 1564 4 8 446 328 2790 331 447 453 2791 + 2792 + 1565 4 8 972 2666 2794 2793 1787 2667 2796 + 2795 + 1566 4 8 2794 2793 317 1408 2796 2795 2798 + 2797 + 1567 4 8 2798 2797 607 1544 2796 2795 1787 + 2667 + 1568 4 8 2666 213 2793 1408 2667 1544 2795 + 2797 + 1569 4 8 317 1415 2798 2799 1408 1409 2797 + 2800 + 1570 4 8 2798 2799 607 611 2797 2800 1544 + 1545 + 1571 4 8 1544 1545 213 1410 2797 2800 1408 + 1409 + 1572 4 8 1415 618 2799 611 1409 1410 2800 + 1545 + 1573 4 8 295 884 1461 1462 885 883 2802 + 2801 + 1574 4 8 1461 1462 328 1465 2802 2801 1741 + 1742 + 1575 4 8 1741 1742 317 315 2802 2801 885 + 883 + 1576 4 8 884 316 1462 1465 883 315 2801 + 1742 + 1577 4 8 1643 1647 1646 1650 2551 2803 2805 + 2804 + 1578 4 8 1646 1650 1627 1652 2805 2804 2807 + 2806 + 1579 4 8 2807 2806 1342 2671 2805 2804 2551 + 2803 + 1580 4 8 1647 337 1650 1652 2803 2671 2804 + 2806 + 1581 4 8 802 873 862 866 1727 2776 1725 + 2808 + 1582 4 8 862 866 861 865 1725 2808 1726 + 2809 + 1583 4 8 1726 2809 496 517 1725 2808 1727 + 2776 + 1584 4 8 873 527 866 865 2776 517 2808 + 2809 + 1585 4 8 1923 2810 2812 2811 1922 2813 2815 + 2814 + 1586 4 8 2812 2811 2205 2816 2815 2814 2818 + 2817 + 1587 4 8 2818 2817 1928 2819 2815 2814 1922 + 2813 + 1588 4 8 2810 1897 2811 2816 2813 2819 2814 + 2817 + 1589 4 8 2210 2197 2438 2820 2576 2575 2822 + 2821 + 1590 4 8 2438 2820 1508 2632 2822 2821 1496 + 2629 + 1591 4 8 1496 2629 935 933 2822 2821 2576 + 2575 + 1592 4 8 2197 934 2820 2632 2575 933 2821 + 2629 + 1593 4 8 993 1381 2176 2823 1471 2824 2826 + 2825 + 1594 4 8 2176 2823 294 2141 2826 2825 2537 + 2827 + 1595 4 8 2537 2827 846 1862 2826 2825 1471 + 2824 + 1596 4 8 1381 280 2823 2141 2824 1862 2825 + 2827 + 1597 4 8 398 1373 1013 1737 1016 1374 1014 + 2828 + 1598 4 8 1013 1737 870 872 1014 2828 1015 + 2829 + 1599 4 8 1015 2829 993 1379 1014 2828 1016 + 1374 + 1600 4 8 1373 527 1737 872 1374 1379 2828 + 2829 + 1601 4 8 294 2537 2541 2539 2176 2826 2831 + 2830 + 1602 4 8 2541 2539 1627 1629 2831 2830 2833 + 2832 + 1603 4 8 2833 2832 993 1471 2831 2830 2176 + 2826 + 1604 4 8 2537 846 2539 1629 2826 1471 2830 + 2832 + 1605 4 8 984 2834 1945 2835 2836 2837 2839 + 2838 + 1606 4 8 1945 2835 846 2840 2839 2838 1629 + 2841 + 1607 4 8 1629 2841 1627 1646 2839 2838 2836 + 2837 + 1608 4 8 2834 1643 2835 2840 2837 1646 2838 + 2841 + 1609 4 8 993 992 1379 2180 995 994 2843 + 2842 + 1610 4 8 1379 2180 527 2171 2843 2842 873 + 2170 + 1611 4 8 873 2170 802 801 2843 2842 995 + 994 + 1612 4 8 992 454 2180 2171 994 801 2842 + 2170 + 1613 4 8 993 995 1379 2843 1015 2844 2829 + 2845 + 1614 4 8 1379 2843 527 873 2829 2845 872 + 871 + 1615 4 8 872 871 870 869 2829 2845 1015 + 2844 + 1616 4 8 995 802 2843 873 2844 869 2845 + 871 + 1617 4 8 820 1366 2517 2846 1685 2489 2520 + 2847 + 1618 4 8 2517 2846 442 1992 2520 2847 1018 + 1995 + 1619 4 8 1018 1995 537 1997 2520 2847 1685 + 2489 + 1620 4 8 1366 496 2846 1992 2489 1997 2847 + 1995 + 1621 4 8 820 2848 2517 2849 2850 2851 2853 + 2852 + 1622 4 8 2517 2849 442 2655 2853 2852 2245 + 2664 + 1623 4 8 2245 2664 2246 2665 2853 2852 2850 + 2851 + 1624 4 8 2848 468 2849 2655 2851 2665 2852 + 2664 + 1625 4 8 820 2854 2018 2855 2848 2856 2858 + 2857 + 1626 4 8 2018 2855 606 877 2858 2857 879 + 878 + 1627 4 8 879 878 468 462 2858 2857 2848 + 2856 + 1628 4 8 2854 463 2855 877 2856 462 2857 + 878 + 1629 4 8 463 2760 2860 2859 877 2761 2862 + 2861 + 1630 4 8 2860 2859 824 2863 2862 2861 1234 + 2864 + 1631 4 8 1234 2864 606 1710 2862 2861 877 + 2761 + 1632 4 8 2760 1713 2859 2863 2761 1710 2861 + 2864 + 1633 4 8 510 2429 2755 2865 2430 2428 2867 + 2866 + 1634 4 8 2755 2865 134 826 2867 2866 455 + 875 + 1635 4 8 455 875 468 879 2867 2866 2430 + 2428 + 1636 4 8 2429 606 2865 826 2428 879 2866 + 875 + 1637 4 8 811 812 815 816 930 2868 2870 + 2869 + 1638 4 8 815 816 824 823 2870 2869 1907 + 1908 + 1639 4 8 1907 1908 935 1913 2870 2869 930 + 2868 + 1640 4 8 812 557 816 823 2868 1913 2869 + 1908 + 1641 4 8 1508 1506 2508 2588 1524 1525 2872 + 2871 + 1642 4 8 2508 2588 2236 2580 2872 2871 2874 + 2873 + 1643 4 8 2874 2873 1523 1526 2872 2871 1524 + 1525 + 1644 4 8 1506 1507 2588 2580 1525 1526 2871 + 2873 + 1645 4 8 635 1900 1503 2875 1514 2876 2878 + 2877 + 1646 4 8 1503 2875 1508 2445 2878 2877 2444 + 2443 + 1647 4 8 2444 2443 1391 2442 2878 2877 1514 + 2876 + 1648 4 8 1900 1897 2875 2445 2876 2442 2877 + 2443 + 1649 4 8 935 1912 2587 2879 1499 2880 2585 + 2881 + 1650 4 8 2587 2879 1713 2590 2585 2881 2582 + 2591 + 1651 4 8 2582 2591 1507 2104 2585 2881 1499 + 2880 + 1652 4 8 1912 1314 2879 2590 2880 2104 2881 + 2591 + 1653 4 8 935 2587 1912 2879 1907 2882 1910 + 2883 + 1654 4 8 1912 2879 1314 2590 1910 2883 1906 + 2884 + 1655 4 8 1906 2884 824 2863 1910 2883 1907 + 2882 + 1656 4 8 2587 1713 2879 2590 2882 2863 2883 + 2884 + 1657 4 8 1897 1898 2442 2885 1900 1899 2876 + 2886 + 1658 4 8 2442 2885 1391 1393 2876 2886 1514 + 1513 + 1659 4 8 1514 1513 635 1214 2876 2886 1900 + 1899 + 1660 4 8 1898 1120 2885 1393 1899 1214 2886 + 1513 + 1661 4 8 1523 1527 2637 2887 1524 1528 2638 + 2888 + 1662 4 8 2637 2887 1897 1900 2638 2888 2445 + 2875 + 1663 4 8 2445 2875 1508 1503 2638 2888 1524 + 1528 + 1664 4 8 1527 635 2887 1900 1528 1503 2888 + 2875 + 1665 4 8 1120 1123 2890 2889 2891 2892 2894 + 2893 + 1666 4 8 2890 2889 580 579 2894 2893 1485 + 1488 + 1667 4 8 1485 1488 110 151 2894 2893 2891 + 2892 + 1668 4 8 1123 150 2889 579 2892 151 2893 + 1488 + 1669 4 8 580 2890 1639 2895 1833 2896 1834 + 2897 + 1670 4 8 1639 2895 1206 1207 1834 2897 1210 + 1211 + 1671 4 8 1210 1211 647 1216 1834 2897 1833 + 2896 + 1672 4 8 2890 1120 2895 1207 2896 1216 2897 + 1211 + 1673 4 8 1110 1287 1176 2898 1185 2899 1188 + 2900 + 1674 4 8 1176 2898 1181 1680 1188 2900 1184 + 1774 + 1675 4 8 1184 1774 789 784 1188 2900 1185 + 2899 + 1676 4 8 1287 785 2898 1680 2899 784 2900 + 1774 + 1677 4 8 2181 2901 2184 2902 2903 2904 2906 + 2905 + 1678 4 8 2184 2902 42 2305 2906 2905 46 + 2308 + 1679 4 8 46 2308 55 724 2906 2905 2903 + 2904 + 1680 4 8 2901 15 2902 2305 2904 724 2905 + 2308 + 1681 4 8 42 45 2908 2907 46 49 2910 + 2909 + 1682 4 8 2908 2907 743 1581 2910 2909 2342 + 2723 + 1683 4 8 2342 2723 55 53 2910 2909 46 + 49 + 1684 4 8 45 51 2907 1581 49 53 2909 + 2723 + 1685 4 8 223 1163 2912 2911 630 2913 2915 + 2914 + 1686 4 8 2912 2911 1056 1101 2915 2914 1055 + 2086 + 1687 4 8 1055 2086 86 249 2915 2914 630 + 2913 + 1688 4 8 1163 250 2911 1101 2913 249 2914 + 2086 + 1689 4 8 223 1163 1162 1166 2912 2911 2917 + 2916 + 1690 4 8 1162 1166 785 1168 2917 2916 1290 + 1291 + 1691 4 8 1290 1291 1056 1101 2917 2916 2912 + 2911 + 1692 4 8 1163 250 1166 1168 2911 1101 2916 + 1291 + 1693 4 8 214 2311 2919 2918 2920 2921 2923 + 2922 + 1694 4 8 2919 2918 785 1290 2923 2922 1564 + 1848 + 1695 4 8 1564 1848 954 1849 2923 2922 2920 + 2921 + 1696 4 8 2311 1056 2918 1290 2921 1849 2922 + 1848 + 1697 4 8 214 2919 217 2924 558 2925 2927 + 2926 + 1698 4 8 217 2924 223 1162 2927 2926 1556 + 1557 + 1699 4 8 1556 1557 569 1551 2927 2926 558 + 2925 + 1700 4 8 2919 785 2924 1162 2925 1551 2926 + 1557 + 1701 4 8 955 953 2003 2928 950 951 2930 + 2929 + 1702 4 8 2003 2928 981 983 2930 2929 980 + 982 + 1703 4 8 980 982 568 952 2930 2929 950 + 951 + 1704 4 8 953 954 2928 983 951 952 2929 + 982 + 1705 4 8 955 950 2003 2930 1668 2716 2002 + 2931 + 1706 4 8 2003 2930 981 980 2002 2931 1794 + 2713 + 1707 4 8 1794 2713 541 896 2002 2931 1668 + 2716 + 1708 4 8 950 568 2930 980 2716 896 2931 + 2713 + 1709 4 8 955 1565 2003 2932 953 1563 2928 + 2933 + 1710 4 8 2003 2932 981 1681 2928 2933 983 + 1675 + 1711 4 8 983 1675 954 1564 2928 2933 953 + 1563 + 1712 4 8 1565 785 2932 1681 1563 1564 2933 + 1675 + 1713 4 8 955 944 1534 1535 1662 1671 1666 + 2934 + 1714 4 8 1534 1535 901 1218 1666 2934 1250 + 1251 + 1715 4 8 1250 1251 706 1252 1666 2934 1662 + 1671 + 1716 4 8 944 569 1535 1218 1671 1252 2934 + 1251 + 1717 4 8 984 1929 1932 1933 2542 2544 2936 + 2935 + 1718 4 8 1932 1933 1940 1939 2936 2935 2938 + 2937 + 1719 4 8 2938 2937 870 2548 2936 2935 2542 + 2544 + 1720 4 8 1929 1478 1933 1939 2544 2548 2935 + 2937 + 1721 4 8 1094 2939 1096 2940 2941 2942 2944 + 2943 + 1722 4 8 1096 2940 1098 2945 2944 2943 2947 + 2946 + 1723 4 8 2947 2946 1940 2938 2944 2943 2941 + 2942 + 1724 4 8 2939 870 2940 2945 2942 2938 2943 + 2946 + 1725 4 8 845 843 837 840 2349 2948 2350 + 2949 + 1726 4 8 837 840 15 29 2350 2949 36 + 30 + 1727 4 8 36 30 37 31 2350 2949 2349 + 2948 + 1728 4 8 843 28 840 29 2948 31 2949 + 30 + 1729 4 8 1754 2950 2952 2951 2953 2954 2956 + 2955 + 1730 4 8 2952 2951 28 1475 2956 2955 352 + 2957 + 1731 4 8 352 2957 350 2958 2956 2955 2953 + 2954 + 1732 4 8 2950 1478 2951 1475 2954 2958 2955 + 2957 + 1733 4 8 28 1596 352 1599 1470 2959 2961 + 2960 + 1734 4 8 352 1599 350 1571 2961 2960 1009 + 2172 + 1735 4 8 1009 2172 993 1381 2961 2960 1470 + 2959 + 1736 4 8 1596 280 1599 1571 2959 1381 2960 + 2172 + 1737 4 8 846 1862 841 1861 1471 2824 1474 + 2962 + 1738 4 8 841 1861 28 1596 1474 2962 1470 + 2959 + 1739 4 8 1470 2959 993 1381 1474 2962 1471 + 2824 + 1740 4 8 1862 280 1861 1596 2824 1381 2962 + 2959 + 1741 4 8 606 2025 601 2963 1234 2024 1228 + 2964 + 1742 4 8 601 2963 602 1300 1228 2964 1229 + 1355 + 1743 4 8 1229 1355 824 1352 1228 2964 1234 + 2024 + 1744 4 8 2025 1258 2963 1300 2024 1352 2964 + 1355 + 1745 4 8 1227 1246 1700 1703 1360 1696 2966 + 2965 + 1746 4 8 1700 1703 590 709 2966 2965 2968 + 2967 + 1747 4 8 2968 2967 542 1341 2966 2965 1360 + 1696 + 1748 4 8 1246 706 1703 709 1696 1341 2965 + 2967 + 1749 4 8 1227 1358 1700 2969 1714 2970 1715 + 2971 + 1750 4 8 1700 2969 590 1322 1715 2971 1489 + 2377 + 1751 4 8 1489 2377 1314 1906 1715 2971 1714 + 2970 + 1752 4 8 1358 824 2969 1322 2970 1906 2971 + 2377 + 1753 4 8 1227 1360 1700 2966 1358 1361 2969 + 2972 + 1754 4 8 1700 2966 590 2968 2969 2972 1322 + 2973 + 1755 4 8 1322 2973 824 1357 2969 2972 1358 + 1361 + 1756 4 8 1360 542 2966 2968 1361 1357 2972 + 2973 + 1757 4 8 51 1109 1112 1113 1106 1107 1587 + 2974 + 1758 4 8 1112 1113 1084 1119 1587 2974 1588 + 2975 + 1759 4 8 1588 2975 250 1108 1587 2974 1106 + 1107 + 1760 4 8 1109 1110 1113 1119 1107 1108 2974 + 2975 + 1761 4 8 101 2976 146 2977 2978 2979 2981 + 2980 + 1762 4 8 146 2977 148 2482 2981 2980 2983 + 2982 + 1763 4 8 2983 2982 2205 2984 2981 2980 2978 + 2979 + 1764 4 8 2976 1885 2977 2482 2979 2984 2980 + 2982 + 1765 4 8 2500 2985 2766 2986 2987 2988 2990 + 2989 + 1766 4 8 2766 2986 1927 2991 2990 2989 2993 + 2992 + 1767 4 8 2993 2992 187 186 2990 2989 2987 + 2988 + 1768 4 8 2985 148 2986 2991 2988 186 2989 + 2992 + 1769 4 8 294 2136 292 2734 1455 2994 1458 + 2995 + 1770 4 8 292 2734 149 1154 1458 2995 1454 + 2996 + 1771 4 8 1454 2996 856 858 1458 2995 1455 + 2994 + 1772 4 8 2136 860 2734 1154 2994 858 2995 + 2996 + 1773 4 8 922 923 1959 2568 925 924 2998 + 2997 + 1774 4 8 1959 2568 557 1913 2998 2997 812 + 2868 + 1775 4 8 812 2868 811 930 2998 2997 925 + 924 + 1776 4 8 923 935 2568 1913 924 930 2997 + 2868 + 1777 4 8 811 932 930 931 2999 3000 3002 + 3001 + 1778 4 8 930 931 935 933 3002 3001 2504 + 2630 + 1779 4 8 2504 2630 2500 2634 3002 3001 2999 + 3000 + 1780 4 8 932 934 931 933 3000 2634 3001 + 2630 + 1781 4 8 2608 2626 2628 2627 3003 3004 3006 + 3005 + 1782 4 8 2628 2627 1914 1917 3006 3005 2636 + 3007 + 1783 4 8 2636 3007 1897 2810 3006 3005 3003 + 3004 + 1784 4 8 2626 1923 2627 1917 3004 2810 3005 + 3007 + 1785 4 8 1110 2087 1102 3008 1109 2090 1103 + 3009 + 1786 4 8 1102 3008 1056 3010 1103 3009 1099 + 3011 + 1787 4 8 1099 3011 51 50 1103 3009 1109 + 2090 + 1788 4 8 2087 56 3008 3010 2090 50 3009 + 3011 + 1789 4 8 943 1328 1236 3012 1230 3013 1233 + 3014 + 1790 4 8 1236 3012 824 1358 1233 3014 1229 + 1359 + 1791 4 8 1229 1359 602 1266 1233 3014 1230 + 3013 + 1792 4 8 1328 1227 3012 1358 3013 1266 3014 + 1359 + 1793 4 8 1713 2590 2863 2884 1712 2593 3016 + 3015 + 1794 4 8 2863 2884 824 1906 3016 3015 1236 + 3017 + 1795 4 8 1236 3017 943 1330 3016 3015 1712 + 2593 + 1796 4 8 2590 1314 2884 1906 2593 1330 3015 + 3017 + 1797 4 8 943 1712 1237 1711 1236 3016 1235 + 3018 + 1798 4 8 1237 1711 606 1710 1235 3018 1234 + 2864 + 1799 4 8 1234 2864 824 2863 1235 3018 1236 + 3016 + 1800 4 8 1712 1713 1711 1710 3016 2863 3018 + 2864 + 1801 4 8 72 3019 1031 3020 75 3021 1030 + 3022 + 1802 4 8 1031 3020 176 1613 1030 3022 761 + 1614 + 1803 4 8 761 1614 81 1615 1030 3022 75 + 3021 + 1804 4 8 3019 200 3020 1613 3021 1615 3022 + 1614 + 1805 4 8 1 3023 745 3024 4 3025 744 + 3026 + 1806 4 8 745 3024 86 80 744 3026 748 + 3027 + 1807 4 8 748 3027 10 754 744 3026 4 + 3025 + 1808 4 8 3023 81 3024 80 3025 754 3026 + 3027 + 1809 4 8 2061 3028 3030 3029 3031 3032 3034 + 3033 + 1810 4 8 3030 3029 789 962 3034 3033 3036 + 3035 + 1811 4 8 3036 3035 2703 3037 3034 3033 3031 + 3032 + 1812 4 8 3028 971 3029 962 3032 3037 3033 + 3035 + 1813 4 8 1654 3038 1655 3039 1658 3040 1659 + 3041 + 1814 4 8 1655 3039 955 2003 1659 3041 1565 + 2932 + 1815 4 8 1565 2932 785 1681 1659 3041 1658 + 3040 + 1816 4 8 3038 981 3039 2003 3040 1681 3041 + 2932 + 1817 4 8 2703 3042 3044 3043 3036 3045 3047 + 3046 + 1818 4 8 3044 3043 967 2079 3047 3046 961 + 2078 + 1819 4 8 961 2078 789 2077 3047 3046 3036 + 3045 + 1820 4 8 3042 2080 3043 2079 3045 2077 3046 + 2078 + 1821 4 8 785 1287 1680 2898 1564 1845 1677 + 3048 + 1822 4 8 1680 2898 1181 1176 1677 3048 1674 + 3049 + 1823 4 8 1674 3049 954 1844 1677 3048 1564 + 1845 + 1824 4 8 1287 1110 2898 1176 1845 1844 3048 + 3049 + 1825 4 8 790 2010 2708 3050 793 2013 2707 + 3051 + 1826 4 8 2708 3050 1342 1346 2707 3051 2529 + 2530 + 1827 4 8 2529 2530 537 539 2707 3051 793 + 2013 + 1828 4 8 2010 541 3050 1346 2013 539 3051 + 2530 + 1829 4 8 790 2706 2009 3052 2004 3053 2007 + 3054 + 1830 4 8 2009 3052 981 3038 2007 3054 2003 + 3039 + 1831 4 8 2003 3039 955 1655 2007 3054 2004 + 3053 + 1832 4 8 2706 1654 3052 3038 3053 1655 3054 + 3039 + 1833 4 8 785 779 1552 2369 1658 1998 1661 + 3055 + 1834 4 8 1552 2369 706 695 1661 3055 1657 + 2717 + 1835 4 8 1657 2717 1654 1999 1661 3055 1658 + 1998 + 1836 4 8 779 694 2369 695 1998 1999 3055 + 2717 + 1837 4 8 200 203 3019 3056 1613 3057 3020 + 3058 + 1838 4 8 3019 3056 72 2317 3020 3058 1031 + 2316 + 1839 4 8 1031 2316 176 657 3020 3058 1613 + 3057 + 1840 4 8 203 209 3056 2317 3057 657 3058 + 2316 + 1841 4 8 954 3059 3061 3060 2920 3062 3064 + 3063 + 1842 4 8 3061 3060 209 3065 3064 3063 656 + 3066 + 1843 4 8 656 3066 214 3067 3064 3063 2920 + 3062 + 1844 4 8 3059 3068 3060 3065 3062 3067 3063 + 3066 + 1845 4 8 214 560 656 919 2920 3069 3064 + 3070 + 1846 4 8 656 919 209 918 3064 3070 3061 + 3071 + 1847 4 8 3061 3071 954 952 3064 3070 2920 + 3069 + 1848 4 8 560 568 919 918 3069 952 3070 + 3071 + 1849 4 8 214 2311 217 3072 2919 2918 2924 + 3073 + 1850 4 8 217 3072 223 2912 2924 3073 1162 + 2917 + 1851 4 8 1162 2917 785 1290 2924 3073 2919 + 2918 + 1852 4 8 2311 1056 3072 2912 2918 1290 3073 + 2917 + 1853 4 8 785 2919 1564 2923 1551 2925 1562 + 3074 + 1854 4 8 1564 2923 954 2920 1562 3074 946 + 3075 + 1855 4 8 946 3075 569 558 1562 3074 1551 + 2925 + 1856 4 8 2919 214 2923 2920 2925 558 3074 + 3075 + 1857 4 8 954 2920 952 3069 946 3075 949 + 3076 + 1858 4 8 952 3069 568 560 949 3076 567 + 561 + 1859 4 8 567 561 569 558 949 3076 946 + 3075 + 1860 4 8 2920 214 3069 560 3075 558 3076 + 561 + 1861 4 8 1 5 1429 1430 2219 2300 2222 + 3077 + 1862 4 8 1429 1430 51 1071 2222 3077 53 + 3078 + 1863 4 8 53 3078 55 728 2222 3077 2219 + 2300 + 1864 4 8 5 14 1430 1071 2300 728 3077 + 3078 + 1865 4 8 1 1049 1429 3079 745 1050 1432 + 3080 + 1866 4 8 1429 3079 51 1099 1432 3080 1434 + 2084 + 1867 4 8 1434 2084 86 1055 1432 3080 745 + 1050 + 1868 4 8 1049 1056 3079 1099 1050 1055 3080 + 2084 + 1869 4 8 922 2564 2572 3081 3082 3083 3085 + 3084 + 1870 4 8 2572 3081 2210 2437 3085 3084 2208 + 3086 + 1871 4 8 2208 3086 2209 3087 3085 3084 3082 + 3083 + 1872 4 8 2564 1391 3081 2437 3083 3087 3084 + 3086 + 1873 4 8 1631 3088 3090 3089 3091 3092 3094 + 3093 + 1874 4 8 3090 3089 2205 3095 3094 3093 2207 + 3096 + 1875 4 8 2207 3096 2209 3097 3094 3093 3091 + 3092 + 1876 4 8 3088 110 3089 3095 3092 3097 3093 + 3096 + 1877 4 8 2205 2978 3095 3098 3099 3100 3102 + 3101 + 1878 4 8 3095 3098 110 104 3102 3101 3104 + 3103 + 1879 4 8 3104 3103 2288 2289 3102 3101 3099 + 3100 + 1880 4 8 2978 101 3098 104 3100 2289 3101 + 3103 + 1881 4 8 922 2564 3082 3083 2562 2565 3106 + 3105 + 1882 4 8 3082 3083 2209 3087 3106 3105 3108 + 3107 + 1883 4 8 3108 3107 552 2228 3106 3105 2562 + 2565 + 1884 4 8 2564 1391 3083 3087 2565 2228 3105 + 3107 + 1885 4 8 984 988 987 991 2542 3109 2543 + 3110 + 1886 4 8 987 991 993 995 2543 3110 1015 + 2844 + 1887 4 8 1015 2844 870 869 2543 3110 2542 + 3109 + 1888 4 8 988 802 991 995 3109 869 3110 + 2844 + 1889 4 8 706 1657 2014 3111 1662 1656 3113 + 3112 + 1890 4 8 2014 3111 790 2706 3113 3112 2004 + 3053 + 1891 4 8 2004 3053 955 1655 3113 3112 1662 + 1656 + 1892 4 8 1657 1654 3111 2706 1656 1655 3112 + 3053 + 1893 4 8 2703 3042 3036 3045 2705 3114 3116 + 3115 + 1894 4 8 3036 3045 789 2077 3116 3115 1770 + 3117 + 1895 4 8 1770 3117 1654 3118 3116 3115 2705 + 3114 + 1896 4 8 3042 2080 3045 2077 3114 3118 3115 + 3117 + 1897 4 8 954 983 1850 1851 1674 1673 3120 + 3119 + 1898 4 8 1850 1851 1180 1854 3120 3119 1179 + 3121 + 1899 4 8 1179 3121 1181 1678 3120 3119 1674 + 1673 + 1900 4 8 983 981 1851 1854 1673 1678 3119 + 3121 + 1901 4 8 37 1768 1757 3122 1747 3123 1750 + 3124 + 1902 4 8 1757 3122 1098 1097 1750 3124 1096 + 1095 + 1903 4 8 1096 1095 1094 1093 1750 3124 1747 + 3123 + 1904 4 8 1768 66 3122 1097 3123 1093 3124 + 1095 + 1905 4 8 1940 2938 1939 2937 3125 3126 3128 + 3127 + 1906 4 8 1939 2937 1478 2548 3128 3127 2958 + 3129 + 1907 4 8 2958 3129 350 1008 3128 3127 3125 + 3126 + 1908 4 8 2938 870 2937 2548 3126 1008 3127 + 3129 + 1909 4 8 1094 3130 1747 3131 1093 3132 3123 + 3133 + 1910 4 8 1747 3131 37 345 3123 3133 1768 + 1766 + 1911 4 8 1768 1766 66 1577 3123 3133 1093 + 3132 + 1912 4 8 3130 350 3131 345 3132 1577 3133 + 1766 + 1913 4 8 28 31 843 2948 2952 3134 3136 + 3135 + 1914 4 8 843 2948 845 2349 3136 3135 3138 + 3137 + 1915 4 8 3138 3137 1754 1753 3136 3135 2952 + 3134 + 1916 4 8 31 37 2948 2349 3134 1753 3135 + 3137 + 1917 4 8 87 1572 382 3139 88 1576 381 + 3140 + 1918 4 8 382 3139 384 3141 381 3140 383 + 3142 + 1919 4 8 383 3142 66 1577 381 3140 88 + 1576 + 1920 4 8 1572 350 3139 3141 1576 1577 3140 + 3142 + 1921 4 8 350 1006 1572 1567 3141 3143 3139 + 3144 + 1922 4 8 1572 1567 87 397 3139 3144 382 + 3145 + 1923 4 8 382 3145 384 1005 3139 3144 3141 + 3143 + 1924 4 8 1006 398 1567 397 3143 1005 3144 + 3145 + 1925 4 8 2267 2418 2647 3146 3147 3148 3150 + 3149 + 1926 4 8 2647 3146 1258 1260 3150 3149 3152 + 3151 + 1927 4 8 3152 3151 2492 2493 3150 3149 3147 + 3148 + 1928 4 8 2418 342 3146 1260 3148 2493 3149 + 3151 + 1929 4 8 811 1521 814 3153 812 1522 813 + 3154 + 1930 4 8 814 3153 820 1366 813 3154 819 + 1367 + 1931 4 8 819 1367 557 1364 813 3154 812 + 1522 + 1932 4 8 1521 496 3153 1366 1522 1364 3154 + 1367 + 1933 4 8 820 1366 2850 3155 2517 2846 2853 + 3156 + 1934 4 8 2850 3155 2246 2248 2853 3156 2245 + 2247 + 1935 4 8 2245 2247 442 1992 2853 3156 2517 + 2846 + 1936 4 8 1366 496 3155 2248 2846 1992 3156 + 2247 + 1937 4 8 463 462 2854 2856 2749 2748 3158 + 3157 + 1938 4 8 2854 2856 820 2848 3158 3157 2850 + 2851 + 1939 4 8 2850 2851 2246 2665 3158 3157 2749 + 2748 + 1940 4 8 462 468 2856 2848 2748 2665 3157 + 2851 + 1941 4 8 1143 1370 1990 3159 1372 1371 1987 + 3160 + 1942 4 8 1990 3159 581 585 1987 3160 1984 + 3161 + 1943 4 8 1984 3161 820 819 1987 3160 1372 + 1371 + 1944 4 8 1370 557 3159 585 1371 819 3160 + 3161 + 1945 4 8 2492 2523 2496 2738 2525 2524 2679 + 3162 + 1946 4 8 2496 2738 528 1612 2679 3162 531 + 2680 + 1947 4 8 531 2680 537 1018 2679 3162 2525 + 2524 + 1948 4 8 2523 442 2738 1612 2524 1018 3162 + 2680 + 1949 4 8 2492 2519 2495 3163 3152 3164 3166 + 3165 + 1950 4 8 2495 3163 542 1682 3166 3165 1296 + 2026 + 1951 4 8 1296 2026 1258 2020 3166 3165 3152 + 3164 + 1952 4 8 2519 820 3163 1682 3164 2020 3165 + 2026 + 1953 4 8 847 3167 3169 3168 2651 3170 3172 + 3171 + 1954 4 8 3169 3168 2267 2418 3172 3171 3147 + 3148 + 1955 4 8 3147 3148 2492 2493 3172 3171 2651 + 3170 + 1956 4 8 3167 342 3168 2418 3170 2493 3171 + 3148 + 1957 4 8 820 822 1318 1320 1682 2028 3174 + 3173 + 1958 4 8 1318 1320 590 1322 3174 3173 2968 + 2973 + 1959 4 8 2968 2973 542 1357 3174 3173 1682 + 2028 + 1960 4 8 822 824 1320 1322 2028 1357 3173 + 2973 + 1961 4 8 238 239 1064 1448 2211 3175 2212 + 3176 + 1962 4 8 1064 1448 51 1106 2212 3176 1581 + 1584 + 1963 4 8 1581 1584 743 742 2212 3176 2211 + 3175 + 1964 4 8 239 250 1448 1106 3175 742 3176 + 1584 + 1965 4 8 150 570 658 659 1128 1238 3178 + 3177 + 1966 4 8 658 659 667 664 3178 3177 2452 + 2455 + 1967 4 8 2452 2455 1133 1243 3178 3177 1128 + 1238 + 1968 4 8 570 237 659 664 1238 1243 3177 + 2455 + 1969 4 8 967 961 2073 2076 3179 3180 3182 + 3181 + 1970 4 8 2073 2076 668 2072 3182 3181 2029 + 2388 + 1971 4 8 2029 2388 667 788 3182 3181 3179 + 3180 + 1972 4 8 961 789 2076 2072 3180 788 3181 + 2388 + 1973 4 8 2080 3183 2070 3184 2077 3185 2071 + 3186 + 1974 4 8 2070 3184 668 2031 2071 3186 2072 + 2387 + 1975 4 8 2072 2387 789 777 2071 3186 2077 + 3185 + 1976 4 8 3183 694 3184 2031 3185 777 3186 + 2387 + 1977 4 8 2080 2077 3118 3117 3183 3185 3188 + 3187 + 1978 4 8 3118 3117 1654 1770 3188 3187 1999 + 2001 + 1979 4 8 1999 2001 694 777 3188 3187 3183 + 3185 + 1980 4 8 2077 789 3117 1770 3185 777 3187 + 2001 + 1981 4 8 2390 2393 3190 3189 3191 3192 3194 + 3193 + 1982 4 8 3190 3189 1382 1444 3194 3193 1440 + 1439 + 1983 4 8 1440 1439 1132 1438 3194 3193 3191 + 3192 + 1984 4 8 2393 668 3189 1444 3192 1438 3193 + 1439 + 1985 4 8 581 2721 2362 2720 3195 3196 3198 + 3197 + 1986 4 8 2362 2720 694 1999 3198 3197 3183 + 3188 + 1987 4 8 3183 3188 2080 3118 3198 3197 3195 + 3196 + 1988 4 8 2721 1654 2720 1999 3196 3118 3197 + 3188 + 1989 4 8 543 547 546 550 2407 2406 3200 + 3199 + 1990 4 8 546 550 552 554 3200 3199 2403 + 2405 + 1991 4 8 2403 2405 668 1480 3200 3199 2407 + 2406 + 1992 4 8 547 556 550 554 2406 1480 3199 + 2405 + 1993 4 8 3201 3202 3204 3203 3205 3206 3208 + 3207 + 1994 4 8 3204 3203 984 988 3208 3207 2542 + 3109 + 1995 4 8 2542 3109 870 869 3208 3207 3205 + 3206 + 1996 4 8 3202 802 3203 988 3206 869 3207 + 3109 + 1997 4 8 789 962 3030 3029 1182 1802 3210 + 3209 + 1998 4 8 3030 3029 2061 3028 3210 3209 2065 + 3211 + 1999 4 8 2065 3211 1084 1083 3210 3209 1182 + 1802 + 2000 4 8 962 971 3029 3028 1802 1083 3209 + 3211 + 2001 4 8 581 582 3213 3212 2362 2361 3215 + 3214 + 2002 4 8 3213 3212 543 547 3215 3214 2408 + 2409 + 2003 4 8 2408 2409 694 697 3215 3214 2362 + 2361 + 2004 4 8 582 556 3212 547 2361 697 3214 + 2409 + 2005 4 8 237 3216 236 3217 1842 3218 2096 + 3219 + 2006 4 8 236 3217 85 3220 2096 3219 2093 + 3221 + 2007 4 8 2093 3221 1832 3222 2096 3219 1842 + 3218 + 2008 4 8 3216 1407 3217 3220 3218 3222 3219 + 3221 + 2009 4 8 226 638 3224 3223 940 3225 3227 + 3226 + 2010 4 8 3224 3223 1507 1505 3227 3226 2106 + 2109 + 2011 4 8 2106 2109 943 1198 3227 3226 940 + 3225 + 2012 4 8 638 635 3223 1505 3225 1198 3226 + 2109 + 2013 4 8 834 1704 1706 1707 3228 3229 3231 + 3230 + 2014 4 8 1706 1707 943 1712 3231 3230 2106 + 2594 + 2015 4 8 2106 2594 1507 2582 3231 3230 3228 + 3229 + 2016 4 8 1704 1713 1707 1712 3229 2582 3230 + 2594 + 2017 4 8 1523 3232 2637 3233 3234 3235 3237 + 3236 + 2018 4 8 2637 3233 1897 3003 3237 3236 1901 + 3238 + 2019 4 8 1901 3238 1206 2607 3237 3236 3234 + 3235 + 2020 4 8 3232 2608 3233 3003 3235 2607 3236 + 3238 + 2021 4 8 1507 2582 2580 2581 3228 3229 3240 + 3239 + 2022 4 8 2580 2581 2236 2238 3240 3239 2235 + 2237 + 2023 4 8 2235 2237 834 1704 3240 3239 3228 + 3229 + 2024 4 8 2582 1713 2581 2238 3229 1704 3239 + 2237 + 2025 4 8 1523 3234 2637 3237 1527 3241 2887 + 3242 + 2026 4 8 2637 3237 1897 1901 2887 3242 1900 + 1904 + 2027 4 8 1900 1904 635 1209 2887 3242 1527 + 3241 + 2028 4 8 3234 1206 3237 1901 3241 1209 3242 + 1904 + 2029 4 8 1080 3243 3245 3244 3246 3247 3249 + 3248 + 2030 4 8 3245 3244 743 2908 3249 3248 2342 + 2910 + 2031 4 8 2342 2910 55 46 3249 3248 3246 + 3247 + 2032 4 8 3243 42 3244 2908 3247 46 3248 + 2910 + 2033 4 8 789 959 962 963 1798 3250 1801 + 3251 + 2034 4 8 962 963 971 970 1801 3251 1797 + 1966 + 2035 4 8 1797 1966 250 427 1801 3251 1798 + 3250 + 2036 4 8 959 425 963 970 3250 427 3251 + 1966 + 2037 4 8 834 3252 2235 3253 3228 3254 3240 + 3255 + 2038 4 8 2235 3253 2236 2874 3240 3255 2580 + 2873 + 2039 4 8 2580 2873 1507 1526 3240 3255 3228 + 3254 + 2040 4 8 3252 1523 3253 2874 3254 1526 3255 + 2873 + 2041 4 8 199 198 354 1693 2098 2113 2097 + 3256 + 2042 4 8 354 1693 130 167 2097 3256 942 + 938 + 2043 4 8 942 938 943 936 2097 3256 2098 + 2113 + 2044 4 8 198 164 1693 167 2113 936 3256 + 938 + 2045 4 8 199 356 354 355 197 511 1692 + 3257 + 2046 4 8 354 355 130 300 1692 3257 172 + 3258 + 2047 4 8 172 3258 176 514 1692 3257 197 + 511 + 2048 4 8 356 296 355 300 511 514 3257 + 3258 + 2049 4 8 943 2098 1237 2384 1706 2101 1709 + 3259 + 2050 4 8 1237 2384 606 605 1709 3259 827 + 828 + 2051 4 8 827 828 834 833 1709 3259 1706 + 2101 + 2052 4 8 2098 199 2384 605 2101 833 3259 + 828 + 2053 4 8 1382 1446 1386 1894 1440 1443 3261 + 3260 + 2054 4 8 1386 1894 1120 1121 3261 3260 1124 + 1125 + 2055 4 8 1124 1125 1132 1131 3261 3260 1440 + 1443 + 2056 4 8 1446 1133 1894 1121 1443 1131 3260 + 1125 + 2057 4 8 1382 1444 3263 3262 1383 2056 3265 + 3264 + 2058 4 8 3263 3262 552 2403 3265 3264 2398 + 2402 + 2059 4 8 2398 2402 677 671 3265 3264 1383 + 2056 + 2060 4 8 1444 668 3262 2403 2056 671 3264 + 2402 + 2061 4 8 1382 3263 1385 3266 1383 3265 1384 + 3267 + 2062 4 8 1385 3266 1391 2228 1384 3267 1390 + 2560 + 2063 4 8 1390 2560 677 2398 1384 3267 1383 + 3265 + 2064 4 8 3263 552 3266 2228 3265 2398 3267 + 2560 + 2065 4 8 581 585 3213 3268 582 586 3212 + 3269 + 2066 4 8 3213 3268 543 544 3212 3269 547 + 548 + 2067 4 8 547 548 556 555 3212 3269 582 + 586 + 2068 4 8 585 557 3268 544 586 555 3269 + 548 + 2069 4 8 543 2407 3271 3270 2408 2411 3273 + 3272 + 2070 4 8 3271 3270 2080 2070 3273 3272 3183 + 3184 + 2071 4 8 3183 3184 694 2031 3273 3272 2408 + 2411 + 2072 4 8 2407 668 3270 2070 2411 2031 3272 + 3184 + 2073 4 8 3201 3274 3276 3275 3277 3278 3280 + 3279 + 2074 4 8 3276 3275 2080 3271 3280 3279 3195 + 3281 + 2075 4 8 3195 3281 581 3213 3280 3279 3277 + 3278 + 2076 4 8 3274 543 3275 3271 3278 3213 3279 + 3281 + 2077 4 8 384 996 3283 3282 3284 3285 3287 + 3286 + 2078 4 8 3283 3282 1765 3288 3287 3286 3290 + 3289 + 2079 4 8 3290 3289 870 864 3287 3286 3284 + 3285 + 2080 4 8 996 861 3282 3288 3285 864 3286 + 3289 + 2081 4 8 406 1863 410 1866 3291 3292 3294 + 3293 + 2082 4 8 410 1866 110 1873 3294 3293 3296 + 3295 + 2083 4 8 3296 3295 1132 1440 3294 3293 3291 + 3292 + 2084 4 8 1863 1382 1866 1873 3292 1440 3293 + 3295 + 2085 4 8 668 2407 2070 3270 1444 3297 3299 + 3298 + 2086 4 8 2070 3270 2080 3271 3299 3298 3301 + 3300 + 2087 4 8 3301 3300 1382 3302 3299 3298 1444 + 3297 + 2088 4 8 2407 543 3270 3271 3297 3302 3298 + 3300 + 2089 4 8 3303 3304 3306 3305 3307 3308 3310 + 3309 + 2090 4 8 3306 3305 1098 1089 3310 3309 1097 + 1090 + 2091 4 8 1097 1090 66 1086 3310 3309 3307 + 3308 + 2092 4 8 3304 1085 3305 1089 3308 1086 3309 + 1090 + 2093 4 8 2267 2418 2417 2416 2647 3146 2648 + 3311 + 2094 4 8 2417 2416 593 771 2648 3311 1254 + 1256 + 2095 4 8 1254 1256 1258 1260 2648 3311 2647 + 3146 + 2096 4 8 2418 342 2416 771 3146 1260 3311 + 1256 + 2097 4 8 317 1415 1653 3312 2798 2799 3314 + 3313 + 2098 4 8 1653 3312 337 617 3314 3313 608 + 612 + 2099 4 8 608 612 607 611 3314 3313 2798 + 2799 + 2100 4 8 1415 618 3312 617 2799 611 3313 + 612 + 2101 4 8 2209 3091 3316 3315 2207 3094 3318 + 3317 + 2102 4 8 3316 3315 1897 3319 3318 3317 2816 + 3320 + 2103 4 8 2816 3320 2205 3090 3318 3317 2207 + 3094 + 2104 4 8 3091 1631 3315 3319 3094 3090 3317 + 3320 + 2105 4 8 1631 3319 1634 3321 3322 3323 3325 + 3324 + 2106 4 8 1634 3321 1206 1901 3325 3324 1207 + 1902 + 2107 4 8 1207 1902 1120 1898 3325 3324 3322 + 3323 + 2108 4 8 3319 1897 3321 1901 3323 1898 3324 + 1902 + 2109 4 8 1885 2976 3327 3326 2984 2979 3329 + 3328 + 2110 4 8 3327 3326 1728 1731 3329 3328 3331 + 3330 + 2111 4 8 3331 3330 2205 2978 3329 3328 2984 + 2979 + 2112 4 8 2976 101 3326 1731 2979 2978 3328 + 3330 + 2113 4 8 226 3332 3334 3333 3335 3336 3338 + 3337 + 2114 4 8 3334 3333 2597 3339 3338 3337 3341 + 3340 + 2115 4 8 3341 3340 803 3342 3338 3337 3335 + 3336 + 2116 4 8 3332 1523 3333 3339 3336 3342 3337 + 3340 + 2117 4 8 1507 3224 2106 3227 3228 3343 3231 + 3344 + 2118 4 8 2106 3227 943 940 3231 3344 1706 + 3345 + 2119 4 8 1706 3345 834 3346 3231 3344 3228 + 3343 + 2120 4 8 3224 226 3227 940 3343 3346 3344 + 3345 + 2121 4 8 1206 1209 3234 3241 2467 2468 3348 + 3347 + 2122 4 8 3234 3241 1523 1527 3348 3347 3332 + 3349 + 2123 4 8 3332 3349 226 638 3348 3347 2467 + 2468 + 2124 4 8 1209 635 3241 1527 2468 638 3347 + 3349 + 2125 4 8 803 3350 3341 3351 3335 3352 3338 + 3353 + 2126 4 8 3341 3351 2597 3354 3338 3353 3334 + 3355 + 2127 4 8 3334 3355 226 634 3338 3353 3335 + 3352 + 2128 4 8 3350 130 3351 3354 3352 634 3353 + 3355 + 2129 4 8 226 940 3346 3345 634 941 3357 + 3356 + 2130 4 8 3346 3345 834 1706 3357 3356 2103 + 2099 + 2131 4 8 2103 2099 130 942 3357 3356 634 + 941 + 2132 4 8 940 943 3345 1706 941 942 3356 + 2099 + 2133 4 8 226 638 3332 3349 3224 3223 3359 + 3358 + 2134 4 8 3332 3349 1523 1527 3359 3358 1526 + 1530 + 2135 4 8 1526 1530 1507 1505 3359 3358 3224 + 3223 + 2136 4 8 638 635 3349 1527 3223 1505 3358 + 1530 + 2137 4 8 294 2141 292 2140 286 3360 289 + 3361 + 2138 4 8 292 2140 149 279 289 3361 285 + 3362 + 2139 4 8 285 3362 41 1603 289 3361 286 + 3360 + 2140 4 8 2141 280 2140 279 3360 1603 3361 + 3362 + 2141 4 8 993 1381 1379 1380 2176 2823 2179 + 3363 + 2142 4 8 1379 1380 527 1160 2179 3363 2175 + 3364 + 2143 4 8 2175 3364 294 2141 2179 3363 2176 + 2823 + 2144 4 8 1381 280 1380 1160 2823 2141 3363 + 3364 + 2145 4 8 136 3365 1460 3366 1452 3367 1456 + 3368 + 2146 4 8 1460 3366 294 2158 1456 3368 1455 + 2159 + 2147 4 8 1455 2159 856 2155 1456 3368 1452 + 3367 + 2148 4 8 3365 2154 3366 2158 3367 2155 3368 + 2159 + 2149 4 8 136 276 1460 2143 526 1159 3370 + 3369 + 2150 4 8 1460 2143 294 2141 3370 3369 2175 + 3364 + 2151 4 8 2175 3364 527 1160 3370 3369 526 + 1159 + 2152 4 8 276 280 2143 2141 1159 1160 3369 + 3364 + 2153 4 8 15 1824 40 1822 835 3371 3373 + 3372 + 2154 4 8 40 1822 41 304 3373 3372 1857 + 3374 + 2155 4 8 1857 3374 846 1630 3373 3372 835 + 3371 + 2156 4 8 1824 317 1822 304 3371 1630 3372 + 3374 + 2157 4 8 1627 3375 3377 3376 2541 3378 3380 + 3379 + 2158 4 8 3377 3376 328 453 3380 3379 452 + 451 + 2159 4 8 452 451 294 450 3380 3379 2541 + 3378 + 2160 4 8 3375 454 3376 453 3378 450 3379 + 451 + 2161 4 8 993 992 987 986 2833 3381 3383 + 3382 + 2162 4 8 987 986 984 985 3383 3382 2836 + 3384 + 2163 4 8 2836 3384 1627 3375 3383 3382 2833 + 3381 + 2164 4 8 992 454 986 985 3381 3375 3382 + 3384 + 2165 4 8 1342 2712 2807 3385 3386 3387 3389 + 3388 + 2166 4 8 2807 3385 1627 3375 3389 3388 2836 + 3384 + 2167 4 8 2836 3384 984 985 3389 3388 3386 + 3387 + 2168 4 8 2712 454 3385 3375 3387 985 3388 + 3384 + 2169 4 8 1643 2834 2551 3390 1646 2837 2805 + 3391 + 2170 4 8 2551 3390 1342 3386 2805 3391 2807 + 3389 + 2171 4 8 2807 3389 1627 2836 2805 3391 1646 + 2837 + 2172 4 8 2834 984 3390 3386 2837 2836 3391 + 3389 + 2173 4 8 1342 1345 2671 2673 2712 3392 3394 + 3393 + 2174 4 8 2671 2673 337 1604 3394 3393 2787 + 2786 + 2175 4 8 2787 2786 454 2681 3394 3393 2712 + 3392 + 2176 4 8 1345 528 2673 1604 3392 2681 3393 + 2786 + 2177 4 8 337 2671 2787 3394 1652 2806 3396 + 3395 + 2178 4 8 2787 3394 454 2712 3396 3395 3375 + 3385 + 2179 4 8 3375 3385 1627 2807 3396 3395 1652 + 2806 + 2180 4 8 2671 1342 3394 2712 2806 2807 3395 + 3385 + 2181 4 8 1342 2529 1345 2532 2712 2711 3392 + 3397 + 2182 4 8 1345 2532 528 531 3392 3397 2681 + 2682 + 2183 4 8 2681 2682 454 800 3392 3397 2712 + 2711 + 2184 4 8 2529 537 2532 531 2711 800 3397 + 2682 + 2185 4 8 2694 3398 3400 3399 3401 3402 3404 + 3403 + 2186 4 8 3400 3399 1342 3386 3404 3403 2551 + 3390 + 2187 4 8 2551 3390 1643 2834 3404 3403 3401 + 3402 + 2188 4 8 3398 984 3399 3386 3402 2834 3403 + 3390 + 2189 4 8 667 2452 715 2453 2029 3405 3407 + 3406 + 2190 4 8 715 2453 648 2450 3407 3406 672 + 2461 + 2191 4 8 672 2461 668 1447 3407 3406 2029 + 3405 + 2192 4 8 2452 1133 2453 2450 3405 1447 3406 + 2461 + 2193 4 8 1133 1243 2450 2451 1245 1244 3409 + 3408 + 2194 4 8 2450 2451 648 1203 3409 3408 646 + 1204 + 2195 4 8 646 1204 647 1205 3409 3408 1245 + 1244 + 2196 4 8 1243 237 2451 1203 1244 1205 3408 + 1204 + 2197 4 8 1133 1245 2450 3409 1896 3410 2460 + 3411 + 2198 4 8 2450 3409 648 646 2460 3411 679 + 2472 + 2199 4 8 679 2472 677 2469 2460 3411 1896 + 3410 + 2200 4 8 1245 647 3409 646 3410 2469 3411 + 2472 + 2201 4 8 668 669 672 673 2029 2032 3407 + 3412 + 2202 4 8 672 673 648 680 3407 3412 715 + 716 + 2203 4 8 715 716 667 722 3407 3412 2029 + 2032 + 2204 4 8 669 681 673 680 2032 722 3412 + 716 + 2205 4 8 706 2363 2014 3413 1657 2719 3111 + 3414 + 2206 4 8 2014 3413 790 3415 3111 3414 2706 + 3416 + 2207 4 8 2706 3416 1654 2721 3111 3414 1657 + 2719 + 2208 4 8 2363 581 3413 3415 2719 2721 3414 + 3416 + 2209 4 8 537 1988 1690 3417 1685 1983 1688 + 3418 + 2210 4 8 1690 3417 706 2363 1688 3418 1684 + 2380 + 2211 4 8 1684 2380 820 1984 1688 3418 1685 + 1983 + 2212 4 8 1988 581 3417 2363 1983 1984 3418 + 2380 + 2213 4 8 581 584 1984 2383 585 588 3161 + 3419 + 2214 4 8 1984 2383 820 1318 3161 3419 819 + 1317 + 2215 4 8 819 1317 557 592 3161 3419 585 + 588 + 2216 4 8 584 590 2383 1318 588 592 3419 + 1317 + 2217 4 8 1143 1952 1990 3420 1370 1953 3159 + 3421 + 2218 4 8 1990 3420 581 3213 3159 3421 585 + 3268 + 2219 4 8 585 3268 557 544 3159 3421 1370 + 1953 + 2220 4 8 1952 543 3420 3213 1953 544 3421 + 3268 + 2221 4 8 955 1668 2004 2005 1662 1664 3113 + 3422 + 2222 4 8 2004 2005 790 2010 3113 3422 2014 + 2015 + 2223 4 8 2014 2015 706 1334 3113 3422 1662 + 1664 + 2224 4 8 1668 541 2005 2010 1664 1334 3422 + 2015 + 2225 4 8 820 1682 1318 3174 1684 1683 2382 + 3423 + 2226 4 8 1318 3174 590 2968 2382 3423 709 + 2967 + 2227 4 8 709 2967 706 1341 2382 3423 1684 + 1683 + 2228 4 8 1682 542 3174 2968 1683 1341 3423 + 2967 + 2229 4 8 86 630 2309 3424 1055 2915 2310 + 3425 + 2230 4 8 2309 3424 214 217 2310 3425 2311 + 3072 + 2231 4 8 2311 3072 1056 2912 2310 3425 1055 + 2915 + 2232 4 8 630 223 3424 217 2915 2912 3425 + 3072 + 2233 4 8 593 596 1043 2421 597 600 3427 + 3426 + 2234 4 8 1043 2421 188 619 3427 3426 192 + 621 + 2235 4 8 192 621 199 604 3427 3426 597 + 600 + 2236 4 8 596 602 2421 619 600 604 3426 + 621 + 2237 4 8 442 855 859 857 445 2162 3429 + 3428 + 2238 4 8 859 857 860 858 3429 3428 2136 + 2994 + 2239 4 8 2136 2994 294 1455 3429 3428 445 + 2162 + 2240 4 8 855 856 857 858 2162 1455 3428 + 2994 + 2241 4 8 2154 2165 2157 3430 2241 2773 2242 + 3431 + 2242 4 8 2157 3430 442 1019 2242 3431 1992 + 1993 + 2243 4 8 1992 1993 496 1727 2242 3431 2241 + 2773 + 2244 4 8 2165 802 3430 1019 2773 1727 3431 + 1993 + 2245 4 8 2246 2240 2248 2244 3432 3433 3435 + 3434 + 2246 4 8 2248 2244 496 2241 3435 3434 519 + 3436 + 2247 4 8 519 3436 136 3365 3435 3434 3432 + 3433 + 2248 4 8 2240 2154 2244 2241 3433 3365 3434 + 3436 + 2249 4 8 811 1886 3438 3437 1521 1887 3440 + 3439 + 2250 4 8 3438 3437 2246 3441 3440 3439 2248 + 3442 + 2251 4 8 2248 3442 496 1884 3440 3439 1521 + 1887 + 2252 4 8 1886 1885 3437 3441 1887 1884 3439 + 3442 + 2253 4 8 463 2860 2854 3443 877 2862 2855 + 3444 + 2254 4 8 2854 3443 820 822 2855 3444 2018 + 2019 + 2255 4 8 2018 2019 606 1234 2855 3444 877 + 2862 + 2256 4 8 2860 824 3443 822 2862 1234 3444 + 2019 + 2257 4 8 935 3445 1907 3446 930 3447 2870 + 3448 + 2258 4 8 1907 3446 824 2860 2870 3448 815 + 3449 + 2259 4 8 815 3449 811 3450 2870 3448 930 + 3447 + 2260 4 8 3445 463 3446 2860 3447 3450 3448 + 3449 + 2261 4 8 811 3438 814 3451 1521 3440 3153 + 3452 + 2262 4 8 814 3451 820 2850 3153 3452 1366 + 3155 + 2263 4 8 1366 3155 496 2248 3153 3452 1521 + 3440 + 2264 4 8 3438 2246 3451 2850 3440 2248 3452 + 3155 + 2265 4 8 2154 2163 2157 3453 2165 2164 3430 + 3454 + 2266 4 8 2157 3453 442 443 3430 3454 1019 + 1020 + 2267 4 8 1019 1020 802 801 3430 3454 2165 + 2164 + 2268 4 8 2163 454 3453 443 2164 801 3454 + 1020 + 2269 4 8 1728 2049 2193 2194 2046 2050 3456 + 3455 + 2270 4 8 2193 2194 394 388 3456 3455 499 + 492 + 2271 4 8 499 492 500 489 3456 3455 2046 + 2050 + 2272 4 8 2049 385 2194 388 2050 489 3455 + 492 + 2273 4 8 294 450 445 444 2158 2535 2161 + 3457 + 2274 4 8 445 444 442 443 2161 3457 2157 + 3453 + 2275 4 8 2157 3453 2154 2163 2161 3457 2158 + 2535 + 2276 4 8 450 454 444 443 2535 2163 3457 + 3453 + 2277 4 8 2154 2157 2155 2156 2240 2239 3459 + 3458 + 2278 4 8 2155 2156 856 855 3459 3458 2658 + 2659 + 2279 4 8 2658 2659 2246 2245 3459 3458 2240 + 2239 + 2280 4 8 2157 442 2156 855 2239 2245 3458 + 2659 + 2281 4 8 385 489 2054 2053 491 490 3461 + 3460 + 2282 4 8 2054 2053 1134 1135 3461 3460 1138 + 1139 + 2283 4 8 1138 1139 496 495 3461 3460 491 + 490 + 2284 4 8 489 500 2053 1135 490 495 3460 + 1139 + 2285 4 8 136 1878 519 1880 3432 3462 3435 + 3463 + 2286 4 8 519 1880 496 1884 3435 3463 2248 + 3442 + 2287 4 8 2248 3442 2246 3441 3435 3463 3432 + 3462 + 2288 4 8 1878 1885 1880 1884 3462 3441 3463 + 3442 + 2289 4 8 1897 2637 2636 2640 3003 3233 3006 + 3464 + 2290 4 8 2636 2640 1914 2642 3006 3464 2628 + 3465 + 2291 4 8 2628 3465 2608 3232 3006 3464 3003 + 3233 + 2292 4 8 2637 1523 2640 2642 3233 3232 3464 + 3465 + 2293 4 8 463 2760 3445 3466 2860 2859 3446 + 3467 + 2294 4 8 3445 3466 935 2587 3446 3467 1907 + 2882 + 2295 4 8 1907 2882 824 2863 3446 3467 2860 + 2859 + 2296 4 8 2760 1713 3466 2587 2859 2863 3467 + 2882 + 2297 4 8 811 3438 3450 3468 814 3451 3470 + 3469 + 2298 4 8 3450 3468 463 2749 3470 3469 2854 + 3158 + 2299 4 8 2854 3158 820 2850 3470 3469 814 + 3451 + 2300 4 8 3438 2246 3468 2749 3451 2850 3469 + 3158 + 2301 4 8 824 2860 822 3443 815 3449 818 + 3471 + 2302 4 8 822 3443 820 2854 818 3471 814 + 3470 + 2303 4 8 814 3470 811 3450 818 3471 815 + 3449 + 2304 4 8 2860 463 3443 2854 3449 3450 3471 + 3470 + 2305 4 8 1143 1145 1142 1144 1370 1365 3473 + 3472 + 2306 4 8 1142 1144 500 495 3473 3472 1517 + 1518 + 2307 4 8 1517 1518 557 1364 3473 3472 1370 + 1365 + 2308 4 8 1145 496 1144 495 1365 1364 3472 + 1518 + 2309 4 8 802 791 798 792 3474 3475 3477 + 3476 + 2310 4 8 798 792 537 793 3477 3476 1988 + 3478 + 2311 4 8 1988 3478 581 3415 3477 3476 3474 + 3475 + 2312 4 8 791 790 792 793 3475 3415 3476 + 3478 + 2313 4 8 922 3479 1959 3480 1954 3481 1957 + 3482 + 2314 4 8 1959 3480 557 1517 1957 3482 1370 + 3473 + 2315 4 8 1370 3473 1143 1142 1957 3482 1954 + 3481 + 2316 4 8 3479 500 3480 1517 3481 1142 3482 + 3473 + 2317 4 8 1870 1869 3484 3483 3485 3486 3488 + 3487 + 2318 4 8 3484 3483 543 3302 3488 3487 546 + 3489 + 2319 4 8 546 3489 552 3263 3488 3487 3485 + 3486 + 2320 4 8 1869 1382 3483 3302 3486 3263 3487 + 3489 + 2321 4 8 1143 1145 1991 2491 1719 1722 3491 + 3490 + 2322 4 8 1991 2491 537 1997 3491 3490 798 + 1996 + 2323 4 8 798 1996 802 1727 3491 3490 1719 + 1722 + 2324 4 8 1145 496 2491 1997 1722 1727 3490 + 1996 + 2325 4 8 28 841 1475 1476 843 842 3493 + 3492 + 2326 4 8 1475 1476 1478 1477 3493 3492 1936 + 1941 + 2327 4 8 1936 1941 845 844 3493 3492 843 + 842 + 2328 4 8 841 846 1476 1477 842 844 3492 + 1941 + 2329 4 8 71 65 473 472 3494 3495 3497 + 3496 + 2330 4 8 473 472 372 414 3497 3496 3499 + 3498 + 2331 4 8 3499 3498 3303 3307 3497 3496 3494 + 3495 + 2332 4 8 65 66 472 414 3495 3307 3496 + 3498 + 2333 4 8 150 1130 1128 1129 658 3500 3178 + 3501 + 2334 4 8 1128 1129 1133 1131 3178 3501 2452 + 3502 + 2335 4 8 2452 3502 667 2042 3178 3501 658 + 3500 + 2336 4 8 1130 1132 1129 1131 3500 2042 3501 + 3502 + 2337 4 8 3068 3503 3067 3504 3059 3505 3062 + 3506 + 2338 4 8 3067 3504 214 2311 3062 3506 2920 + 2921 + 2339 4 8 2920 2921 954 1849 3062 3506 3059 + 3505 + 2340 4 8 3503 1056 3504 2311 3505 1849 3506 + 2921 + 2341 4 8 214 558 217 2927 215 559 216 + 3507 + 2342 4 8 217 2927 223 1556 216 3507 222 + 2357 + 2343 4 8 222 2357 164 564 216 3507 215 + 559 + 2344 4 8 558 569 2927 1556 559 564 3507 + 2357 + 2345 4 8 834 1704 832 2232 827 1705 830 + 3508 + 2346 4 8 832 2232 134 2231 830 3508 826 + 2764 + 2347 4 8 826 2764 606 1710 830 3508 827 + 1705 + 2348 4 8 1704 1713 2232 2231 1705 1710 3508 + 2764 + 2349 4 8 226 3332 3335 3336 3346 3509 3511 + 3510 + 2350 4 8 3335 3336 803 3342 3511 3510 3513 + 3512 + 2351 4 8 3513 3512 834 3252 3511 3510 3346 + 3509 + 2352 4 8 3332 1523 3336 3342 3509 3252 3510 + 3512 + 2353 4 8 1507 3224 3228 3343 1526 3359 3254 + 3514 + 2354 4 8 3228 3343 834 3346 3254 3514 3252 + 3509 + 2355 4 8 3252 3509 1523 3332 3254 3514 1526 + 3359 + 2356 4 8 3224 226 3343 3346 3359 3332 3514 + 3509 + 2357 4 8 130 132 2103 3515 3350 3516 3518 + 3517 + 2358 4 8 2103 3515 834 832 3518 3517 3513 + 3519 + 2359 4 8 3513 3519 803 807 3518 3517 3350 + 3516 + 2360 4 8 132 134 3515 832 3516 807 3517 + 3519 + 2361 4 8 1523 2642 2874 3520 1524 2641 2872 + 3521 + 2362 4 8 2874 3520 2236 2609 2872 3521 2508 + 2610 + 2363 4 8 2508 2610 1508 2611 2872 3521 1524 + 2641 + 2364 4 8 2642 1914 3520 2609 2641 2611 3521 + 2610 + 2365 4 8 1927 2617 3523 3522 1918 2612 3525 + 3524 + 2366 4 8 3523 3522 1523 2874 3525 3524 2642 + 3520 + 2367 4 8 2642 3520 1914 2609 3525 3524 1918 + 2612 + 2368 4 8 2617 2236 3522 2874 2612 2609 3524 + 3520 + 2369 4 8 2500 2503 2770 2771 2634 2633 3527 + 3526 + 2370 4 8 2770 2771 1928 2772 3527 3526 3529 + 3528 + 2371 4 8 3529 3528 934 2632 3527 3526 2634 + 2633 + 2372 4 8 2503 1508 2771 2772 2633 2632 3526 + 3528 + 2373 4 8 1897 2636 2445 2635 2819 3530 3532 + 3531 + 2374 4 8 2445 2635 1508 2611 3532 3531 2772 + 3533 + 2375 4 8 2772 3533 1928 1915 3532 3531 2819 + 3530 + 2376 4 8 2636 1914 2635 2611 3530 1915 3531 + 3533 + 2377 4 8 2288 3534 3104 3535 3099 3536 3102 + 3537 + 2378 4 8 3104 3535 110 3088 3102 3537 3095 + 3089 + 2379 4 8 3095 3089 2205 3090 3102 3537 3099 + 3536 + 2380 4 8 3534 1631 3535 3088 3536 3090 3537 + 3089 + 2381 4 8 1832 1825 2091 3538 1838 1837 3540 + 3539 + 2382 4 8 2091 3538 226 2467 3540 3539 645 + 2465 + 2383 4 8 645 2465 647 1210 3540 3539 1838 + 1837 + 2384 4 8 1825 1206 3538 2467 1837 1210 3539 + 2465 + 2385 4 8 1631 3319 3542 3541 1634 3321 3544 + 3543 + 2386 4 8 3542 3541 2608 3003 3544 3543 2607 + 3238 + 2387 4 8 2607 3238 1206 1901 3544 3543 1634 + 3321 + 2388 4 8 3319 1897 3541 3003 3321 1901 3543 + 3238 + 2389 4 8 1406 2606 1641 2605 1635 3545 1638 + 3546 + 2390 4 8 1641 2605 1206 2607 1638 3546 1634 + 3544 + 2391 4 8 1634 3544 1631 3542 1638 3546 1635 + 3545 + 2392 4 8 2606 2608 2605 2607 3545 3542 3546 + 3544 + 2393 4 8 1120 2890 1207 2895 3322 3547 3325 + 3548 + 2394 4 8 1207 2895 1206 1639 3325 3548 1634 + 1633 + 2395 4 8 1634 1633 1631 1632 3325 3548 3322 + 3547 + 2396 4 8 2890 580 2895 1639 3547 1632 3548 + 1633 + 2397 4 8 337 617 1653 3312 1745 2785 1746 + 3549 + 2398 4 8 1653 3312 317 1415 1746 3549 315 + 2249 + 2399 4 8 315 2249 316 1032 1746 3549 1745 + 2785 + 2400 4 8 617 618 3312 1415 2785 1032 3549 + 2249 + 2401 4 8 312 3550 1804 3551 1808 3552 1811 + 3553 + 2402 4 8 1804 3551 618 888 1811 3553 1417 + 2270 + 2403 4 8 1417 2270 23 2271 1811 3553 1808 + 3552 + 2404 4 8 3550 296 3551 888 3552 2271 3553 + 2270 + 2405 4 8 15 1824 3555 3554 25 1823 3557 + 3556 + 2406 4 8 3555 3554 213 1408 3557 3556 1411 + 1412 + 2407 4 8 1411 1412 23 1418 3557 3556 25 + 1823 + 2408 4 8 1824 317 3554 1408 1823 1418 3556 + 1412 + 2409 4 8 860 1147 3559 3558 3560 3561 3563 + 3562 + 2410 4 8 3559 3558 2258 3564 3563 3562 3566 + 3565 + 2411 4 8 3566 3565 341 1038 3563 3562 3560 + 3561 + 2412 4 8 1147 316 3558 3564 3561 1038 3562 + 3565 + 2413 4 8 149 2511 1148 3567 433 3568 3570 + 3569 + 2414 4 8 1148 3567 316 3564 3570 3569 1041 + 3571 + 2415 4 8 1041 3571 430 2262 3570 3569 433 + 3568 + 2416 4 8 2511 2258 3567 3564 3568 2262 3569 + 3571 + 2417 4 8 510 501 3573 3572 509 504 3575 + 3574 + 2418 4 8 3573 3572 593 2251 3575 3574 2253 + 2254 + 2419 4 8 2253 2254 430 503 3575 3574 509 + 504 + 2420 4 8 501 296 3572 2251 504 503 3574 + 2254 + 2421 4 8 467 2144 2476 2488 2146 2145 2754 + 3576 + 2422 4 8 2476 2488 148 147 2754 3576 2287 + 2286 + 2423 4 8 2287 2286 510 2151 2754 3576 2146 + 2145 + 2424 4 8 2144 149 2488 147 2145 2151 3576 + 2286 + 2425 4 8 135 507 440 2285 434 508 437 + 3577 + 2426 4 8 440 2285 149 2151 437 3577 433 + 3578 + 2427 4 8 433 3578 430 509 437 3577 434 + 508 + 2428 4 8 507 510 2285 2151 508 509 3577 + 3578 + 2429 4 8 1120 3579 1898 3580 1393 3581 2885 + 3582 + 2430 4 8 1898 3580 1897 3316 2885 3582 2442 + 3583 + 2431 4 8 2442 3583 1391 3087 2885 3582 1393 + 3581 + 2432 4 8 3579 2209 3580 3316 3581 3087 3582 + 3583 + 2433 4 8 2209 3087 3585 3584 3108 3107 3587 + 3586 + 2434 4 8 3585 3584 1382 1385 3587 3586 3263 + 3266 + 2435 4 8 3263 3266 552 2228 3587 3586 3108 + 3107 + 2436 4 8 3087 1391 3584 1385 3107 2228 3586 + 3266 + 2437 4 8 1120 3579 1386 3588 2891 3589 3591 + 3590 + 2438 4 8 1386 3588 1382 3585 3591 3590 1873 + 3592 + 2439 4 8 1873 3592 110 3097 3591 3590 2891 + 3589 + 2440 4 8 3579 2209 3588 3585 3589 3097 3590 + 3592 + 2441 4 8 845 2349 3594 3593 3138 3137 3596 + 3595 + 2442 4 8 3594 3593 1098 1757 3596 3595 1756 + 1755 + 2443 4 8 1756 1755 1754 1753 3596 3595 3138 + 3137 + 2444 4 8 2349 37 3593 1757 3137 1753 3595 + 1755 + 2445 4 8 984 3204 3598 3597 3599 3600 3602 + 3601 + 2446 4 8 3598 3597 2703 3603 3602 3601 2702 + 3604 + 2447 4 8 2702 3604 790 3605 3602 3601 3599 + 3600 + 2448 4 8 3204 3201 3597 3603 3600 3605 3601 + 3604 + 2449 4 8 1181 1678 1776 3606 1680 1679 1775 + 3607 + 2450 4 8 1776 3606 1654 3038 1775 3607 1658 + 3040 + 2451 4 8 1658 3040 785 1681 1775 3607 1680 + 1679 + 2452 4 8 1678 981 3606 3038 1679 1681 3607 + 3040 + 2453 4 8 1133 1131 1447 1441 2452 3502 3405 + 3608 + 2454 4 8 1447 1441 668 1438 3405 3608 2029 + 3609 + 2455 4 8 2029 3609 667 2042 3405 3608 2452 + 3502 + 2456 4 8 1131 1132 1441 1438 3502 2042 3608 + 3609 + 2457 4 8 368 367 420 2058 2038 3610 3612 + 3611 + 2458 4 8 420 2058 250 246 3612 3611 1169 + 3613 + 2459 4 8 1169 3613 667 658 3612 3611 2038 + 3610 + 2460 4 8 367 150 2058 246 3610 658 3611 + 3613 + 2461 4 8 2608 3542 2606 3545 2626 3614 3616 + 3615 + 2462 4 8 2606 3545 1406 1635 3616 3615 3618 + 3617 + 2463 4 8 3618 3617 1923 3619 3616 3615 2626 + 3614 + 2464 4 8 3542 1631 3545 1635 3614 3619 3615 + 3617 + 2465 4 8 790 794 2708 2710 3599 3620 3622 + 3621 + 2466 4 8 2708 2710 1342 2712 3622 3621 3386 + 3387 + 2467 4 8 3386 3387 984 985 3622 3621 3599 + 3620 + 2468 4 8 794 454 2710 2712 3620 985 3621 + 3387 + 2469 4 8 706 2363 1690 3417 2014 3413 2017 + 3623 + 2470 4 8 1690 3417 537 1988 2017 3623 793 + 3478 + 2471 4 8 793 3478 790 3415 2017 3623 2014 + 3413 + 2472 4 8 2363 581 3417 1988 3413 3415 3623 + 3478 + 2473 4 8 790 794 3599 3620 791 795 3625 + 3624 + 2474 4 8 3599 3620 984 985 3625 3624 988 + 989 + 2475 4 8 988 989 802 801 3625 3624 791 + 795 + 2476 4 8 794 454 3620 985 795 801 3624 + 989 + 2477 4 8 790 2009 2708 3626 2010 2008 3050 + 3627 + 2478 4 8 2708 3626 1342 1791 3050 3627 1346 + 1790 + 2479 4 8 1346 1790 541 1794 3050 3627 2010 + 2008 + 2480 4 8 2009 981 3626 1791 2008 1794 3627 + 1790 + 2481 4 8 3201 3277 3629 3628 3274 3278 3631 + 3630 + 2482 4 8 3629 3628 1143 1990 3631 3630 1952 + 3420 + 2483 4 8 1952 3420 543 3213 3631 3630 3274 + 3278 + 2484 4 8 3277 581 3628 1990 3278 3213 3630 + 3420 + 2485 4 8 3201 3629 3277 3628 3202 3632 3634 + 3633 + 2486 4 8 3277 3628 581 1990 3634 3633 3474 + 3635 + 2487 4 8 3474 3635 802 1719 3634 3633 3202 + 3632 + 2488 4 8 3629 1143 3628 1990 3632 1719 3633 + 3635 + 2489 4 8 984 3636 3398 3637 3598 3638 3640 + 3639 + 2490 4 8 3398 3637 2694 3641 3640 3639 2697 + 3642 + 2491 4 8 2697 3642 2703 3643 3640 3639 3598 + 3638 + 2492 4 8 3636 2181 3637 3641 3638 3643 3639 + 3642 + 2493 4 8 23 1411 25 3557 22 3644 24 + 3645 + 2494 4 8 25 3557 15 3555 24 3645 26 + 3646 + 2495 4 8 26 3646 27 212 24 3645 22 + 3644 + 2496 4 8 1411 213 3557 3555 3644 212 3645 + 3646 + 2497 4 8 337 1653 608 3314 1647 1648 3648 + 3647 + 2498 4 8 608 3314 607 2798 3648 3647 2549 + 3649 + 2499 4 8 2549 3649 1643 1644 3648 3647 1647 + 1648 + 2500 4 8 1653 317 3314 2798 1648 1644 3647 + 3649 + 2501 4 8 972 2688 2794 3650 2666 3651 2793 + 3652 + 2502 4 8 2794 3650 317 1824 2793 3652 1408 + 3554 + 2503 4 8 1408 3554 213 3555 2793 3652 2666 + 3651 + 2504 4 8 2688 15 3650 1824 3651 3555 3652 + 3554 + 2505 4 8 1180 2335 3654 3653 1856 3655 3657 + 3656 + 2506 4 8 3654 3653 1643 3658 3657 3656 3660 + 3659 + 2507 4 8 3660 3659 972 2688 3657 3656 1856 + 3655 + 2508 4 8 2335 15 3653 3658 3655 2688 3656 + 3659 + 2509 4 8 15 2335 2303 2331 2688 3655 2691 + 3661 + 2510 4 8 2303 2331 56 2330 2691 3661 2687 + 3662 + 2511 4 8 2687 3662 972 1856 2691 3661 2688 + 3655 + 2512 4 8 2335 1180 2331 2330 3655 1856 3661 + 3662 + 2513 4 8 295 885 1622 1623 283 880 3664 + 3663 + 2514 4 8 1622 1623 846 1630 3664 3663 1857 + 3374 + 2515 4 8 1857 3374 41 304 3664 3663 283 + 880 + 2516 4 8 885 317 1623 1630 880 304 3663 + 3374 + 2517 4 8 2618 3665 3667 3666 3668 3669 3671 + 3670 + 2518 4 8 3667 3666 1406 3672 3671 3670 2600 + 3673 + 2519 4 8 2600 3673 2597 3674 3671 3670 3668 + 3669 + 2520 4 8 3665 121 3666 3672 3669 3674 3670 + 3673 + 2521 4 8 2694 3401 3676 3675 3398 3402 3678 + 3677 + 2522 4 8 3676 3675 1180 3654 3678 3677 3680 + 3679 + 2523 4 8 3680 3679 984 2834 3678 3677 3398 + 3402 + 2524 4 8 3401 1643 3675 3654 3402 2834 3677 + 3679 + 2525 4 8 1181 1176 1179 1177 1674 3049 3120 + 3681 + 2526 4 8 1179 1177 1180 1178 3120 3681 1850 + 3682 + 2527 4 8 1850 3682 954 1844 3120 3681 1674 + 3049 + 2528 4 8 1176 1110 1177 1178 3049 1844 3681 + 3682 + 2529 4 8 607 2798 1787 2796 2549 3649 3684 + 3683 + 2530 4 8 1787 2796 972 2794 3684 3683 3660 + 3685 + 2531 4 8 3660 3685 1643 1644 3684 3683 2549 + 3649 + 2532 4 8 2798 317 2796 2794 3649 1644 3683 + 3685 + 2533 4 8 2694 2695 3687 3686 3400 3688 3690 + 3689 + 2534 4 8 3687 3686 981 2009 3690 3689 1791 + 3626 + 2535 4 8 1791 3626 1342 2708 3690 3689 3400 + 3688 + 2536 4 8 2695 790 3686 2009 3688 2708 3689 + 3626 + 2537 4 8 1643 2840 1644 3691 3658 3692 3694 + 3693 + 2538 4 8 1644 3691 317 1630 3694 3693 1824 + 3371 + 2539 4 8 1824 3371 15 835 3694 3693 3658 + 3692 + 2540 4 8 2840 846 3691 1630 3692 835 3693 + 3371 + 2541 4 8 1258 1260 1296 1298 3152 3151 3166 + 3695 + 2542 4 8 1296 1298 542 682 3166 3695 2495 + 2494 + 2543 4 8 2495 2494 2492 2493 3166 3695 3152 + 3151 + 2544 4 8 1260 342 1298 682 3151 2493 3695 + 2494 + 2545 4 8 537 536 2525 2677 1685 1686 2522 + 3696 + 2546 4 8 2525 2677 2492 2495 2522 3696 2519 + 3163 + 2547 4 8 2519 3163 820 1682 2522 3696 1685 + 1686 + 2548 4 8 536 542 2677 2495 1686 1682 3696 + 3163 + 2549 4 8 2492 2523 2519 2518 2650 2649 3698 + 3697 + 2550 4 8 2519 2518 820 2517 3698 3697 2848 + 2849 + 2551 4 8 2848 2849 468 2655 3698 3697 2650 + 2649 + 2552 4 8 2523 442 2518 2517 2649 2655 3697 + 2849 + 2553 4 8 442 1611 848 3699 2523 2736 2652 + 3700 + 2554 4 8 848 3699 847 3167 2652 3700 2651 + 3170 + 2555 4 8 2651 3170 2492 2493 2652 3700 2523 + 2736 + 2556 4 8 1611 342 3699 3167 2736 2493 3700 + 3170 + 2557 4 8 468 2848 2650 3698 3701 3702 3704 + 3703 + 2558 4 8 2650 3698 2492 2519 3704 3703 3152 + 3164 + 2559 4 8 3152 3164 1258 2020 3704 3703 3701 + 3702 + 2560 4 8 2848 820 3698 2519 3702 2020 3703 + 3164 + 2561 4 8 593 2417 594 2646 3573 3705 3707 + 3706 + 2562 4 8 594 2646 606 2424 3707 3706 2429 + 2427 + 2563 4 8 2429 2427 510 2266 3707 3706 3573 + 3705 + 2564 4 8 2417 2267 2646 2424 3705 2266 3706 + 2427 + 2565 4 8 442 446 1611 3708 1606 2790 1609 + 3709 + 2566 4 8 1611 3708 342 329 1609 3709 336 + 330 + 2567 4 8 336 330 337 331 1609 3709 1606 + 2790 + 2568 4 8 446 328 3708 329 2790 331 3709 + 330 + 2569 4 8 2258 2511 3559 3710 2513 2512 3712 + 3711 + 2570 4 8 3559 3710 860 1154 3712 3711 858 + 2996 + 2571 4 8 858 2996 856 1454 3712 3711 2513 + 2512 + 2572 4 8 2511 149 3710 1154 2512 1454 3711 + 2996 + 2573 4 8 406 407 3714 3713 409 408 3716 + 3715 + 2574 4 8 3714 3713 3303 3307 3716 3715 3499 + 3498 + 2575 4 8 3499 3498 372 414 3716 3715 409 + 408 + 2576 4 8 407 66 3713 3307 408 414 3715 + 3498 + 2577 4 8 1728 1729 1732 1733 3717 3718 3720 + 3719 + 2578 4 8 1732 1733 87 116 3720 3719 382 + 380 + 2579 4 8 382 380 384 377 3720 3719 3717 + 3718 + 2580 4 8 1729 110 1733 116 3718 377 3719 + 380 + 2581 4 8 1870 3484 3722 3721 3723 3724 3726 + 3725 + 2582 4 8 3722 3721 1143 1952 3726 3725 1954 + 1955 + 2583 4 8 1954 1955 922 1960 3726 3725 3723 + 3724 + 2584 4 8 3484 543 3721 1952 3724 1960 3725 + 1955 + 2585 4 8 1870 3727 3484 3728 3729 3730 3732 + 3731 + 2586 4 8 3484 3728 543 3733 3732 3731 3735 + 3734 + 2587 4 8 3735 3734 3737 3736 3732 3731 3729 + 3730 + 2588 4 8 3727 1765 3728 3733 3730 3736 3731 + 3734 + 2589 4 8 1382 1444 3302 3297 3263 3262 3489 + 3738 + 2590 4 8 3302 3297 543 2407 3489 3738 546 + 3200 + 2591 4 8 546 3200 552 2403 3489 3738 3263 + 3262 + 2592 4 8 1444 668 3297 2407 3262 2403 3738 + 3200 + 2593 4 8 2209 3087 3579 3581 3585 3584 3588 + 3739 + 2594 4 8 3579 3581 1120 1393 3588 3739 1386 + 1389 + 2595 4 8 1386 1389 1382 1385 3588 3739 3585 + 3584 + 2596 4 8 3087 1391 3581 1393 3584 1385 3739 + 1389 + 2597 4 8 618 886 3741 3740 1817 1816 3743 + 3742 + 2598 4 8 3741 3740 209 657 3743 3742 203 + 3057 + 2599 4 8 203 3057 200 1613 3743 3742 1817 + 1816 + 2600 4 8 886 176 3740 657 1816 1613 3742 + 3057 + 2601 4 8 110 3097 1873 3592 1872 3744 1871 + 3745 + 2602 4 8 1873 3592 1382 3585 1871 3745 1869 + 3746 + 2603 4 8 1869 3746 1870 3747 1871 3745 1872 + 3744 + 2604 4 8 3097 2209 3592 3585 3744 3747 3745 + 3746 + 2605 4 8 922 3479 1954 3481 3723 3748 3726 + 3749 + 2606 4 8 1954 3481 1143 1142 3726 3749 3722 + 3750 + 2607 4 8 3722 3750 1870 3751 3726 3749 3723 + 3748 + 2608 4 8 3479 500 3481 1142 3748 3751 3749 + 3750 + 2609 4 8 2694 2698 3687 3752 2695 2699 3686 + 3753 + 2610 4 8 3687 3752 981 3038 3686 3753 2009 + 3052 + 2611 4 8 2009 3052 790 2706 3686 3753 2695 + 2699 + 2612 4 8 2698 1654 3752 3038 2699 2706 3753 + 3052 + 2613 4 8 3303 3754 3756 3755 3757 3758 3760 + 3759 + 2614 4 8 3756 3755 429 3761 3760 3759 2728 + 3762 + 2615 4 8 2728 3762 57 3763 3760 3759 3757 + 3758 + 2616 4 8 3754 3764 3755 3761 3758 3763 3759 + 3762 + 2617 4 8 3201 3202 3205 3206 3765 3766 3768 + 3767 + 2618 4 8 3205 3206 870 869 3768 3767 864 + 863 + 2619 4 8 864 863 861 862 3768 3767 3765 + 3766 + 2620 4 8 3202 802 3206 869 3766 862 3767 + 863 + 2621 4 8 384 1003 382 3769 3717 3770 3720 + 3771 + 2622 4 8 382 3769 87 386 3720 3771 1732 + 2192 + 2623 4 8 1732 2192 1728 2049 3720 3771 3717 + 3770 + 2624 4 8 1003 385 3769 386 3770 2049 3771 + 2192 + 2625 4 8 870 3284 864 3285 1013 3772 1739 + 3773 + 2626 4 8 864 3285 861 996 1739 3773 999 + 1000 + 2627 4 8 999 1000 398 1005 1739 3773 1013 + 3772 + 2628 4 8 3284 384 3285 996 3772 1005 3773 + 1000 + 2629 4 8 1258 2647 3701 3774 2025 2643 3776 + 3775 + 2630 4 8 3701 3774 468 2422 3776 3775 879 + 2423 + 2631 4 8 879 2423 606 2424 3776 3775 2025 + 2643 + 2632 4 8 2647 2267 3774 2422 2643 2424 3775 + 2423 + 2633 4 8 1713 2238 2760 3777 2587 2586 3466 + 3778 + 2634 4 8 2760 3777 463 3779 3466 3778 3445 + 3780 + 2635 4 8 3445 3780 935 2510 3466 3778 2587 + 2586 + 2636 4 8 2238 2236 3777 3779 2586 2510 3778 + 3780 + 2637 4 8 3201 3781 3783 3782 3274 3784 3786 + 3785 + 2638 4 8 3783 3782 3737 3736 3786 3785 3735 + 3734 + 2639 4 8 3735 3734 543 3733 3786 3785 3274 + 3784 + 2640 4 8 3781 1765 3782 3736 3784 3733 3785 + 3734 + 2641 4 8 2246 3441 2749 3787 2744 3788 2747 + 3789 + 2642 4 8 2749 3787 463 2484 2747 3789 465 + 2481 + 2643 4 8 465 2481 467 2478 2747 3789 2744 + 3788 + 2644 4 8 3441 1885 3787 2484 3788 2478 3789 + 2481 + 2645 4 8 328 1467 452 2139 446 2743 449 + 3790 + 2646 4 8 452 2139 294 2136 449 3790 445 + 3429 + 2647 4 8 445 3429 442 859 449 3790 446 + 2743 + 2648 4 8 1467 860 2139 2136 2743 859 3790 + 3429 + 2649 4 8 3791 3792 3794 3793 3795 3796 3798 + 3797 + 2650 4 8 3794 3793 425 3799 3798 3797 424 + 3800 + 2651 4 8 424 3800 429 3761 3798 3797 3795 + 3796 + 2652 4 8 3792 3764 3793 3799 3796 3761 3797 + 3800 + 2653 4 8 789 959 1798 3250 788 3801 2190 + 3802 + 2654 4 8 1798 3250 250 427 2190 3802 1169 + 3803 + 2655 4 8 1169 3803 667 2044 2190 3802 788 + 3801 + 2656 4 8 959 425 3250 427 3801 2044 3802 + 3803 + 2657 4 8 214 3067 656 3066 2312 3804 2320 + 3805 + 2658 4 8 656 3066 209 3065 2320 3805 2317 + 3806 + 2659 4 8 2317 3806 72 3807 2320 3805 2312 + 3804 + 2660 4 8 3067 3068 3066 3065 3804 3807 3805 + 3806 + 2661 4 8 42 45 1118 1115 2908 2907 3809 + 3808 + 2662 4 8 1118 1115 1084 1112 3809 3808 1583 + 1582 + 2663 4 8 1583 1582 743 1581 3809 3808 2908 + 2907 + 2664 4 8 45 51 1115 1112 2907 1581 3808 + 1582 + 2665 4 8 55 3246 2903 3810 1779 3811 3813 + 3812 + 2666 4 8 2903 3810 2181 3814 3813 3812 3816 + 3815 + 2667 4 8 3816 3815 271 3817 3813 3812 1779 + 3811 + 2668 4 8 3246 1080 3810 3814 3811 3817 3812 + 3815 + 2669 4 8 606 2025 594 2644 601 2963 595 + 3818 + 2670 4 8 594 2644 593 1254 595 3818 596 + 2419 + 2671 4 8 596 2419 602 1300 595 3818 601 + 2963 + 2672 4 8 2025 1258 2644 1254 2963 1300 3818 + 2419 + 2673 4 8 199 356 192 512 597 3819 3427 + 3820 + 2674 4 8 192 512 188 516 3427 3820 1043 + 3821 + 2675 4 8 1043 3821 593 2251 3427 3820 597 + 3819 + 2676 4 8 356 296 512 516 3819 2251 3820 + 3821 + 2677 4 8 846 841 1857 1860 835 836 3373 + 3822 + 2678 4 8 1857 1860 41 32 3373 3822 40 + 33 + 2679 4 8 40 33 15 29 3373 3822 835 + 836 + 2680 4 8 841 28 1860 32 836 29 3822 + 33 + 2681 4 8 1084 1118 1189 2069 1119 1117 1190 + 3823 + 2682 4 8 1189 2069 1181 1170 1190 3823 1176 + 1171 + 2683 4 8 1176 1171 1110 1116 1190 3823 1119 + 1117 + 2684 4 8 1118 42 2069 1170 1117 1116 3823 + 1171 + 2685 4 8 70 1969 68 3824 61 3825 64 + 3826 + 2686 4 8 68 3824 66 1768 64 3826 60 + 3827 + 2687 4 8 60 3827 57 274 64 3826 61 + 3825 + 2688 4 8 1969 37 3824 1768 3825 274 3826 + 3827 + 2689 4 8 1305 2129 1309 2577 1308 2595 1312 + 3828 + 2690 4 8 1309 2577 635 1498 1312 3828 1316 + 3829 + 2691 4 8 1316 3829 1314 1912 1312 3828 1308 + 2595 + 2692 4 8 2129 935 2577 1498 2595 1912 3828 + 3829 + 2693 4 8 527 2166 2175 2533 526 3830 3370 + 3831 + 2694 4 8 2175 2533 294 2158 3370 3831 1460 + 3366 + 2695 4 8 1460 3366 136 3365 3370 3831 526 + 3830 + 2696 4 8 2166 2154 2533 2158 3830 3365 3831 + 3366 + 2697 4 8 581 3415 3195 3832 3277 3833 3280 + 3834 + 2698 4 8 3195 3832 2080 3835 3280 3834 3276 + 3836 + 2699 4 8 3276 3836 3201 3605 3280 3834 3277 + 3833 + 2700 4 8 3415 790 3832 3835 3833 3605 3834 + 3836 + 2701 4 8 430 503 1034 2257 431 3837 1807 + 3838 + 2702 4 8 1034 2257 618 888 1807 3838 1804 + 3551 + 2703 4 8 1804 3551 312 3550 1807 3838 431 + 3837 + 2704 4 8 503 296 2257 888 3837 3550 3838 + 3551 + 2705 4 8 2500 3839 2504 3840 2999 3841 3002 + 3842 + 2706 4 8 2504 3840 935 3445 3002 3842 930 + 3447 + 2707 4 8 930 3447 811 3450 3002 3842 2999 + 3841 + 2708 4 8 3839 463 3840 3445 3841 3450 3842 + 3447 + 2709 4 8 2288 3843 3845 3844 3846 3847 3849 + 3848 + 2710 4 8 3845 3844 1923 3618 3849 3848 2621 + 3850 + 2711 4 8 2621 3850 2618 3667 3849 3848 3846 + 3847 + 2712 4 8 3843 1406 3844 3618 3847 3667 3848 + 3850 + 2713 4 8 3201 3629 3781 3851 3274 3631 3784 + 3852 + 2714 4 8 3781 3851 1765 3853 3784 3852 3733 + 3854 + 2715 4 8 3733 3854 543 1952 3784 3852 3274 + 3631 + 2716 4 8 3629 1143 3851 3853 3631 1952 3852 + 3854 + 2717 4 8 1 1049 3856 3855 2217 3857 3859 + 3858 + 2718 4 8 3856 3855 3068 3503 3859 3858 3861 + 3860 + 2719 4 8 3861 3860 56 3010 3859 3858 2217 + 3857 + 2720 4 8 1049 1056 3855 3503 3857 3010 3858 + 3860 + 2721 4 8 1 745 3023 3024 1048 1047 3863 + 3862 + 2722 4 8 3023 3024 81 80 3863 3862 75 + 74 + 2723 4 8 75 74 72 73 3863 3862 1048 + 1047 + 2724 4 8 745 86 3024 80 1047 73 3862 + 74 + 2725 4 8 406 1865 3865 3864 3866 3867 3869 + 3868 + 2726 4 8 3865 3864 1085 3870 3869 3868 3872 + 3871 + 2727 4 8 3872 3871 384 3873 3869 3868 3866 + 3867 + 2728 4 8 1865 1870 3864 3870 3867 3873 3868 + 3871 + 2729 4 8 3737 3874 3876 3875 3735 3877 3879 + 3878 + 2730 4 8 3876 3875 2080 3301 3879 3878 3271 + 3300 + 2731 4 8 3271 3300 543 3302 3879 3878 3735 + 3877 + 2732 4 8 3874 1382 3875 3301 3877 3302 3878 + 3300 + 2733 4 8 1870 3722 3727 3880 3881 3882 3884 + 3883 + 2734 4 8 3727 3880 1765 3853 3884 3883 3886 + 3885 + 2735 4 8 3886 3885 1134 1137 3884 3883 3881 + 3882 + 2736 4 8 3722 1143 3880 3853 3882 1137 3883 + 3885 + 2737 4 8 2080 3271 3183 3273 3195 3281 3198 + 3887 + 2738 4 8 3183 3273 694 2408 3198 3887 2362 + 3215 + 2739 4 8 2362 3215 581 3213 3198 3887 3195 + 3281 + 2740 4 8 3271 543 3273 2408 3281 3213 3887 + 3215 + 2741 4 8 984 3204 2542 3208 3598 3597 3889 + 3888 + 2742 4 8 2542 3208 870 3205 3889 3888 3891 + 3890 + 2743 4 8 3891 3890 2703 3603 3889 3888 3598 + 3597 + 2744 4 8 3204 3201 3208 3205 3597 3603 3888 + 3890 + 2745 4 8 2080 3276 3835 3836 3042 3892 3894 + 3893 + 2746 4 8 3835 3836 790 3605 3894 3893 2702 + 3604 + 2747 4 8 2702 3604 2703 3603 3894 3893 3042 + 3892 + 2748 4 8 3276 3201 3836 3605 3892 3603 3893 + 3604 + 2749 4 8 3201 3202 3765 3766 3629 3632 3896 + 3895 + 2750 4 8 3765 3766 861 862 3896 3895 1721 + 1720 + 2751 4 8 1721 1720 1143 1719 3896 3895 3629 + 3632 + 2752 4 8 3202 802 3766 862 3632 1719 3895 + 1720 + 2753 4 8 581 1990 1988 1989 3474 3635 3477 + 3897 + 2754 4 8 1988 1989 537 1991 3477 3897 798 + 3491 + 2755 4 8 798 3491 802 1719 3477 3897 3474 + 3635 + 2756 4 8 1990 1143 1989 1991 3635 1719 3897 + 3491 + 2757 4 8 15 3555 2688 3651 26 3646 2689 + 3898 + 2758 4 8 2688 3651 972 2666 2689 3898 2323 + 3899 + 2759 4 8 2323 3899 27 212 2689 3898 26 + 3646 + 2760 4 8 3555 213 3651 2666 3646 212 3898 + 3899 + 2761 4 8 1 2217 16 3900 2 2328 19 + 3901 + 2762 4 8 16 3900 27 2692 19 3901 26 + 2693 + 2763 4 8 26 2693 15 2303 19 3901 2 + 2328 + 2764 4 8 2217 56 3900 2692 2328 2303 3901 + 2693 + 2765 4 8 72 3019 75 3021 3902 3903 3905 + 3904 + 2766 4 8 75 3021 81 1615 3905 3904 3907 + 3906 + 2767 4 8 3907 3906 27 201 3905 3904 3902 + 3903 + 2768 4 8 3019 200 3021 1615 3903 201 3904 + 3906 + 2769 4 8 209 203 2317 3056 208 202 3909 + 3908 + 2770 4 8 2317 3056 72 3019 3909 3908 3902 + 3903 + 2771 4 8 3902 3903 27 201 3909 3908 208 + 202 + 2772 4 8 203 200 3056 3019 202 201 3908 + 3903 + 2773 4 8 1 16 3856 3910 1048 3911 3913 + 3912 + 2774 4 8 3856 3910 3068 3914 3913 3912 3807 + 3915 + 2775 4 8 3807 3915 72 3902 3913 3912 1048 + 3911 + 2776 4 8 16 27 3910 3914 3911 3902 3912 + 3915 + 2777 4 8 3068 3059 3861 3916 3503 3505 3860 + 3917 + 2778 4 8 3861 3916 56 3918 3860 3917 3010 + 3919 + 2779 4 8 3010 3919 1056 1849 3860 3917 3503 + 3505 + 2780 4 8 3059 954 3916 3918 3505 1849 3917 + 3919 + 2781 4 8 496 1138 491 3461 1726 3920 3922 + 3921 + 2782 4 8 491 3461 385 2054 3922 3921 998 + 3923 + 2783 4 8 998 3923 861 3924 3922 3921 1726 + 3920 + 2784 4 8 1138 1134 3461 2054 3920 3924 3921 + 3923 + 2785 4 8 496 1138 1726 3920 1145 1141 1724 + 3925 + 2786 4 8 1726 3920 861 3924 1724 3925 1721 + 3926 + 2787 4 8 1721 3926 1143 1137 1724 3925 1145 + 1141 + 2788 4 8 1138 1134 3920 3924 1141 1137 3925 + 3926 + 2789 4 8 1870 3485 3747 3927 1869 3486 3746 + 3928 + 2790 4 8 3747 3927 2209 3108 3746 3928 3585 + 3587 + 2791 4 8 3585 3587 1382 3263 3746 3928 1869 + 3486 + 2792 4 8 3485 552 3927 3108 3486 3263 3928 + 3587 + 2793 4 8 1870 3484 3727 3728 3722 3721 3880 + 3929 + 2794 4 8 3727 3728 1765 3733 3880 3929 3853 + 3854 + 2795 4 8 3853 3854 1143 1952 3880 3929 3722 + 3721 + 2796 4 8 3484 543 3728 3733 3721 1952 3929 + 3854 + 2797 4 8 1094 2939 3130 3930 3931 3932 3934 + 3933 + 2798 4 8 3130 3930 350 1008 3934 3933 3141 + 3935 + 2799 4 8 3141 3935 384 3284 3934 3933 3931 + 3932 + 2800 4 8 2939 870 3930 1008 3932 3284 3933 + 3935 + 2801 4 8 922 2562 3723 3936 1960 3937 3724 + 3938 + 2802 4 8 3723 3936 1870 3485 3724 3938 3484 + 3488 + 2803 4 8 3484 3488 543 546 3724 3938 1960 + 3937 + 2804 4 8 2562 552 3936 3485 3937 546 3938 + 3488 + 2805 4 8 23 22 1616 3939 1411 3644 3941 + 3940 + 2806 4 8 1616 3939 200 201 3941 3940 204 + 205 + 2807 4 8 204 205 213 212 3941 3940 1411 + 3644 + 2808 4 8 22 27 3939 201 3644 212 3940 + 205 + 2809 4 8 209 918 208 3942 3061 3071 3944 + 3943 + 2810 4 8 208 3942 27 2321 3944 3943 2324 + 2325 + 2811 4 8 2324 2325 954 952 3944 3943 3061 + 3071 + 2812 4 8 918 568 3942 2321 3071 952 3943 + 2325 + 2813 4 8 209 3061 208 3944 3065 3060 3946 + 3945 + 2814 4 8 208 3944 27 2324 3946 3945 3914 + 3947 + 2815 4 8 3914 3947 3068 3059 3946 3945 3065 + 3060 + 2816 4 8 3061 954 3944 2324 3060 3059 3945 + 3947 + 2817 4 8 85 175 76 1028 218 3948 3950 + 3949 + 2818 4 8 76 1028 72 1031 3950 3949 2312 + 2318 + 2819 4 8 2312 2318 214 654 3950 3949 218 + 3948 + 2820 4 8 175 176 1028 1031 3948 654 3949 + 2318 + 2821 4 8 500 1517 1516 1520 3479 3480 3952 + 3951 + 2822 4 8 1516 1520 811 812 3952 3951 925 + 2998 + 2823 4 8 925 2998 922 1959 3952 3951 3479 + 3480 + 2824 4 8 1517 557 1520 812 3480 1959 3951 + 2998 + 2825 4 8 3764 3799 3954 3953 3955 3956 3958 + 3957 + 2826 4 8 3954 3953 971 970 3958 3957 969 + 968 + 2827 4 8 969 968 967 966 3958 3957 3955 + 3956 + 2828 4 8 3799 425 3953 970 3956 966 3957 + 968 + 2829 4 8 732 1075 733 1965 1072 1076 2083 + 3959 + 2830 4 8 733 1965 250 1797 2083 3959 1588 + 1796 + 2831 4 8 1588 1796 1084 1083 2083 3959 1072 + 1076 + 2832 4 8 1075 971 1965 1797 1076 1083 3959 + 1796 + 2833 4 8 732 733 1961 1962 735 734 3961 + 3960 + 2834 4 8 1961 1962 425 427 3961 3960 424 + 426 + 2835 4 8 424 426 429 428 3961 3960 735 + 734 + 2836 4 8 733 250 1962 427 734 428 3960 + 426 + 2837 4 8 922 2562 1960 3937 1959 2570 1958 + 3962 + 2838 4 8 1960 3937 543 546 1958 3962 544 + 545 + 2839 4 8 544 545 557 551 1958 3962 1959 + 2570 + 2840 4 8 2562 552 3937 546 2570 551 3962 + 545 + 2841 4 8 1870 3485 3723 3936 3747 3927 3964 + 3963 + 2842 4 8 3723 3936 922 2562 3964 3963 3082 + 3106 + 2843 4 8 3082 3106 2209 3108 3964 3963 3747 + 3927 + 2844 4 8 3485 552 3936 2562 3927 3108 3963 + 3106 + 2845 4 8 1728 3327 3966 3965 2046 3967 3969 + 3968 + 2846 4 8 3966 3965 934 3970 3969 3968 3972 + 3971 + 2847 4 8 3972 3971 500 1891 3969 3968 2046 + 3967 + 2848 4 8 3327 1885 3965 3970 3967 1891 3968 + 3971 + 2849 4 8 2210 2572 2208 3085 2197 2571 2201 + 3973 + 2850 4 8 2208 3085 2209 3082 2201 3973 2200 + 3974 + 2851 4 8 2200 3974 934 926 2201 3973 2197 + 2571 + 2852 4 8 2572 922 3085 3082 2571 926 3973 + 3974 + 2853 4 8 500 3479 1516 3952 3972 3975 3977 + 3976 + 2854 4 8 1516 3952 811 925 3977 3976 932 + 929 + 2855 4 8 932 929 934 926 3977 3976 3972 + 3975 + 2856 4 8 3479 922 3952 925 3975 926 3976 + 929 + 2857 4 8 3201 3202 3605 3978 3204 3203 3600 + 3979 + 2858 4 8 3605 3978 790 791 3600 3979 3599 + 3625 + 2859 4 8 3599 3625 984 988 3600 3979 3204 + 3203 + 2860 4 8 3202 802 3978 791 3203 988 3979 + 3625 + 2861 4 8 1143 3853 1721 3980 3629 3851 3896 + 3981 + 2862 4 8 1721 3980 861 3288 3896 3981 3765 + 3982 + 2863 4 8 3765 3982 3201 3781 3896 3981 3629 + 3851 + 2864 4 8 3853 1765 3980 3288 3851 3781 3981 + 3982 + 2865 4 8 3201 3205 3781 3983 3765 3768 3982 + 3984 + 2866 4 8 3781 3983 1765 3290 3982 3984 3288 + 3289 + 2867 4 8 3288 3289 861 864 3982 3984 3765 + 3768 + 2868 4 8 3205 870 3983 3290 3768 864 3984 + 3289 + 2869 4 8 2703 3985 3987 3986 3891 3988 3990 + 3989 + 2870 4 8 3987 3986 1765 1763 3990 3989 3290 + 3991 + 2871 4 8 3290 3991 870 2945 3990 3989 3891 + 3988 + 2872 4 8 3985 1098 3986 1763 3988 2945 3989 + 3991 + 2873 4 8 2703 2705 2702 2704 3042 3114 3894 + 3992 + 2874 4 8 2702 2704 790 2706 3894 3992 3835 + 3993 + 2875 4 8 3835 3993 2080 3118 3894 3992 3042 + 3114 + 2876 4 8 2705 1654 2704 2706 3114 3118 3992 + 3993 + 2877 4 8 802 791 3474 3475 3202 3978 3634 + 3994 + 2878 4 8 3474 3475 581 3415 3634 3994 3277 + 3833 + 2879 4 8 3277 3833 3201 3605 3634 3994 3202 + 3978 + 2880 4 8 791 790 3475 3415 3978 3605 3994 + 3833 + 2881 4 8 3737 3876 3996 3995 3783 3997 3999 + 3998 + 2882 4 8 3996 3995 2703 3042 3999 3998 3603 + 3892 + 2883 4 8 3603 3892 3201 3276 3999 3998 3783 + 3997 + 2884 4 8 3876 2080 3995 3042 3997 3276 3998 + 3892 + 2885 4 8 543 3271 3735 3879 3274 3275 3786 + 4000 + 2886 4 8 3735 3879 3737 3876 3786 4000 3783 + 3997 + 2887 4 8 3783 3997 3201 3276 3786 4000 3274 + 3275 + 2888 4 8 3271 2080 3879 3876 3275 3276 4000 + 3997 + 2889 4 8 1728 1731 3327 3326 2193 4001 4003 + 4002 + 2890 4 8 3327 3326 1885 2976 4003 4002 1882 + 4004 + 2891 4 8 1882 4004 394 1594 4003 4002 2193 + 4001 + 2892 4 8 1731 101 3326 2976 4001 1594 4002 + 4004 + 2893 4 8 136 139 525 4005 1878 4006 1879 + 4007 + 2894 4 8 525 4005 394 1594 1879 4007 1882 + 4004 + 2895 4 8 1882 4004 1885 2976 1879 4007 1878 + 4006 + 2896 4 8 139 101 4005 1594 4006 2976 4007 + 4004 + 2897 4 8 861 865 998 1877 1726 2809 3922 + 4008 + 2898 4 8 998 1877 385 1876 3922 4008 491 + 4009 + 2899 4 8 491 4009 496 517 3922 4008 1726 + 2809 + 2900 4 8 865 527 1877 1876 2809 517 4008 + 4009 + 2901 4 8 394 523 498 518 388 4010 494 + 4011 + 2902 4 8 498 518 496 517 494 4011 491 + 4009 + 2903 4 8 491 4009 385 1876 494 4011 388 + 4010 + 2904 4 8 523 527 518 517 4010 1876 4011 + 4009 + 2905 4 8 934 3970 932 4012 3972 3971 3977 + 4013 + 2906 4 8 932 4012 811 1886 3977 4013 1516 + 1888 + 2907 4 8 1516 1888 500 1891 3977 4013 3972 + 3971 + 2908 4 8 3970 1885 4012 1886 3971 1891 4013 + 1888 + 2909 4 8 394 499 1882 2778 2193 3456 4003 + 4014 + 2910 4 8 1882 2778 1885 1891 4003 4014 3327 + 3967 + 2911 4 8 3327 3967 1728 2046 4003 4014 2193 + 3456 + 2912 4 8 499 500 2778 1891 3456 2046 4014 + 3967 + 2913 4 8 984 4015 1945 4016 2834 4017 2835 + 4018 + 2914 4 8 1945 4016 846 835 2835 4018 2840 + 3692 + 2915 4 8 2840 3692 1643 3658 2835 4018 2834 + 4017 + 2916 4 8 4015 15 4016 835 4017 3658 4018 + 3692 + 2917 4 8 2181 3641 4020 4019 2182 4021 4023 + 4022 + 2918 4 8 4020 4019 2061 4024 4023 4022 2064 + 4025 + 2919 4 8 2064 4025 1181 4026 4023 4022 2182 + 4021 + 2920 4 8 3641 2694 4019 4024 4021 4026 4022 + 4025 + 2921 4 8 463 457 2485 4027 4028 4029 4031 + 4030 + 2922 4 8 2485 4027 148 179 4031 4030 186 + 180 + 2923 4 8 186 180 187 177 4031 4030 4028 + 4029 + 2924 4 8 457 134 4027 179 4029 177 4030 + 180 + 2925 4 8 148 479 185 480 179 4032 182 + 4033 + 2926 4 8 185 480 121 122 182 4033 125 + 126 + 2927 4 8 125 126 134 133 182 4033 179 + 4032 + 2928 4 8 479 135 480 122 4032 133 4033 + 126 + 2929 4 8 1927 1926 2616 2767 1918 1919 2614 + 4034 + 2930 4 8 2616 2767 1508 2772 2614 4034 2611 + 3533 + 2931 4 8 2611 3533 1914 1915 2614 4034 1918 + 1919 + 2932 4 8 1926 1928 2767 2772 1919 1915 4034 + 3533 + 2933 4 8 803 804 4036 4035 806 805 4038 + 4037 + 2934 4 8 4036 4035 1927 2993 4038 4037 4040 + 4039 + 2935 4 8 4040 4039 121 183 4038 4037 806 + 805 + 2936 4 8 804 187 4035 2993 805 183 4037 + 4039 + 2937 4 8 1927 3523 4042 4041 1918 3525 4044 + 4043 + 2938 4 8 4042 4041 2618 4045 4044 4043 2622 + 4046 + 2939 4 8 2622 4046 1914 2642 4044 4043 1918 + 3525 + 2940 4 8 3523 1523 4041 4045 3525 2642 4043 + 4046 + 2941 4 8 488 4047 486 4048 481 4049 484 + 4050 + 2942 4 8 486 4048 121 124 484 4050 122 + 123 + 2943 4 8 122 123 135 129 484 4050 481 + 4049 + 2944 4 8 4047 130 4048 124 4049 129 4050 + 123 + 2945 4 8 2236 2238 3779 3777 2230 2234 4052 + 4051 + 2946 4 8 3779 3777 463 2760 4052 4051 457 + 2762 + 2947 4 8 457 2762 134 2231 4052 4051 2230 + 2234 + 2948 4 8 2238 1713 3777 2760 2234 2231 4051 + 2762 + 2949 4 8 121 3674 806 4053 124 4054 4056 + 4055 + 2950 4 8 806 4053 803 3341 4056 4055 3350 + 3351 + 2951 4 8 3350 3351 130 3354 4056 4055 124 + 4054 + 2952 4 8 3674 2597 4053 3341 4054 3354 4055 + 3351 + 2953 4 8 187 2993 2987 2990 4057 4058 4060 + 4059 + 2954 4 8 2987 2990 2500 2766 4060 4059 2501 + 4061 + 2955 4 8 2501 4061 2236 2617 4060 4059 4057 + 4058 + 2956 4 8 2993 1927 2990 2766 4058 2617 4059 + 4061 + 2957 4 8 743 2726 736 4062 2339 4063 4065 + 4064 + 2958 4 8 736 4062 732 4066 4065 4064 4068 + 4067 + 2959 4 8 4068 4067 271 270 4065 4064 2339 + 4063 + 2960 4 8 2726 57 4062 4066 4063 270 4064 + 4067 + 2961 4 8 1080 1079 3245 4069 3243 4070 3244 + 4071 + 2962 4 8 3245 4069 743 1583 3244 4071 2908 + 3809 + 2963 4 8 2908 3809 42 1118 3244 4071 3243 + 4070 + 2964 4 8 1079 1084 4069 1583 4070 1118 4071 + 3809 + 2965 4 8 271 3817 4068 4072 2339 4073 4065 + 4074 + 2966 4 8 4068 4072 732 1074 4065 4074 736 + 4075 + 2967 4 8 736 4075 743 3245 4065 4074 2339 + 4073 + 2968 4 8 3817 1080 4072 1074 4073 3245 4074 + 4075 + 2969 4 8 2061 3028 4077 4076 2065 3211 4079 + 4078 + 2970 4 8 4077 4076 1080 1082 4079 4078 1079 + 1081 + 2971 4 8 1079 1081 1084 1083 4079 4078 2065 + 3211 + 2972 4 8 3028 971 4076 1082 3211 1083 4078 + 1081 + 2973 4 8 271 4080 4068 4081 3817 4082 4072 + 4083 + 2974 4 8 4068 4081 732 1075 4072 4083 1074 + 1078 + 2975 4 8 1074 1078 1080 1082 4072 4083 3817 + 4082 + 2976 4 8 4080 971 4081 1075 4082 1082 4083 + 1078 + 2977 4 8 984 4084 1931 4085 3636 4086 4088 + 4087 + 2978 4 8 1931 4085 845 3594 4088 4087 4090 + 4089 + 2979 4 8 4090 4089 2181 4091 4088 4087 3636 + 4086 + 2980 4 8 4084 1098 4085 3594 4086 4091 4087 + 4089 + 2981 4 8 1098 4091 4084 4086 3985 4092 4094 + 4093 + 2982 4 8 4084 4086 984 3636 4094 4093 3598 + 3638 + 2983 4 8 3598 3638 2703 3643 4094 4093 3985 + 4092 + 2984 4 8 4091 2181 4086 3636 4092 3643 4093 + 3638 + 2985 4 8 406 3866 410 4095 1865 3867 1868 + 4096 + 2986 4 8 410 4095 110 377 1868 4096 1872 + 4097 + 2987 4 8 1872 4097 1870 3873 1868 4096 1865 + 3867 + 2988 4 8 3866 384 4095 377 3867 3873 4096 + 4097 + 2989 4 8 384 1003 4099 4098 996 997 4101 + 4100 + 2990 4 8 4099 4098 1134 2054 4101 4100 3924 + 3923 + 2991 4 8 3924 3923 861 998 4101 4100 996 + 997 + 2992 4 8 1003 385 4098 2054 997 998 4100 + 3923 + 2993 4 8 384 3141 3931 3934 383 3142 4103 + 4102 + 2994 4 8 3931 3934 1094 3130 4103 4102 1093 + 3132 + 2995 4 8 1093 3132 66 1577 4103 4102 383 + 3142 + 2996 4 8 3141 350 3934 3130 3142 1577 4102 + 3132 + 2997 4 8 1134 4099 3924 4101 3886 4104 4106 + 4105 + 2998 4 8 3924 4101 861 996 4106 4105 3288 + 3282 + 2999 4 8 3288 3282 1765 3283 4106 4105 3886 + 4104 + 3000 4 8 4099 384 4101 996 4104 3283 4105 + 3282 + 3001 4 8 55 3246 1779 3811 2342 3249 2338 + 4107 + 3002 4 8 1779 3811 271 3817 2338 4107 2339 + 4073 + 3003 4 8 2339 4073 743 3245 2338 4107 2342 + 3249 + 3004 4 8 3246 1080 3811 3817 3249 3245 4107 + 4073 + 3005 4 8 732 736 1074 4075 1072 2081 1073 + 4108 + 3006 4 8 1074 4075 1080 3245 1073 4108 1079 + 4069 + 3007 4 8 1079 4069 1084 1583 1073 4108 1072 + 2081 + 3008 4 8 736 743 4075 3245 2081 1583 4108 + 4069 + 3009 4 8 271 4109 4068 4110 4080 4111 4081 + 4112 + 3010 4 8 4068 4110 732 4113 4081 4112 1075 + 4114 + 3011 4 8 1075 4114 971 3954 4081 4112 4080 + 4111 + 3012 4 8 4109 3764 4110 4113 4111 3954 4112 + 4114 + 3013 4 8 732 1075 4113 4114 1961 1963 4116 + 4115 + 3014 4 8 4113 4114 3764 3954 4116 4115 3799 + 3953 + 3015 4 8 3799 3953 425 970 4116 4115 1961 + 1963 + 3016 4 8 1075 971 4114 3954 1963 970 4115 + 3953 + 3017 4 8 429 3761 424 3800 735 4117 3961 + 4118 + 3018 4 8 424 3800 425 3799 3961 4118 1961 + 4116 + 3019 4 8 1961 4116 732 4113 3961 4118 735 + 4117 + 3020 4 8 3761 3764 3800 3799 4117 4113 4118 + 4116 + 3021 4 8 2209 3087 2208 3086 3316 3583 4120 + 4119 + 3022 4 8 2208 3086 2210 2437 4120 4119 2435 + 2436 + 3023 4 8 2435 2436 1897 2442 4120 4119 3316 + 3583 + 3024 4 8 3087 1391 3086 2437 3583 2442 4119 + 2436 + 3025 4 8 2205 2207 3095 3096 3331 4121 4123 + 4122 + 3026 4 8 3095 3096 110 3097 4123 4122 1729 + 4124 + 3027 4 8 1729 4124 1728 4125 4123 4122 3331 + 4121 + 3028 4 8 2207 2209 3096 3097 4121 4125 4122 + 4124 + 3029 4 8 66 60 1097 4126 3307 4127 3310 + 4128 + 3030 4 8 1097 4126 1098 1946 3310 4128 3306 + 4129 + 3031 4 8 3306 4129 3303 3757 3310 4128 3307 + 4127 + 3032 4 8 60 57 4126 1946 4127 3757 4128 + 4129 + 3033 4 8 1132 2045 4131 4130 4132 4133 4135 + 4134 + 3034 4 8 4131 4130 3764 3799 4135 4134 3955 + 3956 + 3035 4 8 3955 3956 967 966 4135 4134 4132 + 4133 + 3036 4 8 2045 425 4130 3799 4133 966 4134 + 3956 + 3037 4 8 238 4136 478 4137 239 4138 2060 + 4139 + 3038 4 8 478 4137 368 417 2060 4139 420 + 421 + 3039 4 8 420 421 250 428 2060 4139 239 + 4138 + 3040 4 8 4136 429 4137 417 4138 428 4139 + 421 + 3041 4 8 967 966 961 960 3179 4140 3180 + 4141 + 3042 4 8 961 960 789 959 3180 4141 788 + 3801 + 3043 4 8 788 3801 667 2044 3180 4141 3179 + 4140 + 3044 4 8 966 425 960 959 4140 2044 4141 + 3801 + 3045 4 8 1923 2810 3619 4142 2812 2811 4144 + 4143 + 3046 4 8 3619 4142 1631 3319 4144 4143 3090 + 3320 + 3047 4 8 3090 3320 2205 2816 4144 4143 2812 + 2811 + 3048 4 8 2810 1897 4142 3319 2811 2816 4143 + 3320 + 3049 4 8 2210 2204 2435 4145 4146 4147 4149 + 4148 + 3050 4 8 2435 4145 1897 2816 4149 4148 2819 + 2817 + 3051 4 8 2819 2817 1928 2818 4149 4148 4146 + 4147 + 3052 4 8 2204 2205 4145 2816 4147 2818 4148 + 2817 + 3053 4 8 2205 2812 2818 2815 3099 4150 4152 + 4151 + 3054 4 8 2818 2815 1928 1922 4152 4151 4154 + 4153 + 3055 4 8 4154 4153 2288 3845 4152 4151 3099 + 4150 + 3056 4 8 2812 1923 2815 1922 4150 3845 4151 + 4153 + 3057 4 8 2597 3339 2601 4155 3668 4156 4158 + 4157 + 3058 4 8 2601 4155 2608 3232 4158 4157 2619 + 4159 + 3059 4 8 2619 4159 2618 4045 4158 4157 3668 + 4156 + 3060 4 8 3339 1523 4155 3232 4156 4045 4157 + 4159 + 3061 4 8 136 140 139 143 1878 4160 4006 + 4161 + 3062 4 8 139 143 101 146 4006 4161 2976 + 2977 + 3063 4 8 2976 2977 1885 2482 4006 4161 1878 + 4160 + 3064 4 8 140 148 143 146 4160 2482 4161 + 2977 + 3065 4 8 2500 2985 2770 4162 2766 2986 2765 + 4163 + 3066 4 8 2770 4162 1928 4164 2765 4163 1926 + 4165 + 3067 4 8 1926 4165 1927 2991 2765 4163 2766 + 2986 + 3068 4 8 2985 148 4162 4164 2986 2991 4163 + 4165 + 3069 4 8 2500 2501 2504 2505 3839 4166 3840 + 4167 + 3070 4 8 2504 2505 935 2510 3840 4167 3445 + 3780 + 3071 4 8 3445 3780 463 3779 3840 4167 3839 + 4166 + 3072 4 8 2501 2236 2505 2510 4166 3779 4167 + 3780 + 3073 4 8 2205 2199 3331 4168 2984 4169 3329 + 4170 + 3074 4 8 3331 4168 1728 3966 3329 4170 3327 + 3965 + 3075 4 8 3327 3965 1885 3970 3329 4170 2984 + 4169 + 3076 4 8 2199 934 4168 3966 4169 3970 4170 + 3965 + 3077 4 8 467 2744 2147 4171 466 2745 2751 + 4172 + 3078 4 8 2147 4171 856 2658 2751 4172 2660 + 2661 + 3079 4 8 2660 2661 468 2665 2751 4172 466 + 2745 + 3080 4 8 2744 2246 4171 2658 2745 2665 4172 + 2661 + 3081 4 8 1885 2484 1886 4173 3441 3787 3437 + 4174 + 3082 4 8 1886 4173 811 3450 3437 4174 3438 + 3468 + 3083 4 8 3438 3468 2246 2749 3437 4174 3441 + 3787 + 3084 4 8 2484 463 4173 3450 3787 2749 4174 + 3468 + 3085 4 8 136 3432 3365 3433 1452 4175 3367 + 4176 + 3086 4 8 3365 3433 2154 2240 3367 4176 2155 + 3459 + 3087 4 8 2155 3459 856 2658 3367 4176 1452 + 4175 + 3088 4 8 3432 2246 3433 2240 4175 2658 4176 + 3459 + 3089 4 8 1885 2478 3441 3788 1878 4177 3462 + 4178 + 3090 4 8 3441 3788 2246 2744 3462 4178 3432 + 4179 + 3091 4 8 3432 4179 136 2434 3462 4178 1878 + 4177 + 3092 4 8 2478 467 3788 2744 4177 2434 4178 + 4179 + 3093 4 8 1643 1644 3660 3685 3658 3694 3659 + 4180 + 3094 4 8 3660 3685 972 2794 3659 4180 2688 + 3650 + 3095 4 8 2688 3650 15 1824 3659 4180 3658 + 3694 + 3096 4 8 1644 317 3685 2794 3694 1824 4180 + 3650 + 3097 4 8 607 608 2549 3648 1343 2670 2550 + 4181 + 3098 4 8 2549 3648 1643 1647 2550 4181 2551 + 2803 + 3099 4 8 2551 2803 1342 2671 2550 4181 1343 + 2670 + 3100 4 8 608 337 3648 1647 2670 2671 4181 + 2803 + 3101 4 8 1643 1644 2840 3691 1646 1645 2841 + 4182 + 3102 4 8 2840 3691 846 1630 2841 4182 1629 + 1628 + 3103 4 8 1629 1628 1627 1626 2841 4182 1646 + 1645 + 3104 4 8 1644 317 3691 1630 1645 1626 4182 + 1628 + 3105 4 8 1728 2048 2046 2047 4183 4184 4186 + 4185 + 3106 4 8 2046 2047 500 1135 4186 4185 3751 + 4187 + 3107 4 8 3751 4187 1870 3881 4186 4185 4183 + 4184 + 3108 4 8 2048 1134 2047 1135 4184 3881 4185 + 4187 + 3109 4 8 1728 4183 3717 4188 2048 4184 4190 + 4189 + 3110 4 8 3717 4188 384 3873 4190 4189 4099 + 4191 + 3111 4 8 4099 4191 1134 3881 4190 4189 2048 + 4184 + 3112 4 8 4183 1870 4188 3873 4184 3881 4189 + 4191 + 3113 4 8 1870 3722 3881 3882 3751 3750 4187 + 4192 + 3114 4 8 3881 3882 1134 1137 4187 4192 1135 + 1136 + 3115 4 8 1135 1136 500 1142 4187 4192 3751 + 3750 + 3116 4 8 3722 1143 3882 1137 3750 1142 4192 + 1136 + 3117 4 8 1134 4099 3886 4104 3881 4191 3884 + 4193 + 3118 4 8 3886 4104 1765 3283 3884 4193 3727 + 4194 + 3119 4 8 3727 4194 1870 3873 3884 4193 3881 + 4191 + 3120 4 8 4099 384 4104 3283 4191 3873 4193 + 4194 + 3121 4 8 971 969 3037 4195 4196 4197 4199 + 4198 + 3122 4 8 3037 4195 2703 3044 4199 4198 4201 + 4200 + 3123 4 8 4201 4200 2390 2394 4199 4198 4196 + 4197 + 3124 4 8 969 967 4195 3044 4197 2394 4198 + 4200 + 3125 4 8 789 962 961 965 3036 3035 3047 + 4202 + 3126 4 8 961 965 967 969 3047 4202 3044 + 4195 + 3127 4 8 3044 4195 2703 3037 3047 4202 3036 + 3035 + 3128 4 8 962 971 965 969 3035 3037 4202 + 4195 + 3129 4 8 3201 3781 3603 4203 3783 3782 3999 + 4204 + 3130 4 8 3603 4203 2703 3987 3999 4204 3996 + 4205 + 3131 4 8 3996 4205 3737 3736 3999 4204 3783 + 3782 + 3132 4 8 3781 1765 4203 3987 3782 3736 4204 + 4205 + 3133 4 8 870 3205 3290 3983 3891 3890 3990 + 4206 + 3134 4 8 3290 3983 1765 3781 3990 4206 3987 + 4203 + 3135 4 8 3987 4203 2703 3603 3990 4206 3891 + 3890 + 3136 4 8 3205 3201 3983 3781 3890 3603 4206 + 4203 + 3137 4 8 790 2695 2702 2696 3599 4207 3602 + 4208 + 3138 4 8 2702 2696 2703 2697 3602 4208 3598 + 3640 + 3139 4 8 3598 3640 984 3398 3602 4208 3599 + 4207 + 3140 4 8 2695 2694 2696 2697 4207 3398 4208 + 3640 + 3141 4 8 148 2991 186 2992 185 4209 184 + 4210 + 3142 4 8 186 2992 187 2993 184 4210 183 + 4039 + 3143 4 8 183 4039 121 4040 184 4210 185 + 4209 + 3144 4 8 2991 1927 2992 2993 4209 4040 4210 + 4039 + 3145 4 8 1098 1097 1757 3122 1946 4126 1949 + 4211 + 3146 4 8 1757 3122 37 1768 1949 4211 274 + 3827 + 3147 4 8 274 3827 57 60 1949 4211 1946 + 4126 + 3148 4 8 1097 66 3122 1768 4126 60 4211 + 3827 + 3149 4 8 2061 3028 4213 4212 4077 4076 4215 + 4214 + 3150 4 8 4213 4212 271 4080 4215 4214 3817 + 4082 + 3151 4 8 3817 4082 1080 1082 4215 4214 4077 + 4076 + 3152 4 8 3028 971 4212 4080 4076 1082 4214 + 4082 + 3153 4 8 1098 1089 4217 4216 4218 4219 4221 + 4220 + 3154 4 8 4217 4216 3764 4222 4221 4220 4224 + 4223 + 3155 4 8 4224 4223 2390 4225 4221 4220 4218 + 4219 + 3156 4 8 1089 1085 4216 4222 4219 4225 4220 + 4223 + 3157 4 8 2181 2901 4090 4226 3636 4227 4088 + 4228 + 3158 4 8 4090 4226 845 837 4088 4228 1931 + 4229 + 3159 4 8 1931 4229 984 4015 4088 4228 3636 + 4227 + 3160 4 8 2901 15 4226 837 4227 4015 4228 + 4229 + 3161 4 8 23 22 760 4230 1616 3939 1619 + 4231 + 3162 4 8 760 4230 81 3907 1619 4231 1615 + 3906 + 3163 4 8 1615 3906 200 201 1619 4231 1616 + 3939 + 3164 4 8 22 27 4230 3907 3939 201 4231 + 3906 + 3165 4 8 200 204 1817 4232 1616 3941 1815 + 4233 + 3166 4 8 1817 4232 618 1410 1815 4233 1417 + 1414 + 3167 4 8 1417 1414 23 1411 1815 4233 1616 + 3941 + 3168 4 8 204 213 4232 1410 3941 1411 4233 + 1414 + 3169 4 8 27 3914 3902 3915 208 3946 3909 + 4234 + 3170 4 8 3902 3915 72 3807 3909 4234 2317 + 3806 + 3171 4 8 2317 3806 209 3065 3909 4234 208 + 3946 + 3172 4 8 3914 3068 3915 3807 3946 3065 4234 + 3806 + 3173 4 8 3764 4109 3763 4235 4217 4236 4238 + 4237 + 3174 4 8 3763 4235 57 270 4238 4237 1946 + 1947 + 3175 4 8 1946 1947 1098 1951 4238 4237 4217 + 4236 + 3176 4 8 4109 271 4235 270 4236 1951 4237 + 1947 + 3177 4 8 2618 2619 3667 4239 2621 2620 3850 + 4240 + 3178 4 8 3667 4239 1406 2606 3850 4240 3618 + 3616 + 3179 4 8 3618 3616 1923 2626 3850 4240 2621 + 2620 + 3180 4 8 2619 2608 4239 2606 2620 2626 4240 + 3616 + 3181 4 8 1180 2335 1172 2334 2185 4241 2188 + 4242 + 3182 4 8 1172 2334 42 2305 2188 4242 2184 + 2902 + 3183 4 8 2184 2902 2181 2901 2188 4242 2185 + 4241 + 3184 4 8 2335 15 2334 2305 4241 2901 4242 + 2902 + 3185 4 8 1180 2335 3680 4243 3654 3653 3679 + 4244 + 3186 4 8 3680 4243 984 4015 3679 4244 2834 + 4017 + 3187 4 8 2834 4017 1643 3658 3679 4244 3654 + 3653 + 3188 4 8 2335 15 4243 4015 3653 3658 4244 + 4017 + 3189 4 8 2694 4026 3676 4245 3687 4246 4248 + 4247 + 3190 4 8 3676 4245 1180 1179 4248 4247 1854 + 3121 + 3191 4 8 1854 3121 981 1678 4248 4247 3687 + 4246 + 3192 4 8 4026 1181 4245 1179 4246 1678 4247 + 3121 + 3193 4 8 1110 1844 2087 4249 1178 3682 2336 + 4250 + 3194 4 8 2087 4249 56 3918 2336 4250 2330 + 4251 + 3195 4 8 2330 4251 1180 1850 2336 4250 1178 + 3682 + 3196 4 8 1844 954 4249 3918 3682 1850 4250 + 4251 + 3197 4 8 27 2321 212 4252 2323 2322 3899 + 4253 + 3198 4 8 212 4252 213 1549 3899 4253 2666 + 2668 + 3199 4 8 2666 2668 972 973 3899 4253 2323 + 2322 + 3200 4 8 2321 568 4252 1549 2322 973 4253 + 2668 + 3201 4 8 981 1854 2552 4254 975 1855 4256 + 4255 + 3202 4 8 2552 4254 1643 3654 4256 4255 3660 + 3657 + 3203 4 8 3660 3657 972 1856 4256 4255 975 + 1855 + 3204 4 8 1854 1180 4254 3654 1855 1856 4255 + 3657 + 3205 4 8 972 1787 3660 3684 975 1788 4256 + 4257 + 3206 4 8 3660 3684 1643 2549 4256 4257 2552 + 2553 + 3207 4 8 2552 2553 981 1789 4256 4257 975 + 1788 + 3208 4 8 1787 607 3684 2549 1788 1789 4257 + 2553 + 3209 4 8 1754 2950 3138 4258 2952 2951 3136 + 4259 + 3210 4 8 3138 4258 845 1936 3136 4259 843 + 3493 + 3211 4 8 843 3493 28 1475 3136 4259 2952 + 2951 + 3212 4 8 2950 1478 4258 1936 2951 1475 4259 + 3493 + 3213 4 8 845 844 1931 1943 837 838 4229 + 4260 + 3214 4 8 1931 1943 984 1945 4229 4260 4015 + 4016 + 3215 4 8 4015 4016 15 835 4229 4260 837 + 838 + 3216 4 8 844 846 1943 1945 838 835 4260 + 4016 + 3217 4 8 618 775 617 2784 616 776 615 + 4261 + 3218 4 8 617 2784 337 339 615 4261 336 + 338 + 3219 4 8 336 338 342 340 615 4261 616 + 776 + 3220 4 8 775 341 2784 339 776 340 4261 + 338 + 3221 4 8 341 1038 3566 3565 1040 1039 4263 + 4262 + 3222 4 8 3566 3565 2258 3564 4263 4262 2262 + 3571 + 3223 4 8 2262 3571 430 1041 4263 4262 1040 + 1039 + 3224 4 8 1038 316 3565 3564 1039 1041 4262 + 3571 + 3225 4 8 856 2660 4265 4264 2153 2750 4267 + 4266 + 3226 4 8 4265 4264 2267 2422 4267 4266 2266 + 2425 + 3227 4 8 2266 2425 510 2430 4267 4266 2153 + 2750 + 3228 4 8 2660 468 4264 2422 2750 2430 4266 + 2425 + 3229 4 8 1631 3091 3322 4268 3088 3092 4270 + 4269 + 3230 4 8 3322 4268 1120 3579 4270 4269 2891 + 3589 + 3231 4 8 2891 3589 110 3097 4270 4269 3088 + 3092 + 3232 4 8 3091 2209 4268 3579 3092 3097 4269 + 3589 + 3233 4 8 580 1485 1632 4271 2890 2894 3547 + 4272 + 3234 4 8 1632 4271 1631 3088 3547 4272 3322 + 4270 + 3235 4 8 3322 4270 1120 2891 3547 4272 2890 + 2894 + 3236 4 8 1485 110 4271 3088 2894 2891 4272 + 4270 + 3237 4 8 667 2044 2042 2043 3179 4140 4274 + 4273 + 3238 4 8 2042 2043 1132 2045 4274 4273 4132 + 4133 + 3239 4 8 4132 4133 967 966 4274 4273 3179 + 4140 + 3240 4 8 2044 425 2043 2045 4140 966 4273 + 4133 + 3241 4 8 667 3179 2042 4274 2029 3182 3609 + 4275 + 3242 4 8 2042 4274 1132 4132 3609 4275 1438 + 4276 + 3243 4 8 1438 4276 668 2073 3609 4275 2029 + 3182 + 3244 4 8 3179 967 4274 4132 3182 2073 4275 + 4276 + 3245 4 8 368 4277 478 4278 362 4279 476 + 4280 + 3246 4 8 478 4278 238 405 476 4280 404 + 403 + 3247 4 8 404 403 159 255 476 4280 362 + 4279 + 3248 4 8 4277 71 4278 405 4279 255 4280 + 403 + 3249 4 8 2608 2628 2619 2623 3232 3465 4159 + 4281 + 3250 4 8 2619 2623 2618 2622 4159 4281 4045 + 4046 + 3251 4 8 4045 4046 1523 2642 4159 4281 3232 + 3465 + 3252 4 8 2628 1914 2623 2622 3465 2642 4281 + 4046 + 3253 4 8 2390 2394 4201 4200 2391 2395 4283 + 4282 + 3254 4 8 4201 4200 2703 3044 4283 4282 3042 + 3043 + 3255 4 8 3042 3043 2080 2079 4283 4282 2391 + 2395 + 3256 4 8 2394 967 4200 3044 2395 2079 4282 + 3043 + 3257 4 8 384 3872 3931 4284 3283 4285 4287 + 4286 + 3258 4 8 3931 4284 1094 1088 4287 4286 1758 + 1759 + 3259 4 8 1758 1759 1765 1764 4287 4286 3283 + 4285 + 3260 4 8 3872 1085 4284 1088 4285 1764 4286 + 1759 + 3261 4 8 406 1863 3291 3292 4288 4289 4291 + 4290 + 3262 4 8 3291 3292 1132 1440 4291 4290 3191 + 3194 + 3263 4 8 3191 3194 2390 3190 4291 4290 4288 + 4289 + 3264 4 8 1863 1382 3292 1440 4289 3190 4290 + 3194 + 3265 4 8 3737 3736 3996 4205 4292 4293 4295 + 4294 + 3266 4 8 3996 4205 2703 3987 4295 4294 3985 + 3986 + 3267 4 8 3985 3986 1098 1763 4295 4294 4292 + 4293 + 3268 4 8 3736 1765 4205 3987 4293 1763 4294 + 3986 + 3269 4 8 2390 2393 3191 3192 2394 2397 4297 + 4296 + 3270 4 8 3191 3192 1132 1438 4297 4296 4132 + 4276 + 3271 4 8 4132 4276 967 2073 4297 4296 2394 + 2397 + 3272 4 8 2393 668 3192 1438 2397 2073 4296 + 4276 + 3273 4 8 647 1216 1239 2474 1833 2896 4299 + 4298 + 3274 4 8 1239 2474 150 1123 4299 4298 579 + 2889 + 3275 4 8 579 2889 580 2890 4299 4298 1833 + 2896 + 3276 4 8 1216 1120 2474 1123 2896 2890 4298 + 2889 + 3277 4 8 1132 3296 1130 4300 1124 4301 1127 + 4302 + 3278 4 8 1130 4300 150 151 1127 4302 1123 + 2892 + 3279 4 8 1123 2892 1120 2891 1127 4302 1124 + 4301 + 3280 4 8 3296 110 4300 151 4301 2891 4302 + 2892 + 3281 4 8 2694 2698 4026 4303 3687 3752 4246 + 4304 + 3282 4 8 4026 4303 1181 1776 4246 4304 1678 + 3606 + 3283 4 8 1678 3606 981 3038 4246 4304 3687 + 3752 + 3284 4 8 2698 1654 4303 1776 3752 3038 4304 + 3606 + 3285 4 8 2061 2064 4024 4025 4305 4306 4308 + 4307 + 3286 4 8 4024 4025 2694 4026 4308 4307 2698 + 4303 + 3287 4 8 2698 4303 1654 1776 4308 4307 4305 + 4306 + 3288 4 8 2064 1181 4025 4026 4306 1776 4307 + 4303 + 3289 4 8 2694 3687 3676 4248 3401 4309 3675 + 4310 + 3290 4 8 3676 4248 1180 1854 3675 4310 3654 + 4254 + 3291 4 8 3654 4254 1643 2552 3675 4310 3401 + 4309 + 3292 4 8 3687 981 4248 1854 4309 2552 4310 + 4254 + 3293 4 8 2181 3636 3641 3637 2185 4311 4313 + 4312 + 3294 4 8 3641 3637 2694 3398 4313 4312 3676 + 3678 + 3295 4 8 3676 3678 1180 3680 4313 4312 2185 + 4311 + 3296 4 8 3636 984 3637 3398 4311 3680 4312 + 3678 + 3297 4 8 2694 3400 3398 3399 2695 3688 4207 + 4314 + 3298 4 8 3398 3399 984 3386 4207 4314 3599 + 3622 + 3299 4 8 3599 3622 790 2708 4207 4314 2695 + 3688 + 3300 4 8 3400 1342 3399 3386 3688 2708 4314 + 3622 + 3301 4 8 2694 3401 3400 3404 3687 4309 3690 + 4315 + 3302 4 8 3400 3404 1342 2551 3690 4315 1791 + 2555 + 3303 4 8 1791 2555 981 2552 3690 4315 3687 + 4309 + 3304 4 8 3401 1643 3404 2551 4309 2552 4315 + 2555 + 3305 4 8 467 2744 2434 4179 2147 4171 2433 + 4316 + 3306 4 8 2434 4179 136 3432 2433 4316 1452 + 4175 + 3307 4 8 1452 4175 856 2658 2433 4316 2147 + 4171 + 3308 4 8 2744 2246 4179 3432 4171 2658 4316 + 4175 + 3309 4 8 2258 2262 2261 2265 3566 4263 4318 + 4317 + 3310 4 8 2261 2265 2267 2269 4318 4317 2412 + 4319 + 3311 4 8 2412 4319 341 1040 4318 4317 3566 + 4263 + 3312 4 8 2262 430 2265 2269 4263 1040 4317 + 4319 + 3313 4 8 856 850 858 854 2513 4320 3712 + 4321 + 3314 4 8 858 854 860 851 3712 4321 3559 + 4322 + 3315 4 8 3559 4322 2258 4323 3712 4321 2513 + 4320 + 3316 4 8 850 847 854 851 4320 4323 4321 + 4322 + 3317 4 8 847 3169 850 4324 2657 4325 4327 + 4326 + 3318 4 8 850 4324 856 4265 4327 4326 2660 + 4264 + 3319 4 8 2660 4264 468 2422 4327 4326 2657 + 4325 + 3320 4 8 3169 2267 4324 4265 4325 2422 4326 + 4264 + 3321 4 8 847 3169 2657 4325 2651 3172 2654 + 4328 + 3322 4 8 2657 4325 468 2422 2654 4328 2650 + 4329 + 3323 4 8 2650 4329 2492 3147 2654 4328 2651 + 3172 + 3324 4 8 3169 2267 4325 2422 3172 3147 4328 + 4329 + 3325 4 8 442 446 848 2742 1611 3708 3699 + 4330 + 3326 4 8 848 2742 847 2740 3699 4330 3167 + 4331 + 3327 4 8 3167 4331 342 329 3699 4330 1611 + 3708 + 3328 4 8 446 328 2742 2740 3708 329 4330 + 4331 + 3329 4 8 847 3167 2740 4331 4332 4333 4335 + 4334 + 3330 4 8 2740 4331 328 329 4335 4334 332 + 333 + 3331 4 8 332 333 341 340 4335 4334 4332 + 4333 + 3332 4 8 3167 342 4331 329 4333 340 4334 + 333 + 3333 4 8 1765 3853 3288 3980 3886 3885 4106 + 4336 + 3334 4 8 3288 3980 861 1721 4106 4336 3924 + 3926 + 3335 4 8 3924 3926 1134 1137 4106 4336 3886 + 3885 + 3336 4 8 3853 1143 3980 1721 3885 1137 4336 + 3926 + 3337 4 8 406 1863 4288 4289 4337 4338 4340 + 4339 + 3338 4 8 4288 4289 2390 3190 4340 4339 4342 + 4341 + 3339 4 8 4342 4341 3737 3874 4340 4339 4337 + 4338 + 3340 4 8 1863 1382 4289 3190 4338 3874 4339 + 4341 + 3341 4 8 870 1013 1008 1007 3284 3772 3935 + 4343 + 3342 4 8 1008 1007 350 1006 3935 4343 3141 + 3143 + 3343 4 8 3141 3143 384 1005 3935 4343 3284 + 3772 + 3344 4 8 1013 398 1007 1006 3772 1005 4343 + 3143 + 3345 4 8 2703 3985 3891 3988 3598 4094 3889 + 4344 + 3346 4 8 3891 3988 870 2945 3889 4344 2542 + 4345 + 3347 4 8 2542 4345 984 4084 3889 4344 3598 + 4094 + 3348 4 8 3985 1098 3988 2945 4094 4084 4344 + 4345 + 3349 4 8 971 969 4196 4197 3954 3958 4347 + 4346 + 3350 4 8 4196 4197 2390 2394 4347 4346 4224 + 4348 + 3351 4 8 4224 4348 3764 3955 4347 4346 3954 + 3958 + 3352 4 8 969 967 4197 2394 3958 3955 4346 + 4348 + 3353 4 8 57 270 3763 4235 4066 4067 4350 + 4349 + 3354 4 8 3763 4235 3764 4109 4350 4349 4113 + 4110 + 3355 4 8 4113 4110 732 4068 4350 4349 4066 + 4067 + 3356 4 8 270 271 4235 4109 4067 4068 4349 + 4110 + 3357 4 8 510 2266 2153 4267 2259 2260 2516 + 4351 + 3358 4 8 2153 4267 856 4265 2516 4351 2513 + 4352 + 3359 4 8 2513 4352 2258 2261 2516 4351 2259 + 2260 + 3360 4 8 2266 2267 4267 4265 2260 2261 4351 + 4352 + 3361 4 8 55 3246 46 3247 2903 3810 2906 + 4353 + 3362 4 8 46 3247 42 3243 2906 4353 2184 + 4354 + 3363 4 8 2184 4354 2181 3814 2906 4353 2903 + 3810 + 3364 4 8 3246 1080 3247 3243 3810 3814 4353 + 4354 + 3365 4 8 1098 1951 4091 4355 4356 4357 4359 + 4358 + 3366 4 8 4091 4355 2181 3816 4359 4358 4020 + 4360 + 3367 4 8 4020 4360 2061 4213 4359 4358 4356 + 4357 + 3368 4 8 1951 271 4355 3816 4357 4213 4358 + 4360 + 3369 4 8 510 501 2755 4361 3573 3572 4363 + 4362 + 3370 4 8 2755 4361 134 299 4363 4362 4365 + 4364 + 3371 4 8 4365 4364 593 2251 4363 4362 3573 + 3572 + 3372 4 8 501 296 4361 299 3572 2251 4362 + 4364 + 3373 4 8 341 4332 3566 4366 3560 4367 3563 + 4368 + 3374 4 8 3566 4366 2258 4323 3563 4368 3559 + 4322 + 3375 4 8 3559 4322 860 851 3563 4368 3560 + 4367 + 3376 4 8 4332 847 4366 4323 4367 851 4368 + 4322 + 3377 4 8 496 2241 517 2774 519 3436 520 + 4369 + 3378 4 8 517 2774 527 2166 520 4369 526 + 3830 + 3379 4 8 526 3830 136 3365 520 4369 519 + 3436 + 3380 4 8 2241 2154 2774 2166 3436 3365 4369 + 3830 + 3381 4 8 1507 2104 1505 2107 1499 2880 1502 + 4370 + 3382 4 8 1505 2107 635 1316 1502 4370 1498 + 3829 + 3383 4 8 1498 3829 935 1912 1502 4370 1499 + 2880 + 3384 4 8 2104 1314 2107 1316 2880 1912 4370 + 3829 + 3385 4 8 317 1626 1653 1651 1741 4371 1744 + 4372 + 3386 4 8 1653 1651 337 1652 1744 4372 331 + 4373 + 3387 4 8 331 4373 328 3377 1744 4372 1741 + 4371 + 3388 4 8 1626 1627 1651 1652 4371 3377 4372 + 4373 + 3389 4 8 1627 1652 3377 4373 3375 3396 3376 + 4374 + 3390 4 8 3377 4373 328 331 3376 4374 453 + 2792 + 3391 4 8 453 2792 454 2787 3376 4374 3375 + 3396 + 3392 4 8 1652 337 4373 331 3396 2787 4374 + 2792 + 3393 4 8 341 340 2412 2413 4332 4333 4376 + 4375 + 3394 4 8 2412 2413 2267 2418 4376 4375 3169 + 3168 + 3395 4 8 3169 3168 847 3167 4376 4375 4332 + 4333 + 3396 4 8 340 342 2413 2418 4333 3167 4375 + 3168 + 3397 4 8 430 1040 1034 1037 2253 4377 2256 + 4378 + 3398 4 8 1034 1037 618 775 2256 4378 770 + 769 + 3399 4 8 770 769 593 768 2256 4378 2253 + 4377 + 3400 4 8 1040 341 1037 775 4377 768 4378 + 769 + 3401 4 8 328 2740 332 4335 1467 2739 4380 + 4379 + 3402 4 8 332 4335 341 4332 4380 4379 3560 + 4367 + 3403 4 8 3560 4367 860 851 4380 4379 1467 + 2739 + 3404 4 8 2740 847 4335 4332 2739 851 4379 + 4367 + 3405 4 8 2061 2065 4077 4079 2062 2066 4382 + 4381 + 3406 4 8 4077 4079 1080 1079 4382 4381 3243 + 4070 + 3407 4 8 3243 4070 42 1118 4382 4381 2062 + 2066 + 3408 4 8 2065 1084 4079 1079 2066 1118 4381 + 4070 + 3409 4 8 2181 2182 4020 4023 2184 2183 4384 + 4383 + 3410 4 8 4020 4023 2061 2064 4384 4383 2062 + 2063 + 3411 4 8 2062 2063 42 1170 4384 4383 2184 + 2183 + 3412 4 8 2182 1181 4023 2064 2183 1170 4383 + 2063 + 3413 4 8 2181 4020 3641 4019 3643 4385 3642 + 4386 + 3414 4 8 3641 4019 2694 4024 3642 4386 2697 + 4387 + 3415 4 8 2697 4387 2703 3031 3642 4386 3643 + 4385 + 3416 4 8 4020 2061 4019 4024 4385 3031 4386 + 4387 + 3417 4 8 2061 4305 4024 4308 3031 4388 4387 + 4389 + 3418 4 8 4024 4308 2694 2698 4387 4389 2697 + 2701 + 3419 4 8 2697 2701 2703 2705 4387 4389 3031 + 4388 + 3420 4 8 4305 1654 4308 2698 4388 2705 4389 + 2701 + 3421 4 8 3764 3761 3763 3762 4113 4117 4350 + 4390 + 3422 4 8 3763 3762 57 2728 4350 4390 4066 + 4391 + 3423 4 8 4066 4391 732 735 4350 4390 4113 + 4117 + 3424 4 8 3761 429 3762 2728 4117 735 4390 + 4391 + 3425 4 8 488 1395 4393 4392 4047 4394 4396 + 4395 + 3426 4 8 4393 4392 2597 4397 4396 4395 3354 + 4398 + 3427 4 8 3354 4398 130 4399 4396 4395 4047 + 4394 + 3428 4 8 1395 1407 4392 4397 4394 4399 4395 + 4398 + 3429 4 8 3791 3792 4401 4400 3794 3793 4403 + 4402 + 3430 4 8 4401 4400 1132 4131 4403 4402 2045 + 4130 + 3431 4 8 2045 4130 425 3799 4403 4402 3794 + 3793 + 3432 4 8 3792 3764 4400 4131 3793 3799 4402 + 4130 + 3433 4 8 667 2044 1169 3803 2038 2041 3612 + 4404 + 3434 4 8 1169 3803 250 427 3612 4404 420 + 423 + 3435 4 8 420 423 368 419 3612 4404 2038 + 2041 + 3436 4 8 2044 425 3803 427 2041 419 4404 + 423 + 3437 4 8 372 473 370 4405 363 469 366 + 4406 + 3438 4 8 370 4405 368 4277 366 4406 362 + 4279 + 3439 4 8 362 4279 159 255 366 4406 363 + 469 + 3440 4 8 473 71 4405 4277 469 255 4406 + 4279 + 3441 4 8 394 1594 393 1593 2193 4001 2196 + 4407 + 3442 4 8 393 1593 87 319 2196 4407 1732 + 1735 + 3443 4 8 1732 1735 1728 1731 2196 4407 2193 + 4001 + 3444 4 8 1594 101 1593 319 4001 1731 4407 + 1735 + 3445 4 8 406 3865 4409 4408 3714 4410 4412 + 4411 + 3446 4 8 4409 4408 3764 4222 4412 4411 3754 + 4413 + 3447 4 8 3754 4413 3303 3304 4412 4411 3714 + 4410 + 3448 4 8 3865 1085 4408 4222 4410 3304 4411 + 4413 + 3449 4 8 406 4288 3291 4291 4409 4414 4416 + 4415 + 3450 4 8 3291 4291 1132 3191 4416 4415 4131 + 4417 + 3451 4 8 4131 4417 3764 4224 4416 4415 4409 + 4414 + 3452 4 8 4288 2390 4291 3191 4414 4224 4415 + 4417 + 3453 4 8 406 3865 3714 4410 407 4418 3713 + 4419 + 3454 4 8 3714 4410 3303 3304 3713 4419 3307 + 3308 + 3455 4 8 3307 3308 66 1086 3713 4419 407 + 4418 + 3456 4 8 3865 1085 4410 3304 4418 1086 4419 + 3308 + 3457 4 8 1098 1946 4217 4238 3306 4129 4421 + 4420 + 3458 4 8 4217 4238 3764 3763 4421 4420 3754 + 3758 + 3459 4 8 3754 3758 3303 3757 4421 4420 3306 + 4129 + 3460 4 8 1946 57 4238 3763 4129 3757 4420 + 3758 + 3461 4 8 3791 3795 4423 4422 4424 4425 4427 + 4426 + 3462 4 8 4423 4422 368 417 4427 4426 4277 + 4428 + 3463 4 8 4277 4428 71 4429 4427 4426 4424 + 4425 + 3464 4 8 3795 429 4422 417 4425 4429 4426 + 4428 + 3465 4 8 372 370 473 4405 4430 4431 4433 + 4432 + 3466 4 8 473 4405 71 4277 4433 4432 4424 + 4427 + 3467 4 8 4424 4427 3791 4423 4433 4432 4430 + 4431 + 3468 4 8 370 368 4405 4277 4431 4423 4432 + 4427 + 3469 4 8 372 4430 4435 4434 370 4431 4437 + 4436 + 3470 4 8 4435 4434 1132 4401 4437 4436 2036 + 4438 + 3471 4 8 2036 4438 368 4423 4437 4436 370 + 4431 + 3472 4 8 4430 3791 4434 4401 4431 4423 4436 + 4438 + 3473 4 8 429 417 424 418 3795 4422 3798 + 4439 + 3474 4 8 424 418 425 419 3798 4439 3794 + 4440 + 3475 4 8 3794 4440 3791 4423 3798 4439 3795 + 4422 + 3476 4 8 417 368 418 419 4422 4423 4439 + 4440 + 3477 4 8 3791 4401 4423 4438 3794 4403 4440 + 4441 + 3478 4 8 4423 4438 368 2036 4440 4441 419 + 2039 + 3479 4 8 419 2039 425 2045 4440 4441 3794 + 4403 + 3480 4 8 4401 1132 4438 2036 4403 2045 4441 + 2039 + 3481 4 8 2181 3814 4020 4442 3816 3815 4360 + 4443 + 3482 4 8 4020 4442 2061 4077 4360 4443 4213 + 4215 + 3483 4 8 4213 4215 271 3817 4360 4443 3816 + 3815 + 3484 4 8 3814 1080 4442 4077 3815 3817 4443 + 4215 + 3485 4 8 2181 2185 3641 4313 2182 2186 4021 + 4444 + 3486 4 8 3641 4313 2694 3676 4021 4444 4026 + 4245 + 3487 4 8 4026 4245 1181 1179 4021 4444 2182 + 2186 + 3488 4 8 2185 1180 4313 3676 2186 1179 4444 + 4245 + 3489 4 8 2181 2184 4020 4384 3814 4354 4442 + 4445 + 3490 4 8 4020 4384 2061 2062 4442 4445 4077 + 4382 + 3491 4 8 4077 4382 1080 3243 4442 4445 3814 + 4354 + 3492 4 8 2184 42 4384 2062 4354 3243 4445 + 4382 + 3493 4 8 971 4080 4447 4446 3028 4212 4449 + 4448 + 3494 4 8 4447 4446 1098 1951 4449 4448 4356 + 4357 + 3495 4 8 4356 4357 2061 4213 4449 4448 3028 + 4212 + 3496 4 8 4080 271 4446 1951 4212 4213 4448 + 4357 + 3497 4 8 2181 3636 2185 4311 2901 4227 4241 + 4450 + 3498 4 8 2185 4311 1180 3680 4241 4450 2335 + 4243 + 3499 4 8 2335 4243 15 4015 4241 4450 2901 + 4227 + 3500 4 8 3636 984 4311 3680 4227 4015 4450 + 4243 + 3501 4 8 148 2476 2482 2477 140 2486 4160 + 4451 + 3502 4 8 2482 2477 1885 2478 4160 4451 1878 + 4177 + 3503 4 8 1878 4177 136 2434 4160 4451 140 + 2486 + 3504 4 8 2476 467 2477 2478 2486 2434 4451 + 4177 + 3505 4 8 1870 4183 1872 4452 3747 4453 3744 + 4454 + 3506 4 8 1872 4452 110 1729 3744 4454 3097 + 4124 + 3507 4 8 3097 4124 2209 4125 3744 4454 3747 + 4453 + 3508 4 8 4183 1728 4452 1729 4453 4125 4454 + 4124 + 3509 4 8 1870 3723 3751 3748 4183 4455 4186 + 4456 + 3510 4 8 3751 3748 500 3479 4186 4456 2046 + 4457 + 3511 4 8 2046 4457 1728 4458 4186 4456 4183 + 4455 + 3512 4 8 3723 922 3748 3479 4455 4458 4456 + 4457 + 3513 4 8 1728 1731 1729 1730 3331 3330 4123 + 4459 + 3514 4 8 1729 1730 110 104 4123 4459 3095 + 3098 + 3515 4 8 3095 3098 2205 2978 4123 4459 3331 + 3330 + 3516 4 8 1731 101 1730 104 3330 2978 4459 + 3098 + 3517 4 8 1870 3747 3723 3964 4183 4453 4455 + 4460 + 3518 4 8 3723 3964 922 3082 4455 4460 4458 + 4461 + 3519 4 8 4458 4461 1728 4125 4455 4460 4183 + 4453 + 3520 4 8 3747 2209 3964 3082 4453 4125 4460 + 4461 + 3521 4 8 1927 2993 4036 4035 2617 4058 4463 + 4462 + 3522 4 8 4036 4035 803 804 4463 4462 4465 + 4464 + 3523 4 8 4465 4464 2236 4057 4463 4462 2617 + 4058 + 3524 4 8 2993 187 4035 804 4058 4057 4462 + 4464 + 3525 4 8 2236 2874 4465 4466 2617 3522 4463 + 4467 + 3526 4 8 4465 4466 803 3342 4463 4467 4036 + 4468 + 3527 4 8 4036 4468 1927 3523 4463 4467 2617 + 3522 + 3528 4 8 2874 1523 4466 3342 3522 3523 4467 + 4468 + 3529 4 8 3737 3874 4342 4341 3876 3875 4470 + 4469 + 3530 4 8 4342 4341 2390 3190 4470 4469 2391 + 4471 + 3531 4 8 2391 4471 2080 3301 4470 4469 3876 + 3875 + 3532 4 8 3874 1382 4341 3190 3875 3301 4469 + 4471 + 3533 4 8 1085 1764 3870 4472 4473 4474 4476 + 4475 + 3534 4 8 3870 4472 1870 3727 4476 4475 3729 + 3730 + 3535 4 8 3729 3730 3737 3736 4476 4475 4473 + 4474 + 3536 4 8 1764 1765 4472 3727 4474 3736 4475 + 3730 + 3537 4 8 3737 3876 4342 4470 3996 3995 4478 + 4477 + 3538 4 8 4342 4470 2390 2391 4478 4477 4201 + 4283 + 3539 4 8 4201 4283 2703 3042 4478 4477 3996 + 3995 + 3540 4 8 3876 2080 4470 2391 3995 3042 4477 + 4283 + 3541 4 8 2390 4225 4342 4479 4218 4219 4481 + 4480 + 3542 4 8 4342 4479 3737 4473 4481 4480 4292 + 4482 + 3543 4 8 4292 4482 1098 1089 4481 4480 4218 + 4219 + 3544 4 8 4225 1085 4479 4473 4219 1089 4480 + 4482 + 3545 4 8 2390 4218 4201 4483 4196 4484 4199 + 4485 + 3546 4 8 4201 4483 2703 3985 4199 4485 3037 + 4486 + 3547 4 8 3037 4486 971 4447 4199 4485 4196 + 4484 + 3548 4 8 4218 1098 4483 3985 4484 4447 4485 + 4486 + 3549 4 8 3068 3059 3914 3947 3861 3916 4488 + 4487 + 3550 4 8 3914 3947 27 2324 4488 4487 2692 + 4489 + 3551 4 8 2692 4489 56 3918 4488 4487 3861 + 3916 + 3552 4 8 3059 954 3947 2324 3916 3918 4487 + 4489 + 3553 4 8 803 4490 4036 4491 3342 4492 4468 + 4493 + 3554 4 8 4036 4491 1927 4042 4468 4493 3523 + 4041 + 3555 4 8 3523 4041 1523 4045 4468 4493 3342 + 4492 + 3556 4 8 4490 2618 4491 4042 4492 4045 4493 + 4041 + 3557 4 8 2236 2501 4057 4060 3779 4166 4495 + 4494 + 3558 4 8 4057 4060 187 2987 4495 4494 4028 + 4496 + 3559 4 8 4028 4496 463 3839 4495 4494 3779 + 4166 + 3560 4 8 2501 2500 4060 2987 4166 3839 4494 + 4496 + 3561 4 8 2236 2874 2235 3253 4465 4466 4498 + 4497 + 3562 4 8 2235 3253 834 3252 4498 4497 3513 + 3512 + 3563 4 8 3513 3512 803 3342 4498 4497 4465 + 4466 + 3564 4 8 2874 1523 3253 3252 4466 3342 4497 + 3512 + 3565 4 8 2288 4154 2292 4499 4500 4501 4503 + 4502 + 3566 4 8 2292 4499 148 4164 4503 4502 2991 + 4165 + 3567 4 8 2991 4165 1927 1926 4503 4502 4500 + 4501 + 3568 4 8 4154 1928 4499 4164 4501 1926 4502 + 4165 + 3569 4 8 2500 3839 4505 4504 2985 4506 4508 + 4507 + 3570 4 8 4505 4504 1885 2484 4508 4507 2482 + 2483 + 3571 4 8 2482 2483 148 2485 4508 4507 2985 + 4506 + 3572 4 8 3839 463 4504 2484 4506 2485 4507 + 2483 + 3573 4 8 148 2482 4164 4509 2983 2982 4511 + 4510 + 3574 4 8 4164 4509 1928 4512 4511 4510 2818 + 4513 + 3575 4 8 2818 4513 2205 2984 4511 4510 2983 + 2982 + 3576 4 8 2482 1885 4509 4512 2982 2984 4510 + 4513 + 3577 4 8 934 2634 932 3000 3970 4514 4012 + 4515 + 3578 4 8 932 3000 811 2999 4012 4515 1886 + 4516 + 3579 4 8 1886 4516 1885 4505 4012 4515 3970 + 4514 + 3580 4 8 2634 2500 3000 2999 4514 4505 4515 + 4516 + 3581 4 8 2500 2999 4505 4516 3839 3841 4504 + 4517 + 3582 4 8 4505 4516 1885 1886 4504 4517 2484 + 4173 + 3583 4 8 2484 4173 463 3450 4504 4517 3839 + 3841 + 3584 4 8 2999 811 4516 1886 3841 3450 4517 + 4173 + 3585 4 8 262 263 2216 2729 265 264 2341 + 4518 + 3586 4 8 2216 2729 743 2726 2341 4518 2339 + 4063 + 3587 4 8 2339 4063 271 270 2341 4518 265 + 264 + 3588 4 8 263 57 2729 2726 264 270 4518 + 4063 + 3589 4 8 972 2323 976 2327 2687 2686 4520 + 4519 + 3590 4 8 976 2327 954 2324 4520 4519 3918 + 4489 + 3591 4 8 3918 4489 56 2692 4520 4519 2687 + 2686 + 3592 4 8 2323 27 2327 2324 2686 2692 4519 + 4489 + 3593 4 8 316 1041 314 1805 1148 3570 2780 + 4521 + 3594 4 8 314 1805 312 431 2780 4521 438 + 432 + 3595 4 8 438 432 149 433 2780 4521 1148 + 3570 + 3596 4 8 1041 430 1805 431 3570 433 4521 + 432 + 3597 4 8 1314 1330 1714 4522 1906 3017 2970 + 4523 + 3598 4 8 1714 4522 1227 1328 2970 4523 1358 + 3012 + 3599 4 8 1358 3012 824 1236 2970 4523 1906 + 3017 + 3600 4 8 1330 943 4522 1328 3017 1236 4523 + 3012 + 3601 4 8 3303 4524 4526 4525 3754 4527 4529 + 4528 + 3602 4 8 4526 4525 3791 4401 4529 4528 3792 + 4400 + 3603 4 8 3792 4400 3764 4131 4529 4528 3754 + 4527 + 3604 4 8 4524 1132 4525 4401 4527 4131 4528 + 4400 + 3605 4 8 3303 3754 4526 4529 3756 3755 4531 + 4530 + 3606 4 8 4526 4529 3791 3792 4531 4530 3795 + 3796 + 3607 4 8 3795 3796 429 3761 4531 4530 3756 + 3755 + 3608 4 8 3754 3764 4529 3792 3755 3761 4530 + 3796 + 3609 4 8 3303 3756 4526 4531 3494 4532 4534 + 4533 + 3610 4 8 4526 4531 3791 3795 4534 4533 4424 + 4425 + 3611 4 8 4424 4425 71 4429 4534 4533 3494 + 4532 + 3612 4 8 3756 429 4531 3795 4532 4429 4533 + 4425 + 3613 4 8 110 151 416 1435 3296 4300 4536 + 4535 + 3614 4 8 416 1435 372 371 4536 4535 4435 + 4537 + 3615 4 8 4435 4537 1132 1130 4536 4535 3296 + 4300 + 3616 4 8 151 150 1435 371 4300 1130 4535 + 4537 + 3617 4 8 1132 1130 4435 4537 2036 4538 4437 + 4539 + 3618 4 8 4435 4537 372 371 4437 4539 370 + 369 + 3619 4 8 370 369 368 367 4437 4539 2036 + 4538 + 3620 4 8 1130 150 4537 371 4538 367 4539 + 369 + 3621 4 8 1132 1130 2036 4538 2042 3500 2037 + 4540 + 3622 4 8 2036 4538 368 367 2037 4540 2038 + 3610 + 3623 4 8 2038 3610 667 658 2037 4540 2042 + 3500 + 3624 4 8 1130 150 4538 367 3500 658 4540 + 3610 + 3625 4 8 803 4490 3341 4541 806 4542 4053 + 4543 + 3626 4 8 3341 4541 2597 3668 4053 4543 3674 + 3669 + 3627 4 8 3674 3669 121 3665 4053 4543 806 + 4542 + 3628 4 8 4490 2618 4541 3668 4542 3665 4543 + 3669 + 3629 4 8 803 804 807 808 4465 4464 4545 + 4544 + 3630 4 8 807 808 134 177 4545 4544 2230 + 4546 + 3631 4 8 2230 4546 2236 4057 4545 4544 4465 + 4464 + 3632 4 8 804 187 808 177 4464 4057 4544 + 4546 + 3633 4 8 134 132 125 128 807 3516 810 + 4547 + 3634 4 8 125 128 121 124 810 4547 806 + 4056 + 3635 4 8 806 4056 803 3350 810 4547 807 + 3516 + 3636 4 8 132 130 128 124 3516 3350 4547 + 4056 + 3637 4 8 934 2200 2199 2203 3966 4548 4168 + 4549 + 3638 4 8 2199 2203 2205 2207 4168 4549 3331 + 4121 + 3639 4 8 3331 4121 1728 4125 4168 4549 3966 + 4548 + 3640 4 8 2200 2209 2203 2207 4548 4125 4549 + 4121 + 3641 4 8 2288 2292 4551 4550 4500 4503 4553 + 4552 + 3642 4 8 4551 4550 121 185 4553 4552 4040 + 4209 + 3643 4 8 4040 4209 1927 2991 4553 4552 4500 + 4503 + 3644 4 8 2292 148 4550 185 4503 2991 4552 + 4209 + 3645 4 8 803 4490 3342 4492 3341 4541 3340 + 4554 + 3646 4 8 3342 4492 1523 4045 3340 4554 3339 + 4156 + 3647 4 8 3339 4156 2597 3668 3340 4554 3341 + 4541 + 3648 4 8 4490 2618 4492 4045 4541 3668 4554 + 4156 + 3649 4 8 789 1182 3030 3210 1184 1183 4556 + 4555 + 3650 4 8 3030 3210 2061 2065 4556 4555 2064 + 2068 + 3651 4 8 2064 2068 1181 1189 4556 4555 1184 + 1183 + 3652 4 8 1182 1084 3210 2065 1183 1189 4555 + 2068 + 3653 4 8 789 1184 3030 4556 1770 1772 4558 + 4557 + 3654 4 8 3030 4556 2061 2064 4558 4557 4305 + 4306 + 3655 4 8 4305 4306 1654 1776 4558 4557 1770 + 1772 + 3656 4 8 1184 1181 4556 2064 1772 1776 4557 + 4306 + 3657 4 8 2703 2705 3036 3116 3031 4388 3034 + 4559 + 3658 4 8 3036 3116 789 1770 3034 4559 3030 + 4558 + 3659 4 8 3030 4558 2061 4305 3034 4559 3031 + 4388 + 3660 4 8 2705 1654 3116 1770 4388 4305 4559 + 4558 + 3661 4 8 3737 3874 3735 3877 3729 4560 3732 + 4561 + 3662 4 8 3735 3877 543 3302 3732 4561 3484 + 3483 + 3663 4 8 3484 3483 1870 1869 3732 4561 3729 + 4560 + 3664 4 8 3874 1382 3877 3302 4560 1869 4561 + 3483 + 3665 4 8 1765 3283 1764 4285 3727 4194 4472 + 4562 + 3666 4 8 1764 4285 1085 3872 4472 4562 3870 + 3871 + 3667 4 8 3870 3871 1870 3873 4472 4562 3727 + 4194 + 3668 4 8 3283 384 4285 3872 4194 3873 4562 + 3871 + 3669 4 8 3737 3736 4292 4293 4473 4474 4482 + 4563 + 3670 4 8 4292 4293 1098 1763 4482 4563 1089 + 1762 + 3671 4 8 1089 1762 1085 1764 4482 4563 4473 + 4474 + 3672 4 8 3736 1765 4293 1763 4474 1764 4563 + 1762 + 3673 4 8 429 4429 3756 4532 2728 4564 3760 + 4565 + 3674 4 8 3756 4532 3303 3494 3760 4565 3757 + 4566 + 3675 4 8 3757 4566 57 58 3760 4565 2728 + 4564 + 3676 4 8 4429 71 4532 3494 4564 58 4565 + 4566 + 3677 4 8 262 1068 1063 1062 1970 1971 4568 + 4567 + 3678 4 8 1063 1062 238 1061 4568 4567 399 + 4569 + 3679 4 8 399 4569 70 1967 4568 4567 1970 + 1971 + 3680 4 8 1068 14 1062 1061 1971 1967 4567 + 4569 + 3681 4 8 57 274 263 267 61 3825 2348 + 4570 + 3682 4 8 263 267 262 266 2348 4570 1970 + 1973 + 3683 4 8 1970 1973 70 1969 2348 4570 61 + 3825 + 3684 4 8 274 37 267 266 3825 1969 4570 + 1973 + 3685 4 8 845 2349 2351 2352 4571 4572 4574 + 4573 + 3686 4 8 2351 2352 55 730 4574 4573 1779 + 1777 + 3687 4 8 1779 1777 271 273 4574 4573 4571 + 4572 + 3688 4 8 2349 37 2352 730 4572 273 4573 + 1777 + 3689 4 8 55 1779 2903 3813 2351 4574 4576 + 4575 + 3690 4 8 2903 3813 2181 3816 4576 4575 4090 + 4577 + 3691 4 8 4090 4577 845 4571 4576 4575 2351 + 4574 + 3692 4 8 1779 271 3813 3816 4574 4571 4575 + 4577 + 3693 4 8 149 2511 1154 3710 1148 3567 1151 + 4578 + 3694 4 8 1154 3710 860 3559 1151 4578 1147 + 3558 + 3695 4 8 1147 3558 316 3564 1151 4578 1148 + 3567 + 3696 4 8 2511 2258 3710 3559 3567 3564 4578 + 3558 + 3697 4 8 3303 4526 4524 4525 3499 4579 4581 + 4580 + 3698 4 8 4524 4525 1132 4401 4581 4580 4435 + 4434 + 3699 4 8 4435 4434 372 4430 4581 4580 3499 + 4579 + 3700 4 8 4526 3791 4525 4401 4579 4430 4580 + 4434 + 3701 4 8 1928 2770 3529 3527 4512 4582 4584 + 4583 + 3702 4 8 3529 3527 934 2634 4584 4583 3970 + 4514 + 3703 4 8 3970 4514 1885 4505 4584 4583 4512 + 4582 + 3704 4 8 2770 2500 3527 2634 4582 4505 4583 + 4514 + 3705 4 8 1927 4042 4040 4585 4500 4586 4553 + 4587 + 3706 4 8 4040 4585 121 3665 4553 4587 4551 + 4588 + 3707 4 8 4551 4588 2288 3846 4553 4587 4500 + 4586 + 3708 4 8 4042 2618 4585 3665 4586 3846 4587 + 4588 + 3709 4 8 2258 2513 4323 4320 2261 4352 4590 + 4589 + 3710 4 8 4323 4320 847 850 4590 4589 3169 + 4324 + 3711 4 8 3169 4324 2267 4265 4590 4589 2261 + 4352 + 3712 4 8 2513 856 4320 850 4352 4265 4589 + 4324 + 3713 4 8 1897 3319 3003 3541 2810 4142 3004 + 4591 + 3714 4 8 3003 3541 2608 3542 3004 4591 2626 + 3614 + 3715 4 8 2626 3614 1923 3619 3004 4591 2810 + 4142 + 3716 4 8 3319 1631 3541 3542 4142 3619 4591 + 3614 + 3717 4 8 606 2018 879 2858 2025 2021 3776 + 4592 + 3718 4 8 879 2858 468 2848 3776 4592 3701 + 3702 + 3719 4 8 3701 3702 1258 2020 3776 4592 2025 + 2021 + 3720 4 8 2018 820 2858 2848 2021 2020 4592 + 3702 + 3721 4 8 993 1468 1015 2547 1009 4593 1012 + 4594 + 3722 4 8 1015 2547 870 2548 1012 4594 1008 + 3129 + 3723 4 8 1008 3129 350 2958 1012 4594 1009 + 4593 + 3724 4 8 1468 1478 2547 2548 4593 2958 4594 + 3129 + 3725 4 8 1406 1831 4596 4595 1642 1829 4598 + 4597 + 3726 4 8 4596 4595 163 4599 4598 4597 578 + 4600 + 3727 4 8 578 4600 580 1830 4598 4597 1642 + 1829 + 3728 4 8 1831 1832 4595 4599 1829 1830 4597 + 4600 + 3729 4 8 1407 1405 4397 4601 3222 4602 4604 + 4603 + 3730 4 8 4397 4601 2597 2600 4604 4603 4606 + 4605 + 3731 4 8 4606 4605 1832 1831 4604 4603 3222 + 4602 + 3732 4 8 1405 1406 4601 2600 4602 1831 4603 + 4605 + 3733 4 8 580 1642 2278 2281 578 4598 4608 + 4607 + 3734 4 8 2278 2281 114 1404 4608 4607 4610 + 4609 + 3735 4 8 4610 4609 163 4596 4608 4607 578 + 4598 + 3736 4 8 1642 1406 2281 1404 4598 4596 4607 + 4609 + 3737 4 8 488 1395 1398 1399 4393 4392 4612 + 4611 + 3738 4 8 1398 1399 1406 1405 4612 4611 2600 + 4601 + 3739 4 8 2600 4601 2597 4397 4612 4611 4393 + 4392 + 3740 4 8 1395 1407 1399 1405 4392 4397 4611 + 4601 + 3741 4 8 1897 2816 2435 4145 3316 3318 4120 + 4613 + 3742 4 8 2435 4145 2210 2204 4120 4613 2208 + 2206 + 3743 4 8 2208 2206 2209 2207 4120 4613 3316 + 3318 + 3744 4 8 2816 2205 4145 2204 3318 2207 4613 + 2206 + 3745 4 8 743 2726 741 2727 736 4062 739 + 4614 + 3746 4 8 741 2727 429 2728 739 4614 735 + 4391 + 3747 4 8 735 4391 732 4066 739 4614 736 + 4062 + 3748 4 8 2726 57 2727 2728 4062 4066 4614 + 4391 + 3749 4 8 1927 4042 4500 4586 1925 4615 4617 + 4616 + 3750 4 8 4500 4586 2288 3846 4617 4616 3845 + 3849 + 3751 4 8 3845 3849 1923 2621 4617 4616 1925 + 4615 + 3752 4 8 4042 2618 4586 3846 4615 2621 4616 + 3849 + 3753 4 8 1928 2772 4146 4618 3529 3528 4620 + 4619 + 3754 4 8 4146 4618 2210 2438 4620 4619 2197 + 2820 + 3755 4 8 2197 2820 934 2632 4620 4619 3529 + 3528 + 3756 4 8 2772 1508 4618 2438 3528 2632 4619 + 2820 + 3757 4 8 1923 1922 3845 4153 1925 1924 4617 + 4621 + 3758 4 8 3845 4153 2288 4154 4617 4621 4500 + 4501 + 3759 4 8 4500 4501 1927 1926 4617 4621 1925 + 1924 + 3760 4 8 1922 1928 4153 4154 1924 1926 4621 + 4501 + 3761 4 8 2288 3845 3843 3844 3534 4622 4624 + 4623 + 3762 4 8 3843 3844 1406 3618 4624 4623 1635 + 3617 + 3763 4 8 1635 3617 1631 3619 4624 4623 3534 + 4622 + 3764 4 8 3845 1923 3844 3618 4622 3619 4623 + 3617 + 3765 4 8 2288 2291 3843 4625 4626 4627 4629 + 4628 + 3766 4 8 3843 4625 1406 1404 4629 4628 1398 + 1401 + 3767 4 8 1398 1401 488 1397 4629 4628 4626 + 4627 + 3768 4 8 2291 114 4625 1404 4627 1397 4628 + 1401 + 3769 4 8 1094 2939 2941 2942 3130 3930 4631 + 4630 + 3770 4 8 2941 2942 1940 2938 4631 4630 3125 + 3126 + 3771 4 8 3125 3126 350 1008 4631 4630 3130 + 3930 + 3772 4 8 2939 870 2942 2938 3930 1008 4630 + 3126 + 3773 4 8 1754 4632 1756 4633 3138 4634 3596 + 4635 + 3774 4 8 1756 4633 1098 2947 3596 4635 3594 + 4636 + 3775 4 8 3594 4636 845 1938 3596 4635 3138 + 4634 + 3776 4 8 4632 1940 4633 2947 4634 1938 4635 + 4636 + 3777 4 8 834 2103 3513 3518 3346 3357 3511 + 4637 + 3778 4 8 3513 3518 803 3350 3511 4637 3335 + 3352 + 3779 4 8 3335 3352 226 634 3511 4637 3346 + 3357 + 3780 4 8 2103 130 3518 3350 3357 634 4637 + 3352 + 3781 4 8 214 2309 2312 2313 218 4638 3950 + 4639 + 3782 4 8 2312 2313 72 73 3950 4639 76 + 77 + 3783 4 8 76 77 85 84 3950 4639 218 + 4638 + 3784 4 8 2309 86 2313 73 4638 84 4639 + 77 + 3785 4 8 1832 3222 1831 4602 4599 4640 4595 + 4641 + 3786 4 8 1831 4602 1406 1405 4595 4641 4596 + 4642 + 3787 4 8 4596 4642 163 4643 4595 4641 4599 + 4640 + 3788 4 8 3222 1407 4602 1405 4640 4643 4641 + 4642 + 3789 4 8 114 2291 1404 4625 2276 4644 2277 + 4645 + 3790 4 8 1404 4625 1406 3843 2277 4645 1635 + 4624 + 3791 4 8 1635 4624 1631 3534 2277 4645 2276 + 4644 + 3792 4 8 2291 2288 4625 3843 4644 3534 4645 + 4624 + 3793 4 8 2061 3031 4020 4385 4356 4646 4359 + 4647 + 3794 4 8 4020 4385 2181 3643 4359 4647 4091 + 4092 + 3795 4 8 4091 4092 1098 3985 4359 4647 4356 + 4646 + 3796 4 8 3031 2703 4385 3643 4646 3985 4647 + 4092 + 3797 4 8 1098 3985 4292 4295 4218 4483 4481 + 4648 + 3798 4 8 4292 4295 3737 3996 4481 4648 4342 + 4478 + 3799 4 8 4342 4478 2390 4201 4481 4648 4218 + 4483 + 3800 4 8 3985 2703 4295 3996 4483 4201 4648 + 4478 + 3801 4 8 71 4429 4277 4428 405 4649 4278 + 4650 + 3802 4 8 4277 4428 368 417 4278 4650 478 + 4137 + 3803 4 8 478 4137 238 4136 4278 4650 405 + 4649 + 3804 4 8 4429 429 4428 417 4649 4136 4650 + 4137 + 3805 4 8 350 3125 2953 4651 2958 3128 2954 + 4652 + 3806 4 8 2953 4651 1754 4632 2954 4652 2950 + 4653 + 3807 4 8 2950 4653 1478 1939 2954 4652 2958 + 3128 + 3808 4 8 3125 1940 4651 4632 3128 1939 4652 + 4653 + 3809 4 8 870 2945 2938 2946 2542 4345 2936 + 4654 + 3810 4 8 2938 2946 1940 2947 2936 4654 1932 + 4655 + 3811 4 8 1932 4655 984 4084 2936 4654 2542 + 4345 + 3812 4 8 2945 1098 2946 2947 4345 4084 4654 + 4655 + 3813 4 8 350 2953 3125 4651 3130 4656 4631 + 4657 + 3814 4 8 3125 4651 1940 4632 4631 4657 2941 + 4658 + 3815 4 8 2941 4658 1094 1749 4631 4657 3130 + 4656 + 3816 4 8 2953 1754 4651 4632 4656 1749 4657 + 4658 + 3817 4 8 1832 4606 3222 4604 4659 4660 4662 + 4661 + 3818 4 8 3222 4604 1407 4397 4662 4661 4399 + 4398 + 3819 4 8 4399 4398 130 3354 4662 4661 4659 + 4660 + 3820 4 8 4606 2597 4604 4397 4660 3354 4661 + 4398 + 3821 4 8 2288 2291 3104 4663 3534 4644 3535 + 4664 + 3822 4 8 3104 4663 110 112 3535 4664 3088 + 4665 + 3823 4 8 3088 4665 1631 2276 3535 4664 3534 + 4644 + 3824 4 8 2291 114 4663 112 4644 2276 4664 + 4665 + 3825 4 8 803 4490 806 4542 4036 4491 4038 + 4666 + 3826 4 8 806 4542 121 3665 4038 4666 4040 + 4585 + 3827 4 8 4040 4585 1927 4042 4038 4666 4036 + 4491 + 3828 4 8 4490 2618 4542 3665 4491 4042 4666 + 4585 + 3829 4 8 110 3088 112 4665 1485 4271 4668 + 4667 + 3830 4 8 112 4665 114 2276 4668 4667 2278 + 2279 + 3831 4 8 2278 2279 580 1632 4668 4667 1485 + 4271 + 3832 4 8 3088 1631 4665 2276 4271 1632 4667 + 2279 + 3833 4 8 238 4136 2211 4669 1063 4670 2213 + 4671 + 3834 4 8 2211 4669 743 741 2213 4671 2216 + 2732 + 3835 4 8 2216 2732 262 2733 2213 4671 1063 + 4670 + 3836 4 8 4136 429 4669 741 4670 2733 4671 + 2732 + 3837 4 8 163 162 4610 4672 578 1486 4608 + 4673 + 3838 4 8 4610 4672 114 112 4608 4673 2278 + 4668 + 3839 4 8 2278 4668 580 1485 4608 4673 578 + 1486 + 3840 4 8 162 110 4672 112 1486 1485 4673 + 4668 + 3841 4 8 70 399 1970 4568 69 400 2346 + 4674 + 3842 4 8 1970 4568 262 1063 2346 4674 2344 + 4675 + 3843 4 8 2344 4675 71 405 2346 4674 69 + 400 + 3844 4 8 399 238 4568 1063 400 405 4674 + 4675 + 3845 4 8 3303 4526 3499 4579 3494 4534 3497 + 4676 + 3846 4 8 3499 4579 372 4430 3497 4676 473 + 4433 + 3847 4 8 473 4433 71 4424 3497 4676 3494 + 4534 + 3848 4 8 4526 3791 4579 4430 4534 4424 4676 + 4433 + 3849 4 8 41 1818 306 4677 304 1819 305 + 4678 + 3850 4 8 306 4677 312 1808 305 4678 311 + 1809 + 3851 4 8 311 1809 317 1418 305 4678 304 + 1819 + 3852 4 8 1818 23 4677 1808 1819 1418 4678 + 1809 + 3853 4 8 350 345 352 348 2953 4679 2956 + 4680 + 3854 4 8 352 348 28 31 2956 4680 2952 + 3134 + 3855 4 8 2952 3134 1754 1753 2956 4680 2953 + 4679 + 3856 4 8 345 37 348 31 4679 1753 4680 + 3134 + 3857 4 8 993 1468 1009 4593 1470 1469 2961 + 4681 + 3858 4 8 1009 4593 350 2958 2961 4681 352 + 2957 + 3859 4 8 352 2957 28 1475 2961 4681 1470 + 1469 + 3860 4 8 1468 1478 4593 2958 1469 1475 4681 + 2957 + 3861 4 8 1 2 18 21 4 3 4683 + 4682 + 3862 4 8 18 21 23 25 4683 4682 753 + 4684 + 3863 4 8 753 4684 10 9 4683 4682 4 + 3 + 3864 4 8 2 15 21 25 3 9 4682 + 4684 + 3865 4 8 1 16 3023 4685 18 17 4687 + 4686 + 3866 4 8 3023 4685 81 3907 4687 4686 760 + 4230 + 3867 4 8 760 4230 23 22 4687 4686 18 + 17 + 3868 4 8 16 27 4685 3907 17 22 4686 + 4230 + 3869 4 8 1508 2508 2503 2502 2616 2615 2769 + 4688 + 3870 4 8 2503 2502 2500 2501 2769 4688 2766 + 4061 + 3871 4 8 2766 4061 1927 2617 2769 4688 2616 + 2615 + 3872 4 8 2508 2236 2502 2501 2615 2617 4688 + 4061 + 3873 4 8 71 4429 405 4649 2344 4689 4675 + 4690 + 3874 4 8 405 4649 238 4136 4675 4690 1063 + 4670 + 3875 4 8 1063 4670 262 2733 4675 4690 2344 + 4689 + 3876 4 8 4429 429 4649 4136 4689 2733 4690 + 4670 + 3877 4 8 430 431 434 435 503 3837 506 + 4691 + 3878 4 8 434 435 135 441 506 4691 297 + 4692 + 3879 4 8 297 4692 296 3550 506 4691 503 + 3837 + 3880 4 8 431 312 435 441 3837 3550 4691 + 4692 + 3881 4 8 294 293 452 2137 2541 2540 3380 + 4693 + 3882 4 8 452 2137 328 1461 3380 4693 3377 + 4694 + 3883 4 8 3377 4694 1627 1621 3380 4693 2541 + 2540 + 3884 4 8 293 295 2137 1461 2540 1621 4693 + 4694 + 3885 4 8 593 594 597 598 4365 4695 4697 + 4696 + 3886 4 8 597 598 199 605 4697 4696 357 + 825 + 3887 4 8 357 825 134 826 4697 4696 4365 + 4695 + 3888 4 8 594 606 598 605 4695 826 4696 + 825 + 3889 4 8 134 299 357 360 4365 4364 4697 + 4698 + 3890 4 8 357 360 199 356 4697 4698 597 + 3819 + 3891 4 8 597 3819 593 2251 4697 4698 4365 + 4364 + 3892 4 8 299 296 360 356 4364 2251 4698 + 3819 + 3893 4 8 135 297 133 298 507 502 4700 + 4699 + 3894 4 8 133 298 134 299 4700 4699 2755 + 4361 + 3895 4 8 2755 4361 510 501 4700 4699 507 + 502 + 3896 4 8 297 296 298 299 502 501 4699 + 4361 + 3897 4 8 510 2287 2755 2756 507 2283 4700 + 4701 + 3898 4 8 2755 2756 134 179 4700 4701 133 + 4032 + 3899 4 8 133 4032 135 479 4700 4701 507 + 2283 + 3900 4 8 2287 148 2756 179 2283 479 4701 + 4032 + 3901 4 8 580 573 579 574 1833 1840 4299 + 4702 + 3902 4 8 579 574 150 570 4299 4702 1239 + 1240 + 3903 4 8 1239 1240 647 1205 4299 4702 1833 + 1840 + 3904 4 8 573 237 574 570 1840 1205 4702 + 1240 + 3905 4 8 398 1373 396 4703 389 1874 392 + 4704 + 3906 4 8 396 4703 394 523 392 4704 388 + 4010 + 3907 4 8 388 4010 385 1876 392 4704 389 + 1874 + 3908 4 8 1373 527 4703 523 1874 1876 4704 + 4010 + 3909 4 8 85 84 225 626 218 4638 221 + 4705 + 3910 4 8 225 626 223 630 221 4705 217 + 3424 + 3911 4 8 217 3424 214 2309 221 4705 218 + 4638 + 3912 4 8 84 86 626 630 4638 2309 4705 + 3424 + 3913 4 8 602 623 1230 2110 1266 1262 3013 + 4706 + 3914 4 8 1230 2110 943 936 3013 4706 1328 + 1326 + 3915 4 8 1328 1326 1227 1226 3013 4706 1266 + 1262 + 3916 4 8 623 164 2110 936 1262 1226 4706 + 1326 + 3917 4 8 1227 1714 1329 1716 1328 4522 1327 + 4707 + 3918 4 8 1329 1716 681 1313 1327 4707 1199 + 1333 + 3919 4 8 1199 1333 943 1330 1327 4707 1328 + 4522 + 3920 4 8 1714 1314 1716 1313 4522 1330 4707 + 1333 + 3921 4 8 3303 3494 3307 3495 3757 4566 4127 + 4708 + 3922 4 8 3307 3495 66 65 4127 4708 60 + 59 + 3923 4 8 60 59 57 58 4127 4708 3757 + 4566 + 3924 4 8 3494 71 3495 65 4566 58 4708 + 59 + 3925 4 8 618 888 770 2252 889 892 1046 + 4709 + 3926 4 8 770 2252 593 2251 1046 4709 1043 + 3821 + 3927 4 8 1043 3821 188 516 1046 4709 889 + 892 + 3928 4 8 888 296 2252 2251 892 516 4709 + 3821 + 3929 4 8 1 18 3023 4687 4 4683 3025 + 4710 + 3930 4 8 3023 4687 81 760 3025 4710 754 + 757 + 3931 4 8 754 757 10 753 3025 4710 4 + 4683 + 3932 4 8 18 23 4687 760 4683 753 4710 + 757 + 3933 4 8 250 1168 1108 1289 1798 2191 4712 + 4711 + 3934 4 8 1108 1289 1110 1287 4712 4711 1185 + 2899 + 3935 4 8 1185 2899 789 784 4712 4711 1798 + 2191 + 3936 4 8 1168 785 1289 1287 2191 784 4711 + 2899 + 3937 4 8 789 1182 1185 1186 1798 1799 4712 + 4713 + 3938 4 8 1185 1186 1110 1119 4712 4713 1108 + 2975 + 3939 4 8 1108 2975 250 1588 4712 4713 1798 + 1799 + 3940 4 8 1182 1084 1186 1119 1799 1588 4713 + 2975 + 3941 4 8 250 1169 246 3613 1163 1164 4715 + 4714 + 3942 4 8 246 3613 150 658 4715 4714 660 + 661 + 3943 4 8 660 661 223 666 4715 4714 1163 + 1164 + 3944 4 8 1169 667 3613 658 1164 666 4714 + 661 + 3945 4 8 223 630 660 956 1163 2913 4715 + 4716 + 3946 4 8 660 956 150 248 4715 4716 246 + 247 + 3947 4 8 246 247 250 249 4715 4716 1163 + 2913 + 3948 4 8 630 86 956 248 2913 249 4716 + 247 + 3949 4 8 223 666 252 665 222 2358 251 + 4717 + 3950 4 8 252 665 237 664 251 4717 234 + 2457 + 3951 4 8 234 2457 164 721 251 4717 222 + 2358 + 3952 4 8 666 667 665 664 2358 721 4717 + 2457 + 3953 4 8 677 1394 1896 1895 2469 2559 3410 + 4718 + 3954 4 8 1896 1895 1133 1121 3410 4718 1245 + 2473 + 3955 4 8 1245 2473 647 1216 3410 4718 2469 + 2559 + 3956 4 8 1394 1120 1895 1121 2559 1216 4718 + 2473 + 3957 4 8 394 1155 1594 1592 525 1156 4005 + 4719 + 3958 4 8 1594 1592 101 282 4005 4719 139 + 278 + 3959 4 8 139 278 136 276 4005 4719 525 + 1156 + 3960 4 8 1155 280 1592 282 1156 276 4719 + 278 + 3961 4 8 398 1373 1375 1376 396 4703 1580 + 4720 + 3962 4 8 1375 1376 280 1160 1580 4720 1155 + 1157 + 3963 4 8 1155 1157 394 523 1580 4720 396 + 4703 + 3964 4 8 1373 527 1376 1160 4703 523 4720 + 1157 + 3965 4 8 200 204 203 207 1817 4232 3743 + 4721 + 3966 4 8 203 207 209 211 3743 4721 3741 + 4722 + 3967 4 8 3741 4722 618 1410 3743 4721 1817 + 4232 + 3968 4 8 204 213 207 211 4232 1410 4721 + 4722 + 3969 4 8 209 208 918 3942 211 210 4724 + 4723 + 3970 4 8 918 3942 568 2321 4724 4723 1549 + 4252 + 3971 4 8 1549 4252 213 212 4724 4723 211 + 210 + 3972 4 8 208 27 3942 2321 210 212 4723 + 4252 + 3973 4 8 199 354 357 358 833 2102 831 + 4725 + 3974 4 8 357 358 134 132 831 4725 832 + 3515 + 3975 4 8 832 3515 834 2103 831 4725 833 + 2102 + 3976 4 8 354 130 358 132 2102 2103 4725 + 3515 + 3977 4 8 385 1003 386 3769 389 1004 390 + 4726 + 3978 4 8 386 3769 87 382 390 4726 397 + 3145 + 3979 4 8 397 3145 398 1005 390 4726 389 + 1004 + 3980 4 8 1003 384 3769 382 1004 1005 4726 + 3145 + 3981 4 8 1923 1917 2810 3007 1922 1916 2813 + 4727 + 3982 4 8 2810 3007 1897 2636 2813 4727 2819 + 3530 + 3983 4 8 2819 3530 1928 1915 2813 4727 1922 + 1916 + 3984 4 8 1917 1914 3007 2636 1916 1915 4727 + 3530 + 3985 4 8 2205 3099 2983 4728 2978 3100 2981 + 4729 + 3986 4 8 2983 4728 148 2292 2981 4729 146 + 2293 + 3987 4 8 146 2293 101 2289 2981 4729 2978 + 3100 + 3988 4 8 3099 2288 4728 2292 3100 2289 4729 + 2293 + 3989 4 8 1627 1629 2836 2839 2833 2832 3383 + 4730 + 3990 4 8 2836 2839 984 1945 3383 4730 987 + 2556 + 3991 4 8 987 2556 993 1471 3383 4730 2833 + 2832 + 3992 4 8 1629 846 2839 1945 2832 1471 4730 + 2556 + 3993 4 8 846 1622 1857 3664 2537 2536 4732 + 4731 + 3994 4 8 1857 3664 41 283 4732 4731 286 + 287 + 3995 4 8 286 287 294 293 4732 4731 2537 + 2536 + 3996 4 8 1622 295 3664 283 2536 293 4731 + 287 + 3997 4 8 2267 2269 2417 4733 2412 4319 2415 + 4734 + 3998 4 8 2417 4733 593 2253 2415 4734 768 + 4377 + 3999 4 8 768 4377 341 1040 2415 4734 2412 + 4319 + 4000 4 8 2269 430 4733 2253 4319 1040 4734 + 4377 + 4001 4 8 213 1549 211 4724 1410 1548 4722 + 4735 + 4002 4 8 211 4724 209 918 4722 4735 3741 + 4736 + 4003 4 8 3741 4736 618 911 4722 4735 1410 + 1548 + 4004 4 8 1549 568 4724 918 1548 911 4735 + 4736 + 4005 4 8 1110 1102 2087 3008 1844 1846 4249 + 4737 + 4006 4 8 2087 3008 56 3010 4249 4737 3918 + 3919 + 4007 4 8 3918 3919 954 1849 4249 4737 1844 + 1846 + 4008 4 8 1102 1056 3008 3010 1846 1849 4737 + 3919 + 4009 4 8 429 4429 2728 4564 2733 4689 2731 + 4738 + 4010 4 8 2728 4564 57 58 2731 4738 263 + 2345 + 4011 4 8 263 2345 262 2344 2731 4738 2733 + 4689 + 4012 4 8 4429 71 4564 58 4689 2344 4738 + 2345 + 4013 4 8 430 2269 2253 4733 509 2268 3575 + 4739 + 4014 4 8 2253 4733 593 2417 3575 4739 3573 + 3705 + 4015 4 8 3573 3705 510 2266 3575 4739 509 + 2268 + 4016 4 8 2269 2267 4733 2417 2268 2266 4739 + 3705 + 4017 4 8 341 4332 2412 4376 3566 4366 4318 + 4740 + 4018 4 8 2412 4376 2267 3169 4318 4740 2261 + 4590 + 4019 4 8 2261 4590 2258 4323 4318 4740 3566 + 4366 + 4020 4 8 4332 847 4376 3169 4366 4323 4740 + 4590 + 4021 4 8 468 2655 2660 2663 2657 2656 4327 + 4741 + 4022 4 8 2660 2663 856 855 4327 4741 850 + 849 + 4023 4 8 850 849 847 848 4327 4741 2657 + 2656 + 4024 4 8 2655 442 2663 855 2656 848 4741 + 849 + 4025 4 8 1928 2770 4512 4582 4164 4162 4509 + 4742 + 4026 4 8 4512 4582 1885 4505 4509 4742 2482 + 4508 + 4027 4 8 2482 4508 148 2985 4509 4742 4164 + 4162 + 4028 4 8 2770 2500 4582 4505 4162 2985 4742 + 4508 + 4029 4 8 1391 2226 2444 4743 1514 2579 2878 + 4744 + 4030 4 8 2444 4743 1508 1496 2878 4744 1503 + 1497 + 4031 4 8 1503 1497 635 1498 2878 4744 1514 + 2579 + 4032 4 8 2226 935 4743 1496 2579 1498 4744 + 1497 + 4033 4 8 935 2226 1496 4743 2576 4745 2822 + 4746 + 4034 4 8 1496 4743 1508 2444 2822 4746 2438 + 2441 + 4035 4 8 2438 2441 2210 2437 2822 4746 2576 + 4745 + 4036 4 8 2226 1391 4743 2444 4745 2437 4746 + 2441 + 4037 4 8 935 2226 2576 4745 923 2567 2574 + 4747 + 4038 4 8 2576 4745 2210 2437 2574 4747 2572 + 3081 + 4039 4 8 2572 3081 922 2564 2574 4747 923 + 2567 + 4040 4 8 2226 1391 4745 2437 2567 2564 4747 + 3081 + 4041 4 8 934 2199 2197 2198 3529 4748 4620 + 4749 + 4042 4 8 2197 2198 2210 2204 4620 4749 4146 + 4147 + 4043 4 8 4146 4147 1928 2818 4620 4749 3529 + 4748 + 4044 4 8 2199 2205 2198 2204 4748 2818 4749 + 4147 + 4045 4 8 1631 3091 3319 3315 3322 4268 3323 + 4750 + 4046 4 8 3319 3315 1897 3316 3323 4750 1898 + 3580 + 4047 4 8 1898 3580 1120 3579 3323 4750 3322 + 4268 + 4048 4 8 3091 2209 3315 3316 4268 3579 4750 + 3580 + 4049 4 8 2205 3099 2818 4152 2983 4728 4511 + 4751 + 4050 4 8 2818 4152 1928 4154 4511 4751 4164 + 4499 + 4051 4 8 4164 4499 148 2292 4511 4751 2983 + 4728 + 4052 4 8 3099 2288 4152 4154 4728 2292 4751 + 4499 + 4053 4 8 238 239 2211 3175 4136 4138 4669 + 4752 + 4054 4 8 2211 3175 743 742 4669 4752 741 + 740 + 4055 4 8 741 740 429 428 4669 4752 4136 + 4138 + 4056 4 8 239 250 3175 742 4138 428 4752 + 740 + 4057 4 8 2390 3190 2393 3189 2391 4471 2392 + 4753 + 4058 4 8 2393 3189 668 1444 2392 4753 2070 + 3299 + 4059 4 8 2070 3299 2080 3301 2392 4753 2391 + 4471 + 4060 4 8 3190 1382 3189 1444 4471 3301 4753 + 3299 + 4061 4 8 2061 3031 4356 4646 3028 3032 4449 + 4754 + 4062 4 8 4356 4646 1098 3985 4449 4754 4447 + 4486 + 4063 4 8 4447 4486 971 3037 4449 4754 3028 + 3032 + 4064 4 8 3031 2703 4646 3985 3032 3037 4754 + 4486 + 4065 4 8 372 414 363 471 416 415 1437 + 4755 + 4066 4 8 363 471 159 261 1437 4755 158 + 4756 + 4067 4 8 158 4756 110 119 1437 4755 416 + 415 + 4068 4 8 414 66 471 261 415 119 4755 + 4756 + 4069 4 8 430 433 2262 3568 509 3578 2263 + 4757 + 4070 4 8 2262 3568 2258 2511 2263 4757 2259 + 2514 + 4071 4 8 2259 2514 510 2151 2263 4757 509 + 3578 + 4072 4 8 433 149 3568 2511 3578 2151 4757 + 2514 + 4073 4 8 1258 2647 3152 3150 3701 3774 3704 + 4758 + 4074 4 8 3152 3150 2492 3147 3704 4758 2650 + 4329 + 4075 4 8 2650 4329 468 2422 3704 4758 3701 + 3774 + 4076 4 8 2647 2267 3150 3147 3774 2422 4758 + 4329 + 4077 4 8 2390 2394 3191 4297 4224 4348 4417 + 4759 + 4078 4 8 3191 4297 1132 4132 4417 4759 4131 + 4135 + 4079 4 8 4131 4135 3764 3955 4417 4759 4224 + 4348 + 4080 4 8 2394 967 4297 4132 4348 3955 4759 + 4135 + 4081 4 8 406 1863 4337 4338 1865 1864 4761 + 4760 + 4082 4 8 4337 4338 3737 3874 4761 4760 3729 + 4560 + 4083 4 8 3729 4560 1870 1869 4761 4760 1865 + 1864 + 4084 4 8 1863 1382 4338 3874 1864 1869 4760 + 4560 + 4085 4 8 581 2721 3195 3196 3415 3416 3832 + 4762 + 4086 4 8 3195 3196 2080 3118 3832 4762 3835 + 3993 + 4087 4 8 3835 3993 790 2706 3832 4762 3415 + 3416 + 4088 4 8 2721 1654 3196 3118 3416 2706 4762 + 3993 + 4089 4 8 3764 3954 4109 4111 4217 4763 4236 + 4764 + 4090 4 8 4109 4111 271 4080 4236 4764 1951 + 4446 + 4091 4 8 1951 4446 1098 4447 4236 4764 4217 + 4763 + 4092 4 8 3954 971 4111 4080 4763 4447 4764 + 4446 + 4093 4 8 500 3479 3972 3975 2046 4457 3969 + 4765 + 4094 4 8 3972 3975 934 926 3969 4765 3966 + 4766 + 4095 4 8 3966 4766 1728 4458 3969 4765 2046 + 4457 + 4096 4 8 3479 922 3975 926 4457 4458 4765 + 4766 + 4097 4 8 187 2987 186 2988 4028 4496 4031 + 4767 + 4098 4 8 186 2988 148 2985 4031 4767 2485 + 4506 + 4099 4 8 2485 4506 463 3839 4031 4767 4028 + 4496 + 4100 4 8 2987 2500 2988 2985 4496 3839 4767 + 4506 + 4101 4 8 463 457 4028 4029 3779 4052 4495 + 4768 + 4102 4 8 4028 4029 187 177 4495 4768 4057 + 4546 + 4103 4 8 4057 4546 2236 2230 4495 4768 3779 + 4052 + 4104 4 8 457 134 4029 177 4052 2230 4768 + 4546 + 4105 4 8 2205 2812 3099 4150 3090 4144 3536 + 4769 + 4106 4 8 3099 4150 2288 3845 3536 4769 3534 + 4622 + 4107 4 8 3534 4622 1631 3619 3536 4769 3090 + 4144 + 4108 4 8 2812 1923 4150 3845 4144 3619 4769 + 4622 + 4109 4 8 3764 4217 4224 4221 3954 4763 4347 + 4770 + 4110 4 8 4224 4221 2390 4218 4347 4770 4196 + 4484 + 4111 4 8 4196 4484 971 4447 4347 4770 3954 + 4763 + 4112 4 8 4217 1098 4221 4218 4763 4447 4770 + 4484 + 4113 4 8 860 1147 3560 3561 1467 1466 4380 + 4771 + 4114 4 8 3560 3561 341 1038 4380 4771 332 + 2527 + 4115 4 8 332 2527 328 1465 4380 4771 1467 + 1466 + 4116 4 8 1147 316 3561 1038 1466 1465 4771 + 2527 + 4117 4 8 317 1626 1741 4371 885 1620 2802 + 4772 + 4118 4 8 1741 4371 328 3377 2802 4772 1461 + 4694 + 4119 4 8 1461 4694 295 1621 2802 4772 885 + 1620 + 4120 4 8 1626 1627 4371 3377 1620 1621 4772 + 4694 + 4121 4 8 1832 4599 1842 4773 3222 4640 3218 + 4774 + 4122 4 8 1842 4773 237 572 3218 4774 3216 + 4775 + 4123 4 8 3216 4775 1407 4643 3218 4774 3222 + 4640 + 4124 4 8 4599 163 4773 572 4640 4643 4774 + 4775 + 4125 4 8 121 3665 3672 3666 4551 4588 4777 + 4776 + 4126 4 8 3672 3666 1406 3667 4777 4776 3843 + 3847 + 4127 4 8 3843 3847 2288 3846 4777 4776 4551 + 4588 + 4128 4 8 3665 2618 3666 3667 4588 3846 4776 + 3847 + 4129 4 8 993 992 2833 3381 2176 2177 2831 + 4778 + 4130 4 8 2833 3381 1627 3375 2831 4778 2541 + 3378 + 4131 4 8 2541 3378 294 450 2831 4778 2176 + 2177 + 4132 4 8 992 454 3381 3375 2177 450 4778 + 3378 + 4133 4 8 2597 3674 2600 3673 4393 4779 4612 + 4780 + 4134 4 8 2600 3673 1406 3672 4612 4780 1398 + 4781 + 4135 4 8 1398 4781 488 486 4612 4780 4393 + 4779 + 4136 4 8 3674 121 3673 3672 4779 486 4780 + 4781 + 4137 4 8 2597 2598 3334 4782 4606 4783 4785 + 4784 + 4138 4 8 3334 4782 226 2467 4785 4784 2091 + 3538 + 4139 4 8 2091 3538 1832 1825 4785 4784 4606 + 4783 + 4140 4 8 2598 1206 4782 2467 4783 1825 4784 + 3538 + 4141 4 8 384 3284 3283 3287 3931 3932 4287 + 4786 + 4142 4 8 3283 3287 1765 3290 4287 4786 1758 + 4787 + 4143 4 8 1758 4787 1094 2939 4287 4786 3931 + 3932 + 4144 4 8 3284 870 3287 3290 3932 2939 4786 + 4787 + 4145 4 8 226 638 940 3225 643 637 4789 + 4788 + 4146 4 8 940 3225 943 1198 4789 4788 1192 + 1195 + 4147 4 8 1192 1195 648 636 4789 4788 643 + 637 + 4148 4 8 638 635 3225 1198 637 636 4788 + 1195 + 4149 4 8 164 936 714 2446 229 937 2464 + 4790 + 4150 4 8 714 2446 648 1192 2464 4790 643 + 4789 + 4151 4 8 643 4789 226 940 2464 4790 229 + 937 + 4152 4 8 936 943 2446 1192 937 940 4790 + 4789 + 4153 4 8 72 3807 1054 4791 2312 3804 2315 + 4792 + 4154 4 8 1054 4791 1056 3503 2315 4792 2311 + 3504 + 4155 4 8 2311 3504 214 3067 2315 4792 2312 + 3804 + 4156 4 8 3807 3068 4791 3503 3804 3067 4792 + 3504 + 4157 4 8 1 16 1048 3911 3023 4685 3863 + 4793 + 4158 4 8 1048 3911 72 3902 3863 4793 75 + 3905 + 4159 4 8 75 3905 81 3907 3863 4793 3023 + 4685 + 4160 4 8 16 27 3911 3902 4685 3907 4793 + 3905 + 4161 4 8 384 3872 383 4794 3931 4284 4103 + 4795 + 4162 4 8 383 4794 66 1086 4103 4795 1093 + 1087 + 4163 4 8 1093 1087 1094 1088 4103 4795 3931 + 4284 + 4164 4 8 3872 1085 4794 1086 4284 1088 4795 + 1087 + 4165 4 8 1765 3290 1763 3991 1758 4787 1761 + 4796 + 4166 4 8 1763 3991 1098 2945 1761 4796 1096 + 2940 + 4167 4 8 1096 2940 1094 2939 1761 4796 1758 + 4787 + 4168 4 8 3290 870 3991 2945 4787 2939 4796 + 2940 + 4169 4 8 1132 3296 1124 4301 1440 3295 3261 + 4797 + 4170 4 8 1124 4301 1120 2891 3261 4797 1386 + 3591 + 4171 4 8 1386 3591 1382 1873 3261 4797 1440 + 3295 + 4172 4 8 3296 110 4301 2891 3295 1873 4797 + 3591 + 4173 4 8 1094 1747 3130 3131 1749 1748 4656 + 4798 + 4174 4 8 3130 3131 350 345 4656 4798 2953 + 4679 + 4175 4 8 2953 4679 1754 1753 4656 4798 1749 + 1748 + 4176 4 8 1747 37 3131 345 1748 1753 4798 + 4679 + 4177 4 8 1940 4632 2947 4633 2941 4658 2944 + 4799 + 4178 4 8 2947 4633 1098 1756 2944 4799 1096 + 1752 + 4179 4 8 1096 1752 1094 1749 2944 4799 2941 + 4658 + 4180 4 8 4632 1754 4633 1756 4658 1749 4799 + 1752 + 4181 4 8 56 2330 3918 4251 2687 3662 4520 + 4800 + 4182 4 8 3918 4251 954 1850 4520 4800 976 + 1852 + 4183 4 8 976 1852 972 1856 4520 4800 2687 + 3662 + 4184 4 8 2330 1180 4251 1850 3662 1856 4800 + 1852 + 4185 4 8 1134 2054 4099 4098 2048 2052 4190 + 4801 + 4186 4 8 4099 4098 384 1003 4190 4801 3717 + 3770 + 4187 4 8 3717 3770 1728 2049 4190 4801 2048 + 2052 + 4188 4 8 2054 385 4098 1003 2052 2049 4801 + 3770 + 4189 4 8 1728 1729 3717 3718 4183 4452 4188 + 4802 + 4190 4 8 3717 3718 384 377 4188 4802 3873 + 4097 + 4191 4 8 3873 4097 1870 1872 4188 4802 4183 + 4452 + 4192 4 8 1729 110 3718 377 4452 1872 4802 + 4097 + 4193 4 8 1 1429 1049 3079 2217 2220 3857 + 4803 + 4194 4 8 1049 3079 1056 1099 3857 4803 3010 + 3011 + 4195 4 8 3010 3011 56 50 3857 4803 2217 + 2220 + 4196 4 8 1429 51 3079 1099 2220 50 4803 + 3011 + 4197 4 8 134 455 458 459 2755 2867 2758 + 4804 + 4198 4 8 458 459 467 466 2758 4804 2146 + 2753 + 4199 4 8 2146 2753 510 2430 2758 4804 2755 + 2867 + 4200 4 8 455 468 459 466 2867 2430 4804 + 2753 + 4201 4 8 1940 2947 1938 4636 1932 4655 1935 + 4805 + 4202 4 8 1938 4636 845 3594 1935 4805 1931 + 4085 + 4203 4 8 1931 4085 984 4084 1935 4805 1932 + 4655 + 4204 4 8 2947 1098 4636 3594 4655 4084 4805 + 4085 + 4205 4 8 1754 4632 3138 4634 2950 4653 4258 + 4806 + 4206 4 8 3138 4634 845 1938 4258 4806 1936 + 1937 + 4207 4 8 1936 1937 1478 1939 4258 4806 2950 + 4653 + 4208 4 8 4632 1940 4634 1938 4653 1939 4806 + 1937 + 4209 4 8 262 1425 1070 2725 1068 1428 1069 + 4807 + 4210 4 8 1070 2725 51 53 1069 4807 1071 + 3078 + 4211 4 8 1071 3078 14 728 1069 4807 1068 + 1428 + 4212 4 8 1425 55 2725 53 1428 728 4807 + 3078 + 4213 4 8 2209 3082 4125 4461 2200 3974 4548 + 4808 + 4214 4 8 4125 4461 1728 4458 4548 4808 3966 + 4766 + 4215 4 8 3966 4766 934 926 4548 4808 2200 + 3974 + 4216 4 8 3082 922 4461 4458 3974 926 4808 + 4766 + 4217 4 8 845 837 4090 4226 2351 2354 4576 + 4809 + 4218 4 8 4090 4226 2181 2901 4576 4809 2903 + 2904 + 4219 4 8 2903 2904 55 724 4576 4809 2351 + 2354 + 4220 4 8 837 15 4226 2901 2354 724 4809 + 2904 + 4221 4 8 845 3594 4571 4810 4090 4089 4577 + 4811 + 4222 4 8 4571 4810 271 1951 4577 4811 3816 + 4355 + 4223 4 8 3816 4355 2181 4091 4577 4811 4090 + 4089 + 4224 4 8 3594 1098 4810 1951 4089 4091 4811 + 4355 + 4225 4 8 214 215 218 219 654 649 3948 + 4812 + 4226 4 8 218 219 85 168 3948 4812 175 + 169 + 4227 4 8 175 169 176 165 3948 4812 654 + 649 + 4228 4 8 215 164 219 168 649 165 4812 + 169 + 4229 4 8 618 886 889 890 3741 3740 4814 + 4813 + 4230 4 8 889 890 188 191 4814 4813 1274 + 1275 + 4231 4 8 1274 1275 209 657 4814 4813 3741 + 3740 + 4232 4 8 886 176 890 191 3740 657 4813 + 1275 + 4233 4 8 209 918 1274 1422 3741 4736 4814 + 4815 + 4234 4 8 1274 1422 188 1272 4814 4815 889 + 1419 + 4235 4 8 889 1419 618 911 4814 4815 3741 + 4736 + 4236 4 8 918 568 1422 1272 4736 911 4815 + 1419 + 4237 4 8 467 2476 465 2479 458 2759 461 + 4816 + 4238 4 8 465 2479 463 2485 461 4816 457 + 4027 + 4239 4 8 457 4027 134 179 461 4816 458 + 2759 + 4240 4 8 2476 148 2479 2485 2759 179 4816 + 4027 + 4241 4 8 488 486 4626 4817 487 485 4819 + 4818 + 4242 4 8 4626 4817 2288 4551 4819 4818 2292 + 4550 + 4243 4 8 2292 4550 148 185 4819 4818 487 + 485 + 4244 4 8 486 121 4817 4551 485 185 4818 + 4550 + 4245 4 8 226 3334 2091 4785 634 3355 4821 + 4820 + 4246 4 8 2091 4785 1832 4606 4821 4820 4659 + 4660 + 4247 4 8 4659 4660 130 3354 4821 4820 634 + 3355 + 4248 4 8 3334 2597 4785 4606 3355 3354 4820 + 4660 + 4249 4 8 580 1830 578 4600 573 1843 576 + 4822 + 4250 4 8 578 4600 163 4599 576 4822 572 + 4773 + 4251 4 8 572 4773 237 1842 576 4822 573 + 1843 + 4252 4 8 1830 1832 4600 4599 1843 1842 4822 + 4773 + 4253 4 8 2597 2598 3339 4823 3334 4782 3333 + 4824 + 4254 4 8 3339 4823 1523 3234 3333 4824 3332 + 3348 + 4255 4 8 3332 3348 226 2467 3333 4824 3334 + 4782 + 4256 4 8 2598 1206 4823 3234 4782 2467 4824 + 3348 + 4257 4 8 647 1205 645 1202 1838 1839 3540 + 4825 + 4258 4 8 645 1202 226 227 3540 4825 2091 + 2094 + 4259 4 8 2091 2094 1832 1842 3540 4825 1838 + 1839 + 4260 4 8 1205 237 1202 227 1839 1842 4825 + 2094 + 4261 4 8 114 2291 112 4663 105 2290 108 + 4826 + 4262 4 8 112 4663 110 3104 108 4826 104 + 3103 + 4263 4 8 104 3103 101 2289 108 4826 105 + 2290 + 4264 4 8 2291 2288 4663 3104 2290 2289 4826 + 3103 + 4265 4 8 2597 2601 2600 2604 3668 4158 3671 + 4827 + 4266 4 8 2600 2604 1406 2606 3671 4827 3667 + 4239 + 4267 4 8 3667 4239 2618 2619 3671 4827 3668 + 4158 + 4268 4 8 2601 2608 2604 2606 4158 2619 4827 + 4239 + 4269 4 8 163 4643 4596 4642 4610 4828 4609 + 4829 + 4270 4 8 4596 4642 1406 1405 4609 4829 1404 + 1403 + 4271 4 8 1404 1403 114 1402 4609 4829 4610 + 4828 + 4272 4 8 4643 1407 4642 1405 4828 1402 4829 + 1403 + 4273 4 8 1523 3234 3339 4823 3232 3235 4155 + 4830 + 4274 4 8 3339 4823 2597 2598 4155 4830 2601 + 2602 + 4275 4 8 2601 2602 2608 2607 4155 4830 3232 + 3235 + 4276 4 8 3234 1206 4823 2598 3235 2607 4830 + 2602 + 4277 4 8 148 2297 2292 2295 487 4831 4819 + 4832 + 4278 4 8 2292 2295 2288 2291 4819 4832 4626 + 4627 + 4279 4 8 4626 4627 488 1397 4819 4832 487 + 4831 + 4280 4 8 2297 114 2295 2291 4831 1397 4832 + 4627 + 4281 4 8 2597 2598 4606 4783 2600 2599 4605 + 4833 + 4282 4 8 4606 4783 1832 1825 4605 4833 1831 + 1826 + 4283 4 8 1831 1826 1406 1641 4605 4833 2600 + 2599 + 4284 4 8 2598 1206 4783 1825 2599 1641 4833 + 1826 + 4285 4 8 1832 2091 4659 4821 2093 2092 4835 + 4834 + 4286 4 8 4659 4821 130 634 4835 4834 174 + 631 + 4287 4 8 174 631 85 230 4835 4834 2093 + 2092 + 4288 4 8 2091 226 4821 634 2092 230 4834 + 631 + 4289 4 8 1928 2772 2819 3532 4146 4618 4149 + 4836 + 4290 4 8 2819 3532 1897 2445 4149 4836 2435 + 2439 + 4291 4 8 2435 2439 2210 2438 4149 4836 4146 + 4618 + 4292 4 8 2772 1508 3532 2445 4618 2438 4836 + 2439 + 4293 4 8 294 2141 286 3360 2537 2827 4732 + 4837 + 4294 4 8 286 3360 41 1603 4732 4837 1857 + 1858 + 4295 4 8 1857 1858 846 1862 4732 4837 2537 + 2827 + 4296 4 8 2141 280 3360 1603 2827 1862 4837 + 1858 + 4297 4 8 3303 3304 3754 4413 3306 3305 4421 + 4838 + 4298 4 8 3754 4413 3764 4222 4421 4838 4217 + 4216 + 4299 4 8 4217 4216 1098 1089 4421 4838 3306 + 3305 + 4300 4 8 3304 1085 4413 4222 3305 1089 4838 + 4216 + 4301 4 8 2205 2199 2984 4169 2818 4748 4513 + 4839 + 4302 4 8 2984 4169 1885 3970 4513 4839 4512 + 4584 + 4303 4 8 4512 4584 1928 3529 4513 4839 2818 + 4748 + 4304 4 8 2199 934 4169 3970 4748 3529 4839 + 4584 + 4305 4 8 593 594 4365 4695 3573 3707 4363 + 4840 + 4306 4 8 4365 4695 134 826 4363 4840 2755 + 2865 + 4307 4 8 2755 2865 510 2429 4363 4840 3573 + 3707 + 4308 4 8 594 606 4695 826 3707 2429 4840 + 2865 + 4309 4 8 81 80 754 3027 83 82 1060 + 4841 + 4310 4 8 754 3027 10 748 1060 4841 1058 + 4842 + 4311 4 8 1058 4842 85 84 1060 4841 83 + 82 + 4312 4 8 80 86 3027 748 82 84 4841 + 4842 + 4313 4 8 845 2349 4571 4572 3594 3593 4810 + 4843 + 4314 4 8 4571 4572 271 273 4810 4843 1951 + 1950 + 4315 4 8 1951 1950 1098 1757 4810 4843 3594 + 3593 + 4316 4 8 2349 37 4572 273 3593 1757 4843 + 1950 + 4317 4 8 1927 4042 1925 4615 1918 4044 1921 + 4844 + 4318 4 8 1925 4615 1923 2621 1921 4844 1917 + 2625 + 4319 4 8 1917 2625 1914 2622 1921 4844 1918 + 4044 + 4320 4 8 4042 2618 4615 2621 4044 2622 4844 + 2625 + 4321 4 8 569 564 1285 2370 1280 2355 1283 + 4845 + 4322 4 8 1285 2370 681 719 1283 4845 722 + 720 + 4323 4 8 722 720 667 721 1283 4845 1280 + 2355 + 4324 4 8 564 164 2370 719 2355 721 4845 + 720 + 4325 4 8 2236 2235 2230 2229 4465 4498 4545 + 4846 + 4326 4 8 2230 2229 134 832 4545 4846 807 + 3519 + 4327 4 8 807 3519 803 3513 4545 4846 4465 + 4498 + 4328 4 8 2235 834 2229 832 4498 3513 4846 + 3519 + 4329 4 8 130 124 3354 4054 4047 4048 4396 + 4847 + 4330 4 8 3354 4054 2597 3674 4396 4847 4393 + 4779 + 4331 4 8 4393 4779 488 486 4396 4847 4047 + 4048 + 4332 4 8 124 121 4054 3674 4048 486 4847 + 4779 + 4333 4 8 85 3220 174 4848 2093 3221 4835 + 4849 + 4334 4 8 174 4848 130 4399 4835 4849 4659 + 4662 + 4335 4 8 4659 4662 1832 3222 4835 4849 2093 + 3221 + 4336 4 8 3220 1407 4848 4399 3221 3222 4849 + 4662 + 4337 4 8 488 486 1398 4781 4626 4817 4629 + 4850 + 4338 4 8 1398 4781 1406 3672 4629 4850 3843 + 4777 + 4339 4 8 3843 4777 2288 4551 4629 4850 4626 + 4817 + 4340 4 8 486 121 4781 3672 4817 4551 4850 + 4777 + 4341 4 8 406 1865 4337 4761 3865 3864 4852 + 4851 + 4342 4 8 4337 4761 3737 3729 4852 4851 4473 + 4476 + 4343 4 8 4473 4476 1085 3870 4852 4851 3865 + 3864 + 4344 4 8 1865 1870 4761 3729 3864 3870 4851 + 4476 + 4345 4 8 406 3866 3865 3869 407 4853 4418 + 4854 + 4346 4 8 3865 3869 1085 3872 4418 4854 1086 + 4794 + 4347 4 8 1086 4794 66 383 4418 4854 407 + 4853 + 4348 4 8 3866 384 3869 3872 4853 383 4854 + 4794 + 4349 4 8 406 409 3714 3716 3291 4855 4857 + 4856 + 4350 4 8 3714 3716 3303 3499 4857 4856 4524 + 4581 + 4351 4 8 4524 4581 1132 4435 4857 4856 3291 + 4855 + 4352 4 8 409 372 3716 3499 4855 4435 4856 + 4581 + 4353 4 8 406 3714 4409 4412 3291 4857 4416 + 4858 + 4354 4 8 4409 4412 3764 3754 4416 4858 4131 + 4527 + 4355 4 8 4131 4527 1132 4524 4416 4858 3291 + 4857 + 4356 4 8 3714 3303 4412 3754 4857 4524 4858 + 4527 + 4357 4 8 406 409 3291 4855 410 413 3294 + 4859 + 4358 4 8 3291 4855 1132 4435 3294 4859 3296 + 4536 + 4359 4 8 3296 4536 110 416 3294 4859 410 + 413 + 4360 4 8 409 372 4855 4435 413 416 4859 + 4536 + 4361 4 8 406 4337 4288 4340 3865 4852 4861 + 4860 + 4362 4 8 4288 4340 2390 4342 4861 4860 4225 + 4479 + 4363 4 8 4225 4479 1085 4473 4861 4860 3865 + 4852 + 4364 4 8 4337 3737 4340 4342 4852 4473 4860 + 4479 + 4365 4 8 406 4409 3865 4408 4288 4414 4861 + 4862 + 4366 4 8 3865 4408 1085 4222 4861 4862 4225 + 4223 + 4367 4 8 4225 4223 2390 4224 4861 4862 4288 + 4414 + 4368 4 8 4409 3764 4408 4222 4414 4224 4862 + 4223 + 4369 4 8 406 3866 407 4853 410 4095 411 + 4863 + 4370 4 8 407 4853 66 383 411 4863 119 + 378 + 4371 4 8 119 378 110 377 411 4863 410 + 4095 + 4372 4 8 3866 384 4853 383 4095 377 4863 + 378 + 4373 4 8 1 16 2217 3900 3856 3910 3859 + 4864 + 4374 4 8 2217 3900 56 2692 3859 4864 3861 + 4488 + 4375 4 8 3861 4488 3068 3914 3859 4864 3856 + 3910 + 4376 4 8 16 27 3900 2692 3910 3914 4864 + 4488 + 4377 4 8 1 1049 1048 1052 3856 3855 3913 + 4865 + 4378 4 8 1048 1052 72 1054 3913 4865 3807 + 4791 + 4379 4 8 3807 4791 3068 3503 3913 4865 3856 + 3855 + 4380 4 8 1049 1056 1052 1054 3855 3503 4865 + 4791 +ENDOFSECTION + ELEMENT GROUP 2.4.6 +GROUP: 1 ELEMENTS: 4380 MATERIAL: 0 NFLAGS: 0 + Block 1 + + + 1 2 3 4 5 6 7 8 9 10 + 11 12 13 14 15 16 17 18 19 20 + 21 22 23 24 25 26 27 28 29 30 + 31 32 33 34 35 36 37 38 39 40 + 41 42 43 44 45 46 47 48 49 50 + 51 52 53 54 55 56 57 58 59 60 + 61 62 63 64 65 66 67 68 69 70 + 71 72 73 74 75 76 77 78 79 80 + 81 82 83 84 85 86 87 88 89 90 + 91 92 93 94 95 96 97 98 99 100 + 101 102 103 104 105 106 107 108 109 110 + 111 112 113 114 115 116 117 118 119 120 + 121 122 123 124 125 126 127 128 129 130 + 131 132 133 134 135 136 137 138 139 140 + 141 142 143 144 145 146 147 148 149 150 + 151 152 153 154 155 156 157 158 159 160 + 161 162 163 164 165 166 167 168 169 170 + 171 172 173 174 175 176 177 178 179 180 + 181 182 183 184 185 186 187 188 189 190 + 191 192 193 194 195 196 197 198 199 200 + 201 202 203 204 205 206 207 208 209 210 + 211 212 213 214 215 216 217 218 219 220 + 221 222 223 224 225 226 227 228 229 230 + 231 232 233 234 235 236 237 238 239 240 + 241 242 243 244 245 246 247 248 249 250 + 251 252 253 254 255 256 257 258 259 260 + 261 262 263 264 265 266 267 268 269 270 + 271 272 273 274 275 276 277 278 279 280 + 281 282 283 284 285 286 287 288 289 290 + 291 292 293 294 295 296 297 298 299 300 + 301 302 303 304 305 306 307 308 309 310 + 311 312 313 314 315 316 317 318 319 320 + 321 322 323 324 325 326 327 328 329 330 + 331 332 333 334 335 336 337 338 339 340 + 341 342 343 344 345 346 347 348 349 350 + 351 352 353 354 355 356 357 358 359 360 + 361 362 363 364 365 366 367 368 369 370 + 371 372 373 374 375 376 377 378 379 380 + 381 382 383 384 385 386 387 388 389 390 + 391 392 393 394 395 396 397 398 399 400 + 401 402 403 404 405 406 407 408 409 410 + 411 412 413 414 415 416 417 418 419 420 + 421 422 423 424 425 426 427 428 429 430 + 431 432 433 434 435 436 437 438 439 440 + 441 442 443 444 445 446 447 448 449 450 + 451 452 453 454 455 456 457 458 459 460 + 461 462 463 464 465 466 467 468 469 470 + 471 472 473 474 475 476 477 478 479 480 + 481 482 483 484 485 486 487 488 489 490 + 491 492 493 494 495 496 497 498 499 500 + 501 502 503 504 505 506 507 508 509 510 + 511 512 513 514 515 516 517 518 519 520 + 521 522 523 524 525 526 527 528 529 530 + 531 532 533 534 535 536 537 538 539 540 + 541 542 543 544 545 546 547 548 549 550 + 551 552 553 554 555 556 557 558 559 560 + 561 562 563 564 565 566 567 568 569 570 + 571 572 573 574 575 576 577 578 579 580 + 581 582 583 584 585 586 587 588 589 590 + 591 592 593 594 595 596 597 598 599 600 + 601 602 603 604 605 606 607 608 609 610 + 611 612 613 614 615 616 617 618 619 620 + 621 622 623 624 625 626 627 628 629 630 + 631 632 633 634 635 636 637 638 639 640 + 641 642 643 644 645 646 647 648 649 650 + 651 652 653 654 655 656 657 658 659 660 + 661 662 663 664 665 666 667 668 669 670 + 671 672 673 674 675 676 677 678 679 680 + 681 682 683 684 685 686 687 688 689 690 + 691 692 693 694 695 696 697 698 699 700 + 701 702 703 704 705 706 707 708 709 710 + 711 712 713 714 715 716 717 718 719 720 + 721 722 723 724 725 726 727 728 729 730 + 731 732 733 734 735 736 737 738 739 740 + 741 742 743 744 745 746 747 748 749 750 + 751 752 753 754 755 756 757 758 759 760 + 761 762 763 764 765 766 767 768 769 770 + 771 772 773 774 775 776 777 778 779 780 + 781 782 783 784 785 786 787 788 789 790 + 791 792 793 794 795 796 797 798 799 800 + 801 802 803 804 805 806 807 808 809 810 + 811 812 813 814 815 816 817 818 819 820 + 821 822 823 824 825 826 827 828 829 830 + 831 832 833 834 835 836 837 838 839 840 + 841 842 843 844 845 846 847 848 849 850 + 851 852 853 854 855 856 857 858 859 860 + 861 862 863 864 865 866 867 868 869 870 + 871 872 873 874 875 876 877 878 879 880 + 881 882 883 884 885 886 887 888 889 890 + 891 892 893 894 895 896 897 898 899 900 + 901 902 903 904 905 906 907 908 909 910 + 911 912 913 914 915 916 917 918 919 920 + 921 922 923 924 925 926 927 928 929 930 + 931 932 933 934 935 936 937 938 939 940 + 941 942 943 944 945 946 947 948 949 950 + 951 952 953 954 955 956 957 958 959 960 + 961 962 963 964 965 966 967 968 969 970 + 971 972 973 974 975 976 977 978 979 980 + 981 982 983 984 985 986 987 988 989 990 + 991 992 993 994 995 996 997 998 999 1000 + 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 + 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 + 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 + 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 + 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 + 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 + 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 + 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 + 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 + 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 + 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 + 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 + 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 + 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 + 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 + 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 + 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 + 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 + 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 + 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 + 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 + 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 + 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 + 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 + 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 + 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 + 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 + 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 + 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 + 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 + 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 + 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 + 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 + 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 + 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 + 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 + 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 + 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 + 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 + 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 + 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 + 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 + 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 + 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 + 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 + 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 + 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 + 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 + 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 + 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 + 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 + 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 + 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 + 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 + 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 + 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 + 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 + 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 + 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 + 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 + 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 + 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 + 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 + 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 + 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 + 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 + 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 + 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 + 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 + 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 + 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 + 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 + 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 + 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 + 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 + 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 + 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 + 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 + 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 + 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 + 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 + 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 + 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 + 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 + 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 + 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 + 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 + 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 + 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 + 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 + 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 + 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 + 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 + 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 + 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 + 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 + 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 + 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 + 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 + 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 + 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 + 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 + 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 + 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 + 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 + 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 + 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 + 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 + 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 + 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 + 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 + 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 + 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 + 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 + 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 + 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 + 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 + 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 + 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 + 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 + 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 + 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 + 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 + 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 + 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 + 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 + 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 + 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 + 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 + 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 + 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 + 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 + 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 + 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 + 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 + 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 + 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 + 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 + 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 + 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 + 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 + 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 + 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 + 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 + 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 + 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 + 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 + 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 + 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 + 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 + 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 + 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 + 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 + 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 + 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 + 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 + 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 + 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 + 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 + 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 + 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 + 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 + 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 + 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 + 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 + 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 + 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 + 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 + 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 + 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 + 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 + 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 + 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 + 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 + 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 + 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 + 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 + 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 + 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 + 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 + 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 + 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 + 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 + 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 + 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 + 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 + 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 + 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 + 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 + 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 + 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 + 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 + 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 + 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 + 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 + 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 + 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 + 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 + 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 + 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 + 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 + 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 + 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 + 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 + 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 + 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 + 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 + 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 + 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 + 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 + 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 + 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 + 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 + 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 + 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 + 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 + 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 + 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 + 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 + 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 + 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 + 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 + 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 + 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 + 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 + 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 + 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 + 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 + 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 + 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 + 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 + 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 + 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 + 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 + 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 + 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 + 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 + 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 + 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 + 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 + 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 + 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 + 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 + 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 + 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 + 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 + 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 + 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 + 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 + 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 + 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 + 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 + 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 + 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 + 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 + 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 + 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 + 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 + 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 + 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 + 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 + 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 + 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 + 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 + 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 + 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 + 3661 3662 3663 3664 3665 3666 3667 3668 3669 3670 + 3671 3672 3673 3674 3675 3676 3677 3678 3679 3680 + 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 + 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 + 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 + 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 + 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 + 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 + 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 + 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 + 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 + 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 + 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 + 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 + 3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 + 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 + 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 + 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 + 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 + 3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 + 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870 + 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 + 3881 3882 3883 3884 3885 3886 3887 3888 3889 3890 + 3891 3892 3893 3894 3895 3896 3897 3898 3899 3900 + 3901 3902 3903 3904 3905 3906 3907 3908 3909 3910 + 3911 3912 3913 3914 3915 3916 3917 3918 3919 3920 + 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 + 3931 3932 3933 3934 3935 3936 3937 3938 3939 3940 + 3941 3942 3943 3944 3945 3946 3947 3948 3949 3950 + 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 + 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 + 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 + 3981 3982 3983 3984 3985 3986 3987 3988 3989 3990 + 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 + 4001 4002 4003 4004 4005 4006 4007 4008 4009 4010 + 4011 4012 4013 4014 4015 4016 4017 4018 4019 4020 + 4021 4022 4023 4024 4025 4026 4027 4028 4029 4030 + 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 + 4041 4042 4043 4044 4045 4046 4047 4048 4049 4050 + 4051 4052 4053 4054 4055 4056 4057 4058 4059 4060 + 4061 4062 4063 4064 4065 4066 4067 4068 4069 4070 + 4071 4072 4073 4074 4075 4076 4077 4078 4079 4080 + 4081 4082 4083 4084 4085 4086 4087 4088 4089 4090 + 4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 + 4101 4102 4103 4104 4105 4106 4107 4108 4109 4110 + 4111 4112 4113 4114 4115 4116 4117 4118 4119 4120 + 4121 4122 4123 4124 4125 4126 4127 4128 4129 4130 + 4131 4132 4133 4134 4135 4136 4137 4138 4139 4140 + 4141 4142 4143 4144 4145 4146 4147 4148 4149 4150 + 4151 4152 4153 4154 4155 4156 4157 4158 4159 4160 + 4161 4162 4163 4164 4165 4166 4167 4168 4169 4170 + 4171 4172 4173 4174 4175 4176 4177 4178 4179 4180 + 4181 4182 4183 4184 4185 4186 4187 4188 4189 4190 + 4191 4192 4193 4194 4195 4196 4197 4198 4199 4200 + 4201 4202 4203 4204 4205 4206 4207 4208 4209 4210 + 4211 4212 4213 4214 4215 4216 4217 4218 4219 4220 + 4221 4222 4223 4224 4225 4226 4227 4228 4229 4230 + 4231 4232 4233 4234 4235 4236 4237 4238 4239 4240 + 4241 4242 4243 4244 4245 4246 4247 4248 4249 4250 + 4251 4252 4253 4254 4255 4256 4257 4258 4259 4260 + 4261 4262 4263 4264 4265 4266 4267 4268 4269 4270 + 4271 4272 4273 4274 4275 4276 4277 4278 4279 4280 + 4281 4282 4283 4284 4285 4286 4287 4288 4289 4290 + 4291 4292 4293 4294 4295 4296 4297 4298 4299 4300 + 4301 4302 4303 4304 4305 4306 4307 4308 4309 4310 + 4311 4312 4313 4314 4315 4316 4317 4318 4319 4320 + 4321 4322 4323 4324 4325 4326 4327 4328 4329 4330 + 4331 4332 4333 4334 4335 4336 4337 4338 4339 4340 + 4341 4342 4343 4344 4345 4346 4347 4348 4349 4350 + 4351 4352 4353 4354 4355 4356 4357 4358 4359 4360 + 4361 4362 4363 4364 4365 4366 4367 4368 4369 4370 + 4371 4372 4373 4374 4375 4376 4377 4378 4379 4380 +ENDOFSECTION + BOUNDARY CONDITIONS 2.4.6 + BC_TOP 1 6 0 6 + 570 4 5 + 569 4 5 + 572 4 5 + 4272 4 1 + 4269 4 1 + 4271 4 3 +ENDOFSECTION + BOUNDARY CONDITIONS 2.4.6 + BC_BOT 1 24 0 6 + 3 4 5 + 2 4 3 + 4 4 2 + 11 4 5 + 10 4 3 + 12 4 2 + 268 4 1 + 265 4 1 + 267 4 3 + 390 4 5 + 389 4 5 + 392 4 5 + 848 4 1 + 845 4 1 + 847 4 3 + 926 4 5 + 925 4 5 + 928 4 5 + 3850 4 5 + 3849 4 5 + 3852 4 5 + 3863 4 5 + 3862 4 3 + 3864 4 2 +ENDOFSECTION + BOUNDARY CONDITIONS 2.4.6 + BC_XPLUS 1 39 0 6 + 45 4 4 + 46 4 4 + 47 4 4 + 73 4 4 + 74 4 4 + 75 4 4 + 141 4 4 + 142 4 4 + 143 4 4 + 170 4 5 + 169 4 5 + 172 4 5 + 206 4 5 + 205 4 5 + 208 4 5 + 226 4 5 + 225 4 5 + 228 4 5 + 275 4 5 + 274 4 3 + 276 4 2 + 363 4 5 + 362 4 3 + 364 4 2 + 698 4 5 + 697 4 5 + 700 4 5 + 2006 4 5 + 2005 4 5 + 2008 4 5 + 3679 4 5 + 3678 4 3 + 3680 4 2 + 4123 4 5 + 4122 4 3 + 4124 4 2 + 4311 4 5 + 4310 4 3 + 4312 4 2 +ENDOFSECTION + BOUNDARY CONDITIONS 2.4.6 + BC_XMINUS 1 39 0 6 + 32 4 1 + 29 4 1 + 31 4 3 + 43 4 5 + 42 4 3 + 44 4 2 + 91 4 5 + 90 4 3 + 92 4 2 + 107 4 5 + 106 4 3 + 108 4 2 + 131 4 5 + 130 4 3 + 132 4 2 + 155 4 5 + 154 4 3 + 156 4 2 + 176 4 1 + 173 4 1 + 175 4 3 + 711 4 5 + 710 4 3 + 712 4 2 + 1134 4 5 + 1133 4 5 + 1136 4 5 + 1139 4 5 + 1138 4 3 + 1140 4 2 + 1551 4 5 + 1550 4 3 + 1552 4 2 + 2139 4 5 + 2138 4 3 + 2140 4 2 + 4280 4 1 + 4277 4 1 + 4279 4 3 +ENDOFSECTION + BOUNDARY CONDITIONS 2.4.6 + BC_YMINUS 1 27 0 6 + 27 4 5 + 26 4 3 + 28 4 2 + 31 4 5 + 30 4 3 + 32 4 2 + 35 4 5 + 34 4 3 + 36 4 2 + 47 4 5 + 46 4 3 + 48 4 2 + 83 4 5 + 82 4 3 + 84 4 2 + 807 4 5 + 806 4 3 + 808 4 2 + 2686 4 5 + 2685 4 5 + 2688 4 5 + 3838 4 5 + 3837 4 5 + 3840 4 5 + 4067 4 5 + 4066 4 3 + 4068 4 2 +ENDOFSECTION + BOUNDARY CONDITIONS 2.4.6 + BC_YPLUS 1 33 0 6 + 51 4 5 + 50 4 3 + 52 4 2 + 100 4 1 + 97 4 1 + 99 4 3 + 278 4 5 + 277 4 5 + 280 4 5 + 410 4 5 + 409 4 5 + 412 4 5 + 1121 4 4 + 1122 4 4 + 1123 4 4 + 2047 4 5 + 2046 4 3 + 2048 4 2 + 2404 4 1 + 2401 4 1 + 2403 4 3 + 2944 4 1 + 2941 4 1 + 2943 4 3 + 3428 4 1 + 3425 4 1 + 3427 4 3 + 3879 4 5 + 3878 4 3 + 3880 4 2 + 4334 4 5 + 4333 4 5 + 4336 4 5 +ENDOFSECTION + BOUNDARY CONDITIONS 2.4.6 + cfd_bc 1 1 0 0 51 +ENDOFSECTION + BOUNDARY CONDITIONS 2.4.6 + cfd_bc 2 1 0 0 51 +ENDOFSECTION + BOUNDARY CONDITIONS 2.4.6 + cfd_bc 3 1 0 0 51 +ENDOFSECTION + BOUNDARY CONDITIONS 2.4.6 + cfd_bc 4 1 0 0 51 +ENDOFSECTION + BOUNDARY CONDITIONS 2.4.6 + cfd_bc 5 1 0 0 51 +ENDOFSECTION + BOUNDARY CONDITIONS 2.4.6 + cfd_bc 6 1 0 0 51 +ENDOFSECTION diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_split2hex_periodic/hopr.ini b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_split2hex_periodic/hopr.ini new file mode 100644 index 000000000..665392440 --- /dev/null +++ b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_split2hex_periodic/hopr.ini @@ -0,0 +1,28 @@ +!=============================================================================== ! +! OUTPUT +!=============================================================================== ! +ProjectName = mesh_cubitDebug_split2hex ! name of the project (used for filenames) +Debugvisu = T +!=============================================================================== ! +! MESH +!=============================================================================== ! +FileName = export_split2hex.neu ! name of mesh file as exported from grid generator +Mode = 2 ! 1 Cartesian 2 gambit file 3 CGNS +meshscale = 0.001 +!=============================================================================== ! +! BOUNDARY CONDITIONS +!=============================================================================== ! +BoundaryName=BC_TOP +BoundaryType=(/4,0,0,0/) +BoundaryName=BC_BOT +BoundaryType=(/4,0,0,0/) +BoundaryName=BC_XMINUS +BoundaryType=(/1,0,0,1/) +BoundaryName=BC_XPLUS +BoundaryType=(/1,0,0,-1/) +BoundaryName=BC_YMINUS +BoundaryType=(/4,0,0,0/) +BoundaryName=BC_YPLUS +BoundaryType=(/4,0,0,0/) + +vv=(/0.001,0.,0./) \ No newline at end of file From 1770eca217ef68dc7551eac20645345640c90ac8 Mon Sep 17 00:00:00 2001 From: Paul Nizenkov Date: Wed, 8 Nov 2023 00:59:45 +0100 Subject: [PATCH 321/495] Bugfix: SampElectronicExcitation=T with more than one electronic excitation case --- src/particles/dsmc/dsmc_analyze.f90 | 10 ++++++---- src/particles/mcc/mcc_init.f90 | 15 ++++++++------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/particles/dsmc/dsmc_analyze.f90 b/src/particles/dsmc/dsmc_analyze.f90 index 577c2a613..1c58fc02e 100644 --- a/src/particles/dsmc/dsmc_analyze.f90 +++ b/src/particles/dsmc/dsmc_analyze.f90 @@ -858,7 +858,7 @@ SUBROUTINE WriteDSMCToHDF5(MeshFileName,OutputTime) !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES CHARACTER(LEN=255) :: FileName -CHARACTER(LEN=255) :: SpecID, LevelID +CHARACTER(LEN=255) :: SpecID, LevelID, SpecID2 CHARACTER(LEN=255),ALLOCATABLE :: StrVarNames(:) CHARACTER(LEN=255),ALLOCATABLE :: StrVarNamesElecExci(:) INTEGER :: nVar,nVar_quality,nVarloc,nVarCount,ALLOCSTAT, iSpec, nVarRelax, nSpecOut, iCase, iLevel @@ -994,22 +994,24 @@ SUBROUTINE WriteDSMCToHDF5(MeshFileName,OutputTime) END IF IF(SampleElecExcitation) THEN - ! Number of excitation outputs (currently only electronic -> only species, multiply for additional excitation) + ! Number of excitation outputs (currently only electronic) ALLOCATE(StrVarNamesElecExci(1:ExcitationLevelCounter)) nVarCount = 1 DO iSpec = 1, nSpecies DO jSpec = iSpec, nSpecies iCase = CollInf%Coll_Case(iSpec,jSpec) IF(.NOT.SpecXSec(iCase)%UseElecXSec) CYCLE - ! Output of the non-election species + ! Output of the non-electron species as first and electron species as the second index, in case multiple electron species are defined IF(SpecDSMC(iSpec)%InterID.EQ.4) THEN WRITE(SpecID,'(I3.3)') jSpec + WRITE(SpecID2,'(I3.3)') iSpec ELSE WRITE(SpecID,'(I3.3)') iSpec + WRITE(SpecID2,'(I3.3)') jSpec END IF DO iLevel = 1, SpecXSec(iCase)%NumElecLevel WRITE(LevelID,'(F0.2)') SpecXSec(iCase)%ElecLevel(iLevel)%Threshold/ElementaryCharge - StrVarNamesElecExci(nVarCount)='Spec'//TRIM(SpecID)//'_ExcitationRate_Elec_'//TRIM(LevelID) + StrVarNamesElecExci(nVarCount)='Spec'//TRIM(SpecID)//'_Spec'//TRIM(SpecID2)//'_ExcitationRate_Elec_'//TRIM(LevelID) nVarCount = nVarCount + 1 END DO END DO diff --git a/src/particles/mcc/mcc_init.f90 b/src/particles/mcc/mcc_init.f90 index 9d7a93a81..c9b71a539 100644 --- a/src/particles/mcc/mcc_init.f90 +++ b/src/particles/mcc/mcc_init.f90 @@ -423,14 +423,15 @@ SUBROUTINE InitMCC() ExcitationLevelCounter = ExcitationLevelCounter + 1 ExcitationLevelMapping(iCase,iLevel) = ExcitationLevelCounter END DO - IF(ExcitationLevelCounter.NE.SUM(SpecXSec(:)%NumElecLevel)) THEN - IPWRITE(UNIT_StdOut,*) "ExcitationLevelCounter =", ExcitationLevelCounter - IPWRITE(UNIT_StdOut,*) "SUM(SpecXSec(:)%NumElecLevel) =", SUM(SpecXSec(:)%NumElecLevel) - CALL abort(__STAMP__,'Electronic excitation sampling: Wrong level counter!') - END IF - ALLOCATE(ExcitationSampleData(ExcitationLevelCounter,nElems)) - ExcitationSampleData = 0. END DO + ! Sanity check + IF(ExcitationLevelCounter.NE.SUM(SpecXSec(:)%NumElecLevel)) THEN + IPWRITE(UNIT_StdOut,*) "ExcitationLevelCounter =", ExcitationLevelCounter + IPWRITE(UNIT_StdOut,*) "SUM(SpecXSec(:)%NumElecLevel) =", SUM(SpecXSec(:)%NumElecLevel) + CALL abort(__STAMP__,'Electronic excitation sampling: Wrong level counter!') + END IF + ALLOCATE(ExcitationSampleData(ExcitationLevelCounter,nElems)) + ExcitationSampleData = 0. END IF #if defined(PARTICLES) && USE_HDG From 369cad80c91dd03f10cd5d0edbf1643289dbff6b Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Wed, 8 Nov 2023 14:49:36 +0100 Subject: [PATCH 322/495] - prevent CODE_ANALYZE output during ray tracing to std.out by setting the default output rank to -1 (instead of 0) - fixed bilinear/TriaTracking ray tracing usage of dummy TriNum variable - added periodic ray tracing reggie with and without split2hex - added counter for TriaTracking in photon ray tracing and set limit to 1e9, the counter limit for the bilinear fallback (which then uses TriaTracking) is 1e3 --- .../parameter.ini | 4 +- .../analyze.ini | 10 +- .../parameter.ini | 21 ++- .../DSMC.ini | 71 ++++++++ .../Electronic-State-Database.h5 | Bin 0 -> 8624 bytes .../Electrons_ref.csv | 22 +++ .../XSec_Database_H2_Photoionization.h5 | Bin 0 -> 58360 bytes .../analyze.ini | 8 + .../command_line.ini | 2 + .../externals.ini | 6 + .../mesh_cubitDebug_split2hex_mesh.h5 | Bin 0 -> 1759858 bytes .../parameter.ini | 171 ++++++++++++++++++ src/particles/particle_mesh/particle_mesh.f90 | 6 +- src/particles/particle_tools.f90 | 5 +- .../tracking/radtrans_tracking.f90 | 67 ++++--- 15 files changed, 343 insertions(+), 50 deletions(-) create mode 100644 regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_split2hex_periodic/DSMC.ini create mode 100644 regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_split2hex_periodic/Electronic-State-Database.h5 create mode 100644 regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_split2hex_periodic/Electrons_ref.csv create mode 100644 regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_split2hex_periodic/XSec_Database_H2_Photoionization.h5 create mode 100644 regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_split2hex_periodic/analyze.ini create mode 100644 regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_split2hex_periodic/command_line.ini create mode 100644 regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_split2hex_periodic/externals.ini create mode 100644 regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_split2hex_periodic/mesh_cubitDebug_split2hex_mesh.h5 create mode 100644 regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_split2hex_periodic/parameter.ini diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/parameter.ini b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/parameter.ini index df35e8f1d..7751a0240 100644 --- a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/parameter.ini +++ b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1/parameter.ini @@ -32,7 +32,7 @@ TrackingMethod = triatracking ! OUTPUT / VISUALIZATION ! =============================================================================== ! ProjectName = photoionization -IterDisplayStep = 10 +IterDisplayStep = 1 Part-AnalyzeStep = 1 CalcNumSpec = T @@ -103,7 +103,7 @@ Part-Boundary$-PhotonEnACC = 1e-9 , 1.0 , 1e-9 , 1.0 ! 1: fully abs ! Ray Tracing ! =============================================================================== ! UseRayTracing = T -UsePhotonTriaTracking = F,T,F,T +UsePhotonTriaTracking = F,T,T,F RayTracing-nSurfSample= 1,2,5,10 RayTracing-NumRays = 5000 !RayTracing-NumRays = 5000000 diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/analyze.ini b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/analyze.ini index 1e2b3af43..2704b1816 100644 --- a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/analyze.ini +++ b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/analyze.ini @@ -1,8 +1,8 @@ ! =================================================================================================================== ! compare column ! =================================================================================================================== -!compare_column_file = PartAnalyze.csv ! data file name -!compare_column_reference_file = Electrons_ref.csv ! data file name -!compare_column_index = 9 ! column index for comparison -!compare_column_tolerance_value = 10e9 ! tolerance (depends on machine accuracy and MPI) -!compare_column_tolerance_type = absolute ! absolute or relative tolerance +compare_column_file = PartAnalyze.csv ! data file name +compare_column_reference_file = Electrons_ref.csv ! data file name +compare_column_index = 9 ! column index for comparison +compare_column_tolerance_value = 12e9 ! tolerance (depends on machine accuracy and MPI) +compare_column_tolerance_type = absolute ! absolute or relative tolerance diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/parameter.ini b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/parameter.ini index ae34591c9..39f41b81b 100644 --- a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/parameter.ini +++ b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_3to1_periodic/parameter.ini @@ -17,8 +17,7 @@ DoLoadBalance = T Load-DeviationThreshold = 0.001 LoadBalanceMaxSteps = 20 DoInitialAutoRestart = T -!nocrosscombination:N,RayTracing-NMax,NVisu,UsePhotonTriaTracking,RayTracing-nSurfSample,Part-Boundary$-PhotonSpecularReflection -!nocrosscombination:UsePhotonTriaTracking,RayTracing-nSurfSample,Part-Boundary$-PhotonEnACC,RayTracing-PowerDensity +nocrosscombination:UsePhotonTriaTracking,RayTracing-nSurfSample,Part-Boundary$-PhotonSpecularReflection,Part-Boundary$-PhotonEnACC,RayTracing-PowerDensity ! =============================================================================== ! ! MESH ! =============================================================================== ! @@ -99,14 +98,14 @@ Part-FIBGMdeltas = (/ 2.0e-3 , 2.0e-3 , 0.00133 /) Part-FactorFIBGM = (/ 1. , 1. , 1. /) Part-Boundary$-BoundaryParticleOutput = T -Part-Boundary$-PhotonSpecularReflection = T ! F: diffuse with PhotonEnACC, T: perfect mirror -Part-Boundary$-PhotonEnACC = 1.0 +Part-Boundary$-PhotonSpecularReflection = T , F , T , F ! F: diffuse with PhotonEnACC , T: perfect mirror +Part-Boundary$-PhotonEnACC = 1e-9 , 1.0 , 1e-9 , 1.0 ! 1: fully absorb, 1e-9: reflect all (double energy in volume) ! =============================================================================== ! ! Ray Tracing ! =============================================================================== ! UseRayTracing = T -UsePhotonTriaTracking = T!,F,T,F -RayTracing-nSurfSample= 1!,2,5,10 +UsePhotonTriaTracking = T,F,F,T +RayTracing-nSurfSample= 1,2,5,10 RayTracing-NumRays = 5000 !RayTracing-NumRays = 5000000 RayTracing-PartBound = 1 ! -> iBC: 6 @@ -116,10 +115,14 @@ RayTracing-VolRefineModeZ = 1000. RayTracing-PulseDuration = 15e-9 RayTracing-WaveLength = 10e-9 -RayTracing-PowerDensity = 1.0!, 1.0, 1.0, 1.0 ! theoretical value is calculated from the increased energy that is deposited in the volume due to the increased optical path of the photons when photons travel under an angle +! ATTENTION: This values is changed due to the increased optical path through the domain +! The adjusted value reduces the input energy back to the original value for perpendicular irradiation +! | Enhancement factor for energy deposited in the volume [-] | 1.17720111668984E+000 | CALCUL. | +! When reflection is 100%, the optical path is doubled, hence, the energy is halved again +RayTracing-PowerDensity = 0.424736260364707, 0.849472520729414, 0.424736260364707, 0.849472520729414 + RayTracing-RepetitionRate = 1000 -RayTracing-RayDirection = (/ 0. , 0.0 , -1.0 /) -!RayTracing-RayDirection = (/ 0. , 0.5 , -1.0 /) +RayTracing-RayDirection = (/ 0.25 , 0.5 , -0.9 /) ! =============================================================================== ! ! Weighting Factor ! =============================================================================== ! diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_split2hex_periodic/DSMC.ini b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_split2hex_periodic/DSMC.ini new file mode 100644 index 000000000..f0b045264 --- /dev/null +++ b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_split2hex_periodic/DSMC.ini @@ -0,0 +1,71 @@ + +! =============================================================================== ! +! Species1, H2 +! =============================================================================== ! +Part-Species1-SpeciesName = H2 +Part-Species1-InteractionID = 2 +Part-Species1-Tref = 1000 +Part-Species1-dref = 2.68E-10 +Part-Species1-omega = 0.407 +Part-Species1-HeatOfFormation_K = 0.0 +Part-Species1-CharaTempVib = 6332.37 +Part-Species1-Ediss_eV = 4.47 +! =============================================================================== ! +! Species2, H +! =============================================================================== ! +Part-Species2-SpeciesName = H +Part-Species2-InteractionID = 1 +Part-Species2-Tref = 1000 +Part-Species2-dref = 2.581E-10 +Part-Species2-omega = 0.407 +Part-Species2-HeatOfFormation_K = 26159.76 +! =============================================================================== ! +! Species3, e +! =============================================================================== ! +Part-Species3-SpeciesName = electron +Part-Species3-InteractionID = 4 +Part-Species3-Tref = 1000 +Part-Species3-dref = 2.817920E-15 +Part-Species3-omega = 0.407 +! =============================================================================== ! +! Species4, H2Ion +! =============================================================================== ! +Part-Species4-SpeciesName = H2Ion1 +Part-Species4-InteractionID = 20 +Part-Species4-Tref = 1000 +Part-Species4-dref = 3.883E-10 +Part-Species4-omega = 0.407 +Part-Species4-CharaTempVib = 3341.01 +Part-Species4-Ediss_eV = 2.65 +Part-Species4-PreviousState = 1 +! =============================================================================== ! +! Species5, HIon +! =============================================================================== ! +Part-Species5-SpeciesName = HIon1 +Part-Species5-InteractionID = 10 +Part-Species5-Tref = 1000 +Part-Species5-dref = 3.912E-10 +Part-Species5-omega = 0.407 +Part-Species5-PreviousState = 2 + + + +! =============================================================================== ! +! Reactions +! =============================================================================== ! +DSMC-NumOfReactions = 2 + +! ---------------------------------------------------- +! Photo-ionization (electron species should be at the first or second position of the product array) +! ---------------------------------------------------- +! Reaction 1 | H2 + photon --> H2Ion + e +DSMC-Reaction1-ReactionModel = phIon +DSMC-Reaction1-Reactants = (/1,0,0/) +DSMC-Reaction1-Products = (/4,3,0,0/) +DSMC-Reaction1-CrossSection = 4.84E-24 + +! Reaction 2 | H2 + photon --> H + HIon + e +DSMC-Reaction2-ReactionModel = phIon +DSMC-Reaction2-Reactants = (/1,0,0/) +DSMC-Reaction2-Products = (/2,3,5,0/) +DSMC-Reaction2-CrossSection = 8.3E-25 diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_split2hex_periodic/Electronic-State-Database.h5 b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_split2hex_periodic/Electronic-State-Database.h5 new file mode 100644 index 0000000000000000000000000000000000000000..9e335f4b5264750773dc6e7c1b6d652281c6266a GIT binary patch literal 8624 zcmeI14@^~69LIm}!Fyg1^a9f^RB{>Us4*m==GyfB5Rgkw!9Vj40TM80R6J@Gf*{Up zh)stsSByCut#D<=s9>_t$8ooJLhx0 zzw6J(pB$q&z^%lXjzG1N{#` zBJDxMzo*@%4Jj$$wxs@PNxDItuThg}gH_&F5l~YSGxQg3BySx}-=3^XiYlq7d-7ey zr2uN0t4MFs%g6MR=ya8<@rIx-GX%Phscr-3#QHTp^c8B1Y_l7dNyHyn?%>Hj?v<}w z2FVHt6SfEmb0J~e$LQ#Ax9YmxZa5T(y^k%|FgI7eVINGq=zYGfjot#V(-3CqbK|=7 zWE(hO;>&Q4DUpohF;`!32(Hz=7pL4CCrXF#IcNxE-jSl zGCol|Cya3vHjLkt83Qiv7jn0^vH2{DAE{yt_j+HYO z@u94APM7d-_0lS)1HPlyyjmN^{5h4t3dVqNIH82GhzYxZ(|+cVHd@Ipr0-1XB#zS`m=Z5QWIbdNlzLL@;qQmak3KBdbm~4@f}rWeF>Ll=$9@lm*Ng&>V@E zDFeQo*I8UvL;wHNlt$<6HE$lFEMWFvH5%{|i@RqMlmj}`I zndd{e(3q<{Y07-QrsqT6@-^ZF=zKhR=JU%Xu5$Hs)_nN+ZO)(le9c=t=ye{A$5fu_ zedd=B7(s|LW1(00c(nWn@t~8T_m9)v8*e3s^j_HW-dJ5m?vaTd{nBYaI?g{W{{ldR Bf589% literal 0 HcmV?d00001 diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_split2hex_periodic/Electrons_ref.csv b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_split2hex_periodic/Electrons_ref.csv new file mode 100644 index 000000000..8ccf38709 --- /dev/null +++ b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_split2hex_periodic/Electrons_ref.csv @@ -0,0 +1,22 @@ +"electrons" +0.0000000000000000E+000 +0.5099999999999998E+008 +0.3099999999999999E+009 +0.1377999999999999E+010 +0.4912999999999998E+010 +0.1431799999999999E+011 +0.3443899999999998E+011 +0.6904099999999997E+011 +0.1168840000000000E+012 +0.1700699999999999E+012 +0.2176069999999999E+012 +0.2517669999999999E+012 +0.2715039999999999E+012 +0.2806709999999999E+012 +0.2840939999999999E+012 +0.2851209999999999E+012 +0.2853689999999999E+012 +0.2854169999999999E+012 +0.2854169999999999E+012 +0.2854169999999999E+012 +0.2854169999999999E+012 diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_split2hex_periodic/XSec_Database_H2_Photoionization.h5 b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_split2hex_periodic/XSec_Database_H2_Photoionization.h5 new file mode 100644 index 0000000000000000000000000000000000000000..abef529f67ca2b525f34f437cfdf25ce7513f5cd GIT binary patch literal 58360 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 Ivgh>w0gNxUr2qf` literal 0 HcmV?d00001 diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_split2hex_periodic/analyze.ini b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_split2hex_periodic/analyze.ini new file mode 100644 index 000000000..2704b1816 --- /dev/null +++ b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_split2hex_periodic/analyze.ini @@ -0,0 +1,8 @@ +! =================================================================================================================== +! compare column +! =================================================================================================================== +compare_column_file = PartAnalyze.csv ! data file name +compare_column_reference_file = Electrons_ref.csv ! data file name +compare_column_index = 9 ! column index for comparison +compare_column_tolerance_value = 12e9 ! tolerance (depends on machine accuracy and MPI) +compare_column_tolerance_type = absolute ! absolute or relative tolerance diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_split2hex_periodic/command_line.ini b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_split2hex_periodic/command_line.ini new file mode 100644 index 000000000..73e8d46c3 --- /dev/null +++ b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_split2hex_periodic/command_line.ini @@ -0,0 +1,2 @@ +MPI = 1,2,5,8 +cmd_suffix = DSMC.ini diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_split2hex_periodic/externals.ini b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_split2hex_periodic/externals.ini new file mode 100644 index 000000000..a1a4a4745 --- /dev/null +++ b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_split2hex_periodic/externals.ini @@ -0,0 +1,6 @@ +MPI = 1 +externalbinary = ./hopr/build/bin/hopr!, ./bin/piclas2vtk ! Relative binary path in build directory +externaldirectory = hopr.ini !, parameter.ini ! Directory name, where the files are located for the external tool reggie +externalruntime = pre !, post ! Run after piclas is completed (post: after, pre: before) +cmd_suffix = !, RadTrans_Cylinder_2D_RadiationState.h5 ! Suffix for the binary execution +!nocrosscombination:MPI,externalbinary,externaldirectory,externalruntime,cmd_suffix diff --git a/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_split2hex_periodic/mesh_cubitDebug_split2hex_mesh.h5 b/regressioncheck/NIG_Photoionization/volume_emission_rectangle_ray_trace_high-order_Cubit_split2hex_periodic/mesh_cubitDebug_split2hex_mesh.h5 new file mode 100644 index 0000000000000000000000000000000000000000..59f8c75e5abbe9fb0fc9f4812cf0381e3fd2d4b0 GIT binary patch literal 1759858 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 qD~8u%b4jZY*UllWAzWKPT4T6Y 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

    f4pL=-TI>VCmNy^HEEB>!93Lu+J-O1z6_A8gs!? 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
    ;<#o4nn*}xwJJ(=VSn}mtHZ!Cdl}~b4uR$O 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�f02##dUczZOZ7f>sr(-0qZ)mkH?01&qUu$X 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 z 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%0Ab;vwaBMQZS%Pw6G;2`1v4)A3NW~ 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